Compare commits

...

322 Commits

Author SHA1 Message Date
Toran Bruce Richards
d681083880 fix exa contents advanced toggle 2025-05-17 20:12:01 +01:00
dependabot[bot]
bd425331f1 chore(frontend/deps): Update 35 dependencies to latest minor versions (#9953)
Bumps the production-dependencies group with 35 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.6.0` |
`9.8.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.2.1` | `15.3.2` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives)
| `1.1.6` | `1.1.13` |
| [@radix-ui/react-avatar](https://github.com/radix-ui/primitives) |
`1.1.3` | `1.1.9` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives) |
`1.1.4` | `1.3.1` |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives)
| `1.1.3` | `1.1.10` |
| [@radix-ui/react-context-menu](https://github.com/radix-ui/primitives)
| `2.2.6` | `2.2.14` |
|
[@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives)
| `2.1.6` | `2.1.14` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives) |
`2.1.2` | `2.1.6` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives) |
`1.1.6` | `1.1.13` |
| [@radix-ui/react-radio-group](https://github.com/radix-ui/primitives)
| `1.2.3` | `1.3.6` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives)
| `1.2.3` | `1.2.8` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives) |
`2.1.6` | `2.2.4` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives) |
`1.1.2` | `1.1.6` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives) |
`1.1.3` | `1.2.4` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives) |
`1.1.4` | `1.1.11` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives) |
`1.2.6` | `1.2.13` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives) |
`1.1.8` | `1.2.6` |
| [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) |
`9.10.1` | `9.19.0` |
| [@supabase/ssr](https://github.com/supabase/ssr) | `0.5.2` | `0.6.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.49.1` | `2.49.4` |
|
[@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table)
| `8.21.2` | `8.21.3` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.4.2` | `12.6.4` |
| [cmdk](https://github.com/pacocoursey/cmdk/tree/HEAD/cmdk) | `1.0.4` |
`1.1.1` |
| [dotenv](https://github.com/motdotla/dotenv) | `16.4.7` | `16.5.0` |
| [embla-carousel-react](https://github.com/davidjerleke/embla-carousel)
| `8.5.2` | `8.6.0` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.4.11`
| `12.12.1` |
| [geist](https://github.com/vercel/geist-font/tree/HEAD/packages/next)
| `1.3.1` | `1.4.2` |
|
[launchdarkly-react-client-sdk](https://github.com/launchdarkly/react-client-sdk)
| `3.6.1` | `3.7.0` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.479.0` | `0.510.0` |
| [next-themes](https://github.com/pacocoursey/next-themes) | `0.4.5` |
`0.4.6` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.6.1`
| `9.7.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form)
| `7.54.2` | `7.56.3` |
| [recharts](https://github.com/recharts/recharts) | `2.15.1` | `2.15.3`
|
| [zod](https://github.com/colinhacks/zod) | `3.24.2` | `3.24.4` |


Updates `@faker-js/faker` from 9.6.0 to 9.8.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(locale): add country code for en_CA &amp; fr_CA by <a
href="https://github.com/alixlahuec"><code>@​alixlahuec</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3476">faker-js/faker#3476</a></li>
<li>test: use validator@13.15.0 with isULID, isISO31661Numeric,
isISO15924 by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3482">faker-js/faker#3482</a></li>
<li>feat(locale): add zh_CN food by <a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3479">faker-js/faker#3479</a></li>
<li>docs: more than 70 locales by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3483">faker-js/faker#3483</a></li>
<li>feat(locale): update zh_CN location by <a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3481">faker-js/faker#3481</a></li>
<li>feat(locale): update zh_CN animal by <a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3480">faker-js/faker#3480</a></li>
<li>refactor(locale): ko state data update by <a
href="https://github.com/seoahan"><code>@​seoahan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3487">faker-js/faker#3487</a></li>
<li>feat(locale): add zh_CN book by <a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3477">faker-js/faker#3477</a></li>
<li>feat(locale): add Japanese date and month definitions by <a
href="https://github.com/matsueushi"><code>@​matsueushi</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3492">faker-js/faker#3492</a></li>
<li>feat(locale): add vehicle locale data for Japanese by <a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3490">faker-js/faker#3490</a></li>
<li>feat(locale): update Japanese company categories by <a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3489">faker-js/faker#3489</a></li>
<li>feat(locale): add Japanese science locale data including elements
and units by <a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3491">faker-js/faker#3491</a></li>
<li>feat(locale): add Japanese sex definitions for person locale by <a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3495">faker-js/faker#3495</a></li>
<li>refactor(locale): rename pt-BR streetSuffix to streetPrefix by <a
href="https://github.com/glmchalita"><code>@​glmchalita</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3493">faker-js/faker#3493</a></li>
<li>feat(locale): update zh_CN word by <a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3478">faker-js/faker#3478</a></li>
<li>refactor(locale): normalize internet data by <a
href="https://github.com/xDivisionByZerox"><code>@​xDivisionByZerox</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3502">faker-js/faker#3502</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3500">faker-js/faker#3500</a></li>
<li>chore(deps): update dependency eslint-plugin-unicorn to v59 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3501">faker-js/faker#3501</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3497">faker-js/faker#3497</a></li>
<li>chore(deps): update cypress/browsers docker tag to v24 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3507">faker-js/faker#3507</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3498">faker-js/faker#3498</a></li>
<li>chore(deps): update
mcr.microsoft.com/devcontainers/typescript-node:22 docker digest to
fb211a0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3508">faker-js/faker#3508</a></li>
<li>feat(locale): Add additional Japanese last names to the locale data
by <a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3484">faker-js/faker#3484</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3511">faker-js/faker#3511</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3486">faker-js/faker#3486</a></li>
<li>fix(locale): ko modified street_name to street_name_part by <a
href="https://github.com/seoahan"><code>@​seoahan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3485">faker-js/faker#3485</a></li>
<li>fix(locale): correct Japanese country names by <a
href="https://github.com/matsueushi"><code>@​matsueushi</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3510">faker-js/faker#3510</a></li>
<li>chore(release): 9.8.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3515">faker-js/faker#3515</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/alixlahuec"><code>@​alixlahuec</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3476">faker-js/faker#3476</a></li>
<li><a
href="https://github.com/yyz945947732"><code>@​yyz945947732</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3479">faker-js/faker#3479</a></li>
<li><a href="https://github.com/seoahan"><code>@​seoahan</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3487">faker-js/faker#3487</a></li>
<li><a
href="https://github.com/noritaka1166"><code>@​noritaka1166</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3490">faker-js/faker#3490</a></li>
<li><a
href="https://github.com/glmchalita"><code>@​glmchalita</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3493">faker-js/faker#3493</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.7.0...v9.8.0">https://github.com/faker-js/faker/compare/v9.7.0...v9.8.0</a></p>
<h2>v9.7.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(locale): Add bn_BD locale by <a
href="https://github.com/AbrarShahriar"><code>@​AbrarShahriar</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3439">faker-js/faker#3439</a></li>
<li>fix(airline): Air France and KLM Royal Dutch Airlines by <a
href="https://github.com/chimurai"><code>@​chimurai</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3440">faker-js/faker#3440</a></li>
<li>infra(comment-issue): fix display of thumbs up emoji by <a
href="https://github.com/xDivisionByZerox"><code>@​xDivisionByZerox</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3444">faker-js/faker#3444</a></li>
<li>feat(locale): add localize sex support for zh_CN &amp; zh_TW by <a
href="https://github.com/sd44"><code>@​sd44</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3450">faker-js/faker#3450</a></li>
<li>fix(iban): more strict pattern for IE and PS by <a
href="https://github.com/xDivisionByZerox"><code>@​xDivisionByZerox</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3464">faker-js/faker#3464</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3456">faker-js/faker#3456</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3457">faker-js/faker#3457</a></li>
<li>chore(deps): update dependency prettier to v3.5.3 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3455">faker-js/faker#3455</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.7.0...v9.8.0">9.8.0</a>
(2025-05-13)</h2>
<h3>New Locales</h3>
<ul>
<li><strong>locale:</strong> Add additional Japanese last names to the
locale data (<a
href="https://redirect.github.com/faker-js/faker/issues/3484">#3484</a>)
(<a
href="72e66c3a3a">72e66c3</a>)</li>
<li><strong>locale:</strong> add Japanese date and month definitions (<a
href="https://redirect.github.com/faker-js/faker/issues/3492">#3492</a>)
(<a
href="b70e7934b7">b70e793</a>)</li>
<li><strong>locale:</strong> add Japanese science locale data including
elements and units (<a
href="https://redirect.github.com/faker-js/faker/issues/3491">#3491</a>)
(<a
href="54fd5519e9">54fd551</a>)</li>
<li><strong>locale:</strong> add Japanese sex definitions for person
locale (<a
href="https://redirect.github.com/faker-js/faker/issues/3495">#3495</a>)
(<a
href="1dbd8fa511">1dbd8fa</a>)</li>
<li><strong>locale:</strong> add vehicle locale data for Japanese (<a
href="https://redirect.github.com/faker-js/faker/issues/3490">#3490</a>)
(<a
href="dfadb1da74">dfadb1d</a>)</li>
<li><strong>locale:</strong> add zh_CN book (<a
href="https://redirect.github.com/faker-js/faker/issues/3477">#3477</a>)
(<a
href="786a3d0bd8">786a3d0</a>)</li>
<li><strong>locale:</strong> add zh_CN food (<a
href="https://redirect.github.com/faker-js/faker/issues/3479">#3479</a>)
(<a
href="6c883e74b8">6c883e7</a>)</li>
<li><strong>locale:</strong> update Japanese company categories (<a
href="https://redirect.github.com/faker-js/faker/issues/3489">#3489</a>)
(<a
href="8c0953a261">8c0953a</a>)</li>
<li><strong>locale:</strong> update zh_CN animal (<a
href="https://redirect.github.com/faker-js/faker/issues/3480">#3480</a>)
(<a
href="38ee7b81a8">38ee7b8</a>)</li>
<li><strong>locale:</strong> update zh_CN location (<a
href="https://redirect.github.com/faker-js/faker/issues/3481">#3481</a>)
(<a
href="456f10276b">456f102</a>)</li>
<li><strong>locale:</strong> update zh_CN word (<a
href="https://redirect.github.com/faker-js/faker/issues/3478">#3478</a>)
(<a
href="aa98867765">aa98867</a>)</li>
</ul>
<h3>Changed Locales</h3>
<ul>
<li><strong>locale:</strong> ko state data update (<a
href="https://redirect.github.com/faker-js/faker/issues/3487">#3487</a>)
(<a
href="b611ec2e51">b611ec2</a>)</li>
<li><strong>locale:</strong> normalize internet data (<a
href="https://redirect.github.com/faker-js/faker/issues/3502">#3502</a>)
(<a
href="e6151e4efd">e6151e4</a>)</li>
<li><strong>locale:</strong> rename pt-BR streetSuffix to streetPrefix
(<a
href="https://redirect.github.com/faker-js/faker/issues/3493">#3493</a>)
(<a
href="7c23db316e">7c23db3</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>locale:</strong> correct Japanese country names (<a
href="https://redirect.github.com/faker-js/faker/issues/3510">#3510</a>)
(<a
href="046bb81558">046bb81</a>)</li>
<li><strong>locale:</strong> correct the name of element Lv in Japanese
(<a
href="https://redirect.github.com/faker-js/faker/issues/3509">#3509</a>)
(<a
href="6a7ef4c2ad">6a7ef4c</a>)</li>
<li><strong>locale:</strong> ko modified street_name to street_name_part
(<a
href="https://redirect.github.com/faker-js/faker/issues/3485">#3485</a>)
(<a
href="c15da8efec">c15da8e</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.6.0...v9.7.0">9.7.0</a>
(2025-04-13)</h2>
<h3>New Locales</h3>
<ul>
<li><strong>locale:</strong> Add bn_BD locale (<a
href="https://redirect.github.com/faker-js/faker/issues/3439">#3439</a>)
(<a
href="fef0ad7859">fef0ad7</a>)</li>
<li><strong>locale:</strong> add cy locale, start with date (<a
href="https://redirect.github.com/faker-js/faker/issues/3462">#3462</a>)
(<a
href="f70a6f7a65">f70a6f7</a>)</li>
<li><strong>locale:</strong> add finance support for ja locale (<a
href="https://redirect.github.com/faker-js/faker/issues/3449">#3449</a>)
(<a
href="b2c5298c94">b2c5298</a>)</li>
<li><strong>locale:</strong> add localize sex support for zh_CN &amp;
zh_TW (<a
href="https://redirect.github.com/faker-js/faker/issues/3450">#3450</a>)
(<a
href="048c32581b">048c325</a>)</li>
<li><strong>locale:</strong> add Tamil language support (<a
href="https://redirect.github.com/faker-js/faker/issues/3468">#3468</a>)
(<a
href="cdf6dc4a97">cdf6dc4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>airline:</strong> Air France and KLM Royal Dutch Airlines
(<a
href="https://redirect.github.com/faker-js/faker/issues/3440">#3440</a>)
(<a
href="8a2d168f62">8a2d168</a>)</li>
<li><strong>iban:</strong> more strict pattern for IE and PS (<a
href="https://redirect.github.com/faker-js/faker/issues/3464">#3464</a>)
(<a
href="7b12056713">7b12056</a>)</li>
<li><strong>locale:</strong> rename ja and zh_CN company affix files (<a
href="https://redirect.github.com/faker-js/faker/issues/3448">#3448</a>)
(<a
href="1e551c5f47">1e551c5</a>)</li>
<li><strong>number:</strong> don't ignore multipleOf in float when
min=max (<a
href="https://redirect.github.com/faker-js/faker/issues/3417">#3417</a>)
(<a
href="e4cc4e50d1">e4cc4e5</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="549d71cf33"><code>549d71c</code></a>
chore(release): 9.8.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3515">#3515</a>)</li>
<li><a
href="046bb81558"><code>046bb81</code></a>
fix(locale): correct Japanese country names (<a
href="https://redirect.github.com/faker-js/faker/issues/3510">#3510</a>)</li>
<li><a
href="c15da8efec"><code>c15da8e</code></a>
fix(locale): ko modified street_name to street_name_part (<a
href="https://redirect.github.com/faker-js/faker/issues/3485">#3485</a>)</li>
<li><a
href="d6ba4cc1b1"><code>d6ba4cc</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3486">#3486</a>)</li>
<li><a
href="2faf57b01c"><code>2faf57b</code></a>
chore(deps): update eslint (<a
href="https://redirect.github.com/faker-js/faker/issues/3511">#3511</a>)</li>
<li><a
href="6a7ef4c2ad"><code>6a7ef4c</code></a>
fix(locale): correct the name of element Lv in Japanese (<a
href="https://redirect.github.com/faker-js/faker/issues/3509">#3509</a>)</li>
<li><a
href="72e66c3a3a"><code>72e66c3</code></a>
feat(locale): Add additional Japanese last names to the locale data (<a
href="https://redirect.github.com/faker-js/faker/issues/3484">#3484</a>)</li>
<li><a
href="c0d5217e10"><code>c0d5217</code></a>
chore(deps): update mcr.microsoft.com/devcontainers/typescript-node:22
docker...</li>
<li><a
href="049875d283"><code>049875d</code></a>
chore(deps): update all non-major dependencies (<a
href="https://redirect.github.com/faker-js/faker/issues/3498">#3498</a>)</li>
<li><a
href="07087ff6ef"><code>07087ff</code></a>
chore(deps): update cypress/browsers docker tag to v24 (<a
href="https://redirect.github.com/faker-js/faker/issues/3507">#3507</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.6.0...v9.8.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~faker-bot">faker-bot</a>, a new releaser
for <code>@​faker-js/faker</code> since your current version.</p>
</details>
<br />

Updates `@next/third-parties` from 15.2.1 to 15.3.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.3.2</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>backport: fix(turbopack): Store persistence of wrapped task on
RawVc::LocalOutput (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78488">#78488</a>)
(<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78883">#78883</a>)</li>
<li><code>@​next/mdx</code>: Use stable turbopack config options (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78880">#78880</a>)</li>
<li>Fix react-compiler: Fix detection of interest (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78879">#78879</a>)</li>
<li>Fix turbopack: Backport sourcemap bugfix (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78881">#78881</a>)</li>
<li>[next-server] preserve rsc query for rsc redirects (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78876">#78876</a>)</li>
<li>Update middleware public/static matching (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78875">#78875</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/ijjk"><code>@​ijjk</code></a>, <a
href="https://github.com/huozhi"><code>@​huozhi</code></a>, <a
href="https://github.com/kdy1"><code>@​kdy1</code></a>, <a
href="https://github.com/wbinnssmith"><code>@​wbinnssmith</code></a>,
and <a href="https://github.com/bgw"><code>@​bgw</code></a> for
helping!</p>
<h2>v15.3.1</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>chore: Backport SWC-based RC optimization (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78260">#78260</a>)</li>
<li>fix: bump image-size@1.2.1 (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78164">#78164</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/kdy1"><code>@​kdy1</code></a> and <a
href="https://github.com/styfle"><code>@​styfle</code></a> for
helping!</p>
<h2>v15.3.1-canary.15</h2>
<h3>Core Changes</h3>
<ul>
<li>[Turbopack] refactor persistent caching from log based to cow
approach: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76234">#76234</a></li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>fix(turbo-tasks-fs): Handle filesystem watcher rescan events: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78045">#78045</a></li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/bgw"><code>@​bgw</code></a> and <a
href="https://github.com/sokra"><code>@​sokra</code></a> for
helping!</p>
<h2>v15.3.1-canary.14</h2>
<h3>Core Changes</h3>
<ul>
<li>Add graceful error boundary for bots requests: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78298">#78298</a></li>
<li>make sure eslint-plugin-next is built when running 'pnpm dev': <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78305">#78305</a></li>
<li>Migrate pages API routes to handler interface: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/78166">#78166</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d9ec4a4b57"><code>d9ec4a4</code></a>
v15.3.2</li>
<li><a
href="fa536cf2c9"><code>fa536cf</code></a>
v15.3.1</li>
<li><a
href="b2ff04995b"><code>b2ff049</code></a>
v15.3.0</li>
<li><a
href="60bfe64295"><code>60bfe64</code></a>
v15.3.0-canary.46</li>
<li><a
href="f71c4a1582"><code>f71c4a1</code></a>
v15.3.0-canary.45</li>
<li><a
href="4451bae75d"><code>4451bae</code></a>
v15.3.0-canary.44</li>
<li><a
href="87d7d8eb7a"><code>87d7d8e</code></a>
v15.3.0-canary.43</li>
<li><a
href="82ab39f801"><code>82ab39f</code></a>
v15.3.0-canary.42</li>
<li><a
href="8f1409d6ce"><code>8f1409d</code></a>
v15.3.0-canary.41</li>
<li><a
href="2139369821"><code>2139369</code></a>
v15.3.0-canary.40</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/commits/v15.3.2/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-alert-dialog` from 1.1.6 to 1.1.13
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-avatar` from 1.1.3 to 1.1.9
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-checkbox` from 1.1.4 to 1.3.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-collapsible` from 1.1.3 to 1.1.10
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-context-menu` from 2.2.6 to 2.2.14
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-dialog` from 1.1.6 to 1.1.13
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-dropdown-menu` from 2.1.6 to 2.1.14
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-label` from 2.1.2 to 2.1.6
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-popover` from 1.1.6 to 1.1.13
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-radio-group` from 1.2.3 to 1.3.6
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-scroll-area` from 1.2.3 to 1.2.8
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-select` from 2.1.6 to 2.2.4
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-separator` from 1.1.2 to 1.1.6
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-slot` from 1.1.2 to 1.2.2
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-switch` from 1.1.3 to 1.2.4
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-tabs` from 1.1.4 to 1.1.11
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-toast` from 1.2.6 to 1.2.13
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-tooltip` from 1.1.8 to 1.2.6
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@sentry/nextjs` from 9.10.1 to 9.19.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/releases"><code>@​sentry/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>9.19.0</h2>
<ul>
<li>feat(react-router): Add otel instrumentation for server requests (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16147">#16147</a>)</li>
<li>feat(remix): Vendor in
<code>opentelemetry-instrumentation-remix</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16145">#16145</a>)</li>
<li>fix(browser): Ensure spans auto-ended for navigations have
<code>cancelled</code> reason (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16277">#16277</a>)</li>
<li>fix(node): Pin <code>@fastify/otel</code> fork to direct url to
allow installing without git (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16287">#16287</a>)</li>
<li>fix(react): Handle nested parameterized routes in reactrouterv3
transaction normalization (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16274">#16274</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/sidx1024"><code>@​sidx1024</code></a>. Thank
you for your contribution!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> - with treeshaking flags</td>
<td>23.06 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing)</td>
<td>37.31 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay)</td>
<td>74.53 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay) - with
treeshaking flags</td>
<td>67.72 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay with
Canvas)</td>
<td>79.19 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay, Feedback)</td>
<td>91 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Feedback)</td>
<td>39.8 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. sendFeedback)</td>
<td>28.03 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. FeedbackAsync)</td>
<td>32.79 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code></td>
<td>25.17 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code> (incl. Tracing)</td>
<td>39.27 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code></td>
<td>27.67 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code> (incl. Tracing)</td>
<td>39.07 KB</td>
</tr>
<tr>
<td><code>@​sentry/svelte</code></td>
<td>23.43 KB</td>
</tr>
<tr>
<td>CDN Bundle</td>
<td>24.58 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing)</td>
<td>37.33 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay)</td>
<td>72.37 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback)</td>
<td>77.68 KB</td>
</tr>
<tr>
<td>CDN Bundle - uncompressed</td>
<td>71.72 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing) - uncompressed</td>
<td>110.5 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay) - uncompressed</td>
<td>221.78 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed</td>
<td>234.31 KB</td>
</tr>
<tr>
<td><code>@​sentry/nextjs</code> (client)</td>
<td>40.88 KB</td>
</tr>
<tr>
<td><code>@​sentry/sveltekit</code> (client)</td>
<td>37.77 KB</td>
</tr>
<tr>
<td><code>@​sentry/node</code></td>
<td>154.29 KB</td>
</tr>
<tr>
<td><code>@​sentry/node</code> - without tracing</td>
<td>95.6 KB</td>
</tr>
<tr>
<td><code>@​sentry/aws-serverless</code></td>
<td>120.36 KB</td>
</tr>
</tbody>
</table>
<h2>9.18.0</h2>
<h3>Important changes</h3>
<ul>
<li><strong>feat: Support Node 24 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16236">#16236</a>)</strong></li>
</ul>
<p>We now also publish profiling binaries for Node 24.</p>
<h3>Other changes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md"><code>@​sentry/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>9.19.0</h2>
<ul>
<li>feat(react-router): Add otel instrumentation for server requests (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16147">#16147</a>)</li>
<li>feat(remix): Vendor in
<code>opentelemetry-instrumentation-remix</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16145">#16145</a>)</li>
<li>fix(browser): Ensure spans auto-ended for navigations have
<code>cancelled</code> reason (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16277">#16277</a>)</li>
<li>fix(node): Pin <code>@fastify/otel</code> fork to direct url to
allow installing without git (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16287">#16287</a>)</li>
<li>fix(react): Handle nested parameterized routes in reactrouterv3
transaction normalization (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16274">#16274</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/sidx1024"><code>@​sidx1024</code></a>. Thank
you for your contribution!</p>
<h2>9.18.0</h2>
<h3>Important changes</h3>
<ul>
<li><strong>feat: Support Node 24 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16236">#16236</a>)</strong></li>
</ul>
<p>We now also publish profiling binaries for Node 24.</p>
<h3>Other changes</h3>
<ul>
<li>deps(node): Bump <code>import-in-the-middle</code> to
<code>1.13.1</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16260">#16260</a>)</li>
<li>feat: Export <code>consoleLoggingIntegration</code> from vercel edge
sdk (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16228">#16228</a>)</li>
<li>feat(cloudflare): Add support for email, queue, and tail handler (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16233">#16233</a>)</li>
<li>feat(cloudflare): Improve http span data (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16232">#16232</a>)</li>
<li>feat(nextjs): Add more attributes for generation functions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16214">#16214</a>)</li>
<li>feat(opentelemetry): Widen peer dependencies to support Otel v2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16246">#16246</a>)</li>
<li>fix(core): Gracefully handle invalid baggage entries (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16257">#16257</a>)</li>
<li>fix(node): Ensure traces are propagated without spans in Node 22+
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16221">#16221</a>)</li>
<li>fix(node): Use sentry forked <code>@fastify/otel</code> dependency
with pinned Otel v1 deps (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16256">#16256</a>)</li>
<li>fix(remix): Remove vendored types (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16218">#16218</a>)</li>
</ul>
<h2>9.17.0</h2>
<ul>
<li>feat(node): Migrate to <code>@fastify/otel</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15542">#15542</a>)</li>
</ul>
<h2>9.16.1</h2>
<ul>
<li>fix(core): Make sure logs get flushed in server-runtime-client (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16222">#16222</a>)</li>
<li>ref(node): Remove vercel flushing code that does nothing (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16217">#16217</a>)</li>
</ul>
<h2>9.16.0</h2>
<h3>Important changes</h3>
<ul>
<li><strong>feat: Create a Vite plugin that injects sentryConfig into
the global config (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16197">#16197</a>)</strong></li>
</ul>
<p>Add a new plugin <code>makeConfigInjectorPlugin</code> within our
existing vite plugin that updates the global vite config with sentry
options</p>
<ul>
<li><strong>feat(browser): Add option to sample linked traces
consistently (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/16037">#16037</a>)</strong></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d69ea01d02"><code>d69ea01</code></a>
release: 9.19.0</li>
<li><a
href="9acaae28c1"><code>9acaae2</code></a>
Merge pull request <a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/16288">#16288</a>
from getsentry/prepare-release/9.19.0</li>
<li><a
href="ed276633ce"><code>ed27663</code></a>
meta(changelog): Update changelog for 9.19.0</li>
<li><a
href="4b039f8a6e"><code>4b039f8</code></a>
fix(node): Pin <code>@fastify/otel</code> fork to direct url to allow
installing without...</li>
<li><a
href="26731edc99"><code>26731ed</code></a>
feat(react-router): Add otel instrumentation for server requests (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/16147">#16147</a>)</li>
<li><a
href="efb86de64b"><code>efb86de</code></a>
chore: Add external contributor to CHANGELOG.md (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/16282">#16282</a>)</li>
<li><a
href="e83658f23a"><code>e83658f</code></a>
fix(browser): Ensure spans auto-ended for navigations have
<code>cancelled</code> reason...</li>
<li><a
href="b9984338be"><code>b998433</code></a>
feat(remix): Vendor in <code>opentelemetry-instrumentation-remix</code>
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/16145">#16145</a>)</li>
<li><a
href="f55018fbf6"><code>f55018f</code></a>
fix(react): Handle nested parameterized routes in reactrouterv3
transaction n...</li>
<li><a
href="6d2b971980"><code>6d2b971</code></a>
Merge pull request <a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/16276">#16276</a>
from getsentry/master</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-javascript/compare/9.10.1...9.19.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/ssr` from 0.5.2 to 0.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/ssr/releases"><code>@​supabase/ssr</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v0.6.1</h2>
<h2><a
href="https://github.com/supabase/ssr/compare/v0.6.0...v0.6.1">0.6.1</a>
(2025-03-16)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>force release (<a
href="https://redirect.github.com/supabase/ssr/issues/98">#98</a>) (<a
href="66710e82aa">66710e8</a>)</li>
<li><strong>revert:</strong> &quot;feat: improve cookie chunk handling
via base64url+length encoding (<a
href="https://redirect.github.com/supabase/ssr/issues/90">#90</a>)&quot;
(<a href="https://redirect.github.com/supabase/ssr/issues/100">#100</a>)
(<a
href="2ea8e23525">2ea8e23</a>)</li>
</ul>
<h2>v0.6.1-rc.3</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/99">#99</a> for
context.</p>
<h2>v0.6.1-rc.2</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/99">#99</a> for
context.</p>
<h2>v0.6.0</h2>
<h2><a
href="https://github.com/supabase/ssr/compare/v0.5.2...v0.6.0">0.6.0</a>
(2025-02-27)</h2>
<h3>Features</h3>
<ul>
<li>improve cookie chunk handling via base64url+length encoding (<a
href="https://redirect.github.com/supabase/ssr/issues/90">#90</a>) (<a
href="6deb6871ca">6deb687</a>)</li>
<li>upgrade cookie dependency and cleanup imports (<a
href="https://redirect.github.com/supabase/ssr/issues/77">#77</a>) (<a
href="95245282e6">9524528</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add <code>create*Client</code> string in <code>x-client-info</code>
(<a href="https://redirect.github.com/supabase/ssr/issues/85">#85</a>)
(<a
href="f271accfea">f271acc</a>)</li>
</ul>
<h2>v0.6.0-rc.5</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/80">#80</a> for
context.</p>
<h2>v0.6.0-rc.3</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/80">#80</a> for
context.</p>
<h2>v0.6.0-rc.2</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/80">#80</a> for
context.</p>
<h2>v0.6.0-rc.1</h2>
<p>This is a release candidate. See release-please PR <a
href="https://redirect.github.com/supabase/ssr/issues/80">#80</a> for
context.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/ssr/blob/main/CHANGELOG.md"><code>@​supabase/ssr</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/ssr/compare/v0.6.0...v0.6.1">0.6.1</a>
(2025-03-16)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>force release (<a
href="https://redirect.github.com/supabase/ssr/issues/98">#98</a>) (<a
href="66710e82aa">66710e8</a>)</li>
<li><strong>revert:</strong> &quot;feat: improve cookie chunk handling
via base64url+length encoding (<a
href="https://redirect.github.com/supabase/ssr/issues/90">#90</a>)&quot;
(<a href="https://redirect.github.com/supabase/ssr/issues/100">#100</a>)
(<a
href="2ea8e23525">2ea8e23</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a1b60ba826"><code>a1b60ba</code></a>
chore(main): release 0.6.1 (<a
href="https://redirect.github.com/supabase/ssr/issues/99">#99</a>)</li>
<li><a
href="2ea8e23525"><code>2ea8e23</code></a>
fix(revert): &quot;feat: improve cookie chunk handling via
base64url+length encodi...</li>
<li><a
href="66710e82aa"><code>66710e8</code></a>
fix: force release (<a
href="https://redirect.github.com/supabase/ssr/issues/98">#98</a>)</li>
<li><a
href="37909b21f1"><code>37909b2</code></a>
Revert &quot;chore(main): release 0.6.0&quot; (<a
href="https://redirect.github.com/supabase/ssr/issues/95">#95</a>)</li>
<li><a
href="be9cd6c70e"><code>be9cd6c</code></a>
chore(main): release 0.6.0 (<a
href="https://redirect.github.com/supabase/ssr/issues/80">#80</a>)</li>
<li><a
href="6deb6871ca"><code>6deb687</code></a>
feat: improve cookie chunk handling via base64url+length encoding (<a
href="https://redirect.github.com/supabase/ssr/issues/90">#90</a>)</li>
<li><a
href="ef429dfbd1"><code>ef429df</code></a>
build(deps): bump vite from 5.4.10 to 5.4.14 (<a
href="https://redirect.github.com/supabase/ssr/issues/88">#88</a>)</li>
<li><a
href="ca469593e3"><code>ca46959</code></a>
ci: publish with provenance (<a
href="https://redirect.github.com/supabase/ssr/issues/86">#86</a>)</li>
<li><a
href="f271accfea"><code>f271acc</code></a>
fix: add <code>create*Client</code> string in <code>x-client-info</code>
(<a
href="https://redirect.github.com/supabase/ssr/issues/85">#85</a>)</li>
<li><a
href="95245282e6"><code>9524528</code></a>
feat: upgrade cookie dependency and cleanup imports (<a
href="https://redirect.github.com/supabase/ssr/issues/77">#77</a>)</li>
<li>See full diff in <a
href="https://github.com/supabase/ssr/compare/v0.5.2...v0.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/supabase-js` from 2.49.1 to 2.49.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.49.4</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.3...v2.49.4">2.49.4</a>
(2025-03-29)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> upgrade postgrest-js to 1.19.4 (<a
href="692e8e846b">692e8e8</a>)</li>
</ul>
<h2>v2.49.3</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.2...v2.49.3">2.49.3</a>
(2025-03-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>bump auth-js to 2.69.1 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1383">#1383</a>)
(<a
href="f08bfd9c96">f08bfd9</a>)</li>
</ul>
<h2>v2.49.2</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.1...v2.49.2">2.49.2</a>
(2025-03-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>bump auth-js to v2.69.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1380">#1380</a>)
(<a
href="73ab30dd61">73ab30d</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="692e8e846b"><code>692e8e8</code></a>
fix(deps): upgrade postgrest-js to 1.19.4</li>
<li><a
href="f08bfd9c96"><code>f08bfd9</code></a>
fix: bump auth-js to 2.69.1 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1383">#1383</a>)</li>
<li><a
href="73ab30dd61"><code>73ab30d</code></a>
fix: bump auth-js to v2.69.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1380">#1380</a>)</li>
<li><a
href="a5219a81b3"><code>a5219a8</code></a>
chore: add open role to README.md (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1378">#1378</a>)</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-js/compare/v2.49.1...v2.49.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-table` from 8.21.2 to 8.21.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/table/releases"><code>@​tanstack/react-table</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.21.3</h2>
<p>Version 8.21.3 - 4/14/25, 8:19 PM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>table-core: use right Document instance on getResizeHandler
(column-sizing feature) (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5989">#5989</a>)
(54ce673) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
</ul>
<h3>Docs</h3>
<ul>
<li>fix all 158 broken links (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5972">#5972</a>)
(f7bf6f1) by <a
href="https://github.com/kisaragi-hiu"><code>@​kisaragi-hiu</code></a></li>
<li>add vue example for grouping (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5941">#5941</a>)
(3efa59c) by Harshil Patel</li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/table-core</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/angular-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/qwik-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/react-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/solid-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/svelte-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/vue-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
<li><code>@​tanstack/react-table-devtools</code><a
href="https://github.com/8"><code>@​8</code></a>.21.3</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f4dc742b7b"><code>f4dc742</code></a>
release: v8.21.3</li>
<li>See full diff in <a
href="https://github.com/TanStack/table/commits/v8.21.3/packages/react-table">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.4.2 to 12.6.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.6.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5263">#5263</a> <a
href="e4a8d4b43f"><code>e4a8d4b4</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Multi select key works when input is focused</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5266">#5266</a> <a
href="77107453fa"><code>77107453</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
connection snapping for handles larger than connectionRadius</p>
</li>
<li>
<p>Updated dependencies [<a
href="77107453fa"><code>77107453</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.61</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.6.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5259">#5259</a> <a
href="77bf79c40e"><code>77bf79c4</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
background-color css variable fallback.</p>
</li>
<li>
<p>Updated dependencies [<a
href="77bf79c40e"><code>77bf79c4</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.60</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.6.2</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5257">#5257</a> <a
href="b1314be04d"><code>b1314be0</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use OnReconnect from system</p>
</li>
<li>
<p>Updated dependencies [<a
href="a95f0e2fbf"><code>a95f0e2f</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.59</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.6.1</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5249">#5249</a> <a
href="895b5d81c8"><code>895b5d81</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Call <code>onNodesChange</code> for uncontrolled flows that use
<code>updateNode</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5247">#5247</a> <a
href="67e1cb6891"><code>67e1cb68</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Cleanup TSDoc annotations for ReactFlow</p>
</li>
<li>
<p>Updated dependencies [<a
href="2a03213b06"><code>2a03213b</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.58</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.6.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5219">#5219</a> <a
href="4236adbc46"><code>4236adbc</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add initialMinZoom, initialMaxZoom and initialFitViewOptions to
ReactFlowProvider</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5227">#5227</a> <a
href="a7d10ffce5"><code>a7d10ffc</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add <code>resizeDirection</code> prop for the
<code>NodeResizeControl</code> component</p>
</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5217">#5217</a> <a
href="bce74e8811"><code>bce74e88</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Keep node seleciton on pane click if elementsSelectable=false</p>
</li>
<li>
<p>Updated dependencies [<a
href="a7d10ffce5"><code>a7d10ffc</code></a>,
<a
href="4e681f9c52"><code>4e681f9c</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.57</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.6.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5263">#5263</a> <a
href="e4a8d4b43f"><code>e4a8d4b4</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Multi select key works when input is focused</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5266">#5266</a> <a
href="77107453fa"><code>77107453</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
connection snapping for handles larger than connectionRadius</p>
</li>
<li>
<p>Updated dependencies [<a
href="77107453fa"><code>77107453</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.61</li>
</ul>
</li>
</ul>
<h2>12.6.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5259">#5259</a> <a
href="77bf79c40e"><code>77bf79c4</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
background-color css variable fallback.</p>
</li>
<li>
<p>Updated dependencies [<a
href="77bf79c40e"><code>77bf79c4</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.60</li>
</ul>
</li>
</ul>
<h2>12.6.2</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5257">#5257</a> <a
href="b1314be04d"><code>b1314be0</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use OnReconnect from system</p>
</li>
<li>
<p>Updated dependencies [<a
href="a95f0e2fbf"><code>a95f0e2f</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.59</li>
</ul>
</li>
</ul>
<h2>12.6.1</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5249">#5249</a> <a
href="895b5d81c8"><code>895b5d81</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Call <code>onNodesChange</code> for uncontrolled flows that use
<code>updateNode</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5247">#5247</a> <a
href="67e1cb6891"><code>67e1cb68</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Cleanup TSDoc annotations for ReactFlow</p>
</li>
<li>
<p>Updated dependencies [<a
href="2a03213b06"><code>2a03213b</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.58</li>
</ul>
</li>
</ul>
<h2>12.6.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5219">#5219</a> <a
href="4236adbc46"><code>4236adbc</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add initialMinZoom, initialMaxZoom and initialFitViewOptions to
ReactFlowProvider</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5227">#5227</a> <a
href="a7d10ffce5"><code>a7d10ffc</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add <code>resizeDirection</code> prop for the
<code>NodeResizeControl</code> component</p>
</li>
</ul>
<h3>Patch Changes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0076d82222"><code>0076d82</code></a>
chore(packages): bump</li>
<li><a
href="8ce85fd8f0"><code>8ce85fd</code></a>
fix(react): multi select works when input is focused</li>
<li><a
href="cee50e1dd0"><code>cee50e1</code></a>
chore(packages): bump</li>
<li><a
href="673a3a8718"><code>673a3a8</code></a>
merge main</li>
<li><a
href="9893b6321b"><code>9893b63</code></a>
chore(packages): bump</li>
<li><a
href="69021e8bbe"><code>69021e8</code></a>
chore(react): use OnReconnet from system</li>
<li><a
href="b30a496bf4"><code>b30a496</code></a>
merg main</li>
<li><a
href="2df553e611"><code>2df553e</code></a>
chore(packages): bump</li>
<li><a href="https://g...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-16 13:13:07 +00:00
Abhimanyu Yadav
0e53c540d4 fix(blocks): Disable Twitter and Todoist blocks if their OAuth is not configured (#9954)
I am disabling all the Twitter and Todoist blocks whose OAuth is not
configured.

> I have already checked it locally. When OAuth is not set, the blocks
do not appear in the block menu
2025-05-16 12:12:48 +00:00
dependabot[bot]
e48aec921e chore(backend/deps-dev): Bump 3 dev dependencies to latest minor versions (#9852)
Bumps [poethepoet](https://github.com/nat-n/poethepoet),
[pyright](https://github.com/RobertCraigie/pyright-python) and
[ruff](https://github.com/astral-sh/ruff) to their latest versions.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-16 11:30:42 +00:00
dependabot[bot]
d754c2349c chore(libs/deps-dev): Update ruff from 0.11.2 to 0.11.10 (#9775)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.11.2 to 0.11.10

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.11.2&new-version=0.11.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 10:42:45 +00:00
dependabot[bot]
870f8265b3 chore(backend/deps): Bump 18 dependencies to latest minor versions (#9930)
Bumps the production-dependencies group with 18 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) |
`0.49.0` | `0.51.0` |
| [click](https://github.com/pallets/click) | `8.1.8` | `8.2.0` |
| [e2b-code-interpreter](https://github.com/e2b-dev/code-interpreter) |
`1.1.1` | `1.5.0` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.166.0` | `2.169.0` |
|
[google-auth-oauthlib](https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib)
| `1.2.1` | `1.2.2` |
| [groq](https://github.com/groq/groq-python) | `0.20.0` | `0.24.0` |
|
[launchdarkly-server-sdk](https://github.com/launchdarkly/python-server-sdk)
| `9.10.0` | `9.11.0` |
| [mem0ai](https://github.com/mem0ai/mem0) | `0.1.80` | `0.1.98` |
| [ollama](https://github.com/ollama/ollama-python) | `0.4.7` | `0.4.8`
|
| [openai](https://github.com/openai/openai-python) | `1.70.0` |
`1.78.1` |
| [poetry](https://github.com/python-poetry/poetry) | `2.1.2` | `2.1.3`
|
| [pydantic](https://github.com/pydantic/pydantic) | `2.11.1` | `2.11.4`
|
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) |
`2.8.1` | `2.9.1` |
| [replicate](https://github.com/replicate/replicate-python) | `1.0.4` |
`1.0.6` |
| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.25.1` |
`2.28.0` |
| [supabase](https://github.com/supabase/supabase-py) | `2.15.0` |
`2.15.1` |
| [tenacity](https://github.com/jd/tenacity) | `9.0.0` | `9.1.2` |
| [uvicorn](https://github.com/encode/uvicorn) | `0.34.0` | `0.34.2` |


Updates `anthropic` from 0.49.0 to 0.51.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/releases">anthropic's
releases</a>.</em></p>
<blockquote>
<h2>v0.51.0</h2>
<h2>0.51.0 (2025-05-07)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.50.0...v0.51.0">v0.50.0...v0.51.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> adds web search capabilities to the Claude API
(<a
href="bec0cf93c2">bec0cf9</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>pydantic v1:</strong> more robust ModelField.annotation
check (<a
href="c50f406767">c50f406</a>)</li>
<li><strong>sockets:</strong> handle non-portable socket flags (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/935">#935</a>)
(<a
href="205c8dda37">205c8dd</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>broadly detect json family of content-type headers (<a
href="66bbb3a668">66bbb3a</a>)</li>
<li><strong>ci:</strong> only use depot for staging repos (<a
href="c867a11af3">c867a11</a>)</li>
<li><strong>ci:</strong> run on more branches and use depot runners (<a
href="95f5f17be0">95f5f17</a>)</li>
<li><strong>internal:</strong> add back missing custom modifications for
Web Search (<a
href="f43ba69d53">f43ba69</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="8afef086af">8afef08</a>)</li>
<li>use lazy imports for resources (<a
href="704be817f4">704be81</a>)</li>
</ul>
<h2>v0.50.0</h2>
<h2>0.50.0 (2025-04-22)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.49.0...v0.50.0">v0.49.0...v0.50.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> extract ContentBlockDelta events into their
own schemas (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/920">#920</a>)
(<a
href="ae773d673a">ae773d6</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="46ac1f8d1c">46ac1f8</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="48d9739ad7">48d9739</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="66e8cc3fb2">66e8cc3</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="a74746e0df">a74746e</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/907">#907</a>)
(<a
href="36326871c1">3632687</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/908">#908</a>)
(<a
href="cae032381b">cae0323</a>)</li>
<li><strong>client:</strong> deduplicate stop reason type (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/913">#913</a>)
(<a
href="3ab0194550">3ab0194</a>)</li>
<li><strong>client:</strong> send all configured auth headers (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/929">#929</a>)
(<a
href="9d2581e79f">9d2581e</a>)</li>
<li><strong>perf:</strong> optimize some hot paths (<a
href="cff76cb00b">cff76cb</a>)</li>
<li><strong>perf:</strong> skip traversing types for NotGiven values (<a
href="dadac7fa72">dadac7f</a>)</li>
<li><strong>project:</strong> bump httpx minimum version to 0.25.0 (<a
href="b554138c2f">b554138</a>),
closes <a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/902">#902</a></li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/906">#906</a>)
(<a
href="2fc179a4d2">2fc179a</a>)</li>
<li><strong>vertex:</strong> explicitly include requests extra (<a
href="2b1221b76b">2b1221b</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md">anthropic's
changelog</a>.</em></p>
<blockquote>
<h2>0.51.0 (2025-05-07)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.50.0...v0.51.0">v0.50.0...v0.51.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> adds web search capabilities to the Claude API
(<a
href="bec0cf93c2">bec0cf9</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>pydantic v1:</strong> more robust ModelField.annotation
check (<a
href="c50f406767">c50f406</a>)</li>
<li><strong>sockets:</strong> handle non-portable socket flags (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/935">#935</a>)
(<a
href="205c8dda37">205c8dd</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>broadly detect json family of content-type headers (<a
href="66bbb3a668">66bbb3a</a>)</li>
<li><strong>ci:</strong> only use depot for staging repos (<a
href="c867a11af3">c867a11</a>)</li>
<li><strong>ci:</strong> run on more branches and use depot runners (<a
href="95f5f17be0">95f5f17</a>)</li>
<li><strong>internal:</strong> add back missing custom modifications for
Web Search (<a
href="f43ba69d53">f43ba69</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="8afef086af">8afef08</a>)</li>
<li>use lazy imports for resources (<a
href="704be817f4">704be81</a>)</li>
</ul>
<h2>0.50.0 (2025-04-22)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.49.0...v0.50.0">v0.49.0...v0.50.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> extract ContentBlockDelta events into their
own schemas (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/920">#920</a>)
(<a
href="ae773d673a">ae773d6</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="46ac1f8d1c">46ac1f8</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="48d9739ad7">48d9739</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="66e8cc3fb2">66e8cc3</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="a74746e0df">a74746e</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/907">#907</a>)
(<a
href="36326871c1">3632687</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/908">#908</a>)
(<a
href="cae032381b">cae0323</a>)</li>
<li><strong>client:</strong> deduplicate stop reason type (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/913">#913</a>)
(<a
href="3ab0194550">3ab0194</a>)</li>
<li><strong>client:</strong> send all configured auth headers (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/929">#929</a>)
(<a
href="9d2581e79f">9d2581e</a>)</li>
<li><strong>perf:</strong> optimize some hot paths (<a
href="cff76cb00b">cff76cb</a>)</li>
<li><strong>perf:</strong> skip traversing types for NotGiven values (<a
href="dadac7fa72">dadac7f</a>)</li>
<li><strong>project:</strong> bump httpx minimum version to 0.25.0 (<a
href="b554138c2f">b554138</a>),
closes <a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/902">#902</a></li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/906">#906</a>)
(<a
href="2fc179a4d2">2fc179a</a>)</li>
<li><strong>vertex:</strong> explicitly include requests extra (<a
href="2b1221b76b">2b1221b</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e42451ab3f"><code>e42451a</code></a>
release: 0.51.0</li>
<li><a
href="4c7f97f3ea"><code>4c7f97f</code></a>
chore(internal): add back missing custom modifications for Web
Search</li>
<li><a
href="2da00f26c5"><code>2da00f2</code></a>
feat(api): adds web search capabilities to the Claude API</li>
<li><a
href="51fd796456"><code>51fd796</code></a>
fix(sockets): handle non-portable socket flags (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/935">#935</a>)</li>
<li><a
href="ac6cfee090"><code>ac6cfee</code></a>
chore: use lazy imports for resources</li>
<li><a
href="215f5bbe56"><code>215f5bb</code></a>
chore: broadly detect json family of content-type headers</li>
<li><a
href="bcaa8a582b"><code>bcaa8a5</code></a>
chore(ci): only use depot for staging repos</li>
<li><a
href="a41e9c346a"><code>a41e9c3</code></a>
chore(ci): run on more branches and use depot runners</li>
<li><a
href="bfebcd91c6"><code>bfebcd9</code></a>
chore(internal): minor formatting changes</li>
<li><a
href="e3548ac1c5"><code>e3548ac</code></a>
fix(pydantic v1): more robust ModelField.annotation check</li>
<li>Additional commits viewable in <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.49.0...v0.51.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `click` from 8.1.8 to 8.2.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/click/releases">click's
releases</a>.</em></p>
<blockquote>
<h2>8.2.0</h2>
<p>This is the Click 8.2.0 feature release. A feature release may
include new features, remove previously deprecated code, add new
deprecation, or introduce potentially breaking changes.</p>
<p>We encourage everyone to upgrade. You can read more about our <a
href="https://palletsprojects.com/versions">Version Support Policy</a>
on our website.</p>
<p>PyPI: <a
href="https://pypi.org/project/click/8.2.0/">https://pypi.org/project/click/8.2.0/</a>
Changes: <a
href="https://click.palletsprojects.com/en/stable/changes/">https://click.palletsprojects.com/en/stable/changes/</a>
Milestone <a
href="https://github.com/pallets/click/milestone/15">https://github.com/pallets/click/milestone/15</a></p>
<ul>
<li>Drop support for Python 3.7, 3.8,and 3.9. <a
href="https://redirect.github.com/pallets/click/issues/2588">#2588</a>,
<a
href="https://redirect.github.com/pallets/click/issues/2893">#2893</a></li>
<li>Use modern packaging metadata with <code>pyproject.toml</code>
instead of <code>setup.cfg</code>. <a
href="https://redirect.github.com/pallets/click/issues/2438">#2438</a></li>
<li>Use <code>flit_core</code> instead of <code>setuptools</code> as
build backend. <a
href="https://redirect.github.com/pallets/click/issues/2543">#2543</a></li>
<li>Deprecate the <code>__version__</code> attribute. Use feature
detection, or
<code>importlib.metadata.version(&quot;click&quot;)</code>, instead. <a
href="https://redirect.github.com/pallets/click/issues/2598">#2598</a></li>
<li><code>BaseCommand</code> is deprecated. <code>Command</code> is the
base class for all commands. <a
href="https://redirect.github.com/pallets/click/issues/2589">#2589</a></li>
<li><code>MultiCommand</code> is deprecated. <code>Group</code> is the
base class for all group commands. <a
href="https://redirect.github.com/pallets/click/issues/2590">#2590</a></li>
<li>The current parser and related classes and methods, are deprecated.
<a
href="https://redirect.github.com/pallets/click/issues/2205">#2205</a>
<ul>
<li><code>OptionParser</code> and the <code>parser</code> module, which
is a modified copy of <code>optparse</code> in the standard
library.</li>
<li><code>Context.protected_args</code> is unneeded.
<code>Context.args</code> contains any remaining arguments while
parsing.</li>
<li><code>Parameter.add_to_parser</code> (on both <code>Argument</code>
and <code>Option</code>) is unneeded. Parsing works directly without
building a separate parser.</li>
<li><code>split_arg_string</code> is moved from <code>parser</code> to
<code>shell_completion</code>.</li>
</ul>
</li>
<li>Enable deferred evaluation of annotations with <code>from __future__
import annotations</code>. <a
href="https://redirect.github.com/pallets/click/issues/2270">#2270</a></li>
<li>When generating a command's name from a decorated function's name,
the suffixes <code>_command</code>, <code>_cmd</code>,
<code>_group</code>, and <code>_grp</code> are removed. <a
href="https://redirect.github.com/pallets/click/issues/2322">#2322</a></li>
<li>Show the <code>types.ParamType.name</code> for
<code>types.Choice</code> options within <code>--help</code> message if
<code>show_choices=False</code> is specified. <a
href="https://redirect.github.com/pallets/click/issues/2356">#2356</a></li>
<li>Do not display default values in prompts when
<code>Option.show_default</code> is <code>False</code>. <a
href="https://redirect.github.com/pallets/click/issues/2509">#2509</a></li>
<li>Add <code>get_help_extra</code> method on <code>Option</code> to
fetch the generated extra items used in <code>get_help_record</code> to
render help text. <a
href="https://redirect.github.com/pallets/click/issues/2516">#2516</a>
<a
href="https://redirect.github.com/pallets/click/issues/2517">#2517</a></li>
<li>Keep stdout and stderr streams independent in
<code>CliRunner</code>. Always collect stderr output and never raise an
exception. Add a new output stream to simulate what the user sees in its
terminal. Removes the <code>mix_stderr</code> parameter in
<code>CliRunner</code>. <a
href="https://redirect.github.com/pallets/click/issues/2522">#2522</a>
<a
href="https://redirect.github.com/pallets/click/issues/2523">#2523</a></li>
<li><code>Option.show_envvar</code> now also shows environment variable
in error messages. <a
href="https://redirect.github.com/pallets/click/issues/2695">#2695</a>
<a
href="https://redirect.github.com/pallets/click/issues/2696">#2696</a></li>
<li><code>Context.close</code> will be called on exit. This results in
all <code>Context.call_on_close</code> callbacks and context managers
added via <code>Context.with_resource</code> to be closed on exit as
well. <a
href="https://redirect.github.com/pallets/click/issues/2680">#2680</a></li>
<li>Add <code>ProgressBar(hidden: bool)</code> to allow hiding the
progressbar. <a
href="https://redirect.github.com/pallets/click/issues/2609">#2609</a></li>
<li>A <code>UserWarning</code> will be shown when multiple parameters
attempt to use the same name. <a
href="https://redirect.github.com/pallets/click/issues/2396">#2396</a></li>
<li>When using <code>Option.envvar</code> with
<code>Option.flag_value</code>, the <code>flag_value</code> will always
be used instead of the value of the environment variable. <a
href="https://redirect.github.com/pallets/click/issues/2746">#2746</a>
<a
href="https://redirect.github.com/pallets/click/issues/2788">#2788</a></li>
<li>Add <code>Choice.get_invalid_choice_message</code> method for
customizing the invalid choice message. <a
href="https://redirect.github.com/pallets/click/issues/2621">#2621</a>
<a
href="https://redirect.github.com/pallets/click/issues/2622">#2622</a></li>
<li>If help is shown because <code>no_args_is_help</code> is enabled
(defaults to <code>True</code> for groups, <code>False</code> for
commands), the exit code is 2 instead of 0. <a
href="https://redirect.github.com/pallets/click/issues/1489">#1489</a>
<a
href="https://redirect.github.com/pallets/click/issues/1489">#1489</a></li>
<li>Contexts created during shell completion are closed properly, fixing
a <code>ResourceWarning</code> when using <code>click.File</code>. <a
href="https://redirect.github.com/pallets/click/issues/2644">#2644</a>
<a
href="https://redirect.github.com/pallets/click/issues/2800">#2800</a>
<a
href="https://redirect.github.com/pallets/click/issues/2767">#2767</a></li>
<li><code>click.edit(filename)</code> now supports passing an iterable
of filenames in case the editor supports editing multiple files at once.
Its return type is now also typed: <code>AnyStr</code> if
<code>text</code> is passed, otherwise <code>None</code>. <a
href="https://redirect.github.com/pallets/click/issues/2067">#2067</a>
<a
href="https://redirect.github.com/pallets/click/issues/2068">#2068</a></li>
<li>Specialized typing of <code>progressbar(length=...)</code> as
<code>ProgressBar[int]</code>. <a
href="https://redirect.github.com/pallets/click/issues/2630">#2630</a></li>
<li>Improve <code>echo_via_pager</code> behaviour in face of errors. <a
href="https://redirect.github.com/pallets/click/issues/2674">#2674</a>
<ul>
<li>Terminate the pager in case a generator passed to
<code>echo_via_pager</code> raises an exception.</li>
<li>Ensure to always close the pipe to the pager process and wait for it
to terminate.</li>
<li><code>echo_via_pager</code> will not ignore
<code>KeyboardInterrupt</code> anymore. This allows the user to search
for future output of the generator when using less and then aborting the
program using ctrl-c.</li>
</ul>
</li>
<li><code>deprecated: bool | str</code> can now be used on options and
arguments. This previously was only available for <code>Command</code>.
The message can now also be customised by using a <code>str</code>
instead of a <code>bool</code>. <a
href="https://redirect.github.com/pallets/click/issues/2263">#2263</a>
<a
href="https://redirect.github.com/pallets/click/issues/2271">#2271</a>
<ul>
<li><code>Command.deprecated</code> formatting in <code>--help</code>
changed from <code>(Deprecated) help</code> to <code>help
(DEPRECATED)</code>.</li>
<li>Parameters cannot be required nor prompted or an error is
raised.</li>
<li>A warning will be printed when something deprecated is used.</li>
</ul>
</li>
<li>Add a <code>catch_exceptions</code> parameter to
<code>CliRunner</code>. If <code>catch_exceptions</code> is not passed
to <code>CliRunner.invoke</code>, the value from <code>CliRunner</code>
is used. <a
href="https://redirect.github.com/pallets/click/issues/2817">#2817</a>
<a
href="https://redirect.github.com/pallets/click/issues/2818">#2818</a></li>
<li><code>Option.flag_value</code> will no longer have a default value
set based on <code>Option.default</code> if <code>Option.is_flag</code>
is <code>False</code>. This results in <code>Option.default</code> not
needing to implement <code>__bool__</code>. <a
href="https://redirect.github.com/pallets/click/issues/2829">#2829</a></li>
<li>Incorrect <code>click.edit</code> typing has been corrected. <a
href="https://redirect.github.com/pallets/click/issues/2804">#2804</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/click/blob/main/CHANGES.rst">click's
changelog</a>.</em></p>
<blockquote>
<h2>Version 8.2.0</h2>
<p>Released 2025-05-10</p>
<ul>
<li>
<p>Drop support for Python 3.7, 3.8, and 3.9. :pr:<code>2588</code>
:pr:<code>2893</code></p>
</li>
<li>
<p>Use modern packaging metadata with <code>pyproject.toml</code>
instead of <code>setup.cfg</code>.
:pr:<code>2438</code></p>
</li>
<li>
<p>Use <code>flit_core</code> instead of <code>setuptools</code> as
build backend. :pr:<code>2543</code></p>
</li>
<li>
<p>Deprecate the <code>__version__</code> attribute. Use feature
detection, or
<code>importlib.metadata.version(&quot;click&quot;)</code>, instead.
:issue:<code>2598</code></p>
</li>
<li>
<p><code>BaseCommand</code> is deprecated. <code>Command</code> is the
base class for all
commands. :issue:<code>2589</code></p>
</li>
<li>
<p><code>MultiCommand</code> is deprecated. <code>Group</code> is the
base class for all group
commands. :issue:<code>2590</code></p>
</li>
<li>
<p>The current parser and related classes and methods, are deprecated.
:issue:<code>2205</code></p>
<ul>
<li><code>OptionParser</code> and the <code>parser</code> module, which
is a modified copy of
<code>optparse</code> in the standard library.</li>
<li><code>Context.protected_args</code> is unneeded.
<code>Context.args</code> contains any
remaining arguments while parsing.</li>
<li><code>Parameter.add_to_parser</code> (on both <code>Argument</code>
and <code>Option</code>) is
unneeded. Parsing works directly without building a separate
parser.</li>
<li><code>split_arg_string</code> is moved from <code>parser</code> to
<code>shell_completion</code>.</li>
</ul>
</li>
<li>
<p>Enable deferred evaluation of annotations with
<code>from __future__ import annotations</code>.
:pr:<code>2270</code></p>
</li>
<li>
<p>When generating a command's name from a decorated function's name,
the
suffixes <code>_command</code>, <code>_cmd</code>, <code>_group</code>,
and <code>_grp</code> are removed.
:issue:<code>2322</code></p>
</li>
<li>
<p>Show the <code>types.ParamType.name</code> for
<code>types.Choice</code> options within
<code>--help</code> message if <code>show_choices=False</code> is
specified.
:issue:<code>2356</code></p>
</li>
<li>
<p>Do not display default values in prompts when
<code>Option.show_default</code> is
<code>False</code>. :pr:<code>2509</code></p>
</li>
<li>
<p>Add <code>get_help_extra</code> method on <code>Option</code> to
fetch the generated extra
items used in <code>get_help_record</code> to render help text.
:issue:<code>2516</code>
:pr:<code>2517</code></p>
</li>
<li>
<p>Keep stdout and stderr streams independent in <code>CliRunner</code>.
Always
collect stderr output and never raise an exception. Add a new
output stream to simulate what the user sees in its terminal. Removes
the <code>mix_stderr</code> parameter in <code>CliRunner</code>.
:issue:<code>2522</code> :pr:<code>2523</code></p>
</li>
<li>
<p><code>Option.show_envvar</code> now also shows environment variable
in error messages.
:issue:<code>2695</code> :pr:<code>2696</code></p>
</li>
<li>
<p><code>Context.close</code> will be called on exit. This results in
all
<code>Context.call_on_close</code> callbacks and context managers added
via
<code>Context.with_resource</code> to be closed on exit as well.
:pr:<code>2680</code></p>
</li>
<li>
<p>Add <code>ProgressBar(hidden: bool)</code> to allow hiding the
progressbar. :issue:<code>2609</code></p>
</li>
<li>
<p>A <code>UserWarning</code> will be shown when multiple parameters
attempt to use the</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="219206a186"><code>219206a</code></a>
release version 8.2.0</li>
<li><a
href="498f882604"><code>498f882</code></a>
drop end of life python versions (<a
href="https://redirect.github.com/pallets/click/issues/2893">#2893</a>)</li>
<li><a
href="ba770cbc96"><code>ba770cb</code></a>
drop end of life python versions</li>
<li><a
href="f14b75063f"><code>f14b750</code></a>
update dev dependencies</li>
<li><a
href="9982faee85"><code>9982fae</code></a>
Update CHANGES.rst</li>
<li><a
href="7318f5f11b"><code>7318f5f</code></a>
Update CHANGES.rst</li>
<li><a
href="b7c0ab471c"><code>b7c0ab4</code></a>
Merge <code>stable</code> into <code>main</code>; Release 8.2.0 (<a
href="https://redirect.github.com/pallets/click/issues/2873">#2873</a>)</li>
<li><a
href="c9b96fe08d"><code>c9b96fe</code></a>
Merge branch 'main' into main</li>
<li><a
href="ab21233fc8"><code>ab21233</code></a>
Rewrite second half of options docs (<a
href="https://redirect.github.com/pallets/click/issues/2848">#2848</a>)</li>
<li><a
href="8c89a14362"><code>8c89a14</code></a>
Merge branch 'main' into options_docs_2</li>
<li>Additional commits viewable in <a
href="https://github.com/pallets/click/compare/8.1.8...8.2.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `e2b-code-interpreter` from 1.1.1 to 1.5.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c590c09188"><code>c590c09</code></a>
Bump e2b core to 1.4.0 (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/101">#101</a>)</li>
<li><a
href="0ba58b4a97"><code>0ba58b4</code></a>
vitest: continue after failing test (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/100">#100</a>)</li>
<li><a
href="e80eb185dd"><code>e80eb18</code></a>
added ts-kernel tests (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/99">#99</a>)</li>
<li><a
href="8251c2fb3c"><code>8251c2f</code></a>
[skip ci] Release new versions</li>
<li><a
href="95163ce294"><code>95163ce</code></a>
Added TypeScript support to the code interpreter (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/91">#91</a>)</li>
<li><a
href="120d097e24"><code>120d097</code></a>
[skip ci] Release new versions</li>
<li><a
href="9f9a423e45"><code>9f9a423</code></a>
Updated template with SWC compiler for TypeScript (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/97">#97</a>)</li>
<li><a
href="3be5d224f8"><code>3be5d22</code></a>
[skip ci] Release new versions</li>
<li><a
href="2ee6ffb9aa"><code>2ee6ffb</code></a>
Update JS SDK target to es2017 (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/96">#96</a>)</li>
<li><a
href="2bfcfbb615"><code>2bfcfbb</code></a>
Security patches (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/95">#95</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/e2b-dev/code-interpreter/compare/@e2b/code-interpreter@1.1.1...@e2b/code-interpreter@1.5.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.166.0 to 2.169.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.169.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.168.0...v2.169.0">2.169.0</a>
(2025-04-29)</h2>
<h3>Features</h3>
<ul>
<li><strong>aiplatform:</strong> Update the api <a
href="6ccd7f5371</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>artifactregistry:</strong> Update the api <a
href="ac6477013f</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>blockchainnodeengine:</strong> Update the api <a
href="4b1c7d2466</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>cloudchannel:</strong> Update the api <a
href="5e15d858dd</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>cloudresourcemanager:</strong> Update the api <a
href="94d98b6e6a</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>connectors:</strong> Update the api <a
href="a456e2ceaf</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>dataflow:</strong> Update the api <a
href="ea28e0289e</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>dataform:</strong> Update the api <a
href="35990c2ffd</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>datamigration:</strong> Update the api <a
href="d9218bd460</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>dataplex:</strong> Update the api <a
href="6df52e86e8</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>dialogflow:</strong> Update the api <a
href="bb0b59eedc</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>discoveryengine:</strong> Update the api <a
href="5af62dfdcf</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>displayvideo:</strong> Update the api <a
href="67effcf14b</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>documentai:</strong> Update the api <a
href="fadb34b1a6</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>drive:</strong> Update the api <a
href="7d2063f757</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>file:</strong> Update the api <a
href="a820c78341</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>firebaseml:</strong> Update the api <a
href="e45e9b0fc2</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>gkehub:</strong> Update the api <a
href="3c38499a90</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>iamcredentials:</strong> Update the api <a
href="c59ac8442a</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>integrations:</strong> Update the api <a
href="fa57493279</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>merchantapi:</strong> Update the api <a
href="8e00992fb2</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>networkconnectivity:</strong> Update the api <a
href="b3c8df3478</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>networkmanagement:</strong> Update the api <a
href="62a2c6a476</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>networksecurity:</strong> Update the api <a
href="39706e9fd8</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>oracledatabase:</strong> Update the api <a
href="6678c3beeb</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>orgpolicy:</strong> Update the api <a
href="d1244740ed</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>sheets:</strong> Update the api <a
href="8b09804195</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>sqladmin:</strong> Update the api <a
href="900e43c86d</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>tpu:</strong> Update the api <a
href="183d48eb24</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>translate:</strong> Update the api <a
href="c230f82427</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>vpcaccess:</strong> Update the api <a
href="cae086c59a</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>youtube:</strong> Update the api <a
href="d0b32ba5ba</a>
(<a
href="14bd22993e">14bd229</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>admin:</strong> Update the api <a
href="82e6e7d206</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>cloudbuild:</strong> Update the api <a
href="009d14e0bd</a>
(<a
href="14bd22993e">14bd229</a>)</li>
<li><strong>storage:</strong> Update the api <a
href="e70b2a8745</a>
(<a
href="14bd22993e">14bd229</a>)</li>
</ul>
<h2>v2.168.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.167.0...v2.168.0">2.168.0</a>
(2025-04-22)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="bece3b3b3a"><code>bece3b3</code></a>
chore(main): release 2.169.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2600">#2600</a>)</li>
<li><a
href="14bd22993e"><code>14bd229</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2599">#2599</a>)</li>
<li><a
href="ac22e7ce69"><code>ac22e7c</code></a>
chore(main): release 2.168.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2595">#2595</a>)</li>
<li><a
href="27e0dff489"><code>27e0dff</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2597">#2597</a>)</li>
<li><a
href="e2aaf41f7e"><code>e2aaf41</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2596">#2596</a>)</li>
<li><a
href="607bd3d516"><code>607bd3d</code></a>
fix: remove setup.cfg configuration for creating universal wheels (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2580">#2580</a>)</li>
<li><a
href="236c82dc14"><code>236c82d</code></a>
chore(main): release 2.167.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2591">#2591</a>)</li>
<li><a
href="139f58fb30"><code>139f58f</code></a>
fix: explicitly declare support for Python 3.13 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2593">#2593</a>)</li>
<li><a
href="f84e041b4b"><code>f84e041</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2594">#2594</a>)</li>
<li><a
href="a9db82a60a"><code>a9db82a</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2590">#2590</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/google-api-python-client/compare/v2.166.0...v2.169.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-auth-oauthlib` from 1.2.1 to 1.2.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/releases">google-auth-oauthlib's
releases</a>.</em></p>
<blockquote>
<h2>v1.2.2</h2>
<h2><a
href="https://github.com/googleapis/google-auth-library-python-oauthlib/compare/v1.2.1...v1.2.2">1.2.2</a>
(2025-04-01)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Do not include docs/conf.py &amp; scripts in wheel (<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/328">#328</a>)
(<a
href="78940dfce4">78940df</a>)</li>
<li>Let OS select an available port when running TestInstalledAppFlow
(<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/407">#407</a>)
(<a
href="6060d65626">6060d65</a>),
closes <a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/381">#381</a></li>
<li>Remove setup.cfg configuration for creating universal wheels (<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/405">#405</a>)
(<a
href="0b962ed5aa">0b962ed</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-auth-library-python-oauthlib/blob/main/CHANGELOG.md">google-auth-oauthlib's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/google-auth-library-python-oauthlib/compare/v1.2.1...v1.2.2">1.2.2</a>
(2025-04-01)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Do not include docs/conf.py &amp; scripts in wheel (<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/328">#328</a>)
(<a
href="78940dfce4">78940df</a>)</li>
<li>Let OS select an available port when running TestInstalledAppFlow
(<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/407">#407</a>)
(<a
href="6060d65626">6060d65</a>),
closes <a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/381">#381</a></li>
<li>Remove setup.cfg configuration for creating universal wheels (<a
href="https://redirect.github.com/googleapis/google-auth-library-python-oauthlib/issues/405">#405</a>)
(<a
href="0b962ed5aa">0b962ed</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cc29cc3c37"><code>cc29cc3</code></a>
chore(main): release 1.2.2 (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/368">#368</a>)</li>
<li><a
href="6060d65626"><code>6060d65</code></a>
fix: Let OS select an available port when running TestInstalledAppFlow
(<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/407">#407</a>)</li>
<li><a
href="0b962ed5aa"><code>0b962ed</code></a>
fix: remove setup.cfg configuration for creating universal wheels (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/405">#405</a>)</li>
<li><a
href="dedc58a521"><code>dedc58a</code></a>
chore: remove unused files (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/402">#402</a>)</li>
<li><a
href="63442e94fd"><code>63442e9</code></a>
chore(python): conditionally load credentials in .kokoro/build.sh (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/398">#398</a>)</li>
<li><a
href="9a1dfab8e9"><code>9a1dfab</code></a>
chore: check if port is in use before returning the port to start a new
serve...</li>
<li><a
href="9c3861009e"><code>9c38610</code></a>
chore: Reduce prioirty of flaky tests (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/390">#390</a>)</li>
<li><a
href="780f6a6cae"><code>780f6a6</code></a>
chore(python): Update the python version in docs presubmit to use 3.10
(<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/387">#387</a>)</li>
<li><a
href="2a561a6975"><code>2a561a6</code></a>
chore(deps): update all dependencies (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/382">#382</a>)</li>
<li><a
href="c220b451d1"><code>c220b45</code></a>
chore(python): update dependencies in .kokoro/docker/docs (<a
href="https://redirect.github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/issues/380">#380</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib/compare/v1.2.1...v1.2.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `groq` from 0.20.0 to 0.24.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/releases">groq's
releases</a>.</em></p>
<blockquote>
<h2>v0.24.0</h2>
<h2>0.24.0 (2025-05-02)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.23.1...v0.24.0">v0.23.1...v0.24.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="e65ff4d299">e65ff4d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add include/exclude_domains to all chat completions overloads (<a
href="7616f4b2e9">7616f4b</a>)</li>
</ul>
<h2>v0.23.1</h2>
<h2>0.23.1 (2025-04-24)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.23.0...v0.23.1">v0.23.0...v0.23.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li>add executed_tools to streaming choicedelta (<a
href="fb26fbcd0b">fb26fbc</a>)</li>
<li><strong>pydantic v1:</strong> more robust ModelField.annotation
check (<a
href="40aaee2cd7">40aaee2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>broadly detect json family of content-type headers (<a
href="2411533949">2411533</a>)</li>
<li><strong>ci:</strong> add timeout thresholds for CI jobs (<a
href="aae461436e">aae4614</a>)</li>
<li><strong>ci:</strong> only use depot for staging repos (<a
href="b6d1b47c1c">b6d1b47</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="1da64f5c78">1da64f5</a>)</li>
<li><strong>internal:</strong> fix list file params (<a
href="a9b18debf8">a9b18de</a>)</li>
<li><strong>internal:</strong> import reformatting (<a
href="5068736832">5068736</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="bc26d603a5">bc26d60</a>)</li>
<li><strong>internal:</strong> refactor retries to not use recursion (<a
href="488b9fe0a8">488b9fe</a>)</li>
</ul>
<h2>v0.23.0</h2>
<h2>0.23.0 (2025-04-22)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.22.0...v0.23.0">v0.22.0...v0.23.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="f5cbd0148e">f5cbd01</a>)</li>
<li><strong>api:</strong> api update (<a
href="e7c5514b3e">e7c5514</a>)</li>
<li><strong>api:</strong> api update (<a
href="9d5b7c8ba4">9d5b7c8</a>)</li>
<li><strong>api:</strong> api update (<a
href="73357e15c4">73357e1</a>)</li>
<li><strong>api:</strong> api update (<a
href="b1d6697301">b1d6697</a>)</li>
<li><strong>api:</strong> api update (<a
href="98ef30efd2">98ef30e</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/blob/main/CHANGELOG.md">groq's
changelog</a>.</em></p>
<blockquote>
<h2>0.24.0 (2025-05-02)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.23.1...v0.24.0">v0.23.1...v0.24.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="e65ff4d299">e65ff4d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add include/exclude_domains to all chat completions overloads (<a
href="7616f4b2e9">7616f4b</a>)</li>
</ul>
<h2>0.23.1 (2025-04-24)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.23.0...v0.23.1">v0.23.0...v0.23.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li>add executed_tools to streaming choicedelta (<a
href="fb26fbcd0b">fb26fbc</a>)</li>
<li><strong>pydantic v1:</strong> more robust ModelField.annotation
check (<a
href="40aaee2cd7">40aaee2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>broadly detect json family of content-type headers (<a
href="2411533949">2411533</a>)</li>
<li><strong>ci:</strong> add timeout thresholds for CI jobs (<a
href="aae461436e">aae4614</a>)</li>
<li><strong>ci:</strong> only use depot for staging repos (<a
href="b6d1b47c1c">b6d1b47</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="1da64f5c78">1da64f5</a>)</li>
<li><strong>internal:</strong> fix list file params (<a
href="a9b18debf8">a9b18de</a>)</li>
<li><strong>internal:</strong> import reformatting (<a
href="5068736832">5068736</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="bc26d603a5">bc26d60</a>)</li>
<li><strong>internal:</strong> refactor retries to not use recursion (<a
href="488b9fe0a8">488b9fe</a>)</li>
</ul>
<h2>0.23.0 (2025-04-22)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.22.0...v0.23.0">v0.22.0...v0.23.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="f5cbd0148e">f5cbd01</a>)</li>
<li><strong>api:</strong> api update (<a
href="e7c5514b3e">e7c5514</a>)</li>
<li><strong>api:</strong> api update (<a
href="9d5b7c8ba4">9d5b7c8</a>)</li>
<li><strong>api:</strong> api update (<a
href="73357e15c4">73357e1</a>)</li>
<li><strong>api:</strong> api update (<a
href="b1d6697301">b1d6697</a>)</li>
<li><strong>api:</strong> api update (<a
href="98ef30efd2">98ef30e</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e1280b2c3e"><code>e1280b2</code></a>
release: 0.24.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/240">#240</a>)</li>
<li><a
href="ab7fe20db7"><code>ab7fe20</code></a>
release: 0.23.1 (<a
href="https://redirect.github.com/groq/groq-python/issues/239">#239</a>)</li>
<li><a href="https://github.com/groq/groq-python/commit/f3d1ea0...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-16 10:26:39 +00:00
dependabot[bot]
ba91c9f736 chore(libs/deps): Update 4 dependencies (#9908)
Bumps the production-dependencies group with 4 updates in the
/autogpt_platform/autogpt_libs directory:
[google-cloud-logging](https://github.com/googleapis/python-logging),
[pydantic](https://github.com/pydantic/pydantic),
[pydantic-settings](https://github.com/pydantic/pydantic-settings) and
[supabase](https://github.com/supabase/supabase-py).

Updates `google-cloud-logging` from 3.11.4 to 3.12.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-logging/releases">google-cloud-logging's
releases</a>.</em></p>
<blockquote>
<h2>v3.12.1</h2>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.12.0...v3.12.1">3.12.1</a>
(2025-04-21)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Make logging handler close conditional to having the transport
opened (<a
href="https://redirect.github.com/googleapis/python-logging/issues/990">#990</a>)
(<a
href="66c6b91725">66c6b91</a>)</li>
</ul>
<h2>v3.12.0</h2>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.11.4...v3.12.0">3.12.0</a>
(2025-04-10)</h2>
<h3>Features</h3>
<ul>
<li>Add REST Interceptors which support reading metadata (<a
href="681bcc5c1f">681bcc5</a>)</li>
<li>Add support for opt-in debug logging (<a
href="681bcc5c1f">681bcc5</a>)</li>
<li>Added flushes/close functionality to logging handlers (<a
href="https://redirect.github.com/googleapis/python-logging/issues/917">#917</a>)
(<a
href="d179304b34">d179304</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Allow protobuf 6.x (<a
href="https://redirect.github.com/googleapis/python-logging/issues/977">#977</a>)
(<a
href="6757890013">6757890</a>)</li>
<li><strong>deps:</strong> Require google-cloud-audit-log &gt;= 0.3.1
(<a
href="https://redirect.github.com/googleapis/python-logging/issues/979">#979</a>)
(<a
href="1cc00ecf64">1cc00ec</a>)</li>
<li>Fix typing issue with gRPC metadata when key ends in -bin (<a
href="681bcc5c1f">681bcc5</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Added documentation on log_level and excluded_loggers params in
setup_logging (<a
href="https://redirect.github.com/googleapis/python-logging/issues/971">#971</a>)
(<a
href="70d9d25bf8">70d9d25</a>)</li>
<li>Update README to break infinite redirect loop (<a
href="https://redirect.github.com/googleapis/python-logging/issues/972">#972</a>)
(<a
href="52cd907bb3">52cd907</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-logging/blob/main/CHANGELOG.md">google-cloud-logging's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.12.0...v3.12.1">3.12.1</a>
(2025-04-21)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Make logging handler close conditional to having the transport
opened (<a
href="https://redirect.github.com/googleapis/python-logging/issues/990">#990</a>)
(<a
href="66c6b91725">66c6b91</a>)</li>
</ul>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.11.4...v3.12.0">3.12.0</a>
(2025-04-10)</h2>
<h3>Features</h3>
<ul>
<li>Add REST Interceptors which support reading metadata (<a
href="681bcc5c1f">681bcc5</a>)</li>
<li>Add support for opt-in debug logging (<a
href="681bcc5c1f">681bcc5</a>)</li>
<li>Added flushes/close functionality to logging handlers (<a
href="https://redirect.github.com/googleapis/python-logging/issues/917">#917</a>)
(<a
href="d179304b34">d179304</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Allow protobuf 6.x (<a
href="https://redirect.github.com/googleapis/python-logging/issues/977">#977</a>)
(<a
href="6757890013">6757890</a>)</li>
<li><strong>deps:</strong> Require google-cloud-audit-log &gt;= 0.3.1
(<a
href="https://redirect.github.com/googleapis/python-logging/issues/979">#979</a>)
(<a
href="1cc00ecf64">1cc00ec</a>)</li>
<li>Fix typing issue with gRPC metadata when key ends in -bin (<a
href="681bcc5c1f">681bcc5</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Added documentation on log_level and excluded_loggers params in
setup_logging (<a
href="https://redirect.github.com/googleapis/python-logging/issues/971">#971</a>)
(<a
href="70d9d25bf8">70d9d25</a>)</li>
<li>Update README to break infinite redirect loop (<a
href="https://redirect.github.com/googleapis/python-logging/issues/972">#972</a>)
(<a
href="52cd907bb3">52cd907</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f4fb25ab6f"><code>f4fb25a</code></a>
chore(main): release 3.12.1 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/992">#992</a>)</li>
<li><a
href="66c6b91725"><code>66c6b91</code></a>
fix: make logging handler close conditional to having the transport
opened (#...</li>
<li><a
href="5f89b5f77d"><code>5f89b5f</code></a>
chore(main): release 3.12.0 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/973">#973</a>)</li>
<li><a
href="5db27c2ac0"><code>5db27c2</code></a>
chore(python): remove .flake8 configuration file in templates (<a
href="https://redirect.github.com/googleapis/python-logging/issues/983">#983</a>)</li>
<li><a
href="d179304b34"><code>d179304</code></a>
feat: Added flushes/close functionality to logging handlers (<a
href="https://redirect.github.com/googleapis/python-logging/issues/917">#917</a>)</li>
<li><a
href="1cc00ecf64"><code>1cc00ec</code></a>
fix(deps): require google-cloud-audit-log &gt;= 0.3.1 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/979">#979</a>)</li>
<li><a
href="42387bf63f"><code>42387bf</code></a>
chore: Update gapic-generator-python to 1.23.6 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/982">#982</a>)</li>
<li><a
href="52cd907bb3"><code>52cd907</code></a>
docs: update README to break infinite redirect loop (<a
href="https://redirect.github.com/googleapis/python-logging/issues/972">#972</a>)</li>
<li><a
href="6757890013"><code>6757890</code></a>
fix: Allow protobuf 6.x (<a
href="https://redirect.github.com/googleapis/python-logging/issues/977">#977</a>)</li>
<li><a
href="40b1a528df"><code>40b1a52</code></a>
chore: remove unused files (<a
href="https://redirect.github.com/googleapis/python-logging/issues/976">#976</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/python-logging/compare/v3.11.4...v3.12.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic` from 2.11.1 to 2.11.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/releases">pydantic's
releases</a>.</em></p>
<blockquote>
<h2>v2.11.4 2025-04-29</h2>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<ul>
<li>Bump <code>mkdocs-llmstxt</code> to v0.2.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11725">#11725</a></li>
</ul>
<h4>Changes</h4>
<ul>
<li>Allow config and bases to be specified together in
<code>create_model()</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11714">#11714</a>.
This change was backported as it was previously possible (although not
meant to be supported)
to provide <code>model_config</code> as a field, which would make it
possible to provide both configuration
and bases.</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Remove generics cache workaround by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11755">#11755</a></li>
<li>Remove coercion of decimal constraints by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11772">#11772</a></li>
<li>Fix crash when expanding root type in the mypy plugin by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11735">#11735</a></li>
<li>Fix issue with recursive generic models by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11775">#11775</a></li>
<li>Traverse <code>function-before</code> schemas during schema
gathering by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11801">#11801</a></li>
</ul>
<h2>v2.11.3 2025-04-08</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Packaging</h3>
<ul>
<li>Update V1 copy to v1.10.21 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11706">pydantic/pydantic#11706</a></li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Preserve field description when rebuilding model fields by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11698">pydantic/pydantic#11698</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.11.2...v2.11.3">https://github.com/pydantic/pydantic/compare/v2.11.2...v2.11.3</a></p>
<h2>v2.11.2 2025-04-03</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Fixes</h3>
<ul>
<li>Bump <code>pydantic-core</code> to v2.33.1 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11678">pydantic/pydantic#11678</a></li>
<li>Make sure <code>__pydantic_private__</code> exists before setting
private attributes by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11666">pydantic/pydantic#11666</a></li>
<li>Do not override <code>FieldInfo._complete</code> when using field
from parent class by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11668">pydantic/pydantic#11668</a></li>
<li>Provide the available definitions when applying discriminated unions
by <a href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11670">pydantic/pydantic#11670</a></li>
<li>Do not expand root type in the mypy plugin for variables by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11676">pydantic/pydantic#11676</a></li>
<li>Mention the attribute name in model fields deprecation message by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11674">pydantic/pydantic#11674</a></li>
<li>Properly validate parameterized mappings by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11658">pydantic/pydantic#11658</a></li>
<li>Prepare release v2.11.2 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11684">pydantic/pydantic#11684</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.11.1...v2.11.2">https://github.com/pydantic/pydantic/compare/v2.11.1...v2.11.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.11.4 (2025-04-29)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.4">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<ul>
<li>Bump <code>mkdocs-llmstxt</code> to v0.2.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11725">#11725</a></li>
</ul>
<h4>Changes</h4>
<ul>
<li>Allow config and bases to be specified together in
<code>create_model()</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11714">#11714</a>.
This change was backported as it was previously possible (although not
meant to be supported)
to provide <code>model_config</code> as a field, which would make it
possible to provide both configuration
and bases.</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Remove generics cache workaround by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11755">#11755</a></li>
<li>Remove coercion of decimal constraints by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11772">#11772</a></li>
<li>Fix crash when expanding root type in the mypy plugin by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11735">#11735</a></li>
<li>Fix issue with recursive generic models by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11775">#11775</a></li>
<li>Traverse <code>function-before</code> schemas during schema
gathering by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11801">#11801</a></li>
</ul>
<h2>v2.11.3 (2025-04-08)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.3">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<ul>
<li>Update V1 copy to v1.10.21 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11706">#11706</a></li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Preserve field description when rebuilding model fields by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11698">#11698</a></li>
</ul>
<h2>v2.11.2 (2025-04-03)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.2">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Bump <code>pydantic-core</code> to v2.33.1 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11678">#11678</a></li>
<li>Make sure <code>__pydantic_private__</code> exists before setting
private attributes by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11666">#11666</a></li>
<li>Do not override <code>FieldInfo._complete</code> when using field
from parent class by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11668">#11668</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d444cd1cf6"><code>d444cd1</code></a>
Prepare release v2.11.4</li>
<li><a
href="828fc48d55"><code>828fc48</code></a>
Add documentation note about common pitfall with the annotated
pattern</li>
<li><a
href="42bf1fd784"><code>42bf1fd</code></a>
Bump <code>pydantic-core</code> to v2.33.2 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11804">#11804</a>)</li>
<li><a
href="7b3f513215"><code>7b3f513</code></a>
Allow config and bases to be specified together in
<code>create_model()</code></li>
<li><a
href="fc521388f2"><code>fc52138</code></a>
Traverse <code>function-before</code> schemas during schema
gathering</li>
<li><a
href="25af78934a"><code>25af789</code></a>
Fix issue with recursive generic models</li>
<li><a
href="91ef6bb39e"><code>91ef6bb</code></a>
Update monthly download count in documentation</li>
<li><a
href="a830775328"><code>a830775</code></a>
Bump <code>mkdocs-llmstxt</code> to v0.2.0</li>
<li><a
href="f5d1c87128"><code>f5d1c87</code></a>
Fix crash when expanding root type in the mypy plugin</li>
<li><a
href="c80bb355d7"><code>c80bb35</code></a>
Remove coercion of decimal constraints</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic/compare/v2.11.1...v2.11.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic-settings` from 2.8.1 to 2.9.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic-settings/releases">pydantic-settings's
releases</a>.</em></p>
<blockquote>
<h2>v2.9.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Drop support for Python 3.8 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/560">pydantic/pydantic-settings#560</a></li>
<li>Switch to <code>typing-inspection</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/556">pydantic/pydantic-settings#556</a></li>
<li>Introduce <code>uv</code> for Project Management by <a
href="https://github.com/KanchiShimono"><code>@​KanchiShimono</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/547">pydantic/pydantic-settings#547</a></li>
<li>Refactor sources.py into a subpackage (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/546">#546</a>)
by <a href="https://github.com/ezwiefel"><code>@​ezwiefel</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/548">pydantic/pydantic-settings#548</a></li>
<li>chore: cleanup by <a
href="https://github.com/CodeWithEmad"><code>@​CodeWithEmad</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/563">pydantic/pydantic-settings#563</a></li>
<li>Fix typo in documentation by <a
href="https://github.com/CodeWithEmad"><code>@​CodeWithEmad</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/564">pydantic/pydantic-settings#564</a></li>
<li>Add support for AWS Secrets Manager by <a
href="https://github.com/mavwolverine"><code>@​mavwolverine</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/532">pydantic/pydantic-settings#532</a></li>
<li>Fix minor typo: conotations =&gt; connotations by <a
href="https://github.com/svenevs"><code>@​svenevs</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/577">pydantic/pydantic-settings#577</a></li>
<li>Azure Key Vault: Don't load disabled secret by <a
href="https://github.com/AndreuCodina"><code>@​AndreuCodina</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/578">pydantic/pydantic-settings#578</a></li>
<li>Add support for GCP Secret Manager by <a
href="https://github.com/ezwiefel"><code>@​ezwiefel</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/567">pydantic/pydantic-settings#567</a></li>
<li>CLI JSON Optional Default by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/581">pydantic/pydantic-settings#581</a></li>
<li>Fix for env nested enum. by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/589">pydantic/pydantic-settings#589</a></li>
<li>CLI submodel suppress. by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/587">pydantic/pydantic-settings#587</a></li>
<li>Cli retrieve unknown args by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/588">pydantic/pydantic-settings#588</a></li>
<li>Update pydantic by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/593">pydantic/pydantic-settings#593</a></li>
<li>Fix check in CI by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/595">pydantic/pydantic-settings#595</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/ezwiefel"><code>@​ezwiefel</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/548">pydantic/pydantic-settings#548</a></li>
<li><a
href="https://github.com/CodeWithEmad"><code>@​CodeWithEmad</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/563">pydantic/pydantic-settings#563</a></li>
<li><a
href="https://github.com/mavwolverine"><code>@​mavwolverine</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/532">pydantic/pydantic-settings#532</a></li>
<li><a href="https://github.com/svenevs"><code>@​svenevs</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/577">pydantic/pydantic-settings#577</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.8.1...v2.9.0">https://github.com/pydantic/pydantic-settings/compare/v2.8.1...v2.9.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1874740923"><code>1874740</code></a>
Prepare release 2.9.1 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/600">#600</a>)</li>
<li><a
href="88e77bc8aa"><code>88e77bc</code></a>
Fix typo in gcp secret manager error message (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/598">#598</a>)</li>
<li><a
href="e973d9afc8"><code>e973d9a</code></a>
fix: Expose ConfigFileSourceMixing on top level
sources/<strong>init</strong>.py (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/597">#597</a>)</li>
<li><a
href="8c0f5f18b0"><code>8c0f5f1</code></a>
Fix check in CI (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/595">#595</a>)</li>
<li><a
href="0ac2312042"><code>0ac2312</code></a>
Prepare release 2.9.0 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/594">#594</a>)</li>
<li><a
href="f3e5ac382c"><code>f3e5ac3</code></a>
Update pydantic (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/593">#593</a>)</li>
<li><a
href="20640b0efe"><code>20640b0</code></a>
Cli retrieve unknown args (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/588">#588</a>)</li>
<li><a
href="ed7fd42bfb"><code>ed7fd42</code></a>
CLI submodel suppress. (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/587">#587</a>)</li>
<li><a
href="e9fb3164eb"><code>e9fb316</code></a>
Fix for env nested enum. (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/589">#589</a>)</li>
<li><a
href="0e9b329c74"><code>0e9b329</code></a>
CLI JSON Optional Default (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/581">#581</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.8.1...v2.9.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.15.0 to 2.15.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.15.1</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.15.0...v2.15.1">2.15.1</a>
(2025-04-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>postgrest:</strong> add missing count, head, and get params
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1098">#1098</a>)
(<a
href="e9c219ebda">e9c219e</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.2 to 2.4.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1112">#1112</a>)
(<a
href="1d429c6555">1d429c6</a>)</li>
<li>remove return type from postgrest methods (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1110">#1110</a>)
(<a
href="6664f42157">6664f42</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.15.0...v2.15.1">2.15.1</a>
(2025-04-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>postgrest:</strong> add missing count, head, and get params
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1098">#1098</a>)
(<a
href="e9c219ebda">e9c219e</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.2 to 2.4.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1112">#1112</a>)
(<a
href="1d429c6555">1d429c6</a>)</li>
<li>remove return type from postgrest methods (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1110">#1110</a>)
(<a
href="6664f42157">6664f42</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9fdf32f36c"><code>9fdf32f</code></a>
chore(main): release 2.15.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1099">#1099</a>)</li>
<li><a
href="1d429c6555"><code>1d429c6</code></a>
fix(realtime): bump realtime from 2.4.2 to 2.4.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1112">#1112</a>)</li>
<li><a
href="b12940429d"><code>b129404</code></a>
chore(deps-dev): bump commitizen from 4.4.1 to 4.6.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1104">#1104</a>)</li>
<li><a
href="ad8f99e4a0"><code>ad8f99e</code></a>
chore(deps-dev): bump pytest-cov from 6.0.0 to 6.1.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1100">#1100</a>)</li>
<li><a
href="6664f42157"><code>6664f42</code></a>
fix: remove return type from postgrest methods (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1110">#1110</a>)</li>
<li><a
href="c0ca1758ba"><code>c0ca175</code></a>
ci: explicit permissions and remove _target (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1102">#1102</a>)</li>
<li><a
href="e9c219ebda"><code>e9c219e</code></a>
fix(postgrest): add missing count, head, and get params (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1098">#1098</a>)</li>
<li><a
href="d5aa9ce4c7"><code>d5aa9ce</code></a>
chore(deps-dev): bump python-dotenv from 1.0.1 to 1.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1085">#1085</a>)</li>
<li><a
href="8ff9ba8e23"><code>8ff9ba8</code></a>
chore(deps-dev): bump pytest-asyncio from 0.25.3 to 0.26.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1084">#1084</a>)</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-py/compare/v2.15.0...v2.15.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-16 09:44:23 +00:00
Emmanuel Ferdman
e5368f3857 fix: Resolve logger.warn(..) deprecration warnings (#9938)
This small PR resolves the deprecation warnings of the `logger` library:
```
DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead
```
2025-05-16 10:56:03 +02:00
Reinier van der Leer
c73c6fe5c3 Merge branch 'master' into dev 2025-05-15 19:28:40 +02:00
Nicholas Tindle
9bef383df2 fix(backend): Make URL pinning work with extra_url_validator (#9940)
Github Blocks use an URL transformer passed to `Requests` to convert web
URLs to the API URLs. This doesn't always work with the anti-SSRF URL
pinning mechanism that was implemented in #8531.

### Changes 🏗️
In `Requests.request(..)`:
- Apply `validate_url` *after* `extra_url_validator`, to prevent
mismatch between `pinned_url` and `original_hostname`
- Simplify logic & add clarifying comments

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Tested the github blocks that had the issue

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-15 13:12:39 +00:00
Chirag Modi
2dc038b6c0 Add Llama API Support (#9899)
The changes in this PR are to add Llama API support.

### Changes 🏗️
We add both backend and frontend support.

**Backend**:
- Add llama_api provider
- Include models supported by Llama API along with configs
- llm_call
- credential store and llama_api_key field in Settings

**Frontend**:
- Llama API as a type
- Credentials input and provider for Llama API
 

### Checklist 📋

#### For code changes:
- [X] I have clearly listed my changes in the PR description
- [X] I have tested my changes according to the test plan:

**Test Plan**:

<details>
  <summary>AI Text Generator</summary>
  
  - [X] Start-up backend and frontend:
- Start backend with Docker services: `docker compose up -d --build`
     - Start frontend: `npm install && npm run dev`
- By visiting http://localhost:3000/, test inference and structured
outputs
  - [X] Create from scratch 
  - [X] Request for Llama API Credentials
  
<img width="2015" alt="image"
src="https://github.com/user-attachments/assets/3dede402-3718-4441-9327-ecab25c63ebf"
/>

  - [X] Execute an agent with at least 3 blocks
 
<img width="2026" alt="image"
src="https://github.com/user-attachments/assets/59d6d56b-2ccc-4af5-b511-4af312c3f7f8"
/>

  - [X] Confirm it executes correctly
</details>

<details>
  <summary>Structured Response Generator</summary>
  
  - [X] Start-up backend and frontend:
- Start backend with Docker services: `docker compose up -d --build`
     - Start frontend: `npm install && npm run dev`
- By visiting http://localhost:3000/, test inference and structured
outputs
  - [X] Create from scratch 
  - [X] Execute an agent 
<img width="2023" alt="image"
src="https://github.com/user-attachments/assets/d1107638-bf1b-45b1-a296-1e0fac29525b"
/>

  - [X] Confirm it executes correctly
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-05-14 19:45:40 +00:00
Krzysztof Czerwinski
cd6deb87c3 fix(frontend): Revert congrats onboarding screen action (#9943)
Revert congrats onboarding screen action of #9916
2025-05-14 19:19:27 +00:00
Zamil Majdy
1999ba38d9 feat(backend): Truncate logging on NotificationManager and LLMBlocks (#9939)
> Log entry with size 865.8K exceeds maximum size of 256.0K

Some logs are just too large.

### Changes 🏗️

Truncate logging on NotificationManager and LLMBlocks

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI
2025-05-14 19:18:59 +00:00
Nicholas Tindle
e8fa996c2f refactor(frontend): Move from remote loaded GTM to local (#9933)
<!-- Clearly explain the need for these changes: -->

As part of a small security review, we found that google won't let you
load with integrity. That seems insane but the general workaround is to
load a static copy of your own

### Changes 🏗️
Moves all the google analytics scripts in house instead of loading via
cdn
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] tested it in a new isolated environment to confirm events still
work as expected everywhere they are used

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-05-14 16:07:40 +00:00
Krzysztof Czerwinski
e22d2c848a feat(frontend): Onboarding Updates 3 (#9916)
A collection of UX update and bug fixes for onboarding and wallet.

### Changes 🏗️

- Show spinner loading indicator when onboarding button is clicked
- Use `getLibraryAgentByStoreListingVersionID` instead of
`addMarketplaceAgentToLibrary` on congrats screen
- Fix `Not enough segments` issue: don't fetch onboarding when user is
logged out
- Minor updates
  - Fill some missing deps in deps arrays
  - `Spinner` component, styles updates
  - Use `useMemo`/`useCallback`
- Show error toast when onboarding agent fails to run:

<img width="405" alt="Screenshot 2025-05-06 at 5 09 01 PM"
src="https://github.com/user-attachments/assets/dd1272da-326a-448d-995d-98ac773b3ee4"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Onboarding can be completed
  - [x] Failing agent shows toast
  - [x] Wallet can be opened and works properly (tasks, confetti)
  - [x] Dependency arrays don't cause infinite loops
2025-05-14 14:29:29 +00:00
Reinier van der Leer
9471fd6b58 fix(frontend): Re-subscribe on WebSocket re-connect (#9935)
- Resolves #9929

### Changes 🏗️

- Implement `BackendAPI.onWebSocketConnect(..)`

- Improve reliability and reactivity of `/library/agents/[id]`:
  - Refresh page data and (re)subscribe and on WebSocket (re)connect
- Break up multi-action hooks into smaller parts to reduce unnecessary
re-renders and requests
  - Reduce duplicate requests

- Use `onWebSocketConnect` in `useAgentGraph` as well

- Tidy up `autogpt-server-api/client.ts` a bit

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]`
  - Run the agent
    - [x] -> UI should update normally with execution updates
- Suspend your computer, or restart the backend (or WS server) to break
the connection
    - DO NOT REFRESH THE TAB ITSELF
- [x] -> On reconnect, page data should be refreshed (check in network
tab of dev tools)
  - Run the agent again
    - [x] -> UI should update normally with execution updates
2025-05-14 00:39:14 +00:00
Krzysztof Czerwinski
c4bbfd5050 feat(frontend): Update login and signup feedback (#9917)
Currently both login and signup page show the same feedback on error on
cloud (join the waitlist).

### Changes 🏗️
Update login&signup feedback for cloud.

- Use cards for login and signup feedback instead of html list
- Make login page show prompt to redirect user to signup

<img width="474" alt="Screenshot 2025-05-07 at 4 01 07 PM"
src="https://github.com/user-attachments/assets/45f189ea-5fea-45bb-89f9-7323418d69ea"
/>
<img width="476" alt="Screenshot 2025-05-07 at 4 03 29 PM"
src="https://github.com/user-attachments/assets/96f4cd7f-f3e6-44b2-b647-96ee98063572"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Signup&login works with correct credentials
  - [x] Signup&login shows correct error message on wrong credentials
  - [x] Links work correctly
2025-05-13 15:57:55 +00:00
Toran Bruce Richards
08639bb1f0 fix(backend): Change library agents fetch sort from version to updatedAt (#9932)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️
This pull request includes a small change to the `get_my_agents`
function in `autogpt_platform/backend/backend/server/v2/store/db.py`.
The change updates the sorting order for retrieving library agents to
use the `updatedAt` field instead of `agentGraphVersion`.

This aligns with the later sorting that is applied to the fetched page
in the frontend.

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-05-13 07:49:55 +00:00
Zamil Majdy
4d99ae27c9 fix(backend): Avoid executor stuck on cleanup waiting execution completion 2025-05-12 22:30:58 +01:00
Zamil Majdy
64ff161323 fix(backend): Avoid executor stuck on cleanup waiting execution completion 2025-05-12 22:29:41 +01:00
Nicholas Tindle
2b5b93a0f7 feat(backend): send emails daily instead of hourly (#9927)
<!-- Clearly explain the need for these changes: -->

John thinks an hourly email is a bit much; I'm inclined to agree.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
swaps the time for dealing the batch for the agent runs from one hour to
one day

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] No testing done
2025-05-12 18:24:14 +00:00
Nicholas Tindle
79cc08787b feat(blocks): initial google calendar (#9920)
We want to add support for reading + writing events for google calendar
so agents can do cool stuff with that!

### Changes 🏗️

* Add support for google calendar blocks

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run manual tests of each block
  - [x] Build and run automatic tests
2025-05-12 18:21:05 +00:00
Reinier van der Leer
b740a6edc0 fix(backend): Unbreak existing Agent Executor nodes (#9928)
- Follow-up fix for #9862

### Changes 🏗️

- Rename the stored `data` input field to `inputs` on all Agent Executor
nodes in the DB

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Dry-run the query in Supabase to verify that the data operation
works
  - [x] CI
2025-05-12 11:41:07 +00:00
Zamil Majdy
c5946927ea Merge branch 'master' of github.com:Significant-Gravitas/AutoGPT into dev 2025-05-10 05:21:04 +01:00
Zamil Majdy
30086357bc Merge branch 'dev' of github.com:Significant-Gravitas/AutoGPT into dev 2025-05-10 05:19:38 +01:00
Zamil Majdy
e090195e57 feat(backend): User notification service to send a system alert 2025-05-10 05:19:22 +01:00
Zamil Majdy
d2bf0af3cd feat(backend): User notification service to send a system alert 2025-05-10 05:13:38 +01:00
Zamil Majdy
4413366ea7 fix(blocks): Fix load_all_blocks in concurrent calls (#9926)
```
2025-05-09 11:54:15,171 ERROR  Error executing graph 954e6fc8-9c90-46fa-be5b-4063eb519ec7: Block ID AIMusicGeneratorBlock error: 44f6c8ad-d75c-4ae1-8209-aad1c0326928 is already in use
```

### Changes 🏗️

This PR avoids the use of global variables messing up with the way
`load_all_blocks` is cached.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-05-09 13:48:15 +00:00
Zamil Majdy
3d05c26f26 fix(backend): Fix walltime & cputime stats on interrupted execution 2025-05-09 14:09:56 +01:00
Zamil Majdy
c736d401a6 fix(backend): Fix walltime & cputime stats on interrupted execution 2025-05-09 14:08:37 +01:00
Zamil Majdy
e8bc83445a feat(backend): Immediate alert on late execution check job failure (#9925)
Currently, there is no guarantee that an error will be reported right
away. And late execution is a serious issue that needs to be addressed
quickly

### Changes 🏗️

Provided a direct alert when late execution occurs.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Manual run on the late executions job on artificially created late
executions.
2025-05-09 07:31:23 +00:00
Zamil Majdy
8de88395f1 fix(backend): Continue stats accounting on aborted or broken executions (#9921)
This is a follow-up to
https://github.com/Significant-Gravitas/AutoGPT/pull/9903

The continued graph execution restarted all the execution stats from
zero, making the execution stats misleading.

### Changes 🏗️

Continue the execution stats when continuing the graph execution.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Existing tests, manual graph run with the graph execution aborted
midway.
2025-05-09 06:46:30 +00:00
Zamil Majdy
82cf0bcde7 refactor(backend): Clear out Notification Service code blockage (#9915)
Some of the code paths in the notification & scheduler service were
synchronous HTTP calls that execute a long-running job that blocks. This
makes the service threads busy waiting.

### Changes 🏗️

* Remove queue_notification API
* Remove DTO
* Move heavy tasks intothe  executor

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Manually executing notification service jobs through the scheduler
API
2025-05-09 06:16:43 +00:00
Krzysztof Czerwinski
089e7aae88 fix(frontend): Catch exception on agent listing page (#9923)
Listing page throws exception on deployment because of supabase auth
issue.

### Changes 🏗️

Catch the exception when getting library agent. This reverts the
behavior of listing page and it'll always show "Add to Library" when
user is logged in.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - [ ] ...
2025-05-08 22:29:40 +00:00
Toran Bruce Richards
74e6a6a43a fix(frontend/library): Quick Patch for Rendering Agent Outputs (#9922)
<!-- Clearly explain the need for these changes: -->
The goal of this change is a quick and temporary tweak to improve the
displaying of output text in the Agent Runs screen.

This change is made anticipating that these outputs will be properly
improved in the near future, and is thus just a temporary change in
order to display text in a human readable format.

### Changes 🏗️
There is one change in this PR:
- The class of the Agent Output textbox is changed to properly display
text without impacting the design.
Below is a before and after of this change:

**Before**

![image](https://github.com/user-attachments/assets/5ecc16c8-8ffd-4cc6-a627-00502848450e)

**After**

![image](https://github.com/user-attachments/assets/5601c2a0-f32f-4c75-afec-d86dc0c5081d)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

---------

Co-authored-by: Bentlybro <Github@bentlybro.com>
2025-05-08 11:41:27 +00:00
Reinier van der Leer
433b76b539 fix(backend/scheduler): Unbreak Scheduler.get_execution_schedules (#9919)
- Resolves #9918
- Follow-up fix for #9914

### Changes 🏗️

- In `get_graph_execution_schedules`, skip jobs when their kwargs can't
be parsed as `GraphExecutionJobArgs`
- Rename methods of `Scheduler` to clarify their scope (scheduled
*graph* executions)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]` (which calls `GET /api/schedules`)
    - [x] -> `GET /api/schedules` request returns HTTP 200
2025-05-08 11:26:51 +00:00
Reinier van der Leer
1ad6c76f9c feat(backend): Require discriminator value on graph save (#9858)
If a node has a multi-credentials input (e.g. AI Text Generator block)
but the discriminator value (e.g. model choice) is missing, the input
can't be discriminated into a single-provider input. Discrimination into
a single-provider input is necessary to make a graph-level credentials
input for use in the Library.

### Changes 🏗️

- feat(backend): Require discriminator fields to always have a value

- dx(frontend): Improve typing of discriminator stuff
- dx(frontend): Fix typing in `NodeOneOfDiscriminatorField` component

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Saving & running graphs with and without credentials works
normally
- Note: We don't have any blocks with a discriminator that doesn't have
a default value, so currently I don't think it's possible to produce a
case where this mechanism would be triggered.
2025-05-08 09:45:22 +00:00
Bently
104928c614 feat(platform): Add captcha to login, signup and password reset pages (#9847)
This PR adds Cloudflare's Turnstile CAPTCHA to the login, signup, and
password reset pages. it is setup to only show and work when behave as
is set to CLOUD so it will not show for local hosted users.

### Changes 🏗️

#### Backend Changes
-
**[backend/server/v2/turnstile/routes.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...bently/secrt-1169-implement-captcha-on-sign-up?expand=1#diff-2c5c2cb13346370fc48bdde8691a0d3bbfc030f7718288101b67b641c7948c10)**:
Created API endpoint at `/api/turnstile/verify` to proxy verification
requests to Cloudflare
-
**[backend/server/v2/turnstile/service.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...bently/secrt-1169-implement-captcha-on-sign-up?expand=1#diff-296991fdc3ea821ae5a568ca96bb89789f2fc7dda7b62f59ef6bcadfaea16e56)**:
Implements service to verify CAPTCHA tokens with Cloudflare using
server-side secret key

#### Frontend Changes
-
**[frontend/src/lib/turnstile.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...bently/secrt-1169-implement-captcha-on-sign-up?expand=1#diff-a698e2718e0f6b0afe1d0c7fda571a7bfcbec6aeacc963c2b3620cc683dc4448)**:
Client-side function to call the backend verification endpoint
-
**[frontend/src/components/auth/Turnstile.tsx](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...bently/secrt-1169-implement-captcha-on-sign-up?expand=1#diff-71a73d58d0ba5e46e5702f2f2599284e72a8fcf6c5d0b5c72e7358570d631aa7)**:
Reusable Turnstile component that renders and manages the CAPTCHA widget
-
**[frontend/src/hooks/useTurnstile.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...bently/secrt-1169-implement-captcha-on-sign-up?expand=1#diff-4a6a9363243ab2a88dbfb498917f464896ada059617bd8b0fb51df532c73827d)**:
Custom hook that manages Turnstile state and conditionally activates
based on environment

#### Auth Flow Integration
- Modified server actions in `login`, `signup`, and `reset_password` to
accept and verify Turnstile tokens
- Updated auth page components to integrate the CAPTCHA widget with form
submissions

### Configuration Changes
- Added two new environment variables:
- `NEXT_PUBLIC_CLOUDFLARE_TURNSTILE_SITE_KEY`: Public site key for
frontend
- `CLOUDFLARE_TURNSTILE_SECRET_KEY`: Secret key for backend verification

### Test Plan 📋
- Ask Bently for the keys to test locally!
- [x] Test login, signup and password reset with Turnstile enabled
(BEHAVE_AS=CLOUD)
- [x] Verify CAPTCHA appears and must be completed before form
submission
  - [x] Verify error message appears if CAPTCHA is not completed
  - [x] Verify form submission works after completing CAPTCHA
- [x] Test login, signup and password reset with Turnstile disabled
(BEHAVE_AS=LOCAL)
  - [x] Verify CAPTCHA does not appear
  - [x] Verify form submission works without CAPTCHA
- [x] Test with invalid site key to ensure proper error handling

---------

Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com>
2025-05-07 21:08:12 +00:00
Reinier van der Leer
0726a00fb7 fix(backend): Include sub-graphs in graph-level credentials support (#9862)
The Library Agent credentials UX (#9789) currently doesn't work for
sub-graphs.

### Changes 🏗️

- Include sub-graphs in generating `Graph.credentials_input_schema`
- Propagate `node_credentials_input_map` into `AgentExecutionBlock`
executions
- Fix: also apply `node_credentials_input_map` in `_enqueue_next_nodes`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Import a graph with sub-graphs that need credentials
  - Run this agent from the Library
  - [x] -> Should work
2025-05-07 17:28:39 +00:00
Zamil Majdy
ac8ef9bdb2 feat(backend): Introduce late execution check scheduled job (#9914)
Introduce a late execution check scheduled job. The late threshold
duration is configurable.
This initial version only reports the error to Sentry.

### Changes 🏗️

* Added late execution check scheduled job
* Move the registration weekly notification processing job out of API
call and calling it directly from the scheduler service.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Manual firing of scheduled job through an exposed API
2025-05-07 05:00:37 +00:00
Zamil Majdy
519ad94ec9 Merge branch 'master' of github.com:Significant-Gravitas/AutoGPT into dev 2025-05-06 20:30:36 +07:00
Nicholas Tindle
505320fcd3 feat(backend): Move Scheduler (#9904)
<!-- Clearly explain the need for these changes: -->
We want the scheduler shouldn't scale with the rest API lol

### Changes 🏗️
pulls out the scheduler into its own service
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] test it

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-05-05 18:59:28 +00:00
Krzysztof Czerwinski
6f1578239a feat(platform): Update Marketplace Agent listing buttons (#9843)
Currently agent listing on Marketplace have bad UX.

### Changes 🏗️

- Add function and endpoint to check if user has `LibraryAgent` by given
`storeListingVersionId`
- Redesign listing buttons
- `Add to library` shown when user is logged in and doesn't have an
agent in library
  - `See runs` shown when user logged in as has the agent in the library
  - `Download agent` always shown
  - Disabled buttons during processing (adding/downloading)
- Stop raising when owner is trying to add own agent. Now it'll simply
redirect to Library.
- Remove button appearing/flickering after a delay on listing page -
logged in status is now checked in server component.
- Show error toast on adding/redirecting to library and downloading
error
- Update breadcrumbs and page title to say `Marketplace` instead of
`Store`
- `font-geist` -> `font-sans` (`font-geist` var doesn't exist)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Button on a listing is `Add to library` (no library agent)
  - [x] Agent can be added and user is redirected
- [x] Button on the listing is `See runs` and clicking it redirects to
the library agent
  - [x] Remove agent from library
  - [x] Buttons shows `Add to library` again
  - [x] Agent can be re-added
  - [x] Agent can be downloaded
  - [x] `Add to library` Button is hidden when user is logged out

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-05-05 16:47:58 +00:00
Zamil Majdy
79319ad1a7 fix(backend): Avoid broken process pool by not failing process initializer (#9907)
Process initializer on the process pool should never fail, but we do
network-related stuff there.
This cause the pool to be in a broken state.

### Changes 🏗️

Remove the health check step on process initializer.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI test
2025-05-05 13:27:04 +00:00
Nicholas Tindle
afb66f75ec fix: disable google sheets in prod based on oauth review (#9906)
<!-- Clearly explain the need for these changes: -->

Our oauth review wants us to drop this in favor of a diff scope that
will require additional work

### Changes 🏗️
Disables the oauth sheets scopes in prod

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] set env locally
2025-05-02 19:40:51 +00:00
Krzysztof Czerwinski
59ec61ef98 feat(platform): Onboarding design&UX update (#9905)
A collection of updates regarding onboarding and wallet.

### Changes 🏗️

- `try-except` instead of `if` when rewarding (skip unnecessary db call)
- Make external services question onboarding step optional
- Add `SmartImage` component to lazy load images with pulse animation
and use it throughout onboarding
- Use store agent name instead of graph graph name (run page)
- Fix some images breaking layout on the agent card (run page)
- Center agent card vertically and horizontally (center on the left half
of page) (run page)
- Delay and tweak confetti when opening wallet and when task finished
(wallet)
- Flash wallet when credits change value
- Make tutorial video grayscale on completed steps (wallet)
- Fix confetti triggering on page refresh (wallet)
- Redirect to agent run page instead of Library after onboarding
- Expand task groups by default (wallet) - this means tutorial videos
are visible by default

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Services step is optional and skipping it doesn't break onboarding
  - [x] `SmartImage` works properly
  - [x] Agent card is aligned properly, including on page scroll
  - [x] Wallet flash when credits value change
  - [x] User is redirected to the agent runs page after onboarding
2025-05-02 14:42:01 +00:00
Zamil Majdy
d7077b5161 feat(backend): Continue instead of retrying aborted/broken agent execution (#9903)
Currently, the agent/graph execution engine is consuming the execution
queue and acknowledges the message after fully completing its execution
or failing it.

However, in the case of the agent executor failing due to a
hardware/resource issue, or the executor did not manage to acknowledge
the execution message. Another agent executor will pick it up and start
the execution again from the beginning.

The scope of this PR is to make the next executor pick up the next work
to continue the pre-existing execution instead of starting it all over
from the beginning.

### Changes 🏗️

* Removed `start_node_execs` from `GraphExecutionEntry`
* Populate the starting graph node from the DB query instead (fetching
Running & Queued node executions).
* Removed `get_incomplete_node_executions` from DB manager.
* Use get_node_executions with a status filter instead.
* Allow graph execution to end in non-FAILED/COMPLETED status, e.g, when
the executor is interrupted, it should be stuck in the running status,
and let other executors continue the task.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Run an agent, stop the executor midway, re-reun the executor, the
execution should be continued instead of restarted.
2025-05-01 16:02:03 +00:00
Zamil Majdy
475c5a5cc3 fix(backend): Avoid executing any agent with zero balance (#9901)
### Changes 🏗️

* Avoid executing any agent with a zero balance.
* Make node execution count global across agents for a single user.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Run agents by tweaking the `execution_cost_count_threshold` &
`execution_cost_per_threshold` values.
2025-05-01 15:11:38 +00:00
Zamil Majdy
f5a07f1a35 hotfix(backend): Avoid executing any agent with zero balance (#9902)
### Changes 🏗️

* Avoid executing any agent with a zero balance.
* Make node execution count global across agents for a single user.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Run agents by tweaking the `execution_cost_count_threshold` &
`execution_cost_per_threshold` values.
2025-05-01 10:11:09 -05:00
Zamil Majdy
86d5cfe60b feat(backend): Support flexible RPC client (#9842)
Using sync code in the async route often introduces a blocking
event-loop code that impacts stability.

The current RPC system only provides a synchronous client to call the
service endpoints.
The scope of this PR is to provide an entirely decoupled signature
between client and server, allowing the client can mix & match async &
sync options on the client code while not changing the async/sync nature
of the server.

### Changes 🏗️

* Add support for flexible async/sync RPC client.
* Migrate scheduler client to all-async client.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Scheduler route test.
  - [x] Modified service_test.py
  - [x] Run normal agent executions
2025-05-01 04:38:06 +00:00
Bently
602f887623 feat(frontend): fix admin add dollars (#9898)
Fixes the admin add dollars, in the ``add-money-button.tsx`` file, in
the handleApproveSubmit action it was trying to use formatCredits for
the value which is wrong, this fix changes it

```diff
 <form action={handleApproveSubmit}>
   <input type="hidden" name="id" value={userId} />
   <input
     type="hidden"
     name="amount"
-    value={formatCredits(Number(dollarAmount))}
+    value={Math.round(parseFloat(dollarAmount) * 100)}
   />
```
i was able to add $1, $0.10 and $0.01

![image](https://github.com/user-attachments/assets/3a3126c2-5f17-4c9b-8657-4372332a0ea3)
2025-04-30 17:24:26 +00:00
Bentlybro
1edde778c5 Merge branch 'master' into dev 2025-04-30 16:46:50 +01:00
Zamil Majdy
3526986f98 fix(backend): Failing test on a new Pydantic version (#9897)
```
FAILED test/model_test.py::test_agent_preset_from_db - pydantic_core._pydantic_core.ValidationError: 1 validation error for AgentNodeExecutionInputOutput

E       pydantic_core._pydantic_core.ValidationError: 1 validation error for AgentNodeExecutionInputOutput
E       data
E         JSON input should be string, bytes or bytearray [type=json_type, input_value=Json, input_type=Json]
E           For further information visit https://errors.pydantic.dev/2.11/v/json_type
```

### Changes 🏗️

Manually creating a Prisma model often breaks, and we have such an
instance in the test.
This PR fixes the test to make the new Pydantic happy.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] CI
2025-04-30 13:59:17 +00:00
Nicholas Tindle
04c4340ee3 feat(frontend,backend): user spending admin dashboard (#9751)
<!-- Clearly explain the need for these changes: -->
We need a way to refund people who spend money on agents wihout making
manual db actions

### Changes 🏗️
- Adds a bunch for refunding users
- Adds reasons and admin id for actions
- Add admin to db manager
- Add UI for this for the admin panel
- Clean up pagination controls
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test by importing dev db as baseline
- [x] Add transactions on top for "refund", and make sure all existing
transactions work

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-29 17:39:25 +00:00
Zamil Majdy
9fa62c03f6 feat(backend): Improve cancel execution reliability (#9889)
When an executor dies, an ongoing execution will not be retried and will
just stuck in the running status.
This change avoids such a scenario by allowing an execution of an entry
that is not in QUEUED status with the low-probability risk of double
execution.

### Changes 🏗️

* Allow non-QUEUED status to be re-executed.
* Improve cleanup of node & graph executor.
* Make a cancellation request consumption a separate thread to avoid
being blocked by other messages.
* Remove unused retry loop on the execution manager.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Run agent, kill the server, re-run it, agent restarted.
2025-04-29 17:06:03 +00:00
Mareddy Lohith Reddy
d5dc687484 fix: handle empty 204 responses in SendWebRequestBlock (#9887)
<!-- Clearly explain the need for these changes: -->
This PR fixes [Issue
#9883](https://github.com/Significant-Gravitas/AutoGPT/issues/9883),
where the SendWebRequestBlock crashes when receiving a 204 No Content
response, such as when posting to a Discord webhook. The fix ensures
that empty responses are handled gracefully, and the block does not
crash.

### Changes 🏗️
- Added a check to handle empty HTTP responses (like 204 status) in
SendWebRequestBlock
- Fallback to empty string or None if there is no response content
- Prevents server errors when parsing non-existent response bodies

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Send a POST request to an endpoint that returns 204 No Content
  - [x]  Confirm that SendWebRequestBlock handles it without crashing
  - [x] Confirm that regular 200 OK JSON responses still work

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
Co-authored-by: Lohith-11 <lohithr011@gamil.com>
Co-authored-by: Toran Bruce Richards <toran.richards@gmail.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-28 19:16:04 +00:00
Japh
fb5ce0a16d Add Note to "Getting Started" page for Raspberry Pi 5 page size issue (#9888)
Add Note to "Getting Started" page for Raspberry Pi 5 page size issue
with `supabase-vector` that prevents `docker compose up` from running
successfully.

<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

- Added a Note to the "Getting Started" page that explains a change in
Raspberry Pi OS for Raspberry Pi 5s, and how to revert the change to
avoid an issue running the backend on Docker.

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] No code changes

#### For configuration changes:
- [x] No configuration changes

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-28 19:07:44 +00:00
Nicholas Tindle
a1f17ca797 fix: use subheading for agent info not description (#9891)
<!-- Clearly explain the need for these changes: -->
we oopsed and used the wrong attribute for short desc
### Changes 🏗️
Uses sub heading instead now
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] check the expected text shows
2025-04-28 18:38:43 +00:00
Nicholas Tindle
8fdfd75cc4 feat: allow admins to download agents for review (#9881)
<!-- Clearly explain the need for these changes: -->
for admins to approve agents for the marketplace, we need to be able to
run them. this is a quick workaround for downloading them so you can put
them in your marketplace to check

### Changes 🏗️
- clones various endpoints related to downloading into an admin side
with logging, and admin checks
- adds download button and removes open in builder action
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] Test downloading agents from local marketplace
2025-04-28 17:58:23 +00:00
Abhimanyu Yadav
5b5b2043e8 fix(frontend): Add support to optional multiselect (#9885)
- fix #9882 

we’re currently using optional multi select, and it’s working great.
We’re able to correctly determine the data type for it. However, there’s
a small issue. We’re not using the correct subSchema that is inside
anyOf on the multi select input. This is why we’re getting the problem
on the Twitter block. It’s the only one that’s using this type of input,
so it’s the only one that’s affected.

![Screenshot 2025-04-26 at 5 39
51 PM](https://github.com/user-attachments/assets/834d64d8-84dc-4dbd-a03a-df03172ecee5)

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-28 15:18:29 +00:00
Nicholas Tindle
7d83f1db05 feat(block): bring back PrintConsoleBlock (#9850)
### Changes 🏗️

Bring back PrintConsoleBlock

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Print console block

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-28 09:55:57 +00:00
Zamil Majdy
f07696e3c1 fix(backend): Fix top-up with zero transaction flow (#9886)
The transaction with zero payment amount will not generate a payment ID,
so the checkout failed for this scenario.

### Changes 🏗️

Don't use payment id as transaction key on top-up with zero payment
amount.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Top-up with stripe coupon
2025-04-27 14:22:08 +00:00
Zamil Majdy
96a173a85f fix(backend): Avoid releasing lock that is no longer owned by the current thread (#9878)
There are instances of node executions that were failed and end up stuck
in the RUNNING status due to the execution failed to release the lock:
```
2025-04-24 20:53:31,573 INFO  [ExecutionManager|uid:25eba2d1-e9c1-44bc-88c7-43e0f4fbad5a|gid:01f8c315-c163-4dd1-a8a0-d396477c5a9f|nid:f8bf84ae-b1f0-4434-8f04-80f43852bc30]|geid:2e1b35c6-0d2f-4e97-adea-f6fe0d9965d0|neid:590b29ea-63ee-4e24-a429-de5a3e191e72|-] Failed node execution 590b29ea-63ee-4e24-a429-de5a3e191e72: Cannot release a lock that's no longer owned
```

### Changes 🏗️

Check the ownership of the lock before releasing.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI tests.

(cherry picked from commit ef022720d5)
2025-04-25 23:55:18 +07:00
sentry-autofix[bot]
9715ea5313 fix: handle token limits and estimate token count for llm calls (#9880)
👋 Hi there! This PR was automatically generated by Autofix 🤖

This fix was triggered by Toran Bruce Richards.

Fixes
[AUTOGPT-SERVER-1ZY](https://sentry.io/organizations/significant-gravitas/issues/6386687527/).
The issue was that: `llm_call` calculates `max_tokens` without
considering `input_tokens`, causing OpenRouter API errors when the
context window is exceeded.

- Implements a function `estimate_token_count` to estimate the number of
tokens in a list of messages.
- Calculates available tokens based on the context window, estimated
input tokens, and user-defined max tokens.
- Adjusts `max_tokens` for LLM calls to prevent exceeding context window
limits.
- Reduces `max_tokens` by 15% and retries if a token limit error is
encountered during LLM calls.

If you have any questions or feedback for the Sentry team about this
fix, please email [autofix@sentry.io](mailto:autofix@sentry.io) with the
Run ID: 32838.

---------

Co-authored-by: sentry-autofix[bot] <157164994+sentry-autofix[bot]@users.noreply.github.com>
Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-04-25 13:45:47 +00:00
Zamil Majdy
ef022720d5 fix(backend): Avoid releasing lock that is no longer owned by the current thread (#9878)
There are instances of node executions that were failed and end up stuck
in the RUNNING status due to the execution failed to release the lock:
```
2025-04-24 20:53:31,573 INFO  [ExecutionManager|uid:25eba2d1-e9c1-44bc-88c7-43e0f4fbad5a|gid:01f8c315-c163-4dd1-a8a0-d396477c5a9f|nid:f8bf84ae-b1f0-4434-8f04-80f43852bc30]|geid:2e1b35c6-0d2f-4e97-adea-f6fe0d9965d0|neid:590b29ea-63ee-4e24-a429-de5a3e191e72|-] Failed node execution 590b29ea-63ee-4e24-a429-de5a3e191e72: Cannot release a lock that's no longer owned
```

### Changes 🏗️

Check the ownership of the lock before releasing.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI tests.
2025-04-25 07:39:10 +00:00
Zamil Majdy
4ddb206f86 feat(frontend): Add billing page toggle (#9877)
### Changes 🏗️

Provide a system toggle for disabling the billing page:
NEXT_PUBLIC_SHOW_BILLING_PAGE

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Toggle `NEXT_PUBLIC_SHOW_BILLING_PAGE` value.
2025-04-24 19:33:20 +00:00
Zamil Majdy
91f34966c8 fix(block): Fix Smart Decision Block missing input beads & incompability with input in special characters (#9875)
Smart Decision Block was not able to work with sub agent with custom
name input & the bead were not properly propagated in the execution UI.
The scope of this PR is fixing it.

### Changes 🏗️

* Introduce an easy to parse format of tool edge:
`{tool}_^_{func}_~_{arg}`. Graph using SmartDecisionBlock needs to be
re-saved before execution to work.
* Reduce cluttering on a smart decision block logic.
* Fix beads not being shown for a smart decision block tool calling.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Execute an SDM with some special character input as a tool

<img width="672" alt="image"
src="https://github.com/user-attachments/assets/873556b3-c16a-4dd1-ad84-bc86c636c406"
/>
2025-04-24 19:24:41 +00:00
Krzysztof Czerwinski
11a69170b5 feat(frontend): Update "Edit a copy" modal and buttons (#9876)
Update "Edit a copy" modal text when copying marketplace agent in
Library. Update agent action buttons to reflect the design accurately.

### Changes 🏗️

- Update modal text
- Disable copying owned agents (only marketplace allowed)
- `Open in Builder` -> `Customize agent`
- Disabled `Customize agent` instead of hiding
- Change `Delete agent` to non-destructive design

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - [ ] ...
2025-04-24 16:30:43 +00:00
Krzysztof Czerwinski
0675a41e42 fix(backend): Strip secrets, credentials when forking agent (#9874)
Strip secrets, credentials when forking agent

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - [ ] ...
2025-04-24 15:09:41 +00:00
Bentlybro
56ce1a0c1c Merge branch 'master' into dev 2025-04-24 14:21:34 +01:00
Zamil Majdy
7fbe135ec8 feat(backend): Expose execution prometheus metrics (#9866)
Currently, we have no visibility on the state of the execution manager,
the scope of this PR is to open up the observability of it by exposing
Prometheus metrics.

### Changes 🏗️

Re-use the execution manager port to expose the Prometheus metrics.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Hit /metrics on 8002 port
2025-04-24 07:48:38 +00:00
Zamil Majdy
eb6a0b34e1 feat(backend): Use forkserver on process creation if possible (#9864)
### Changes 🏗️

Set process starting mode to forkserver instead of spawn, if possible,
for performance benefits.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Existing tests
2025-04-24 07:36:36 +00:00
Zamil Majdy
1e3236a041 feat(backend): Add retry on executor process initialization (#9865)
Executor process initialization can fail and cause this error:
```
concurrent.futures.process.BrokenProcessPool: A child process terminated abruptly, the process pool is not usable anymore
```

### Changes 🏗️

Add retry to reduce the chance of the initialization error to happen.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Existing tests
2025-04-23 21:24:17 +00:00
Krzysztof Czerwinski
160a622ba4 feat(platform): Forking agent in Library (#9870)
This PR introduces copying agents feature in the Library. Users can copy
and download their library agents but they can edit only the ones they
own (included copied ones).

### Changes 🏗️

- DB migration: add relation in `AgentGraph`: `forked_from_id` and
`forked_from_version`
- Add `fork_graph` function that makes a hardcopy of agent graph and its
nodes (all with new ids)
- Add `fork_library_agent` that copies library agent and its graph for a
user
- Add endpoint `/library/agents/{libraryAgentId}/fork`
- Add UI to `library/agents/[id]/page.tsx`: `Edit a copy` button with
dialog confirmation

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Agent can be copied, edited and runs
2025-04-23 16:28:42 +00:00
Toran Bruce Richards
e2a226dc49 Update repo-close-stale-issues.yml 2025-04-23 14:51:18 +01:00
Zamil Majdy
5047e99fd1 fix(frontend): Hide Google Maps Key ID filter (#9861)
### Changes 🏗️


![image](https://github.com/user-attachments/assets/d6b9f971-d914-4ff1-9319-a903707a2c72)

Hide Google Maps system id key on the frontend UI.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan
2025-04-22 16:50:05 +00:00
Krzysztof Czerwinski
c80d357149 feat(frontend): Use route groups (#9855)
Navbar sometimes disappears outside `/onboarding`.

### Changes 🏗️

This PR solves the problem of disappearing Navbar outside `/onboarding`
by introducing `app/(platform)` route group.

- Move all routes requiring Navbar to `app/(platform)`
- Move `<Navbar>` to `app/(platform)/layout.tsx`
- Move `/onboarding` to `app/(no-navbar/`
- Remove pathname injection to header from middleware and stop relying
on it to hide the navbar

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Common routes work properly
2025-04-22 09:10:12 +00:00
Zamil Majdy
20d39f6d44 fix(platform): Fix Google Maps API Key setting through env (#9848)
Setting the Google Maps API through the API has never worked on the
platform.

### Changes 🏗️

Set the default api key from the environment variable.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test GoogleMapsBlock
2025-04-22 03:00:47 +07:00
Bently
d5b82c01e0 feat(backend): Adds latest llm models (#9856)
This PR adds the following models:
OpenAI's O3: https://platform.openai.com/docs/models/o3
OpenAI's GPT 4.1: https://platform.openai.com/docs/models/gpt-4.1
Anthropics Claude 3.7: https://www.anthropic.com/news/claude-3-7-sonnet
Googles gemini 2.5 pro:
https://openrouter.ai/google/gemini-2.5-pro-preview-03-25
2025-04-21 19:26:21 +00:00
Abhimanyu Yadav
69b8d96516 fix(library/run): Replace credits to cents (#9845)
Replacing credits with cents (100 credits = 1$).

I haven’t touched anything internally, just changed the UI.

Everything is working great.

On the frontend, there’s no other place where we use credits instead of
dollars.

![Screenshot 2025-04-19 at 11 36
00 AM](https://github.com/user-attachments/assets/de799b5c-094e-4c96-a7da-273ce60b2125)
<img width="1503" alt="Screenshot 2025-04-19 at 11 33 24 AM"
src="https://github.com/user-attachments/assets/87d7e218-f8f5-4e2e-92ef-70c81735db6b"
/>
2025-04-21 12:31:48 +00:00
Krzysztof Czerwinski
67af77e179 fix((backend): Fix migrate llm models in existing agents (#9810)
https://github.com/Significant-Gravitas/AutoGPT/pull/9452 was throwing
`operator does not exist: text ? unknown` on deployed dev and so the
function call was commented as a hotfix.
This PR fixes and re-enables the llm model migration function.

### Changes 🏗️

- Uncomment and fix `migrate_llm_models` function

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Migrate nodes with non-existing models
  - [x] Don't migrate nodes without any model or with correct models

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-19 12:52:36 +00:00
Abhimanyu Yadav
2a92970a5f fix(marketplace/library): Removing white borders from Avatar (#9818)
There are some white borders around the avatar in the store card, but
they are not present in the design, so I'm removing them.

![Screenshot 2025-04-15 at 3 58
05 PM](https://github.com/user-attachments/assets/f8c98076-9cc3-46f1-b4f3-41d4e48f6127)
2025-04-19 05:36:36 +00:00
Zamil Majdy
9052ee7b95 fix(backend): Clear RabbitMQ connection cache on execution-manager retry 2025-04-19 07:50:04 +02:00
Zamil Majdy
c783f64b33 fix(backend): Handle add execution API request failure (#9838)
There are cases where the publishing agent execution is failing, making
the agent execution appear to be stuck in a queue, but the execution has
never been in a queue in the first place.

### Changes 🏗️

On publishing failure, we set the graph & starting node execution status
to FAILED and let the UI bubble up the error so the user can try again.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Normal add execution flow
2025-04-18 18:35:43 +00:00
Zamil Majdy
055a231aed feat(backend): Add retry mechanism for pika publish_message (#9839)
For unknown reason publishing message can fail sometimes due to the
connection being broken:
MessageQueue suddenly unavailable, connection simply broke, connection
being reset, etc.

### Changes 🏗️

Adding a tenacity retry on AMQP or ConnectionError, which hopefully can
alleviate the issue.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Simple add execution
2025-04-18 17:56:27 +00:00
Reinier van der Leer
417d7732af feat(platform/library): Add credentials UX on /library/agents/[id] (#9789)
- Resolves #9771
- ... in a non-persistent way, so it won't work for webhook-triggered
agents
    For webhooks: #9541

### Changes 🏗️

Frontend:
- Add credentials inputs in Library "New run" screen (based on
`graph.credentials_input_schema`)
- Refactor `CredentialsInput` and `useCredentials` to not rely on XYFlow
context

- Unsplit lists of saved credentials in `CredentialsProvider` state

- Move logic that was being executed at component render to `useEffect`
hooks in `CredentialsInput`

Backend:
- Implement logic to aggregate credentials input requirements to one per
provider per graph
- Add `BaseGraph.credentials_input_schema` (JSON schema) computed field
    Underlying added logic:
- `BaseGraph._credentials_input_schema` - makes a `BlockSchema` from a
graph's aggregated credentials inputs
- `BaseGraph.aggregate_credentials_inputs()` - aggregates a graph's
nodes' credentials inputs using `CredentialsFieldInfo.combine(..)`
- `BlockSchema.get_credentials_fields_info() -> dict[str,
CredentialsFieldInfo]`
- `CredentialsFieldInfo` model (created from
`_CredentialsFieldSchemaExtra`)

- Implement logic to inject explicitly passed credentials into graph
execution
  - Add `credentials_inputs` parameter to `execute_graph` endpoint
- Add `graph_credentials_input` parameter to
`.executor.utils.add_graph_execution(..)`
  - Implement `.executor.utils.make_node_credentials_input_map(..)`
  - Amend `.executor.utils.construct_node_execution_input`
  - Add `GraphExecutionEntry.node_credentials_input_map` attribute
  - Amend validation to allow injecting credentials
    - Amend `GraphModel._validate_graph(..)`
    - Amend `.executor.utils._validate_node_input_credentials`
- Add `node_credentials_map` parameter to
`ExecutionManager.add_execution(..)`
    - Amend execution validation to handle side-loaded credentials
    - Add `GraphExecutionEntry.node_execution_map` attribute
- Add mechanism to inject passed credentials into node execution data
- Add credentials injection mechanism to node execution queueing logic
in `Executor._on_graph_execution(..)`

- Replace boilerplate logic in `v1.execute_graph` endpoint with call to
existing `.executor.utils.add_graph_execution(..)`
- Replace calls to `.server.routers.v1.execute_graph` with
`add_graph_execution`

Also:
- Address tech debt in `GraphModel._validate_gaph(..)`
- Fix type checking in `BaseGraph._generate_schema(..)`

#### TODO
- [ ] ~~Make "Run again" work with credentials in
`AgentRunDetailsView`~~
- [ ] Prohibit saving a graph if it has nodes with missing discriminator
value for discriminated credentials inputs

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...
2025-04-18 14:27:13 +00:00
Krzysztof Czerwinski
f16a398a8e feat(frontend): Update completed task group design in Wallet (#9820)
This redesigns how the task group is displayed when finished for both
expanded and folded state.

### Changes 🏗️

- Folded state now displays `Done` badge and hides tasks
- Expanded state shows only task names and hides details and video

Screenshot:
1. Expanded unfinished group
2. Expanded finished group
3. Folded finished group

<img width="463" alt="Screenshot 2025-04-15 at 2 05 31 PM"
src="https://github.com/user-attachments/assets/40152073-fc0e-47c2-9fd4-a6b0161280e6"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Finished group displays correctly
  - [x] Unfinished group displays correctly
2025-04-18 09:45:35 +00:00
Krzysztof Czerwinski
e8bbd945f2 feat(frontend): Wallet top-up and auto-refill (#9819)
### Changes 🏗️

- Add top-up and auto-refill tabs in the Wallet
- Add shadcn `tabs` component
- Disable increase/decrease spinner buttons on number inputs across
Platform (moved css from `customnode.css` to `globals.css`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Incorrect values are detected properly
  - [x] Top-up works
  - [x] Setting auto-refill works
2025-04-18 09:44:54 +00:00
Krzysztof Czerwinski
d1730d7b1d fix(frontend): Fix onboarding agent execution (#9822)
Onboarding executes original agent graph directly without waiting for
marketplace agent to be added to user library.

### Changes 🏗️

- Execute library agent after it's already added to library

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Onboarding agent executes properly
2025-04-18 09:36:40 +00:00
Krzysztof Czerwinski
8ea64327a1 fix(backend): Fix array types in database (#9828)
Array fields in `schema.prisma` are non-nullable, but generated
migrations don’t add `NOT NULL` constraints. This causes existing rows
to get `NULL` values when new array columns are added, breaking schema
expectations and leading to bugs.

### Changes 🏗️

- Backfill all `NULL` rows on non-nullable array columns to empty arrays
- Set `NOT NULL` constraint on all array columns

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Existing `NULL` rows are properly backfilled
  - [x] Existing arrays are not set to default empty arrays
  - [x] Affected columns became non-nullable in the db
2025-04-18 07:43:54 +00:00
Bently
3cf30c22fb update(docs): Remove outdated submodule command from docs (#9836)
### Changes 🏗️

Updates to the setup docs to remove the old unneeded ``git submodule
update --init --recursive --progress`` command + some other small tweaks
around it
2025-04-17 16:45:07 +00:00
Reinier van der Leer
05c670eef9 fix(frontend/library): Prevent execution updates mixing between library agents (#9835)
If the websocket doesn't disconnect when the user switches to viewing a
different agent, they aren't unsubscribed. If execution updates *from a
different agent* are adopted into the page state, that can cause
crashes.

### Changes 🏗️

- Filter incoming execution updates by `graph_id`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
- Go to an agent and initiate a run that will take a while (long enough
to navigate to a different agent)
  - Navigate: Library -> [another agent]
- [ ] Runs from the first agent don't show up in the runs list of the
other agent
2025-04-17 14:11:09 +00:00
Zamil Majdy
f6a4b036c7 fix(block): Disable LLM blocks parallel tool calls (#9834)
SmartDecisionBlock sometimes tried to be smart by calling multiple tool
calls and our platform does not support this yet.

### Changes 🏗️

Disable parallel tool calls for OpenAI & OpenRouter LLM provider LLM
blocks.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Tested SmartDecisionBlock & AITextGeneratorBlock
2025-04-17 12:58:05 +00:00
Zamil Majdy
c43924cd4e feat(backend): Add RabbitMQ connection cleanup on executor shutdown hook 2025-04-17 01:28:15 +02:00
Zamil Majdy
e3846c22bd fix(backend): Avoid multithreaded pika access (#9832)
### Changes 🏗️

Avoid other threads accessing the channel within the same process.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Manual agent runs
2025-04-16 22:06:07 +00:00
Toran Bruce Richards
9a7a838418 fix(backend): Change node output logging type from info to debug (#9831)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️
This PR simply changes the logging type from info to debug of node
outputs in the agent.py file.
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Bentlybro <Github@bentlybro.com>
2025-04-16 20:45:51 +00:00
Toran Bruce Richards
d61d815208 fix(logging): Change node data logging to debug level from info (#9830)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️
This change simply changes the logging level of node inputs and outputs
to debug level. This change is needed because currently logging all node
data causes logs that are too large for the logger to prevent nodes from
running.

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-04-16 19:22:52 +00:00
Zamil Majdy
44e3770003 fix(backend): Fix execution manager message consuming pattern (#9829)
We have seen instances where the executor gets stuck in a failing
message-consuming loop due to the upstream RabbitMQ being down. The
current message-consuming pattern is not optimal for handling this.

### Changes 🏗️

* Add a retry limit to the execution loop limit.
* Use `basic_consume` instead of `basic_get` for handling message
consumption.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agents cancel them
2025-04-16 22:54:26 +07:00
Zamil Majdy
c0ee71fb27 fix(frontend/builder): Fix key-value pair input for any non-string types (#9826)
- Resolves #9823 

The key-value pairs input, like those used in CreateDictionaryBlock, are
assumed to be either a numeric or a string type.
When it has `any` type, it was randomly assumed to be a numeric type. 

### Changes 🏗️

Only convert to number when it's explicitly defined to do so on
key-value pair input.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Tried two different key-value pair input: AiTextGenerator &
CreateDictionary
2025-04-16 11:10:50 +00:00
Zamil Majdy
71cdc18674 fix(backend): Fix cancel_execution can only work once (#9825)
### Changes 🏗️

The recent change to the execution cancelation fix turns out to only
work on the first request.
This PR change fixes it by reworking how the thread_cached work on async
functions.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Cancel agent executions multiple times
2025-04-16 10:33:49 +00:00
Zamil Majdy
dc9348ec26 fix(frontend): Fix Input value mixup on Library page (#9821)
### Changes 🏗️

Fix this broken behaviors:
Input data mix-up caused by running two different executions of the same
agent with the same input.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agent with old user
- [x] Running two different executions of the same agent with the same
input.
2025-04-16 09:31:07 +00:00
Zamil Majdy
3ccbc31705 Revert: fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:28:43 +02:00
Zamil Majdy
7cf0c6fe46 fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:25:25 +02:00
Zamil Majdy
c69faa2a94 fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:24:39 +02:00
Nicholas Tindle
0c9dbbbe24 Merge branch 'master' into dev 2025-04-15 12:00:02 -05:00
Nicholas Tindle
3e0742f9c5 Spike/infra pooling (#9812)
<!-- Clearly explain the need for these changes: -->
Swap to pooling supabase connections rather than depending on x number
of max open connections

### Changes 🏗️
Adds direct connect URL to be used throughout the system
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test thoroughly all of the endpoints in the dev env with switched
infra matching pr
  - [x] Follow the new release plan tests
  - [x] Follow the old release plan tests

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>configuration changes</summary>

- Change how we connect to the database to use direct when configured
and database URL when not
  - update prisma for this
  - have default matching database and default
</details>
2025-04-15 15:40:15 +00:00
Krzysztof Czerwinski
d791cdea76 feat(platform): Onboarding Phase 2 (#9736)
### Changes 🏗️

- Update onboarding to give user rewards for completing steps
- Remove `canvas-confetti` lib and add `party-js` instead; the former
didn't allow to play confetti from a component
- Add onboarding videos in `frontend/public/onboarding/`
- Remove Balance (`CreditsCard.tsx`) and add openable `Wallet.tsx` (and
accompanying `WalletTaskGroup.tsx`) instead that displays grouped
onboarding tasks with descriptions and short instructional videos
- Further relevant updates to `useOnboarding`, `types.ts`
- Implement onboarding rewards
- Add `onboarding_reward` function in `credit.py` that is used to reward
user for finished onboarding tasks safely - transaction key is
deterministic, so the same user won't be rewarded twice for the same
step.
  - Add `reward_user` in `onboarding.py`
- Update `UserOnboarding` model and add a migration

<img width="464" alt="Screenshot 2025-04-05 at 6 06 29 PM"
src="https://github.com/user-attachments/assets/fca8d09e-0139-466b-b679-d24117ad01f0"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Onboarding works
  - [x] Tasks can be completed
  - [x] Rewards are added correctly for all completed tasks
2025-04-12 10:56:59 +00:00
Zamil Majdy
bb92226f5d feat(backend): Remove RPC service from Agent Executor (#9804)
Currently the execution task is not properly distributed between
executors because we need to send the execution request to the execution
server.

The execution manager now accepts the execution request from the message
queue. Thus, we can remove the synchronous RPC system from this service,
let the system focus on executing the agent, and not spare any process
for the HTTP API interface.

This will also reduce the risk of the execution service being too busy
and not able to accept any add execution requests.

### Changes 🏗️

* Remove the RPC system in Agent Executor
* Allow the cancellation of the execution that is still waiting in the
queue (by avoiding it from being executed).
* Make a unified helper for adding an execution request to the system
and move other execution-related helper functions into
`executor/utils.py`.
* Remove non-db connections (redis / rabbitmq) in Database Manager and
let the client manage this by themselves.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Existing CI, some agent runs
2025-04-11 19:03:47 +00:00
Zamil Majdy
f7ca5ac1ba feat(backend/executor): Move execution queue + cancel mechanism to RabbitMQ (#9759)
The graph execution queue is not disk-persisted; when the executor dies,
the executions are lost.

The scope of this issue is migrating the execution queue from an
inter-process queue to a RabbitMQ message queue. A sync client should be
used for this.

- Resolves #9746
- Resolves #9714

### Changes 🏗️

Move the execution manager from multiprocess.Queue into persisted
Rabbit-MQ.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Execute agents.

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-04-11 14:15:39 +00:00
Abhimanyu Yadav
4621a95bf3 fix(marketplace): Fix small UI bugs (#9800)
Resolving the bugs listed below
- #9796 
- #9797 
- #9798 
- #8998 
- #9799 

### Changes I have made 
- Removed border and set border-radius to `24px` in FeaturedCard
- Removed `white` background from breadcrumbs
- Changed distance between featured section arrow from `28px` to `12px`
- Added `1.5rem` spacing and changed color to `gray-200` on the
creator’s page separator
- Removed focus ring from the Search Library input
- And some small UI changes on marketplace

### Screenshots

<img width="658" alt="Screenshot 2025-04-10 at 3 26 56 PM"
src="https://github.com/user-attachments/assets/22bef6f0-19b9-42a6-8227-fedca33141ba"
/>

<img width="505" alt="Screenshot 2025-04-10 at 3 27 07 PM"
src="https://github.com/user-attachments/assets/2a5409a1-94c6-4d15-a35d-e4ed9b075055"
/>

<img width="1373" alt="Screenshot 2025-04-10 at 3 28 39 PM"
src="https://github.com/user-attachments/assets/046ea726-2a98-4000-abc8-9139fffe80dc"
/>

<img width="368" alt="Screenshot 2025-04-10 at 3 29 07 PM"
src="https://github.com/user-attachments/assets/4e0510ad-f535-4760-a703-651766ff522b"
/>
2025-04-11 13:09:35 +00:00
Abhimanyu Yadav
8d8a6e450f fix(marketplace): Render newline in marketplace description text (#9808)
- fix #9177 

Add `whitespace-pre-line` tailwind property to allow newline rendering
in marketplace description text

### Before

![Screenshot 2025-04-11 at 10 32
23 AM](https://github.com/user-attachments/assets/b07f58b6-218e-4b33-a018-93757e59cd8d)

### After

![Screenshot 2025-04-11 at 10 32
59 AM](https://github.com/user-attachments/assets/f1086ee4-aef3-491a-ba81-cf681086f67b)
2025-04-11 10:50:32 +00:00
Reinier van der Leer
8ea3bfabc4 fix(backend/db): Fix unchecked Prisma statements (#9805) 2025-04-10 23:04:42 +02:00
Nicholas Tindle
cda07e81d1 feat(frontend, backend): track sentry environment on frontend + sentry init in app services (#9773)
<!-- Clearly explain the need for these changes: -->
We want to be able to filter errors according to where they occur in
sentry so we need to track and include that data. We also are not
logging everything from app services correctly so fix that up

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds env tracking for frontend
- adds sentry init in app service spawn

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested by running and making sure all events + logs are inserted
into sentry correctly
2025-04-10 16:28:07 +01:00
Abhimanyu Yadav
6156fbb731 fix(marketplace): Fixing margins between headers, divider and content (#9757)
- fix #9003 
- fix - #8969 
- fix #8970 

Adding correct margins in between headers, divider and content.

### Changes made

- Remove any vertical padding or margin from the section.
- Add top and bottom margins to the separator, so the spacing between
sections is handled only by the separator.
- Also, add a size prop in AvatarFallback because its size is currently
broken. It’s not able to extract the size properly from the className.
2025-04-10 16:28:01 +01:00
Nicholas Tindle
2ca18d77a4 feat(frontend, backend): track sentry environment on frontend + sentry init in app services (#9773)
<!-- Clearly explain the need for these changes: -->
We want to be able to filter errors according to where they occur in
sentry so we need to track and include that data. We also are not
logging everything from app services correctly so fix that up

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds env tracking for frontend
- adds sentry init in app service spawn

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested by running and making sure all events + logs are inserted
into sentry correctly
2025-04-10 14:34:26 +00:00
Abhimanyu Yadav
3e6d9bf963 fix(marketplace): Fixing margins between headers, divider and content (#9757)
- fix #9003 
- fix - #8969 
- fix #8970 

Adding correct margins in between headers, divider and content.

### Changes made

- Remove any vertical padding or margin from the section.
- Add top and bottom margins to the separator, so the spacing between
sections is handled only by the separator.
- Also, add a size prop in AvatarFallback because its size is currently
broken. It’s not able to extract the size properly from the className.
2025-04-10 13:04:16 +00:00
Abhimanyu Yadav
07a09d802c fix(marketplace): Fix store card style (#9769)
- fix #9222 
- fix #9221 
- fix #8966

### Changes made
- Standardized the height of store cards.
- Corrected spacing and responsiveness behavior.
- Removed horizontal margin and max-width from the featured section.
- Fixed the aspect ratio of the agent image in the store card.
- Now, a normal desktop screen displays 3 columns of agents instead of
4.

<img width="1512" alt="Screenshot 2025-04-07 at 7 09 40 AM"
src="https://github.com/user-attachments/assets/50d3b5c9-4e7c-456e-b5f1-7c0093509bd3"
/>
2025-04-10 12:01:42 +01:00
Reinier van der Leer
353396110c refactor(backend): Clean up Library & Store DB schema (#9774)
Distilled from #9541 to reduce the scope of that PR.

- Part of #9307

-  Blocks #9786
  -  Blocks #9541

### Changes 🏗️

- Fix `LibraryAgent` schema (for #9786)
- Fix relationships between `LibraryAgent`, `AgentGraph`, and
`AgentPreset`
  - Impose uniqueness constraint on `LibraryAgent`

- Rename things that are called `agent` that actually refer to a
`graph`/`agentGraph`
- Fix singular/plural forms in DB schema
- Simplify reference names of closely related objects (e.g.
`AgentGraph.AgentGraphExecutions` -> `AgentGraph.Executions`)

- Eliminate use of `# type: ignore` in DB statements
  - Add `typed` and `typed_cast` utilities to `backend.util.type`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] CI static type checking (with all risky `# type: ignore` removed)
  - [x] Check that column references in views are updated
2025-04-10 10:40:25 +00:00
Abhimanyu Yadav
70890dee43 fix(marketplace): Fix store card style (#9769)
- fix #9222 
- fix #9221 
- fix #8966

### Changes made
- Standardized the height of store cards.
- Corrected spacing and responsiveness behavior.
- Removed horizontal margin and max-width from the featured section.
- Fixed the aspect ratio of the agent image in the store card.
- Now, a normal desktop screen displays 3 columns of agents instead of
4.

<img width="1512" alt="Screenshot 2025-04-07 at 7 09 40 AM"
src="https://github.com/user-attachments/assets/50d3b5c9-4e7c-456e-b5f1-7c0093509bd3"
/>
2025-04-10 10:31:14 +00:00
Nicholas Tindle
62361ccc48 feat: deep copy the schema (#9794)
<!-- Clearly explain the need for these changes: -->
We were duplicating placeholder values across all agents 😨 

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
Deep copies the schema instead

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the broken agent in dev
2025-04-09 21:32:50 +00:00
Reinier van der Leer
755a80c87a fix(blocks): Fix block I/O value sharing (#9793)
- Resolves #9792

### Changes 🏗️

- Replace all `default=[]` -> `default_factory=list`
- Replace all `default={}` -> `default_factory=dict`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] CI

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-04-09 19:15:41 +00:00
Bentlybro
2a6676a5b8 Merge branch 'master' into dev 2025-04-09 14:49:09 +01:00
Reinier van der Leer
5a83b233f8 fix(backend): Add required method cleanup to MainApp
The absence of this method caused type checking errors.
2025-04-09 13:09:21 +02:00
Reinier van der Leer
cb1a3703ad fix(ci): Fix linter exit code on failure (#9777)
The linter currently exits with exit code 0 even if linting fails. This
makes the CI linter permissive which isn't good.

Changes:
- Make linter exit with an error code if a linting step fails
- Fix existing formatting issues
2025-04-09 11:30:04 +02:00
Bently
91f62c47f9 feat(backend): Add new llama 4 maverick & scout models (#9788)
This PR is to add the new [Meta: Llama 4
Maverick](https://openrouter.ai/meta-llama/llama-4-maverick) and [Meta:
Llama 4 Scout](https://openrouter.ai/meta-llama/llama-4-scout) models
via [OpenRouter](https://openrouter.ai/)


### Changes 🏗️

Added the model names to ``llm.py``
```
    META_LLAMA_4_SCOUT = "meta-llama/llama-4-scout"
    META_LLAMA_4_MAVERICK = "meta-llama/llama-4-maverick"
```
and the modela metadata
```
    LlmModel.META_LLAMA_4_SCOUT: ModelMetadata("open_router", 131072, 131072),
    LlmModel.META_LLAMA_4_MAVERICK: ModelMetadata("open_router", 1048576, 1000000),
```

and i have added the model price to ``block_cost_config.py``
```
    LlmModel.META_LLAMA_4_SCOUT: 1,
    LlmModel.META_LLAMA_4_MAVERICK: 1,
```

### Checklist 📋

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Open the build page and place a ai text block, open the model
select and scroll to the bottom and select either of the 2 models
  - [x] test them with a prompt and wait for a reply!
2025-04-08 21:59:53 +00:00
Zamil Majdy
7fedb5e2fd refactor(backend): Un-share resource initializations from AppService + Remove Pyro (#9750)
This is a prerequisite infra change for
https://github.com/Significant-Gravitas/AutoGPT/issues/9714.

We will need a service where we can maintain our own client (db, redis,
rabbitmq, be it async/sync) and configure our own cadence of
initialization and cleanup.

While refactoring the service.py, an option to use Pyro as an RPC
protocol is also removed.

### Changes 🏗️

* Decouple resource initialization and cleanup from the parent
AppService logic.
* Removed Pyro.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-04-08 19:47:22 +00:00
Nicholas Tindle
d316ed23d4 [Snyk] Security upgrade next from 14.2.25 to 14.2.26 (#9767)
![snyk-top-banner](https://res.cloudinary.com/snyk/image/upload/r-d/scm-platform/snyk-pull-requests/pr-banner-default.svg)

### Snyk has created this PR to fix 1 vulnerabilities in the yarn
dependencies of this project.

#### Snyk changed the following file(s):

- `autogpt_platform/frontend/package.json`
- `autogpt_platform/frontend/yarn.lock`


#### Note for
[zero-installs](https://yarnpkg.com/features/zero-installs) users

If you are using the Yarn feature
[zero-installs](https://yarnpkg.com/features/zero-installs) that was
introduced in Yarn V2, note that this PR does not update the
`.yarn/cache/` directory meaning this code cannot be pulled and
immediately developed on as one would expect for a zero-install project
- you will need to run `yarn` to update the contents of the
`./yarn/cache` directory.
If you are not using zero-install you can ignore this as your flow
should likely be unchanged.




#### Vulnerabilities that will be fixed with an upgrade:

|  | Issue | Score | 

:-------------------------:|:-------------------------|:-------------------------
![medium
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/m.png
'medium severity') | Information Exposure
<br/>[SNYK-JS-NEXT-9634163](https://snyk.io/vuln/SNYK-JS-NEXT-9634163) |
&nbsp;&nbsp;**601**&nbsp;&nbsp;




---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - Max score is 1000. Note that the real score may have changed since
the PR was raised.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs._

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI5MzYyNGJiZC1jMTE3LTQ3NDYtOGFlOC1hYjIyMGE4OGI4M2UiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjkzNjI0YmJkLWMxMTctNDc0Ni04YWU4LWFiMjIwYTg4YjgzZSJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)
📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=github&utm_content=fix-pr-template)
🛠 [Adjust project
settings](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)
📚 [Read about Snyk's upgrade
logic](https://docs.snyk.io/scan-with-snyk/snyk-open-source/manage-vulnerabilities/upgrade-package-versions-to-fix-vulnerabilities?utm_source=github&utm_content=fix-pr-template)

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Learn about vulnerability in an interactive lesson of Snyk
Learn.](https://learn.snyk.io/?loc&#x3D;fix-pr)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"next","from":"14.2.25","to":"14.2.26"}],"env":"prod","issuesToFix":["SNYK-JS-NEXT-9634163"],"prId":"93624bbd-c117-4746-8ae8-ab220a88b83e","prPublicId":"93624bbd-c117-4746-8ae8-ab220a88b83e","packageManager":"yarn","priorityScoreList":[601],"projectPublicId":"3d924968-0cf3-4767-9609-501fa4962856","projectUrl":"https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source=github&utm_medium=referral&page=fix-pr","prType":"fix","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":["updated-fix-title","priorityScore"],"type":"auto","upgrade":["SNYK-JS-NEXT-9634163"],"vulns":["SNYK-JS-NEXT-9634163"],"patch":[],"isBreakingChange":false,"remediationStrategy":"vuln"}'

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
Co-authored-by: snyk-bot <snyk-bot@snyk.io>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-07 17:15:50 +00:00
Nicholas Tindle
3c14861d8e fix(backend): reduce log level for retrying connection (#9765)
<!-- Clearly explain the need for these changes: -->
Now that we are trying to use Sentry more, cleaning up some errors ->
warnings is a good idea

### Changes 🏗️
- reduces log level of retry to warning
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] check it comes through in sentry
2025-04-07 17:00:18 +00:00
Nicholas Tindle
074a00ce86 fix(backend): ProviderName behavior when loading secrets (#9764)
<!-- Clearly explain the need for these changes: -->
We got this error in
sentry:[AUTOGPT-SERVER-33P](https://significant-gravitas.sentry.io/issues/6462614597/events/bb4871d796b04e759ade55197498cff9/)
```
Level: Error
'Secrets' object has no attribute 'ProviderName.GOOGLE_client_id'
```

### Changes 🏗️
- Follows pattern used when accessing these in
`_get_provider_oauth_handler` in the router
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test to make sure getting works
2025-04-07 16:59:48 +00:00
Krzysztof Czerwinski
0aeaaa7801 fix(frontend): Fill defaults from schema to hardcodedValues in CustomNode.tsx (#9772)
Fix https://github.com/Significant-Gravitas/AutoGPT/pull/9632

### Changes 🏗️

- Set default values from input schema to `hardcodedValues` in
`CustomNode.tsx`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Default values are correctly applied to newly created node
2025-04-07 16:53:57 +00:00
Abhimanyu Yadav
2e5a770f35 fix(marketplace): Fix typography of heading in marketplace (#9737)
- fix #8956

### Changes:
- Updated line height from 28px to 36px for improved readability.
- Ensured that all section headings (“Featured agents”, “Top agents”,
“Featured creators”, and “Become a creator”) now have a uniform style.
- Verified that font-poppins is correctly set in the Tailwind config
file and layout.tsx.
- Color changed from #282828 to #262626

### Scope:
- This PR only includes typography-related adjustments.

![Screenshot 2025-04-02 at 5 29
05 PM](https://github.com/user-attachments/assets/e27b0d52-d8c7-4921-ae18-e3f75264e74d)
2025-04-07 10:28:28 +00:00
Abhimanyu Yadav
8b2265c996 feat(frontend): Add advanced block search with relevance ranking (#9711)
- fix #9425 

- Enhancing the functionality of searching blocks on the build page

Currently, it only performs exact matching on the block name and
description. I added a scoring mechanism for searching.

- The scoring algorithm works as follows:
     - Returns 1 if no query (all blocks match equally)
     - Normalized query for case-insensitive matching
- Returns 3 for exact substring matches in block name (highest priority)
- Returns 2 when all query words appear in the block name (regardless of
order)
- Returns 1.X for blocks with names similar to query using Jaro-Winkler
distance (X is similarity score)
- Returns 0.5 when all query words appear in the block description
(lowest priority)
     - Returns 0 for no match

Higher scores will appear first in search results.

> I have used an external library for Jaro-Winkler distance -
[link](https://www.npmjs.com/package/jaro-winkler)

Before
![Screenshot 2025-03-28 at 12 09
24 PM](https://github.com/user-attachments/assets/e135c007-cd9a-4692-88fc-3ad42b097c22)

After
![Screenshot 2025-03-28 at 12 09
17 PM](https://github.com/user-attachments/assets/28cd01c1-0d8e-44fa-8e04-ba9796118ba3)
2025-04-07 08:54:00 +00:00
Krzysztof Czerwinski
73d43312d1 feat(frontend): Use TypeBasedInput for onboarding agent input (#9762)
### Changes 🏗️

- Use the same code as in Library to display inputs for onboarding agent
- Fixes bug that crashes frontend when showing onboarding inputs
- Remove no longer needed `OnboardingAgentInput` component

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] All input types display correctly
  - [x] Onboarding agent runs

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-04 16:54:58 +00:00
Zamil Majdy
3771a0924c fix(backend): Update deprecated code caused by upgrades (#9758)
This series of upgrades:
https://github.com/significant-gravitas/autogpt/pull/9727
https://github.com/Significant-Gravitas/AutoGPT/pull/9728
https://github.com/Significant-Gravitas/AutoGPT/pull/9560

Caused some code in the repo being deprecated, this PR addresses those.

### Changes 🏗️

Fix pydantic config, usage of field, usage of proper prisma
`CreateInput` type, pytest loop-scope.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] CI, manual test on running some agents.

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-04 16:34:40 +00:00
Nicholas Tindle
4397746a87 feat(backend): baseline sentry logging (#9756)
<!-- Clearly explain the need for these changes: -->
Sentry just released logs so lets enrich our details there too

### Changes 🏗️
- Adds sentry logging
- Adds dependencies tracking all of our sentry integrations
- Adds environment tracking to sentry
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested to make sure events show up in sentry with the correct
environment logging
2025-04-04 15:31:52 +00:00
Nicholas Tindle
2e871b0761 fix(frontend): bad handling on error prompts (#9754)
<!-- Clearly explain the need for these changes: -->

I oopsed and had an extra unneeded parameter (as @majdyz pointed out)
and wasn't respected everywhere it was used.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Remove parameter
- update all the places AuthFeedback is called

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] Test all pages with authfeedback on it

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 22:16:39 +00:00
Reinier van der Leer
8ceb03ce1a feat(frontend/library): Add "Open in builder" run action (#9755)
- Resolves #9730

### Changes 🏗️

- feat: Add "Open in builder" run action

- refactor: Add `ActionButtonGroup` to replace boilerplate code in
`AgentRunDetailsView`, `AgentRunDraftView`, `AgentScheduleDetailsView`
  - feat: Add link support to `ActionButtonGroup`, `ButtonAction`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]`
    - [x] "Run again" button works
    - [x] "Open in builder" button-link works
2025-04-03 21:34:33 +00:00
Bently
ce98925d58 update(docs): Remove out dated tutorial video from docs & readme (#9753)
This is to remove the out dated tutorial video from docs & readme and
add a direct link to the docs in the readme

### Changes 🏗️

Remove video link from readme.md
Remove video link from
https://github.com/Significant-Gravitas/AutoGPT/blob/dev/docs/content/platform/getting-started.md
Add direct link to docs in readme.me
2025-04-03 19:16:54 +00:00
Reinier van der Leer
1fc984f7fd feat(platform/library): Add real-time "Steps" count to agent run view (#9740)
- Resolves #9731

### Changes 🏗️

- feat: Add "Steps" showing `node_execution_count` to agent run view
  - Add `GraphExecutionMeta.stats.node_exec_count` attribute

- feat(backend/executor): Send graph execution update after *every* node
execution (instead of only I/O node executions)
  - Update graph execution stats after every node execution

- refactor: Move `GraphExecutionMeta` stats into sub-object
(`cost`, `duration`, `total_run_time` -> `stats.cost`, `stats.duration`,
`stats.node_exec_time`)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - View an agent run with 1+ steps on `/library/agents/[id]`
    - [x] "Info" section layout doesn't break
    - [x] Number of steps is shown
  - Initiate a new agent run
    - [x] "Steps" increments in real time during execution
2025-04-03 18:58:21 +00:00
Madura Herath
d0d610720c docs(platform): Add WSL 2 recommendation for Docker on Windows (#9749)
In this pull request, the following changes have been made in response
to Issue #9190:

Documentation Changes:

- Added a note to the AutoGPT documentation regarding Docker
installation on Windows.

- Specifically, the note advises users to opt for WSL2 (Windows
Subsystem for Linux version 2) instead of Hyper-V during Docker setup to
prevent issues with Supabase, such as the "unhealthy" status for
supabase-db.

---------

Co-authored-by: Madura Herath <madurah@verdentra.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 18:35:07 +00:00
Reinier van der Leer
77a44b1213 fix(platform/library): Fix UX for webhook-triggered runs (#9680)
- Resolves #9679

### Changes 🏗️

Frontend:
- Fix crash on `payload` graph input
- Fix crash on object type agent I/O values
- Hide "+ New run" if `graph.webhook_id` is set

Backend:
- Add computed field `webhook_id` to `GraphModel`
  - Add computed property `webhook_input_node` to `GraphModel`
- Refactor:
  - Move `Node.webhook_id` -> `NodeModel.webhook_id`
  - Move `NodeModel.block` -> `Node.block` (computed property)
  - Replace `get_block(node.block_id)` with `node.block` where sensible

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create and run a simple graph
  - [x] Create a graph with a webhook trigger and ensure it works
- [x] Check out the runs of a webhook-triggered graph and ensure the
page works
2025-04-03 17:31:02 +00:00
Nicholas Tindle
7179f9cea0 feat(backend, libs): Tell uvicorn to use our logger + always log to stdout+stderr (#9742)
<!-- Clearly explain the need for these changes: -->

Uvicorn and our logs were ending up in different places, this pr enures
uvicorn using our logging config, not their own.

### Changes 🏗️
- Clears uvicorn's loggers for rest, ws
- always log to stdout,stderr and additionally log to gcp is appropriate
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test all possible variants of the log cloud vs not and ensure that
uvicorn logs show up in the same place that rest of the system logs do
for all

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-03 16:42:20 +00:00
Reinier van der Leer
698af4e16a refactor(frontend): Clean up graph import & export logic (#9717)
- Resolves #9716
- Builds on the work done in #9627

### Changes 🏗️

- Remove `safeCopyGraph`; export directly from backend instead
- Explicitly name sanitization functions for *importing* graphs; move to
`@/lib/autogpt-server-api/utils`
- Amend `BackendAPI.getGraph(..)` to delete `.user_id` if `for_export ==
true`

Out-of-scope improvements:
- Add missing `user_id` to frontend `Graph` types
- Add `UserID` branded type for `User.id` + all `user_id` properties

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block, a
block that uses credentials, and a webhook trigger
  - Go to `/monitoring` and click the agent you just created
    - [x] -> "Export" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [x] -> Exported file contains no user IDs
      - [x] -> Exported file contains no webhook IDs
2025-04-03 16:17:25 +00:00
Abhimanyu Yadav
7085d88b2c fix(marketplace): Add 58px bottom padding to creator page agents section on large screens (#9738)
- fix #9000 

Currently, we have a 32px bottom padding on the Creator’s page on larger
screen. I have added an extra 58px to make it 90px.
2025-04-03 16:03:50 +00:00
Abhimanyu Yadav
4a82edb0c3 fix(marketplace): Fix margin between divider and section on creators page (#9744)
- fix #8998 

Replace padding with margin top and update UI spacing from 32px to 25px
2025-04-03 16:02:03 +00:00
Abhimanyu Yadav
0fc423fd55 fix(marketplace): Fix margin between arrows and carousel (#9745)
- fix #8958 

Currently, the arrow button and carousel have a 16px margin, and the
button is placed 12px below the top of the container. This makes the
spacing appear to be 28px. Therefore, place the button and indicator at
the top of the container.
2025-04-03 16:01:27 +00:00
Abhimanyu Yadav
adb3263211 fix(marketplace): Reduce margin between search bar and chips to 20px (#9748)
- fix #8955 

Reduce the margin between the search bar and chips from 24px to 20px.
2025-04-03 16:00:28 +00:00
Abhimanyu Yadav
3b5feb2c25 fix(marketplace): Fix store card typography (#9739)
- fix #8965 

### Changes Made:
- **Title**: Increased line height from 20px to 32px.
- **Creator Name:**
   - Changed font to Geist Sans.
   - Updated font size to 20px and leading to 28px.
- **Description**: Applied Geist Sans font.
- **Stats Line:** Applied Geist Sans font.
   - Font Configuration Fix:

> Previously, we were using font-gist, which is not defined in the
tailwind config file, hence Updated to use font-sans instead.

I have also fixed the height and width of the profile picture in the
creator card in this PR. The issue is linked below:
- #9314

![Screenshot 2025-04-02 at 6 32
10 PM](https://github.com/user-attachments/assets/1c2d9779-0a5e-4269-b3d2-37526a0949d3)

The margin is perfectly set to 24px; only the height and width of the
image need to be changed.

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 15:55:20 +00:00
Nicholas Tindle
6f3da1b7d0 refactor(backend): move the router files for postmark to not the v2 folder (#9597)
<!-- Clearly explain the need for these changes: -->
One of the pull request review notes from when these were first made is
that they don't belong in the v2 folder. This pr fixes where they are.

### Changes 🏗️
- Moves from v2 to routers for the postmark tooling
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Check that linting and tests pass

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-03 15:52:22 +00:00
Nicholas Tindle
6b7c8d5234 fix(backend): handle notification service errors more elegently (#9734)
<!-- Clearly explain the need for these changes: -->
We have logged 272k timeout errors in the past week from the event loop.
Don't raise those as errors.

Also along the way for diagnosing this we found that some items were
inserted into batches with incomplete datasets so handle that too.

### Changes 🏗️
- Handle timeout errors explicitly 
- Add better messaging for other error types
- Add filtering for queueing bad mezsaging
- add filtering for reading bad batches
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Pull dev db
  - [x] Test new code to check stability + error reduction

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-03 14:57:06 +00:00
Reinier van der Leer
8e912a016f fix(ci/backend): Use Poetry version from lockfile (#9729)
Currently, our CI always uses the latest version of Poetry. This causes
issues with the lockfile check whenever a new Poetry version is
released, especially if that new version has different lockfile
generation behavior.

This new mechanism determines the Poetry version to use as follows:
- Get Poetry version from backend/poetry.lock in the current branch
- Get Poetry version from backend/poetry.lock on the base branch
- Use the newest version out of the two found versions

This way, we don't automatically update to new Poetry versions, but it
is still possible to update to newer versions through pull requests.
2025-04-03 12:43:10 +00:00
Reinier van der Leer
824da5e58c rename autogpt_platform license file 2025-04-03 14:10:44 +02:00
Zamil Majdy
378f49a2d9 fix(frontend): Fix toggle input label & time picker margin 2025-04-03 15:46:51 +04:00
Zamil Majdy
ad303d69d1 fix(frontend): Add border on opened select input-button 2025-04-03 11:44:08 +04:00
Zamil Majdy
200e5814b3 fix(backend): Cleanup service on service closure (#9735)
The cleanup command was only called on SIGTERM, making it possible for
the service to close without being cleaned. Risking the connection not
being proactively closed when the service is unused.

### Changes 🏗️

Call the cleanup command on the service finally block.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run the service, stop it, see the log is printed (locally)
2025-04-02 04:21:40 +00:00
Nicholas Tindle
d879df062e feat(blocks): add a generic webhook block (#9584)
<!-- Clearly explain the need for these changes: -->
I want to be able to insert data into the graph as a webhook from
various services without making a provider specific webhook for things
like discord, slack, uptime bots, etc.

### Changes 🏗️
- Adds a generic webhook block that others can use
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the endpoint that is generated with a graph, making sure to
pass data and consts to it
2025-04-02 03:22:59 +00:00
dependabot[bot]
6e595e6e28 chore(frontend/deps): bump @sentry/nextjs from 8.54.0 to 9.6.0 in /autogpt_platform/frontend (#9646)
Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript)
from 8.54.0 to 9.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/releases"><code>@​sentry/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>9.6.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(tanstackstart): Add
<code>@sentry/tanstackstart-react</code> package and make
<code>@sentry/tanstackstart</code> package a utility package (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15629">#15629</a>)</strong></p>
<p>Since TanStack Start is supposed to be a generic framework that
supports libraries like React and Solid, the
<code>@sentry/tanstackstart</code> SDK package was renamed to
<code>@sentry/tanstackstart-react</code> to reflect that the SDK is
specifically intended to be used for React TanStack Start applications.
Note that the TanStack Start SDK is still in alpha status and may be
subject to breaking changes in non-major package updates.</p>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(astro): Accept all vite-plugin options (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15638">#15638</a>)</li>
<li>feat(deps): bump <code>@​sentry/webpack-plugin</code> from 3.2.1 to
3.2.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15627">#15627</a>)</li>
<li>feat(tanstackstart): Refine initial API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15574">#15574</a>)</li>
<li>fix(core): Ensure <code>fill</code> only patches functions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15632">#15632</a>)</li>
<li>fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15701">#15701</a>)</li>
<li>fix(remix): Null-check <code>options</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15610">#15610</a>)</li>
<li>fix(sveltekit): Correctly parse angle bracket type assertions for
auto instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15578">#15578</a>)</li>
<li>fix(sveltekit): Guard process variable (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15605">#15605</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/angelikatyborska"><code>@​angelikatyborska</code></a>
and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.15 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> - with treeshaking flags</td>
<td>22.94 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing)</td>
<td>36.21 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay)</td>
<td>73.39 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay) - with
treeshaking flags</td>
<td>66.8 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay with
Canvas)</td>
<td>78.01 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay, Feedback)</td>
<td>90.57 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Feedback)</td>
<td>40.3 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. sendFeedback)</td>
<td>27.79 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. FeedbackAsync)</td>
<td>32.58 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code></td>
<td>24.97 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code> (incl. Tracing)</td>
<td>38.1 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code></td>
<td>27.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code> (incl. Tracing)</td>
<td>37.9 KB</td>
</tr>
<tr>
<td><code>@​sentry/svelte</code></td>
<td>23.18 KB</td>
</tr>
<tr>
<td>CDN Bundle</td>
<td>24.36 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing)</td>
<td>36.26 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay)</td>
<td>71.27 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback)</td>
<td>76.45 KB</td>
</tr>
<tr>
<td>CDN Bundle - uncompressed</td>
<td>71.19 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing) - uncompressed</td>
<td>107.57 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay) - uncompressed</td>
<td>218.84 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed</td>
<td>231.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/nextjs</code> (client)</td>
<td>39.27 KB</td>
</tr>
<tr>
<td><code>@​sentry/sveltekit</code> (client)</td>
<td>36.63 KB</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/blob/9.6.0/CHANGELOG.md"><code>@​sentry/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>9.6.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(tanstackstart): Add
<code>@sentry/tanstackstart-react</code> package and make
<code>@sentry/tanstackstart</code> package a utility package (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15629">#15629</a>)</strong></p>
<p>Since TanStack Start is supposed to be a generic framework that
supports libraries like React and Solid, the
<code>@sentry/tanstackstart</code> SDK package was renamed to
<code>@sentry/tanstackstart-react</code> to reflect that the SDK is
specifically intended to be used for React TanStack Start applications.
Note that the TanStack Start SDK is still in alpha status and may be
subject to breaking changes in non-major package updates.</p>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(astro): Accept all vite-plugin options (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15638">#15638</a>)</li>
<li>feat(deps): bump <code>@​sentry/webpack-plugin</code> from 3.2.1 to
3.2.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15627">#15627</a>)</li>
<li>feat(tanstackstart): Refine initial API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15574">#15574</a>)</li>
<li>fix(core): Ensure <code>fill</code> only patches functions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15632">#15632</a>)</li>
<li>fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15701">#15701</a>)</li>
<li>fix(remix): Null-check <code>options</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15610">#15610</a>)</li>
<li>fix(sveltekit): Correctly parse angle bracket type assertions for
auto instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15578">#15578</a>)</li>
<li>fix(sveltekit): Guard process variable (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15605">#15605</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/angelikatyborska"><code>@​angelikatyborska</code></a>
and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>9.5.0</h2>
<h3>Important Changes</h3>
<p>We found some issues with the new feedback screenshot annotation
where screenshots are not being generated properly. Due to this issue,
we are reverting the feature.</p>
<ul>
<li>Revert &quot;feat(feedback) Allowing annotation via highlighting
&amp; masking (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15484">#15484</a>)&quot;
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15609">#15609</a>)</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>Add cloudflare adapter detection and path generation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15603">#15603</a>)</li>
<li>deps(nextjs): Bump rollup to <code>4.34.9</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15589">#15589</a>)</li>
<li>feat(bun): Automatically add performance integrations (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15586">#15586</a>)</li>
<li>feat(replay): Bump rrweb to 2.34.0 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15580">#15580</a>)</li>
<li>fix(browser): Call original function on early return from patched
history API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15576">#15576</a>)</li>
<li>fix(nestjs): Copy metadata in custom decorators (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15598">#15598</a>)</li>
<li>fix(react-router): Fix config type import (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15583">#15583</a>)</li>
<li>fix(remix): Use correct types export for
<code>@sentry/remix/cloudflare</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15599">#15599</a>)</li>
<li>fix(vue): Attach Pinia state only once per event (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15588">#15588</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/msurdi-a8c"><code>@​msurdi-a8c</code></a>, <a
href="https://github.com/namoscato"><code>@​namoscato</code></a>, and <a
href="https://github.com/rileyg98"><code>@​rileyg98</code></a>. Thank
you for your contributions!</p>
<h2>9.4.0</h2>
<ul>
<li>feat(core): Add types for logs protocol and envelope (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15530">#15530</a>)</li>
<li>feat(deps): Bump <code>@sentry/cli</code> from 2.41.1 to 2.42.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15510">#15510</a>)</li>
<li>feat(deps): Bump <code>@sentry/webpack-plugin</code> from 3.1.2 to
3.2.1 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15512">#15512</a>)</li>
<li>feat(feedback) Allowing annotation via highlighting &amp; masking
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15484">#15484</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6ec4602781"><code>6ec4602</code></a>
release: 9.6.0</li>
<li><a
href="5ba80bc5fd"><code>5ba80bc</code></a>
Merge pull request <a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15703">#15703</a>
from getsentry/prepare-release/9.6.0</li>
<li><a
href="8dc6e50597"><code>8dc6e50</code></a>
Remove unnecessary changelog item</li>
<li><a
href="7889768035"><code>7889768</code></a>
meta(changelog): Update changelog for 9.6.0</li>
<li><a
href="2b5526565c"><code>2b55265</code></a>
fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file ...</li>
<li><a
href="7d88266a6e"><code>7d88266</code></a>
chore(ci): Remove <code>type</code> from canary failure template (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15698">#15698</a>)</li>
<li><a
href="48ed271b6d"><code>48ed271</code></a>
chore(deps): bump esbuild from 0.20.0 to 0.25.0 in
/dev-packages/e2e-tests/te...</li>
<li><a
href="e15988c2ad"><code>e15988c</code></a>
chore: Add external contributor to CHANGELOG.md (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15642">#15642</a>)</li>
<li><a
href="5c4cab7b34"><code>5c4cab7</code></a>
chore(deps): Deduplicate <code>@babel</code> dependencies (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15639">#15639</a>)</li>
<li><a
href="ce1ced8172"><code>ce1ced8</code></a>
chore: Add external contributor to CHANGELOG.md (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15640">#15640</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-javascript/compare/8.54.0...9.6.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@sentry/nextjs&package-manager=npm_and_yarn&previous-version=8.54.0&new-version=9.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-02 02:51:36 +00:00
dependabot[bot]
05af4a24ce chore(libs/deps): bump the production-dependencies group across 1 directory with 4 updates (#9727)
Bumps the production-dependencies group with 4 updates in the
/autogpt_platform/autogpt_libs directory:
[pydantic](https://github.com/pydantic/pydantic),
[pydantic-settings](https://github.com/pydantic/pydantic-settings),
[pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) and
[supabase](https://github.com/supabase/supabase-py).

Updates `pydantic` from 2.10.6 to 2.11.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/releases">pydantic's
releases</a>.</em></p>
<blockquote>
<h2>v2.11.1 2025-03-28</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Fixes</h3>
<ul>
<li>Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas or metadata by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11644">pydantic/pydantic#11644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.11.0...v2.11.1">https://github.com/pydantic/pydantic/compare/v2.11.0...v2.11.1</a></p>
<h2>v2.11.0 2025-03-27</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Packaging</h3>
<ul>
<li>Re-enable memray related tests on Python 3.12+ by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11191">pydantic/pydantic#11191</a></li>
<li>Bump astral-sh/setup-uv from 4 to 5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11205">pydantic/pydantic#11205</a></li>
<li>Add a <code>check_pydantic_core_version()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11324">pydantic/pydantic#11324</a></li>
<li>Remove <code>greenlet</code> development dependency by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11351">pydantic/pydantic#11351</a></li>
<li>Bump ruff from 0.9.2 to 0.9.5 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11407">pydantic/pydantic#11407</a></li>
<li>Improve release automation process by <a
href="https://github.com/austinyu"><code>@​austinyu</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11427">pydantic/pydantic#11427</a></li>
<li>Bump dawidd6/action-download-artifact from 8 to 9 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11513">pydantic/pydantic#11513</a></li>
<li>Bump <code>pydantic-core</code> to v2.32.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11567">pydantic/pydantic#11567</a></li>
</ul>
<h3>New Features</h3>
<ul>
<li>Support unsubstituted type variables with both a default and a bound
or constraints by <a
href="https://github.com/FyZzyss"><code>@​FyZzyss</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10789">pydantic/pydantic#10789</a></li>
<li>Add a <code>default_factory_takes_validated_data</code> property to
<code>FieldInfo</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11034">pydantic/pydantic#11034</a></li>
<li>Raise a better error when a generic alias is used inside
<code>type[]</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11088">pydantic/pydantic#11088</a></li>
<li>Properly support PEP 695 generics syntax by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11189">pydantic/pydantic#11189</a></li>
<li>Properly support type variable defaults by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11332">pydantic/pydantic#11332</a></li>
<li>Add support for validating v6, v7, v8 UUIDs by <a
href="https://github.com/astei"><code>@​astei</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11436">pydantic/pydantic#11436</a></li>
<li>Improve alias configuration APIs by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11468">pydantic/pydantic#11468</a></li>
<li>Add experimental support for free threading by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11516">pydantic/pydantic#11516</a></li>
<li>Add <code>encoded_string()</code> method to the URL types by <a
href="https://github.com/YassinNouh21"><code>@​YassinNouh21</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11580">pydantic/pydantic#11580</a></li>
<li>Add support for <code>defer_build</code> with
<code>@validate_call</code> decorator by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11584">pydantic/pydantic#11584</a></li>
<li>Allow <code>@with_config</code> decorator to be used with keyword
arguments by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11608">pydantic/pydantic#11608</a></li>
<li>Simplify customization of default value inclusion in JSON Schema
generation by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11634">pydantic/pydantic#11634</a></li>
<li>Add <code>generate_arguments_schema()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11572">pydantic/pydantic#11572</a></li>
</ul>
<h3>Changes</h3>
<ul>
<li>Rework <code>create_model</code> field definitions format by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11032">pydantic/pydantic#11032</a></li>
<li>Raise a deprecation warning when a field is annotated as final with
a default value by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11168">pydantic/pydantic#11168</a></li>
<li>Deprecate accessing <code>model_fields</code> and
<code>model_computed_fields</code> on instances by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11169">pydantic/pydantic#11169</a></li>
<li>Move core schema generation logic for path types inside the
<code>GenerateSchema</code> class by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10846">pydantic/pydantic#10846</a></li>
<li>Move <code>Mapping</code> schema gen to <code>GenerateSchema</code>
to complete removal of <code>prepare_annotations_for_known_type</code>
workaround by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11247">pydantic/pydantic#11247</a></li>
<li>Remove Python 3.8 Support by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11258">pydantic/pydantic#11258</a></li>
<li>Optimize calls to <code>get_type_ref</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10863">pydantic/pydantic#10863</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.11.1 (2025-03-28)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.1">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas or metadata by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11644">#11644</a></li>
</ul>
<h2>v2.11.0 (2025-03-27)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.0">GitHub
release</a></p>
<h3>What's Changed</h3>
<p>Pydantic v2.11 is a version strongly focused on build time
performance of Pydantic models (and core schema generation in general).
See the <a
href="https://pydantic.dev/articles/pydantic-v2-11-release">blog
post</a> for more details.</p>
<h4>Packaging</h4>
<ul>
<li>Bump <code>pydantic-core</code> to v2.33.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11631">#11631</a></li>
</ul>
<h4>New Features</h4>
<ul>
<li>Add <code>encoded_string()</code> method to the URL types by <a
href="https://github.com/YassinNouh21"><code>@​YassinNouh21</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11580">#11580</a></li>
<li>Add support for <code>defer_build</code> with
<code>@validate_call</code> decorator by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11584">#11584</a></li>
<li>Allow <code>@with_config</code> decorator to be used with keyword
arguments by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11608">#11608</a></li>
<li>Simplify customization of default value inclusion in JSON Schema
generation by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11634">#11634</a></li>
<li>Add <code>generate_arguments_schema()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11572">#11572</a></li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Allow generic typed dictionaries to be used for unpacked variadic
keyword parameters by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11571">#11571</a></li>
<li>Fix runtime error when computing model string representation
involving cached properties and self-referenced models by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11579">#11579</a></li>
<li>Preserve other steps when using the ellipsis in the pipeline API by
<a href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11626">#11626</a></li>
<li>Fix deferred discriminator application logic by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11591">#11591</a></li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a href="https://github.com/cmenon12"><code>@​cmenon12</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11562">#11562</a></li>
<li><a href="https://github.com/Jeukoh"><code>@​Jeukoh</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11611">#11611</a></li>
</ul>
<h2>v2.11.0b2 (2025-03-17)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.0b2">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6c38dc93f4"><code>6c38dc9</code></a>
Prepare release v2.11.1 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11648">#11648</a>)</li>
<li><a
href="1dcddac2c5"><code>1dcddac</code></a>
Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas ...</li>
<li><a
href="024fdae2b5"><code>024fdae</code></a>
Fix small typos (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11643">#11643</a>)</li>
<li><a
href="58e61fa3c6"><code>58e61fa</code></a>
Prepare release v2.11.0 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11635">#11635</a>)</li>
<li><a
href="e2c2e811e3"><code>e2c2e81</code></a>
Add <code>generate_arguments_schema()</code> experimental function (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11572">#11572</a>)</li>
<li><a
href="72bea3f22f"><code>72bea3f</code></a>
Add <code>mkdocs-llmstxt</code> documentation plugin (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11632">#11632</a>)</li>
<li><a
href="fcba83291a"><code>fcba832</code></a>
Simplify customization of default value inclusion in JSON Schema
generation (...</li>
<li><a
href="6f11161524"><code>6f11161</code></a>
Add support for extra keys validation for models (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11578">#11578</a>)</li>
<li><a
href="7917b11bd2"><code>7917b11</code></a>
Disable third-party workflow issue report (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11629">#11629</a>)</li>
<li><a
href="f5226d2946"><code>f5226d2</code></a>
Bump <code>pydantic-core</code> to v2.33.0 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11631">#11631</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic/compare/v2.10.6...v2.11.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic-settings` from 2.7.1 to 2.8.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic-settings/releases">pydantic-settings's
releases</a>.</em></p>
<blockquote>
<h2>v2.8.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix for init source kwarg alias resolution. by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/550">pydantic/pydantic-settings#550</a></li>
<li>Revert usage of positional only argument in
<code>BaseSettings.__init__</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/557">pydantic/pydantic-settings#557</a></li>
<li>Revert use of <code>object</code> instead of <code>Any</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/559">pydantic/pydantic-settings#559</a></li>
<li>Prepare release 2.8.1 by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/558">pydantic/pydantic-settings#558</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.8.0...v2.8.1">https://github.com/pydantic/pydantic-settings/compare/v2.8.0...v2.8.1</a></p>
<h2>v2.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>CLI support for optional and variadic positional args by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/519">pydantic/pydantic-settings#519</a></li>
<li>Improve env_prefix config doc by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/523">pydantic/pydantic-settings#523</a></li>
<li>Add env_nested_max_split setting by <a
href="https://github.com/gsakkis"><code>@​gsakkis</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/534">pydantic/pydantic-settings#534</a></li>
<li>Avoid using <code>Any</code> in <code>BaseSettings</code> signature
to avoid mypy errors by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/529">pydantic/pydantic-settings#529</a></li>
<li>Asynchronous CLI methods in CliApp by <a
href="https://github.com/KanchiShimono"><code>@​KanchiShimono</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/533">pydantic/pydantic-settings#533</a></li>
<li>Don't explode env vars if env_nested_delimiter is empty by <a
href="https://github.com/gsakkis"><code>@​gsakkis</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/540">pydantic/pydantic-settings#540</a></li>
<li>Prepare release 2.8.0 by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/541">pydantic/pydantic-settings#541</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/gsakkis"><code>@​gsakkis</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/534">pydantic/pydantic-settings#534</a></li>
<li><a
href="https://github.com/KanchiShimono"><code>@​KanchiShimono</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/533">pydantic/pydantic-settings#533</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.0">https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5f33b62056"><code>5f33b62</code></a>
Prepare release 2.8.1 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/558">#558</a>)</li>
<li><a
href="fa64a4eebb"><code>fa64a4e</code></a>
Revert use of <code>object</code> instead of <code>Any</code> (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/559">#559</a>)</li>
<li><a
href="21e6b23cb7"><code>21e6b23</code></a>
Revert usage of positional only argument in
<code>BaseSettings.__init__</code> (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/557">#557</a>)</li>
<li><a
href="1a4f3f43f9"><code>1a4f3f4</code></a>
Fix for init source kwarg alias resolution. (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/550">#550</a>)</li>
<li><a
href="f76c7fef4e"><code>f76c7fe</code></a>
Prepare release 2.8.0 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/541">#541</a>)</li>
<li><a
href="4b6fd3d096"><code>4b6fd3d</code></a>
Don't explode env vars if env_nested_delimiter is empty (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/540">#540</a>)</li>
<li><a
href="7835118fbd"><code>7835118</code></a>
Asynchronous CLI methods in CliApp (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/533">#533</a>)</li>
<li><a
href="537f7514aa"><code>537f751</code></a>
Avoid using <code>Any</code> in <code>BaseSettings</code> signature to
avoid mypy errors (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/529">#529</a>)</li>
<li><a
href="ccf99b2d78"><code>ccf99b2</code></a>
Add env_nested_max_split setting (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/534">#534</a>)</li>
<li><a
href="65929cd1f5"><code>65929cd</code></a>
Improve env_prefix config doc (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/523">#523</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 0.25.3 to 0.26.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.26.0</h2>
<ul>
<li>Adds configuration option that sets default event loop scope for all
tests <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/793">#793</a></li>
<li>Improved type annotations for <code>pytest_asyncio.fixture</code> <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1045">#1045</a></li>
<li>Added <code>typing-extensions</code> as additional dependency for
Python <code>&lt;3.10</code> <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1045">#1045</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4f8ce457b0"><code>4f8ce45</code></a>
docs: Prepare release of v0.26.0.</li>
<li><a
href="498e8a7786"><code>498e8a7</code></a>
Build(deps): Bump attrs from 25.1.0 to 25.3.0 in
/dependencies/default</li>
<li><a
href="01c22ffb63"><code>01c22ff</code></a>
build: Update project metadata to use SPDX license identifier</li>
<li><a
href="78191c98ed"><code>78191c9</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="9a455516ea"><code>9a45551</code></a>
Build(deps): Bump hypothesis in /dependencies/default</li>
<li><a
href="6680409439"><code>6680409</code></a>
Build(deps): Bump coverage from 7.7.0 to 7.7.1 in
/dependencies/default</li>
<li><a
href="aa82c574fe"><code>aa82c57</code></a>
Build(deps): Bump iniconfig from 2.0.0 to 2.1.0 in
/dependencies/default</li>
<li><a
href="cca587ea4f"><code>cca587e</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="5d90b29621"><code>5d90b29</code></a>
Build(deps): Bump hypothesis in /dependencies/default</li>
<li><a
href="c2622628b6"><code>c262262</code></a>
Build(deps): Bump coverage from 7.6.12 to 7.7.0 in
/dependencies/default</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.3...v0.26.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.13.0 to 2.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.15.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.14.0...v2.15.0">2.15.0</a>
(2025-03-26)</h2>
<h3>Features</h3>
<ul>
<li><strong>postgrest:</strong> bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)
(<a
href="5e59df6bfa">5e59df6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)
(<a
href="da3ed9cdd7">da3ed9c</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)
(<a
href="0340c8eeb0">0340c8e</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)
(<a
href="44d2ca56eb">44d2ca5</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.0 to 2.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1066">#1066</a>)
(<a
href="1f92945a13">1f92945</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)
(<a
href="7816d7f40e">7816d7f</a>)</li>
<li>schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)
(<a
href="b9923249d9">b992324</a>)</li>
</ul>
<h2>v2.14.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.14.0">2.14.0</a>
(2025-03-20)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.3.0 to 2.4.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1059">#1059</a>)
(<a
href="9cdf7fa462">9cdf7fa</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.3 to 2.11.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1060">#1060</a>)
(<a
href="a8600fd9e3">a8600fd</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.14.0...v2.15.0">2.15.0</a>
(2025-03-26)</h2>
<h3>Features</h3>
<ul>
<li><strong>postgrest:</strong> bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)
(<a
href="5e59df6bfa">5e59df6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)
(<a
href="da3ed9cdd7">da3ed9c</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)
(<a
href="0340c8eeb0">0340c8e</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)
(<a
href="44d2ca56eb">44d2ca5</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.0 to 2.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1066">#1066</a>)
(<a
href="1f92945a13">1f92945</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)
(<a
href="7816d7f40e">7816d7f</a>)</li>
<li>schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)
(<a
href="b9923249d9">b992324</a>)</li>
</ul>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.14.0">2.14.0</a>
(2025-03-20)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.3.0 to 2.4.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1059">#1059</a>)
(<a
href="9cdf7fa462">9cdf7fa</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.3 to 2.11.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1060">#1060</a>)
(<a
href="a8600fd9e3">a8600fd</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2fa8891e78"><code>2fa8891</code></a>
chore(main): release 2.15.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1080">#1080</a>)</li>
<li><a
href="7816d7f40e"><code>7816d7f</code></a>
fix(realtime): bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)</li>
<li><a
href="0340c8eeb0"><code>0340c8e</code></a>
fix(functions): bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)</li>
<li><a
href="da3ed9cdd7"><code>da3ed9c</code></a>
fix(auth): bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)</li>
<li><a
href="44d2ca56eb"><code>44d2ca5</code></a>
fix(postgrest): bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)</li>
<li><a
href="b9923249d9"><code>b992324</code></a>
fix: schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)</li>
<li><a
href="5e59df6bfa"><code>5e59df6</code></a>
feat(postgrest): bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)</li>
<li><a
href="36858ee02d"><code>36858ee</code></a>
chore(deps-dev): bump pytest from 8.3.4 to 8.3.5 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1070">#1070</a>)</li>
<li><a
href="9589770fa3"><code>9589770</code></a>
chore(deps-dev): bump commitizen from 4.2.2 to 4.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1069">#1069</a>)</li>
<li><a
href="58246bc5c8"><code>58246bc</code></a>
chore(deps-dev): bump isort from 6.0.0 to 6.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1065">#1065</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.15.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-02 02:08:49 +00:00
dependabot[bot]
c8836953bf chore(backend/deps-dev): bump the development-dependencies group across 1 directory with 5 updates (#9560)
Bumps the development-dependencies group with 5 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [aiohappyeyeballs](https://github.com/aio-libs/aiohappyeyeballs) |
`2.4.4` | `2.4.6` |
| [httpx](https://github.com/encode/httpx) | `0.27.2` | `0.28.1` |
| [poethepoet](https://github.com/nat-n/poethepoet) | `0.32.1` |
`0.33.0` |
| [pyright](https://github.com/RobertCraigie/pyright-python) |
`1.1.392.post0` | `1.1.396` |
| [ruff](https://github.com/astral-sh/ruff) | `0.9.3` | `0.9.9` |


Updates `aiohappyeyeballs` from 2.4.4 to 2.4.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/releases">aiohappyeyeballs's
releases</a>.</em></p>
<blockquote>
<h2>v2.4.6 (2025-02-07)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/136">#136</a>,
<a
href="f75891d897"><code>f75891d</code></a>)</li>
</ul>
<hr />
<p><strong>Detailed Changes</strong>: <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.5...v2.4.6">v2.4.5...v2.4.6</a></p>
<h2>v2.4.5 (2025-02-07)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/134">#134</a>,
<a
href="99edb20e9d"><code>99edb20</code></a>)</li>
</ul>
<p>Co-authored-by: J. Nick Koston <a
href="mailto:nick@koston.org">nick@koston.org</a></p>
<ul>
<li>Move classifiers to prevent recalculation by Poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/131">#131</a>,
<a
href="66e1c90ae8"><code>66e1c90</code></a>)</li>
</ul>
<p>Co-authored-by: Martin Styk <a
href="mailto:martin.styk@oracle.com">martin.styk@oracle.com</a></p>
<p>Co-authored-by: J. Nick Koston <a
href="mailto:nick@koston.org">nick@koston.org</a></p>
<hr />
<p><strong>Detailed Changes</strong>: <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.4...v2.4.5">v2.4.4...v2.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md">aiohappyeyeballs's
changelog</a>.</em></p>
<blockquote>
<h2>v2.4.6 (2025-02-07)</h2>
<h3>Bug fixes</h3>
<ul>
<li>Ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/136">#136</a>)
(<a
href="f75891d897"><code>f75891d</code></a>)</li>
</ul>
<h2>v2.4.5 (2025-02-07)</h2>
<h3>Bug fixes</h3>
<ul>
<li>Keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/134">#134</a>)
(<a
href="99edb20e9d"><code>99edb20</code></a>)</li>
<li>Move classifiers to prevent recalculation by poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/131">#131</a>)
(<a
href="66e1c90ae8"><code>66e1c90</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f18ad492a3"><code>f18ad49</code></a>
2.4.6</li>
<li><a
href="f75891d897"><code>f75891d</code></a>
fix: ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/136">#136</a>)</li>
<li><a
href="cbc674d409"><code>cbc674d</code></a>
2.4.5</li>
<li><a
href="99edb20e9d"><code>99edb20</code></a>
fix: keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/134">#134</a>)</li>
<li><a
href="9baf0b340e"><code>9baf0b3</code></a>
chore(deps-ci): bump the github-actions group with 9 updates (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/135">#135</a>)</li>
<li><a
href="678eab0dd4"><code>678eab0</code></a>
chore: update dependabot.yml to include GHA (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/133">#133</a>)</li>
<li><a
href="66e1c90ae8"><code>66e1c90</code></a>
fix: move classifiers to prevent recalculation by Poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/131">#131</a>)</li>
<li><a
href="850640e0f7"><code>850640e</code></a>
chore: migrate to poetry 2.0 (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/132">#132</a>)</li>
<li><a
href="75ec0dcabc"><code>75ec0dc</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/129">#129</a>)</li>
<li><a
href="7d7f1180f2"><code>7d7f118</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/128">#128</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.4...v2.4.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `httpx` from 0.27.2 to 0.28.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/encode/httpx/releases">httpx's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.28.1</h2>
<h2>0.28.1 (6th December, 2024)</h2>
<ul>
<li>Fix SSL case where <code>verify=False</code> together with client
side certificates.</li>
</ul>
<h2>Version 0.28.0</h2>
<h2>0.28.0 (28th November, 2024)</h2>
<p>The 0.28 release includes a limited set of deprecations.</p>
<p><strong>Deprecations</strong>:</p>
<p>We are working towards a simplified SSL configuration API.</p>
<p><em>For users of the standard <code>verify=True</code> or
<code>verify=False</code> cases, or
<code>verify=&lt;ssl_context&gt;</code> case this should require no
changes. The following cases have been deprecated...</em></p>
<ul>
<li>The <code>verify</code> argument as a string argument is now
deprecated and will raise warnings.</li>
<li>The <code>cert</code> argument is now deprecated and will raise
warnings.</li>
</ul>
<p>Our revised <a
href="https://github.com/encode/httpx/blob/HEAD/docs/advanced/ssl.md">SSL
documentation</a> covers how to implement the same behaviour with a more
constrained API.</p>
<p><strong>The following changes are also included</strong>:</p>
<ul>
<li>The deprecated <code>proxies</code> argument has now been
removed.</li>
<li>The deprecated <code>app</code> argument has now been removed.</li>
<li>JSON request bodies use a compact representation. (<a
href="https://redirect.github.com/encode/httpx/issues/3363">#3363</a>)</li>
<li>Review URL percent escape sets, based on WHATWG spec. (<a
href="https://redirect.github.com/encode/httpx/issues/3371">#3371</a>,
<a
href="https://redirect.github.com/encode/httpx/issues/3373">#3373</a>)</li>
<li>Ensure <code>certifi</code> and <code>httpcore</code> are only
imported if required. (<a
href="https://redirect.github.com/encode/httpx/issues/3377">#3377</a>)</li>
<li>Treat <code>socks5h</code> as a valid proxy scheme. (<a
href="https://redirect.github.com/encode/httpx/issues/3178">#3178</a>)</li>
<li>Cleanup <code>Request()</code> method signature in line with
<code>client.request()</code> and <code>httpx.request()</code>. (<a
href="https://redirect.github.com/encode/httpx/issues/3378">#3378</a>)</li>
<li>Bugfix: When passing <code>params={}</code>, always strictly update
rather than merge with an existing querystring. (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/encode/httpx/blob/master/CHANGELOG.md">httpx's
changelog</a>.</em></p>
<blockquote>
<h2>0.28.1 (6th December, 2024)</h2>
<ul>
<li>Fix SSL case where <code>verify=False</code> together with client
side certificates.</li>
</ul>
<h2>0.28.0 (28th November, 2024)</h2>
<p>Be aware that the default <em>JSON request bodies now use a more
compact representation</em>. This is generally considered a prefered
style, tho may require updates to test suites.</p>
<p>The 0.28 release includes a limited set of deprecations...</p>
<p><strong>Deprecations</strong>:</p>
<p>We are working towards a simplified SSL configuration API.</p>
<p><em>For users of the standard <code>verify=True</code> or
<code>verify=False</code> cases, or
<code>verify=&lt;ssl_context&gt;</code> case this should require no
changes. The following cases have been deprecated...</em></p>
<ul>
<li>The <code>verify</code> argument as a string argument is now
deprecated and will raise warnings.</li>
<li>The <code>cert</code> argument is now deprecated and will raise
warnings.</li>
</ul>
<p>Our revised <a
href="https://github.com/encode/httpx/blob/master/docs/advanced/ssl.md">SSL
documentation</a> covers how to implement the same behaviour with a more
constrained API.</p>
<p><strong>The following changes are also included</strong>:</p>
<ul>
<li>The deprecated <code>proxies</code> argument has now been
removed.</li>
<li>The deprecated <code>app</code> argument has now been removed.</li>
<li>JSON request bodies use a compact representation. (<a
href="https://redirect.github.com/encode/httpx/issues/3363">#3363</a>)</li>
<li>Review URL percent escape sets, based on WHATWG spec. (<a
href="https://redirect.github.com/encode/httpx/issues/3371">#3371</a>,
<a
href="https://redirect.github.com/encode/httpx/issues/3373">#3373</a>)</li>
<li>Ensure <code>certifi</code> and <code>httpcore</code> are only
imported if required. (<a
href="https://redirect.github.com/encode/httpx/issues/3377">#3377</a>)</li>
<li>Treat <code>socks5h</code> as a valid proxy scheme. (<a
href="https://redirect.github.com/encode/httpx/issues/3178">#3178</a>)</li>
<li>Cleanup <code>Request()</code> method signature in line with
<code>client.request()</code> and <code>httpx.request()</code>. (<a
href="https://redirect.github.com/encode/httpx/issues/3378">#3378</a>)</li>
<li>Bugfix: When passing <code>params={}</code>, always strictly update
rather than merge with an existing querystring. (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="26d48e0634"><code>26d48e0</code></a>
Version 0.28.1 (<a
href="https://redirect.github.com/encode/httpx/issues/3445">#3445</a>)</li>
<li><a
href="89599a9541"><code>89599a9</code></a>
Fix <code>verify=False</code>, <code>cert=...</code> case. (<a
href="https://redirect.github.com/encode/httpx/issues/3442">#3442</a>)</li>
<li><a
href="8ecb86f0d7"><code>8ecb86f</code></a>
Add test for request params behavior changes (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)
(<a
href="https://redirect.github.com/encode/httpx/issues/3440">#3440</a>)</li>
<li><a
href="0cb7e5a2e7"><code>0cb7e5a</code></a>
Bump the python-packages group with 11 updates (<a
href="https://redirect.github.com/encode/httpx/issues/3434">#3434</a>)</li>
<li><a
href="15e21e9ea3"><code>15e21e9</code></a>
Updating deprecated docstring Client() class (<a
href="https://redirect.github.com/encode/httpx/issues/3426">#3426</a>)</li>
<li><a
href="80960fa319"><code>80960fa</code></a>
Version 0.28.0. (<a
href="https://redirect.github.com/encode/httpx/issues/3419">#3419</a>)</li>
<li><a
href="a33c87852b"><code>a33c878</code></a>
Fix <code>extensions</code> type annotation. (<a
href="https://redirect.github.com/encode/httpx/issues/3380">#3380</a>)</li>
<li><a
href="ce7e14da27"><code>ce7e14d</code></a>
Error on verify as str. (<a
href="https://redirect.github.com/encode/httpx/issues/3418">#3418</a>)</li>
<li><a
href="47f4a96ffa"><code>47f4a96</code></a>
Handle empty zstd responses (<a
href="https://redirect.github.com/encode/httpx/issues/3412">#3412</a>)</li>
<li><a
href="189fc4bcbe"><code>189fc4b</code></a>
Update CHANGELOG.md, fix typo(s) (<a
href="https://redirect.github.com/encode/httpx/issues/3406">#3406</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/encode/httpx/compare/0.27.2...0.28.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `poethepoet` from 0.32.1 to 0.33.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/nat-n/poethepoet/releases">poethepoet's
releases</a>.</em></p>
<blockquote>
<h2>0.33.0</h2>
<h2>Enhancements</h2>
<ul>
<li>Implemented first version of UvExecutor by <a
href="https://github.com/AKuederle"><code>@​AKuederle</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/271">nat-n/poethepoet#271</a></li>
<li>Support displaying help for a single task by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/280">nat-n/poethepoet#280</a></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Fix argument parsing issues in poetry 2.0 plugin by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/277">nat-n/poethepoet#277</a></li>
<li>Use <code>python3</code> or <code>sys.executable</code> if
<code>python</code> is not on the path by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/278">nat-n/poethepoet#278</a></li>
<li>Tighten poetry-core dependency for non-wheel based installation
methods</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/AKuederle"><code>@​AKuederle</code></a>
made their first contribution in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/271">nat-n/poethepoet#271</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.2...v0.33.0">https://github.com/nat-n/poethepoet/compare/v0.32.2...v0.33.0</a></p>
<h2>0.32.2</h2>
<h2>Fixes</h2>
<ul>
<li>Improve detection of poetry 2.0 projects via the build-system table
by <a href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/274">nat-n/poethepoet#274</a></li>
<li>Fix usage without Poetry doc link in the readme by <a
href="https://github.com/johnthagen"><code>@​johnthagen</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/273">nat-n/poethepoet#273</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/johnthagen"><code>@​johnthagen</code></a> made
their first contribution in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/273">nat-n/poethepoet#273</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.32.2">https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.32.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.33.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `pyright` from 1.1.392.post0 to 1.1.396
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5617c6c57f"><code>5617c6c</code></a>
[pyright updated to 1.1.396] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/338">#338</a>)</li>
<li><a
href="72e863b737"><code>72e863b</code></a>
chore(ci): remove invalid reviewers (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/336">#336</a>)</li>
<li><a
href="74b6b556d9"><code>74b6b55</code></a>
[pyright updated to 1.1.395] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/335">#335</a>)</li>
<li><a
href="70eb305a67"><code>70eb305</code></a>
[pyright updated to 1.1.394] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/333">#333</a>)</li>
<li><a
href="c82fac2803"><code>c82fac2</code></a>
[pyright updated to 1.1.393] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/332">#332</a>)</li>
<li>See full diff in <a
href="https://github.com/RobertCraigie/pyright-python/compare/v1.1.392.post0...v1.1.396">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.9.3 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.3...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-02 00:39:57 +00:00
dependabot[bot]
142fa2af16 chore(backend/deps): bump the production-dependencies group across 1 directory with 20 updates (#9728)
Bumps the production-dependencies group with 20 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [aio-pika](https://github.com/mosquito/aio-pika) | `9.5.4` | `9.5.5` |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) |
`0.45.2` | `0.49.0` |
| [discord-py](https://github.com/Rapptz/discord.py) | `2.4.0` | `2.5.2`
|
| [e2b-code-interpreter](https://github.com/e2b-dev/code-interpreter) |
`1.0.5` | `1.1.1` |
| [fastapi](https://github.com/fastapi/fastapi) | `0.115.8` | `0.115.12`
|
| [flake8](https://github.com/pycqa/flake8) | `7.1.1` | `7.2.0` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.160.0` | `2.166.0` |
| [google-cloud-storage](https://github.com/googleapis/python-storage) |
`3.0.0` | `3.1.0` |
| [groq](https://github.com/groq/groq-python) | `0.18.0` | `0.20.0` |
| [jinja2](https://github.com/pallets/jinja) | `3.1.5` | `3.1.6` |
|
[launchdarkly-server-sdk](https://github.com/launchdarkly/python-server-sdk)
| `9.9.0` | `9.10.0` |
| [mem0ai](https://github.com/mem0ai/mem0) | `0.1.48` | `0.1.80` |
| [openai](https://github.com/openai/openai-python) | `1.61.1` |
`1.69.0` |
| [pydantic](https://github.com/pydantic/pydantic) | `2.10.6` | `2.11.1`
|
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) |
`2.7.1` | `2.8.1` |
| [pytest](https://github.com/pytest-dev/pytest) | `8.3.4` | `8.3.5` |
| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.0.1`
| `1.1.0` |
| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.20.0` |
`2.24.1` |
| [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) | `2.0.37` |
`2.0.40` |
| [supabase](https://github.com/supabase/supabase-py) | `2.13.0` |
`2.15.0` |


Updates `aio-pika` from 9.5.4 to 9.5.5
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/mosquito/aio-pika/blob/master/CHANGELOG.md">aio-pika's
changelog</a>.</em></p>
<blockquote>
<h2>9.5.5</h2>
<ul>
<li>Replace WeakSet with set for robust channels tracking <a
href="https://redirect.github.com/mosquito/aio-pika/issues/666">#666</a>
by shushpanov</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0d442ba73d"><code>0d442ba</code></a>
Bump to 9.5.5</li>
<li><a
href="7796f83e85"><code>7796f83</code></a>
Merge pull request <a
href="https://redirect.github.com/mosquito/aio-pika/issues/666">#666</a>
from shushpanov/use_set_instead_of_week_set</li>
<li><a
href="3a94dbdaaa"><code>3a94dbd</code></a>
Currently, <code>RobustChannel</code> uses <code>WeakSet</code> to track
exchanges and queues for r...</li>
<li>See full diff in <a
href="https://github.com/mosquito/aio-pika/compare/9.5.4...9.5.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `anthropic` from 0.45.2 to 0.49.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/releases">anthropic's
releases</a>.</em></p>
<blockquote>
<h2>v0.49.0</h2>
<h2>0.49.0 (2025-02-28)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.48.0...v0.49.0">v0.48.0...v0.49.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)
(<a
href="bfde3d2978">bfde3d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)
(<a
href="4d3ec5ec5b">4d3ec5e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)
(<a
href="312364b9b5">312364b</a>)</li>
</ul>
<h2>v0.48.0</h2>
<h2>0.48.0 (2025-02-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.2...v0.48.0">v0.47.2...v0.48.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)
(<a
href="e6b3a70ffb">e6b3a70</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>add thinking examples (<a
href="f46324863d">f463248</a>)</li>
</ul>
<h2>v0.47.2</h2>
<h2>0.47.2 (2025-02-25)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.1...v0.47.2">v0.47.1...v0.47.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>beta:</strong> add thinking to beta.messages.stream (<a
href="69e3db1de0">69e3db1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> properly set
<strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)
(<a
href="3537a3bb22">3537a3b</a>)</li>
</ul>
<h2>v0.47.1</h2>
<h2>0.47.1 (2025-02-24)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md">anthropic's
changelog</a>.</em></p>
<blockquote>
<h2>0.49.0 (2025-02-28)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.48.0...v0.49.0">v0.48.0...v0.49.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)
(<a
href="bfde3d2978">bfde3d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)
(<a
href="4d3ec5ec5b">4d3ec5e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)
(<a
href="312364b9b5">312364b</a>)</li>
</ul>
<h2>0.48.0 (2025-02-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.2...v0.48.0">v0.47.2...v0.48.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)
(<a
href="e6b3a70ffb">e6b3a70</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>add thinking examples (<a
href="f46324863d">f463248</a>)</li>
</ul>
<h2>0.47.2 (2025-02-25)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.1...v0.47.2">v0.47.1...v0.47.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>beta:</strong> add thinking to beta.messages.stream (<a
href="69e3db1de0">69e3db1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> properly set
<strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)
(<a
href="3537a3bb22">3537a3b</a>)</li>
</ul>
<h2>0.47.1 (2025-02-24)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.0...v0.47.1">v0.47.0...v0.47.1</a></p>
<h3>Chores</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8b244157a7"><code>8b24415</code></a>
release: 0.49.0</li>
<li><a
href="5e605db5db"><code>5e605db</code></a>
feat(api): add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)</li>
<li><a
href="810f434ec1"><code>810f434</code></a>
chore(docs): update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)</li>
<li><a
href="859993cf66"><code>859993c</code></a>
docs: update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)</li>
<li><a
href="6c08e05ab4"><code>6c08e05</code></a>
release: 0.48.0</li>
<li><a
href="90481732c9"><code>9048173</code></a>
feat(api): add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)</li>
<li><a
href="b5aaa3caca"><code>b5aaa3c</code></a>
docs: add thinking examples</li>
<li><a
href="599f2b9a95"><code>599f2b9</code></a>
release: 0.47.2</li>
<li><a
href="8fe5f5ce50"><code>8fe5f5c</code></a>
fix(beta): add thinking to beta.messages.stream</li>
<li><a
href="7e49d854c7"><code>7e49d85</code></a>
chore(internal): properly set <strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.2...v0.49.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `discord-py` from 2.4.0 to 2.5.2
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d2a6ccf715"><code>d2a6ccf</code></a>
Version bump to v2.5.2</li>
<li><a
href="f4bce1caf0"><code>f4bce1c</code></a>
Add changelog for v2.5.2</li>
<li><a
href="8594dd1b30"><code>8594dd1</code></a>
Fix embed media flags regression</li>
<li><a
href="2f8b2624f1"><code>2f8b262</code></a>
Fix improper class in audit log docs</li>
<li><a
href="973bb5089f"><code>973bb50</code></a>
Version bump for development</li>
<li><a
href="73f261d536"><code>73f261d</code></a>
Version bump to v2.5.1</li>
<li><a
href="6b0a6eea66"><code>6b0a6ee</code></a>
Add v2.5.1 changelog</li>
<li><a
href="cab4732b7e"><code>cab4732</code></a>
Make embed flags required and add them to all media fields</li>
<li><a
href="de5720e659"><code>de5720e</code></a>
Fix attachment is_spoiler() and is_voice_message()</li>
<li><a
href="fbe2b358fc"><code>fbe2b35</code></a>
Add note about NotFound for Messageable.send</li>
<li>Additional commits viewable in <a
href="https://github.com/Rapptz/discord.py/compare/v2.4.0...v2.5.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `e2b-code-interpreter` from 1.0.5 to 1.1.1
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3fe798e18b"><code>3fe798e</code></a>
Fix <code>to_json</code> method for charts (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/68">#68</a>)</li>
<li><a
href="1c4ac6ce6c"><code>1c4ac6c</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/67">#67</a>
from e2b-dev/send-notification-to-releases-channel</li>
<li><a
href="6c0bb19dd5"><code>6c0bb19</code></a>
Send releases notification to dedicated channel</li>
<li><a
href="916390e04b"><code>916390e</code></a>
[skip ci] Release new versions</li>
<li><a
href="3bf76d77ae"><code>3bf76d7</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/66">#66</a>
from e2b-dev/fix-sdk-gen-non-esm-import</li>
<li><a
href="30f3b24c9c"><code>30f3b24</code></a>
Merge branch 'main' into fix-sdk-gen-non-esm-import</li>
<li><a
href="455d71794c"><code>455d717</code></a>
update pnpm lockfile</li>
<li><a
href="418c069163"><code>418c069</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/65">#65</a>
from e2b-dev/fix-sdk-gen-non-esm-import</li>
<li><a
href="c30f7e9934"><code>c30f7e9</code></a>
pin typdoc and typedoc-markdown to non-breaking versions in js-sdk</li>
<li><a
href="f651795436"><code>f651795</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/64">#64</a>
from e2b-dev/mlejva-patch-1</li>
<li>Additional commits viewable in <a
href="https://github.com/e2b-dev/code-interpreter/compare/@e2b/code-interpreter-python@1.0.5...@e2b/code-interpreter-python@1.1.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `fastapi` from 0.115.8 to 0.115.12
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastapi/fastapi/releases">fastapi's
releases</a>.</em></p>
<blockquote>
<h2>0.115.12</h2>
<h3>Fixes</h3>
<ul>
<li>🐛 Fix <code>convert_underscores=False</code> for header Pydantic
models. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13515">#13515</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Docs</h3>
<ul>
<li>📝 Update <code>docs/en/docs/tutorial/middleware.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13444">#13444</a>
by <a
href="https://github.com/Rishat-F"><code>@​Rishat-F</code></a>.</li>
<li>👥 Update FastAPI People - Experts. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13493">#13493</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Translations</h3>
<ul>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/metadata.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13459">#13459</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/response-status-code.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13462">#13462</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/cookie-param-models.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13460">#13460</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/header-param-models.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13461">#13461</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Japanese translation for
<code>docs/ja/docs/virtual-environments.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13304">#13304</a>
by <a
href="https://github.com/k94-ishi"><code>@​k94-ishi</code></a>.</li>
<li>🌐 Add Korean translation for
<code>docs/ko/docs/tutorial/security/oauth2-jwt.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13333">#13333</a>
by <a href="https://github.com/yes0ng"><code>@​yes0ng</code></a>.</li>
<li>🌐 Add Vietnamese translation for
<code>docs/vi/docs/deployment/cloud.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13407">#13407</a>
by <a href="https://github.com/ptt3199"><code>@​ptt3199</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>⬆ Bump pydantic-ai from 0.0.15 to 0.0.30. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13438">#13438</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump sqlmodel from 0.0.22 to 0.0.23. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13437">#13437</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump black from 24.10.0 to 25.1.0. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13436">#13436</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump ruff to 0.9.4. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13299">#13299</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>🔧 Update sponsors: pause TestDriven. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13446">#13446</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.115.11</h2>
<h3>Fixes</h3>
<ul>
<li>🐛 Add docs examples and tests (support) for <code>Annotated</code>
custom validations, like <code>AfterValidator</code>, revert <a
href="https://redirect.github.com/fastapi/fastapi/pull/13440">#13440</a>.
PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13442">#13442</a>
by <a href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.
<ul>
<li>New docs: <a
href="https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#custom-validation">Query
Parameters and String Validations - Custom Validation</a>.</li>
</ul>
</li>
</ul>
<h3>Translations</h3>
<ul>
<li>🌐 Add Russian translation for
<code>docs/ru/docs/tutorial/middleware.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13412">#13412</a>
by <a href="https://github.com/alv2017"><code>@​alv2017</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>👥 Update FastAPI GitHub topic repositories. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13439">#13439</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>👥 Update FastAPI People - Contributors and Translators. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13432">#13432</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>👥 Update FastAPI People - Sponsors. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13433">#13433</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.115.10</h2>
<h3>Fixes</h3>
<ul>
<li>♻️ Update internal annotation usage for compatibility with Pydantic
2.11. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13314">#13314</a>
by <a href="https://github.com/Viicos"><code>@​Viicos</code></a>.</li>
</ul>
<h3>Upgrades</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="628c34e0ca"><code>628c34e</code></a>
🔖 Release version 0.115.12</li>
<li><a
href="8e76d4e5f4"><code>8e76d4e</code></a>
📝 Update release notes</li>
<li><a
href="2537d9d1c2"><code>2537d9d</code></a>
🐛 Fix <code>convert_underscores=False</code> for header Pydantic models
(<a
href="https://redirect.github.com/fastapi/fastapi/issues/13515">#13515</a>)</li>
<li><a
href="c08a3e8f22"><code>c08a3e8</code></a>
📝 Update release notes</li>
<li><a
href="241de23b68"><code>241de23</code></a>
📝 Update <code>docs/en/docs/tutorial/middleware.md</code> (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13444">#13444</a>)</li>
<li><a
href="4e40e1e85d"><code>4e40e1e</code></a>
📝 Update release notes</li>
<li><a
href="ecf6e7eec2"><code>ecf6e7e</code></a>
🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/metadata.md</code> page (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13">#13</a>...</li>
<li><a
href="3afd733753"><code>3afd733</code></a>
📝 Update release notes</li>
<li><a
href="8557a88d16"><code>8557a88</code></a>
🌐 Add Ukrainian translation for
`docs/uk/docs/tutorial/response-status-code.m...</li>
<li><a
href="e4c1dd799d"><code>e4c1dd7</code></a>
📝 Update release notes</li>
<li>Additional commits viewable in <a
href="https://github.com/fastapi/fastapi/compare/0.115.8...0.115.12">compare
view</a></li>
</ul>
</details>
<br />

Updates `flake8` from 7.1.1 to 7.2.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="16f5f28a38"><code>16f5f28</code></a>
Release 7.2.0</li>
<li><a
href="ebad305769"><code>ebad305</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1974">#1974</a>
from PyCQA/update-plugins</li>
<li><a
href="d56d569ce4"><code>d56d569</code></a>
update versions of pycodestyle / pyflakes</li>
<li><a
href="a7e8f6250c"><code>a7e8f62</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1973">#1973</a>
from PyCQA/py39-plus</li>
<li><a
href="9d55ccdb72"><code>9d55ccd</code></a>
py39+</li>
<li><a
href="e492aeb385"><code>e492aeb</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1967">#1967</a>
from PyCQA/unnecessary-mocks</li>
<li><a
href="fa2ed7145c"><code>fa2ed71</code></a>
remove a few unnecessary mocks in test_checker_manager</li>
<li><a
href="fffee8ba9d"><code>fffee8b</code></a>
Release 7.1.2</li>
<li><a
href="19001f77f3"><code>19001f7</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1966">#1966</a>
from PyCQA/limit-procs-to-file-count</li>
<li><a
href="f35737a32d"><code>f35737a</code></a>
avoid starting unnecessary processes when file count is limited</li>
<li>See full diff in <a
href="https://github.com/pycqa/flake8/compare/7.1.1...7.2.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.160.0 to 2.166.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.166.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.165.0...v2.166.0">2.166.0</a>
(2025-03-25)</h2>
<h3>Features</h3>
<ul>
<li><strong>aiplatform:</strong> Update the api <a
href="9d050cee8d</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>alloydb:</strong> Update the api <a
href="db87ff7dae</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>analyticshub:</strong> Update the api <a
href="0716538951</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>apigee:</strong> Update the api <a
href="2fb0b5170e</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>bigqueryreservation:</strong> Update the api <a
href="98c07716c1</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>bigquery:</strong> Update the api <a
href="0f85078845</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>civicinfo:</strong> Update the api <a
href="f4a8692800</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>compute:</strong> Update the api <a
href="daa99db3ac</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>contactcenterinsights:</strong> Update the api <a
href="0ca2138859</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>container:</strong> Update the api <a
href="969054e90e</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dataplex:</strong> Update the api <a
href="b1e4a4fa3a</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dataproc:</strong> Update the api <a
href="ab21a62281</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>datastream:</strong> Update the api <a
href="77b0d5e5a7</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dialogflow:</strong> Update the api <a
href="cc1fce237a</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>discoveryengine:</strong> Update the api <a
href="32191c2064</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>displayvideo:</strong> Update the api <a
href="76088b5c22</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>documentai:</strong> Update the api <a
href="79b0b5264c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>gkebackup:</strong> Update the api <a
href="0ad6b20463</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>integrations:</strong> Update the api <a
href="3786649a17</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>managedkafka:</strong> Update the api <a
href="7e80d5a8e7</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>merchantapi:</strong> Update the api <a
href="54e2633d6c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>monitoring:</strong> Update the api <a
href="cecd16cb74</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>netapp:</strong> Update the api <a
href="c2afd5c9b6</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>networkconnectivity:</strong> Update the api <a
href="cabd98e33c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>networkservices:</strong> Update the api <a
href="8fb80bc60f</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>notebooks:</strong> Update the api <a
href="5012558735</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>oracledatabase:</strong> Update the api <a
href="c892cd5c07</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>pubsub:</strong> Update the api <a
href="6bf4e2d990</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>securitycenter:</strong> Update the api <a
href="5a7dfccd9b</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>verifiedaccess:</strong> Update the api <a
href="d58429ee48</a>
(<a
href="722da7de01">722da7d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>chat:</strong> Update the api <a
href="eceac9d703</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>storage:</strong> Update the api <a
href="56ff88eecd</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>sts:</strong> Update the api <a
href="63ec516264</a>
(<a
href="722da7de01">722da7d</a>)</li>
</ul>
<h2>v2.165.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.164.0...v2.165.0">2.165.0</a>
(2025-03-18)</h2>
<h3>Features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7633383ffc"><code>7633383</code></a>
chore(main): release 2.166.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2586">#2586</a>)</li>
<li><a
href="722da7de01"><code>722da7d</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2585">#2585</a>)</li>
<li><a
href="e9fb04c74d"><code>e9fb04c</code></a>
chore(main): release 2.165.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2581">#2581</a>)</li>
<li><a
href="935c167ae7"><code>935c167</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2582">#2582</a>)</li>
<li><a
href="21847efba0"><code>21847ef</code></a>
fix: resolve issue where pre-release versions of dependencies are
installed (...</li>
<li><a
href="0b1875f676"><code>0b1875f</code></a>
chore(main): release 2.164.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2578">#2578</a>)</li>
<li><a
href="390e213906"><code>390e213</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2577">#2577</a>)</li>
<li><a
href="df40ac60f2"><code>df40ac6</code></a>
chore: remove unused files (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2575">#2575</a>)</li>
<li><a
href="6bf97861c4"><code>6bf9786</code></a>
chore(main): release 2.163.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2572">#2572</a>)</li>
<li><a
href="8bc64e5e1a"><code>8bc64e5</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2571">#2571</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/google-api-python-client/compare/v2.160.0...v2.166.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-cloud-storage` from 3.0.0 to 3.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/releases">google-cloud-storage's
releases</a>.</em></p>
<blockquote>
<h2>v3.1.0</h2>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">3.1.0</a>
(2025-02-27)</h2>
<h3>Features</h3>
<ul>
<li>Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)
(<a
href="c869e15ec5">c869e15</a>)</li>
<li>Add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)
(<a
href="24c000fb7b">24c000f</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md">google-cloud-storage's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">3.1.0</a>
(2025-02-27)</h2>
<h3>Features</h3>
<ul>
<li>Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)
(<a
href="c869e15ec5">c869e15</a>)</li>
<li>Add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)
(<a
href="24c000fb7b">24c000f</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="aa7afdff7e"><code>aa7afdf</code></a>
chore(main): release 3.1.0 (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1435">#1435</a>)</li>
<li><a
href="c869e15ec5"><code>c869e15</code></a>
Feat: Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)</li>
<li><a
href="b58d3190c9"><code>b58d319</code></a>
chore(deps): bump virtualenv from 20.26.3 to 20.26.6 in /.kokoro (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1412">#1412</a>)</li>
<li><a
href="0378b44400"><code>0378b44</code></a>
chore: move create_trace_span context manager within (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1443">#1443</a>)</li>
<li><a
href="511b6f5c2b"><code>511b6f5</code></a>
chore(python): conditionally load credentials in .kokoro/build.sh (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1440">#1440</a>)</li>
<li><a
href="b08aa0b131"><code>b08aa0b</code></a>
chore: set gcs-sdk-team as CODEOWNER (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1442">#1442</a>)</li>
<li><a
href="24c000fb7b"><code>24c000f</code></a>
feat: add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `groq` from 0.18.0 to 0.20.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/releases">groq's
releases</a>.</em></p>
<blockquote>
<h2>v0.20.0</h2>
<h2>0.20.0 (2025-03-19)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.19.0...v0.20.0">v0.19.0...v0.20.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add speech endpoint (<a
href="https://redirect.github.com/groq/groq-python/issues/219">#219</a>)
(<a
href="f150801968">f150801</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/218">#218</a>)
(<a
href="c124862e24">c124862</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/220">#220</a>)
(<a
href="f4eeb8d8be">f4eeb8d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/groq/groq-python/issues/216">#216</a>)
(<a
href="085166c129">085166c</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/groq/groq-python/issues/217">#217</a>)
(<a
href="fb579e87a3">fb579e8</a>)</li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/groq/groq-python/issues/215">#215</a>)
(<a
href="5c72e94d51">5c72e94</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bump rye to 0.44.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/214">#214</a>)
(<a
href="66feae21c5">66feae2</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/213">#213</a>)
(<a
href="7a1627444b">7a16274</a>)</li>
<li><strong>internal:</strong> remove extra empty newlines (<a
href="https://redirect.github.com/groq/groq-python/issues/211">#211</a>)
(<a
href="4187fa110f">4187fa1</a>)</li>
</ul>
<h2>v0.19.0</h2>
<h2>0.19.0 (2025-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.19.0">v0.18.0...v0.19.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="https://redirect.github.com/groq/groq-python/issues/209">#209</a>)
(<a
href="15e2dca833">15e2dca</a>)</li>
<li><strong>client:</strong> allow passing <code>NotGiven</code> for
body (<a
href="https://redirect.github.com/groq/groq-python/issues/200">#200</a>)
(<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li><strong>client:</strong> send <code>X-Stainless-Read-Timeout</code>
header (<a
href="https://redirect.github.com/groq/groq-python/issues/193">#193</a>)
(<a
href="e8911a43d6">e8911a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add reasoning field to ChoiceDelta class (<a
href="edfee3b6c5">edfee3b</a>)</li>
<li>asyncify on non-asyncio runtimes (<a
href="https://redirect.github.com/groq/groq-python/issues/198">#198</a>)
(<a
href="49387fe83c">49387fe</a>)</li>
<li><strong>client:</strong> mark some request bodies as optional (<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="662763a5ea">662763a</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="5298ec1a8c">5298ec1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> remove chat_completion_chunk to force a
rebuild of it (<a
href="https://redirect.github.com/groq/groq-python/issues/208">#208</a>)
(<a
href="01fb0d14e4">01fb0d1</a>)</li>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/groq/groq-python/issues/204">#204</a>)
(<a
href="a0f45996ff">a0f4599</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/blob/main/CHANGELOG.md">groq's
changelog</a>.</em></p>
<blockquote>
<h2>0.20.0 (2025-03-19)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.19.0...v0.20.0">v0.19.0...v0.20.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add speech endpoint (<a
href="https://redirect.github.com/groq/groq-python/issues/219">#219</a>)
(<a
href="f150801968">f150801</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/218">#218</a>)
(<a
href="c124862e24">c124862</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/220">#220</a>)
(<a
href="f4eeb8d8be">f4eeb8d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/groq/groq-python/issues/216">#216</a>)
(<a
href="085166c129">085166c</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/groq/groq-python/issues/217">#217</a>)
(<a
href="fb579e87a3">fb579e8</a>)</li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/groq/groq-python/issues/215">#215</a>)
(<a
href="5c72e94d51">5c72e94</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bump rye to 0.44.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/214">#214</a>)
(<a
href="66feae21c5">66feae2</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/213">#213</a>)
(<a
href="7a1627444b">7a16274</a>)</li>
<li><strong>internal:</strong> remove extra empty newlines (<a
href="https://redirect.github.com/groq/groq-python/issues/211">#211</a>)
(<a
href="4187fa110f">4187fa1</a>)</li>
</ul>
<h2>0.19.0 (2025-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.19.0">v0.18.0...v0.19.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="https://redirect.github.com/groq/groq-python/issues/209">#209</a>)
(<a
href="15e2dca833">15e2dca</a>)</li>
<li><strong>client:</strong> allow passing <code>NotGiven</code> for
body (<a
href="https://redirect.github.com/groq/groq-python/issues/200">#200</a>)
(<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li><strong>client:</strong> send <code>X-Stainless-Read-Timeout</code>
header (<a
href="https://redirect.github.com/groq/groq-python/issues/193">#193</a>)
(<a
href="e8911a43d6">e8911a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add reasoning field to ChoiceDelta class (<a
href="edfee3b6c5">edfee3b</a>)</li>
<li>asyncify on non-asyncio runtimes (<a
href="https://redirect.github.com/groq/groq-python/issues/198">#198</a>)
(<a
href="49387fe83c">49387fe</a>)</li>
<li><strong>client:</strong> mark some request bodies as optional (<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="662763a5ea">662763a</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="5298ec1a8c">5298ec1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> remove chat_completion_chunk to force a
rebuild of it (<a
href="https://redirect.github.com/groq/groq-python/issues/208">#208</a>)
(<a
href="01fb0d14e4">01fb0d1</a>)</li>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/groq/groq-python/issues/204">#204</a>)
(<a
href="a0f45996ff">a0f4599</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/199">#199</a>)
(<a
href="de2ac71d68">de2ac71</a>)</li>
<li><strong>internal:</strong> fix devcontainers setup (<a
href="https://redirect.github.com/groq/groq-python/issues/201">#201</a>)
(<a
href="af101ee282">af101ee</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9f14aacde8"><code>9f14aac</code></a>
release: 0.20.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/212">#212</a>)</li>
<li><a
href="90be0841aa"><code>90be084</code></a>
release: 0.19.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/194">#194</a>)</li>
<li><a
href="662763a5ea"><code>662763a</code></a>
fix: GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci]</li>
<li><a
href="5298ec1a8c"><code>5298ec1</code></a>
fix: GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci]</li>
<li>See full diff in <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.20.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `jinja2` from 3.1.5 to 3.1.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/releases">jinja2's
releases</a>.</em></p>
<blockquote>
<h2>3.1.6</h2>
<p>This is the Jinja 3.1.6 security release, which fixes security issues
but does not otherwise change behavior and should not result in breaking
changes compared to the latest feature release.</p>
<p>PyPI: <a
href="https://pypi.org/project/Jinja2/3.1.6/">https://pypi.org/project/Jinja2/3.1.6/</a>
Changes: <a
href="https://jinja.palletsprojects.com/en/stable/changes/#version-3-1-6">https://jinja.palletsprojects.com/en/stable/changes/#version-3-1-6</a></p>
<ul>
<li>The <code>|attr</code> filter does not bypass the environment's
attribute lookup, allowing the sandbox to apply its checks. <a
href="https://github.com/pallets/jinja/security/advisories/GHSA-cpwx-vrp4-4pq7">https://github.com/pallets/jinja/security/advisories/GHSA-cpwx-vrp4-4pq7</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/blob/main/CHANGES.rst">jinja2's
changelog</a>.</em></p>
<blockquote>
<h2>Version 3.1.6</h2>
<p>Released 2025-03-05</p>
<ul>
<li>The <code>|attr</code> filter does not bypass the environment's
attribute lookup,
allowing the sandbox to apply its checks.
:ghsa:<code>cpwx-vrp4-4pq7</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="15206881c0"><code>1520688</code></a>
release version 3.1.6</li>
<li><a
href="90457bbf33"><code>90457bb</code></a>
Merge commit from fork</li>
<li><a
href="065334d1ee"><code>065334d</code></a>
attr filter uses env.getattr</li>
<li><a
href="033c20015c"><code>033c200</code></a>
start version 3.1.6</li>
<li><a
href="bc68d4efa9"><code>bc68d4e</code></a>
use global contributing guide (<a
href="https://redirect.github.com/pallets/jinja/issues/2070">#2070</a>)</li>
<li><a
href="247de5e0c5"><code>247de5e</code></a>
use global contributing guide</li>
<li><a
href="ab8218c7a1"><code>ab8218c</code></a>
use project advisory link instead of global</li>
<li><a
href="b4ffc8ff29"><code>b4ffc8f</code></a>
release version 3.1.5 (<a
href="https://redirect.github.com/pallets/jinja/issues/2066">#2066</a>)</li>
<li>See full diff in <a
href="https://github.com/pallets/jinja/compare/3.1.5...3.1.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `launchdarkly-server-sdk` from 9.9.0 to 9.10.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/python-server-sdk/releases">launchdarkly-server-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v9.10.0</h2>
<h2><a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">9.10.0</a>
(2025-03-13)</h2>
<h3>Features</h3>
<ul>
<li>Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)
(<a
href="ecfd56cc91">ecfd56c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/python-server-sdk/blob/main/CHANGELOG.md">launchdarkly-server-sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">9.10.0</a>
(2025-03-13)</h2>
<h3>Features</h3>
<ul>
<li>Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)
(<a
href="ecfd56cc91">ecfd56c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b7145ea004"><code>b7145ea</code></a>
chore(main): release 9.10.0 (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/328">#328</a>)</li>
<li><a
href="ecfd56cc91"><code>ecfd56c</code></a>
feat: Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)</li>
<li>See full diff in <a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `mem0ai` from 0.1.48 to 0.1.80
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mem0ai/mem0/releases">mem0ai's
releases</a>.</em></p>
<blockquote>
<h2>0.1.80</h2>
<h2>What's Changed</h2>
<ul>
<li>[Feature] Add support for hybrid search for pinecone vector database
by <a href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/embedchain/embedchain/pull/1259">embedchain/embedchain#1259</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/embedchain/embedchain/compare/0.1.79...0.1.80">https://github.com/embedchain/embedchain/compare/0.1.79...0.1.80</a></p>
<h2>v0.1.80</h2>
<h2>What's Changed</h2>
<ul>
<li>Update for faiss doc by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2464">mem0ai/mem0#2464</a></li>
<li>Add support for procedural memory by <a
href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2460">mem0ai/mem0#2460</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/mem0ai/mem0/compare/v0.1.79...v0.1.80">https://github.com/mem0ai/mem0/compare/v0.1.79...v0.1.80</a></p>
<h2>0.1.79</h2>
<h2>What's Changed</h2>
<ul>
<li>[Bug fix] Fix vertex ai integration issue by <a
href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/embedchain/embedchain/pull/1257">embedchain/embedchain#1257</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/embedchain/embedchain/compare/0.1.78...0.1.79">https://github.com/embedchain/embedchain/compare/0.1.78...0.1.79</a></p>
<h2>v0.1.79</h2>
<h2>What's Changed</h2>
<ul>
<li>update changelog by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2462">mem0ai/mem0#2462</a></li>
<li>bump version -&gt; 0.1.79 by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2463">mem0ai/mem0#2...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-01 22:55:58 +00:00
dependabot[bot]
1b3c465f0d chore(backend/deps): bump psutil from 6.1.1 to 7.0.0 in /autogpt_platform/backend (#9686)
Bumps [psutil](https://github.com/giampaolo/psutil) from 6.1.1 to 7.0.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst">psutil's
changelog</a>.</em></p>
<blockquote>
<h1>7.0.0</h1>
<p>2025-02-13</p>
<p><strong>Enhancements</strong></p>
<ul>
<li>669_, [Windows]: <code>net_if_addrs()</code>_ also returns the
<code>broadcast</code> address
instead of <code>None</code>.</li>
<li>2480_: Python 2.7 is no longer supported. Latest version supporting
Python
2.7 is psutil 6.1.X. Install it with: <code>pip2 install
psutil==6.1.*</code>.</li>
<li>2490_: removed long deprecated <code>Process.memory_info_ex()</code>
method. It was
deprecated in psutil 4.0.0, released 8 years ago. Substitute is
<code>Process.memory_full_info()</code>.</li>
</ul>
<p><strong>Bug fixes</strong></p>
<ul>
<li>2496_, [Linux]: Avoid segfault (a cPython bug) on
<code>Process.memory_maps()</code>
for processes that use hundreds of GBs of memory.</li>
<li>2502_, [macOS]: <code>virtual_memory()</code>_ now relies on
<code>host_statistics64</code>
instead of <code>host_statistics</code>. This is the same approach used
by <code>vm_stat</code>
CLI tool, and should grant more accurate results.</li>
</ul>
<p><strong>Compatibility notes</strong></p>
<ul>
<li>2480_: Python 2.7 is no longer supported.</li>
<li>2490_: removed long deprecated <code>Process.memory_info_ex()</code>
method.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ea5b55605f"><code>ea5b556</code></a>
pre-release</li>
<li><a
href="d6e28b7a83"><code>d6e28b7</code></a>
try to fix tests</li>
<li><a
href="104bb3228b"><code>104bb32</code></a>
test cpu_times() for process children</li>
<li><a
href="16c091b380"><code>16c091b</code></a>
test cpu_times() for process children</li>
<li><a
href="eee09da72a"><code>eee09da</code></a>
[OSX] proc.c: Fix goo.gl link in comment for source reference (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2505">#2505</a>)</li>
<li><a
href="17e27801e6"><code>17e2780</code></a>
ci: build aarch64 wheel on GHA aarch64 runner (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2503">#2503</a>)</li>
<li><a
href="1ba8667c89"><code>1ba8667</code></a>
pin black version to 24.X, because new 25.X breaks style</li>
<li><a
href="9c114a5137"><code>9c114a5</code></a>
[OSX] use <code>host_statistics64</code> to get memory metrics (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2502">#2502</a>)</li>
<li><a
href="08d7d43894"><code>08d7d43</code></a>
pin black version to 24.X, because new 25.X breaks style</li>
<li><a
href="a509e5aa18"><code>a509e5a</code></a>
669 windows broadcast addr (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2501">#2501</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/giampaolo/psutil/compare/release-6.1.1...release-7.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=psutil&package-manager=pip&previous-version=6.1.1&new-version=7.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-01 21:49:47 +00:00
Nicholas Tindle
f23b7543b3 feat: different signup error message (#9704)
<!-- Clearly explain the need for these changes: -->

We keep showing local users error messages that are just not relevant

### Changes 🏗️
Swaps the error messaging logic to be dependent on the behavior of the
specific platform they are on
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test with auth container down (simulates incorrect setup) and
validate that error message is shown
  - [x] Try normal path
2025-04-01 20:23:23 +00:00
Zamil Majdy
77b18b00c7 feat(frontend): Implement UI for Agent Input subtypes (#9700)
- Follow-up to #9657

<img width="280" alt="image"
src="https://github.com/user-attachments/assets/2f3cd683-db63-485f-8914-5654c34f1a4c"
/>

<img width="520" alt="image"
src="https://github.com/user-attachments/assets/de7e7cb9-61d4-4071-aea8-393ff5200c54"
/>

### Changes 🏗️

* Implement the input UI for Agent Input subtypes.
* Refactor node-input-component, extra out data type decision logic,
share it with runner/library input.
* Add `format` field for short-text, long-text, and mediafile type.
* Unify UI data type enum.

Out of scope:
- Styling for these inputs.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Use all the available agent input subtypes in an agent and run it

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-04-01 20:21:46 +00:00
Abhimanyu Yadav
dbb85baf4c fix(frontend): Fix date picker ux (#9715)
- fix #9315

What have I changed?

- Allowed the user to select the month and year using a dropdown.
- Removed the "Prev" and "Next" buttons for month navigation.
- Fixed the "Today" date design.

<img width="847" alt="Screenshot 2025-03-28 at 6 28 20 PM"
src="https://github.com/user-attachments/assets/740bddfd-e0a2-4799-8325-d52dec31a512"
/>

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-01 08:42:04 +00:00
Abhimanyu Yadav
7440f71527 fix(frontend): Sort agents by last edited date in publish dialog (#9724)
- fix #9189 

Currently, the list of agents on the "Publish Agent" dialog is random. I
have sorted them so that the latest edited ones appear first, similar to
the library page.

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-01 03:26:07 +00:00
Abhimanyu Yadav
c6089bb6a6 fix(frontend): Remove animation from search bar on library agent page (#9707)
- fix #9523 

Removing the animation from the input search bar and adding the same
behavior as the Google search bar.

![Screenshot 2025-03-28 at 10 20
57 AM](https://github.com/user-attachments/assets/cee009e9-3a81-41b1-9023-503aa040fee4)

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-03-31 12:57:37 +00:00
Abhimanyu Yadav
c71d06a082 fix(frontend): Add extra padding bottom on library agent page (#9706)
- fix #9705 

Adding extra padding so the banner doesn’t cut below the cards.

![Screenshot 2025-03-28 at 9 30
49 AM](https://github.com/user-attachments/assets/d1990dda-4d16-430b-823c-a6338e57d99c)

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-03-31 12:57:19 +00:00
Reinier van der Leer
babcb41f43 refactor(libs): Remove print statements (#9718)
Remove the debug print statements in the logging module.

Every time an app process is started, it prints:
```
Console logging enabled
```
or similar, depending on the logging config.
2025-03-31 10:46:06 +00:00
Reinier van der Leer
abcacacc06 fix(ci): Update lockfiles 2025-03-31 12:16:37 +02:00
Reinier van der Leer
1f2af18388 feat(platform/library): Real-time execution updates (#9695)
- Resolves #8782

### Changes 🏗️

- feat(frontend/library): Use WS subscription to get real-time execution
updates
- feat(backend/ws_api): Send `GraphExecutionUpdate` on all new agent I/O
- Include agent I/O in `GraphExecutionUpdate` (by subclassing
`GraphExecution`)
    - Add `IO_BLOCK_IDs` to `.blocks.io`
- feat(backend/ws_api): Add `subscribe_graph_executions` method to
WebSocket API

- feat(backend): Withhold `GraphExecution.node_executions` from requests
by non-graph-owners
  - Split `GraphExecutionWithNodes` off of `GraphExecution`
- Use `GraphExecution` as much as possible, as it's a much cheaper query
than `GraphExecutionWithNodes`
  - refactor(frontend): Make `GraphExecution.node_executions` optional

- fix(frontend): Parse dates in responses of `/executions` and
`/graphs/{graph_id}/executions`

- refactor(frontend/library): Move sorting logic for agent runs list
from `AgentRunsPage` to `AgentRunsSelectorList`

- refactor(backend/ws_api): Clean up message handler implementations

- refactor(backend/tests): Use `.data.execution.get_graph_execution(..)`
directly instead of `AgentServer.test_get_graph_run_results(..)`

Out-of-scope changes:
- refactor(backend): Remove unnecessary query include from
`.data.graph.get_graph_metadata(..)`

Demo:


https://github.com/user-attachments/assets/8ea6225d-7334-49cb-a522-83f153d840da

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]` for an agent with inputs and outputs
    - Draft and run a new run
      - [x] -> should appear in the list of runs at the top
      - [x] -> should be selected as soon as the request finishes
      - [x] -> new I/O should appear as it is generated
- [x] -> status should be updated in real-time (both in list and in
adjacent details view)
    - Click "Run again"
      - [x] -> should appear in the list of runs at the top
      - [x] -> should be selected as soon as the request finishes
      - [x] -> new I/O should appear as it is generated
- [x] -> status should be updated in real-time (both in list and in
adjacent details view)
- Click "Open in builder" under "Agent actions"; run the agent from the
builder
      - [x] -> should work the same as before
        - [x] -> node I/O should appear in real-time
        - [x] -> node execution statuses should update in real-time
2025-03-28 12:19:14 +00:00
Swifty
8974a0f9e5 fix(platform): Fixs to allow formatting and tests to work from sub command (#9703)
This pull request includes several changes to improve the backend
functionality and configuration of the `autogpt_platform`. The most
important changes involve adding a RabbitMQ service for testing,
enhancing logging configuration, updating the linter script to handle
errors gracefully, and modifying test configurations.

Backend configuration improvements:

*
[`autogpt_platform/backend/docker-compose.test.yaml`](diffhunk://#diff-f6a211ff1c6d96d19adb5641ee287258a6af8d72a99e33dafb4a334094205a43R29-R43):
Added RabbitMQ service configuration for testing, including health
checks and environment variables.
*
[`autogpt_platform/backend/.env.example`](diffhunk://#diff-62020caf1b9a15e0e3b9b3b1b69d5f6464bf7643f62354cbbaabf755d57b6064R191-R192):
Added a section delimiter for optional API keys for use in finding the
optional keys end when auto generating integrations.

Error handling and logging enhancements:

*
[`autogpt_platform/backend/linter.py`](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991R3):
Updated the `run` function to handle `subprocess.CalledProcessError`
exceptions and print error output to `stderr` and prevent raising a
stack trace when it should not.
[[1]](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991R3)
[[2]](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991L13-R23)

Testing configuration updates:

*
[`autogpt_platform/backend/pyproject.toml`](diffhunk://#diff-26ebebd91da791c6484f07d9d91484a66f52836708f5294b24365603438b880cR111):
Added `asyncio_default_fixture_loop_scope` to pytest configuration for
better control over asyncio fixtures.
*
[`autogpt_platform/backend/run_tests.py`](diffhunk://#diff-f09930577243a4ef5213bf6191a3c500a4b8d3dcfee2d4b452cf7ce66b3c494fL55):
Removed the `postgres-test` service from the test setup script as we
need all of docker services up for the tests to run.
2025-03-28 09:39:43 +01:00
Zamil Majdy
071ae3cb1f feat(backend): Make agent store data to be publicly accessible by non authenticated user (#9710)
This PR publicly exposes all the agents listed in the store to the
internet.

### Changes 🏗️

Remove the auth requirement for an agent to download the agent.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Accessing
`http://localhost:8006/api/store/download/agents/{agentId}` without
authorization key.
2025-03-28 07:11:48 +00:00
Zamil Majdy
c6703dd891 fix(backend): Skip updating status of already terminated graph (#9696)
When we are cancelling a running graph execution, it's possible that the
graph is already terminated.
We need to allow this process to proceed and update the rest of its node
execution to terminate.

### Changes 🏗️

Instead of erroring out the graph execution status update, we proceed on
updating the node execution status.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Stop an already terminated graph
2025-03-26 04:19:37 +00:00
Reinier van der Leer
6e0af09c3d Merge branch 'master' into dev 2025-03-25 17:00:53 +01:00
Reinier van der Leer
9077323b89 fix(backend): Filter Redis messages by user ID (#9697) 2025-03-25 16:56:16 +01:00
Zamil Majdy
33299070d3 feat(frontend/library): Add toast on agent execution request failure (#9689)
Currently, when an agent execution fails to be executed, the front-end
does not display any feedback to the user.
The scope of this change is providing that.

### Changes 🏗️

* Extracted `useToastOnFail` from `credits` page into a unified helper
method.
* Uses `useToastOnFail` on agent execution requests on library pages.

<img width="1000" alt="image"
src="https://github.com/user-attachments/assets/2daa0597-eb93-457d-8887-0f00c4db89ac"
/>
<img width="1000" alt="image"
src="https://github.com/user-attachments/assets/1a541c98-fb95-424f-8ffe-972332b3ce01"
/>


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agent with invalid input 

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-25 13:51:17 +00:00
Reinier van der Leer
87f87500cb refactor(backend): Improve error message on unmatched webhook ingress (#9694)
- Resolves #9693

### Changes 🏗️

- Catch the DB error and log a descriptive error message
- Add `NotFoundError` to `backend.util.exceptions`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] ~~I have tested my changes according to the test plan:~~
- Low-stakes change, high effort to test: we'll see if it works from the
production logs
2025-03-25 13:36:37 +00:00
Reinier van der Leer
1162ec1474 refactor(backend): Reorganize & clean up execution update system (#9663)
- Prep work for #8782
- Prep work for #8779

### Changes 🏗️

- refactor(platform): Differentiate graph/node execution events
- fix(platform): Subscribe to execution updates by `graph_exec_id`
instead of `graph_id`+`graph_version`
- refactor(backend): Move all execution related models and functions
from `.data.graph` to `.data.execution`
- refactor(backend): Reorganize & refactor `.data.execution`

- fix(libs): Remove `load_dotenv` in `.auth.config` to fix test config
issues
- dx: Bump version of `black` in pre-commit config to v24.10.0 to match
poetry.lock

- Other minor refactoring in both frontend and backend

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Run an agent in the builder
    - [x] -> works normally, node I/O is updated in real time
  - Run an agent in the library
    - [x] -> works normally

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-25 13:14:04 +01:00
Krzysztof Czerwinski
37f212e950 Stop migrating models 2025-03-25 11:46:00 +00:00
Krzysztof Czerwinski
58bb4f92b7 feat(platform): Onboarding updates (#9636)
This is a follow up to
https://github.com/Significant-Gravitas/AutoGPT/pull/9511 fixing some
issues and updating onboarding.

### Changes 🏗️

- Update `UserOnboarding` data
  - Update schema and add migration
- Change `step` in `UserOnboarding` to `completedSteps` array with
`OnboardingStep` enum
- Remove `isCompleted`: this is now inferred from `completedSteps`
values
- Don't onboard if <2 marketplace agents; that prevents self-host
onboarding
- Add endpoints:
- `is_onboarding_enabled`: to check if users should be onboarded (not if
they finished onboarding); now check if there are at least 2 marketplace
agents
- `get_store_agent`: returns `StoreAgentDetails` for given
`store_listing_version_id`
  - `get_graph_meta_by_store_listing_version_id`: returns `GraphMeta`
- Add agent to Library just before running it and not when chosen and
remove code that was responsible for removing agent that wasn't run
- Move onboarding to `OnboardingProvider` (it'll be needed globally for
Phase 2)
- Multiple fixes, renames for clarity

### Checklist 📋

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Don't onboard if less than 2 marketplace agents
  - [x] Avoid non-input and credentials agents
  - [x] Onboarding works and can be finished
  - [x] Onboarding resumes
  - [x] Onboarding agent runs correctly

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-25 10:40:40 +00:00
Krzysztof Czerwinski
b7ca8d9c30 feat(backend): Migrate old models in existing agents (#9452)
Some existing nodes use models that no longer exist as values on
`LlmModel` enum.

### Changes 🏗️

- Update models for all blocks with `LlmModel` fields that do not exist
in `LlmModel` enum to `gpt-4o`, directly in `AgentNode->constantInput`
db column, on server startup

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Updates wrong models to `gpt-4o` for all affected `AgentNode`s
  - [x] Doesn't update correct models
  - [x] Doesn't insert model when unnecessary
  - [x] Doesn't break other values in jsonb
2025-03-25 09:38:11 +00:00
Zamil Majdy
66ebe4376e fix(backend): Increase block request security; Prevent DNS rebinding & open redirect attack (#9688)
The current block web requests utility has a logic to avoid the system
firing into blocklisted IPs.
However, the current logic is still prone to a few security issues:

* DNS rebinding attack: due to the lack of guarantee on the used IP not
being changed during the IP checking and firing step.
* Open redirect: due to the request sensitive request headers are still
being propagated throughout the web redirect.

### Changes 🏗️

* Uses IP pinning to request the web.
* Strip `Authorization`, `Proxy-Authorization`, `Cookie` upon web
redirects.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Test the web request block, add more tests with different
validation scenarios.

(cherry picked from commit f0df4c9174)
2025-03-25 13:51:20 +07:00
Zamil Majdy
f0df4c9174 fix(backend): Increase block request security; Prevent DNS rebinding & open redirect attack (#9688)
The current block web requests utility has a logic to avoid the system
firing into blocklisted IPs.
However, the current logic is still prone to a few security issues:

* DNS rebinding attack: due to the lack of guarantee on the used IP not
being changed during the IP checking and firing step.
* Open redirect: due to the request sensitive request headers are still
being propagated throughout the web redirect.

### Changes 🏗️

* Uses IP pinning to request the web.
* Strip `Authorization`, `Proxy-Authorization`, `Cookie` upon web
redirects.


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Test the web request block, add more tests with different
validation scenarios.
2025-03-25 13:09:47 +07:00
Toran Bruce Richards
2e9ca70ce2 Update CONTRIBUTING.md 2025-03-24 18:11:56 +00:00
Reinier van der Leer
4ca1a453c9 refactor(backend): Defer loading of .blocks and .integrations.webhooks on module init (#9664)
Currently, an import statement like `from backend.blocks.basic import
AgentInputBlock` will initialize `backend.blocks` and thereby load all
other blocks. This has quite high potential to cause circular import
issues, and it's bad for performance in cases where we don't want to
load all blocks (yet).
The same goes for `backend.integrations.webhooks`.

### Changes 🏗️

- Change `__init__.py` of `backend.blocks` and
`backend.integrations.webhooks` to cached loader functions rather than
init-time code
- Change type of `BlockWebhookConfig.provider` to `ProviderName`

<!-- test edit to check that this doesn't break anything -->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Set up and use an agent with a webhook-triggered block

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-24 15:44:45 +00:00
Zamil Majdy
6f48515863 fix(blocks): Disable and provide toggle for Agent Input Block subtypes (#9677)
Agent Input Block subtypes do not have a proper input UI yet on the
library & run input page.

### Changes 🏗️

Provide a toggle to enable these blocks and set it to False by default.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-24 12:33:54 +00:00
Nicholas Tindle
7ba566e768 feat(frontend/backend): admin agent review table (#9634)
<!-- Clearly explain the need for these changes: -->
We need an admin agent approval UI for handling the submissions to the
marketplace

### Changes 🏗️
- Adds routes to the admin routes list
- Fixes the db query for submitting new versions of existing agents
- Add models for responses that include version details
- add the admin pages for agent
- Adds the Admin Agent Data Table
- Add all the new endpoints to the client.ts
Models changes
- convert the Submission status to an enum
- remove is_approved from models which was left incorrectly
- Add StoreListingWithVersions
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the admin dashboard for
    - [x] Reject
    - [x] Accept
    - [x] Updating listing
    - [x] More version submissions

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-24 07:52:35 +00:00
Zamil Majdy
26984a7338 feat(backend): Add capability to charge based on block execution count (#9661)
Blocks that are not defined in the block cost are pretty much free. The
lack of cost control makes it hard to control its quota. The scope of
this change is providing a way to charge any executions based on the
number of block being executed in real-time.

### Changes 🏗️

* Add execution charge logic based on the number of blocks executed,
controlled by these two configurations:
* `execution_cost_count_threshold`: We will charge the execution based
on the multiple of this number.
* `execution_cost_per_threshold`: The amount we are charging on its
threshold multiple.
* Make charging logic on the graph execution logic (as opposed to node
level) so it's being done serially and insufficient fund error is
guaranteed to stop the graph execution.
* Moved cost calculation logic into backend/executor/util.py

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Execute graph with configured threshold & cost and test the
balance being deducted on that.
  - [x] Existing cost calculation is still being done without any issue.
  - [x] Low balance stop the whole graph execution.
2025-03-24 07:26:33 +00:00
Zamil Majdy
5b118fc939 fix(blocks): Fix failing block test AgentToggleInputBlock 2025-03-24 12:31:16 +07:00
Zamil Majdy
ed48d1c04f fix(blocks): Change title of placeholder_values on AgentDropdownInputBlock 2025-03-24 12:21:20 +07:00
Zamil Majdy
8d87c08b8c fix(blocks): Set AgentInputBlocks default value to None and make it a non-advance field 2025-03-24 12:15:59 +07:00
Zamil Majdy
e49cb43b49 feat(block): Add agent input block subtypes (#9657)
### Changes 🏗️

Added these types of input blocks:
* TextShort
* TextLong
* Number
* Date
* Time
* FileUpload
* Dropdown
* Toggle

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Test in respective block codes.
2025-03-24 02:57:10 +00:00
Nicholas Tindle
56663c5fe9 feat(backend): add backend support for store listings submissions (#9628)
<!-- Clearly explain the need for these changes: -->
The store listing and submissions were previously just a best guess
without much implementation. This updates the database models and
queries and such to be based on discussion around what the process
should look like. It also adds and update the relevant routers for this
change

### Changes 🏗️
Store Listing
- change isApproved to hasApprovedVersion
- Move slug into store listing
- mark an active version in store listing

Store Version
- Move submissions into version
- make name optional
- have state transition timestamps for submitted and approved/rejected
- added a changes field
- added internal comments and clarified review comments field

SubmissionStatus
- Fixed DAFT to DRAFT

StoreListingSubmission
- Dropped table

Graph
- Used more modern format for the params for prisma -- no other changes

Added migrations for all the model movements

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Use the store codepaths from the release testplan doc as the test
plan (claude I can't publish the testplan but I am a maintainer lol,
trust me here my guy, you're supposed to be lenient)
  - [x] Check the db is used as appropriate following the rules

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-23 23:30:54 +00:00
Nicholas Tindle
a537fd0891 [Snyk] Security upgrade next from 14.2.23 to 14.2.25 (#9672)
![snyk-top-banner](https://redirect.github.com/andygongea/OWASP-Benchmark/assets/818805/c518c423-16fe-447e-b67f-ad5a49b5d123)

### Snyk has created this PR to fix 1 vulnerabilities in the yarn
dependencies of this project.

#### Snyk changed the following file(s):

- `autogpt_platform/frontend/package.json`
- `autogpt_platform/frontend/yarn.lock`


#### Note for
[zero-installs](https://yarnpkg.com/features/zero-installs) users

If you are using the Yarn feature
[zero-installs](https://yarnpkg.com/features/zero-installs) that was
introduced in Yarn V2, note that this PR does not update the
`.yarn/cache/` directory meaning this code cannot be pulled and
immediately developed on as one would expect for a zero-install project
- you will need to run `yarn` to update the contents of the
`./yarn/cache` directory.
If you are not using zero-install you can ignore this as your flow
should likely be unchanged.




#### Vulnerabilities that will be fixed with an upgrade:

|  | Issue | Score | 

:-------------------------:|:-------------------------|:-------------------------
![critical
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/c.png
'critical severity') | Improper Authorization
<br/>[SNYK-JS-NEXT-9508709](https://snyk.io/vuln/SNYK-JS-NEXT-9508709) |
&nbsp;&nbsp;**751**&nbsp;&nbsp;




---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - Max score is 1000. Note that the real score may have changed since
the PR was raised.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs._

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI5NGUwNmYxNy0yY2NkLTQ3NzEtOTk2NC1kN2JmYzhiNTI2NTgiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6Ijk0ZTA2ZjE3LTJjY2QtNDc3MS05OTY0LWQ3YmZjOGI1MjY1OCJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)
📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=github&utm_content=fix-pr-template)
🛠 [Adjust project
settings](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)
📚 [Read about Snyk's upgrade
logic](https://docs.snyk.io/scan-with-snyk/snyk-open-source/manage-vulnerabilities/upgrade-package-versions-to-fix-vulnerabilities?utm_source=github&utm_content=fix-pr-template)

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Improper
Authorization](https://learn.snyk.io/lesson/broken-function-level-authorization/?loc&#x3D;fix-pr)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"next","from":"14.2.23","to":"14.2.25"}],"env":"prod","issuesToFix":["SNYK-JS-NEXT-9508709"],"prId":"94e06f17-2ccd-4771-9964-d7bfc8b52658","prPublicId":"94e06f17-2ccd-4771-9964-d7bfc8b52658","packageManager":"yarn","priorityScoreList":[751],"projectPublicId":"3d924968-0cf3-4767-9609-501fa4962856","projectUrl":"https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source=github&utm_medium=referral&page=fix-pr","prType":"fix","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":["updated-fix-title","priorityScore"],"type":"auto","upgrade":["SNYK-JS-NEXT-9508709"],"vulns":["SNYK-JS-NEXT-9508709"],"patch":[],"isBreakingChange":false,"remediationStrategy":"vuln"}'

Co-authored-by: snyk-bot <snyk-bot@snyk.io>
2025-03-23 23:09:47 +00:00
Krzysztof Czerwinski
d694ccd50f fix(frontend): Fill defaults from schema to hardcodedValues at node creation (#9632)
Defaults need to be handled as special cases every time there's no
`hardcodedValues` in node data. This causes multiple issues such as
`useCredentials` not taking into account default model and requiring
user to manually switch model back and forth.

### Changes 🏗️

- Set default values from `inputSchema` to `hardcodedValues` when new
node is placed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Newly placed node has defaults set as `hardcodedValues`
- [x] AI Blocks: Model is recognised, node shows price and credentials
work correctly without the need to switch

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-23 22:48:28 +00:00
Zamil Majdy
f01b31873f feat(backend): Avoid loading all node executions on large continuos agent (#9667)
A graph that processes tens of thousands of nodes will cripple the
system since the API tries to load all of them and dump them into the
browser. The scope of this change is to avoid such an issue by only
returning the last 1000 node executions.

### Changes 🏗️

* Return only 1000 node executions from `AgentNodeExecutions` reference.
* Unify the include clause for fetching `AgentNodeExecutions` in one
place and its format.
* Fix & optimize `cancel_execution` logic to always set both the graph &
node execution status in batch.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Execute a graph in a loop that executes 10000 nodes, it should
only display the last 1000 nodes when refreshed. Cancelling the graph
should also not cripple the server.
2025-03-21 12:48:35 +00:00
Zamil Majdy
5411e18bd0 feat(backend): Mark starting nodes as QUEUED instead of INCOMPLETE during the initial execution (#9665)
Having the starting nodes of the execution marked as incomplete misled
the users.

### Changes 🏗️

Mark the starting nodes during the executions as QUEUED instead of
INCOMPLETE.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Executed the graph, the incomplete initial starting node is no
more.
2025-03-21 11:59:27 +00:00
Zamil Majdy
b85f6196aa fix(frontend): Fix unreliable websocket connection for node execution update (#9666)
The current execution update is unreliable, once you lose WebSocket
connection, you will receive no updates.

### Changes 🏗️

Fix web socket re-connection logic.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Run the app and execute an agent, then restart the API server, and
re-execute the app without refreshing the page.
2025-03-21 11:50:20 +00:00
Zamil Majdy
a1ac7b18f9 feat(backend): Avoid connecting the same host and falling-back to defined api_host (#9668)
### Changes 🏗️

Avoid connecting the same host and falling-back to defined api_host.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
- [ ] Define a custom DBMANAGER_HOST, RestService should access the
`db_manager` service using localhost.
2025-03-21 11:41:01 +00:00
Zamil Majdy
42232f55e8 feat(platform): Use a single DB manager across the system (#9662)
DB Manager uses DB connections, and multiple instances of it hog the
very limited Database connection quota. We need this service to be a
unified place to control the limited db connection.

### Changes 🏗️

Connect all the database manager usage in a single place, currently
running on the rest service.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-21 09:24:08 +00:00
Reinier van der Leer
9a661b5101 fix(backend/ws): Add user_id to websocket event subscription key (#9660)
- Add `user_id` to WS subscription key
- Add error catching to WS message handler
2025-03-20 17:54:04 +01:00
Zamil Majdy
90b147ff51 Merge branch 'dev' of github.com:Significant-Gravitas/AutoGPT into dev 2025-03-19 23:39:51 +07:00
Reinier van der Leer
6e4fbb0cb5 fix(frontend/library): Truncate agent card title and description (#9658)
- Resolves #9631

### Changes 🏗️

- Truncate library agent card title (2 lines) and description (3 lines)
- Make "See runs" and "Open in builder" stick to bottom of card
regardless of other content
- Reduce number of grid columns (4 -> 3) in `lg` layout on `/library` to
give items more horizontal space

![screenshot of library agent grid with the applied
changes](https://github.com/user-attachments/assets/b27d5c97-33b8-4708-9f8c-fc67aad899c9)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Visually test the changes made on different screen sizes
2025-03-19 23:39:09 +07:00
Reinier van der Leer
df6203343d fix(frontend/library): Improve agent I/O rendering (#9656)
- Related to #8784

### Changes 🏗️

- feat(frontend/library): Improve agent output styling & fix content
overflow issue
- fix(frontend/library): Fix overlap between content and inset button of
expandable input fields (#9650)
- fix(backend): Unbreak loading graph executions with missing inputs

![screenshot of restyled Output
section](https://github.com/user-attachments/assets/97836158-5735-4d01-94dd-16e3fb6999c6)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Run an agent with at least one input *not* filled out; view this run
in the Library
    - [x] -> page should load normally
    - [x] -> agent inputs should load and show normally
- Run an agent that generates long output; view this run in the Library
- [x] -> output should not overflow its container or stretch the page
layout
    - [x] -> visually check that the output section looks slick
2025-03-19 23:39:09 +07:00
Toran Bruce Richards
93238dc78c fix(blocks): SendWebRequestBlock to properly handle HTTP error responses (#9655)
### Issue
The SendWebRequestBlock currently fails to properly route HTTP error
responses (4xx, 5xx) to their designated output pins (`client_error` and
`server_error`). Instead, these errors are being sent to the default
"Error" pin, breaking expected workflows that depend on proper error
handling.

### Root Cause
The underlying issue is that our custom `requests` module from
`backend.util.request` appears to automatically raise exceptions for
error status codes (similar to how `raise_for_status()` works in the
standard requests library). When these exceptions are thrown, the
block's conditional logic for handling different status codes is
bypassed entirely.

### Changes
This PR adds proper exception handling to catch HTTP errors raised by
the requests module and routes them to the appropriate output pins:
- Added a try-except block to capture `requests.exceptions.HTTPError`
- Extract status code and response data from the caught exception
- Yield to the proper pin based on the status code (4xx → client_error,
5xx → server_error)
- Maintain consistent behavior with the original design intent

### Additional Context
This change maintains backward compatibility while ensuring the block
behaves according to its documented functionality. Users can now
properly handle 4xx and 5xx errors in their workflows as originally
intended.

<!-- Clearly explain the need for these changes: -->
### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the block with new changes and old and ensure expected
behavior

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-19 23:39:09 +07:00
Nicholas Tindle
b6260b5ce9 fix(backend): drastically increase batching time for the agent run (#9654)
<!-- Clearly explain the need for these changes: -->

We accidently send several emails within 10 mins and we're gonna get
blocked for spam if we keep it up

### Changes 🏗️
- moves 1 min to 60 min timer
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test via batching a series of notiications over an hour
2025-03-19 23:39:09 +07:00
Reinier van der Leer
9c31c79898 feat(frontend/library): Make agent input fields expandable (#9650)
- Resolves #9622

### Changes 🏗️

- Add pop-out button + modal to input fields in Agent Run Draft view on
`/library/agents/[id]`
- Fix `icon`-variant button styling

![the expand button on the input
fields](https://github.com/user-attachments/assets/00be33fe-44d1-490a-9cab-9696df8f6e6f)
![the expanded input modal that
appears](https://github.com/user-attachments/assets/787f33b9-d884-467b-b99b-dcbec8a1d059)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to an agent's page -> click "+ New run"
    - [x] -> pop-out button should show on all input fields
- Enter a value in one of the inputs; click the pop-out button on that
input
    - [x] -> input modal with large text field should open
- [x] -> the value you just entered should be present in the modal's
text field
  - Edit the value & click "Save"
    - [x] -> the modal should close
- [x] -> the value in the corresponding input field should be updated
2025-03-19 23:39:09 +07:00
Zamil Majdy
f8a6c9e67f fix(block): Revert custom get_missing_links method on AddToListBlock 2025-03-19 23:39:09 +07:00
Zamil Majdy
ff9a5cc638 fix(block): Avoid infinite loop execution on AddToListBlock self-loop (#9629)
### Changes 🏗️

<img width="757" alt="image"
src="https://github.com/user-attachments/assets/909aab58-24c7-42ec-9580-ac3e9f32057e"
/>

Since a self-loop is now allowed for AddToListBlock, providing an entry
pin using a static output will cause infinite execution.
This PR change avoid such scenario to be allowed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Described above
2025-03-19 23:39:09 +07:00
Zamil Majdy
4e6144803b fix(platform): Fix possible db-config permission denied when running two different Supabase versions (#9652)
The change in https://github.com/Significant-Gravitas/AutoGPT/pull/9620
introduces a breaking change in the database volume content; however,
the database's volume location does not change, making switching between
two versions clash.

### Changes 🏗️

Renamed db-config named volume to supabase-config.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-03-19 23:39:09 +07:00
Reinier van der Leer
2c92122721 feat(platform/library): Add icons to primary agent run action buttons (#9651)
- Resolves #9612

### Changes 🏗️

- Add icon to "Run" button in run draft view
- Add icons "Stop run" and "Run again" buttons in run view

!["Run"
button](https://github.com/user-attachments/assets/da863753-6cb2-4cea-aa00-c313b606d198)
!["Run again"
button](https://github.com/user-attachments/assets/79958187-05dd-494e-a3a1-e9745db0d2d4)
!["Stop run"
button](https://github.com/user-attachments/assets/ad37ec3a-3c0b-493b-b548-e6b902eb8bda)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Purely visual changes, no functional test needed.
    Technical changes are covered by the type checker.
2025-03-19 23:39:09 +07:00
Nicholas Tindle
9b19d1959e feat(frontend): break out the sidebar into a reusable component + use it for admin page (#9618)
<!-- Clearly explain the need for these changes: -->
We need a sidebar for the admin page, might as well reuse the reusable
component to do so!

### Changes 🏗️
- Extracts the agptui sidebar to a more reusable component
- Update the usage of that sidebar in the settings page
- Use that same sidebar for the admin page

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the old sidebar
  - [x] Test the new sidebar for admin
2025-03-19 23:39:09 +07:00
Zamil Majdy
17f3a19bc3 feat(backend): Support sub-agent on export/import agent feature (#9640)
Agents using Agent blocks should be seamlessly downloaded from the
marketplace to a file and imported from a file.

Requirements:
* A recursive export process that exports all the required agents to a
single file, no matter how many layers deep (taking care of potential
loops).
* An import process that expects and extracts several agents from a
single file into your library at once.

Considerations:
We need to ensure the reference IDs in the Agent Blocks match/are
updated to match the imported sub-agent ids to prevent broken
references.

### Changes 🏗️

* Add sub_graphs field on Graph model 
* Improve graph creation query to support inserting graph + subgraphs in
batch
* Deprecate graph template & remove its column
* Update on marketplace download agent (unified the used method, with
more secure cleanup & proper ownership check).
* Fix failing test cases

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Export graph with sub agents.
  - [x] Import the exported graph with sub agents.
2025-03-19 23:39:09 +07:00
Reinier van der Leer
596b29f53a feat(platform/library): Add "Export agent to file" action (#9627)
- Resolves #9609

### Changes 🏗️

- feat(frontend/library): Add "Export agent to file" button
- fix(frontend/library): Put "Open in builder" button behind access
check

- feat(backend): Improve & move graph export stripping logic
  - Add logic to strip `SecretField` values
  - Move node stripping logic to `NodeModel` from `GraphModel`
    - Add `NodeModel.stripped_for_export()` method
  - Add `NodeModel.block` property

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block and a
block that uses credentials
  - Go to `/library/agents/[id]` for the agent you just created
    - [x] -> "Open in builder" button should show
    - [x] -> "Open in builder" button should work
    - [x] -> "Export agent to file" button should show
    - [x] -> "Export agent to file" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [ ] -> ~~Exported file contains no user IDs~~
  - Go to `/library/agents/[id]` for an agent from the marketplace
    - [x] -> "Open in builder" button should not show
    - [x] -> "Export agent to file" button should not show
2025-03-19 23:39:09 +07:00
dependabot[bot]
e0300f3d13 chore(libs/deps-dev): bump ruff from 0.9.6 to 0.9.9 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9559)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.6 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.6...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.6&new-version=0.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 23:39:09 +07:00
Zamil Majdy
780fddc2a0 feat(platform)!: Lock Supabase docker-compose code (#9620)
We have been submoduling Supabase for provisioning local Supabase
instances using docker-compose. Aside from the huge size of unrelated
code being pulled, there is also the risk of pulling unintentional
breaking change from the upstream to the platform.

The latest Supabase changes hide the 5432 port from the supabase-db
container and shift it to the supavisor, the instance that we are
currently not using. This causes an error in the existing setup.

## BREAKING CHANGES

This change will introduce different volume locations for the database
content, pulling this change will make the data content fresh from the
start. To keep your old data with this change, execute this command:
```
cp -r supabase/docker/volumes/db/data db/docker/volumes/db/data
```


### Changes 🏗️

The scope of this PR is snapshotting the current docker-compose code
obtained from the Supabase repository and embedding it into our
repository. This will eliminate the need for submodule / recursive
cloning and bringing the entire Supabase repository into the platform.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI
2025-03-19 23:39:09 +07:00
Nicholas Tindle
52b4351961 fix: backend admin page logic was broken (#9616)
<!-- Clearly explain the need for these changes: -->

We're building out admin utilities so we need to bring back the `/admin`
route with RBAC. This PR goes through re-enabling that to work with the
latest changes

### Changes 🏗️
- Adds back removed logic
- Refactors the role checks to fix minor bug for admin page and more
importantly clarify
- Updates routes to the latest 
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with admin and authenticated user roles
  - [x] Test with logged out user role
- [x] For the above check the all the existing routes + new ones in the
`middleware.ts`
2025-03-19 23:39:09 +07:00
Zamil Majdy
8757439192 fix(platform): Fallback front-end-url to platform-url for billing page 2025-03-19 23:39:09 +07:00
dependabot[bot]
e124ee6a9e chore(frontend/deps): bump the production-dependencies group across 1 directory with 13 updates (#9611)
Bumps the production-dependencies group with 13 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.4.0` |
`9.6.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.1.6` | `15.2.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.48.1` | `2.49.1` |
|
[@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table)
| `8.20.6` | `8.21.2` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.4.2` | `12.4.4` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.3.1` |
`12.4.11` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.474.0` | `0.479.0` |
| [next-themes](https://github.com/pacocoursey/next-themes) | `0.4.4` |
`0.4.5` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.5.1`
| `9.6.1` |
| [react-icons](https://github.com/react-icons/react-icons) | `5.4.0` |
`5.5.0` |
| [react-shepherd](https://github.com/shepherd-pro/shepherd) | `6.1.7` |
`6.1.8` |
| [uuid](https://github.com/uuidjs/uuid) | `11.0.5` | `11.1.0` |
| [zod](https://github.com/colinhacks/zod) | `3.24.1` | `3.24.2` |


Updates `@faker-js/faker` from 9.4.0 to 9.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.6.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update dependency typescript to v5.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3424">faker-js/faker#3424</a></li>
<li>chore(deps): update dependency ts-morph to v25.0.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3418">faker-js/faker#3418</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3419">faker-js/faker#3419</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3420">faker-js/faker#3420</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3421">faker-js/faker#3421</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3422">faker-js/faker#3422</a></li>
<li>chore(deps): remove obsolete dependency
<code>@​types/eslint</code>__js by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3425">faker-js/faker#3425</a></li>
<li>chore(deps): update dependency prettier to v3.5.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3423">faker-js/faker#3423</a></li>
<li>chore(deps): update pnpm to v10 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3427">faker-js/faker#3427</a></li>
<li>chore(deps): update eslint (major) by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3426">faker-js/faker#3426</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3428">faker-js/faker#3428</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3431">faker-js/faker#3431</a></li>
<li>docs: revert npm download badge by <a
href="https://github.com/LitoMore"><code>@​LitoMore</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li>feat(finance): add ISO 4217 numerical codes to Currency object by <a
href="https://github.com/Nfloc"><code>@​Nfloc</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li>feat(number): bigint multipleOf by <a
href="https://github.com/soc221b"><code>@​soc221b</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
<li>refactor(internet): deprecate color method for removal by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3401">faker-js/faker#3401</a></li>
<li>test: add snapshot test for all locales' character sets by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3276">faker-js/faker#3276</a></li>
<li>chore(release): 9.6.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3435">faker-js/faker#3435</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/LitoMore"><code>@​LitoMore</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li><a href="https://github.com/Nfloc"><code>@​Nfloc</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li><a href="https://github.com/soc221b"><code>@​soc221b</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0</a></p>
<h2>v9.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>test: retry verify tag 3 times by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3395">faker-js/faker#3395</a></li>
<li>test: disable summary for local by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3394">faker-js/faker#3394</a></li>
<li>chore: add usage trend by <a
href="https://github.com/cwtuan"><code>@​cwtuan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3403">faker-js/faker#3403</a></li>
<li>fix: test before using Buffers by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3400">faker-js/faker#3400</a></li>
<li>revert(chore): update LICENSE file (<a
href="https://redirect.github.com/faker-js/faker/issues/3350">#3350</a>)
by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3410">faker-js/faker#3410</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3411">faker-js/faker#3411</a></li>
<li>docs: change ejcheng by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3408">faker-js/faker#3408</a></li>
<li>docs: improve missing data error by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3406">faker-js/faker#3406</a></li>
<li>chore(release): 9.5.1 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3415">faker-js/faker#3415</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/cwtuan"><code>@​cwtuan</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1</a></p>
<h2>v9.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3377">faker-js/faker#3377</a></li>
<li>docs: faker.seed examples are not consistent after refresh by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3378">faker-js/faker#3378</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">9.6.0</a>
(2025-03-06)</h2>
<h3>Features</h3>
<ul>
<li><strong>finance:</strong> add ISO 4217 numerical codes to Currency
(<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)
(<a
href="ae9aec67b1">ae9aec6</a>)</li>
<li><strong>number:</strong> bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)
(<a
href="7b4f85a2c0">7b4f85a</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">9.5.1</a>
(2025-02-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>test before using Buffers (<a
href="https://redirect.github.com/faker-js/faker/issues/3400">#3400</a>)
(<a
href="ec7c9a8e60">ec7c9a8</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.5.0">9.5.0</a>
(2025-02-10)</h2>
<h3>Features</h3>
<ul>
<li><strong>image:</strong> add AI-generated avatars (<a
href="https://redirect.github.com/faker-js/faker/issues/3126">#3126</a>)
(<a
href="9e1395380c">9e13953</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="50b3241629"><code>50b3241</code></a>
chore(release): 9.6.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3435">#3435</a>)</li>
<li><a
href="62486af20c"><code>62486af</code></a>
test: add snapshot test for all locales' character sets (<a
href="https://redirect.github.com/faker-js/faker/issues/3276">#3276</a>)</li>
<li><a
href="1982431fd0"><code>1982431</code></a>
refactor(internet): deprecate color method for removal (<a
href="https://redirect.github.com/faker-js/faker/issues/3401">#3401</a>)</li>
<li><a
href="7b4f85a2c0"><code>7b4f85a</code></a>
feat(number): bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)</li>
<li><a
href="ae9aec67b1"><code>ae9aec6</code></a>
feat(finance): add ISO 4217 numerical codes to Currency (<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)</li>
<li><a
href="57d39d7442"><code>57d39d7</code></a>
docs: revert npm download badge (<a
href="https://redirect.github.com/faker-js/faker/issues/3433">#3433</a>)</li>
<li><a
href="bf3aa8b064"><code>bf3aa8b</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3431">#3431</a>)</li>
<li><a
href="f591459aff"><code>f591459</code></a>
chore(deps): update devdependencies (<a
href="https://redirect.github.com/faker-js/faker/issues/3428">#3428</a>)</li>
<li><a
href="1db428ab97"><code>1db428a</code></a>
chore(deps): update eslint (major) (<a
href="https://redirect.github.com/faker-js/faker/issues/3426">#3426</a>)</li>
<li><a
href="b7e7714b8b"><code>b7e7714</code></a>
chore(deps): update pnpm to v10 (<a
href="https://redirect.github.com/faker-js/faker/issues/3427">#3427</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.6.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~st-ddt">st-ddt</a>, a new releaser for
<code>@​faker-js/faker</code> since your current version.</p>
</details>
<br />

Updates `@next/third-parties` from 15.1.6 to 15.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.2.1</h2>
<h3>Core Changes</h3>
<ul>
<li>Unify Link and Form prefetching: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76184">#76184</a></li>
<li>Turbopack: Ensure server actions sourcemaps tests pass: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76157">#76157</a></li>
<li>[dev-overlay] control dark theme in one place: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76528">#76528</a></li>
<li>[dev-overlay] change css var for terminal: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76590">#76590</a></li>
<li>[dev-overlay] Discriminate stack frame settled typed: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76517">#76517</a></li>
<li>Remove obsolete <code>sourcePackage</code> references: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76550">#76550</a></li>
<li>refactor: remove unused variable in externals handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76599">#76599</a></li>
<li>fix: Add popular embedding libraries to serverExternalPackages: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76574">#76574</a></li>
<li>[Segment Cache] Implement hash-only navigations: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76179">#76179</a></li>
<li>Webpack: abstract away getting compilation spans: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76579">#76579</a></li>
<li>report compiler duration for webpack and improve numbers: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76665">#76665</a></li>
<li>[dev-overlay] fix dark theme missing close bracket: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76672">#76672</a></li>
<li>Remove <code>revalidate</code> property from incremental cache
<code>ctx</code> for <code>FETCH</code> kind: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76500">#76500</a></li>
<li>[dev-overlay] fix: env name label style was out of sync with error
type label: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76668">#76668</a></li>
<li>Turbopack: avoid celling source maps before minify: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76626">#76626</a></li>
<li>refactor(CI): Merge all four bundler test manifest scripts into one:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76652">#76652</a></li>
<li>[metadata] fix duplicate metadata for parallel routes: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76669">#76669</a></li>
<li>[Segment Cache] Omit from bundle if flag disabled: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76622">#76622</a></li>
<li>[Segment Cache] Support output: &quot;export&quot; mode: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75671">#75671</a></li>
<li>[Segment Cache] Refresh on same-page navigation: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76223">#76223</a></li>
<li>[metadata] re-enable streaming metadata with PPR: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76119">#76119</a></li>
<li>[Segment Cache] Search param fallback handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75990">#75990</a></li>
<li>[Segment Cache] Fix: canonicalURL omits origin: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76444">#76444</a></li>
<li>fix metadata basePath for manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76681">#76681</a></li>
<li>Propagate expire time to <code>cache-control</code> header and
prerender manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76207">#76207</a></li>
<li>Show revalidate/expire columns in build output: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76343">#76343</a></li>
<li>Gate alternate bundler behind canary only: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76634">#76634</a></li>
<li>[dynamicIO] routes with dynamic segments should be able to be static
in dev: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76691">#76691</a></li>
<li>[repo] upgrade ts <code>5.8.2</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a></li>
<li>[metadata]: ensure metadata boundary is only rendered once on client
nav: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76692">#76692</a></li>
<li>[metadata] clean up redudant options: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76712">#76712</a></li>
<li>Fix uniqueness detection for <code>generateStaticParams</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76713">#76713</a></li>
<li>Upgrade React from <code>22e39ea7-20250225</code> to
<code>d55cc79b-20250228</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76680">#76680</a></li>
<li>[Turbopack] Compute module batches and use them for chunking: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76133">#76133</a></li>
<li>[Dev Tools] Improve keyboard interactions for menu &amp; overlays:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76754">#76754</a></li>
<li>Keep server code out of browser chunks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76660">#76660</a></li>
<li>Turbopack: inline minify into code generation and make it a plain
function instead of a turbo tasks function: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76628">#76628</a></li>
<li>fix edge runtime asset fetch in pages api: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76750">#76750</a></li>
<li>Update use-cache-unknown-cache-kind.test.ts snapshot for alternate
bundler: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76682">#76682</a></li>
</ul>
<h3>Example Changes</h3>
<ul>
<li>docs: fix reading <code>params</code> code blocks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76705">#76705</a></li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>fix(rustdoc): Fix rustdoc warnings, block on rustdoc failures in CI:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76448">#76448</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="633878112e"><code>6338781</code></a>
v15.2.1</li>
<li><a
href="197b4bb709"><code>197b4bb</code></a>
v15.2.1-canary.6</li>
<li><a
href="0b699b1c8d"><code>0b699b1</code></a>
v15.2.1-canary.5</li>
<li><a
href="4bf1ee117d"><code>4bf1ee1</code></a>
[repo] upgrade ts <code>5.8.2</code> (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a>)</li>
<li><a
href="6f6001a87a"><code>6f6001a</code></a>
v15.2.1-canary.4</li>
<li><a
href="5f1df89fdc"><code>5f1df89</code></a>
v15.2.1-canary.3</li>
<li><a
href="f06a72e11e"><code>f06a72e</code></a>
v15.2.1-canary.2</li>
<li><a
href="2497f81d1b"><code>2497f81</code></a>
v15.2.1-canary.1</li>
<li><a
href="83610c6a84"><code>83610c6</code></a>
v15.2.1-canary.0</li>
<li><a
href="b0416fbb44"><code>b0416fb</code></a>
v15.2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/commits/v15.2.1/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/supabase-js` from 2.48.1 to 2.49.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.49.1</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.0...v2.49.1">2.49.1</a>
(2025-02-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> upgrade postgrest-js 1.19.2 (<a
href="3f01c3fbc4">3f01c3f</a>)</li>
</ul>
<h2>v2.49.0</h2>
<h1><a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.0">2.49.0</a>
(2025-02-24)</h1>
<h3>Features</h3>
<ul>
<li>bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)
(<a
href="a9ece9a4ae">a9ece9a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fceca48c37"><code>fceca48</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1369">#1369</a>
from supabase/avallete/chore-bump-postgrest-js-1-19-2</li>
<li><a
href="a9ece9a4ae"><code>a9ece9a</code></a>
feat: bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)</li>
<li><a
href="3f01c3fbc4"><code>3f01c3f</code></a>
fix(deps): upgrade postgrest-js 1.19.2</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-table` from 8.20.6 to 8.21.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/table/releases"><code>@​tanstack/react-table</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.21.2</h2>
<p>Version 8.21.2 - 2/11/25, 8:59 PM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>arrIncludes autoremove filterFn (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5623">#5623</a>)
(2efaf57) by lukebui</li>
<li>lit-table: spread table options in lit adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5904">#5904</a>)
(36dede1) by <a
href="https://github.com/kadoshms"><code>@​kadoshms</code></a></li>
</ul>
<h3>Docs</h3>
<ul>
<li>row accessor bug in example code block (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5893">#5893</a>)
(b1506a7) by Valerii Petryniak</li>
<li>virtualizer tbody from onchange (827b098) by Kevin Van Cott</li>
<li>exp virtual - remeasure when table state changes (9e6987d) by Kevin
Van Cott</li>
<li>angular: add expanding and sub components examples (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5898">#5898</a>)
(099e1a4) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>example name (57703a4) by Kevin Van Cott</li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/table-core</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/angular-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/qwik-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/solid-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/svelte-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/vue-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table-devtools</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
</ul>
<h2>v8.21.1</h2>
<p>Version 8.21.1 - 2/3/25, 5:37 AM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>lit-table: dynamic data updates in the Lit Table Adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5884">#5884</a>)
(9763877) by Luke Schierer</li>
</ul>
<h3>Docs</h3>
<ul>
<li>add experimental virtualization example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5895">#5895</a>)
(8d6e19f) by Kevin Van Cott</li>
<li>angular: add missing faker-js deps (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5883">#5883</a>)
(190c669) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>angular: add editable, row-dnd and performant column resizing
example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5881">#5881</a>)
(0baabdd) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.1</li>
</ul>
<h2>v8.21.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="db745afdb8"><code>db745af</code></a>
release: v8.21.2</li>
<li>See full diff in <a
href="https://github.com/TanStack/table/commits/v8.21.2/packages/react-table">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.4.2 to 12.4.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2>12.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d045503667"><code>d045503</code></a>
chore(packages): bump</li>
<li><a
href="7a00fe3520"><code>7a00fe3</code></a>
chore(getNodeConnections): remove deprecation <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5051">#5051</a></li>
<li><a
href="08b99e8719"><code>08b99e8</code></a>
Merge pull request <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5043">#5043</a>
from xyflow/refactor/dynamic-expand-parent</li>
<li><a
href="8dd2b4f9e2"><code>8dd2b4f</code></a>
chore(updateNodePositions): cleanup</li>
<li><a
href="0b67a6c303"><code>0b67a6c</code></a>
refactor(errors): show error when user drags uninitialized node <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5014">#5014</a></li>
<li><a
href="27df80b6a6"><code>27df80b</code></a>
fix(selection-listener): pass generics</li>
<li><a
href="d094ef0581"><code>d094ef0</code></a>
fix(OnSelectionChangeFunc): pass node and edge type generics <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5023">#5023</a></li>
<li><a
href="3969758af2"><code>3969758</code></a>
refactor(expandParent): use current value on drag <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5039">#5039</a></li>
<li><a
href="43f188d3b1"><code>43f188d</code></a>
fix(click-connections): handle isConnectableStart correctly <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5041">#5041</a></li>
<li><a
href="68591a8bf1"><code>68591a8</code></a>
Merge branch 'main' into no-deprecated</li>
<li>Additional commits viewable in <a
href="https://github.com/xyflow/xyflow/commits/@xyflow/react@12.4.4/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `framer-motion` from 12.3.1 to 12.4.11
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/motiondivision/motion/blob/main/CHANGELOG.md">framer-motion's
changelog</a>.</em></p>
<blockquote>
<h2>[12.4.11] 2025-03-10</h2>
<h3>Fixed</h3>
<ul>
<li>Preventing flattening of scroll animations when <code>type</code> or
<code>ease</code> are explicitly set.</li>
</ul>
<h2>[12.4.10] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Adding UMD bundles for <code>motion-dom</code> and
<code>motion-utils</code>.</li>
</ul>
<h2>[12.4.9] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>Reorder.Item</code> reordering causing
<code>lostpointercapture</code> event to fire.</li>
</ul>
<h2>[12.4.8] 2025-02-26</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed exiting children with <code>layoutDependency</code> not
animating layout changes because of a stale layout dependency.</li>
</ul>
<h2>[12.4.7] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>AnimatePresence</code> not triggering exit animations
when a child with <code>layout</code> or <code>drag</code> is
removed.</li>
</ul>
<h2>[12.4.6] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed drag gesture on child elements.</li>
</ul>
<h2>[12.4.5] 2025-02-19</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>onClick</code> handlers not working inside
<code>press</code> events.</li>
</ul>
<h2>[12.4.4] 2025-02-18</h2>
<h3>Fixed</h3>
<ul>
<li>Changed press, drag and pan gestures to use pointer capturing for
better usage within <code>iframe</code> embeds.</li>
</ul>
<h2>[12.4.3] 2025-02-12</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9316ca8202"><code>9316ca8</code></a>
v12.4.11</li>
<li><a
href="c291a09ff2"><code>c291a09</code></a>
Updating changelog</li>
<li><a
href="9e2923c5e4"><code>9e2923c</code></a>
Fix scroll easing (<a
href="https://redirect.github.com/motiondivision/motion/issues/3106">#3106</a>)</li>
<li><a
href="18b71d1395"><code>18b71d1</code></a>
v12.4.10</li>
<li><a
href="e89a0c20c9"><code>e89a0c2</code></a>
Latest</li>
<li><a
href="d84031e1cd"><code>d84031e</code></a>
Latest</li>
<li><a
href="63e7597969"><code>63e7597</code></a>
Updating rollup</li>
<li><a
href="3fcf837c1f"><code>3fcf837</code></a>
v12.4.9</li>
<li><a
href="c58920f6f2"><code>c58920f</code></a>
Updating changelog</li>
<li><a
href="c889431567"><code>c889431</code></a>
Fixing pointer capture and Reorder item (<a
href="https://redirect.github.com/motiondivision/motion/issues/3097">#3097</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/motiondivision/motion/compare/v12.3.1...v12.4.11">compare
view</a></li>
</ul>
</details>
<br />

Updates `lucide-react` from 0.474.0 to 0.479.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lucide-icons/lucide/releases">lucide-react's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.479.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(<code>@​lucide/svelte</code>): Lucide svelte 5 package by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2753">lucide-icons/lucide#2753</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0">https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0</a></p>
<h2>Version 0.478.0</h2>
<h2>What's Changed</h2>
<ul>
<li>ci(pr-comment): Fix icon preview comment on PRs by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2854">lucide-icons/lucide#2854</a></li>
<li>fix(ci): run lint pr title on title change by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2872">lucide-icons/lucide#2872</a></li>
<li>fix(metadata): name change reflected in contributions by <a
href="https://github.com/AnnaSasDev"><code>@​AnnaSasDev</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2866">lucide-icons/lucide#2866</a></li>
<li>fix(icons): changed <code>brackets</code> icon by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2863">lucide-icons/lucide#2863</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0">https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0</a></p>
<h2>New icons 0.477.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>square-round-corner</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2323">#2323</a>)
by <a href="https://github.com/liamb13"><code>@​liamb13</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>circle-slash-2</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2837">#2837</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>Fixes and new icons 0.476.0</h2>
<h2>Fixes</h2>
<ul>
<li>fix(lucide-react): Revert exports property package.json, fixing edge
worker environments. by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2814">lucide-icons/lucide#2814</a></li>
<li>fix(lucide): Lucide create element function returning SVG Element by
<a href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in
<a
href="https://redirect.github.com/lucide-icons/lucide/pull/2816">lucide-icons/lucide#2816</a></li>
</ul>
<h2>New icons 🎨</h2>
<ul>
<li><code>shield-user</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2608">#2608</a>)
by <a
href="https://github.com/sebinemeth"><code>@​sebinemeth</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>beef</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2832">#2832</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>New icons 0.475.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>circle-small</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars-stroke</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>non-binary</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>transgender</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1787b82cfe"><code>1787b82</code></a>
build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2804">#2804</a>)</li>
<li><a
href="b46927e510"><code>b46927e</code></a>
fix(lucide-react): Revert exports property package.json, fixing edge
worker e...</li>
<li><a
href="3ab6c373a0"><code>3ab6c37</code></a>
build(deps-dev): bump vite from 5.4.12 to 5.4.13 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2798">#2798</a>)</li>
<li><a
href="ba2c4b526f"><code>ba2c4b5</code></a>
build(deps-dev): bump vite from 5.1.8 to 5.4.12 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2786">#2786</a>)</li>
<li><a
href="50630b3aaf"><code>50630b3</code></a>
ci: Improve build speeds (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2778">#2778</a>)</li>
<li>See full diff in <a
href="https://github.com/lucide-icons/lucide/commits/0.479.0/packages/lucide-react">compare
view</a></li>
</ul>
</details>
<br />

Updates `next-themes` from 0.4.4 to 0.4.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pacocoursey/next-themes/releases">next-themes's
releases</a>.</em></p>
<blockquote>
<h2>v0.4.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: map theme to class using ValueObject in injected script by <a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li>Reduce number of renders by pre-setting resolvedTheme by <a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
<li>Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/331">pacocoursey/next-themes#331</a></li>
<li>Bump the npm_and_yarn group across 1 directory with 7 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/341">pacocoursey/next-themes#341</a></li>
<li>chore: Fix corepack errors in CI by <a
href="https://github.com/pacocoursey"><code>@​pacocoursey</code></a> in
<a
href="https://redirect.github.com/pacocoursey/next-themes/pull/342">pacocoursey/next-themes#342</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li><a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d12996b4e8"><code>d12996b</code></a>
chore: Fix corepack errors in CI (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/342">#342</a>)</li>
<li><a
href="b77db23e9f"><code>b77db23</code></a>
Bump the npm_and_yarn group across 1 directory with 7 updates (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/341">#341</a>)</li>
<li><a
href="d3fa4ee9ad"><code>d3fa4ee</code></a>
Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
director...</li>
<li><a
href="ad83567b11"><code>ad83567</code></a>
Reduce number of renders by pre-setting resolvedTheme (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/338">#338</a>)</li>
<li><a
href="1b510445a3"><code>1b51044</code></a>
fix: map theme to class using ValueObject in injected script (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/330">#330</a>)</li>
<li>See full diff in <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-day-picker` from 9.5.1 to 9.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gpbl/react-day-picker/releases">react-day-picker's
releases</a>.</em></p>
<blockquote>
<h2>v9.6.1</h2>
<p>This release addresses an accessibility issue, adds a new
<code>animate</code> prop and fixes other minor bugs.</p>
<h3>Possible Breaking Change in Custom Styles</h3>
<p>To address a <a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2630">focus
lost bug</a> affecting navigation buttons, we <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">updated</a>
the buttons to use <code>aria-disabled</code> instead of the
<code>disabled</code> attribute.</p>
<p>This change may cause custom styles for those disabled buttons to
break. To fix it in your code, update the CSS selector to target
<code>[aria-disabled=&quot;true&quot;]</code>:</p>
<pre lang="diff"><code>- .rdp-button_next:disabled,
+ .rdp-button_next[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
- .rdp-button_previous:disabled,
+ .rdp-button_previous[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
</code></pre>
<h3>Animating Month Transitions</h3>
<p>Thanks to the work by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a>, we have
added animations to DayPicker. The new <a
href="http://daypicker.dev/docs/navigation#animate"><code>animate</code>
prop</a> enables CSS transitions for captions and weeks when navigating
between months:</p>
<!-- raw HTML omitted -->
<pre lang="tsx"><code>&lt;DayPicker animate /&gt;
</code></pre>
<p>Customizing the animation style can be challenging due to the HTML
table structure of the grid. We may address this in the future. Please
leave your feedback in <a
href="https://github.com/gpbl/react-day-picker/discussions">DayPicker
Discussions</a>.</p>
<h2>What's Changed</h2>
<ul>
<li>feat: new <code>animate</code> prop by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2684">gpbl/react-day-picker#2684</a></li>
<li>feat(performance): add <code>sideEffects</code> property to
package.json by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2673">gpbl/react-day-picker#2673</a></li>
<li>fix(accessibility): focus lost when navigation button is disabled by
<a href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">gpbl/react-day-picker#2685</a></li>
<li>fix: render selected days with <code>selected</code> modifier when
disabled by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2700">gpbl/react-day-picker#2700</a></li>
<li>fix(build): remove extra files from package.json by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2692">gpbl/react-day-picker#2692</a></li>
<li>chore(types): fix deprecation of select event handler types by <a
href="https://github.com/timothyis"><code>@​timothyis</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<h3>v9.6.1</h3>
<ul>
<li>fix(build): add missing .css entries in package.json files by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2703">gpbl/react-day-picker#2703</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/timothyis"><code>@​timothyis</code></a>
made their first contribution in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1</a></p>
<h2>v9.6.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c37983b8e5"><code>c37983b</code></a>
build: bump v9.6.1</li>
<li><a
href="3d382fe18d"><code>3d382fe</code></a>
build: add missing .css entries in package.json files (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2703">#2703</a>)</li>
<li><a
href="ca71182076"><code>ca71182</code></a>
build: bump v9.6.0</li>
<li><a
href="37f759a718"><code>37f759a</code></a>
chore: animate prop, remove <a
href="https://github.com/experimental"><code>@​experimental</code></a>
tag</li>
<li><a
href="9aa3d35062"><code>9aa3d35</code></a>
docs: update for new <code>animate</code> prop (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2694">#2694</a>)</li>
<li><a
href="d7d0a8ad13"><code>d7d0a8a</code></a>
fix: render selected days with selected modifier when disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2700">#2700</a>)</li>
<li><a
href="48f00dc20f"><code>48f00dc</code></a>
fix: focus lost when navigation button is disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2685">#2685</a>)</li>
<li><a
href="6617c9bf81"><code>6617c9b</code></a>
chore: update keyframes names (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2695">#2695</a>)</li>
<li><a
href="13e0a4acc9"><code>13e0a4a</code></a>
test: fix test related to first of month (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2693">#2693</a>)</li>
<li><a
href="ebde52dd02"><code>ebde52d</code></a>
docs: fix no-wrap-table style for paragraphs</li>
<li>Additional commits viewable in <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-icons` from 5.4.0 to 5.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react-icons/react-icons/releases">react-icons's
releases</a>.</em></p>
<blockquote>
<h2>v5.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>[React 19] Update IconType type to return React.ReactNode by <a
href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
<li>Bump vite from 5.2.10 to 5.4.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/996">react-icons/react-icons#996</a></li>
<li>Bump nanoid from 3.3.7 to 3.3.8 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1005">react-icons/react-icons#1005</a></li>
<li>Bump vite from 5.4.11 to 5.4.14 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1021">react-icons/react-icons#1021</a></li>
<li>Bump esbuild from 0.20.2 to 0.25.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1027">react-icons/react-icons#1027</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a>
made their first contribution in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0">https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0</a></p>
<table>
<thead>
<tr>
<th>Icon Library</th>
<th>License</th>
<th>Version</th>
<th align="right">Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://circumicons.com/">Circum Icons</a></td>
<td><a
href="https://github.com/Klarr-Agency/Circum-Icons/blob/main/LICENSE">MPL-2.0
license</a></td>
<td>1.0.0</td>
<td align="right">288</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 5</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>5.15.4-3-gafecf2a</td>
<td align="right">1612</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 6</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>6.6.0</td>
<td align="right">2050</td...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-19 23:39:09 +07:00
Reinier van der Leer
7854b999f3 fix(frontend/library): Truncate agent card title and description (#9658)
- Resolves #9631

### Changes 🏗️

- Truncate library agent card title (2 lines) and description (3 lines)
- Make "See runs" and "Open in builder" stick to bottom of card
regardless of other content
- Reduce number of grid columns (4 -> 3) in `lg` layout on `/library` to
give items more horizontal space

![screenshot of library agent grid with the applied
changes](https://github.com/user-attachments/assets/b27d5c97-33b8-4708-9f8c-fc67aad899c9)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Visually test the changes made on different screen sizes
2025-03-19 15:56:57 +00:00
Reinier van der Leer
ca5fb1618e fix(frontend/library): Improve agent I/O rendering (#9656)
- Related to #8784

### Changes 🏗️

- feat(frontend/library): Improve agent output styling & fix content
overflow issue
- fix(frontend/library): Fix overlap between content and inset button of
expandable input fields (#9650)
- fix(backend): Unbreak loading graph executions with missing inputs

![screenshot of restyled Output
section](https://github.com/user-attachments/assets/97836158-5735-4d01-94dd-16e3fb6999c6)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Run an agent with at least one input *not* filled out; view this run
in the Library
    - [x] -> page should load normally
    - [x] -> agent inputs should load and show normally
- Run an agent that generates long output; view this run in the Library
- [x] -> output should not overflow its container or stretch the page
layout
    - [x] -> visually check that the output section looks slick
2025-03-19 15:19:52 +00:00
Toran Bruce Richards
6d36be6f86 fix(blocks): SendWebRequestBlock to properly handle HTTP error responses (#9655)
### Issue
The SendWebRequestBlock currently fails to properly route HTTP error
responses (4xx, 5xx) to their designated output pins (`client_error` and
`server_error`). Instead, these errors are being sent to the default
"Error" pin, breaking expected workflows that depend on proper error
handling.

### Root Cause
The underlying issue is that our custom `requests` module from
`backend.util.request` appears to automatically raise exceptions for
error status codes (similar to how `raise_for_status()` works in the
standard requests library). When these exceptions are thrown, the
block's conditional logic for handling different status codes is
bypassed entirely.

### Changes
This PR adds proper exception handling to catch HTTP errors raised by
the requests module and routes them to the appropriate output pins:
- Added a try-except block to capture `requests.exceptions.HTTPError`
- Extract status code and response data from the caught exception
- Yield to the proper pin based on the status code (4xx → client_error,
5xx → server_error)
- Maintain consistent behavior with the original design intent

### Additional Context
This change maintains backward compatibility while ensuring the block
behaves according to its documented functionality. Users can now
properly handle 4xx and 5xx errors in their workflows as originally
intended.

<!-- Clearly explain the need for these changes: -->
### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the block with new changes and old and ensure expected
behavior

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-19 13:05:07 +00:00
Nicholas Tindle
dc1d5faa5d fix(backend): drastically increase batching time for the agent run (#9654)
<!-- Clearly explain the need for these changes: -->

We accidently send several emails within 10 mins and we're gonna get
blocked for spam if we keep it up

### Changes 🏗️
- moves 1 min to 60 min timer
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test via batching a series of notiications over an hour
2025-03-18 19:39:16 +00:00
Reinier van der Leer
a187e87741 feat(frontend/library): Make agent input fields expandable (#9650)
- Resolves #9622

### Changes 🏗️

- Add pop-out button + modal to input fields in Agent Run Draft view on
`/library/agents/[id]`
- Fix `icon`-variant button styling

![the expand button on the input
fields](https://github.com/user-attachments/assets/00be33fe-44d1-490a-9cab-9696df8f6e6f)
![the expanded input modal that
appears](https://github.com/user-attachments/assets/787f33b9-d884-467b-b99b-dcbec8a1d059)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to an agent's page -> click "+ New run"
    - [x] -> pop-out button should show on all input fields
- Enter a value in one of the inputs; click the pop-out button on that
input
    - [x] -> input modal with large text field should open
- [x] -> the value you just entered should be present in the modal's
text field
  - Edit the value & click "Save"
    - [x] -> the modal should close
- [x] -> the value in the corresponding input field should be updated
2025-03-18 14:52:30 +00:00
Zamil Majdy
067983eb80 fix(block): Revert custom get_missing_links method on AddToListBlock 2025-03-18 22:12:19 +07:00
Zamil Majdy
e6de8b98f7 fix(block): Avoid infinite loop execution on AddToListBlock self-loop (#9629)
### Changes 🏗️

<img width="757" alt="image"
src="https://github.com/user-attachments/assets/909aab58-24c7-42ec-9580-ac3e9f32057e"
/>

Since a self-loop is now allowed for AddToListBlock, providing an entry
pin using a static output will cause infinite execution.
This PR change avoid such scenario to be allowed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Described above
2025-03-18 14:44:34 +00:00
Zamil Majdy
607641c574 fix(platform): Fix possible db-config permission denied when running two different Supabase versions (#9652)
The change in https://github.com/Significant-Gravitas/AutoGPT/pull/9620
introduces a breaking change in the database volume content; however,
the database's volume location does not change, making switching between
two versions clash.

### Changes 🏗️

Renamed db-config named volume to supabase-config.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-03-18 13:06:03 +00:00
Reinier van der Leer
18dfbf191c feat(platform/library): Add icons to primary agent run action buttons (#9651)
- Resolves #9612

### Changes 🏗️

- Add icon to "Run" button in run draft view
- Add icons "Stop run" and "Run again" buttons in run view

!["Run"
button](https://github.com/user-attachments/assets/da863753-6cb2-4cea-aa00-c313b606d198)
!["Run again"
button](https://github.com/user-attachments/assets/79958187-05dd-494e-a3a1-e9745db0d2d4)
!["Stop run"
button](https://github.com/user-attachments/assets/ad37ec3a-3c0b-493b-b548-e6b902eb8bda)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Purely visual changes, no functional test needed.
    Technical changes are covered by the type checker.
2025-03-18 10:31:33 +00:00
Nicholas Tindle
841679216c feat(frontend): break out the sidebar into a reusable component + use it for admin page (#9618)
<!-- Clearly explain the need for these changes: -->
We need a sidebar for the admin page, might as well reuse the reusable
component to do so!

### Changes 🏗️
- Extracts the agptui sidebar to a more reusable component
- Update the usage of that sidebar in the settings page
- Use that same sidebar for the admin page

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the old sidebar
  - [x] Test the new sidebar for admin
2025-03-17 21:19:19 +00:00
Zamil Majdy
50eac43e1a feat(backend): Support sub-agent on export/import agent feature (#9640)
Agents using Agent blocks should be seamlessly downloaded from the
marketplace to a file and imported from a file.

Requirements:
* A recursive export process that exports all the required agents to a
single file, no matter how many layers deep (taking care of potential
loops).
* An import process that expects and extracts several agents from a
single file into your library at once.

Considerations:
We need to ensure the reference IDs in the Agent Blocks match/are
updated to match the imported sub-agent ids to prevent broken
references.

### Changes 🏗️

* Add sub_graphs field on Graph model 
* Improve graph creation query to support inserting graph + subgraphs in
batch
* Deprecate graph template & remove its column
* Update on marketplace download agent (unified the used method, with
more secure cleanup & proper ownership check).
* Fix failing test cases

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Export graph with sub agents.
  - [x] Import the exported graph with sub agents.
2025-03-17 16:38:27 +00:00
Reinier van der Leer
91445e4760 feat(platform/library): Add "Export agent to file" action (#9627)
- Resolves #9609

### Changes 🏗️

- feat(frontend/library): Add "Export agent to file" button
- fix(frontend/library): Put "Open in builder" button behind access
check

- feat(backend): Improve & move graph export stripping logic
  - Add logic to strip `SecretField` values
  - Move node stripping logic to `NodeModel` from `GraphModel`
    - Add `NodeModel.stripped_for_export()` method
  - Add `NodeModel.block` property

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block and a
block that uses credentials
  - Go to `/library/agents/[id]` for the agent you just created
    - [x] -> "Open in builder" button should show
    - [x] -> "Open in builder" button should work
    - [x] -> "Export agent to file" button should show
    - [x] -> "Export agent to file" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [ ] -> ~~Exported file contains no user IDs~~
  - Go to `/library/agents/[id]` for an agent from the marketplace
    - [x] -> "Open in builder" button should not show
    - [x] -> "Export agent to file" button should not show
2025-03-16 14:10:53 +00:00
dependabot[bot]
6127727aeb chore(libs/deps-dev): bump ruff from 0.9.6 to 0.9.9 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9559)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.6 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.6...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.6&new-version=0.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-14 18:13:31 +00:00
Zamil Majdy
1bc3041615 feat(platform)!: Lock Supabase docker-compose code (#9620)
We have been submoduling Supabase for provisioning local Supabase
instances using docker-compose. Aside from the huge size of unrelated
code being pulled, there is also the risk of pulling unintentional
breaking change from the upstream to the platform.

The latest Supabase changes hide the 5432 port from the supabase-db
container and shift it to the supavisor, the instance that we are
currently not using. This causes an error in the existing setup.

## BREAKING CHANGES

This change will introduce different volume locations for the database
content, pulling this change will make the data content fresh from the
start. To keep your old data with this change, execute this command:
```
cp -r supabase/docker/volumes/db/data db/docker/volumes/db/data
```


### Changes 🏗️

The scope of this PR is snapshotting the current docker-compose code
obtained from the Supabase repository and embedding it into our
repository. This will eliminate the need for submodule / recursive
cloning and bringing the entire Supabase repository into the platform.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI
2025-03-14 17:16:13 +00:00
Nicholas Tindle
9c84dbddca fix: backend admin page logic was broken (#9616)
<!-- Clearly explain the need for these changes: -->

We're building out admin utilities so we need to bring back the `/admin`
route with RBAC. This PR goes through re-enabling that to work with the
latest changes

### Changes 🏗️
- Adds back removed logic
- Refactors the role checks to fix minor bug for admin page and more
importantly clarify
- Updates routes to the latest 
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with admin and authenticated user roles
  - [x] Test with logged out user role
- [x] For the above check the all the existing routes + new ones in the
`middleware.ts`
2025-03-14 16:37:15 +00:00
Zamil Majdy
b67c2e166b fix(platform): Fallback front-end-url to platform-url for billing page 2025-03-14 21:09:34 +07:00
Zamil Majdy
aa17872667 feat(backend): Fix failed RPC on Notification Service
(cherry picked from commit 801f3a3a24)
2025-03-14 14:37:04 +07:00
Zamil Majdy
801f3a3a24 feat(backend): Fix failed RPC on Notification Service 2025-03-14 14:36:44 +07:00
Zamil Majdy
b0fed43971 feat(backend): Fix failed RPC on Notification Service (#9630)
Although returning a Prisma object on an RPC is a bad practice, we have
instances where we do so and the type contains a `prisma.Json` field.
This Json field can't be seamlessly serialized and then converted back
into the Prisma object.

### Changes 🏗️

Replacing prisma object as return type on notification service with a
plain pydantic object as DTO.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Calling notification APIs through the RPC client.

(cherry picked from commit b9f31a9c44)
2025-03-14 13:26:34 +07:00
Zamil Majdy
b9f31a9c44 feat(backend): Fix failed RPC on Notification Service (#9630)
Although returning a Prisma object on an RPC is a bad practice, we have
instances where we do so and the type contains a `prisma.Json` field.
This Json field can't be seamlessly serialized and then converted back
into the Prisma object.

### Changes 🏗️

Replacing prisma object as return type on notification service with a
plain pydantic object as DTO.


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Calling notification APIs through the RPC client.
2025-03-14 01:54:18 +00:00
Zamil Majdy
90f9e4e94a fix(backend): Move Notification service to DB manager (#9626)
DatabaseManager is already provisioned in RestApiService, and
NotificationService lives within the same instance as the Rest Server.

### Changes 🏗️

Moving the DB calls of NotificationService to DatabaseManager.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>

  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

(cherry picked from commit f4d4bb83b0)
2025-03-13 13:44:47 +07:00
Zamil Majdy
f4d4bb83b0 fix(backend): Move Notification service to DB manager (#9626)
DatabaseManager is already provisioned in RestApiService, and
NotificationService lives within the same instance as the Rest Server.

### Changes 🏗️

Moving the DB calls of NotificationService to DatabaseManager.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-13 03:14:46 +00:00
dependabot[bot]
02618e1a52 chore(frontend/deps): bump the production-dependencies group across 1 directory with 13 updates (#9611)
Bumps the production-dependencies group with 13 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.4.0` |
`9.6.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.1.6` | `15.2.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.48.1` | `2.49.1` |
|
[@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table)
| `8.20.6` | `8.21.2` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.4.2` | `12.4.4` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.3.1` |
`12.4.11` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.474.0` | `0.479.0` |
| [next-themes](https://github.com/pacocoursey/next-themes) | `0.4.4` |
`0.4.5` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.5.1`
| `9.6.1` |
| [react-icons](https://github.com/react-icons/react-icons) | `5.4.0` |
`5.5.0` |
| [react-shepherd](https://github.com/shepherd-pro/shepherd) | `6.1.7` |
`6.1.8` |
| [uuid](https://github.com/uuidjs/uuid) | `11.0.5` | `11.1.0` |
| [zod](https://github.com/colinhacks/zod) | `3.24.1` | `3.24.2` |


Updates `@faker-js/faker` from 9.4.0 to 9.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.6.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update dependency typescript to v5.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3424">faker-js/faker#3424</a></li>
<li>chore(deps): update dependency ts-morph to v25.0.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3418">faker-js/faker#3418</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3419">faker-js/faker#3419</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3420">faker-js/faker#3420</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3421">faker-js/faker#3421</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3422">faker-js/faker#3422</a></li>
<li>chore(deps): remove obsolete dependency
<code>@​types/eslint</code>__js by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3425">faker-js/faker#3425</a></li>
<li>chore(deps): update dependency prettier to v3.5.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3423">faker-js/faker#3423</a></li>
<li>chore(deps): update pnpm to v10 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3427">faker-js/faker#3427</a></li>
<li>chore(deps): update eslint (major) by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3426">faker-js/faker#3426</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3428">faker-js/faker#3428</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3431">faker-js/faker#3431</a></li>
<li>docs: revert npm download badge by <a
href="https://github.com/LitoMore"><code>@​LitoMore</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li>feat(finance): add ISO 4217 numerical codes to Currency object by <a
href="https://github.com/Nfloc"><code>@​Nfloc</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li>feat(number): bigint multipleOf by <a
href="https://github.com/soc221b"><code>@​soc221b</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
<li>refactor(internet): deprecate color method for removal by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3401">faker-js/faker#3401</a></li>
<li>test: add snapshot test for all locales' character sets by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3276">faker-js/faker#3276</a></li>
<li>chore(release): 9.6.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3435">faker-js/faker#3435</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/LitoMore"><code>@​LitoMore</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li><a href="https://github.com/Nfloc"><code>@​Nfloc</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li><a href="https://github.com/soc221b"><code>@​soc221b</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0</a></p>
<h2>v9.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>test: retry verify tag 3 times by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3395">faker-js/faker#3395</a></li>
<li>test: disable summary for local by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3394">faker-js/faker#3394</a></li>
<li>chore: add usage trend by <a
href="https://github.com/cwtuan"><code>@​cwtuan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3403">faker-js/faker#3403</a></li>
<li>fix: test before using Buffers by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3400">faker-js/faker#3400</a></li>
<li>revert(chore): update LICENSE file (<a
href="https://redirect.github.com/faker-js/faker/issues/3350">#3350</a>)
by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3410">faker-js/faker#3410</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3411">faker-js/faker#3411</a></li>
<li>docs: change ejcheng by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3408">faker-js/faker#3408</a></li>
<li>docs: improve missing data error by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3406">faker-js/faker#3406</a></li>
<li>chore(release): 9.5.1 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3415">faker-js/faker#3415</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/cwtuan"><code>@​cwtuan</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1</a></p>
<h2>v9.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3377">faker-js/faker#3377</a></li>
<li>docs: faker.seed examples are not consistent after refresh by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3378">faker-js/faker#3378</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">9.6.0</a>
(2025-03-06)</h2>
<h3>Features</h3>
<ul>
<li><strong>finance:</strong> add ISO 4217 numerical codes to Currency
(<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)
(<a
href="ae9aec67b1">ae9aec6</a>)</li>
<li><strong>number:</strong> bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)
(<a
href="7b4f85a2c0">7b4f85a</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">9.5.1</a>
(2025-02-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>test before using Buffers (<a
href="https://redirect.github.com/faker-js/faker/issues/3400">#3400</a>)
(<a
href="ec7c9a8e60">ec7c9a8</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.5.0">9.5.0</a>
(2025-02-10)</h2>
<h3>Features</h3>
<ul>
<li><strong>image:</strong> add AI-generated avatars (<a
href="https://redirect.github.com/faker-js/faker/issues/3126">#3126</a>)
(<a
href="9e1395380c">9e13953</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="50b3241629"><code>50b3241</code></a>
chore(release): 9.6.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3435">#3435</a>)</li>
<li><a
href="62486af20c"><code>62486af</code></a>
test: add snapshot test for all locales' character sets (<a
href="https://redirect.github.com/faker-js/faker/issues/3276">#3276</a>)</li>
<li><a
href="1982431fd0"><code>1982431</code></a>
refactor(internet): deprecate color method for removal (<a
href="https://redirect.github.com/faker-js/faker/issues/3401">#3401</a>)</li>
<li><a
href="7b4f85a2c0"><code>7b4f85a</code></a>
feat(number): bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)</li>
<li><a
href="ae9aec67b1"><code>ae9aec6</code></a>
feat(finance): add ISO 4217 numerical codes to Currency (<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)</li>
<li><a
href="57d39d7442"><code>57d39d7</code></a>
docs: revert npm download badge (<a
href="https://redirect.github.com/faker-js/faker/issues/3433">#3433</a>)</li>
<li><a
href="bf3aa8b064"><code>bf3aa8b</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3431">#3431</a>)</li>
<li><a
href="f591459aff"><code>f591459</code></a>
chore(deps): update devdependencies (<a
href="https://redirect.github.com/faker-js/faker/issues/3428">#3428</a>)</li>
<li><a
href="1db428ab97"><code>1db428a</code></a>
chore(deps): update eslint (major) (<a
href="https://redirect.github.com/faker-js/faker/issues/3426">#3426</a>)</li>
<li><a
href="b7e7714b8b"><code>b7e7714</code></a>
chore(deps): update pnpm to v10 (<a
href="https://redirect.github.com/faker-js/faker/issues/3427">#3427</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.6.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~st-ddt">st-ddt</a>, a new releaser for
<code>@​faker-js/faker</code> since your current version.</p>
</details>
<br />

Updates `@next/third-parties` from 15.1.6 to 15.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.2.1</h2>
<h3>Core Changes</h3>
<ul>
<li>Unify Link and Form prefetching: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76184">#76184</a></li>
<li>Turbopack: Ensure server actions sourcemaps tests pass: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76157">#76157</a></li>
<li>[dev-overlay] control dark theme in one place: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76528">#76528</a></li>
<li>[dev-overlay] change css var for terminal: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76590">#76590</a></li>
<li>[dev-overlay] Discriminate stack frame settled typed: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76517">#76517</a></li>
<li>Remove obsolete <code>sourcePackage</code> references: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76550">#76550</a></li>
<li>refactor: remove unused variable in externals handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76599">#76599</a></li>
<li>fix: Add popular embedding libraries to serverExternalPackages: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76574">#76574</a></li>
<li>[Segment Cache] Implement hash-only navigations: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76179">#76179</a></li>
<li>Webpack: abstract away getting compilation spans: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76579">#76579</a></li>
<li>report compiler duration for webpack and improve numbers: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76665">#76665</a></li>
<li>[dev-overlay] fix dark theme missing close bracket: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76672">#76672</a></li>
<li>Remove <code>revalidate</code> property from incremental cache
<code>ctx</code> for <code>FETCH</code> kind: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76500">#76500</a></li>
<li>[dev-overlay] fix: env name label style was out of sync with error
type label: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76668">#76668</a></li>
<li>Turbopack: avoid celling source maps before minify: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76626">#76626</a></li>
<li>refactor(CI): Merge all four bundler test manifest scripts into one:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76652">#76652</a></li>
<li>[metadata] fix duplicate metadata for parallel routes: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76669">#76669</a></li>
<li>[Segment Cache] Omit from bundle if flag disabled: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76622">#76622</a></li>
<li>[Segment Cache] Support output: &quot;export&quot; mode: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75671">#75671</a></li>
<li>[Segment Cache] Refresh on same-page navigation: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76223">#76223</a></li>
<li>[metadata] re-enable streaming metadata with PPR: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76119">#76119</a></li>
<li>[Segment Cache] Search param fallback handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75990">#75990</a></li>
<li>[Segment Cache] Fix: canonicalURL omits origin: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76444">#76444</a></li>
<li>fix metadata basePath for manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76681">#76681</a></li>
<li>Propagate expire time to <code>cache-control</code> header and
prerender manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76207">#76207</a></li>
<li>Show revalidate/expire columns in build output: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76343">#76343</a></li>
<li>Gate alternate bundler behind canary only: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76634">#76634</a></li>
<li>[dynamicIO] routes with dynamic segments should be able to be static
in dev: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76691">#76691</a></li>
<li>[repo] upgrade ts <code>5.8.2</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a></li>
<li>[metadata]: ensure metadata boundary is only rendered once on client
nav: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76692">#76692</a></li>
<li>[metadata] clean up redudant options: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76712">#76712</a></li>
<li>Fix uniqueness detection for <code>generateStaticParams</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76713">#76713</a></li>
<li>Upgrade React from <code>22e39ea7-20250225</code> to
<code>d55cc79b-20250228</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76680">#76680</a></li>
<li>[Turbopack] Compute module batches and use them for chunking: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76133">#76133</a></li>
<li>[Dev Tools] Improve keyboard interactions for menu &amp; overlays:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76754">#76754</a></li>
<li>Keep server code out of browser chunks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76660">#76660</a></li>
<li>Turbopack: inline minify into code generation and make it a plain
function instead of a turbo tasks function: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76628">#76628</a></li>
<li>fix edge runtime asset fetch in pages api: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76750">#76750</a></li>
<li>Update use-cache-unknown-cache-kind.test.ts snapshot for alternate
bundler: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76682">#76682</a></li>
</ul>
<h3>Example Changes</h3>
<ul>
<li>docs: fix reading <code>params</code> code blocks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76705">#76705</a></li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>fix(rustdoc): Fix rustdoc warnings, block on rustdoc failures in CI:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76448">#76448</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="633878112e"><code>6338781</code></a>
v15.2.1</li>
<li><a
href="197b4bb709"><code>197b4bb</code></a>
v15.2.1-canary.6</li>
<li><a
href="0b699b1c8d"><code>0b699b1</code></a>
v15.2.1-canary.5</li>
<li><a
href="4bf1ee117d"><code>4bf1ee1</code></a>
[repo] upgrade ts <code>5.8.2</code> (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a>)</li>
<li><a
href="6f6001a87a"><code>6f6001a</code></a>
v15.2.1-canary.4</li>
<li><a
href="5f1df89fdc"><code>5f1df89</code></a>
v15.2.1-canary.3</li>
<li><a
href="f06a72e11e"><code>f06a72e</code></a>
v15.2.1-canary.2</li>
<li><a
href="2497f81d1b"><code>2497f81</code></a>
v15.2.1-canary.1</li>
<li><a
href="83610c6a84"><code>83610c6</code></a>
v15.2.1-canary.0</li>
<li><a
href="b0416fbb44"><code>b0416fb</code></a>
v15.2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/commits/v15.2.1/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/supabase-js` from 2.48.1 to 2.49.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.49.1</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.0...v2.49.1">2.49.1</a>
(2025-02-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> upgrade postgrest-js 1.19.2 (<a
href="3f01c3fbc4">3f01c3f</a>)</li>
</ul>
<h2>v2.49.0</h2>
<h1><a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.0">2.49.0</a>
(2025-02-24)</h1>
<h3>Features</h3>
<ul>
<li>bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)
(<a
href="a9ece9a4ae">a9ece9a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fceca48c37"><code>fceca48</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1369">#1369</a>
from supabase/avallete/chore-bump-postgrest-js-1-19-2</li>
<li><a
href="a9ece9a4ae"><code>a9ece9a</code></a>
feat: bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)</li>
<li><a
href="3f01c3fbc4"><code>3f01c3f</code></a>
fix(deps): upgrade postgrest-js 1.19.2</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-table` from 8.20.6 to 8.21.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/table/releases"><code>@​tanstack/react-table</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.21.2</h2>
<p>Version 8.21.2 - 2/11/25, 8:59 PM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>arrIncludes autoremove filterFn (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5623">#5623</a>)
(2efaf57) by lukebui</li>
<li>lit-table: spread table options in lit adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5904">#5904</a>)
(36dede1) by <a
href="https://github.com/kadoshms"><code>@​kadoshms</code></a></li>
</ul>
<h3>Docs</h3>
<ul>
<li>row accessor bug in example code block (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5893">#5893</a>)
(b1506a7) by Valerii Petryniak</li>
<li>virtualizer tbody from onchange (827b098) by Kevin Van Cott</li>
<li>exp virtual - remeasure when table state changes (9e6987d) by Kevin
Van Cott</li>
<li>angular: add expanding and sub components examples (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5898">#5898</a>)
(099e1a4) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>example name (57703a4) by Kevin Van Cott</li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/table-core</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/angular-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/qwik-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/solid-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/svelte-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/vue-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table-devtools</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
</ul>
<h2>v8.21.1</h2>
<p>Version 8.21.1 - 2/3/25, 5:37 AM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>lit-table: dynamic data updates in the Lit Table Adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5884">#5884</a>)
(9763877) by Luke Schierer</li>
</ul>
<h3>Docs</h3>
<ul>
<li>add experimental virtualization example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5895">#5895</a>)
(8d6e19f) by Kevin Van Cott</li>
<li>angular: add missing faker-js deps (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5883">#5883</a>)
(190c669) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>angular: add editable, row-dnd and performant column resizing
example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5881">#5881</a>)
(0baabdd) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.1</li>
</ul>
<h2>v8.21.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="db745afdb8"><code>db745af</code></a>
release: v8.21.2</li>
<li>See full diff in <a
href="https://github.com/TanStack/table/commits/v8.21.2/packages/react-table">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.4.2 to 12.4.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2>12.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d045503667"><code>d045503</code></a>
chore(packages): bump</li>
<li><a
href="7a00fe3520"><code>7a00fe3</code></a>
chore(getNodeConnections): remove deprecation <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5051">#5051</a></li>
<li><a
href="08b99e8719"><code>08b99e8</code></a>
Merge pull request <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5043">#5043</a>
from xyflow/refactor/dynamic-expand-parent</li>
<li><a
href="8dd2b4f9e2"><code>8dd2b4f</code></a>
chore(updateNodePositions): cleanup</li>
<li><a
href="0b67a6c303"><code>0b67a6c</code></a>
refactor(errors): show error when user drags uninitialized node <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5014">#5014</a></li>
<li><a
href="27df80b6a6"><code>27df80b</code></a>
fix(selection-listener): pass generics</li>
<li><a
href="d094ef0581"><code>d094ef0</code></a>
fix(OnSelectionChangeFunc): pass node and edge type generics <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5023">#5023</a></li>
<li><a
href="3969758af2"><code>3969758</code></a>
refactor(expandParent): use current value on drag <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5039">#5039</a></li>
<li><a
href="43f188d3b1"><code>43f188d</code></a>
fix(click-connections): handle isConnectableStart correctly <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5041">#5041</a></li>
<li><a
href="68591a8bf1"><code>68591a8</code></a>
Merge branch 'main' into no-deprecated</li>
<li>Additional commits viewable in <a
href="https://github.com/xyflow/xyflow/commits/@xyflow/react@12.4.4/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `framer-motion` from 12.3.1 to 12.4.11
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/motiondivision/motion/blob/main/CHANGELOG.md">framer-motion's
changelog</a>.</em></p>
<blockquote>
<h2>[12.4.11] 2025-03-10</h2>
<h3>Fixed</h3>
<ul>
<li>Preventing flattening of scroll animations when <code>type</code> or
<code>ease</code> are explicitly set.</li>
</ul>
<h2>[12.4.10] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Adding UMD bundles for <code>motion-dom</code> and
<code>motion-utils</code>.</li>
</ul>
<h2>[12.4.9] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>Reorder.Item</code> reordering causing
<code>lostpointercapture</code> event to fire.</li>
</ul>
<h2>[12.4.8] 2025-02-26</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed exiting children with <code>layoutDependency</code> not
animating layout changes because of a stale layout dependency.</li>
</ul>
<h2>[12.4.7] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>AnimatePresence</code> not triggering exit animations
when a child with <code>layout</code> or <code>drag</code> is
removed.</li>
</ul>
<h2>[12.4.6] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed drag gesture on child elements.</li>
</ul>
<h2>[12.4.5] 2025-02-19</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>onClick</code> handlers not working inside
<code>press</code> events.</li>
</ul>
<h2>[12.4.4] 2025-02-18</h2>
<h3>Fixed</h3>
<ul>
<li>Changed press, drag and pan gestures to use pointer capturing for
better usage within <code>iframe</code> embeds.</li>
</ul>
<h2>[12.4.3] 2025-02-12</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9316ca8202"><code>9316ca8</code></a>
v12.4.11</li>
<li><a
href="c291a09ff2"><code>c291a09</code></a>
Updating changelog</li>
<li><a
href="9e2923c5e4"><code>9e2923c</code></a>
Fix scroll easing (<a
href="https://redirect.github.com/motiondivision/motion/issues/3106">#3106</a>)</li>
<li><a
href="18b71d1395"><code>18b71d1</code></a>
v12.4.10</li>
<li><a
href="e89a0c20c9"><code>e89a0c2</code></a>
Latest</li>
<li><a
href="d84031e1cd"><code>d84031e</code></a>
Latest</li>
<li><a
href="63e7597969"><code>63e7597</code></a>
Updating rollup</li>
<li><a
href="3fcf837c1f"><code>3fcf837</code></a>
v12.4.9</li>
<li><a
href="c58920f6f2"><code>c58920f</code></a>
Updating changelog</li>
<li><a
href="c889431567"><code>c889431</code></a>
Fixing pointer capture and Reorder item (<a
href="https://redirect.github.com/motiondivision/motion/issues/3097">#3097</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/motiondivision/motion/compare/v12.3.1...v12.4.11">compare
view</a></li>
</ul>
</details>
<br />

Updates `lucide-react` from 0.474.0 to 0.479.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lucide-icons/lucide/releases">lucide-react's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.479.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(<code>@​lucide/svelte</code>): Lucide svelte 5 package by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2753">lucide-icons/lucide#2753</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0">https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0</a></p>
<h2>Version 0.478.0</h2>
<h2>What's Changed</h2>
<ul>
<li>ci(pr-comment): Fix icon preview comment on PRs by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2854">lucide-icons/lucide#2854</a></li>
<li>fix(ci): run lint pr title on title change by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2872">lucide-icons/lucide#2872</a></li>
<li>fix(metadata): name change reflected in contributions by <a
href="https://github.com/AnnaSasDev"><code>@​AnnaSasDev</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2866">lucide-icons/lucide#2866</a></li>
<li>fix(icons): changed <code>brackets</code> icon by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2863">lucide-icons/lucide#2863</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0">https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0</a></p>
<h2>New icons 0.477.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>square-round-corner</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2323">#2323</a>)
by <a href="https://github.com/liamb13"><code>@​liamb13</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>circle-slash-2</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2837">#2837</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>Fixes and new icons 0.476.0</h2>
<h2>Fixes</h2>
<ul>
<li>fix(lucide-react): Revert exports property package.json, fixing edge
worker environments. by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2814">lucide-icons/lucide#2814</a></li>
<li>fix(lucide): Lucide create element function returning SVG Element by
<a href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in
<a
href="https://redirect.github.com/lucide-icons/lucide/pull/2816">lucide-icons/lucide#2816</a></li>
</ul>
<h2>New icons 🎨</h2>
<ul>
<li><code>shield-user</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2608">#2608</a>)
by <a
href="https://github.com/sebinemeth"><code>@​sebinemeth</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>beef</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2832">#2832</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>New icons 0.475.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>circle-small</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars-stroke</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>non-binary</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>transgender</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1787b82cfe"><code>1787b82</code></a>
build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2804">#2804</a>)</li>
<li><a
href="b46927e510"><code>b46927e</code></a>
fix(lucide-react): Revert exports property package.json, fixing edge
worker e...</li>
<li><a
href="3ab6c373a0"><code>3ab6c37</code></a>
build(deps-dev): bump vite from 5.4.12 to 5.4.13 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2798">#2798</a>)</li>
<li><a
href="ba2c4b526f"><code>ba2c4b5</code></a>
build(deps-dev): bump vite from 5.1.8 to 5.4.12 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2786">#2786</a>)</li>
<li><a
href="50630b3aaf"><code>50630b3</code></a>
ci: Improve build speeds (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2778">#2778</a>)</li>
<li>See full diff in <a
href="https://github.com/lucide-icons/lucide/commits/0.479.0/packages/lucide-react">compare
view</a></li>
</ul>
</details>
<br />

Updates `next-themes` from 0.4.4 to 0.4.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pacocoursey/next-themes/releases">next-themes's
releases</a>.</em></p>
<blockquote>
<h2>v0.4.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: map theme to class using ValueObject in injected script by <a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li>Reduce number of renders by pre-setting resolvedTheme by <a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
<li>Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/331">pacocoursey/next-themes#331</a></li>
<li>Bump the npm_and_yarn group across 1 directory with 7 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/341">pacocoursey/next-themes#341</a></li>
<li>chore: Fix corepack errors in CI by <a
href="https://github.com/pacocoursey"><code>@​pacocoursey</code></a> in
<a
href="https://redirect.github.com/pacocoursey/next-themes/pull/342">pacocoursey/next-themes#342</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li><a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d12996b4e8"><code>d12996b</code></a>
chore: Fix corepack errors in CI (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/342">#342</a>)</li>
<li><a
href="b77db23e9f"><code>b77db23</code></a>
Bump the npm_and_yarn group across 1 directory with 7 updates (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/341">#341</a>)</li>
<li><a
href="d3fa4ee9ad"><code>d3fa4ee</code></a>
Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
director...</li>
<li><a
href="ad83567b11"><code>ad83567</code></a>
Reduce number of renders by pre-setting resolvedTheme (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/338">#338</a>)</li>
<li><a
href="1b510445a3"><code>1b51044</code></a>
fix: map theme to class using ValueObject in injected script (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/330">#330</a>)</li>
<li>See full diff in <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-day-picker` from 9.5.1 to 9.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gpbl/react-day-picker/releases">react-day-picker's
releases</a>.</em></p>
<blockquote>
<h2>v9.6.1</h2>
<p>This release addresses an accessibility issue, adds a new
<code>animate</code> prop and fixes other minor bugs.</p>
<h3>Possible Breaking Change in Custom Styles</h3>
<p>To address a <a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2630">focus
lost bug</a> affecting navigation buttons, we <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">updated</a>
the buttons to use <code>aria-disabled</code> instead of the
<code>disabled</code> attribute.</p>
<p>This change may cause custom styles for those disabled buttons to
break. To fix it in your code, update the CSS selector to target
<code>[aria-disabled=&quot;true&quot;]</code>:</p>
<pre lang="diff"><code>- .rdp-button_next:disabled,
+ .rdp-button_next[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
- .rdp-button_previous:disabled,
+ .rdp-button_previous[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
</code></pre>
<h3>Animating Month Transitions</h3>
<p>Thanks to the work by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a>, we have
added animations to DayPicker. The new <a
href="http://daypicker.dev/docs/navigation#animate"><code>animate</code>
prop</a> enables CSS transitions for captions and weeks when navigating
between months:</p>
<!-- raw HTML omitted -->
<pre lang="tsx"><code>&lt;DayPicker animate /&gt;
</code></pre>
<p>Customizing the animation style can be challenging due to the HTML
table structure of the grid. We may address this in the future. Please
leave your feedback in <a
href="https://github.com/gpbl/react-day-picker/discussions">DayPicker
Discussions</a>.</p>
<h2>What's Changed</h2>
<ul>
<li>feat: new <code>animate</code> prop by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2684">gpbl/react-day-picker#2684</a></li>
<li>feat(performance): add <code>sideEffects</code> property to
package.json by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2673">gpbl/react-day-picker#2673</a></li>
<li>fix(accessibility): focus lost when navigation button is disabled by
<a href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">gpbl/react-day-picker#2685</a></li>
<li>fix: render selected days with <code>selected</code> modifier when
disabled by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2700">gpbl/react-day-picker#2700</a></li>
<li>fix(build): remove extra files from package.json by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2692">gpbl/react-day-picker#2692</a></li>
<li>chore(types): fix deprecation of select event handler types by <a
href="https://github.com/timothyis"><code>@​timothyis</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<h3>v9.6.1</h3>
<ul>
<li>fix(build): add missing .css entries in package.json files by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2703">gpbl/react-day-picker#2703</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/timothyis"><code>@​timothyis</code></a>
made their first contribution in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1</a></p>
<h2>v9.6.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c37983b8e5"><code>c37983b</code></a>
build: bump v9.6.1</li>
<li><a
href="3d382fe18d"><code>3d382fe</code></a>
build: add missing .css entries in package.json files (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2703">#2703</a>)</li>
<li><a
href="ca71182076"><code>ca71182</code></a>
build: bump v9.6.0</li>
<li><a
href="37f759a718"><code>37f759a</code></a>
chore: animate prop, remove <a
href="https://github.com/experimental"><code>@​experimental</code></a>
tag</li>
<li><a
href="9aa3d35062"><code>9aa3d35</code></a>
docs: update for new <code>animate</code> prop (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2694">#2694</a>)</li>
<li><a
href="d7d0a8ad13"><code>d7d0a8a</code></a>
fix: render selected days with selected modifier when disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2700">#2700</a>)</li>
<li><a
href="48f00dc20f"><code>48f00dc</code></a>
fix: focus lost when navigation button is disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2685">#2685</a>)</li>
<li><a
href="6617c9bf81"><code>6617c9b</code></a>
chore: update keyframes names (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2695">#2695</a>)</li>
<li><a
href="13e0a4acc9"><code>13e0a4a</code></a>
test: fix test related to first of month (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2693">#2693</a>)</li>
<li><a
href="ebde52dd02"><code>ebde52d</code></a>
docs: fix no-wrap-table style for paragraphs</li>
<li>Additional commits viewable in <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-icons` from 5.4.0 to 5.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react-icons/react-icons/releases">react-icons's
releases</a>.</em></p>
<blockquote>
<h2>v5.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>[React 19] Update IconType type to return React.ReactNode by <a
href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
<li>Bump vite from 5.2.10 to 5.4.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/996">react-icons/react-icons#996</a></li>
<li>Bump nanoid from 3.3.7 to 3.3.8 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1005">react-icons/react-icons#1005</a></li>
<li>Bump vite from 5.4.11 to 5.4.14 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1021">react-icons/react-icons#1021</a></li>
<li>Bump esbuild from 0.20.2 to 0.25.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1027">react-icons/react-icons#1027</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a>
made their first contribution in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0">https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0</a></p>
<table>
<thead>
<tr>
<th>Icon Library</th>
<th>License</th>
<th>Version</th>
<th align="right">Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://circumicons.com/">Circum Icons</a></td>
<td><a
href="https://github.com/Klarr-Agency/Circum-Icons/blob/main/LICENSE">MPL-2.0
license</a></td>
<td>1.0.0</td>
<td align="right">288</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 5</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>5.15.4-3-gafecf2a</td>
<td align="right">1612</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 6</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>6.6.0</td>
<td align="right">2050</td...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-12 14:33:06 +00:00
Bently
c1e329497c fix(otto): prevent breaking when failing to make api call (#9613)
These are some tweaks for Otto to try prevent the frontend from breaking
when/if it fails to make the otto api call.

### Changes 🏗️
Removed unused reference to ``OTTO_API_URL`` in
[backend/server/v2/otto/routes.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6545b2ed01d619cc095b8d0ca6d5baa86d1448dc970cff508669ec3430675d28)
Removed un-needed ``revalidatePath("/build");`` from
[frontend/src/app/build/actions.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6861f6b90ce91138b3821c0a82abfffbc09f425c26b7335fac60f54894e353e9)
Added a 60 second timeout to the api call in
[backend/server/v2/otto/service.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-63c9a1a5337cd5e4ddec7544a258916d4998a6cb5c4181f621d7e24f654bd5c8)
Added a better error handler in
[frontend/src/components/OttoChatWidget.tsx](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-7351568d5c588b77f35d80994ca6800a7faa1b3b0ca229970cfa491eab4b4b33)
Made it so errors return a structured error response for better handling
in
[frontend/src/app/build/actions.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6861f6b90ce91138b3821c0a82abfffbc09f425c26b7335fac60f54894e353e9)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] do not set the ENV var for ``otto_api_url`` 
- [x] Set the ENV var for ``NEXT_PUBLIC_BEHAVE_AS`` to ``CLOUD`` to have
the chat ui show in the build page
- [x] Send otto a message from the build page frontend, it should fail
and not break the frontend
- [x] Send otto a message that contains graph data to see if the sending
graph data works, this should also fail and not break the frontend
  - [x] now we set the ENV for ``otto_api_url``
  - [x] Send otto a message from the build page frontend, it should work
- [x] Send otto a message that contains graph data to see if the sending
graph data works, it should work
2025-03-12 07:36:55 +00:00
Zamil Majdy
c179a49218 fix(platform): Make LibraryAgent image as initial StoreListing image - Followup (#9617)
### Changes 🏗️

This is a follow-up of
https://github.com/Significant-Gravitas/AutoGPT/pull/9610
* Addressing the PR comments described in the mentioned PR
* Removed debug logging
* Fix image state loading logic on agent upload process

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create an library agent and try to create a store listing.

<img width="1409" alt="image"
src="https://github.com/user-attachments/assets/dc86dc97-a33f-4336-ab90-19a53c6f7e0f"
/>
2025-03-12 13:12:09 +07:00
Nicholas Tindle
942ac0bae4 feat(backend): baseline summary processing (#9596)
<!-- Clearly explain the need for these changes: -->
We want to be able to process emails on a scheduled basis for summaries.
This adds the baselines for that

### Changes 🏗️
- Adds new tooling to Scheduluer to handle the in-memory schedule for
the weekly processing
- Adds new exposes to notification manager to handle the different data
models for scheduled emails
- adds new models to the notification data models to handle the
different requirements for scheduled emails, closely paralleling the
existing notification ones
- Adds new email template

Note: After testing, email sending was disabled until the template and
data filling are done later down the line. We don't want to email people
random stuff, ya know?

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test sending an email on the scheduled basis 
- [x] Make sure you get the email, ignoring the fact that all the data
isn't real inside it

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-12 05:19:23 +00:00
Zamil Majdy
af65058bb7 fix(platform): Make LibraryAgent image as initial StoreListing image (#9610)
### Changes 🏗️

We've been auto-generating the thumbnail image for the agent in the
library, this PR is propagating that image as an initial image for the
store listing. This PR also removes the fetch all query for getting the
count for paginating library agent.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create an library agent and try to create a store listing.

<img width="1409" alt="image"
src="https://github.com/user-attachments/assets/dc86dc97-a33f-4336-ab90-19a53c6f7e0f"
/>
2025-03-12 05:17:38 +00:00
Zamil Majdy
f37d4c2659 fix(platform): Set Supabase CLI version (#9619)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-12 04:28:44 +00:00
Zamil Majdy
f9d88d2981 fix(backend): Remove useless agent marketplace indices (#9608)
### Changes 🏗️

Removed some indices in the marketplace table that were useless.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-11 09:59:46 +00:00
Zamil Majdy
3458b94fcc fix(backend): Fix failing websocket service due to not requiring DB connection 2025-03-11 15:34:53 +07:00
Nicholas Tindle
08cd935a47 feat(backend): batching operations for queues + agent run become batched (#9586)
<!-- Clearly explain the need for these changes: -->
We don't want to spam the user with similar notification types so we
want to group them up over a timespan and handle that as a group of
notifications.
### Changes 🏗️
- Adds a batch queue
- Moves the ExecutionScheduleur to a generic Scheduler
- Makes the Agent run a batch operation
- Fixes various bugs in how we originally made the batch db models and
queries
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Run 10 agents back to back
  - [x] Notice how many emails you get
- [x] Wait a bit and you should after an hour (change the cron rule to
speed up testing this) you'll get an email and see all the batches in
your db are empty

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-10 18:10:57 +00:00
Nicholas Tindle
b2e94611e8 feat(backend): be more defensive about how we load list data from db (#9592)
<!-- Clearly explain the need for these changes: -->
When swapping branches back and forth, I often hit stuff in my db that
is incompatible with other branches. This protects against it a bit
more.

### Changes 🏗️
- Adds filtering around converting data out of the db
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with weird and broken agents in db
  - [x] Go to the library page 
- [x] Notice in the server console that it warns of bad agents and the
page still loads
2025-03-10 17:07:30 +00:00
Zamil Majdy
020bf02e48 feat(backend): Reduce excessive application log, Make DB configurable, Set DB connection limit & timeout (#9605)
It's hard to configure the DB parameter at the moment, this PR gives an
option to provide URL parameter on the Prisma DATABASE_URL.

### Changes 🏗️

Changes:
* Reduce excessive application log
* Make DB configurable
* Set DB connection limit & timeout

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
2025-03-10 05:30:13 +00:00
Zamil Majdy
aa6f91039c feat(block): Allow undefined self-loop link to list input pin on AddToListBlock (#9599)
### Changes 🏗️

Creating a self-loop of the AddToListBlock requires a boilerplate of
adding a dummy block to trigger its execution.


![image](https://github.com/user-attachments/assets/329dd1f4-5b3b-4d34-8743-25bd4337d734)

If the only inbound link on an input pin comes from the same block, we
don't wait for that pin on the first execution (as it's never going to
come).


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-07 22:06:26 +00:00
MK4070
fa97632eae docs(online/offline): #8887 Move to a single source of truth for docs — Remove duplicate info from backend readme[.advanced].md (#9580)
addresses the changes requested here [Move to a single source of truth
for docs — Remove duplicate info from readme
#8887](https://github.com/Significant-Gravitas/AutoGPT/issues/8887)

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
changed readme files
2025-03-07 21:01:32 +00:00
Toran Bruce Richards
fe927c8345 fix(block): Add missing error pin to Exa Contents Block (#9604)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

The Exa Block has a missing error pin which prevents error handling,
this adds that.
2025-03-07 19:41:15 +00:00
Nicholas Tindle
fdd6a5d847 feat(backend): one click unsub for emails (#9564)
<!-- Clearly explain the need for these changes: -->
Per chat with toran, we want one click unsubscribe to work in things
like gmail to reduce spam. This implements the one click unsubscribe
feature, but it is difficult to test due to not being able to control
when it is shown.

### Changes 🏗️
- Adds one click unsub
- Casually fix google reauth by checking the correct variables (approved
to be in pr by Toran)
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Send an email
  - [x] Open headers on email and pull the link out
- [x] `curl -X POST <link>` and ensure unsubscribed from all messages.
Note that we can't control when the box is shown on various providers so
we just verify it works on our side for now by checking the headers


#### Configuration changes
Infra pr coming separately, but we did add the secret default to the
.env.example and the docker compose

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-07 13:57:47 +00:00
Zamil Majdy
f60bd07e15 fix(blocks): Fix Invalid input on SmartDecisionMakerBlock, add enchancement CountdownTimerBlock & 2025-03-07 16:55:00 +07:00
Reinier van der Leer
9210d448ee fix(backend): Unbreak add_store_agent_to_library 2025-03-06 22:40:24 +01:00
Bently
a0ecb96958 Feat(Otto) Add Initial Otto Chat Bot code (#9266)
### Changes 🏗️
This is to add the Otto chat bot to the frontend UI.

The changes i have made for this goes as follows:
- I have made and added a basic chat UI widget to the build page, this
will become the main UI for Otto, this will be getting updates in the
future.
- I have made an API route ``/api/otto/ask`` that will receive the
message from the frontend and pass it to the Otto API that we have setup
on GCP.

I already have plans for how we can improve the UI and make it more
modular, this way we can add more features to Otto down the line!

### Config Changes
When we merge this, we will need to add the ENV var for ``otto_api_url``
that will be the URL from GCP where the API is being hosted!

This is now ready for a review as the backend API is up and running, to
who ever does test this, if you want the API url please DM me 😄


![image](https://github.com/user-attachments/assets/230a7487-d88f-4a6b-9ff9-e1e0aac8c385)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Set the ENV var for ``otto_api_url`` - ask @Bentlybro for this
  - [x] Set the ENV var for  ``NEXT_PUBLIC_BEHAVE_AS`` to ``CLOUD``
  - [x] Send otto a message from the build page frontend 
- [x] Send otto a message that contains graph data to see if the sending
graph data works
2025-03-06 17:51:07 +00:00
Reinier van der Leer
7eb04663ed fix(frontend/library): Use correct graph version to render I/O (#9591)
- Fixes #9579

### Changes 🏗️

- Fetch & use specific graph version to render graph run I/O on
`/library/agents/[id]`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Run an Agent that yields an output
    - [x] -> should render normally without errors
  - Rename the Agent Output name
  - Save the modified Agent
- Open the Agent in the Agent library and attempt to view the output
from step 1
    - [x] -> should render normally without errors

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-06 17:10:52 +00:00
Nicholas Tindle
da2aa34e3e docs(security): Update disclosure timeline (#9581)
<!-- Clearly explain the need for these changes: -->
Update the security.md based on some advice we got :)

### Changes 🏗️
- Adds an update time window and clarifies time spans
<!-- Concisely describe all of the changes made in this pull request:
-->
2025-03-06 15:59:07 +00:00
Toran Bruce Richards
bc71eac0ec Change agent cover Image gen aspect ratio to 16:9 2025-03-06 14:35:25 +00:00
Krzysztof Czerwinski
3cf198eea1 feat(platform): Onboarding flow backend (#9511)
This PR adds backend to make Onboarding UI added in
https://github.com/Significant-Gravitas/AutoGPT/pull/9485 functional and
adds missing confetti screen at the end of Onboarding.

*Make sure to have at least any 2 agents in store when testing locally.*
Otherwise the onboarding will finish without showing agents.
Visit `/onboarding/reset` to reset onboarding state, otherwise it'll
always redirect to `/library` once finished.

### Changes 🏗️

- Onboarding opens automatically on sign up and login (if unfinished)
for all users
- Update db schema to add `UserOnboarding` and add migration
- Add GET and PATCH `/onboarding` endpoints and logic to retrieve and
update data Onboarding for a user
- Update `POST /library/agents` endpoint
(`addMarketplaceAgentToLibrary`), so it includes input and output nodes;
these are needed to know input schema for the Onboarding
- Use new endpoints during onboarding to fetch and update data
- Use agents from the marketplace and their input schema for the
onboarding
- Add algorithm to choose store agents based on user answers and related
endpoint `GET /onboarding/agents`
- Redirect outside onboarding if finished and resume on proper page
- Add `canvas-confetti` and `@types/canvas-confetti` frontend packages
- Add and show congrats confetti screen when user runs and agent and
before opening library
- Minor design updates and onboarding fixes

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Redirect to `/onboarding/*` on sign up and sign in (if onboarding
unfinished)
  - [x] Onboarding works and can be finished
  - [x] Agent runs on finish
- [x] Onboarding state is saved and logging out or refreshing page
restores correct state (user choices)
- [x] When onboarding finished, trying to go into `/onboarding`
redirects to `/library`

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-06 12:19:33 +00:00
Zamil Majdy
e5eadeace4 feat(backend): Improve SmartDecisionMaker Agent-loop capability & add Anthropics support (#9585)
### Changes 🏗️

There are a few agent-loop issues that this PR is addressing:
* There is a lack of support for agent-loop in Anthropic.
* Duplicated system & user prompt as the main objective prompt in the
agent loop.
* A long rendered text of conversation history by
SmartDecisionMakerBlock agent-loop in the UI.
* A lack of execution input being rendered in the execution list making
it harder to debug.



https://github.com/user-attachments/assets/be430000-bde0-40c6-8f2e-c97ce45b5ed1


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Create from scratch and execute an agent with at least 3 blocks
using SmartDecisionMaker Block.
2025-03-06 12:07:41 +00:00
Reinier van der Leer
231775f4d4 fix(backend): Unbreak add_marketplace_agent_to_library (#9578)
- Fixes #9577

### Changes 🏗️

- Add the required include statements to `LibraryAgent` queries
- Make a `library_agent_include(user_id)` utility in
`backend.data.includes`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - Go to an agent in the Marketplace; click "Add To Library"
    - [ ] -> should work, not return an error
- [ ] -> should redirect to `/library/agents/[id]` -> should load
normally
2025-03-06 10:53:28 +00:00
Nicholas Tindle
498b3ea882 feat(blocks): add list comments and update comment blocks (#9583)
<!-- Clearly explain the need for these changes: -->
As part of the code review agent, I found these blocks would be useful,
but not required. Adds the ability to list comments on an issue and PR
as well as update comments on an issue, pr and discussion


### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds Listing comments block
- Adds updating comment block

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Tested all of the new blocks on #9582 . Review it for context

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-03-06 07:51:27 +00:00
Nicholas Tindle
5b8947ed93 fix(backend): serialize the pydantic objects correctly for github checks and statuses (#9582)
<!-- Clearly explain the need for these changes: -->
Trying to run the GitHub Status blocks results in a serialization error

### Changes 🏗️
- Serializes the checks and blocks data objects correctly
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] make a one block agent, test it and make sure it works
2025-03-05 22:04:28 +00:00
Reinier van der Leer
3b53c6953a feat(platform): Agent Run "Stop" + "Delete" functionality (#9547)
- Resolves #9542

### Changes 🏗️

- feat(platform): Add "Delete run" button on `/library/agents/[id]` w/
confirm dialog
  - Add `AgentGraphExecution.isDeleted` column for soft delete
  - Add `DELETE /api/executions/{graph_exec_id}` endpoint
- feat(frontend): Add "Stop run" button on `/library/agents/[id]`

Technical improvements:
- refactor(frontend): Generalize `AgentDeleteConfirmDialog` ->
`DeleteConfirmDialog`
- refactor(frontend): Brand `GraphExecution.execution_id` and
`Schedule.id` to prevent mixing

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Click "Delete run" under "Run actions" in the right sidebar
    - [x] -> Confirmation dialog should show
      - Click "Delete"
        - [x] -> run should disappear from list
        - [x] -> view should switch to "Draft new run" view
        - [x] -> refresh page -> run should not be in list
  - Click "Delete" in the menu on a run in the list
    - [x] -> Confirmation dialog should show
      - Click "Delete"
        - [x] -> run should disappear from list
        - [x] -> refresh page -> run should not be in list

---------

Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com>
2025-03-05 16:14:59 +00:00
Reinier van der Leer
37331d09e4 Revert "fix(frontend): Consolidate Application Buttons to ShadcN Base Button Component" (#9575)
Reverts Significant-Gravitas/AutoGPT#9570

Some of the styling changes cause issues with existing parts of the
application, and I don't know if partially reverting would cause issues
with the other refactored components/elements.

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-05 15:42:26 +00:00
Reinier van der Leer
595d2020c9 feat(frontend): Loading indicator for button click handlers (#9573)
Show that something is happening when a click handler doesn't return
immediately.

### Changes 🏗️

- Show a loading indicator on buttons while their click handler is
running


https://github.com/user-attachments/assets/5878c5a4-cba2-4125-a101-21220d713232

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]`; click "Run again" on an existing run
    - [x] -> loading indicator should show
    - [x] -> button state should reset once the API request completes
- [x] Check that existing `Button` elements aren't adversely affected by
the styling changes, especially `overflow-hidden`
2025-03-05 14:56:52 +00:00
Zamil Majdy
c091a7be62 feat(backend): Integrate Ideogram for auto-generating created agent thumbnail (#9568)
### Changes 🏗️

Integrate Ideogram for auto-generating created agent thumbnail

![preview of the UI with a generated
image](https://github.com/user-attachments/assets/87fb4179-59e0-4109-b5aa-d45ebe9decf7)

**Note:** switching back to the "old" Replicate-based image generator is
possible by setting `USE_AGENT_IMAGE_GENERATION_V2=false`.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-05 14:41:42 +00:00
Bently
b50ecbf7e9 fix(frontend): Featured agents cards layout+sizing (#9482)
### Changes 🏗️

right now the featured agents cards dont have a set width/height, so
they change depending on the content, and the description is duplicated.
also, the "by {creator username}" was removed. currently it looks like
this:


![chrome_SBwRrkEN28](https://github.com/user-attachments/assets/1bff2206-ec80-46ee-8b84-e510de04b869)

with my changes, i set a fixed width and height so they dont change, the
description now only shows on hover and is truncated to 11 lines, and i
added back the "by {creator username}"


![chrome_qujRVF4LsX](https://github.com/user-attachments/assets/927629db-1bdd-426c-8d6d-d39a67152389)

---------

Co-authored-by: Andy Hooker <58448663+andrewhooker2@users.noreply.github.com>
2025-03-05 14:12:28 +00:00
Zamil Majdy
900a661266 fix(backend): Filter out empty object from conversation_history pin on SmartDecisionMakerBlock 2025-03-05 21:23:31 +07:00
Zamil Majdy
55d6495155 fix(backend): Increase logging level threshold of RPC service to WARNING (#9576)
Increase the logging threshold to WARNING to avoid chatty RPC service
request logs.

Before:
![RPC calls show up in backend
log](https://github.com/user-attachments/assets/70791f87-12ef-4a12-8343-4b8641302faa)
2025-03-05 12:35:43 +00:00
Andy Hooker
b5c100748f fix(library): Anchor message to bottom of page (#9572)
This PR fixes the layout of the Library page. It properly anchors the
'old experience' message to the bottom of the viewport and improves the
overall page structure using semantic HTML and Tailwind best practices.

Resolves: #9524 

### Changes 🏗️
- Restructured the LibraryPage component to use proper semantic HTML
with a `<main>` element
- Added a fixed Alert component at the bottom of the viewport with 8px
margin
- Used ShadcN Alert component for the 'old experience' message for UI
consistency
- Implemented responsive behavior to hide the alert on mobile screens
- Optimized Tailwind classes by using the `container` utility and
removing redundant styles
- Improved accessibility and UX by using appropriate semantic elements

### Screenshot
<img width="926" alt="image"
src="https://github.com/user-attachments/assets/e393007c-639e-4383-922c-41fa67133da8"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

<details>
  <summary>Alert Message at Bottom of Library Page</summary>

- [ ] Visit the Library page and verify the alert appears fixed at the
bottom with 8px margin
- [ ] Resize browser window to various desktop sizes and confirm alert
remains centered
- [ ] Scroll through Library page content and verify the alert stays
fixed at the bottom
- [ ] Open developer tools and toggle to mobile view (width < 640px) to
confirm alert is hidden
- [ ] Test in both light and dark mode to ensure alert styling is
consistent with theme
- [ ] Click the "here" link in the alert and verify it navigates to the
monitoring page
- [ ] Verify that QuestionMarkCircled icon in the alert is properly
styled and visible

</details>

---------

Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-03-05 10:11:21 +00:00
Libin Rahman
09494809c1 Enhance process management with error handling and lifecycle improvements (#9565)
Enhance process management with error handling, lifecycle improvements,
and better resource management

- Added robust error handling for process startup failures.
- Implemented proper cleanup of processes during failure scenarios.
- Added detailed error logging for process failures and cleanup
operations.
- Enhanced process lifecycle with health checks.
- Added success logging for process terminations.


These updates enhance the reliability and maintainability of the system.

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-05 07:44:42 +00:00
Andy Hooker
122be761b6 fix(frontend): Consolidate Application Buttons to ShadcN Base Button Component (#9570)
Our application currently uses multiple inconsistent button
implementations across the codebase.
This PR standardizes buttons to use our base Button component that
leverages ShadcN, improving UI consistency, maintainability, and
accessibility.

Resolves: #9567 

### Changes 🏗️

- Replaced custom button implementations in various components with our
base Button component and greatly reduced redundant overlapping styles.
- Paired with our designer to streamline our `globals.css` to match the
desired approach.
- Added button variant documentation in Storybook
- Deprecated the obsolete 'primary' class  and marked it.

### Screenshots 📷

#### Variants  
<img width="466" alt="image"
src="https://github.com/user-attachments/assets/9e4f6360-57ec-4f28-b702-e57252d67def"
/>

<img width="418" alt="image"
src="https://github.com/user-attachments/assets/a9af17dc-e8bc-429d-a9ac-8380e34b9089"
/>

<img width="129" alt="image"
src="https://github.com/user-attachments/assets/2df5d184-bb49-4640-bfb4-879360ca35e6"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

<details>
  <summary>Button Consolidation Test Plan</summary>
 Visual Verification

- [ ] Verify all button variants (default, destructive, outline,
secondary, ghost, link) render correctly
- [ ] Confirm button styling is consistent across all themes (light,
dark, etc.)
- [ ] Validate that the rounded-full style is applied to appropriate
variants

 Functional Testing

- [ ]  Test click handlers continue to work on all migrated buttons
- [ ] Verify hover, focus, and active states display correctly on all
buttons
- [ ]  Confirm disabled states are working properly
- [ ]  Test loading state animations and behavior

 Responsive Testing

- [ ]  Verify button layouts on mobile devices (< 640px)
- [ ]  Confirm button layouts on tablet devices (640px - 1024px)
- [ ]  Test button layouts on desktop screens (> 1024px)
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-05 07:01:11 +00:00
Zamil Majdy
3adc9724fe fix(backend): Error out execution when no starting node is available (#9566)
### Changes 🏗️

Prevent a graph being executed and do nothing by erroring out when no
starting node is available.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-05 06:58:57 +00:00
Zamil Majdy
e7888ddb9f feat(backend): Enable safe URL redirect on web requests for blocks (#9555)
We've disabled the request for security reasons, and the current request
library breaks on the 301 web response.

### Changes 🏗️

Add manually safe URL redirect on our web request layer.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-05 05:19:29 +00:00
Nicholas Tindle
265a9265f7 feat(backend): low balance notiifcation (#9534)
<!-- Clearly explain the need for these changes: -->
For emailing, we want the user to know when an agent stopped because
their balance was too low. This is the first step of that.

### Changes 🏗️
- Raise InsufficientBalanceError from credit system rather than value
error when user runs out of money
- Handle when an agent output isn't hooked up well
- Fix the contents of the email for low balance to be a bit more aligned
with the PRD
- expose the topup intent from the db manager
- objectify the execution stats so we can pass it around a bit more type
safe
- extract the notification stuff in manager into a function
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Set balance to $0.01
  - [x] Run an agent that costs something more than $0.01
  - [x] Check you get an email
  - [x] Check your top up link works

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-05 05:16:57 +00:00
Reinier van der Leer
27a5635607 feat(platform): Library Agent "Delete" functionality (#9546)
- Resolves #9545

### Changes 🏗️

- fix(platform): Make "Delete" button on `/monitoring` soft-delete the
`LibraryAgent` instead of hard-deleting the corresponding `AgentGraph`
- feat(frontend): Add "Delete agent" button on `/library/agents/[id]`

Technical:
- fix(backend): Accept partial input on `update_library_agent` endpoint
- feat(backend): Add `GET /api/library/agents/{library_agent_id}`
endpoint
- refactor(frontend): Replace use of `GraphMeta` by `LibraryAgent` where
possible on `/library/agents/[id]`

Also, out of scope but important:
- fix(frontend): Hide buttons that require direct graph access depending
on `agent.can_access_graph`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to the Library and select an agent
    - [x] -> `/library/agents/[id]` should load normally
      - Save this URL for later (especially the ID)!
  - Click "Delete agent" on `/library/agents/[id]`
    - [x] -> should show a confirmation dialog
    - Click "Delete" to confirm
      - [x] -> should redirect back to `/library`
      - [x] -> deleted agent should no longer be listed in the Library
  - Click "Delete agent" on `/monitoring`
    - [x] -> should show a confirmation dialog
    - Click "Delete" to confirm
      - [x] -> agent should disappear from agent list
- [x] -> views should reset / deselect the deleted agent where
applicable
2025-03-03 16:49:44 +00:00
Zamil Majdy
ef00ab51e0 fix(backend): Cleanup on validation logic for AgentExecutorBlock & SmartDecisionMakerBlock 2025-03-02 18:17:01 +07:00
Zamil Majdy
36447a0c58 feat(backend): Add tool execution response on Smart Decision Block (#9552)
**Proposal / Request For Comments** 

The tool calling provided by the LLM provider requires an output
generated by the tool to be looped back as part of the conversation
history. The scope of this PR is trying to address the need to fulfill
the feature expectation.

### Changes 🏗️

* `Last Tool Output` is introduced to loop back the output of the tool
back to Smart Decision Block.
* Smart Decision Block execution will be pending unless the `Last Tool
Output` us provided where a pending tool call is present in the
conversation history.
* **Known hack**: The last tool output will prefill all the pending tool
calls from the conversation history.
* A few tweaks were required to allow a blocking loop to be executed
without awaiting on all the inbound links.

<img width="1395" alt="image"
src="https://github.com/user-attachments/assets/fdad4407-621b-45d0-a457-76b2d4c853b9"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-02 10:46:41 +00:00
Zamil Majdy
1e31136358 fix(backend): Fix json to_dict method on string value 2025-03-02 09:33:16 +07:00
Zamil Majdy
a024b9a398 fix(backend): Fix conversation history propagation on SmartDecisionBlock & AIBlock 2025-03-02 05:49:40 +07:00
Zamil Majdy
83d879ea65 fix(backend): Use raw content from the LLM as conversation history (#9551)
### Changes 🏗️

Instead of parsing an LlmMessage by ourselves, we use raw content from
the LLM as conversation history and accept any format it introduces.

Example output:
```
[
  {
    "role": "system",
    "content": "Thinking carefully step by step decide which function to call. Always choose a function call from the list of function signatures. The test graph is basically an all knowing answer machine you can use it to get an answer"
  },
  {
    "role": "user",
    "content": "Hey how's the weather today"
  },
  {
    "role": "assistant",
    "audio": null,
    "content": null,
    "refusal": null,
    "tool_calls": [
      {
        "id": "call_Z7CKKIkldylmfWJdE6ZnDxjr",
        "type": "function",
        "function": {
          "name": "storevalueblock",
          "arguments": "{\"input\":\"I don't have context for your location. Could you provide one?\"}"
        }
      }
    ],
    "function_call": null
  }
]
```

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-01 20:41:38 +00:00
Zamil Majdy
d3b83b79f9 fix(backend): Append prompt into the conversations output & Remove unused output pin on SmartDecisionBlock (#9550)
### Changes 🏗️

Append prompt into the conversations output & Remove unused output pin
on SmartDecisionBlock.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-01 13:52:20 +00:00
Zamil Majdy
91b1cc90aa fix(backend): Fix failure of get_graph_metadata call on SmartDecisionMaker.py 2025-03-01 19:12:34 +07:00
Zamil Majdy
7747ad8f4c feat(backend): Add conversation history as Smart Decision Block output (#9540)
Now that the MVP for Smar Decision Block is available, we need to add
this info in the block output:

Messages (list) - The messages list sent to the LLM plus its generated
response as the latest assistant entry. This is a single list of
dictionaries in standard LLM API format).

### Changes 🏗️

* Add `conversations` output pin that populates the update
`conversation_history` input pin with the assistant response.
* Refactored `Smart Decision Block` to avoid downloading the whole graph
on each execution, remove code duplication, declutter data fetching.
* Minor UI issue on the smart decision block entry in the search bar. 

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

Co-authored-by: Swifty <craigswift13@gmail.com>
2025-02-28 15:03:34 +00:00
Reinier van der Leer
f6c93eeeff feat(platform): Cost indication for agent runs (#9527)
- Resolves #9181

### Changes 🏗️

- Add agent run cost indication to `/monitoring` and
`/library/agents/[id]`

Backend:
- Add `GraphExecutionMeta.cost` property - value sourced from
`AgentGraphExecution.stats["cost"]`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - Run an agent
- [ ] Check out the agent run on `/library/agents/[id]` -> should show
cost
  - [ ] Check out the agent run on `/monitoring` -> should show cost
2025-02-28 14:20:46 +00:00
Zamil Majdy
52ee7d150e fix(frontend): Remove unused Stripe on frontend (#9536)
### Changes 🏗️

Remove Stripe on frontend.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-27 11:13:53 +00:00
Zamil Majdy
c1b12d4a12 feat(backend): Add cost on node & graph execution stats (#9520)
<!-- Clearly explain the need for these changes: -->
We want the agent run data to be accurate, which means we need to
collect it in the right place and with the correct data

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Updates email templates
- Updates how we collect the data for the agent run event

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Run agents and read the email we get

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-27 09:39:06 +00:00
Nicholas Tindle
d7cdf751a8 fix(backend): allow more than one arg on the tuple (#9535)
<!-- Clearly explain the need for these changes: -->
We allow tuples to be returned from exceptions, but pydantic restricts
their size to 1 b/c the typehint. This fixes that

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds `, ...` to the tuple type hint

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Extracted from other pr where it was tested as part of an
exception
2025-02-27 09:18:14 +00:00
Zamil Majdy
58f6491496 feat(backend): Propagate error arguments on RPC exceptions (#9533)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

Exception can contain more than message, so we propagate the whole args
as long as it is serializable.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-27 06:58:25 +00:00
Swifty
1011b70d41 fix(platform): Add Block Costs for SDM Block (#9531)
The Smart Decision Maker block needs to have costs associated with it.

### Changes 🏗️

- Added config for SDM Block Costs
2025-02-26 22:07:32 +00:00
Zamil Majdy
538ad06547 fix(backend): Fix exception response on RPC error & Missing Graph Running Status (#9529)
HttpResponse error introduced by RPC is buggy since we are returning the
exception as is instead of the string version of it.
Also `RUNNING` status on the graph execution is missing.

### Changes 🏗️

* Refactored & fixed the exception return handling on RPC failure.
* Add `RUNNING` status update during the graph execution.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-26 20:23:33 +00:00
Reinier van der Leer
5f5d30a17a fix(backend): Use Pyro for RPC by default (#9528)
- Follow-up to #9508 

HTTP-based RPC has not been fully tested and should be disabled by
default.

### Changes 🏗️

- Disable HTTP-based RPC and use Pyro by default
2025-02-26 14:26:09 +00:00
Nicholas Tindle
af8ea93260 feat(backend): handle bounced emails from postmark (#9506)
<!-- Clearly explain the need for these changes: -->
If we bounce too many emails from Postmark, they will be really upset
with us, which is not so good. We need a way to react when we bounce
emails, so we set it up so they notify us via webhooks.

We also need to build authentication into those webhooks to prevent
random people from sending us fake webhooks.

All this together means we need a new route for the inbound webhook.

To do this, we need a way to track if the email address is valid. So,
after chatting with @itsababseh, we are adding a validated email field
that defaults to `True` because all the users are already validated in
prod. In dev, we may suffer.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds special API Key auth handler to the libs so that we can easily
test stuff on the /docs endpoint and re-use it if needed
- Adds New Secret for this API key from postmark
- Adds a validatedEmail boolean to the`User` table
- Adds a postmark endpoint to the routers list for handling the inbound
webhook from Postmark
- "Handle" all the various things this endpoint could send us (most of
them we do nothing about)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Sign up with john@example.com email (the one postmark uses in
webhooks)
  - [x] Set email validation to true
  - [x] Send the bounce webhook notice
  - [x] Check it gets set to false

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)
2025-02-25 20:59:41 +00:00
Swifty
108b0aaa4c feat(blocks): Enabled block Usage for Smart Decision Maker Block (#9514)
Originally we did not allow Blocks to be used as tools due to the
limitations of communicating the correct tool function signatures.

It has however, been decided to allow them to be used knowing that there
are limitations with them.


### Changes 🏗️

- Added ability to execute blocks as tools

### Checklist 📋

<img width="613" alt="Screenshot 2025-02-25 at 12 49 26"
src="https://github.com/user-attachments/assets/e614f56d-2bdc-46c9-8c2c-e56f80343bde"
/>
 - create an agent with an SDM block and a block as a tool
 - run agent and make sure the block can be called as a tool

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-25 17:37:06 +00:00
Swifty
e752f0f342 feat(platform/library): Agent Library v2 (#9407)
- Resolves #8774
  - Resolves #8775
- Includes back-end work for #9168
- Partially implements #8776
- Partially implements #8777

### Changes 🏗️

- Add `/library` page
- Change target of "Library" navigation link from `/monitoring` to
`/library`
- Move `/agents/[id]` page to `/library/agents/[id]`
- Set application background color to `bg-neutral-50`
- Redirect to new library agent's "runs" page (`/library/agents/[id]`)
after adding from marketplace

Further (technical) frontend changes:
- Add types and client methods for all library API endpoints
- Added `primary` variant to `agptui/Button` component

Backend changes:
- Add functionality to library backend
  - Aggregate agent status
  - Image generation for use in library view
    - Add `LibraryAgent.imageUrl` column to DB schema
  - Sorting & pagination
  - Explicit relation between library agents and their graph's creator
- Refactor & update API endpoints for DX
- Other minor refactoring
- Add missing but required `MEDIA_GCS_BUCKET_NAME` to `.env.example`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - `/library`
    - [x] Create agent from scratch -> should show up on `/library`
- [x] Add agent to library from marketplace -> should show up on
`/library`
- [x] Click on agent in `/library` -> should go to
`/library/agents/[id]`
    - [x] Test sorting & pagination functionality
  - `/library/agents/[id]`
    - [x] Fill out inputs and click "Run" -> should run like normally
    - [x] Select completed agent run -> should show all inputs & outputs
- [x] Click "run again" on a completed agent run -> should run
successfully with same input
  - [x] `/monitoring` should still work the same as before

---------

Co-authored-by: abhi1992002 <abhimanyu1992002@gmail.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-25 17:29:15 +00:00
Swifty
b603ed2d2a feature(platform) Smart Decision Maker Block (#9490)
## Task

The SmartDecisionMakerBlock is a specialized block in a graph-based
system that leverages a language model (LLM) to make intelligent
decisions about which tools or functions to invoke based on a
user-provided prompt. It is designed to process input data, interact
with a language model, and dynamically determine the appropriate tools
to call from a set of available options, making it a powerful component
for AI-driven workflows.

## How It Works in Practice

- **Scenario:** Imagine a workflow where a user inputs, "Send an email
to John about the meeting." The SmartDecisionMakerBlock is connected to
tools like send_email, schedule_meeting, and search_contacts.
- **Execution:**
1. The block receives the prompt and system instructions (e.g., "Choose
a function to call").
2.It identifies the available tools from the graph and constructs their
signatures (e.g., send_email(recipient, subject, body)).
3. The LLM analyzes the prompt and decides to call send_email with
arguments like recipient: "John", subject: "Meeting", body: "Let’s
discuss...".
4. The block yields these tool-specific outputs, which can be picked up
by downstream nodes to execute the email-sending action.


## Changes 🏗️
- Add the Smart Decision Maker (SDM) block.
- Break circular imports in integration code.

![Screenshot 2025-02-21 at 10 23
25](https://github.com/user-attachments/assets/6fbfd875-fb1b-4d77-8051-a214c3c86082)


## Work in Progress

⚠️ **Important note this is a temporary UX for the system - UX will be
addressed in a future PR** ⚠️

### Current Status

I’m currently focused on the smart decision logic. The main additions in
the ongoing PR include:
- Defining function signatures for OpenAI function-calling schemas based
on node links and the linked blocks.
- Adding tests for function signature generation.
- Force all tool calls to be made via an agent. (Need to uncomment)
- Restrict each tool call entry to a single node.
- simplify the output emission process, to emit each parameter one at a
time.
- Change test to use agents and hardcode output how I think it should
work to test it does actually work
- Hook up openai, in a simplified way, to test the function calling
(mock for testing)
- Once all the above is working, use credentials system and build of
llm.py



### What’s Next

- Review Process

### Reviewers Phase 1

This PR is now ready for review, during the first phase of reviews I'm
looking for comments on approach and logic.

Out of scope:  code style and organization at this stage

### Reviewers Phase 2

Once we are all happy with the approach and logic. We can open the
review process to general code quality and nits, to be considered.

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-25 15:29:22 +01:00
Zamil Majdy
f1fa9009b3 fix(backend): Fix api host for FastAPI RPC Server 2025-02-25 17:04:45 +07:00
Zamil Majdy
d0d3cc07a3 fix(frontend): Minor UI changes; Align badges & buttons on LibraryV1 (#9512)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

While V2 Library is coming, this has been my pet peeve

<img width="1428" alt="image"
src="https://github.com/user-attachments/assets/39c0b84e-4dfe-44e1-b455-cd0330ae7222"
/>

to

<img width="1428" alt="image"
src="https://github.com/user-attachments/assets/ab41973b-8ce8-4772-a4ab-e0dcd8b75464"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-25 09:37:01 +00:00
Zamil Majdy
1d59fc869d feat(backend): Pyro to FastAPI migration for micro service (#9508)
Due to legacy reasons, we've been using Pyro for our inter-process
communication channel. While it fulfilled our initial needs, there were
a few limitations that have been encountered:
* Each connection will reserve 1 thread, when the thread is running out
there will be no connection being accepted by the service.
* Lack of asynchronous execution mode, we are locked in the sync
execution which ended up wasting the I/O bound workload. Moving away
from this will unlock async execution support for agent blocks.
* Low throughput, while the database is still the main bottleneck, we've
started seeing instances where the service is being denied due to the
high traffic of the Pyro service.

### Changes 🏗️

Replace the usage of Pyro with the FastAPI Rest HTTP server and make the
code work.

Introduced the new config:
`use_http_based_rpc`: Whether to use HTTP-based RPC for communication
between services.

If it's enabled FastAPI will be used, if it's disabled existing Pyro
will be used.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Create from scratch and execute an agent with at least 3 blocks
with cost (AI blocks).
- [x] Import an agent from file upload, and confirm it executes
correctly

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-25 05:04:10 +00:00
dependabot[bot]
a694cf1e9d chore(libs/deps-dev): bump ruff from 0.9.3 to 0.9.6 in /autogpt_platform/autogpt_libs in the development-dependencies group across 1 directory (#9454)
Bumps the development-dependencies group with 1 update in the
/autogpt_platform/autogpt_libs directory:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.3 to 0.9.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.6</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Add <code>external_task.{ExternalTaskMarker,
ExternalTaskSensor}</code> for <code>AIR302</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16014">#16014</a>)</li>
<li>[<code>flake8-builtins</code>] Make strict module name comparison
optional (<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15951">#15951</a>)</li>
<li>[<code>flake8-pyi</code>] Extend fix to Python &lt;= 3.9 for
<code>redundant-none-literal</code> (<code>PYI061</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16044">#16044</a>)</li>
<li>[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15985">#15985</a>)</li>
<li>[<code>ruff</code>] Implement <code>indented-form-feed</code>
(<code>RUF054</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16049">#16049</a>)</li>
<li>[<code>ruff</code>] Skip type definitions for
<code>missing-f-string-syntax</code> (<code>RUF027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16054">#16054</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-annotations</code>] Correct syntax for
<code>typing.Union</code> in suggested return type fixes for
<code>ANN20x</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16025">#16025</a>)</li>
<li>[<code>flake8-builtins</code>] Match upstream module name comparison
(<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16006">#16006</a>)</li>
<li>[<code>flake8-comprehensions</code>] Detect overshadowed
<code>list</code>/<code>set</code>/<code>dict</code>, ignore variadics
and named expressions (<code>C417</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15955">#15955</a>)</li>
<li>[<code>flake8-pie</code>] Remove following comma correctly when the
unpacked dictionary is empty (<code>PIE800</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16008">#16008</a>)</li>
<li>[<code>flake8-simplify</code>] Only trigger <code>SIM401</code> on
known dictionaries (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15995">#15995</a>)</li>
<li>[<code>pylint</code>] Do not report calls when object type and
argument type mismatch, remove custom escape handling logic
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15984">#15984</a>)</li>
<li>[<code>pyupgrade</code>] Comments within parenthesized value ranges
should not affect applicability (<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16027">#16027</a>)</li>
<li>[<code>pyupgrade</code>] Don't introduce invalid syntax when
upgrading old-style type aliases with parenthesized multiline values
(<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16026">#16026</a>)</li>
<li>[<code>pyupgrade</code>] Ensure we do not rename two type parameters
to the same name (<code>UP049</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16038">#16038</a>)</li>
<li>[<code>pyupgrade</code>] [<code>ruff</code>] Don't apply renamings
if the new name is shadowed in a scope of one of the references to the
binding (<code>UP049</code>, <code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16032">#16032</a>)</li>
<li>[<code>ruff</code>] Update <code>RUF009</code> to behave similar to
<code>B008</code> and ignore attributes with immutable types (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16048">#16048</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16043">#16043</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-datetime</code>] Ignore <code>.replace()</code> calls
while looking for <code>.astimezone</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16050">#16050</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid <code>TC004</code> false
positive where the runtime definition is provided by
<code>__getattr__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16052">#16052</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Improve <code>ruff-lsp</code> migration document (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16072">#16072</a>)</li>
<li>Undeprecate <code>ruff.nativeServer</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16039">#16039</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a
href="https://github.com/Daverball"><code>@​Daverball</code></a></li>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a href="https://github.com/Lee-W"><code>@​Lee-W</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/carlosgmartin"><code>@​carlosgmartin</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/dylwil3"><code>@​dylwil3</code></a></li>
<li><a
href="https://github.com/junhsonjb"><code>@​junhsonjb</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.6</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Add <code>external_task.{ExternalTaskMarker,
ExternalTaskSensor}</code> for <code>AIR302</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16014">#16014</a>)</li>
<li>[<code>flake8-builtins</code>] Make strict module name comparison
optional (<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15951">#15951</a>)</li>
<li>[<code>flake8-pyi</code>] Extend fix to Python &lt;= 3.9 for
<code>redundant-none-literal</code> (<code>PYI061</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16044">#16044</a>)</li>
<li>[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15985">#15985</a>)</li>
<li>[<code>ruff</code>] Implement <code>indented-form-feed</code>
(<code>RUF054</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16049">#16049</a>)</li>
<li>[<code>ruff</code>] Skip type definitions for
<code>missing-f-string-syntax</code> (<code>RUF027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16054">#16054</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-annotations</code>] Correct syntax for
<code>typing.Union</code> in suggested return type fixes for
<code>ANN20x</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16025">#16025</a>)</li>
<li>[<code>flake8-builtins</code>] Match upstream module name comparison
(<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16006">#16006</a>)</li>
<li>[<code>flake8-comprehensions</code>] Detect overshadowed
<code>list</code>/<code>set</code>/<code>dict</code>, ignore variadics
and named expressions (<code>C417</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15955">#15955</a>)</li>
<li>[<code>flake8-pie</code>] Remove following comma correctly when the
unpacked dictionary is empty (<code>PIE800</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16008">#16008</a>)</li>
<li>[<code>flake8-simplify</code>] Only trigger <code>SIM401</code> on
known dictionaries (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15995">#15995</a>)</li>
<li>[<code>pylint</code>] Do not report calls when object type and
argument type mismatch, remove custom escape handling logic
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15984">#15984</a>)</li>
<li>[<code>pyupgrade</code>] Comments within parenthesized value ranges
should not affect applicability (<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16027">#16027</a>)</li>
<li>[<code>pyupgrade</code>] Don't introduce invalid syntax when
upgrading old-style type aliases with parenthesized multiline values
(<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16026">#16026</a>)</li>
<li>[<code>pyupgrade</code>] Ensure we do not rename two type parameters
to the same name (<code>UP049</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16038">#16038</a>)</li>
<li>[<code>pyupgrade</code>] [<code>ruff</code>] Don't apply renamings
if the new name is shadowed in a scope of one of the references to the
binding (<code>UP049</code>, <code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16032">#16032</a>)</li>
<li>[<code>ruff</code>] Update <code>RUF009</code> to behave similar to
<code>B008</code> and ignore attributes with immutable types (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16048">#16048</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16043">#16043</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-datetime</code>] Ignore <code>.replace()</code> calls
while looking for <code>.astimezone</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16050">#16050</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid <code>TC004</code> false
positive where the runtime definition is provided by
<code>__getattr__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16052">#16052</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Improve <code>ruff-lsp</code> migration document (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16072">#16072</a>)</li>
<li>Undeprecate <code>ruff.nativeServer</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16039">#16039</a>)</li>
</ul>
<h2>0.9.5</h2>
<h3>Preview features</h3>
<ul>
<li>Recognize all symbols named <code>TYPE_CHECKING</code> for
<code>in_type_checking_block</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15719">#15719</a>)</li>
<li>[<code>flake8-comprehensions</code>] Handle builtins at top of file
correctly for <code>unnecessary-dict-comprehension-for-iterable</code>
(<code>C420</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15837">#15837</a>)</li>
<li>[<code>flake8-logging</code>] <code>.exception()</code> and
<code>exc_info=</code> outside exception handlers (<code>LOG004</code>,
<code>LOG014</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15799">#15799</a>)</li>
<li>[<code>flake8-pyi</code>] Fix incorrect behaviour of
<code>custom-typevar-return-type</code> preview-mode autofix if
<code>typing</code> was already imported (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15853">#15853</a>)</li>
<li>[<code>flake8-pyi</code>] Fix more complex cases
(<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15821">#15821</a>)</li>
<li>[<code>flake8-pyi</code>] Make <code>PYI019</code> autofixable for
<code>.py</code> files in preview mode as well as stubs (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15889">#15889</a>)</li>
<li>[<code>flake8-pyi</code>] Remove type parameter correctly when it is
the last (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15854">#15854</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="524cf6e515"><code>524cf6e</code></a>
Bump version to 0.9.6 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16074">#16074</a>)</li>
<li><a
href="857cf0deb0"><code>857cf0d</code></a>
Revert tailwindcss v4 update (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16075">#16075</a>)</li>
<li><a
href="0f1eb1e2fc"><code>0f1eb1e</code></a>
Improve migration document (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16072">#16072</a>)</li>
<li><a
href="b69eb9099a"><code>b69eb90</code></a>
Fix reference definition labels for backtick-quoted shortcut links (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16035">#16035</a>)</li>
<li><a
href="d2f661f795"><code>d2f661f</code></a>
RUF009 should behave similar to B008 and ignore attributes with
immutable typ...</li>
<li><a
href="07cf8852a3"><code>07cf885</code></a>
[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15985">#15985</a>)</li>
<li><a
href="c08989692b"><code>c089896</code></a>
Update Rust crate rustc-hash to v2.1.1 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16060">#16060</a>)</li>
<li><a
href="869a9543e4"><code>869a954</code></a>
Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16043">#16043</a>)</li>
<li><a
href="cc0a5dd14a"><code>cc0a5dd</code></a>
Directly include <code>Settings</code> struct for the server (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16042">#16042</a>)</li>
<li><a
href="b54e390cb4"><code>b54e390</code></a>
Update Rust crate clap to v4.5.28 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16059">#16059</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.3...0.9.6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.3&new-version=0.9.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-24 09:02:25 +00:00
Zamil Majdy
cca99c850d fix(frontend): Minor UI tweak, fix non-accessible button on phone screen (#9504)
### Changes 🏗️
Fix these buttons:

![image](https://github.com/user-attachments/assets/bd6753a3-49b4-4d9b-8533-6d145dc8f387)
<img width="337" alt="image"
src="https://github.com/user-attachments/assets/702bf3e1-7168-4372-8dcf-71abdea0bc19"
/>
<img width="337" alt="image"
src="https://github.com/user-attachments/assets/362a5e44-3bd4-4849-ba92-8b21cfcfe767"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Abhimanyu Yadav <122007096+Abhi1992002@users.noreply.github.com>
2025-02-24 09:01:22 +00:00
Tom Hu
bfcc0c93b3 feat: add Codecov test analytics for flaky and failed tests (#9420)
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-21 21:04:19 -06:00
dependabot[bot]
d310943f34 chore(backend/deps): bump websockets from 13.1 to 14.2 in /autogpt_platform/backend (#9398)
Bumps [websockets](https://github.com/python-websockets/websockets) from
13.1 to 14.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/python-websockets/websockets/releases">websockets's
releases</a>.</em></p>
<blockquote>
<h2>14.2</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
<h2>14.1</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
<h2>14.0</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="624a36cc9c"><code>624a36c</code></a>
Release version 14.2.</li>
<li><a
href="c8242bbb3a"><code>c8242bb</code></a>
Add changelog for <a
href="https://redirect.github.com/python-websockets/websockets/issues/1566">#1566</a>.</li>
<li><a
href="17e309a830"><code>17e309a</code></a>
Mention another symptom in the changelog.</li>
<li><a
href="7de24bd087"><code>7de24bd</code></a>
Improve previous commit.</li>
<li><a
href="7e617b2a57"><code>7e617b2</code></a>
Add regex support in <code>ServerProtocol(origins=...)</code>.</li>
<li><a
href="613f3f0ef8"><code>613f3f0</code></a>
Prevent close() from blocking when reading is paused.</li>
<li><a
href="e7a098e1a0"><code>e7a098e</code></a>
Prevent AssertionError in the recv_events thread.</li>
<li><a
href="031ec31b70"><code>031ec31</code></a>
Prevent close() from blocking when reading is paused.</li>
<li><a
href="6317c00cc5"><code>6317c00</code></a>
Clarify behavior of <code>recv(timeout=0)</code> behavior.</li>
<li><a
href="b1e88fcb77"><code>b1e88fc</code></a>
Bump pypa/cibuildwheel from 2.21.3 to 2.22.0</li>
<li>Additional commits viewable in <a
href="https://github.com/python-websockets/websockets/compare/13.1...14.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=websockets&package-manager=pip&previous-version=13.1&new-version=14.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-02-22 00:08:08 +00:00
Krzysztof Czerwinski
0b992223df feat(frontend): Onboarding flow UI (#9485)
### Changes 🏗️
This PR adds interactive UI for the onboarding flow, without any
connection to the backend.
Visit `/onboarding` to see it!

- Add Onboarding pages to `app/onboarding/`
- Add Onboarding components to `components/onboarding`

Note:
- Backend isn't connected, so the agents won't run and state isn't
preserved
- Onboarding state is lost on refresh

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...
2025-02-21 16:07:27 +00:00
Krzysztof Czerwinski
70d095ba98 fix(frontend): Fix Run/Stop button on Builder page refresh (#9503)
When opened graph is running and Builder page is refreshed the bottom
says `Run` but should show `Stop` instead.

### Changes 🏗️

- Fix state on refresh, so that the bottom button is `Stop` if graph is
currently running

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Refresh still retrieves past and ongoing execution updates
- [x] Bottom Builder button says `Stop` when page is refreshed and graph
is running
  - [x] `Stop` button works and terminates execution
2025-02-21 13:09:05 +00:00
Zamil Majdy
a692eedb1c feat(backend): Notification Integration for credits system (#9488)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

Add email notifications on refund events.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-20 12:19:58 +00:00
Nicholas Tindle
4ae016606b feat(backend): move failed messages into a dead letter queue (#9501)
<!-- Clearly explain the need for these changes: -->
When we fail to process something, we don't want to keep retrying
forever. We should store those and process them later

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Fix the type of the failed exchange from Direct to Topic to allow
filtering based on name (allows us later to do more advanced handling of
queue types)
- abstract processing the messages in a queue a bit to reduce repeated
code
- abstract how we check if a user wants a notification so that its a bit
easier to process
- Handle errors better
- Abstract model parsing

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-20 10:09:51 +00:00
Zamil Majdy
63005631f0 fix(frontend): Remove invalid font class names (#9499)
There are many occurrences in the UI code that we are defining the font
through class but it refers to the invalid font-family names. This
causes the component to end up rendering the text using Times New Roman.

### Changes 🏗️

Remove manual font definition through string font-family name.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-20 09:18:46 +00:00
Reinier van der Leer
296eee0b4f feat(platform/library): Library v2 > Agent Runs page (#9051)
- Resolves #8780
- Part of #8774

### Changes 🏗️

- Add new UI components
- Add `/agents/[id]` page, with sub-components:
  - `AgentRunsSelectorList`
    - `AgentRunSummaryCard`
      - `AgentRunStatusChip`
  - `AgentRunDetailsView`
  - `AgentRunDraftView`
  - `AgentScheduleDetailsView`

Backend improvements:
- Improve output of execution-related API endpoints: return
`GraphExecution` instead of `NodeExecutionResult[]`
- Reduce log spam from Prisma in tests

General frontend improvements:
- Hide nav link names on smaller screens to prevent navbar overflow
- Clean up styling and fix sizing of `agptui/Button`

Technical frontend improvements:
- Fix tailwind config size increments
- Rename `font-poppin` -> `font-poppins`
- Clean up component implementations and usages
   - Yeet all occurrences of `variant="default"`
- Remove `default` button variant as duplicate of `outline`; make
`outline` the default
- Fix minor typing issues

DX:
- Add front end type-check step to `pre-commit` config
- Fix logging setup in conftest.py

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - `/agents/[id]` (new)
    - Go to page -> list of runs loads
    - Create new run -> runs; all I/O is visible
    - Click "Run again" -> runs again with same input
  - `/monitoring` (existing)
    - Go to page -> everything loads
    - Selecting agents and agent runs works

---------

Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Swifty <craigswift13@gmail.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-19 22:07:03 +00:00
Nicholas Tindle
f722c70c50 feat(blocks): add base for smartlead, apollo, and zerobounce blocks (#9387)
<!-- Clearly explain the need for these changes: -->
We want to support some more advanced search specific actions. These are
the base API layers and sample blocks for some of the services we need.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- support pydantic models as an output format
- add apollo
- add smartlead
- add zerobounce

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Built agents to test

---------

Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-19 16:30:46 +00:00
Andy Hooker
a0be165835 feat(settings): Rework user settings page with Form, loading skeleton… (#9476)
Implemented a fully functional user settings page allowing changes to
account details and notification preferences. This change uses a server
first approach and adds much needed form validation to this page.
This PR has added loading skeletons for better UX during data fetching.
Refactored related components to support these changes and finally
implemented server actions to streamline data ingestion.

## Note to developers:
At the moment the notification switches set back to default upon save.
We will want to pass in this information after the api is implemented.


## Changes 🏗️
Rebuilt / Refactored `SettingsFormInput` to `SettingsForm`:
- Implemented Form Validation 
- Implemented a form schema with Zod to validate user input
- Added toast messaging to properly inform the user if the form has been
successfully completed or if there is an error in thrown from the server
action.

Added `loading.tsx`
- Using `Skeletons` we can deliver a better loading UI for our users
causing less screen shifting.

Added `actions.ts`
- Added a server action for the settings page. This server action will
handle the updating of user's settings for this page. It handles the
interaction between the application and supabase. After this server
action is ran we revalidate the path for our settings page ensuring
proper data passed to our components.

There is an additional TODO for @ntindle for the api endpoint getting
created. This endpoint will cover the newly added notification switches
and it's toggles.

## Screenshots 📷
### Before Changes:
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/f5283fd5-705b-47cf-a7fa-4ca4d7f03444"
/>


### After Changes:
<img width="762" alt="image"
src="https://github.com/user-attachments/assets/20f96f01-b138-4eb7-8867-ce62a2d603d4"
/>

<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/0ae363f5-068f-48e5-8b0f-c079a08f9242"
/>

<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/8cb045ef-f322-4992-881e-fb92281c55cb"
/>

#### Form Validation
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/b78cfef6-94da-49f1-9c93-56cdb9ea4c96"
/>
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/ade5dce9-8c4b-40eb-aa0f-ff6d31bc3c3c"
/>
<img width="245" alt="image"
src="https://github.com/user-attachments/assets/88866bbf-4e33-43d9-b04a-b53ac848852d"
/>



### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:


<details>
  <summary>Test Plan</summary>
 
  - [ ] Goto the route of `profile/settings`
  - [ ] Add an invalid email and notice the new validation messaging
- [ ] Add invalid passwords that do not match and or is under 8
characters notice the new validation messaging
- [ ] Select the cancel button and notice that the form has been set
back to the default values
- [ ] With the form untouched notice the `Save changes` button is
disabled. Toggle a switch and notice the `Save changes` button is now
enabled.
- [ ] Enter in a valid pair of new passwords in the `New Password` and
`Confirm New Password` input fields and select `Save changes`
- [ ] Enter in the same passwords again and notice that we will now be
shown an Error. This error is bubbling up from supabase in our backend
and is stating `New password should be different from the old password`
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-19 14:51:37 +00:00
Reinier van der Leer
d1832ce10b fix(frontend): Fix return type and usage of api.listLibraryAgents() (#9498)
- Follow-up to #9258

The front end is fetching `/library/agents` -> `LibraryAgent[]` but
using the result as `GraphMeta[]`. This breaks a bunch of things.

### Changes 🏗️

Frontend:
- Add `LibraryAgent` type for `api.listLibraryAgents()`
- Amend all broken usages of `LibraryAgent` objects
- Introduce branded typing for `LibraryAgent.id` and `GraphMeta.id` to
disallow mixing them. This prevents incorrect use in the future, and
reduces the chance of this frontend issue accumulating interest on
existing open PRs.

Backend:
- Add a migration to create `LibraryAgent` objects for all existing
`AgentGraphs`


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Check that all existing agents are listed in the agents list on
`/monitoring` (check against DB or `GET /api/graphs`)
  - [x] Check that all views of `/monitoring` work
  - [x] Try to run an agent and check its status
2025-02-18 17:39:44 +00:00
Nicholas Tindle
dcbbe11c53 fix(backend): correctly check if email service is set up (#9497)
<!-- Clearly explain the need for these changes: -->
I made a mistake in how we check if postmark exists

### Changes 🏗️
- adds a more explicit setting of postmark to none and extra checking to
prevent its use if it isn’t set

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] I have no plan, it’s a simple logic bug so if it passes CI it’s
good
2025-02-18 14:33:26 +00:00
Zamil Majdy
43460b8553 feat(platform): Add Dispute & Refund resolution process (#9466)
### Changes 🏗️

Added the dispute & refund handling on the system.


https://github.com/user-attachments/assets/2d9c7b48-2ee1-401d-be65-5e9787c8130e




### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-18 09:20:46 +00:00
Zamil Majdy
0117006373 fix(backend): Fix failing poetry.lock validation on CI (#9489)
### Changes 🏗️

Poetry.lock is using the old version that the CI is not using.
Set the Poetry version to ^2.1.1.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-18 08:37:28 +00:00
Nicholas Tindle
e550846737 feat(backend): add ability to send emails to notification service (#9469)
<!-- Clearly explain the need for these changes: -->

We need a way to send emails for the email service to function. We will
depend on Postmark to do that.

This PR adds a simple email-sending service with the required settings
to make it work. It also builds on the previous agent run by sending the
emails that are in the immediate queue. Keep in mind that the email
template leaves a bit to be desired.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Add `email.py` with the minimum required to send an email (plus type
handling)
- Add settings configs for the token and the send address to the
`settings.py` and `.env.example`
- Add a db call to get user email by ID since the `metadata` field of
`prisma.models.User` isn't serializable over our message bus tool `Pyro`
that the `DatabaseManager` uses
- Add a horrible `AgentRun` email template using `jinja2`
- Add `postmarker` to `pyproject.toml`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Build and run an agent and make sure it emails me (must be signed
into same domain as receiving address for now)


#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have added a check that disables email if config is not set
correctly
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-14 17:55:30 +00:00
Nicholas Tindle
15275e2ce1 feat(backend): spawn the notifications service + basic test (#9464)
We want to send emails on a schedule, in response to events, and be
expandable without being overbearing on the amount of effort to
implement. We also want this to use rabbitmq and be easy for other
services to send messages into.

This PR adds the first use of the service to simply show a log message


### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds a new backend service for notifications
- Adds first notification into the service -> Agent Execution
- Adds spawning the notification service

Also 
- Adds RabbitMQ to CI so we can test stuff
- Adds a minor fix for one of the migrations that I thought was causing
failures, but isn't but the change is still useful


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Built and ran an agent and ensured the following log line appeared
which shows the event would have sent an email
  ```
2025-02-10 15:52:02,232 INFO Processing notification:
user_id='96b8d2f5-a036-437f-bd8e-ba8856028553'
type=<NotificationType.AGENT_RUN: 'AGENT_RUN'>
data=AgentRunData(agent_name='CalculatorBlock', credits_used=0.0,
execution_time=0.0, graph_id='30e5f332-a092-4795-892a-b063a8c7bdd9',
node_count=1) created_at=datetime.datetime(2025, 2, 10, 15, 52, 2,
162865)
  ```

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

None of the other ports are configurable via .env.example listing so
left as is

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-14 03:58:12 +00:00
515 changed files with 38579 additions and 11656 deletions

View File

@@ -129,30 +129,6 @@ updates:
- "minor"
- "patch"
# Submodules
- package-ecosystem: "gitsubmodule"
directory: "autogpt_platform/supabase"
schedule:
interval: "weekly"
open-pull-requests-limit: 1
target-branch: "dev"
commit-message:
prefix: "chore(platform/deps)"
prefix-development: "chore(platform/deps-dev)"
groups:
production-dependencies:
dependency-type: "production"
update-types:
- "minor"
- "patch"
development-dependencies:
dependency-type: "development"
update-types:
- "minor"
- "patch"
# Docs
- package-ecosystem: 'pip'
directory: "docs/"

View File

@@ -115,6 +115,7 @@ jobs:
poetry run pytest -vv \
--cov=autogpt --cov-branch --cov-report term-missing --cov-report xml \
--numprocesses=logical --durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
tests/unit tests/integration
env:
CI: true
@@ -124,8 +125,14 @@ jobs:
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: autogpt-agent,${{ runner.os }}

View File

@@ -87,13 +87,20 @@ jobs:
poetry run pytest -vv \
--cov=agbenchmark --cov-branch --cov-report term-missing --cov-report xml \
--durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
tests
env:
CI: true
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: agbenchmark,${{ runner.os }}

View File

@@ -139,6 +139,7 @@ jobs:
poetry run pytest -vv \
--cov=forge --cov-branch --cov-report term-missing --cov-report xml \
--durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
forge
env:
CI: true
@@ -148,8 +149,14 @@ jobs:
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: forge,${{ runner.os }}

View File

@@ -34,6 +34,7 @@ jobs:
python -m prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}
trigger:

View File

@@ -36,6 +36,7 @@ jobs:
python -m prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}
trigger:
needs: migrate

View File

@@ -42,6 +42,14 @@ jobs:
REDIS_PASSWORD: testpassword
ports:
- 6379:6379
rabbitmq:
image: rabbitmq:3.12-management
ports:
- 5672:5672
- 15672:15672
env:
RABBITMQ_DEFAULT_USER: ${{ env.RABBITMQ_DEFAULT_USER }}
RABBITMQ_DEFAULT_PASS: ${{ env.RABBITMQ_DEFAULT_PASS }}
steps:
- name: Checkout repository
@@ -58,7 +66,7 @@ jobs:
- name: Setup Supabase
uses: supabase/setup-cli@v1
with:
version: latest
version: 1.178.1
- id: get_date
name: Get date
@@ -72,18 +80,35 @@ jobs:
- name: Install Poetry (Unix)
run: |
curl -sSL https://install.python-poetry.org | python3 -
# Extract Poetry version from backend/poetry.lock
HEAD_POETRY_VERSION=$(head -n 1 poetry.lock | grep -oP '(?<=Poetry )[0-9]+\.[0-9]+\.[0-9]+')
echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
if [ -n "$BASE_REF" ]; then
BASE_BRANCH=${BASE_REF/refs\/heads\//}
BASE_POETRY_VERSION=$((git show "origin/$BASE_BRANCH":./poetry.lock; true) | head -n 1 | grep -oP '(?<=Poetry )[0-9]+\.[0-9]+\.[0-9]+')
echo "Found Poetry version ${BASE_POETRY_VERSION} in backend/poetry.lock on ${BASE_REF}"
POETRY_VERSION=$(printf '%s\n' "$HEAD_POETRY_VERSION" "$BASE_POETRY_VERSION" | sort -V | tail -n1)
else
POETRY_VERSION=$HEAD_POETRY_VERSION
fi
echo "Using Poetry version ${POETRY_VERSION}"
# Install Poetry
curl -sSL https://install.python-poetry.org | POETRY_VERSION=$POETRY_VERSION python3 -
if [ "${{ runner.os }}" = "macOS" ]; then
PATH="$HOME/.local/bin:$PATH"
echo "$HOME/.local/bin" >> $GITHUB_PATH
fi
env:
BASE_REF: ${{ github.base_ref || github.event.merge_group.base_ref }}
- name: Check poetry.lock
run: |
poetry lock
if ! git diff --quiet poetry.lock; then
if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
echo "Error: poetry.lock not up to date."
echo
git diff poetry.lock
@@ -110,6 +135,7 @@ jobs:
run: poetry run prisma migrate dev --name updates
env:
DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}
- id: lint
name: Run Linter
@@ -126,12 +152,13 @@ jobs:
env:
LOG_LEVEL: ${{ runner.debug && 'DEBUG' || 'INFO' }}
DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}
SUPABASE_URL: ${{ steps.supabase.outputs.API_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ steps.supabase.outputs.SERVICE_ROLE_KEY }}
SUPABASE_JWT_SECRET: ${{ steps.supabase.outputs.JWT_SECRET }}
REDIS_HOST: 'localhost'
REDIS_PORT: '6379'
REDIS_PASSWORD: 'testpassword'
REDIS_HOST: "localhost"
REDIS_PORT: "6379"
REDIS_PASSWORD: "testpassword"
env:
CI: true
@@ -139,6 +166,13 @@ jobs:
RUN_ENV: local
PORT: 8080
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# We know these are here, don't report this as a security vulnerability
# This is used as the default credential for the entire system's RabbitMQ instance
# If you want to replace this, you can do so by making our entire system generate
# new credentials for each local user and update the environment variables in
# the backend service, docker composes, and examples
RABBITMQ_DEFAULT_USER: "rabbitmq_user_default"
RABBITMQ_DEFAULT_PASS: "k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7"
# - name: Upload coverage reports to Codecov
# uses: codecov/codecov-action@v4

View File

@@ -77,12 +77,12 @@ jobs:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
large-packages: false # slow
docker-images: false # limited benefit
large-packages: false # slow
docker-images: false # limited benefit
- name: Copy default supabase .env
run: |
cp ../supabase/docker/.env.example ../.env
cp ../.env.example ../.env
- name: Copy backend .env
run: |
@@ -104,11 +104,12 @@ jobs:
run: yarn playwright install --with-deps ${{ matrix.browser }}
- name: Run tests
timeout-minutes: 20
run: |
yarn test --project=${{ matrix.browser }}
- name: Print Docker Compose logs in debug mode
if: runner.debug
- name: Print Final Docker Compose logs
if: always()
run: |
docker compose -f ../docker-compose.yml logs

View File

@@ -16,7 +16,7 @@ jobs:
# operations-per-run: 5000
stale-issue-message: >
This issue has automatically been marked as _stale_ because it has not had
any activity in the last 50 days. You can _unstale_ it by commenting or
any activity in the last 170 days. You can _unstale_ it by commenting or
removing the label. Otherwise, this issue will be closed in 10 days.
stale-pr-message: >
This pull request has automatically been marked as _stale_ because it has
@@ -25,7 +25,7 @@ jobs:
close-issue-message: >
This issue was closed automatically because it has been stale for 10 days
with no activity.
days-before-stale: 100
days-before-stale: 170
days-before-close: 10
# Do not touch meta issues:
exempt-issue-labels: meta,fridge,project management

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "classic/forge/tests/vcr_cassettes"]
path = classic/forge/tests/vcr_cassettes
url = https://github.com/Significant-Gravitas/Auto-GPT-test-cassettes
[submodule "autogpt_platform/supabase"]
path = autogpt_platform/supabase
url = https://github.com/supabase/supabase.git

View File

@@ -140,7 +140,7 @@ repos:
language: system
- repo: https://github.com/psf/black
rev: 23.12.1
rev: 24.10.0
# Black has sensible defaults, doesn't need package context, and ignores
# everything in .gitignore, so it works fine without any config or arguments.
hooks:
@@ -170,6 +170,16 @@ repos:
files: ^classic/benchmark/(agbenchmark|tests)/((?!reports).)*[/.]
args: [--config=classic/benchmark/.flake8]
- repo: local
hooks:
- id: prettier
name: Format (Prettier) - AutoGPT Platform - Frontend
alias: format-platform-frontend
entry: bash -c 'cd autogpt_platform/frontend && npx prettier --write $(echo "$@" | sed "s|autogpt_platform/frontend/||g")' --
files: ^autogpt_platform/frontend/
types: [file]
language: system
- repo: local
# To have watertight type checking, we check *all* the files in an affected
# project. To trigger on poetry.lock we also reset the file `types` filter.
@@ -221,6 +231,16 @@ repos:
language: system
pass_filenames: false
- repo: local
hooks:
- id: tsc
name: Typecheck - AutoGPT Platform - Frontend
entry: bash -c 'cd autogpt_platform/frontend && npm run type-check'
files: ^autogpt_platform/frontend/
types: [file]
language: system
pass_filenames: false
- repo: local
hooks:
- id: pytest

6
.vscode/launch.json vendored
View File

@@ -32,9 +32,9 @@
"type": "debugpy",
"request": "launch",
"module": "backend.app",
// "env": {
// "ENV": "dev"
// },
"env": {
"OBJC_DISABLE_INITIALIZE_FORK_SAFETY": "YES"
},
"envFile": "${workspaceFolder}/backend/.env",
"justMyCode": false,
"cwd": "${workspaceFolder}/autogpt_platform/backend"

View File

@@ -2,9 +2,6 @@
If you are reading this, you are probably looking for the full **[contribution guide]**,
which is part of our [wiki].
Also check out our [🚀 Roadmap][roadmap] for information about our priorities and associated tasks.
<!-- You can find our immediate priorities and their progress on our public [kanban board]. -->
[contribution guide]: https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing
[wiki]: https://github.com/Significant-Gravitas/AutoGPT/wiki
[roadmap]: https://github.com/Significant-Gravitas/AutoGPT/discussions/6971

View File

@@ -15,7 +15,11 @@
> Setting up and hosting the AutoGPT Platform yourself is a technical process.
> If you'd rather something that just works, we recommend [joining the waitlist](https://bit.ly/3ZDijAI) for the cloud-hosted beta.
https://github.com/user-attachments/assets/d04273a5-b36a-4a37-818e-f631ce72d603
### Updated Setup Instructions:
Weve moved to a fully maintained and regularly updated documentation site.
👉 [Follow the official self-hosting guide here](https://docs.agpt.co/platform/getting-started/)
This tutorial assumes you have Docker, VSCode, git and npm installed.

View File

@@ -20,6 +20,7 @@ Instead, please report them via:
- Please provide detailed reports with reproducible steps
- Include the version/commit hash where you discovered the vulnerability
- Allow us a 90-day security fix window before any public disclosure
- After patch is released, allow 30 days for users to update before public disclosure (for a total of 120 days max between update time and fix time)
- Share any potential mitigations or workarounds if known
## Supported Versions

View File

@@ -0,0 +1,123 @@
############
# Secrets
# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION
############
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=this_password_is_insecure_and_should_be_updated
SECRET_KEY_BASE=UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq
VAULT_ENC_KEY=your-encryption-key-32-chars-min
############
# Database - You can change these to any PostgreSQL database that has logical replication enabled.
############
POSTGRES_HOST=db
POSTGRES_DB=postgres
POSTGRES_PORT=5432
# default user is postgres
############
# Supavisor -- Database pooler
############
POOLER_PROXY_PORT_TRANSACTION=6543
POOLER_DEFAULT_POOL_SIZE=20
POOLER_MAX_CLIENT_CONN=100
POOLER_TENANT_ID=your-tenant-id
############
# API Proxy - Configuration for the Kong Reverse proxy.
############
KONG_HTTP_PORT=8000
KONG_HTTPS_PORT=8443
############
# API - Configuration for PostgREST.
############
PGRST_DB_SCHEMAS=public,storage,graphql_public
############
# Auth - Configuration for the GoTrue authentication server.
############
## General
SITE_URL=http://localhost:3000
ADDITIONAL_REDIRECT_URLS=
JWT_EXPIRY=3600
DISABLE_SIGNUP=false
API_EXTERNAL_URL=http://localhost:8000
## Mailer Config
MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify"
MAILER_URLPATHS_INVITE="/auth/v1/verify"
MAILER_URLPATHS_RECOVERY="/auth/v1/verify"
MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify"
## Email auth
ENABLE_EMAIL_SIGNUP=true
ENABLE_EMAIL_AUTOCONFIRM=false
SMTP_ADMIN_EMAIL=admin@example.com
SMTP_HOST=supabase-mail
SMTP_PORT=2500
SMTP_USER=fake_mail_user
SMTP_PASS=fake_mail_password
SMTP_SENDER_NAME=fake_sender
ENABLE_ANONYMOUS_USERS=false
## Phone auth
ENABLE_PHONE_SIGNUP=true
ENABLE_PHONE_AUTOCONFIRM=true
############
# Studio - Configuration for the Dashboard
############
STUDIO_DEFAULT_ORGANIZATION=Default Organization
STUDIO_DEFAULT_PROJECT=Default Project
STUDIO_PORT=3000
# replace if you intend to use Studio outside of localhost
SUPABASE_PUBLIC_URL=http://localhost:8000
# Enable webp support
IMGPROXY_ENABLE_WEBP_DETECTION=true
# Add your OpenAI API key to enable SQL Editor Assistant
OPENAI_API_KEY=
############
# Functions - Configuration for Functions
############
# NOTE: VERIFY_JWT applies to all functions. Per-function VERIFY_JWT is not supported yet.
FUNCTIONS_VERIFY_JWT=false
############
# Logs - Configuration for Logflare
# Please refer to https://supabase.com/docs/reference/self-hosting-analytics/introduction
############
LOGFLARE_LOGGER_BACKEND_API_KEY=your-super-secret-and-long-logflare-key
# Change vector.toml sinks to reflect this change
LOGFLARE_API_KEY=your-super-secret-and-long-logflare-key
# Docker socket location - this value will differ depending on your OS
DOCKER_SOCKET_LOCATION=/var/run/docker.sock
# Google Cloud Project details
GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID
GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER

View File

@@ -22,35 +22,29 @@ To run the AutoGPT Platform, follow these steps:
2. Run the following command:
```
git submodule update --init --recursive --progress
cp .env.example .env
```
This command will initialize and update the submodules in the repository. The `supabase` folder will be cloned to the root directory.
This command will copy the `.env.example` file to `.env`. You can modify the `.env` file to add your own environment variables.
3. Run the following command:
```
cp supabase/docker/.env.example .env
```
This command will copy the `.env.example` file to `.env` in the `supabase/docker` directory. You can modify the `.env` file to add your own environment variables.
4. Run the following command:
```
docker compose up -d
```
This command will start all the necessary backend services defined in the `docker-compose.yml` file in detached mode.
5. Navigate to `frontend` within the `autogpt_platform` directory:
4. Navigate to `frontend` within the `autogpt_platform` directory:
```
cd frontend
```
You will need to run your frontend application separately on your local machine.
6. Run the following command:
5. Run the following command:
```
cp .env.example .env.local
```
This command will copy the `.env.example` file to `.env.local` in the `frontend` directory. You can modify the `.env.local` within this folder to add your own environment variables for the frontend application.
7. Run the following command:
6. Run the following command:
```
npm install
npm run dev
@@ -61,7 +55,7 @@ To run the AutoGPT Platform, follow these steps:
yarn install && yarn dev
```
8. Open your browser and navigate to `http://localhost:3000` to access the AutoGPT Platform frontend.
7. Open your browser and navigate to `http://localhost:3000` to access the AutoGPT Platform frontend.
### Docker Compose Commands

View File

@@ -1,14 +1,13 @@
from .config import Settings
from .depends import requires_admin_user, requires_user
from .jwt_utils import parse_jwt_token
from .middleware import auth_middleware
from .middleware import APIKeyValidator, auth_middleware
from .models import User
__all__ = [
"Settings",
"parse_jwt_token",
"requires_user",
"requires_admin_user",
"APIKeyValidator",
"auth_middleware",
"User",
]

View File

@@ -1,14 +1,11 @@
import os
from dotenv import load_dotenv
load_dotenv()
class Settings:
JWT_SECRET_KEY: str = os.getenv("SUPABASE_JWT_SECRET", "")
ENABLE_AUTH: bool = os.getenv("ENABLE_AUTH", "false").lower() == "true"
JWT_ALGORITHM: str = "HS256"
def __init__(self):
self.JWT_SECRET_KEY: str = os.getenv("SUPABASE_JWT_SECRET", "")
self.ENABLE_AUTH: bool = os.getenv("ENABLE_AUTH", "false").lower() == "true"
self.JWT_ALGORITHM: str = "HS256"
@property
def is_configured(self) -> bool:

View File

@@ -1,6 +1,6 @@
import fastapi
from .config import Settings
from .config import settings
from .middleware import auth_middleware
from .models import DEFAULT_USER_ID, User
@@ -17,7 +17,7 @@ def requires_admin_user(
def verify_user(payload: dict | None, admin_only: bool) -> User:
if not payload:
if Settings.ENABLE_AUTH:
if settings.ENABLE_AUTH:
raise fastapi.HTTPException(
status_code=401, detail="Authorization header is missing"
)

View File

@@ -1,7 +1,10 @@
import inspect
import logging
from typing import Any, Callable, Optional
from fastapi import HTTPException, Request
from fastapi.security import HTTPBearer
from fastapi import HTTPException, Request, Security
from fastapi.security import APIKeyHeader, HTTPBearer
from starlette.status import HTTP_401_UNAUTHORIZED
from .config import settings
from .jwt_utils import parse_jwt_token
@@ -13,7 +16,7 @@ logger = logging.getLogger(__name__)
async def auth_middleware(request: Request):
if not settings.ENABLE_AUTH:
# If authentication is disabled, allow the request to proceed
logger.warn("Auth disabled")
logger.warning("Auth disabled")
return {}
security = HTTPBearer()
@@ -29,3 +32,104 @@ async def auth_middleware(request: Request):
except ValueError as e:
raise HTTPException(status_code=401, detail=str(e))
return payload
class APIKeyValidator:
"""
Configurable API key validator that supports custom validation functions
for FastAPI applications.
This class provides a flexible way to implement API key authentication with optional
custom validation logic. It can be used for simple token matching
or more complex validation scenarios like database lookups.
Examples:
Simple token validation:
```python
validator = APIKeyValidator(
header_name="X-API-Key",
expected_token="your-secret-token"
)
@app.get("/protected", dependencies=[Depends(validator.get_dependency())])
def protected_endpoint():
return {"message": "Access granted"}
```
Custom validation with database lookup:
```python
async def validate_with_db(api_key: str):
api_key_obj = await db.get_api_key(api_key)
return api_key_obj if api_key_obj and api_key_obj.is_active else None
validator = APIKeyValidator(
header_name="X-API-Key",
validate_fn=validate_with_db
)
```
Args:
header_name (str): The name of the header containing the API key
expected_token (Optional[str]): The expected API key value for simple token matching
validate_fn (Optional[Callable]): Custom validation function that takes an API key
string and returns a boolean or object. Can be async.
error_status (int): HTTP status code to use for validation errors
error_message (str): Error message to return when validation fails
"""
def __init__(
self,
header_name: str,
expected_token: Optional[str] = None,
validate_fn: Optional[Callable[[str], bool]] = None,
error_status: int = HTTP_401_UNAUTHORIZED,
error_message: str = "Invalid API key",
):
# Create the APIKeyHeader as a class property
self.security_scheme = APIKeyHeader(name=header_name)
self.expected_token = expected_token
self.custom_validate_fn = validate_fn
self.error_status = error_status
self.error_message = error_message
async def default_validator(self, api_key: str) -> bool:
return api_key == self.expected_token
async def __call__(
self, request: Request, api_key: str = Security(APIKeyHeader)
) -> Any:
if api_key is None:
raise HTTPException(status_code=self.error_status, detail="Missing API key")
# Use custom validation if provided, otherwise use default equality check
validator = self.custom_validate_fn or self.default_validator
result = (
await validator(api_key)
if inspect.iscoroutinefunction(validator)
else validator(api_key)
)
if not result:
raise HTTPException(
status_code=self.error_status, detail=self.error_message
)
# Store validation result in request state if it's not just a boolean
if result is not True:
request.state.api_key = result
return result
def get_dependency(self):
"""
Returns a callable dependency that FastAPI will recognize as a security scheme
"""
async def validate_api_key(
request: Request, api_key: str = Security(self.security_scheme)
) -> Any:
return await self(request, api_key)
# This helps FastAPI recognize it as a security dependency
validate_api_key.__name__ = f"validate_{self.security_scheme.model.name}"
return validate_api_key

View File

@@ -13,7 +13,6 @@ from typing_extensions import ParamSpec
from .config import SETTINGS
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
P = ParamSpec("P")
T = TypeVar("T")

View File

@@ -8,7 +8,7 @@ from pydantic import Field, field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
from .filters import BelowLevelFilter
from .formatters import AGPTFormatter, StructuredLoggingFormatter
from .formatters import AGPTFormatter
LOG_DIR = Path(__file__).parent.parent.parent.parent / "logs"
LOG_FILE = "activity.log"
@@ -81,9 +81,26 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
"""
config = LoggingConfig()
log_handlers: list[logging.Handler] = []
# Console output handlers
stdout = logging.StreamHandler(stream=sys.stdout)
stdout.setLevel(config.level)
stdout.addFilter(BelowLevelFilter(logging.WARNING))
if config.level == logging.DEBUG:
stdout.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stdout.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
stderr = logging.StreamHandler()
stderr.setLevel(logging.WARNING)
if config.level == logging.DEBUG:
stderr.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stderr.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
log_handlers += [stdout, stderr]
# Cloud logging setup
if config.enable_cloud_logging or force_cloud_logging:
import google.cloud.logging
@@ -97,28 +114,7 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
transport=SyncTransport,
)
cloud_handler.setLevel(config.level)
cloud_handler.setFormatter(StructuredLoggingFormatter())
log_handlers.append(cloud_handler)
print("Cloud logging enabled")
else:
# Console output handlers
stdout = logging.StreamHandler(stream=sys.stdout)
stdout.setLevel(config.level)
stdout.addFilter(BelowLevelFilter(logging.WARNING))
if config.level == logging.DEBUG:
stdout.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stdout.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
stderr = logging.StreamHandler()
stderr.setLevel(logging.WARNING)
if config.level == logging.DEBUG:
stderr.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stderr.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
log_handlers += [stdout, stderr]
print("Console logging enabled")
# File logging setup
if config.enable_file_logging:
@@ -156,7 +152,6 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
error_log_handler.setLevel(logging.ERROR)
error_log_handler.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT, no_color=True))
log_handlers.append(error_log_handler)
print("File logging enabled")
# Configure the root logger
logging.basicConfig(

View File

@@ -1,7 +1,6 @@
import logging
from colorama import Fore, Style
from google.cloud.logging_v2.handlers import CloudLoggingFilter, StructuredLogHandler
from .utils import remove_color_codes
@@ -80,16 +79,3 @@ class AGPTFormatter(FancyConsoleFormatter):
return remove_color_codes(super().format(record))
else:
return super().format(record)
class StructuredLoggingFormatter(StructuredLogHandler, logging.Formatter):
def __init__(self):
# Set up CloudLoggingFilter to add diagnostic info to the log records
self.cloud_logging_filter = CloudLoggingFilter()
# Init StructuredLogHandler
super().__init__()
def format(self, record: logging.LogRecord) -> str:
self.cloud_logging_filter.filter(record)
return super().format(record)

View File

@@ -2,6 +2,7 @@ import logging
import re
from typing import Any
import uvicorn.config
from colorama import Fore
@@ -25,3 +26,14 @@ def print_attribute(
"color": value_color,
},
)
def generate_uvicorn_config():
"""
Generates a uvicorn logging config that silences uvicorn's default logging and tells it to use the native logging module.
"""
log_config = dict(uvicorn.config.LOGGING_CONFIG)
log_config["loggers"]["uvicorn"] = {"handlers": []}
log_config["loggers"]["uvicorn.error"] = {"handlers": []}
log_config["loggers"]["uvicorn.access"] = {"handlers": []}
return log_config

View File

@@ -1,20 +1,59 @@
import inspect
import threading
from typing import Callable, ParamSpec, TypeVar
from typing import Awaitable, Callable, ParamSpec, TypeVar, cast, overload
P = ParamSpec("P")
R = TypeVar("R")
def thread_cached(func: Callable[P, R]) -> Callable[P, R]:
@overload
def thread_cached(func: Callable[P, Awaitable[R]]) -> Callable[P, Awaitable[R]]: ...
@overload
def thread_cached(func: Callable[P, R]) -> Callable[P, R]: ...
def thread_cached(
func: Callable[P, R] | Callable[P, Awaitable[R]],
) -> Callable[P, R] | Callable[P, Awaitable[R]]:
thread_local = threading.local()
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
def _clear():
if hasattr(thread_local, "cache"):
del thread_local.cache
return wrapper
if inspect.iscoroutinefunction(func):
async def async_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = await cast(Callable[P, Awaitable[R]], func)(
*args, **kwargs
)
return cache[key]
setattr(async_wrapper, "clear_cache", _clear)
return async_wrapper
else:
def sync_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
setattr(sync_wrapper, "clear_cache", _clear)
return sync_wrapper
def clear_thread_cache(func: Callable) -> None:
if clear := getattr(func, "clear_cache", None):
clear()

View File

@@ -31,7 +31,7 @@ class RedisKeyedMutex:
try:
yield
finally:
if lock.locked():
if lock.locked() and lock.owned():
lock.release()
def acquire(self, key: Any) -> "RedisLock":

File diff suppressed because it is too large Load Diff

View File

@@ -7,21 +7,20 @@ readme = "README.md"
packages = [{ include = "autogpt_libs" }]
[tool.poetry.dependencies]
python = ">=3.10,<4.0"
colorama = "^0.4.6"
expiringdict = "^1.2.2"
google-cloud-logging = "^3.11.4"
pydantic = "^2.10.6"
pydantic-settings = "^2.7.1"
google-cloud-logging = "^3.12.1"
pydantic = "^2.11.4"
pydantic-settings = "^2.9.1"
pyjwt = "^2.10.1"
pytest-asyncio = "^0.25.3"
pytest-asyncio = "^0.26.0"
pytest-mock = "^3.14.0"
python = ">=3.10,<4.0"
python-dotenv = "^1.0.1"
supabase = "^2.13.0"
supabase = "^2.15.1"
[tool.poetry.group.dev.dependencies]
redis = "^5.2.1"
ruff = "^0.9.3"
ruff = "^0.11.10"
[build-system]
requires = ["poetry-core"]

View File

@@ -2,13 +2,24 @@ DB_USER=postgres
DB_PASS=your-super-secret-and-long-postgres-password
DB_NAME=postgres
DB_PORT=5432
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:${DB_PORT}/${DB_NAME}?connect_timeout=60&schema=platform"
DB_HOST=localhost
DB_CONNECTION_LIMIT=12
DB_CONNECT_TIMEOUT=60
DB_POOL_TIMEOUT=300
DB_SCHEMA=platform
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=${DB_SCHEMA}&connect_timeout=${DB_CONNECT_TIMEOUT}"
DIRECT_URL="postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=${DB_SCHEMA}&connect_timeout=${DB_CONNECT_TIMEOUT}"
PRISMA_SCHEMA="postgres/schema.prisma"
# EXECUTOR
NUM_GRAPH_WORKERS=10
NUM_NODE_WORKERS=3
BACKEND_CORS_ALLOW_ORIGINS=["http://localhost:3000"]
# generate using `from cryptography.fernet import Fernet;Fernet.generate_key().decode()`
ENCRYPTION_KEY='dvziYgz0KSK8FENhju0ZYi8-fRTfAdlz6YLhdB_jhNw='
UNSUBSCRIBE_SECRET_KEY = 'HlP8ivStJjmbf6NKi78m_3FnOogut0t5ckzjsIqeaio='
REDIS_HOST=localhost
REDIS_PORT=6379
@@ -25,6 +36,11 @@ BEHAVE_AS=local
PYRO_HOST=localhost
SENTRY_DSN=
# Email For Postmark so we can send emails
POSTMARK_SERVER_API_TOKEN=
POSTMARK_SENDER_EMAIL=invalid@invalid.com
POSTMARK_WEBHOOK_TOKEN=
## User auth with Supabase is required for any of the 3rd party integrations with auth to work.
ENABLE_AUTH=true
SUPABASE_URL=http://localhost:8000
@@ -37,6 +53,9 @@ RABBITMQ_PORT=5672
RABBITMQ_DEFAULT_USER=rabbitmq_user_default
RABBITMQ_DEFAULT_PASS=k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7
## GCS bucket is required for marketplace and library functionality
MEDIA_GCS_BUCKET_NAME=
## For local development, you may need to set FRONTEND_BASE_URL for the OAuth flow
## for integrations to work. Defaults to the value of PLATFORM_BASE_URL if not set.
# FRONTEND_BASE_URL=http://localhost:3000
@@ -47,6 +66,13 @@ RABBITMQ_DEFAULT_PASS=k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7
## and tunnel it to your locally running backend.
PLATFORM_BASE_URL=http://localhost:3000
## Cloudflare Turnstile (CAPTCHA) Configuration
## Get these from the Cloudflare Turnstile dashboard: https://dash.cloudflare.com/?to=/:account/turnstile
## This is the backend secret key
TURNSTILE_SECRET_KEY=
## This is the verify URL
TURNSTILE_VERIFY_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify
## == INTEGRATION CREDENTIALS == ##
# Each set of server side credentials is required for the corresponding 3rd party
# integration to work.
@@ -103,6 +129,7 @@ OPENAI_API_KEY=
ANTHROPIC_API_KEY=
GROQ_API_KEY=
OPEN_ROUTER_API_KEY=
LLAMA_API_KEY=
# Reddit
# Go to https://www.reddit.com/prefs/apps and create a new app
@@ -161,6 +188,17 @@ MEM0_API_KEY=
# Nvidia
NVIDIA_API_KEY=
# Apollo
APOLLO_API_KEY=
# SmartLead
SMARTLEAD_API_KEY=
# ZeroBounce
ZEROBOUNCE_API_KEY=
## ===== OPTIONAL API KEYS END ===== ##
# Logging Configuration
LOG_LEVEL=INFO
ENABLE_CLOUD_LOGGING=false

View File

@@ -73,7 +73,6 @@ FROM server_dependencies AS server
COPY autogpt_platform/backend /app/autogpt_platform/backend
RUN poetry install --no-ansi --only-root
ENV DATABASE_URL=""
ENV PORT=8000
CMD ["poetry", "run", "rest"]

View File

@@ -1,75 +1 @@
# AutoGPT Agent Server Advanced set up
This guide walks you through a dockerized set up, with an external DB (postgres)
## Setup
We use the Poetry to manage the dependencies. To set up the project, follow these steps inside this directory:
0. Install Poetry
```sh
pip install poetry
```
1. Configure Poetry to use .venv in your project directory
```sh
poetry config virtualenvs.in-project true
```
2. Enter the poetry shell
```sh
poetry shell
```
3. Install dependencies
```sh
poetry install
```
4. Copy .env.example to .env
```sh
cp .env.example .env
```
5. Generate the Prisma client
```sh
poetry run prisma generate
```
> In case Prisma generates the client for the global Python installation instead of the virtual environment, the current mitigation is to just uninstall the global Prisma package:
>
> ```sh
> pip uninstall prisma
> ```
>
> Then run the generation again. The path *should* look something like this:
> `<some path>/pypoetry/virtualenvs/backend-TQIRSwR6-py3.12/bin/prisma`
6. Run the postgres database from the /rnd folder
```sh
cd autogpt_platform/
docker compose up -d
```
7. Run the migrations (from the backend folder)
```sh
cd ../backend
prisma migrate deploy
```
## Running The Server
### Starting the server directly
Run the following command:
```sh
poetry run app
```
[Advanced Setup (Dev Branch)](https://dev-docs.agpt.co/platform/advanced_setup/#autogpt_agent_server_advanced_set_up)

View File

@@ -1,210 +1 @@
# AutoGPT Agent Server
This is an initial project for creating the next generation of agent execution, which is an AutoGPT agent server.
The agent server will enable the creation of composite multi-agent systems that utilize AutoGPT agents and other non-agent components as its primitives.
## Docs
You can access the docs for the [AutoGPT Agent Server here](https://docs.agpt.co/server/setup).
## Setup
We use the Poetry to manage the dependencies. To set up the project, follow these steps inside this directory:
0. Install Poetry
```sh
pip install poetry
```
1. Configure Poetry to use .venv in your project directory
```sh
poetry config virtualenvs.in-project true
```
2. Enter the poetry shell
```sh
poetry shell
```
3. Install dependencies
```sh
poetry install
```
4. Copy .env.example to .env
```sh
cp .env.example .env
```
5. Generate the Prisma client
```sh
poetry run prisma generate
```
> In case Prisma generates the client for the global Python installation instead of the virtual environment, the current mitigation is to just uninstall the global Prisma package:
>
> ```sh
> pip uninstall prisma
> ```
>
> Then run the generation again. The path *should* look something like this:
> `<some path>/pypoetry/virtualenvs/backend-TQIRSwR6-py3.12/bin/prisma`
6. Migrate the database. Be careful because this deletes current data in the database.
```sh
docker compose up db -d
poetry run prisma migrate deploy
```
## Running The Server
### Starting the server without Docker
To run the server locally, start in the autogpt_platform folder:
```sh
cd ..
```
Run the following command to run database in docker but the application locally:
```sh
docker compose --profile local up deps --build --detach
cd backend
poetry run app
```
### Starting the server with Docker
Run the following command to build the dockerfiles:
```sh
docker compose build
```
Run the following command to run the app:
```sh
docker compose up
```
Run the following to automatically rebuild when code changes, in another terminal:
```sh
docker compose watch
```
Run the following command to shut down:
```sh
docker compose down
```
If you run into issues with dangling orphans, try:
```sh
docker compose down --volumes --remove-orphans && docker-compose up --force-recreate --renew-anon-volumes --remove-orphans
```
## Testing
To run the tests:
```sh
poetry run test
```
## Development
### Formatting & Linting
Auto formatter and linter are set up in the project. To run them:
Install:
```sh
poetry install --with dev
```
Format the code:
```sh
poetry run format
```
Lint the code:
```sh
poetry run lint
```
## Project Outline
The current project has the following main modules:
### **blocks**
This module stores all the Agent Blocks, which are reusable components to build a graph that represents the agent's behavior.
### **data**
This module stores the logical model that is persisted in the database.
It abstracts the database operations into functions that can be called by the service layer.
Any code that interacts with Prisma objects or the database should reside in this module.
The main models are:
* `block`: anything related to the block used in the graph
* `execution`: anything related to the execution graph execution
* `graph`: anything related to the graph, node, and its relations
### **execution**
This module stores the business logic of executing the graph.
It currently has the following main modules:
* `manager`: A service that consumes the queue of the graph execution and executes the graph. It contains both pieces of logic.
* `scheduler`: A service that triggers scheduled graph execution based on a cron expression. It pushes an execution request to the manager.
### **server**
This module stores the logic for the server API.
It contains all the logic used for the API that allows the client to create, execute, and monitor the graph and its execution.
This API service interacts with other services like those defined in `manager` and `scheduler`.
### **utils**
This module stores utility functions that are used across the project.
Currently, it has two main modules:
* `process`: A module that contains the logic to spawn a new process.
* `service`: A module that serves as a parent class for all the services in the project.
## Service Communication
Currently, there are only 3 active services:
- AgentServer (the API, defined in `server.py`)
- ExecutionManager (the executor, defined in `manager.py`)
- ExecutionScheduler (the scheduler, defined in `scheduler.py`)
The services run in independent Python processes and communicate through an IPC.
A communication layer (`service.py`) is created to decouple the communication library from the implementation.
Currently, the IPC is done using Pyro5 and abstracted in a way that allows a function decorated with `@expose` to be called from a different process.
By default the daemons run on the following ports:
Execution Manager Daemon: 8002
Execution Scheduler Daemon: 8003
Rest Server Daemon: 8004
## Adding a New Agent Block
To add a new agent block, you need to create a new class that inherits from `Block` and provides the following information:
* All the block code should live in the `blocks` (`backend.blocks`) module.
* `input_schema`: the schema of the input data, represented by a Pydantic object.
* `output_schema`: the schema of the output data, represented by a Pydantic object.
* `run` method: the main logic of the block.
* `test_input` & `test_output`: the sample input and output data for the block, which will be used to auto-test the block.
* You can mock the functions declared in the block using the `test_mock` field for your unit tests.
* Once you finish creating the block, you can test it by running `poetry run pytest -s test/block/test_block.py`.
[Getting Started (Released)](https://docs.agpt.co/platform/getting-started/#autogpt_agent_server)

View File

@@ -1,22 +1,30 @@
import logging
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from backend.util.process import AppProcess
logger = logging.getLogger(__name__)
def run_processes(*processes: "AppProcess", **kwargs):
"""
Execute all processes in the app. The last process is run in the foreground.
Includes enhanced error handling and process lifecycle management.
"""
try:
# Run all processes except the last one in the background.
for process in processes[:-1]:
process.start(background=True, **kwargs)
# Run the last process in the foreground
# Run the last process in the foreground.
processes[-1].start(background=False, **kwargs)
finally:
for process in processes:
process.stop()
try:
process.stop()
except Exception as e:
logger.exception(f"[{process.service_name}] unable to stop: {e}")
def main(**kwargs):
@@ -24,14 +32,16 @@ def main(**kwargs):
Run all the processes required for the AutoGPT-server (REST and WebSocket APIs).
"""
from backend.executor import DatabaseManager, ExecutionManager, ExecutionScheduler
from backend.executor import DatabaseManager, ExecutionManager, Scheduler
from backend.notifications import NotificationManager
from backend.server.rest_api import AgentServer
from backend.server.ws_api import WebsocketServer
run_processes(
DatabaseManager(),
ExecutionManager(),
ExecutionScheduler(),
Scheduler(),
NotificationManager(),
WebsocketServer(),
AgentServer(),
**kwargs,

View File

@@ -1,89 +1,99 @@
import functools
import importlib
import os
import re
from pathlib import Path
from typing import Type, TypeVar
from backend.data.block import Block
# Dynamically load all modules under backend.blocks
AVAILABLE_MODULES = []
current_dir = Path(__file__).parent
modules = [
str(f.relative_to(current_dir))[:-3].replace(os.path.sep, ".")
for f in current_dir.rglob("*.py")
if f.is_file() and f.name != "__init__.py"
]
for module in modules:
if not re.match("^[a-z0-9_.]+$", module):
raise ValueError(
f"Block module {module} error: module name must be lowercase, "
"and contain only alphanumeric characters and underscores."
)
importlib.import_module(f".{module}", package=__name__)
AVAILABLE_MODULES.append(module)
# Load all Block instances from the available modules
AVAILABLE_BLOCKS: dict[str, Type[Block]] = {}
from typing import TYPE_CHECKING, TypeVar
if TYPE_CHECKING:
from backend.data.block import Block
T = TypeVar("T")
def all_subclasses(cls: Type[T]) -> list[Type[T]]:
@functools.cache
def load_all_blocks() -> dict[str, type["Block"]]:
from backend.data.block import Block
# Dynamically load all modules under backend.blocks
current_dir = Path(__file__).parent
modules = [
str(f.relative_to(current_dir))[:-3].replace(os.path.sep, ".")
for f in current_dir.rglob("*.py")
if f.is_file() and f.name != "__init__.py"
]
for module in modules:
if not re.match("^[a-z0-9_.]+$", module):
raise ValueError(
f"Block module {module} error: module name must be lowercase, "
"and contain only alphanumeric characters and underscores."
)
importlib.import_module(f".{module}", package=__name__)
# Load all Block instances from the available modules
available_blocks: dict[str, type["Block"]] = {}
for block_cls in all_subclasses(Block):
class_name = block_cls.__name__
if class_name.endswith("Base"):
continue
if not class_name.endswith("Block"):
raise ValueError(
f"Block class {class_name} does not end with 'Block'. "
"If you are creating an abstract class, "
"please name the class with 'Base' at the end"
)
block = block_cls.create()
if not isinstance(block.id, str) or len(block.id) != 36:
raise ValueError(
f"Block ID {block.name} error: {block.id} is not a valid UUID"
)
if block.id in available_blocks:
raise ValueError(
f"Block ID {block.name} error: {block.id} is already in use"
)
input_schema = block.input_schema.model_fields
output_schema = block.output_schema.model_fields
# Make sure `error` field is a string in the output schema
if "error" in output_schema and output_schema["error"].annotation is not str:
raise ValueError(
f"{block.name} `error` field in output_schema must be a string"
)
# Ensure all fields in input_schema and output_schema are annotated SchemaFields
for field_name, field in [*input_schema.items(), *output_schema.items()]:
if field.annotation is None:
raise ValueError(
f"{block.name} has a field {field_name} that is not annotated"
)
if field.json_schema_extra is None:
raise ValueError(
f"{block.name} has a field {field_name} not defined as SchemaField"
)
for field in block.input_schema.model_fields.values():
if field.annotation is bool and field.default not in (True, False):
raise ValueError(
f"{block.name} has a boolean field with no default value"
)
available_blocks[block.id] = block_cls
return available_blocks
__all__ = ["load_all_blocks"]
def all_subclasses(cls: type[T]) -> list[type[T]]:
subclasses = cls.__subclasses__()
for subclass in subclasses:
subclasses += all_subclasses(subclass)
return subclasses
for block_cls in all_subclasses(Block):
name = block_cls.__name__
if block_cls.__name__.endswith("Base"):
continue
if not block_cls.__name__.endswith("Block"):
raise ValueError(
f"Block class {block_cls.__name__} does not end with 'Block', If you are creating an abstract class, please name the class with 'Base' at the end"
)
block = block_cls.create()
if not isinstance(block.id, str) or len(block.id) != 36:
raise ValueError(f"Block ID {block.name} error: {block.id} is not a valid UUID")
if block.id in AVAILABLE_BLOCKS:
raise ValueError(f"Block ID {block.name} error: {block.id} is already in use")
input_schema = block.input_schema.model_fields
output_schema = block.output_schema.model_fields
# Make sure `error` field is a string in the output schema
if "error" in output_schema and output_schema["error"].annotation is not str:
raise ValueError(
f"{block.name} `error` field in output_schema must be a string"
)
# Make sure all fields in input_schema and output_schema are annotated and has a value
for field_name, field in [*input_schema.items(), *output_schema.items()]:
if field.annotation is None:
raise ValueError(
f"{block.name} has a field {field_name} that is not annotated"
)
if field.json_schema_extra is None:
raise ValueError(
f"{block.name} has a field {field_name} not defined as SchemaField"
)
for field in block.input_schema.model_fields.values():
if field.annotation is bool and field.default not in (True, False):
raise ValueError(f"{block.name} has a boolean field with no default value")
if block.disabled:
continue
AVAILABLE_BLOCKS[block.id] = block_cls
__all__ = ["AVAILABLE_MODULES", "AVAILABLE_BLOCKS"]

View File

@@ -1,6 +1,5 @@
import logging
from autogpt_libs.utils.cache import thread_cached
from typing import Any, Optional
from backend.data.block import (
Block,
@@ -12,36 +11,43 @@ from backend.data.block import (
get_block,
)
from backend.data.execution import ExecutionStatus
from backend.data.model import SchemaField
from backend.data.model import CredentialsMetaInput, SchemaField
from backend.util import json
logger = logging.getLogger(__name__)
@thread_cached
def get_executor_manager_client():
from backend.executor import ExecutionManager
from backend.util.service import get_service_client
return get_service_client(ExecutionManager)
@thread_cached
def get_event_bus():
from backend.data.execution import RedisExecutionEventBus
return RedisExecutionEventBus()
class AgentExecutorBlock(Block):
class Input(BlockSchema):
user_id: str = SchemaField(description="User ID")
graph_id: str = SchemaField(description="Graph ID")
graph_version: int = SchemaField(description="Graph Version")
data: BlockInput = SchemaField(description="Input data for the graph")
inputs: BlockInput = SchemaField(description="Input data for the graph")
input_schema: dict = SchemaField(description="Input schema for the graph")
output_schema: dict = SchemaField(description="Output schema for the graph")
node_credentials_input_map: Optional[
dict[str, dict[str, CredentialsMetaInput]]
] = SchemaField(default=None, hidden=True)
@classmethod
def get_input_schema(cls, data: BlockInput) -> dict[str, Any]:
return data.get("input_schema", {})
@classmethod
def get_input_defaults(cls, data: BlockInput) -> BlockInput:
return data.get("inputs", {})
@classmethod
def get_missing_input(cls, data: BlockInput) -> set[str]:
required_fields = cls.get_input_schema(data).get("required", [])
return set(required_fields) - set(data)
@classmethod
def get_mismatch_error(cls, data: BlockInput) -> str | None:
return json.validate_with_jsonschema(cls.get_input_schema(data), data)
class Output(BlockSchema):
pass
@@ -56,26 +62,27 @@ class AgentExecutorBlock(Block):
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
executor_manager = get_executor_manager_client()
event_bus = get_event_bus()
from backend.data.execution import ExecutionEventType
from backend.executor import utils as execution_utils
graph_exec = executor_manager.add_execution(
event_bus = execution_utils.get_execution_event_bus()
graph_exec = execution_utils.add_graph_execution(
graph_id=input_data.graph_id,
graph_version=input_data.graph_version,
user_id=input_data.user_id,
data=input_data.data,
inputs=input_data.inputs,
node_credentials_input_map=input_data.node_credentials_input_map,
)
log_id = f"Graph #{input_data.graph_id}-V{input_data.graph_version}, exec-id: {graph_exec.graph_exec_id}"
log_id = f"Graph #{input_data.graph_id}-V{input_data.graph_version}, exec-id: {graph_exec.id}"
logger.info(f"Starting execution of {log_id}")
for event in event_bus.listen(
graph_id=graph_exec.graph_id, graph_exec_id=graph_exec.graph_exec_id
user_id=graph_exec.user_id,
graph_id=graph_exec.graph_id,
graph_exec_id=graph_exec.id,
):
logger.info(
f"Execution {log_id} produced input {event.input_data} output {event.output_data}"
)
if not event.node_id:
if event.event_type == ExecutionEventType.GRAPH_EXEC_UPDATE:
if event.status in [
ExecutionStatus.COMPLETED,
ExecutionStatus.TERMINATED,
@@ -86,6 +93,10 @@ class AgentExecutorBlock(Block):
else:
continue
logger.debug(
f"Execution {log_id} produced input {event.input_data} output {event.output_data}"
)
if not event.block_id:
logger.warning(f"{log_id} received event without block_id {event}")
continue
@@ -100,5 +111,7 @@ class AgentExecutorBlock(Block):
continue
for output_data in event.output_data.get("output", []):
logger.info(f"Execution {log_id} produced {output_name}: {output_data}")
logger.debug(
f"Execution {log_id} produced {output_name}: {output_data}"
)
yield output_name, output_data

View File

@@ -1,8 +1,8 @@
from enum import Enum
from typing import Literal
import replicate
from pydantic import SecretStr
from replicate.client import Client as ReplicateClient
from replicate.helpers import FileOutput
from backend.data.block import Block, BlockCategory, BlockSchema
@@ -170,7 +170,7 @@ class AIImageGeneratorBlock(Block):
):
try:
# Initialize Replicate client
client = replicate.Client(api_token=credentials.api_key.get_secret_value())
client = ReplicateClient(api_token=credentials.api_key.get_secret_value())
# Run the model with input parameters
output = client.run(model_name, input=input_params, wait=False)

View File

@@ -3,8 +3,8 @@ import time
from enum import Enum
from typing import Literal
import replicate
from pydantic import SecretStr
from replicate.client import Client as ReplicateClient
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import (
@@ -196,7 +196,7 @@ class AIMusicGeneratorBlock(Block):
normalization_strategy: NormalizationStrategy,
):
# Initialize Replicate client with the API key
client = replicate.Client(api_token=api_key.get_secret_value())
client = ReplicateClient(api_token=api_key.get_secret_value())
# Run the model with parameters
output = client.run(

View File

@@ -0,0 +1,108 @@
import logging
from typing import List
from backend.blocks.apollo._auth import ApolloCredentials
from backend.blocks.apollo.models import (
Contact,
Organization,
SearchOrganizationsRequest,
SearchOrganizationsResponse,
SearchPeopleRequest,
SearchPeopleResponse,
)
from backend.util.request import Requests
logger = logging.getLogger(name=__name__)
class ApolloClient:
"""Client for the Apollo API"""
API_URL = "https://api.apollo.io/api/v1"
def __init__(self, credentials: ApolloCredentials):
self.credentials = credentials
self.requests = Requests()
def _get_headers(self) -> dict[str, str]:
return {"x-api-key": self.credentials.api_key.get_secret_value()}
def search_people(self, query: SearchPeopleRequest) -> List[Contact]:
"""Search for people in Apollo"""
response = self.requests.get(
f"{self.API_URL}/mixed_people/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchPeopleResponse(**response.json())
if parsed_response.pagination.total_entries == 0:
return []
people = parsed_response.people
# handle pagination
if (
query.max_results is not None
and query.max_results < parsed_response.pagination.total_entries
and len(people) < query.max_results
):
while (
len(people) < query.max_results
and query.page < parsed_response.pagination.total_pages
and len(parsed_response.people) > 0
):
query.page += 1
response = self.requests.get(
f"{self.API_URL}/mixed_people/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchPeopleResponse(**response.json())
people.extend(parsed_response.people[: query.max_results - len(people)])
logger.info(f"Found {len(people)} people")
return people[: query.max_results] if query.max_results else people
def search_organizations(
self, query: SearchOrganizationsRequest
) -> List[Organization]:
"""Search for organizations in Apollo"""
response = self.requests.get(
f"{self.API_URL}/mixed_companies/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchOrganizationsResponse(**response.json())
if parsed_response.pagination.total_entries == 0:
return []
organizations = parsed_response.organizations
# handle pagination
if (
query.max_results is not None
and query.max_results < parsed_response.pagination.total_entries
and len(organizations) < query.max_results
):
while (
len(organizations) < query.max_results
and query.page < parsed_response.pagination.total_pages
and len(parsed_response.organizations) > 0
):
query.page += 1
response = self.requests.get(
f"{self.API_URL}/mixed_companies/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchOrganizationsResponse(**response.json())
organizations.extend(
parsed_response.organizations[
: query.max_results - len(organizations)
]
)
logger.info(f"Found {len(organizations)} organizations")
return (
organizations[: query.max_results] if query.max_results else organizations
)

View File

@@ -0,0 +1,35 @@
from typing import Literal
from pydantic import SecretStr
from backend.data.model import APIKeyCredentials, CredentialsField, CredentialsMetaInput
from backend.integrations.providers import ProviderName
ApolloCredentials = APIKeyCredentials
ApolloCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.APOLLO],
Literal["api_key"],
]
TEST_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="apollo",
api_key=SecretStr("mock-apollo-api-key"),
title="Mock Apollo API key",
expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
def ApolloCredentialsField() -> ApolloCredentialsInput:
"""
Creates a Apollo credentials input on a block.
"""
return CredentialsField(
description="The Apollo integration can be used with an API Key.",
)

View File

@@ -0,0 +1,548 @@
from enum import Enum
from typing import Any, Optional
from pydantic import BaseModel, ConfigDict
from backend.data.model import SchemaField
class PrimaryPhone(BaseModel):
"""A primary phone in Apollo"""
number: str
source: str
sanitized_number: str
class SenorityLevels(str, Enum):
"""Seniority levels in Apollo"""
OWNER = "owner"
FOUNDER = "founder"
C_SUITE = "c_suite"
PARTNER = "partner"
VP = "vp"
HEAD = "head"
DIRECTOR = "director"
MANAGER = "manager"
SENIOR = "senior"
ENTRY = "entry"
INTERN = "intern"
class ContactEmailStatuses(str, Enum):
"""Contact email statuses in Apollo"""
VERIFIED = "verified"
UNVERIFIED = "unverified"
LIKELY_TO_ENGAGE = "likely_to_engage"
UNAVAILABLE = "unavailable"
class RuleConfigStatus(BaseModel):
"""A rule config status in Apollo"""
_id: str
created_at: str
rule_action_config_id: str
rule_config_id: str
status_cd: str
updated_at: str
id: str
key: str
class ContactCampaignStatus(BaseModel):
"""A contact campaign status in Apollo"""
id: str
emailer_campaign_id: str
send_email_from_user_id: str
inactive_reason: str
status: str
added_at: str
added_by_user_id: str
finished_at: str
paused_at: str
auto_unpause_at: str
send_email_from_email_address: str
send_email_from_email_account_id: str
manually_set_unpause: str
failure_reason: str
current_step_id: str
in_response_to_emailer_message_id: str
cc_emails: str
bcc_emails: str
to_emails: str
class Account(BaseModel):
"""An account in Apollo"""
id: str
name: str
website_url: str
blog_url: str
angellist_url: str
linkedin_url: str
twitter_url: str
facebook_url: str
primary_phone: PrimaryPhone
languages: list[str]
alexa_ranking: int
phone: str
linkedin_uid: str
founded_year: int
publicly_traded_symbol: str
publicly_traded_exchange: str
logo_url: str
chrunchbase_url: str
primary_domain: str
domain: str
team_id: str
organization_id: str
account_stage_id: str
source: str
original_source: str
creator_id: str
owner_id: str
created_at: str
phone_status: str
hubspot_id: str
salesforce_id: str
crm_owner_id: str
parent_account_id: str
sanitized_phone: str
# no listed type on the API docs
account_playbook_statues: list[Any]
account_rule_config_statuses: list[RuleConfigStatus]
existence_level: str
label_ids: list[str]
typed_custom_fields: Any
custom_field_errors: Any
modality: str
source_display_name: str
salesforce_record_id: str
crm_record_url: str
class ContactEmail(BaseModel):
"""A contact email in Apollo"""
email: str = ""
email_md5: str = ""
email_sha256: str = ""
email_status: str = ""
email_source: str = ""
extrapolated_email_confidence: str = ""
position: int = 0
email_from_customer: str = ""
free_domain: bool = True
class EmploymentHistory(BaseModel):
"""An employment history in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
_id: Optional[str] = None
created_at: Optional[str] = None
current: Optional[bool] = None
degree: Optional[str] = None
description: Optional[str] = None
emails: Optional[str] = None
end_date: Optional[str] = None
grade_level: Optional[str] = None
kind: Optional[str] = None
major: Optional[str] = None
organization_id: Optional[str] = None
organization_name: Optional[str] = None
raw_address: Optional[str] = None
start_date: Optional[str] = None
title: Optional[str] = None
updated_at: Optional[str] = None
id: Optional[str] = None
key: Optional[str] = None
class Breadcrumb(BaseModel):
"""A breadcrumb in Apollo"""
label: Optional[str] = "N/A"
signal_field_name: Optional[str] = "N/A"
value: str | list | None = "N/A"
display_name: Optional[str] = "N/A"
class TypedCustomField(BaseModel):
"""A typed custom field in Apollo"""
id: Optional[str] = "N/A"
value: Optional[str] = "N/A"
class Pagination(BaseModel):
"""Pagination in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
page: int = 0
per_page: int = 0
total_entries: int = 0
total_pages: int = 0
class DialerFlags(BaseModel):
"""A dialer flags in Apollo"""
country_name: str
country_enabled: bool
high_risk_calling_enabled: bool
potential_high_risk_number: bool
class PhoneNumber(BaseModel):
"""A phone number in Apollo"""
raw_number: str = ""
sanitized_number: str = ""
type: str = ""
position: int = 0
status: str = ""
dnc_status: str = ""
dnc_other_info: str = ""
dailer_flags: DialerFlags = DialerFlags(
country_name="",
country_enabled=True,
high_risk_calling_enabled=True,
potential_high_risk_number=True,
)
class Organization(BaseModel):
"""An organization in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
id: Optional[str] = "N/A"
name: Optional[str] = "N/A"
website_url: Optional[str] = "N/A"
blog_url: Optional[str] = "N/A"
angellist_url: Optional[str] = "N/A"
linkedin_url: Optional[str] = "N/A"
twitter_url: Optional[str] = "N/A"
facebook_url: Optional[str] = "N/A"
primary_phone: Optional[PrimaryPhone] = PrimaryPhone(
number="N/A", source="N/A", sanitized_number="N/A"
)
languages: list[str] = []
alexa_ranking: Optional[int] = 0
phone: Optional[str] = "N/A"
linkedin_uid: Optional[str] = "N/A"
founded_year: Optional[int] = 0
publicly_traded_symbol: Optional[str] = "N/A"
publicly_traded_exchange: Optional[str] = "N/A"
logo_url: Optional[str] = "N/A"
chrunchbase_url: Optional[str] = "N/A"
primary_domain: Optional[str] = "N/A"
sanitized_phone: Optional[str] = "N/A"
owned_by_organization_id: Optional[str] = "N/A"
intent_strength: Optional[str] = "N/A"
show_intent: bool = True
has_intent_signal_account: Optional[bool] = True
intent_signal_account: Optional[str] = "N/A"
class Contact(BaseModel):
"""A contact in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
contact_roles: list[Any] = []
id: Optional[str] = None
first_name: Optional[str] = None
last_name: Optional[str] = None
name: Optional[str] = None
linkedin_url: Optional[str] = None
title: Optional[str] = None
contact_stage_id: Optional[str] = None
owner_id: Optional[str] = None
creator_id: Optional[str] = None
person_id: Optional[str] = None
email_needs_tickling: bool = True
organization_name: Optional[str] = None
source: Optional[str] = None
original_source: Optional[str] = None
organization_id: Optional[str] = None
headline: Optional[str] = None
photo_url: Optional[str] = None
present_raw_address: Optional[str] = None
linkededin_uid: Optional[str] = None
extrapolated_email_confidence: Optional[float] = None
salesforce_id: Optional[str] = None
salesforce_lead_id: Optional[str] = None
salesforce_contact_id: Optional[str] = None
saleforce_account_id: Optional[str] = None
crm_owner_id: Optional[str] = None
created_at: Optional[str] = None
emailer_campaign_ids: list[str] = []
direct_dial_status: Optional[str] = None
direct_dial_enrichment_failed_at: Optional[str] = None
email_status: Optional[str] = None
email_source: Optional[str] = None
account_id: Optional[str] = None
last_activity_date: Optional[str] = None
hubspot_vid: Optional[str] = None
hubspot_company_id: Optional[str] = None
crm_id: Optional[str] = None
sanitized_phone: Optional[str] = None
merged_crm_ids: Optional[str] = None
updated_at: Optional[str] = None
queued_for_crm_push: bool = True
suggested_from_rule_engine_config_id: Optional[str] = None
email_unsubscribed: Optional[str] = None
label_ids: list[Any] = []
has_pending_email_arcgate_request: bool = True
has_email_arcgate_request: bool = True
existence_level: Optional[str] = None
email: Optional[str] = None
email_from_customer: Optional[str] = None
typed_custom_fields: list[TypedCustomField] = []
custom_field_errors: Any = None
salesforce_record_id: Optional[str] = None
crm_record_url: Optional[str] = None
email_status_unavailable_reason: Optional[str] = None
email_true_status: Optional[str] = None
updated_email_true_status: bool = True
contact_rule_config_statuses: list[RuleConfigStatus] = []
source_display_name: Optional[str] = None
twitter_url: Optional[str] = None
contact_campaign_statuses: list[ContactCampaignStatus] = []
state: Optional[str] = None
city: Optional[str] = None
country: Optional[str] = None
account: Optional[Account] = None
contact_emails: list[ContactEmail] = []
organization: Optional[Organization] = None
employment_history: list[EmploymentHistory] = []
time_zone: Optional[str] = None
intent_strength: Optional[str] = None
show_intent: bool = True
phone_numbers: list[PhoneNumber] = []
account_phone_note: Optional[str] = None
free_domain: bool = True
is_likely_to_engage: bool = True
email_domain_catchall: bool = True
contact_job_change_event: Optional[str] = None
class SearchOrganizationsRequest(BaseModel):
"""Request for Apollo's search organizations API"""
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default=[0, 1000000],
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.
To exclude companies based on location, use the organization_not_locations parameter.
""",
default_factory=list,
)
organizations_not_locations: list[str] = SchemaField(
description="""Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude.
This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results.
""",
default_factory=list,
)
q_organization_keyword_tags: list[str] = SchemaField(
description="""Filter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry."""
)
q_organization_name: str = SchemaField(
description="""Filter search results to include a specific company name.
If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible."""
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, identify the values for organization_id when you call this endpoint.""",
default_factory=list,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
page: int = SchemaField(
description="""The page number of the Apollo data that you want to retrieve.
Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint.""",
default=1,
)
per_page: int = SchemaField(
description="""The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance.
Use the page parameter to search the different pages of data.""",
default=100,
)
class SearchOrganizationsResponse(BaseModel):
"""Response from Apollo's search organizations API"""
breadcrumbs: list[Breadcrumb] = []
partial_results_only: bool = True
has_join: bool = True
disable_eu_prospecting: bool = True
partial_results_limit: int = 0
pagination: Pagination = Pagination(
page=0, per_page=0, total_entries=0, total_pages=0
)
# no listed type on the API docs
accounts: list[Any] = []
organizations: list[Organization] = []
models_ids: list[str] = []
num_fetch_result: Optional[str] = "N/A"
derived_params: Optional[str] = "N/A"
class SearchPeopleRequest(BaseModel):
"""Request for Apollo's search people API"""
person_titles: list[str] = SchemaField(
description="""Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results.
Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager.
Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels.
""",
default_factory=list,
placeholder="marketing manager",
)
person_locations: list[str] = SchemaField(
description="""The location where people live. You can search across cities, US states, and countries.
To find people based on the headquarters locations of their current employer, use the organization_locations parameter.""",
default_factory=list,
)
person_seniorities: list[SenorityLevels] = SchemaField(
description="""The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level.
For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results.
Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results.
Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels.""",
default_factory=list,
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters.
To find people based on their personal location, use the person_locations parameter.""",
default_factory=list,
)
q_organization_domains: list[str] = SchemaField(
description="""The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar.
You can add multiple domains to search across companies.
Examples: apollo.io and microsoft.com""",
default_factory=list,
)
contact_email_statuses: list[ContactEmailStatuses] = SchemaField(
description="""The email statuses for the people you want to find. You can add multiple statuses to expand your search.""",
default_factory=list,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, call the Organization Search endpoint and identify the values for organization_id.""",
default_factory=list,
)
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default_factory=list,
)
q_keywords: str = SchemaField(
description="""A string of words over which we want to filter the results""",
default="",
)
page: int = SchemaField(
description="""The page number of the Apollo data that you want to retrieve.
Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint.""",
default=1,
)
per_page: int = SchemaField(
description="""The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance.
Use the page parameter to search the different pages of data.""",
default=100,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
class SearchPeopleResponse(BaseModel):
"""Response from Apollo's search people API"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
breadcrumbs: list[Breadcrumb] = []
partial_results_only: bool = True
has_join: bool = True
disable_eu_prospecting: bool = True
partial_results_limit: int = 0
pagination: Pagination = Pagination(
page=0, per_page=0, total_entries=0, total_pages=0
)
contacts: list[Contact] = []
people: list[Contact] = []
model_ids: list[str] = []
num_fetch_result: Optional[str] = "N/A"
derived_params: Optional[str] = "N/A"

View File

@@ -0,0 +1,219 @@
from backend.blocks.apollo._api import ApolloClient
from backend.blocks.apollo._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
ApolloCredentials,
ApolloCredentialsInput,
)
from backend.blocks.apollo.models import (
Organization,
PrimaryPhone,
SearchOrganizationsRequest,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class SearchOrganizationsBlock(Block):
"""Search for organizations in Apollo"""
class Input(BlockSchema):
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default=[0, 1000000],
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.
To exclude companies based on location, use the organization_not_locations parameter.
""",
default_factory=list,
)
organizations_not_locations: list[str] = SchemaField(
description="""Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude.
This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results.
""",
default_factory=list,
)
q_organization_keyword_tags: list[str] = SchemaField(
description="""Filter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry.""",
default_factory=list,
)
q_organization_name: str = SchemaField(
description="""Filter search results to include a specific company name.
If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible.""",
default="",
advanced=False,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, identify the values for organization_id when you call this endpoint.""",
default_factory=list,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
credentials: ApolloCredentialsInput = SchemaField(
description="Apollo credentials",
)
class Output(BlockSchema):
organizations: list[Organization] = SchemaField(
description="List of organizations found",
default_factory=list,
)
organization: Organization = SchemaField(
description="Each found organization, one at a time",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="3d71270d-599e-4148-9b95-71b35d2f44f0",
description="Search for organizations in Apollo",
categories={BlockCategory.SEARCH},
input_schema=SearchOrganizationsBlock.Input,
output_schema=SearchOrganizationsBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"query": "Google", "credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"organization",
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
),
),
(
"organizations",
[
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
),
],
),
],
test_mock={
"search_organizations": lambda *args, **kwargs: [
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
)
]
},
)
@staticmethod
def search_organizations(
query: SearchOrganizationsRequest, credentials: ApolloCredentials
) -> list[Organization]:
client = ApolloClient(credentials)
return client.search_organizations(query)
def run(
self, input_data: Input, *, credentials: ApolloCredentials, **kwargs
) -> BlockOutput:
query = SearchOrganizationsRequest(
**input_data.model_dump(exclude={"credentials"})
)
organizations = self.search_organizations(query, credentials)
for organization in organizations:
yield "organization", organization
yield "organizations", organizations

View File

@@ -0,0 +1,394 @@
from backend.blocks.apollo._api import ApolloClient
from backend.blocks.apollo._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
ApolloCredentials,
ApolloCredentialsInput,
)
from backend.blocks.apollo.models import (
Contact,
ContactEmailStatuses,
SearchPeopleRequest,
SenorityLevels,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class SearchPeopleBlock(Block):
"""Search for people in Apollo"""
class Input(BlockSchema):
person_titles: list[str] = SchemaField(
description="""Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results.
Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager.
Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels.
""",
default_factory=list,
advanced=False,
)
person_locations: list[str] = SchemaField(
description="""The location where people live. You can search across cities, US states, and countries.
To find people based on the headquarters locations of their current employer, use the organization_locations parameter.""",
default_factory=list,
advanced=False,
)
person_seniorities: list[SenorityLevels] = SchemaField(
description="""The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level.
For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results.
Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results.
Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels.""",
default_factory=list,
advanced=False,
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters.
To find people based on their personal location, use the person_locations parameter.""",
default_factory=list,
advanced=False,
)
q_organization_domains: list[str] = SchemaField(
description="""The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar.
You can add multiple domains to search across companies.
Examples: apollo.io and microsoft.com""",
default_factory=list,
advanced=False,
)
contact_email_statuses: list[ContactEmailStatuses] = SchemaField(
description="""The email statuses for the people you want to find. You can add multiple statuses to expand your search.""",
default_factory=list,
advanced=False,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, call the Organization Search endpoint and identify the values for organization_id.""",
default_factory=list,
advanced=False,
)
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default_factory=list,
advanced=False,
)
q_keywords: str = SchemaField(
description="""A string of words over which we want to filter the results""",
default="",
advanced=False,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
credentials: ApolloCredentialsInput = SchemaField(
description="Apollo credentials",
)
class Output(BlockSchema):
people: list[Contact] = SchemaField(
description="List of people found",
default_factory=list,
)
person: Contact = SchemaField(
description="Each found person, one at a time",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="c2adb3aa-5aae-488d-8a6e-4eb8c23e2ed6",
description="Search for people in Apollo",
categories={BlockCategory.SEARCH},
input_schema=SearchPeopleBlock.Input,
output_schema=SearchPeopleBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"person",
Contact(
contact_roles=[],
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
),
(
"people",
[
Contact(
contact_roles=[],
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
],
),
],
test_mock={
"search_people": lambda query, credentials: [
Contact(
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
]
},
)
@staticmethod
def search_people(
query: SearchPeopleRequest, credentials: ApolloCredentials
) -> list[Contact]:
client = ApolloClient(credentials)
return client.search_people(query)
def run(
self,
input_data: Input,
*,
credentials: ApolloCredentials,
**kwargs,
) -> BlockOutput:
query = SearchPeopleRequest(**input_data.model_dump(exclude={"credentials"}))
people = self.search_people(query, credentials)
for person in people:
yield "person", person
yield "people", people

View File

@@ -3,22 +3,20 @@ from typing import Any, List
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema, BlockType
from backend.data.model import SchemaField
from backend.util.file import MediaFile, store_media_file
from backend.util import json
from backend.util.file import store_media_file
from backend.util.mock import MockObject
from backend.util.text import TextFormatter
from backend.util.type import convert
formatter = TextFormatter()
from backend.util.type import MediaFileType, convert
class FileStoreBlock(Block):
class Input(BlockSchema):
file_in: MediaFile = SchemaField(
file_in: MediaFileType = SchemaField(
description="The file to store in the temporary directory, it can be a URL, data URI, or local path."
)
class Output(BlockSchema):
file_out: MediaFile = SchemaField(
file_out: MediaFileType = SchemaField(
description="The relative path to the stored file in the temporary directory."
)
@@ -92,9 +90,10 @@ class StoreValueBlock(Block):
class PrintToConsoleBlock(Block):
class Input(BlockSchema):
text: str = SchemaField(description="The text to print to the console.")
text: Any = SchemaField(description="The data to print to the console.")
class Output(BlockSchema):
output: Any = SchemaField(description="The data printed to the console.")
status: str = SchemaField(description="The status of the print operation.")
def __init__(self):
@@ -105,11 +104,14 @@ class PrintToConsoleBlock(Block):
input_schema=PrintToConsoleBlock.Input,
output_schema=PrintToConsoleBlock.Output,
test_input={"text": "Hello, World!"},
test_output=("status", "printed"),
test_output=[
("output", "Hello, World!"),
("status", "printed"),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
print(">>>>> Print: ", input_data.text)
yield "output", input_data.text
yield "status", "printed"
@@ -153,6 +155,9 @@ class FindInDictionaryBlock(Block):
obj = input_data.input
key = input_data.key
if isinstance(obj, str):
obj = json.loads(obj)
if isinstance(obj, dict) and key in obj:
yield "output", obj[key]
elif isinstance(obj, list) and isinstance(key, int) and 0 <= key < len(obj):
@@ -170,192 +175,10 @@ class FindInDictionaryBlock(Block):
yield "missing", input_data.input
class AgentInputBlock(Block):
"""
This block is used to provide input to the graph.
It takes in a value, name, description, default values list and bool to limit selection to default values.
It Outputs the value passed as input.
"""
class Input(BlockSchema):
name: str = SchemaField(description="The name of the input.")
value: Any = SchemaField(
description="The value to be passed as input.",
default=None,
)
title: str | None = SchemaField(
description="The title of the input.", default=None, advanced=True
)
description: str | None = SchemaField(
description="The description of the input.",
default=None,
advanced=True,
)
placeholder_values: List[Any] = SchemaField(
description="The placeholder values to be passed as input.",
default=[],
advanced=True,
)
limit_to_placeholder_values: bool = SchemaField(
description="Whether to limit the selection to placeholder values.",
default=False,
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to show the input in the advanced section, if the field is not required.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the input should be treated as a secret.",
default=False,
advanced=True,
)
class Output(BlockSchema):
result: Any = SchemaField(description="The value passed as input.")
def __init__(self):
super().__init__(
id="c0a8e994-ebf1-4a9c-a4d8-89d09c86741b",
description="This block is used to provide input to the graph.",
input_schema=AgentInputBlock.Input,
output_schema=AgentInputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "input_1",
"description": "This is a test input.",
"placeholder_values": [],
"limit_to_placeholder_values": False,
},
{
"value": "Hello, World!",
"name": "input_2",
"description": "This is a test input.",
"placeholder_values": ["Hello, World!"],
"limit_to_placeholder_values": True,
},
],
test_output=[
("result", "Hello, World!"),
("result", "Hello, World!"),
],
categories={BlockCategory.INPUT, BlockCategory.BASIC},
block_type=BlockType.INPUT,
static_output=True,
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "result", input_data.value
class AgentOutputBlock(Block):
"""
Records the output of the graph for users to see.
Behavior:
If `format` is provided and the `value` is of a type that can be formatted,
the block attempts to format the recorded_value using the `format`.
If formatting fails or no `format` is provided, the raw `value` is output.
"""
class Input(BlockSchema):
value: Any = SchemaField(
description="The value to be recorded as output.",
default=None,
advanced=False,
)
name: str = SchemaField(description="The name of the output.")
title: str | None = SchemaField(
description="The title of the output.",
default=None,
advanced=True,
)
description: str | None = SchemaField(
description="The description of the output.",
default=None,
advanced=True,
)
format: str = SchemaField(
description="The format string to be used to format the recorded_value. Use Jinja2 syntax.",
default="",
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to treat the output as advanced.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the output should be treated as a secret.",
default=False,
advanced=True,
)
class Output(BlockSchema):
output: Any = SchemaField(description="The value recorded as output.")
name: Any = SchemaField(description="The name of the value recorded as output.")
def __init__(self):
super().__init__(
id="363ae599-353e-4804-937e-b2ee3cef3da4",
description="Stores the output of the graph for users to see.",
input_schema=AgentOutputBlock.Input,
output_schema=AgentOutputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "output_1",
"description": "This is a test output.",
"format": "{{ output_1 }}!!",
},
{
"value": "42",
"name": "output_2",
"description": "This is another test output.",
"format": "{{ output_2 }}",
},
{
"value": MockObject(value="!!", key="key"),
"name": "output_3",
"description": "This is a test output with a mock object.",
"format": "{{ output_3 }}",
},
],
test_output=[
("output", "Hello, World!!!"),
("output", "42"),
("output", MockObject(value="!!", key="key")),
],
categories={BlockCategory.OUTPUT, BlockCategory.BASIC},
block_type=BlockType.OUTPUT,
static_output=True,
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
"""
Attempts to format the recorded_value using the fmt_string if provided.
If formatting fails or no fmt_string is given, returns the original recorded_value.
"""
if input_data.format:
try:
yield "output", formatter.format_string(
input_data.format, {input_data.name: input_data.value}
)
except Exception as e:
yield "output", f"Error: {e}, {input_data.value}"
else:
yield "output", input_data.value
yield "name", input_data.name
class AddToDictionaryBlock(Block):
class Input(BlockSchema):
dictionary: dict[Any, Any] = SchemaField(
default={},
default_factory=dict,
description="The dictionary to add the entry to. If not provided, a new dictionary will be created.",
)
key: str = SchemaField(
@@ -371,7 +194,7 @@ class AddToDictionaryBlock(Block):
advanced=False,
)
entries: dict[Any, Any] = SchemaField(
default={},
default_factory=dict,
description="The entries to add to the dictionary. This is the batch version of the `key` and `value` fields.",
advanced=True,
)
@@ -433,7 +256,7 @@ class AddToDictionaryBlock(Block):
class AddToListBlock(Block):
class Input(BlockSchema):
list: List[Any] = SchemaField(
default=[],
default_factory=list,
advanced=False,
description="The list to add the entry to. If not provided, a new list will be created.",
)
@@ -443,7 +266,7 @@ class AddToListBlock(Block):
default=None,
)
entries: List[Any] = SchemaField(
default=[],
default_factory=lambda: list(),
description="The entries to add to the list. This is the batch version of the `entry` field.",
advanced=True,
)

View File

@@ -55,7 +55,7 @@ class CodeExecutionBlock(Block):
"These commands are executed with `sh`, in the foreground."
),
placeholder="pip install cowsay",
default=[],
default_factory=list,
advanced=False,
)
@@ -207,7 +207,7 @@ class InstantiationBlock(Block):
"These commands are executed with `sh`, in the foreground."
),
placeholder="pip install cowsay",
default=[],
default_factory=list,
advanced=False,
)

View File

@@ -8,6 +8,7 @@ from backend.data.block import (
BlockSchema,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.integrations.webhooks.compass import CompassWebhookType
@@ -42,7 +43,7 @@ class CompassAITriggerBlock(Block):
input_schema=CompassAITriggerBlock.Input,
output_schema=CompassAITriggerBlock.Output,
webhook_config=BlockManualWebhookConfig(
provider="compass",
provider=ProviderName.COMPASS,
webhook_type=CompassWebhookType.TRANSCRIPTION,
),
test_input=[

View File

@@ -34,7 +34,7 @@ class ReadCsvBlock(Block):
)
skip_columns: list[str] = SchemaField(
description="The columns to skip from the start of the row",
default=[],
default_factory=list,
)
class Output(BlockSchema):

View File

@@ -1,6 +1,6 @@
from typing import List
from pydantic import BaseModel
from backend.blocks.exa._auth import (
ExaCredentials,
@@ -9,29 +9,14 @@ from backend.blocks.exa._auth import (
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from .helpers import ContentSettings
from backend.util.request import requests
class ContentRetrievalSettings(BaseModel):
text: dict = SchemaField(
description="Text content settings",
default={"maxCharacters": 1000, "includeHtmlTags": False},
advanced=True,
)
highlights: dict = SchemaField(
description="Highlight settings",
default={
"numSentences": 3,
"highlightsPerUrl": 3,
"query": "",
},
advanced=True,
)
summary: dict = SchemaField(
description="Summary settings",
default={"query": ""},
advanced=True,
)
# Use the fully-typed ``ContentSettings`` model from ``helpers`` instead of
# anonymous ``dict`` fields so that the generated JSON schema contains proper
# object properties. Without this, the frontend crashes when rendering the
# advanced settings for this block.
class ExaContentsBlock(Block):
@@ -40,17 +25,18 @@ class ExaContentsBlock(Block):
ids: List[str] = SchemaField(
description="Array of document IDs obtained from searches",
)
contents: ContentRetrievalSettings = SchemaField(
contents: ContentSettings = SchemaField(
description="Content retrieval settings",
default=ContentRetrievalSettings(),
default=ContentSettings(),
advanced=True,
)
class Output(BlockSchema):
results: list = SchemaField(
description="List of document contents",
default=[],
default_factory=list,
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(

View File

@@ -38,11 +38,11 @@ class ExaSearchBlock(Block):
)
include_domains: List[str] = SchemaField(
description="Domains to include in search",
default=[],
default_factory=list,
)
exclude_domains: List[str] = SchemaField(
description="Domains to exclude from search",
default=[],
default_factory=list,
advanced=True,
)
start_crawl_date: datetime = SchemaField(
@@ -59,12 +59,12 @@ class ExaSearchBlock(Block):
)
include_text: List[str] = SchemaField(
description="Text patterns to include",
default=[],
default_factory=list,
advanced=True,
)
exclude_text: List[str] = SchemaField(
description="Text patterns to exclude",
default=[],
default_factory=list,
advanced=True,
)
contents: ContentSettings = SchemaField(
@@ -76,7 +76,7 @@ class ExaSearchBlock(Block):
class Output(BlockSchema):
results: list = SchemaField(
description="List of search results",
default=[],
default_factory=list,
)
def __init__(self):

View File

@@ -26,12 +26,12 @@ class ExaFindSimilarBlock(Block):
)
include_domains: List[str] = SchemaField(
description="Domains to include in search",
default=[],
default_factory=list,
advanced=True,
)
exclude_domains: List[str] = SchemaField(
description="Domains to exclude from search",
default=[],
default_factory=list,
advanced=True,
)
start_crawl_date: datetime = SchemaField(
@@ -48,12 +48,12 @@ class ExaFindSimilarBlock(Block):
)
include_text: List[str] = SchemaField(
description="Text patterns to include (max 1 string, up to 5 words)",
default=[],
default_factory=list,
advanced=True,
)
exclude_text: List[str] = SchemaField(
description="Text patterns to exclude (max 1 string, up to 5 words)",
default=[],
default_factory=list,
advanced=True,
)
contents: ContentSettings = SchemaField(
@@ -65,7 +65,7 @@ class ExaFindSimilarBlock(Block):
class Output(BlockSchema):
results: List[Any] = SchemaField(
description="List of similar documents with title, URL, published date, author, and score",
default=[],
default_factory=list,
)
def __init__(self):

View File

@@ -42,7 +42,7 @@ class AIVideoGeneratorBlock(Block):
description="Error message if video generation failed."
)
logs: list[str] = SchemaField(
description="Generation progress logs.", optional=True
description="Generation progress logs.",
)
def __init__(self):

View File

@@ -0,0 +1,51 @@
from backend.data.block import (
Block,
BlockCategory,
BlockManualWebhookConfig,
BlockOutput,
BlockSchema,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.integrations.webhooks.generic import GenericWebhookType
class GenericWebhookTriggerBlock(Block):
class Input(BlockSchema):
payload: dict = SchemaField(hidden=True, default_factory=dict)
constants: dict = SchemaField(
description="The constants to be set when the block is put on the graph",
default_factory=dict,
)
class Output(BlockSchema):
payload: dict = SchemaField(
description="The complete webhook payload that was received from the generic webhook."
)
constants: dict = SchemaField(
description="The constants to be set when the block is put on the graph"
)
example_payload = {"message": "Hello, World!"}
def __init__(self):
super().__init__(
id="8fa8c167-2002-47ce-aba8-97572fc5d387",
description="This block will output the contents of the generic input for the webhook.",
categories={BlockCategory.INPUT},
input_schema=GenericWebhookTriggerBlock.Input,
output_schema=GenericWebhookTriggerBlock.Output,
webhook_config=BlockManualWebhookConfig(
provider=ProviderName.GENERIC_WEBHOOK,
webhook_type=GenericWebhookType.PLAIN,
),
test_input={"constants": {"key": "value"}, "payload": self.example_payload},
test_output=[
("constants", {"key": "value"}),
("payload", self.example_payload),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "constants", input_data.constants
yield "payload", input_data.payload

View File

@@ -38,6 +38,59 @@ def _get_headers(credentials: GithubCredentials) -> dict[str, str]:
}
def convert_comment_url_to_api_endpoint(comment_url: str) -> str:
"""
Converts a GitHub comment URL (web interface) to the appropriate API endpoint URL.
Handles:
1. Issue/PR comments: #issuecomment-{id}
2. PR review comments: #discussion_r{id}
Returns the appropriate API endpoint path for the comment.
"""
# First, check if this is already an API URL
parsed_url = urlparse(comment_url)
if parsed_url.hostname == "api.github.com":
return comment_url
# Replace pull with issues for comment endpoints
if "/pull/" in comment_url:
comment_url = comment_url.replace("/pull/", "/issues/")
# Handle issue/PR comments (#issuecomment-xxx)
if "#issuecomment-" in comment_url:
base_url, comment_part = comment_url.split("#issuecomment-")
comment_id = comment_part
# Extract repo information from base URL
parsed_url = urlparse(base_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
# Construct API URL for issue comments
return (
f"https://api.github.com/repos/{owner}/{repo}/issues/comments/{comment_id}"
)
# Handle PR review comments (#discussion_r)
elif "#discussion_r" in comment_url:
base_url, comment_part = comment_url.split("#discussion_r")
comment_id = comment_part
# Extract repo information from base URL
parsed_url = urlparse(base_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
# Construct API URL for PR review comments
return (
f"https://api.github.com/repos/{owner}/{repo}/pulls/comments/{comment_id}"
)
# If no specific comment identifiers are found, use the general URL conversion
return _convert_to_api_url(comment_url)
def get_api(
credentials: GithubCredentials | GithubFineGrainedAPICredentials,
convert_urls: bool = True,

View File

@@ -172,7 +172,9 @@ class GithubCreateCheckRunBlock(Block):
data.output = output_data
check_runs_url = f"{repo_url}/check-runs"
response = api.post(check_runs_url)
response = api.post(
check_runs_url, data=data.model_dump_json(exclude_none=True)
)
result = response.json()
return {
@@ -323,7 +325,9 @@ class GithubUpdateCheckRunBlock(Block):
data.output = output_data
check_run_url = f"{repo_url}/check-runs/{check_run_id}"
response = api.patch(check_run_url)
response = api.patch(
check_run_url, data=data.model_dump_json(exclude_none=True)
)
result = response.json()
return {

View File

@@ -1,3 +1,4 @@
import logging
from urllib.parse import urlparse
from typing_extensions import TypedDict
@@ -5,7 +6,7 @@ from typing_extensions import TypedDict
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from ._api import get_api
from ._api import convert_comment_url_to_api_endpoint, get_api
from ._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
@@ -14,6 +15,8 @@ from ._auth import (
GithubCredentialsInput,
)
logger = logging.getLogger(__name__)
def is_github_url(url: str) -> bool:
return urlparse(url).netloc == "github.com"
@@ -108,6 +111,228 @@ class GithubCommentBlock(Block):
# --8<-- [end:GithubCommentBlockExample]
class GithubUpdateCommentBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")
comment_url: str = SchemaField(
description="URL of the GitHub comment",
placeholder="https://github.com/owner/repo/issues/1#issuecomment-123456789",
default="",
advanced=False,
)
issue_url: str = SchemaField(
description="URL of the GitHub issue or pull request",
placeholder="https://github.com/owner/repo/issues/1",
default="",
)
comment_id: str = SchemaField(
description="ID of the GitHub comment",
placeholder="123456789",
default="",
)
comment: str = SchemaField(
description="Comment to update",
placeholder="Enter your comment",
)
class Output(BlockSchema):
id: int = SchemaField(description="ID of the updated comment")
url: str = SchemaField(description="URL to the comment on GitHub")
error: str = SchemaField(
description="Error message if the comment update failed"
)
def __init__(self):
super().__init__(
id="b3f4d747-10e3-4e69-8c51-f2be1d99c9a7",
description="This block updates a comment on a specified GitHub issue or pull request.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubUpdateCommentBlock.Input,
output_schema=GithubUpdateCommentBlock.Output,
test_input={
"comment_url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
"comment": "This is an updated comment.",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", 123456789),
(
"url",
"https://github.com/owner/repo/issues/1#issuecomment-123456789",
),
],
test_mock={
"update_comment": lambda *args, **kwargs: (
123456789,
"https://github.com/owner/repo/issues/1#issuecomment-123456789",
)
},
)
@staticmethod
def update_comment(
credentials: GithubCredentials, comment_url: str, body_text: str
) -> tuple[int, str]:
api = get_api(credentials, convert_urls=False)
data = {"body": body_text}
url = convert_comment_url_to_api_endpoint(comment_url)
logger.info(url)
response = api.patch(url, json=data)
comment = response.json()
return comment["id"], comment["html_url"]
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
if (
not input_data.comment_url
and input_data.comment_id
and input_data.issue_url
):
parsed_url = urlparse(input_data.issue_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
input_data.comment_url = f"https://api.github.com/repos/{owner}/{repo}/issues/comments/{input_data.comment_id}"
elif (
not input_data.comment_url
and not input_data.comment_id
and input_data.issue_url
):
raise ValueError(
"Must provide either comment_url or comment_id and issue_url"
)
id, url = self.update_comment(
credentials,
input_data.comment_url,
input_data.comment,
)
yield "id", id
yield "url", url
class GithubListCommentsBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")
issue_url: str = SchemaField(
description="URL of the GitHub issue or pull request",
placeholder="https://github.com/owner/repo/issues/1",
)
class Output(BlockSchema):
class CommentItem(TypedDict):
id: int
body: str
user: str
url: str
comment: CommentItem = SchemaField(
title="Comment", description="Comments with their ID, body, user, and URL"
)
comments: list[CommentItem] = SchemaField(
description="List of comments with their ID, body, user, and URL"
)
error: str = SchemaField(description="Error message if listing comments failed")
def __init__(self):
super().__init__(
id="c4b5fb63-0005-4a11-b35a-0c2467bd6b59",
description="This block lists all comments for a specified GitHub issue or pull request.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubListCommentsBlock.Input,
output_schema=GithubListCommentsBlock.Output,
test_input={
"issue_url": "https://github.com/owner/repo/issues/1",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"comment",
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
},
),
(
"comments",
[
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
}
],
),
],
test_mock={
"list_comments": lambda *args, **kwargs: [
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
}
]
},
)
@staticmethod
def list_comments(
credentials: GithubCredentials, issue_url: str
) -> list[Output.CommentItem]:
parsed_url = urlparse(issue_url)
path_parts = parsed_url.path.strip("/").split("/")
owner = path_parts[0]
repo = path_parts[1]
# GitHub API uses 'issues' for both issues and pull requests when it comes to comments
issue_number = path_parts[3] # Whether 'issues/123' or 'pull/123'
# Construct the proper API URL directly
api_url = f"https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}/comments"
# Set convert_urls=False since we're already providing an API URL
api = get_api(credentials, convert_urls=False)
response = api.get(api_url)
comments = response.json()
parsed_comments: list[GithubListCommentsBlock.Output.CommentItem] = [
{
"id": comment["id"],
"body": comment["body"],
"user": comment["user"]["login"],
"url": comment["html_url"],
}
for comment in comments
]
return parsed_comments
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
comments = self.list_comments(
credentials,
input_data.issue_url,
)
yield from (("comment", comment) for comment in comments)
yield "comments", comments
class GithubMakeIssueBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")

View File

@@ -144,7 +144,7 @@ class GithubCreateStatusBlock(Block):
data.description = description
status_url = f"{repo_url}/statuses/{sha}"
response = api.post(status_url, json=data)
response = api.post(status_url, data=data.model_dump_json(exclude_none=True))
result = response.json()
return {

View File

@@ -12,6 +12,7 @@ from backend.data.block import (
BlockWebhookConfig,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from ._auth import (
TEST_CREDENTIALS,
@@ -36,7 +37,7 @@ class GitHubTriggerBase:
placeholder="{owner}/{repo}",
)
# --8<-- [start:example-payload-field]
payload: dict = SchemaField(hidden=True, default={})
payload: dict = SchemaField(hidden=True, default_factory=dict)
# --8<-- [end:example-payload-field]
class Output(BlockSchema):
@@ -123,7 +124,7 @@ class GithubPullRequestTriggerBlock(GitHubTriggerBase, Block):
output_schema=GithubPullRequestTriggerBlock.Output,
# --8<-- [start:example-webhook_config]
webhook_config=BlockWebhookConfig(
provider="github",
provider=ProviderName.GITHUB,
webhook_type=GithubWebhookType.REPO,
resource_format="{repo}",
event_filter_input="events",

View File

@@ -0,0 +1,598 @@
import enum
import uuid
from datetime import datetime, timedelta, timezone
from typing import Literal
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from pydantic import BaseModel
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.settings import AppEnvironment, Settings
from ._auth import (
GOOGLE_OAUTH_IS_CONFIGURED,
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
GoogleCredentials,
GoogleCredentialsField,
GoogleCredentialsInput,
)
class CalendarEvent(BaseModel):
"""Structured representation of a Google Calendar event."""
id: str
title: str
start_time: str
end_time: str
is_all_day: bool
location: str | None
description: str | None
organizer: str | None
attendees: list[str]
has_video_call: bool
video_link: str | None
calendar_link: str
is_recurring: bool
class GoogleCalendarReadEventsBlock(Block):
class Input(BlockSchema):
credentials: GoogleCredentialsInput = GoogleCredentialsField(
["https://www.googleapis.com/auth/calendar.readonly"]
)
calendar_id: str = SchemaField(
description="Calendar ID (use 'primary' for your main calendar)",
default="primary",
)
max_events: int = SchemaField(
description="Maximum number of events to retrieve", default=10
)
start_time: datetime = SchemaField(
description="Retrieve events starting from this time",
default_factory=lambda: datetime.now(tz=timezone.utc),
)
time_range_days: int = SchemaField(
description="Number of days to look ahead for events", default=30
)
search_term: str | None = SchemaField(
description="Optional search term to filter events by", default=None
)
page_token: str | None = SchemaField(
description="Page token from previous request to get the next batch of events. You can use this if you have lots of events you want to process in a loop",
default=None,
)
include_declined_events: bool = SchemaField(
description="Include events you've declined", default=False
)
class Output(BlockSchema):
events: list[CalendarEvent] = SchemaField(
description="List of calendar events in the requested time range",
default_factory=list,
)
event: CalendarEvent = SchemaField(
description="One of the calendar events in the requested time range"
)
next_page_token: str | None = SchemaField(
description="Token for retrieving the next page of events if more exist",
default=None,
)
error: str = SchemaField(
description="Error message if the request failed",
)
def __init__(self):
settings = Settings()
# Create realistic test data for events
test_now = datetime.now(tz=timezone.utc)
test_tomorrow = test_now + timedelta(days=1)
test_event_dict = {
"id": "event1id",
"title": "Team Meeting",
"start_time": test_tomorrow.strftime("%Y-%m-%d %H:%M"),
"end_time": (test_tomorrow + timedelta(hours=1)).strftime("%Y-%m-%d %H:%M"),
"is_all_day": False,
"location": "Conference Room A",
"description": "Weekly team sync",
"organizer": "manager@example.com",
"attendees": ["colleague1@example.com", "colleague2@example.com"],
"has_video_call": True,
"video_link": "https://meet.google.com/abc-defg-hij",
"calendar_link": "https://calendar.google.com/calendar/event?eid=event1id",
"is_recurring": True,
}
super().__init__(
id="80bc3ed1-e9a4-449e-8163-a8fc86f74f6a",
description="Retrieves upcoming events from a Google Calendar with filtering options",
categories={BlockCategory.PRODUCTIVITY, BlockCategory.DATA},
input_schema=GoogleCalendarReadEventsBlock.Input,
output_schema=GoogleCalendarReadEventsBlock.Output,
disabled=not GOOGLE_OAUTH_IS_CONFIGURED
or settings.config.app_env == AppEnvironment.PRODUCTION,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"calendar_id": "primary",
"max_events": 5,
"start_time": test_now.isoformat(),
"time_range_days": 7,
"search_term": None,
"include_declined_events": False,
"page_token": None,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("event", test_event_dict),
("events", [test_event_dict]),
],
test_mock={
"_read_calendar": lambda *args, **kwargs: {
"items": [
{
"id": "event1id",
"summary": "Team Meeting",
"start": {
"dateTime": test_tomorrow.isoformat(),
"timeZone": "UTC",
},
"end": {
"dateTime": (
test_tomorrow + timedelta(hours=1)
).isoformat(),
"timeZone": "UTC",
},
"location": "Conference Room A",
"description": "Weekly team sync",
"organizer": {"email": "manager@example.com"},
"attendees": [
{"email": "colleague1@example.com"},
{"email": "colleague2@example.com"},
],
"conferenceData": {
"conferenceUrl": "https://meet.google.com/abc-defg-hij"
},
"htmlLink": "https://calendar.google.com/calendar/event?eid=event1id",
"recurrence": ["RRULE:FREQ=WEEKLY;COUNT=10"],
}
],
"nextPageToken": None,
},
"_format_events": lambda *args, **kwargs: [test_event_dict],
},
)
def run(
self, input_data: Input, *, credentials: GoogleCredentials, **kwargs
) -> BlockOutput:
try:
service = self._build_service(credentials, **kwargs)
# Calculate end time based on start time and time range
end_time = input_data.start_time + timedelta(
days=input_data.time_range_days
)
# Call Google Calendar API
result = self._read_calendar(
service=service,
calendarId=input_data.calendar_id,
time_min=input_data.start_time.isoformat(),
time_max=end_time.isoformat(),
max_results=input_data.max_events,
single_events=True,
search_term=input_data.search_term,
show_deleted=False,
show_hidden=input_data.include_declined_events,
page_token=input_data.page_token,
)
# Format events into a user-friendly structure
formatted_events = self._format_events(result.get("items", []))
# Include next page token if available
if next_page_token := result.get("nextPageToken"):
yield "next_page_token", next_page_token
for event in formatted_events:
yield "event", event
yield "events", formatted_events
except Exception as e:
yield "error", str(e)
@staticmethod
def _build_service(credentials: GoogleCredentials, **kwargs):
creds = Credentials(
token=(
credentials.access_token.get_secret_value()
if credentials.access_token
else None
),
refresh_token=(
credentials.refresh_token.get_secret_value()
if credentials.refresh_token
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("calendar", "v3", credentials=creds)
def _read_calendar(
self,
service,
calendarId: str,
time_min: str,
time_max: str,
max_results: int,
single_events: bool,
search_term: str | None = None,
show_deleted: bool = False,
show_hidden: bool = False,
page_token: str | None = None,
) -> dict:
"""Read calendar events with optional filtering."""
calendar = service.events()
# Build query parameters
params = {
"calendarId": calendarId,
"timeMin": time_min,
"timeMax": time_max,
"maxResults": max_results,
"singleEvents": single_events,
"orderBy": "startTime",
"showDeleted": show_deleted,
"showHiddenInvitations": show_hidden,
**({"pageToken": page_token} if page_token else {}),
}
# Add search term if provided
if search_term:
params["q"] = search_term
result = calendar.list(**params).execute()
return result
def _format_events(self, events: list[dict]) -> list[CalendarEvent]:
"""Format Google Calendar API events into user-friendly structure."""
formatted_events = []
for event in events:
# Determine if all-day event
is_all_day = "date" in event.get("start", {})
# Format start and end times
if is_all_day:
start_time = event.get("start", {}).get("date", "")
end_time = event.get("end", {}).get("date", "")
else:
# Convert ISO format to more readable format
start_datetime = datetime.fromisoformat(
event.get("start", {}).get("dateTime", "").replace("Z", "+00:00")
)
end_datetime = datetime.fromisoformat(
event.get("end", {}).get("dateTime", "").replace("Z", "+00:00")
)
start_time = start_datetime.strftime("%Y-%m-%d %H:%M")
end_time = end_datetime.strftime("%Y-%m-%d %H:%M")
# Extract attendees
attendees = []
for attendee in event.get("attendees", []):
if email := attendee.get("email"):
attendees.append(email)
# Check for video call link
has_video_call = False
video_link = None
if conf_data := event.get("conferenceData"):
if conf_url := conf_data.get("conferenceUrl"):
has_video_call = True
video_link = conf_url
elif entry_points := conf_data.get("entryPoints", []):
for entry in entry_points:
if entry.get("entryPointType") == "video":
has_video_call = True
video_link = entry.get("uri")
break
# Create formatted event
formatted_event = CalendarEvent(
id=event.get("id", ""),
title=event.get("summary", "Untitled Event"),
start_time=start_time,
end_time=end_time,
is_all_day=is_all_day,
location=event.get("location"),
description=event.get("description"),
organizer=event.get("organizer", {}).get("email"),
attendees=attendees,
has_video_call=has_video_call,
video_link=video_link,
calendar_link=event.get("htmlLink", ""),
is_recurring=bool(event.get("recurrence")),
)
formatted_events.append(formatted_event)
return formatted_events
class ReminderPreset(enum.Enum):
"""Common reminder times before an event."""
TEN_MINUTES = 10
THIRTY_MINUTES = 30
ONE_HOUR = 60
ONE_DAY = 1440 # 24 hours in minutes
class RecurrenceFrequency(enum.Enum):
"""Frequency options for recurring events."""
DAILY = "DAILY"
WEEKLY = "WEEKLY"
MONTHLY = "MONTHLY"
YEARLY = "YEARLY"
class ExactTiming(BaseModel):
"""Model for specifying start and end times."""
discriminator: Literal["exact_timing"]
start_datetime: datetime
end_datetime: datetime
class DurationTiming(BaseModel):
"""Model for specifying start time and duration."""
discriminator: Literal["duration_timing"]
start_datetime: datetime
duration_minutes: int
class OneTimeEvent(BaseModel):
"""Model for a one-time event."""
discriminator: Literal["one_time"]
class RecurringEvent(BaseModel):
"""Model for a recurring event."""
discriminator: Literal["recurring"]
frequency: RecurrenceFrequency
count: int
class GoogleCalendarCreateEventBlock(Block):
class Input(BlockSchema):
credentials: GoogleCredentialsInput = GoogleCredentialsField(
["https://www.googleapis.com/auth/calendar"]
)
# Event Details
event_title: str = SchemaField(description="Title of the event")
location: str | None = SchemaField(
description="Location of the event", default=None
)
description: str | None = SchemaField(
description="Description of the event", default=None
)
# Timing
timing: ExactTiming | DurationTiming = SchemaField(
discriminator="discriminator",
advanced=False,
description="Specify when the event starts and ends",
default_factory=lambda: DurationTiming(
discriminator="duration_timing",
start_datetime=datetime.now().replace(microsecond=0, second=0, minute=0)
+ timedelta(hours=1),
duration_minutes=60,
),
)
# Calendar selection
calendar_id: str = SchemaField(
description="Calendar ID (use 'primary' for your main calendar)",
default="primary",
)
# Guests
guest_emails: list[str] = SchemaField(
description="Email addresses of guests to invite", default_factory=list
)
send_notifications: bool = SchemaField(
description="Send email notifications to guests", default=True
)
# Extras
add_google_meet: bool = SchemaField(
description="Include a Google Meet video conference link", default=False
)
recurrence: OneTimeEvent | RecurringEvent = SchemaField(
discriminator="discriminator",
description="Whether the event repeats",
default_factory=lambda: OneTimeEvent(discriminator="one_time"),
)
reminder_minutes: list[ReminderPreset] = SchemaField(
description="When to send reminders before the event",
default_factory=lambda: [ReminderPreset.TEN_MINUTES],
)
class Output(BlockSchema):
event_id: str = SchemaField(description="ID of the created event")
event_link: str = SchemaField(
description="Link to view the event in Google Calendar"
)
error: str = SchemaField(description="Error message if event creation failed")
def __init__(self):
settings = Settings()
super().__init__(
id="ed2ec950-fbff-4204-94c0-023fb1d625e0",
description="This block creates a new event in Google Calendar with customizable parameters.",
categories={BlockCategory.PRODUCTIVITY},
input_schema=GoogleCalendarCreateEventBlock.Input,
output_schema=GoogleCalendarCreateEventBlock.Output,
disabled=not GOOGLE_OAUTH_IS_CONFIGURED
or settings.config.app_env == AppEnvironment.PRODUCTION,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"event_title": "Team Meeting",
"location": "Conference Room A",
"description": "Weekly team sync-up",
"calendar_id": "primary",
"guest_emails": ["colleague1@example.com", "colleague2@example.com"],
"add_google_meet": True,
"send_notifications": True,
"reminder_minutes": [
ReminderPreset.TEN_MINUTES.value,
ReminderPreset.ONE_HOUR.value,
],
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("event_id", "abc123event_id"),
("event_link", "https://calendar.google.com/calendar/event?eid=abc123"),
],
test_mock={
"_create_event": lambda *args, **kwargs: {
"id": "abc123event_id",
"htmlLink": "https://calendar.google.com/calendar/event?eid=abc123",
}
},
)
def run(
self, input_data: Input, *, credentials: GoogleCredentials, **kwargs
) -> BlockOutput:
try:
service = self._build_service(credentials, **kwargs)
# Get start and end times based on the timing option
if input_data.timing.discriminator == "exact_timing":
start_datetime = input_data.timing.start_datetime
end_datetime = input_data.timing.end_datetime
else: # duration_timing
start_datetime = input_data.timing.start_datetime
end_datetime = start_datetime + timedelta(
minutes=input_data.timing.duration_minutes
)
# Format datetimes for Google Calendar API
start_time_str = start_datetime.isoformat()
end_time_str = end_datetime.isoformat()
# Build the event body
event_body = {
"summary": input_data.event_title,
"start": {"dateTime": start_time_str},
"end": {"dateTime": end_time_str},
}
# Add optional fields
if input_data.location:
event_body["location"] = input_data.location
if input_data.description:
event_body["description"] = input_data.description
# Add guests
if input_data.guest_emails:
event_body["attendees"] = [
{"email": email} for email in input_data.guest_emails
]
# Add reminders
if input_data.reminder_minutes:
event_body["reminders"] = {
"useDefault": False,
"overrides": [
{"method": "popup", "minutes": reminder.value}
for reminder in input_data.reminder_minutes
],
}
# Add Google Meet
if input_data.add_google_meet:
event_body["conferenceData"] = {
"createRequest": {
"requestId": f"meet-{uuid.uuid4()}",
"conferenceSolutionKey": {"type": "hangoutsMeet"},
}
}
# Add recurrence
if input_data.recurrence.discriminator == "recurring":
rule = f"RRULE:FREQ={input_data.recurrence.frequency.value}"
rule += f";COUNT={input_data.recurrence.count}"
event_body["recurrence"] = [rule]
# Create the event
result = self._create_event(
service=service,
calendar_id=input_data.calendar_id,
event_body=event_body,
send_notifications=input_data.send_notifications,
conference_data_version=1 if input_data.add_google_meet else 0,
)
yield "event_id", result.get("id", "")
yield "event_link", result.get("htmlLink", "")
except Exception as e:
yield "error", str(e)
@staticmethod
def _build_service(credentials: GoogleCredentials, **kwargs):
creds = Credentials(
token=(
credentials.access_token.get_secret_value()
if credentials.access_token
else None
),
refresh_token=(
credentials.refresh_token.get_secret_value()
if credentials.refresh_token
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("calendar", "v3", credentials=creds)
def _create_event(
self,
service,
calendar_id: str,
event_body: dict,
send_notifications: bool = False,
conference_data_version: int = 0,
) -> dict:
"""Create a new event in Google Calendar."""
calendar = service.events()
# Make the API call
result = calendar.insert(
calendarId=calendar_id,
body=event_body,
sendNotifications=send_notifications,
conferenceDataVersion=conference_data_version,
).execute()
return result

View File

@@ -8,6 +8,7 @@ from pydantic import BaseModel
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.settings import Settings
from ._auth import (
GOOGLE_OAUTH_IS_CONFIGURED,
@@ -150,8 +151,8 @@ class GmailReadBlock(Block):
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=kwargs.get("client_id"),
client_secret=kwargs.get("client_secret"),
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("gmail", "v1", credentials=creds)

View File

@@ -3,6 +3,7 @@ from googleapiclient.discovery import build
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.settings import AppEnvironment, Settings
from ._auth import (
GOOGLE_OAUTH_IS_CONFIGURED,
@@ -35,13 +36,15 @@ class GoogleSheetsReadBlock(Block):
)
def __init__(self):
settings = Settings()
super().__init__(
id="5724e902-3635-47e9-a108-aaa0263a4988",
description="This block reads data from a Google Sheets spreadsheet.",
categories={BlockCategory.DATA},
input_schema=GoogleSheetsReadBlock.Input,
output_schema=GoogleSheetsReadBlock.Output,
disabled=not GOOGLE_OAUTH_IS_CONFIGURED,
disabled=not GOOGLE_OAUTH_IS_CONFIGURED
or settings.config.app_env == AppEnvironment.PRODUCTION,
test_input={
"spreadsheet_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Sheet1!A1:B2",
@@ -86,8 +89,8 @@ class GoogleSheetsReadBlock(Block):
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=kwargs.get("client_id"),
client_secret=kwargs.get("client_secret"),
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("sheets", "v4", credentials=creds)

View File

@@ -1,11 +1,16 @@
import json
import logging
from enum import Enum
from typing import Any
from requests.exceptions import HTTPError, RequestException
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.request import requests
logger = logging.getLogger(name=__name__)
class HttpMethod(Enum):
GET = "GET"
@@ -29,7 +34,7 @@ class SendWebRequestBlock(Block):
)
headers: dict[str, str] = SchemaField(
description="The headers to include in the request",
default={},
default_factory=dict,
)
json_format: bool = SchemaField(
title="JSON format",
@@ -43,8 +48,9 @@ class SendWebRequestBlock(Block):
class Output(BlockSchema):
response: object = SchemaField(description="The response from the server")
client_error: object = SchemaField(description="The error on 4xx status codes")
server_error: object = SchemaField(description="The error on 5xx status codes")
client_error: object = SchemaField(description="Errors on 4xx status codes")
server_error: object = SchemaField(description="Errors on 5xx status codes")
error: str = SchemaField(description="Errors for all other exceptions")
def __init__(self):
super().__init__(
@@ -68,20 +74,48 @@ class SendWebRequestBlock(Block):
# we should send it as plain text instead
input_data.json_format = False
response = requests.request(
input_data.method.value,
input_data.url,
headers=input_data.headers,
json=body if input_data.json_format else None,
data=body if not input_data.json_format else None,
)
result = response.json() if input_data.json_format else response.text
try:
response = requests.request(
input_data.method.value,
input_data.url,
headers=input_data.headers,
json=body if input_data.json_format else None,
data=body if not input_data.json_format else None,
)
if input_data.json_format:
if response.status_code == 204 or not response.content.strip():
result = None
else:
result = response.json()
else:
result = response.text
if response.status_code // 100 == 2:
yield "response", result
elif response.status_code // 100 == 4:
yield "client_error", result
elif response.status_code // 100 == 5:
yield "server_error", result
else:
raise ValueError(f"Unexpected status code: {response.status_code}")
except HTTPError as e:
# Handle error responses
try:
result = e.response.json() if input_data.json_format else str(e)
except json.JSONDecodeError:
result = str(e)
if 400 <= e.response.status_code < 500:
yield "client_error", result
elif 500 <= e.response.status_code < 600:
yield "server_error", result
else:
error_msg = (
"Unexpected status code "
f"{e.response.status_code} '{e.response.reason}'"
)
logger.warning(error_msg)
yield "error", error_msg
except RequestException as e:
# Handle other request-related exceptions
yield "error", str(e)
except Exception as e:
# Catch any other unexpected exceptions
yield "error", str(e)

View File

@@ -15,7 +15,8 @@ class HubSpotCompanyBlock(Block):
description="Operation to perform (create, update, get)", default="get"
)
company_data: dict = SchemaField(
description="Company data for create/update operations", default={}
description="Company data for create/update operations",
default_factory=dict,
)
domain: str = SchemaField(
description="Company domain for get/update operations", default=""

View File

@@ -15,7 +15,8 @@ class HubSpotContactBlock(Block):
description="Operation to perform (create, update, get)", default="get"
)
contact_data: dict = SchemaField(
description="Contact data for create/update operations", default={}
description="Contact data for create/update operations",
default_factory=dict,
)
email: str = SchemaField(
description="Email address for get/update operations", default=""

View File

@@ -19,7 +19,7 @@ class HubSpotEngagementBlock(Block):
)
email_data: dict = SchemaField(
description="Email data including recipient, subject, content",
default={},
default_factory=dict,
)
contact_id: str = SchemaField(
description="Contact ID for engagement tracking", default=""
@@ -27,7 +27,6 @@ class HubSpotEngagementBlock(Block):
timeframe_days: int = SchemaField(
description="Number of days to look back for engagement",
default=30,
optional=True,
)
class Output(BlockSchema):

View File

@@ -142,6 +142,16 @@ class IdeogramModelBlock(Block):
title="Color Palette Preset",
advanced=True,
)
custom_color_palette: Optional[list[str]] = SchemaField(
description=(
"Only available for model version V_2 or V_2_TURBO. Provide one or more color hex codes "
"(e.g., ['#000030', '#1C0C47', '#9900FF', '#4285F4', '#FFFFFF']) to define a custom color "
"palette. Only used if 'color_palette_name' is 'NONE'."
),
default=None,
title="Custom Color Palette",
advanced=True,
)
class Output(BlockSchema):
result: str = SchemaField(description="Generated image URL")
@@ -164,6 +174,13 @@ class IdeogramModelBlock(Block):
"style_type": StyleType.AUTO,
"negative_prompt": None,
"color_palette_name": ColorPalettePreset.NONE,
"custom_color_palette": [
"#000030",
"#1C0C47",
"#9900FF",
"#4285F4",
"#FFFFFF",
],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
@@ -173,7 +190,7 @@ class IdeogramModelBlock(Block):
),
],
test_mock={
"run_model": lambda api_key, model_name, prompt, seed, aspect_ratio, magic_prompt_option, style_type, negative_prompt, color_palette_name: "https://ideogram.ai/api/images/test-generated-image-url.png",
"run_model": lambda api_key, model_name, prompt, seed, aspect_ratio, magic_prompt_option, style_type, negative_prompt, color_palette_name, custom_colors: "https://ideogram.ai/api/images/test-generated-image-url.png",
"upscale_image": lambda api_key, image_url: "https://ideogram.ai/api/images/test-upscaled-image-url.png",
},
test_credentials=TEST_CREDENTIALS,
@@ -195,6 +212,7 @@ class IdeogramModelBlock(Block):
style_type=input_data.style_type.value,
negative_prompt=input_data.negative_prompt,
color_palette_name=input_data.color_palette_name.value,
custom_colors=input_data.custom_color_palette,
)
# Step 2: Upscale the image if requested
@@ -217,6 +235,7 @@ class IdeogramModelBlock(Block):
style_type: str,
negative_prompt: Optional[str],
color_palette_name: str,
custom_colors: Optional[list[str]],
):
url = "https://api.ideogram.ai/generate"
headers = {
@@ -241,7 +260,11 @@ class IdeogramModelBlock(Block):
data["image_request"]["negative_prompt"] = negative_prompt
if color_palette_name != "NONE":
data["image_request"]["color_palette"] = {"name": color_palette_name}
data["color_palette"] = {"name": color_palette_name}
elif custom_colors:
data["color_palette"] = {
"members": [{"color_hex": color} for color in custom_colors]
}
try:
response = requests.post(url, json=data, headers=headers)
@@ -267,9 +290,7 @@ class IdeogramModelBlock(Block):
response = requests.post(
url,
headers=headers,
data={
"image_request": "{}", # Empty JSON object
},
data={"image_request": "{}"},
files=files,
)

View File

@@ -0,0 +1,556 @@
import copy
from datetime import date, time
from typing import Any, Optional
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema, BlockType
from backend.data.model import SchemaField
from backend.util.file import store_media_file
from backend.util.mock import MockObject
from backend.util.settings import Config
from backend.util.text import TextFormatter
from backend.util.type import LongTextType, MediaFileType, ShortTextType
formatter = TextFormatter()
config = Config()
class AgentInputBlock(Block):
"""
This block is used to provide input to the graph.
It takes in a value, name, description, default values list and bool to limit selection to default values.
It Outputs the value passed as input.
"""
class Input(BlockSchema):
name: str = SchemaField(description="The name of the input.")
value: Any = SchemaField(
description="The value to be passed as input.",
default=None,
)
title: str | None = SchemaField(
description="The title of the input.", default=None, advanced=True
)
description: str | None = SchemaField(
description="The description of the input.",
default=None,
advanced=True,
)
placeholder_values: list = SchemaField(
description="The placeholder values to be passed as input.",
default_factory=list,
advanced=True,
hidden=True,
)
advanced: bool = SchemaField(
description="Whether to show the input in the advanced section, if the field is not required.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the input should be treated as a secret.",
default=False,
advanced=True,
)
def generate_schema(self):
schema = copy.deepcopy(self.get_field_schema("value"))
if possible_values := self.placeholder_values:
schema["enum"] = possible_values
return schema
class Output(BlockSchema):
result: Any = SchemaField(description="The value passed as input.")
def __init__(self, **kwargs):
super().__init__(
**{
"id": "c0a8e994-ebf1-4a9c-a4d8-89d09c86741b",
"description": "Base block for user inputs.",
"input_schema": AgentInputBlock.Input,
"output_schema": AgentInputBlock.Output,
"test_input": [
{
"value": "Hello, World!",
"name": "input_1",
"description": "Example test input.",
"placeholder_values": [],
},
{
"value": "Hello, World!",
"name": "input_2",
"description": "Example test input with placeholders.",
"placeholder_values": ["Hello, World!"],
},
],
"test_output": [
("result", "Hello, World!"),
("result", "Hello, World!"),
],
"categories": {BlockCategory.INPUT, BlockCategory.BASIC},
"block_type": BlockType.INPUT,
"static_output": True,
**kwargs,
}
)
def run(self, input_data: Input, *args, **kwargs) -> BlockOutput:
if input_data.value is not None:
yield "result", input_data.value
class AgentOutputBlock(Block):
"""
Records the output of the graph for users to see.
Behavior:
If `format` is provided and the `value` is of a type that can be formatted,
the block attempts to format the recorded_value using the `format`.
If formatting fails or no `format` is provided, the raw `value` is output.
"""
class Input(BlockSchema):
value: Any = SchemaField(
description="The value to be recorded as output.",
default=None,
advanced=False,
)
name: str = SchemaField(description="The name of the output.")
title: str | None = SchemaField(
description="The title of the output.",
default=None,
advanced=True,
)
description: str | None = SchemaField(
description="The description of the output.",
default=None,
advanced=True,
)
format: str = SchemaField(
description="The format string to be used to format the recorded_value. Use Jinja2 syntax.",
default="",
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to treat the output as advanced.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the output should be treated as a secret.",
default=False,
advanced=True,
)
def generate_schema(self):
return self.get_field_schema("value")
class Output(BlockSchema):
output: Any = SchemaField(description="The value recorded as output.")
name: Any = SchemaField(description="The name of the value recorded as output.")
def __init__(self):
super().__init__(
id="363ae599-353e-4804-937e-b2ee3cef3da4",
description="Stores the output of the graph for users to see.",
input_schema=AgentOutputBlock.Input,
output_schema=AgentOutputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "output_1",
"description": "This is a test output.",
"format": "{{ output_1 }}!!",
},
{
"value": "42",
"name": "output_2",
"description": "This is another test output.",
"format": "{{ output_2 }}",
},
{
"value": MockObject(value="!!", key="key"),
"name": "output_3",
"description": "This is a test output with a mock object.",
"format": "{{ output_3 }}",
},
],
test_output=[
("output", "Hello, World!!!"),
("output", "42"),
("output", MockObject(value="!!", key="key")),
],
categories={BlockCategory.OUTPUT, BlockCategory.BASIC},
block_type=BlockType.OUTPUT,
static_output=True,
)
def run(self, input_data: Input, *args, **kwargs) -> BlockOutput:
"""
Attempts to format the recorded_value using the fmt_string if provided.
If formatting fails or no fmt_string is given, returns the original recorded_value.
"""
if input_data.format:
try:
yield "output", formatter.format_string(
input_data.format, {input_data.name: input_data.value}
)
except Exception as e:
yield "output", f"Error: {e}, {input_data.value}"
else:
yield "output", input_data.value
yield "name", input_data.name
class AgentShortTextInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[ShortTextType] = SchemaField(
description="Short text input.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Short text result.")
def __init__(self):
super().__init__(
id="7fcd3bcb-8e1b-4e69-903d-32d3d4a92158",
description="Block for short text input (single-line).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentShortTextInputBlock.Input,
output_schema=AgentShortTextInputBlock.Output,
test_input=[
{
"value": "Hello",
"name": "short_text_1",
"description": "Short text example 1",
"placeholder_values": [],
},
{
"value": "Quick test",
"name": "short_text_2",
"description": "Short text example 2",
"placeholder_values": ["Quick test", "Another option"],
},
],
test_output=[
("result", "Hello"),
("result", "Quick test"),
],
)
class AgentLongTextInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[LongTextType] = SchemaField(
description="Long text input (potentially multi-line).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Long text result.")
def __init__(self):
super().__init__(
id="90a56ffb-7024-4b2b-ab50-e26c5e5ab8ba",
description="Block for long text input (multi-line).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentLongTextInputBlock.Input,
output_schema=AgentLongTextInputBlock.Output,
test_input=[
{
"value": "Lorem ipsum dolor sit amet...",
"name": "long_text_1",
"description": "Long text example 1",
"placeholder_values": [],
},
{
"value": "Another multiline text input.",
"name": "long_text_2",
"description": "Long text example 2",
"placeholder_values": ["Another multiline text input."],
},
],
test_output=[
("result", "Lorem ipsum dolor sit amet..."),
("result", "Another multiline text input."),
],
)
class AgentNumberInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[int] = SchemaField(
description="Number input.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: int = SchemaField(description="Number result.")
def __init__(self):
super().__init__(
id="96dae2bb-97a2-41c2-bd2f-13a3b5a8ea98",
description="Block for number input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentNumberInputBlock.Input,
output_schema=AgentNumberInputBlock.Output,
test_input=[
{
"value": 42,
"name": "number_input_1",
"description": "Number example 1",
"placeholder_values": [],
},
{
"value": 314,
"name": "number_input_2",
"description": "Number example 2",
"placeholder_values": [314, 2718],
},
],
test_output=[
("result", 42),
("result", 314),
],
)
class AgentDateInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[date] = SchemaField(
description="Date input (YYYY-MM-DD).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: date = SchemaField(description="Date result.")
def __init__(self):
super().__init__(
id="7e198b09-4994-47db-8b4d-952d98241817",
description="Block for date input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentDateInputBlock.Input,
output_schema=AgentDateInputBlock.Output,
test_input=[
{
# If your system can parse JSON date strings to date objects
"value": str(date(2025, 3, 19)),
"name": "date_input_1",
"description": "Example date input 1",
},
{
"value": str(date(2023, 12, 31)),
"name": "date_input_2",
"description": "Example date input 2",
},
],
test_output=[
("result", date(2025, 3, 19)),
("result", date(2023, 12, 31)),
],
)
class AgentTimeInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[time] = SchemaField(
description="Time input (HH:MM:SS).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: time = SchemaField(description="Time result.")
def __init__(self):
super().__init__(
id="2a1c757e-86cf-4c7e-aacf-060dc382e434",
description="Block for time input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentTimeInputBlock.Input,
output_schema=AgentTimeInputBlock.Output,
test_input=[
{
"value": str(time(9, 30, 0)),
"name": "time_input_1",
"description": "Time example 1",
},
{
"value": str(time(23, 59, 59)),
"name": "time_input_2",
"description": "Time example 2",
},
],
test_output=[
("result", time(9, 30, 0)),
("result", time(23, 59, 59)),
],
)
class AgentFileInputBlock(AgentInputBlock):
"""
A simplified file-upload block. In real usage, you might have a custom
file type or handle binary data. Here, we'll store a string path as the example.
"""
class Input(AgentInputBlock.Input):
value: Optional[MediaFileType] = SchemaField(
description="Path or reference to an uploaded file.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="File reference/path result.")
def __init__(self):
super().__init__(
id="95ead23f-8283-4654-aef3-10c053b74a31",
description="Block for file upload input (string path for example).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentFileInputBlock.Input,
output_schema=AgentFileInputBlock.Output,
test_input=[
{
"value": "data:image/png;base64,MQ==",
"name": "file_upload_1",
"description": "Example file upload 1",
},
],
test_output=[
("result", str),
],
)
def run(
self,
input_data: Input,
*,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
if not input_data.value:
return
file_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.value,
return_content=False,
)
yield "result", file_path
class AgentDropdownInputBlock(AgentInputBlock):
"""
A specialized text input block that relies on placeholder_values to present a dropdown.
"""
class Input(AgentInputBlock.Input):
value: Optional[str] = SchemaField(
description="Text selected from a dropdown.",
default=None,
advanced=False,
title="Default Value",
)
placeholder_values: list = SchemaField(
description="Possible values for the dropdown.",
default_factory=list,
advanced=False,
title="Dropdown Options",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Selected dropdown value.")
def __init__(self):
super().__init__(
id="655d6fdf-a334-421c-b733-520549c07cd1",
description="Block for dropdown text selection.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentDropdownInputBlock.Input,
output_schema=AgentDropdownInputBlock.Output,
test_input=[
{
"value": "Option A",
"name": "dropdown_1",
"placeholder_values": ["Option A", "Option B", "Option C"],
"description": "Dropdown example 1",
},
{
"value": "Option C",
"name": "dropdown_2",
"placeholder_values": ["Option A", "Option B", "Option C"],
"description": "Dropdown example 2",
},
],
test_output=[
("result", "Option A"),
("result", "Option C"),
],
)
class AgentToggleInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: bool = SchemaField(
description="Boolean toggle input.",
default=False,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: bool = SchemaField(description="Boolean toggle result.")
def __init__(self):
super().__init__(
id="cbf36ab5-df4a-43b6-8a7f-f7ed8652116e",
description="Block for boolean toggle input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentToggleInputBlock.Input,
output_schema=AgentToggleInputBlock.Output,
test_input=[
{
"value": True,
"name": "toggle_1",
"description": "Toggle example 1",
},
{
"value": False,
"name": "toggle_2",
"description": "Toggle example 2",
},
],
test_output=[
("result", True),
("result", False),
],
)
IO_BLOCK_IDs = [
AgentInputBlock().id,
AgentOutputBlock().id,
AgentShortTextInputBlock().id,
AgentLongTextInputBlock().id,
AgentNumberInputBlock().id,
AgentDateInputBlock().id,
AgentTimeInputBlock().id,
AgentFileInputBlock().id,
AgentDropdownInputBlock().id,
AgentToggleInputBlock().id,
]

View File

@@ -11,13 +11,13 @@ class StepThroughItemsBlock(Block):
advanced=False,
description="The list or dictionary of items to iterate over",
placeholder="[1, 2, 3, 4, 5] or {'key1': 'value1', 'key2': 'value2'}",
default=[],
default_factory=list,
)
items_object: dict = SchemaField(
advanced=False,
description="The list or dictionary of items to iterate over",
placeholder="[1, 2, 3, 4, 5] or {'key1': 'value1', 'key2': 'value2'}",
default={},
default_factory=dict,
)
items_str: str = SchemaField(
advanced=False,

View File

@@ -23,7 +23,7 @@ class JinaChunkingBlock(Block):
class Output(BlockSchema):
chunks: list = SchemaField(description="List of chunked texts")
tokens: list = SchemaField(
description="List of token information for each chunk", optional=True
description="List of token information for each chunk",
)
def __init__(self):

View File

@@ -1,4 +1,4 @@
from groq._utils._utils import quote
from urllib.parse import quote
from backend.blocks.jina._auth import (
TEST_CREDENTIALS,

View File

@@ -28,8 +28,8 @@ class LinearCreateIssueBlock(Block):
priority: int | None = SchemaField(
description="Priority of the issue",
default=None,
minimum=0,
maximum=4,
ge=0,
le=4,
)
project_name: str | None = SchemaField(
description="Name of the project to create the issue on",

View File

@@ -4,32 +4,30 @@ from abc import ABC
from enum import Enum, EnumMeta
from json import JSONDecodeError
from types import MappingProxyType
from typing import TYPE_CHECKING, Any, List, Literal, NamedTuple
from pydantic import SecretStr
from backend.integrations.providers import ProviderName
if TYPE_CHECKING:
from enum import _EnumMemberT
from typing import Any, Iterable, List, Literal, NamedTuple, Optional
import anthropic
import ollama
import openai
from anthropic.types import ToolParam
from groq import Groq
from pydantic import BaseModel, SecretStr
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import (
APIKeyCredentials,
CredentialsField,
CredentialsMetaInput,
NodeExecutionStats,
SchemaField,
)
from backend.integrations.providers import ProviderName
from backend.util import json
from backend.util.logging import TruncatedLogger
from backend.util.settings import BehaveAs, Settings
from backend.util.text import TextFormatter
logger = logging.getLogger(__name__)
logger = TruncatedLogger(logging.getLogger(__name__), "[LLM-Block]")
fmt = TextFormatter()
LLMProviderName = Literal[
@@ -38,6 +36,7 @@ LLMProviderName = Literal[
ProviderName.OLLAMA,
ProviderName.OPENAI,
ProviderName.OPEN_ROUTER,
ProviderName.LLAMA_API,
]
AICredentials = CredentialsMetaInput[LLMProviderName, Literal["api_key"]]
@@ -74,12 +73,10 @@ class ModelMetadata(NamedTuple):
class LlmModelMeta(EnumMeta):
@property
def __members__(
self: type["_EnumMemberT"],
) -> MappingProxyType[str, "_EnumMemberT"]:
def __members__(self) -> MappingProxyType:
if Settings().config.behave_as == BehaveAs.LOCAL:
members = super().__members__
return members
return MappingProxyType(members)
else:
removed_providers = ["ollama"]
existing_members = super().__members__
@@ -94,14 +91,17 @@ class LlmModelMeta(EnumMeta):
class LlmModel(str, Enum, metaclass=LlmModelMeta):
# OpenAI models
O3_MINI = "o3-mini"
O3 = "o3-2025-04-16"
O1 = "o1"
O1_PREVIEW = "o1-preview"
O1_MINI = "o1-mini"
GPT41 = "gpt-4.1-2025-04-14"
GPT4O_MINI = "gpt-4o-mini"
GPT4O = "gpt-4o"
GPT4_TURBO = "gpt-4-turbo"
GPT3_5_TURBO = "gpt-3.5-turbo"
# Anthropic models
CLAUDE_3_7_SONNET = "claude-3-7-sonnet-20250219"
CLAUDE_3_5_SONNET = "claude-3-5-sonnet-latest"
CLAUDE_3_5_HAIKU = "claude-3-5-haiku-latest"
CLAUDE_3_HAIKU = "claude-3-haiku-20240307"
@@ -122,6 +122,7 @@ class LlmModel(str, Enum, metaclass=LlmModelMeta):
OLLAMA_DOLPHIN = "dolphin-mistral:latest"
# OpenRouter models
GEMINI_FLASH_1_5 = "google/gemini-flash-1.5"
GEMINI_2_5_PRO = "google/gemini-2.5-pro-preview-03-25"
GROK_BETA = "x-ai/grok-beta"
MISTRAL_NEMO = "mistralai/mistral-nemo"
COHERE_COMMAND_R_08_2024 = "cohere/command-r-08-2024"
@@ -139,6 +140,13 @@ class LlmModel(str, Enum, metaclass=LlmModelMeta):
AMAZON_NOVA_PRO_V1 = "amazon/nova-pro-v1"
MICROSOFT_WIZARDLM_2_8X22B = "microsoft/wizardlm-2-8x22b"
GRYPHE_MYTHOMAX_L2_13B = "gryphe/mythomax-l2-13b"
META_LLAMA_4_SCOUT = "meta-llama/llama-4-scout"
META_LLAMA_4_MAVERICK = "meta-llama/llama-4-maverick"
# Llama API models
LLAMA_API_LLAMA_4_SCOUT = "Llama-4-Scout-17B-16E-Instruct-FP8"
LLAMA_API_LLAMA4_MAVERICK = "Llama-4-Maverick-17B-128E-Instruct-FP8"
LLAMA_API_LLAMA3_3_8B = "Llama-3.3-8B-Instruct"
LLAMA_API_LLAMA3_3_70B = "Llama-3.3-70B-Instruct"
@property
def metadata(self) -> ModelMetadata:
@@ -159,12 +167,14 @@ class LlmModel(str, Enum, metaclass=LlmModelMeta):
MODEL_METADATA = {
# https://platform.openai.com/docs/models
LlmModel.O3: ModelMetadata("openai", 200000, 100000),
LlmModel.O3_MINI: ModelMetadata("openai", 200000, 100000), # o3-mini-2025-01-31
LlmModel.O1: ModelMetadata("openai", 200000, 100000), # o1-2024-12-17
LlmModel.O1_PREVIEW: ModelMetadata(
"openai", 128000, 32768
), # o1-preview-2024-09-12
LlmModel.O1_MINI: ModelMetadata("openai", 128000, 65536), # o1-mini-2024-09-12
LlmModel.GPT41: ModelMetadata("openai", 1047576, 32768),
LlmModel.GPT4O_MINI: ModelMetadata(
"openai", 128000, 16384
), # gpt-4o-mini-2024-07-18
@@ -174,6 +184,9 @@ MODEL_METADATA = {
), # gpt-4-turbo-2024-04-09
LlmModel.GPT3_5_TURBO: ModelMetadata("openai", 16385, 4096), # gpt-3.5-turbo-0125
# https://docs.anthropic.com/en/docs/about-claude/models
LlmModel.CLAUDE_3_7_SONNET: ModelMetadata(
"anthropic", 200000, 8192
), # claude-3-7-sonnet-20250219
LlmModel.CLAUDE_3_5_SONNET: ModelMetadata(
"anthropic", 200000, 8192
), # claude-3-5-sonnet-20241022
@@ -199,6 +212,7 @@ MODEL_METADATA = {
LlmModel.OLLAMA_DOLPHIN: ModelMetadata("ollama", 32768, None),
# https://openrouter.ai/models
LlmModel.GEMINI_FLASH_1_5: ModelMetadata("open_router", 1000000, 8192),
LlmModel.GEMINI_2_5_PRO: ModelMetadata("open_router", 1050000, 8192),
LlmModel.GROK_BETA: ModelMetadata("open_router", 131072, 131072),
LlmModel.MISTRAL_NEMO: ModelMetadata("open_router", 128000, 4096),
LlmModel.COHERE_COMMAND_R_08_2024: ModelMetadata("open_router", 128000, 4096),
@@ -220,6 +234,13 @@ MODEL_METADATA = {
LlmModel.AMAZON_NOVA_PRO_V1: ModelMetadata("open_router", 300000, 5120),
LlmModel.MICROSOFT_WIZARDLM_2_8X22B: ModelMetadata("open_router", 65536, 4096),
LlmModel.GRYPHE_MYTHOMAX_L2_13B: ModelMetadata("open_router", 4096, 4096),
LlmModel.META_LLAMA_4_SCOUT: ModelMetadata("open_router", 131072, 131072),
LlmModel.META_LLAMA_4_MAVERICK: ModelMetadata("open_router", 1048576, 1000000),
# Llama API models
LlmModel.LLAMA_API_LLAMA_4_SCOUT: ModelMetadata("llama_api", 128000, 4028),
LlmModel.LLAMA_API_LLAMA4_MAVERICK: ModelMetadata("llama_api", 128000, 4028),
LlmModel.LLAMA_API_LLAMA3_3_8B: ModelMetadata("llama_api", 128000, 4028),
LlmModel.LLAMA_API_LLAMA3_3_70B: ModelMetadata("llama_api", 128000, 4028),
}
for model in LlmModel:
@@ -227,21 +248,374 @@ for model in LlmModel:
raise ValueError(f"Missing MODEL_METADATA metadata for model: {model}")
class MessageRole(str, Enum):
SYSTEM = "system"
USER = "user"
ASSISTANT = "assistant"
class ToolCall(BaseModel):
name: str
arguments: str
class Message(BlockSchema):
role: MessageRole
content: str
class ToolContentBlock(BaseModel):
id: str
type: str
function: ToolCall
class LLMResponse(BaseModel):
raw_response: Any
prompt: List[Any]
response: str
tool_calls: Optional[List[ToolContentBlock]] | None
prompt_tokens: int
completion_tokens: int
def convert_openai_tool_fmt_to_anthropic(
openai_tools: list[dict] | None = None,
) -> Iterable[ToolParam] | anthropic.NotGiven:
"""
Convert OpenAI tool format to Anthropic tool format.
"""
if not openai_tools or len(openai_tools) == 0:
return anthropic.NOT_GIVEN
anthropic_tools = []
for tool in openai_tools:
if "function" in tool:
# Handle case where tool is already in OpenAI format with "type" and "function"
function_data = tool["function"]
else:
# Handle case where tool is just the function definition
function_data = tool
anthropic_tool: anthropic.types.ToolParam = {
"name": function_data["name"],
"description": function_data.get("description", ""),
"input_schema": {
"type": "object",
"properties": function_data.get("parameters", {}).get("properties", {}),
"required": function_data.get("parameters", {}).get("required", []),
},
}
anthropic_tools.append(anthropic_tool)
return anthropic_tools
def estimate_token_count(prompt_messages: list[dict]) -> int:
char_count = sum(len(str(msg.get("content", ""))) for msg in prompt_messages)
message_overhead = len(prompt_messages) * 4
estimated_tokens = (char_count // 4) + message_overhead
return int(estimated_tokens * 1.2)
def llm_call(
credentials: APIKeyCredentials,
llm_model: LlmModel,
prompt: list[dict],
json_format: bool,
max_tokens: int | None,
tools: list[dict] | None = None,
ollama_host: str = "localhost:11434",
parallel_tool_calls: bool | None = None,
) -> LLMResponse:
"""
Make a call to a language model.
Args:
credentials: The API key credentials to use.
llm_model: The LLM model to use.
prompt: The prompt to send to the LLM.
json_format: Whether the response should be in JSON format.
max_tokens: The maximum number of tokens to generate in the chat completion.
tools: The tools to use in the chat completion.
ollama_host: The host for ollama to use.
Returns:
LLMResponse object containing:
- prompt: The prompt sent to the LLM.
- response: The text response from the LLM.
- tool_calls: Any tool calls the model made, if applicable.
- prompt_tokens: The number of tokens used in the prompt.
- completion_tokens: The number of tokens used in the completion.
"""
provider = llm_model.metadata.provider
# Calculate available tokens based on context window and input length
estimated_input_tokens = estimate_token_count(prompt)
context_window = llm_model.context_window
model_max_output = llm_model.max_output_tokens or 4096
user_max = max_tokens or model_max_output
available_tokens = max(context_window - estimated_input_tokens, 0)
max_tokens = max(min(available_tokens, model_max_output, user_max), 0)
if provider == "openai":
tools_param = tools if tools else openai.NOT_GIVEN
oai_client = openai.OpenAI(api_key=credentials.api_key.get_secret_value())
response_format = None
if llm_model in [LlmModel.O1_MINI, LlmModel.O1_PREVIEW]:
sys_messages = [p["content"] for p in prompt if p["role"] == "system"]
usr_messages = [p["content"] for p in prompt if p["role"] != "system"]
prompt = [
{"role": "user", "content": "\n".join(sys_messages)},
{"role": "user", "content": "\n".join(usr_messages)},
]
elif json_format:
response_format = {"type": "json_object"}
response = oai_client.chat.completions.create(
model=llm_model.value,
messages=prompt, # type: ignore
response_format=response_format, # type: ignore
max_completion_tokens=max_tokens,
tools=tools_param, # type: ignore
parallel_tool_calls=(
openai.NOT_GIVEN if parallel_tool_calls is None else parallel_tool_calls
),
)
if response.choices[0].message.tool_calls:
tool_calls = [
ToolContentBlock(
id=tool.id,
type=tool.type,
function=ToolCall(
name=tool.function.name,
arguments=tool.function.arguments,
),
)
for tool in response.choices[0].message.tool_calls
]
else:
tool_calls = None
return LLMResponse(
raw_response=response.choices[0].message,
prompt=prompt,
response=response.choices[0].message.content or "",
tool_calls=tool_calls,
prompt_tokens=response.usage.prompt_tokens if response.usage else 0,
completion_tokens=response.usage.completion_tokens if response.usage else 0,
)
elif provider == "anthropic":
an_tools = convert_openai_tool_fmt_to_anthropic(tools)
system_messages = [p["content"] for p in prompt if p["role"] == "system"]
sysprompt = " ".join(system_messages)
messages = []
last_role = None
for p in prompt:
if p["role"] in ["user", "assistant"]:
if (
p["role"] == last_role
and isinstance(messages[-1]["content"], str)
and isinstance(p["content"], str)
):
# If the role is the same as the last one, combine the content
messages[-1]["content"] += p["content"]
else:
messages.append({"role": p["role"], "content": p["content"]})
last_role = p["role"]
client = anthropic.Anthropic(api_key=credentials.api_key.get_secret_value())
try:
resp = client.messages.create(
model=llm_model.value,
system=sysprompt,
messages=messages,
max_tokens=max_tokens,
tools=an_tools,
)
if not resp.content:
raise ValueError("No content returned from Anthropic.")
tool_calls = None
for content_block in resp.content:
# Antropic is different to openai, need to iterate through
# the content blocks to find the tool calls
if content_block.type == "tool_use":
if tool_calls is None:
tool_calls = []
tool_calls.append(
ToolContentBlock(
id=content_block.id,
type=content_block.type,
function=ToolCall(
name=content_block.name,
arguments=json.dumps(content_block.input),
),
)
)
if not tool_calls and resp.stop_reason == "tool_use":
logger.warning(
f"Tool use stop reason but no tool calls found in content. {resp}"
)
return LLMResponse(
raw_response=resp,
prompt=prompt,
response=(
resp.content[0].name
if isinstance(resp.content[0], anthropic.types.ToolUseBlock)
else getattr(resp.content[0], "text", "")
),
tool_calls=tool_calls,
prompt_tokens=resp.usage.input_tokens,
completion_tokens=resp.usage.output_tokens,
)
except anthropic.APIError as e:
error_message = f"Anthropic API error: {str(e)}"
logger.error(error_message)
raise ValueError(error_message)
elif provider == "groq":
if tools:
raise ValueError("Groq does not support tools.")
client = Groq(api_key=credentials.api_key.get_secret_value())
response_format = {"type": "json_object"} if json_format else None
response = client.chat.completions.create(
model=llm_model.value,
messages=prompt, # type: ignore
response_format=response_format, # type: ignore
max_tokens=max_tokens,
)
return LLMResponse(
raw_response=response.choices[0].message,
prompt=prompt,
response=response.choices[0].message.content or "",
tool_calls=None,
prompt_tokens=response.usage.prompt_tokens if response.usage else 0,
completion_tokens=response.usage.completion_tokens if response.usage else 0,
)
elif provider == "ollama":
if tools:
raise ValueError("Ollama does not support tools.")
client = ollama.Client(host=ollama_host)
sys_messages = [p["content"] for p in prompt if p["role"] == "system"]
usr_messages = [p["content"] for p in prompt if p["role"] != "system"]
response = client.generate(
model=llm_model.value,
prompt=f"{sys_messages}\n\n{usr_messages}",
stream=False,
options={"num_ctx": max_tokens},
)
return LLMResponse(
raw_response=response.get("response") or "",
prompt=prompt,
response=response.get("response") or "",
tool_calls=None,
prompt_tokens=response.get("prompt_eval_count") or 0,
completion_tokens=response.get("eval_count") or 0,
)
elif provider == "open_router":
tools_param = tools if tools else openai.NOT_GIVEN
client = openai.OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=credentials.api_key.get_secret_value(),
)
response = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "https://agpt.co",
"X-Title": "AutoGPT",
},
model=llm_model.value,
messages=prompt, # type: ignore
max_tokens=max_tokens,
tools=tools_param, # type: ignore
)
# If there's no response, raise an error
if not response.choices:
if response:
raise ValueError(f"OpenRouter error: {response}")
else:
raise ValueError("No response from OpenRouter.")
if response.choices[0].message.tool_calls:
tool_calls = [
ToolContentBlock(
id=tool.id,
type=tool.type,
function=ToolCall(
name=tool.function.name, arguments=tool.function.arguments
),
)
for tool in response.choices[0].message.tool_calls
]
else:
tool_calls = None
return LLMResponse(
raw_response=response.choices[0].message,
prompt=prompt,
response=response.choices[0].message.content or "",
tool_calls=tool_calls,
prompt_tokens=response.usage.prompt_tokens if response.usage else 0,
completion_tokens=response.usage.completion_tokens if response.usage else 0,
)
elif provider == "llama_api":
tools_param = tools if tools else openai.NOT_GIVEN
client = openai.OpenAI(
base_url="https://api.llama.com/compat/v1/",
api_key=credentials.api_key.get_secret_value(),
)
response = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "https://agpt.co",
"X-Title": "AutoGPT",
},
model=llm_model.value,
messages=prompt, # type: ignore
max_tokens=max_tokens,
tools=tools_param, # type: ignore
parallel_tool_calls=(
openai.NOT_GIVEN if parallel_tool_calls is None else parallel_tool_calls
),
)
# If there's no response, raise an error
if not response.choices:
if response:
raise ValueError(f"Llama API error: {response}")
else:
raise ValueError("No response from Llama API.")
if response.choices[0].message.tool_calls:
tool_calls = [
ToolContentBlock(
id=tool.id,
type=tool.type,
function=ToolCall(
name=tool.function.name, arguments=tool.function.arguments
),
)
for tool in response.choices[0].message.tool_calls
]
else:
tool_calls = None
return LLMResponse(
raw_response=response.choices[0].message,
prompt=prompt,
response=response.choices[0].message.content or "",
tool_calls=tool_calls,
prompt_tokens=response.usage.prompt_tokens if response.usage else 0,
completion_tokens=response.usage.completion_tokens if response.usage else 0,
)
else:
raise ValueError(f"Unsupported LLM provider: {provider}")
class AIBlockBase(Block, ABC):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.prompt = ""
self.prompt = []
def merge_llm_stats(self, block: "AIBlockBase"):
self.merge_stats(block.execution_stats)
@@ -260,7 +634,7 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
)
model: LlmModel = SchemaField(
title="LLM Model",
default=LlmModel.GPT4_TURBO,
default=LlmModel.GPT4O,
description="The language model to use for answering the prompt.",
advanced=False,
)
@@ -270,8 +644,8 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
default="",
description="The system prompt to provide additional context to the model.",
)
conversation_history: list[Message] = SchemaField(
default=[],
conversation_history: list[dict] = SchemaField(
default_factory=list,
description="The conversation history to provide context for the prompt.",
)
retry: int = SchemaField(
@@ -281,7 +655,7 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
)
prompt_values: dict[str, str] = SchemaField(
advanced=False,
default={},
default_factory=dict,
description="Values used to fill in the prompt. The values can be used in the prompt by putting them in a double curly braces, e.g. {{variable_name}}.",
)
max_tokens: int | None = SchemaField(
@@ -300,7 +674,7 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
response: dict[str, Any] = SchemaField(
description="The response object generated by the language model."
)
prompt: str = SchemaField(description="The prompt sent to the language model.")
prompt: list = SchemaField(description="The prompt sent to the language model.")
error: str = SchemaField(description="Error message if the API call failed.")
def __init__(self):
@@ -311,7 +685,7 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
input_schema=AIStructuredResponseGeneratorBlock.Input,
output_schema=AIStructuredResponseGeneratorBlock.Output,
test_input={
"model": LlmModel.GPT4_TURBO,
"model": LlmModel.GPT4O,
"credentials": TEST_CREDENTIALS_INPUT,
"expected_format": {
"key1": "value1",
@@ -322,22 +696,24 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
test_credentials=TEST_CREDENTIALS,
test_output=[
("response", {"key1": "key1Value", "key2": "key2Value"}),
("prompt", str),
("prompt", list),
],
test_mock={
"llm_call": lambda *args, **kwargs: (
json.dumps(
"llm_call": lambda *args, **kwargs: LLMResponse(
raw_response="",
prompt=[""],
response=json.dumps(
{
"key1": "key1Value",
"key2": "key2Value",
}
),
0,
0,
tool_calls=None,
prompt_tokens=0,
completion_tokens=0,
)
},
)
self.prompt = ""
def llm_call(
self,
@@ -346,160 +722,29 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
prompt: list[dict],
json_format: bool,
max_tokens: int | None,
tools: list[dict] | None = None,
ollama_host: str = "localhost:11434",
) -> tuple[str, int, int]:
) -> LLMResponse:
"""
Args:
credentials: The API key credentials to use.
llm_model: The LLM model to use.
prompt: The prompt to send to the LLM.
json_format: Whether the response should be in JSON format.
max_tokens: The maximum number of tokens to generate in the chat completion.
ollama_host: The host for ollama to use
Returns:
The response from the LLM.
The number of tokens used in the prompt.
The number of tokens used in the completion.
Test mocks work only on class functions, this wraps the llm_call function
so that it can be mocked withing the block testing framework.
"""
provider = llm_model.metadata.provider
max_tokens = max_tokens or llm_model.max_output_tokens or 4096
if provider == "openai":
oai_client = openai.OpenAI(api_key=credentials.api_key.get_secret_value())
response_format = None
if llm_model in [LlmModel.O1_MINI, LlmModel.O1_PREVIEW]:
sys_messages = [p["content"] for p in prompt if p["role"] == "system"]
usr_messages = [p["content"] for p in prompt if p["role"] != "system"]
prompt = [
{"role": "user", "content": "\n".join(sys_messages)},
{"role": "user", "content": "\n".join(usr_messages)},
]
elif json_format:
response_format = {"type": "json_object"}
response = oai_client.chat.completions.create(
model=llm_model.value,
messages=prompt, # type: ignore
response_format=response_format, # type: ignore
max_completion_tokens=max_tokens,
)
self.prompt = json.dumps(prompt)
return (
response.choices[0].message.content or "",
response.usage.prompt_tokens if response.usage else 0,
response.usage.completion_tokens if response.usage else 0,
)
elif provider == "anthropic":
system_messages = [p["content"] for p in prompt if p["role"] == "system"]
sysprompt = " ".join(system_messages)
messages = []
last_role = None
for p in prompt:
if p["role"] in ["user", "assistant"]:
if p["role"] != last_role:
messages.append({"role": p["role"], "content": p["content"]})
last_role = p["role"]
else:
# If the role is the same as the last one, combine the content
messages[-1]["content"] += "\n" + p["content"]
client = anthropic.Anthropic(api_key=credentials.api_key.get_secret_value())
try:
resp = client.messages.create(
model=llm_model.value,
system=sysprompt,
messages=messages,
max_tokens=max_tokens,
)
self.prompt = json.dumps(prompt)
if not resp.content:
raise ValueError("No content returned from Anthropic.")
return (
(
resp.content[0].name
if isinstance(resp.content[0], anthropic.types.ToolUseBlock)
else resp.content[0].text
),
resp.usage.input_tokens,
resp.usage.output_tokens,
)
except anthropic.APIError as e:
error_message = f"Anthropic API error: {str(e)}"
logger.error(error_message)
raise ValueError(error_message)
elif provider == "groq":
client = Groq(api_key=credentials.api_key.get_secret_value())
response_format = {"type": "json_object"} if json_format else None
response = client.chat.completions.create(
model=llm_model.value,
messages=prompt, # type: ignore
response_format=response_format, # type: ignore
max_tokens=max_tokens,
)
self.prompt = json.dumps(prompt)
return (
response.choices[0].message.content or "",
response.usage.prompt_tokens if response.usage else 0,
response.usage.completion_tokens if response.usage else 0,
)
elif provider == "ollama":
client = ollama.Client(host=ollama_host)
sys_messages = [p["content"] for p in prompt if p["role"] == "system"]
usr_messages = [p["content"] for p in prompt if p["role"] != "system"]
response = client.generate(
model=llm_model.value,
prompt=f"{sys_messages}\n\n{usr_messages}",
stream=False,
)
self.prompt = json.dumps(prompt)
return (
response.get("response") or "",
response.get("prompt_eval_count") or 0,
response.get("eval_count") or 0,
)
elif provider == "open_router":
client = openai.OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=credentials.api_key.get_secret_value(),
)
response = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "https://agpt.co",
"X-Title": "AutoGPT",
},
model=llm_model.value,
messages=prompt, # type: ignore
max_tokens=max_tokens,
)
self.prompt = json.dumps(prompt)
# If there's no response, raise an error
if not response.choices:
if response:
raise ValueError(f"OpenRouter error: {response}")
else:
raise ValueError("No response from OpenRouter.")
return (
response.choices[0].message.content or "",
response.usage.prompt_tokens if response.usage else 0,
response.usage.completion_tokens if response.usage else 0,
)
else:
raise ValueError(f"Unsupported LLM provider: {provider}")
self.prompt = prompt
return llm_call(
credentials=credentials,
llm_model=llm_model,
prompt=prompt,
json_format=json_format,
max_tokens=max_tokens,
tools=tools,
ollama_host=ollama_host,
)
def run(
self, input_data: Input, *, credentials: APIKeyCredentials, **kwargs
) -> BlockOutput:
logger.debug(f"Calling LLM with input data: {input_data}")
prompt = [p.model_dump() for p in input_data.conversation_history]
prompt = [json.to_dict(p) for p in input_data.conversation_history]
def trim_prompt(s: str) -> str:
lines = s.strip().split("\n")
@@ -549,7 +794,7 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
for retry_count in range(input_data.retry):
try:
response_text, input_token, output_token = self.llm_call(
llm_response = self.llm_call(
credentials=credentials,
llm_model=llm_model,
prompt=prompt,
@@ -557,11 +802,12 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
ollama_host=input_data.ollama_host,
max_tokens=input_data.max_tokens,
)
response_text = llm_response.response
self.merge_stats(
{
"input_token_count": input_token,
"output_token_count": output_token,
}
NodeExecutionStats(
input_token_count=llm_response.prompt_tokens,
output_token_count=llm_response.completion_tokens,
)
)
logger.info(f"LLM attempt-{retry_count} response: {response_text}")
@@ -601,13 +847,23 @@ class AIStructuredResponseGeneratorBlock(AIBlockBase):
prompt.append({"role": "user", "content": retry_prompt})
except Exception as e:
logger.exception(f"Error calling LLM: {e}")
if (
"maximum context length" in str(e).lower()
or "token limit" in str(e).lower()
):
if input_data.max_tokens is None:
input_data.max_tokens = llm_model.max_output_tokens or 4096
input_data.max_tokens = int(input_data.max_tokens * 0.85)
logger.debug(
f"Reducing max_tokens to {input_data.max_tokens} for next attempt"
)
retry_prompt = f"Error calling LLM: {e}"
finally:
self.merge_stats(
{
"llm_call_count": retry_count + 1,
"llm_retry_count": retry_count,
}
NodeExecutionStats(
llm_call_count=retry_count + 1,
llm_retry_count=retry_count,
)
)
raise RuntimeError(retry_prompt)
@@ -621,7 +877,7 @@ class AITextGeneratorBlock(AIBlockBase):
)
model: LlmModel = SchemaField(
title="LLM Model",
default=LlmModel.GPT4_TURBO,
default=LlmModel.GPT4O,
description="The language model to use for answering the prompt.",
advanced=False,
)
@@ -638,7 +894,7 @@ class AITextGeneratorBlock(AIBlockBase):
)
prompt_values: dict[str, str] = SchemaField(
advanced=False,
default={},
default_factory=dict,
description="Values used to fill in the prompt. The values can be used in the prompt by putting them in a double curly braces, e.g. {{variable_name}}.",
)
ollama_host: str = SchemaField(
@@ -656,7 +912,7 @@ class AITextGeneratorBlock(AIBlockBase):
response: str = SchemaField(
description="The response generated by the language model."
)
prompt: str = SchemaField(description="The prompt sent to the language model.")
prompt: list = SchemaField(description="The prompt sent to the language model.")
error: str = SchemaField(description="Error message if the API call failed.")
def __init__(self):
@@ -673,7 +929,7 @@ class AITextGeneratorBlock(AIBlockBase):
test_credentials=TEST_CREDENTIALS,
test_output=[
("response", "Response text"),
("prompt", str),
("prompt", list),
],
test_mock={"llm_call": lambda *args, **kwargs: "Response text"},
)
@@ -692,7 +948,10 @@ class AITextGeneratorBlock(AIBlockBase):
self, input_data: Input, *, credentials: APIKeyCredentials, **kwargs
) -> BlockOutput:
object_input_data = AIStructuredResponseGeneratorBlock.Input(
**{attr: getattr(input_data, attr) for attr in input_data.model_fields},
**{
attr: getattr(input_data, attr)
for attr in AITextGeneratorBlock.Input.model_fields
},
expected_format={},
)
yield "response", self.llm_call(object_input_data, credentials)
@@ -714,7 +973,7 @@ class AITextSummarizerBlock(AIBlockBase):
)
model: LlmModel = SchemaField(
title="LLM Model",
default=LlmModel.GPT4_TURBO,
default=LlmModel.GPT4O,
description="The language model to use for summarizing the text.",
)
focus: str = SchemaField(
@@ -749,7 +1008,7 @@ class AITextSummarizerBlock(AIBlockBase):
class Output(BlockSchema):
summary: str = SchemaField(description="The final summary of the text.")
prompt: str = SchemaField(description="The prompt sent to the language model.")
prompt: list = SchemaField(description="The prompt sent to the language model.")
error: str = SchemaField(description="Error message if the API call failed.")
def __init__(self):
@@ -766,7 +1025,7 @@ class AITextSummarizerBlock(AIBlockBase):
test_credentials=TEST_CREDENTIALS,
test_output=[
("summary", "Final summary of a long text"),
("prompt", str),
("prompt", list),
],
test_mock={
"llm_call": lambda input_data, credentials: (
@@ -875,12 +1134,18 @@ class AITextSummarizerBlock(AIBlockBase):
class AIConversationBlock(AIBlockBase):
class Input(BlockSchema):
messages: List[Message] = SchemaField(
description="List of messages in the conversation.", min_length=1
prompt: str = SchemaField(
description="The prompt to send to the language model.",
placeholder="Enter your prompt here...",
default="",
advanced=False,
)
messages: List[Any] = SchemaField(
description="List of messages in the conversation.",
)
model: LlmModel = SchemaField(
title="LLM Model",
default=LlmModel.GPT4_TURBO,
default=LlmModel.GPT4O,
description="The language model to use for the conversation.",
)
credentials: AICredentials = AICredentialsField()
@@ -899,7 +1164,7 @@ class AIConversationBlock(AIBlockBase):
response: str = SchemaField(
description="The model's response to the conversation."
)
prompt: str = SchemaField(description="The prompt sent to the language model.")
prompt: list = SchemaField(description="The prompt sent to the language model.")
error: str = SchemaField(description="Error message if the API call failed.")
def __init__(self):
@@ -919,7 +1184,7 @@ class AIConversationBlock(AIBlockBase):
},
{"role": "user", "content": "Where was it played?"},
],
"model": LlmModel.GPT4_TURBO,
"model": LlmModel.GPT4O,
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
@@ -928,7 +1193,7 @@ class AIConversationBlock(AIBlockBase):
"response",
"The 2020 World Series was played at Globe Life Field in Arlington, Texas.",
),
("prompt", str),
("prompt", list),
],
test_mock={
"llm_call": lambda *args, **kwargs: "The 2020 World Series was played at Globe Life Field in Arlington, Texas."
@@ -950,7 +1215,7 @@ class AIConversationBlock(AIBlockBase):
) -> BlockOutput:
response = self.llm_call(
AIStructuredResponseGeneratorBlock.Input(
prompt="",
prompt=input_data.prompt,
credentials=input_data.credentials,
model=input_data.model,
conversation_history=input_data.messages,
@@ -981,7 +1246,7 @@ class AIListGeneratorBlock(AIBlockBase):
)
model: LlmModel = SchemaField(
title="LLM Model",
default=LlmModel.GPT4_TURBO,
default=LlmModel.GPT4O,
description="The language model to use for generating the list.",
advanced=True,
)
@@ -1008,7 +1273,7 @@ class AIListGeneratorBlock(AIBlockBase):
list_item: str = SchemaField(
description="Each individual item in the list.",
)
prompt: str = SchemaField(description="The prompt sent to the language model.")
prompt: list = SchemaField(description="The prompt sent to the language model.")
error: str = SchemaField(
description="Error message if the list generation failed."
)
@@ -1030,7 +1295,7 @@ class AIListGeneratorBlock(AIBlockBase):
"drawing explorers to uncover its mysteries. Each planet showcases the limitless possibilities of "
"fictional worlds."
),
"model": LlmModel.GPT4_TURBO,
"model": LlmModel.GPT4O,
"credentials": TEST_CREDENTIALS_INPUT,
"max_retries": 3,
},
@@ -1040,7 +1305,7 @@ class AIListGeneratorBlock(AIBlockBase):
"generated_list",
["Zylora Prime", "Kharon-9", "Vortexia", "Oceara", "Draknos"],
),
("prompt", str),
("prompt", list),
("list_item", "Zylora Prime"),
("list_item", "Kharon-9"),
("list_item", "Vortexia"),

View File

@@ -8,13 +8,13 @@ from moviepy.video.io.VideoFileClip import VideoFileClip
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.file import MediaFile, get_exec_file_path, store_media_file
from backend.util.file import MediaFileType, get_exec_file_path, store_media_file
class MediaDurationBlock(Block):
class Input(BlockSchema):
media_in: MediaFile = SchemaField(
media_in: MediaFileType = SchemaField(
description="Media input (URL, data URI, or local path)."
)
is_video: bool = SchemaField(
@@ -69,7 +69,7 @@ class LoopVideoBlock(Block):
"""
class Input(BlockSchema):
video_in: MediaFile = SchemaField(
video_in: MediaFileType = SchemaField(
description="The input video (can be a URL, data URI, or local path)."
)
# Provide EITHER a `duration` or `n_loops` or both. We'll demonstrate `duration`.
@@ -137,7 +137,7 @@ class LoopVideoBlock(Block):
assert isinstance(looped_clip, VideoFileClip)
# 4) Save the looped output
output_filename = MediaFile(
output_filename = MediaFileType(
f"{node_exec_id}_looped_{os.path.basename(local_video_path)}"
)
output_abspath = get_exec_file_path(graph_exec_id, output_filename)
@@ -162,10 +162,10 @@ class AddAudioToVideoBlock(Block):
"""
class Input(BlockSchema):
video_in: MediaFile = SchemaField(
video_in: MediaFileType = SchemaField(
description="Video input (URL, data URI, or local path)."
)
audio_in: MediaFile = SchemaField(
audio_in: MediaFileType = SchemaField(
description="Audio input (URL, data URI, or local path)."
)
volume: float = SchemaField(
@@ -178,7 +178,7 @@ class AddAudioToVideoBlock(Block):
)
class Output(BlockSchema):
video_out: MediaFile = SchemaField(
video_out: MediaFileType = SchemaField(
description="Final video (with attached audio), as a path or data URI."
)
error: str = SchemaField(
@@ -229,7 +229,7 @@ class AddAudioToVideoBlock(Block):
final_clip = video_clip.with_audio(audio_clip)
# 4) Write to output file
output_filename = MediaFile(
output_filename = MediaFileType(
f"{node_exec_id}_audio_attached_{os.path.basename(local_video_path)}"
)
output_abspath = os.path.join(abs_temp_dir, output_filename)

View File

@@ -65,7 +65,7 @@ class AddMemoryBlock(Block, Mem0Base):
default=Content(discriminator="content", content="I'm a vegetarian"),
)
metadata: dict[str, Any] = SchemaField(
description="Optional metadata for the memory", default={}
description="Optional metadata for the memory", default_factory=dict
)
limit_memory_to_run: bool = SchemaField(
@@ -173,7 +173,7 @@ class SearchMemoryBlock(Block, Mem0Base):
)
categories_filter: list[str] = SchemaField(
description="Categories to filter by",
default=[],
default_factory=list,
advanced=True,
)
limit_memory_to_run: bool = SchemaField(

View File

@@ -6,13 +6,14 @@ from backend.blocks.nvidia._auth import (
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.request import requests
from backend.util.type import MediaFileType
class NvidiaDeepfakeDetectBlock(Block):
class Input(BlockSchema):
credentials: NvidiaCredentialsInput = NvidiaCredentialsField()
image_base64: str = SchemaField(
description="Image to analyze for deepfakes", image_upload=True
image_base64: MediaFileType = SchemaField(
description="Image to analyze for deepfakes",
)
return_image: bool = SchemaField(
description="Whether to return the processed image with markings",
@@ -22,16 +23,12 @@ class NvidiaDeepfakeDetectBlock(Block):
class Output(BlockSchema):
status: str = SchemaField(
description="Detection status (SUCCESS, ERROR, CONTENT_FILTERED)",
default="",
)
image: str = SchemaField(
image: MediaFileType = SchemaField(
description="Processed image with detection markings (if return_image=True)",
default="",
image_output=True,
)
is_deepfake: float = SchemaField(
description="Probability that the image is a deepfake (0-1)",
default=0.0,
)
def __init__(self):

View File

@@ -177,7 +177,8 @@ class PineconeInsertBlock(Block):
description="Namespace to use in Pinecone", default=""
)
metadata: dict = SchemaField(
description="Additional metadata to store with each vector", default={}
description="Additional metadata to store with each vector",
default_factory=dict,
)
class Output(BlockSchema):

View File

@@ -2,8 +2,8 @@ import os
from enum import Enum
from typing import Literal
import replicate
from pydantic import SecretStr
from replicate.client import Client as ReplicateClient
from replicate.helpers import FileOutput
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
@@ -198,7 +198,7 @@ class ReplicateFluxAdvancedModelBlock(Block):
safety_tolerance,
):
# Initialize Replicate client with the API key
client = replicate.Client(api_token=api_key.get_secret_value())
client = ReplicateClient(api_token=api_key.get_secret_value())
# Run the model with additional parameters
output: FileOutput | list[FileOutput] = client.run( # type: ignore This is because they changed the return type, and didn't update the type hint! It should be overloaded depending on the value of `use_file_output` to `FileOutput | list[FileOutput]` but it's `Any | Iterator[Any]`

View File

@@ -12,7 +12,7 @@ from backend.data.model import (
SchemaField,
)
from backend.integrations.providers import ProviderName
from backend.util.file import MediaFile, store_media_file
from backend.util.file import MediaFileType, store_media_file
from backend.util.request import Requests
@@ -57,7 +57,7 @@ class ScreenshotWebPageBlock(Block):
)
class Output(BlockSchema):
image: MediaFile = SchemaField(description="The screenshot image data")
image: MediaFileType = SchemaField(description="The screenshot image data")
error: str = SchemaField(description="Error message if the screenshot failed")
def __init__(self):
@@ -142,7 +142,9 @@ class ScreenshotWebPageBlock(Block):
return {
"image": store_media_file(
graph_exec_id=graph_exec_id,
file=f"data:image/{format.value};base64,{b64encode(response.content).decode('utf-8')}",
file=MediaFileType(
f"data:image/{format.value};base64,{b64encode(response.content).decode('utf-8')}"
),
return_content=True,
)
}

View File

@@ -8,6 +8,7 @@ from backend.data.block import (
BlockWebhookConfig,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.util import settings
from backend.util.settings import AppEnvironment, BehaveAs
@@ -25,7 +26,7 @@ class Slant3DTriggerBase:
class Input(BlockSchema):
credentials: Slant3DCredentialsInput = Slant3DCredentialsField()
# Webhook URL is handled by the webhook system
payload: dict = SchemaField(hidden=True, default={})
payload: dict = SchemaField(hidden=True, default_factory=dict)
class Output(BlockSchema):
payload: dict = SchemaField(
@@ -82,7 +83,7 @@ class Slant3DOrderWebhookBlock(Slant3DTriggerBase, Block):
input_schema=self.Input,
output_schema=self.Output,
webhook_config=BlockWebhookConfig(
provider="slant3d",
provider=ProviderName.SLANT3D,
webhook_type="orders", # Only one type for now
resource_format="", # No resource format needed
event_filter_input="events",

View File

@@ -0,0 +1,513 @@
import logging
import re
from collections import Counter
from typing import TYPE_CHECKING, Any
from autogpt_libs.utils.cache import thread_cached
import backend.blocks.llm as llm
from backend.blocks.agent import AgentExecutorBlock
from backend.data.block import (
Block,
BlockCategory,
BlockInput,
BlockOutput,
BlockSchema,
BlockType,
)
from backend.data.model import SchemaField
from backend.util import json
if TYPE_CHECKING:
from backend.data.graph import Link, Node
logger = logging.getLogger(__name__)
@thread_cached
def get_database_manager_client():
from backend.executor import DatabaseManagerClient
from backend.util.service import get_service_client
return get_service_client(DatabaseManagerClient)
def _get_tool_requests(entry: dict[str, Any]) -> list[str]:
"""
Return a list of tool_call_ids if the entry is a tool request.
Supports both OpenAI and Anthropics formats.
"""
tool_call_ids = []
if entry.get("role") != "assistant":
return tool_call_ids
# OpenAI: check for tool_calls in the entry.
calls = entry.get("tool_calls")
if isinstance(calls, list):
for call in calls:
if tool_id := call.get("id"):
tool_call_ids.append(tool_id)
# Anthropics: check content items for tool_use type.
content = entry.get("content")
if isinstance(content, list):
for item in content:
if item.get("type") != "tool_use":
continue
if tool_id := item.get("id"):
tool_call_ids.append(tool_id)
return tool_call_ids
def _get_tool_responses(entry: dict[str, Any]) -> list[str]:
"""
Return a list of tool_call_ids if the entry is a tool response.
Supports both OpenAI and Anthropics formats.
"""
tool_call_ids: list[str] = []
# OpenAI: a tool response message with role "tool" and key "tool_call_id".
if entry.get("role") == "tool":
if tool_call_id := entry.get("tool_call_id"):
tool_call_ids.append(str(tool_call_id))
# Anthropics: check content items for tool_result type.
if entry.get("role") == "user":
content = entry.get("content")
if isinstance(content, list):
for item in content:
if item.get("type") != "tool_result":
continue
if tool_call_id := item.get("tool_use_id"):
tool_call_ids.append(tool_call_id)
return tool_call_ids
def _create_tool_response(call_id: str, output: dict[str, Any]) -> dict[str, Any]:
"""
Create a tool response message for either OpenAI or Anthropics,
based on the tool_id format.
"""
content = output if isinstance(output, str) else json.dumps(output)
# Anthropics format: tool IDs typically start with "toolu_"
if call_id.startswith("toolu_"):
return {
"role": "user",
"type": "message",
"content": [
{"tool_use_id": call_id, "type": "tool_result", "content": content}
],
}
# OpenAI format: tool IDs typically start with "call_".
# Or default fallback (if the tool_id doesn't match any known prefix)
return {"role": "tool", "tool_call_id": call_id, "content": content}
def get_pending_tool_calls(conversation_history: list[Any]) -> dict[str, int]:
"""
All the tool calls entry in the conversation history requires a response.
This function returns the pending tool calls that has not generated an output yet.
Return: dict[str, int] - A dictionary of pending tool call IDs with their count.
"""
pending_calls = Counter()
for history in conversation_history:
for call_id in _get_tool_requests(history):
pending_calls[call_id] += 1
for call_id in _get_tool_responses(history):
pending_calls[call_id] -= 1
return {call_id: count for call_id, count in pending_calls.items() if count > 0}
class SmartDecisionMakerBlock(Block):
"""
A block that uses a language model to make smart decisions based on a given prompt.
"""
class Input(BlockSchema):
prompt: str = SchemaField(
description="The prompt to send to the language model.",
placeholder="Enter your prompt here...",
)
model: llm.LlmModel = SchemaField(
title="LLM Model",
default=llm.LlmModel.GPT4O,
description="The language model to use for answering the prompt.",
advanced=False,
)
credentials: llm.AICredentials = llm.AICredentialsField()
sys_prompt: str = SchemaField(
title="System Prompt",
default="Thinking carefully step by step decide which function to call. "
"Always choose a function call from the list of function signatures, "
"and always provide the complete argument provided with the type "
"matching the required jsonschema signature, no missing argument is allowed. "
"If you have already completed the task objective, you can end the task "
"by providing the end result of your work as a finish message. "
"Only provide EXACTLY one function call, multiple tool calls is strictly prohibited.",
description="The system prompt to provide additional context to the model.",
)
conversation_history: list[dict] = SchemaField(
default_factory=list,
description="The conversation history to provide context for the prompt.",
)
last_tool_output: Any = SchemaField(
default=None,
description="The output of the last tool that was called.",
)
retry: int = SchemaField(
title="Retry Count",
default=3,
description="Number of times to retry the LLM call if the response does not match the expected format.",
)
prompt_values: dict[str, str] = SchemaField(
advanced=False,
default_factory=dict,
description="Values used to fill in the prompt. The values can be used in the prompt by putting them in a double curly braces, e.g. {{variable_name}}.",
)
max_tokens: int | None = SchemaField(
advanced=True,
default=None,
description="The maximum number of tokens to generate in the chat completion.",
)
ollama_host: str = SchemaField(
advanced=True,
default="localhost:11434",
description="Ollama host for local models",
)
@classmethod
def get_missing_links(cls, data: BlockInput, links: list["Link"]) -> set[str]:
# conversation_history & last_tool_output validation is handled differently
missing_links = super().get_missing_links(
data,
[
link
for link in links
if link.sink_name
not in ["conversation_history", "last_tool_output"]
],
)
# Avoid executing the block if the last_tool_output is connected to a static
# link, like StoreValueBlock or AgentInputBlock.
if any(link.sink_name == "conversation_history" for link in links) and any(
link.sink_name == "last_tool_output" and link.is_static
for link in links
):
raise ValueError(
"Last Tool Output can't be connected to a static (dashed line) "
"link like the output of `StoreValue` or `AgentInput` block"
)
return missing_links
@classmethod
def get_missing_input(cls, data: BlockInput) -> set[str]:
if missing_input := super().get_missing_input(data):
return missing_input
conversation_history = data.get("conversation_history", [])
pending_tool_calls = get_pending_tool_calls(conversation_history)
last_tool_output = data.get("last_tool_output")
if not last_tool_output and pending_tool_calls:
return {"last_tool_output"}
return set()
class Output(BlockSchema):
error: str = SchemaField(description="Error message if the API call failed.")
tools: Any = SchemaField(description="The tools that are available to use.")
finished: str = SchemaField(
description="The finished message to display to the user."
)
conversations: list[Any] = SchemaField(
description="The conversation history to provide context for the prompt."
)
def __init__(self):
super().__init__(
id="3b191d9f-356f-482d-8238-ba04b6d18381",
description="Uses AI to intelligently decide what tool to use.",
categories={BlockCategory.AI},
block_type=BlockType.AI,
input_schema=SmartDecisionMakerBlock.Input,
output_schema=SmartDecisionMakerBlock.Output,
test_input={
"prompt": "Hello, World!",
"credentials": llm.TEST_CREDENTIALS_INPUT,
},
test_output=[],
test_credentials=llm.TEST_CREDENTIALS,
)
@staticmethod
def cleanup(s: str):
return re.sub(r"[^a-zA-Z0-9_-]", "_", s).lower()
@staticmethod
def _create_block_function_signature(
sink_node: "Node", links: list["Link"]
) -> dict[str, Any]:
"""
Creates a function signature for a block node.
Args:
sink_node: The node for which to create a function signature.
links: The list of links connected to the sink node.
Returns:
A dictionary representing the function signature in the format expected by LLM tools.
Raises:
ValueError: If the block specified by sink_node.block_id is not found.
"""
block = sink_node.block
tool_function: dict[str, Any] = {
"name": SmartDecisionMakerBlock.cleanup(block.name),
"description": block.description,
}
properties = {}
required = []
for link in links:
sink_block_input_schema = block.input_schema
description = (
sink_block_input_schema.model_fields[link.sink_name].description
if link.sink_name in sink_block_input_schema.model_fields
and sink_block_input_schema.model_fields[link.sink_name].description
else f"The {link.sink_name} of the tool"
)
properties[SmartDecisionMakerBlock.cleanup(link.sink_name)] = {
"type": "string",
"description": description,
}
tool_function["parameters"] = {
"type": "object",
"properties": properties,
"required": required,
"additionalProperties": False,
"strict": True,
}
return {"type": "function", "function": tool_function}
@staticmethod
def _create_agent_function_signature(
sink_node: "Node", links: list["Link"]
) -> dict[str, Any]:
"""
Creates a function signature for an agent node.
Args:
sink_node: The agent node for which to create a function signature.
links: The list of links connected to the sink node.
Returns:
A dictionary representing the function signature in the format expected by LLM tools.
Raises:
ValueError: If the graph metadata for the specified graph_id and graph_version is not found.
"""
graph_id = sink_node.input_default.get("graph_id")
graph_version = sink_node.input_default.get("graph_version")
if not graph_id or not graph_version:
raise ValueError("Graph ID or Graph Version not found in sink node.")
db_client = get_database_manager_client()
sink_graph_meta = db_client.get_graph_metadata(graph_id, graph_version)
if not sink_graph_meta:
raise ValueError(
f"Sink graph metadata not found: {graph_id} {graph_version}"
)
tool_function: dict[str, Any] = {
"name": SmartDecisionMakerBlock.cleanup(sink_graph_meta.name),
"description": sink_graph_meta.description,
}
properties = {}
required = []
for link in links:
sink_block_input_schema = sink_node.input_default["input_schema"]
description = (
sink_block_input_schema["properties"][link.sink_name]["description"]
if "description"
in sink_block_input_schema["properties"][link.sink_name]
else f"The {link.sink_name} of the tool"
)
properties[SmartDecisionMakerBlock.cleanup(link.sink_name)] = {
"type": "string",
"description": description,
}
tool_function["parameters"] = {
"type": "object",
"properties": properties,
"required": required,
"additionalProperties": False,
"strict": True,
}
return {"type": "function", "function": tool_function}
@staticmethod
def _create_function_signature(node_id: str) -> list[dict[str, Any]]:
"""
Creates function signatures for tools linked to a specified node within a graph.
This method filters the graph links to identify those that are tools and are
connected to the given node_id. It then constructs function signatures for each
tool based on the metadata and input schema of the linked nodes.
Args:
node_id: The node_id for which to create function signatures.
Returns:
list[dict[str, Any]]: A list of dictionaries, each representing a function signature
for a tool, including its name, description, and parameters.
Raises:
ValueError: If no tool links are found for the specified node_id, or if a sink node
or its metadata cannot be found.
"""
db_client = get_database_manager_client()
tools = [
(link, node)
for link, node in db_client.get_connected_output_nodes(node_id)
if link.source_name.startswith("tools_^_") and link.source_id == node_id
]
if not tools:
raise ValueError("There is no next node to execute.")
return_tool_functions = []
grouped_tool_links: dict[str, tuple["Node", list["Link"]]] = {}
for link, node in tools:
if link.sink_id not in grouped_tool_links:
grouped_tool_links[link.sink_id] = (node, [link])
else:
grouped_tool_links[link.sink_id][1].append(link)
for sink_node, links in grouped_tool_links.values():
if not sink_node:
raise ValueError(f"Sink node not found: {links[0].sink_id}")
if sink_node.block_id == AgentExecutorBlock().id:
return_tool_functions.append(
SmartDecisionMakerBlock._create_agent_function_signature(
sink_node, links
)
)
else:
return_tool_functions.append(
SmartDecisionMakerBlock._create_block_function_signature(
sink_node, links
)
)
return return_tool_functions
def run(
self,
input_data: Input,
*,
credentials: llm.APIKeyCredentials,
graph_id: str,
node_id: str,
graph_exec_id: str,
node_exec_id: str,
user_id: str,
**kwargs,
) -> BlockOutput:
tool_functions = self._create_function_signature(node_id)
input_data.conversation_history = input_data.conversation_history or []
prompt = [json.to_dict(p) for p in input_data.conversation_history if p]
pending_tool_calls = get_pending_tool_calls(input_data.conversation_history)
if pending_tool_calls and not input_data.last_tool_output:
raise ValueError(f"Tool call requires an output for {pending_tool_calls}")
# Prefill all missing tool calls with the last tool output/
# TODO: we need a better way to handle this.
tool_output = [
_create_tool_response(pending_call_id, input_data.last_tool_output)
for pending_call_id, count in pending_tool_calls.items()
for _ in range(count)
]
# If the SDM block only calls 1 tool at a time, this should not happen.
if len(tool_output) > 1:
logger.warning(
f"[SmartDecisionMakerBlock-node_exec_id={node_exec_id}] "
f"Multiple pending tool calls are prefilled using a single output. "
f"Execution may not be accurate."
)
# Fallback on adding tool output in the conversation history as user prompt.
if len(tool_output) == 0 and input_data.last_tool_output:
logger.warning(
f"[SmartDecisionMakerBlock-node_exec_id={node_exec_id}] "
f"No pending tool calls found. This may indicate an issue with the "
f"conversation history, or an LLM calling two tools at the same time."
)
tool_output.append(
{
"role": "user",
"content": f"Last tool output: {json.dumps(input_data.last_tool_output)}",
}
)
prompt.extend(tool_output)
values = input_data.prompt_values
if values:
input_data.prompt = llm.fmt.format_string(input_data.prompt, values)
input_data.sys_prompt = llm.fmt.format_string(input_data.sys_prompt, values)
prefix = "[Main Objective Prompt]: "
if input_data.sys_prompt and not any(
p["role"] == "system" and p["content"].startswith(prefix) for p in prompt
):
prompt.append({"role": "system", "content": prefix + input_data.sys_prompt})
if input_data.prompt and not any(
p["role"] == "user" and p["content"].startswith(prefix) for p in prompt
):
prompt.append({"role": "user", "content": prefix + input_data.prompt})
response = llm.llm_call(
credentials=credentials,
llm_model=input_data.model,
prompt=prompt,
json_format=False,
max_tokens=input_data.max_tokens,
tools=tool_functions,
ollama_host=input_data.ollama_host,
parallel_tool_calls=False,
)
if not response.tool_calls:
yield "finished", response.response
return
for tool_call in response.tool_calls:
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
for arg_name, arg_value in tool_args.items():
yield f"tools_^_{tool_name}_~_{arg_name}", arg_value
response.prompt.append(response.raw_response)
yield "conversations", response.prompt

View File

@@ -0,0 +1,97 @@
from backend.blocks.smartlead.models import (
AddLeadsRequest,
AddLeadsToCampaignResponse,
CreateCampaignRequest,
CreateCampaignResponse,
SaveSequencesRequest,
SaveSequencesResponse,
)
from backend.util.request import Requests
class SmartLeadClient:
"""Client for the SmartLead API"""
# This api is stupid and requires your api key in the url. DO NOT RAISE ERRORS FOR BAD REQUESTS.
# FILTER OUT THE API KEY FROM THE ERROR MESSAGE.
API_URL = "https://server.smartlead.ai/api/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.requests = Requests()
def _add_auth_to_url(self, url: str) -> str:
return f"{url}?api_key={self.api_key}"
def _handle_error(self, e: Exception) -> str:
return e.__str__().replace(self.api_key, "API KEY")
def create_campaign(self, request: CreateCampaignRequest) -> CreateCampaignResponse:
try:
response = self.requests.post(
self._add_auth_to_url(f"{self.API_URL}/campaigns/create"),
json=request.model_dump(),
)
response_data = response.json()
return CreateCampaignResponse(**response_data)
except ValueError as e:
raise ValueError(f"Invalid response format: {str(e)}")
except Exception as e:
raise ValueError(f"Failed to create campaign: {self._handle_error(e)}")
def add_leads_to_campaign(
self, request: AddLeadsRequest
) -> AddLeadsToCampaignResponse:
try:
response = self.requests.post(
self._add_auth_to_url(
f"{self.API_URL}/campaigns/{request.campaign_id}/leads"
),
json=request.model_dump(exclude={"campaign_id"}),
)
response_data = response.json()
response_parsed = AddLeadsToCampaignResponse(**response_data)
if not response_parsed.ok:
raise ValueError(
f"Failed to add leads to campaign: {response_parsed.error}"
)
return response_parsed
except ValueError as e:
raise ValueError(f"Invalid response format: {str(e)}")
except Exception as e:
raise ValueError(
f"Failed to add leads to campaign: {self._handle_error(e)}"
)
def save_campaign_sequences(
self, campaign_id: int, request: SaveSequencesRequest
) -> SaveSequencesResponse:
"""
Save sequences within a campaign.
Args:
campaign_id: ID of the campaign to save sequences for
request: SaveSequencesRequest containing the sequences configuration
Returns:
SaveSequencesResponse with the result of the operation
Note:
For variant_distribution_type:
- MANUAL_EQUAL: Equally distributes variants across leads
- AI_EQUAL: Requires winning_metric_property and lead_distribution_percentage
- MANUAL_PERCENTAGE: Requires variant_distribution_percentage in seq_variants
"""
try:
response = self.requests.post(
self._add_auth_to_url(
f"{self.API_URL}/campaigns/{campaign_id}/sequences"
),
json=request.model_dump(exclude_none=True),
)
return SaveSequencesResponse(**response.json())
except Exception as e:
raise ValueError(
f"Failed to save campaign sequences: {e.__str__().replace(self.api_key, 'API KEY')}"
)

View File

@@ -0,0 +1,35 @@
from typing import Literal
from pydantic import SecretStr
from backend.data.model import APIKeyCredentials, CredentialsField, CredentialsMetaInput
from backend.integrations.providers import ProviderName
SmartLeadCredentials = APIKeyCredentials
SmartLeadCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.SMARTLEAD],
Literal["api_key"],
]
TEST_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="smartlead",
api_key=SecretStr("mock-smartlead-api-key"),
title="Mock SmartLead API key",
expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
def SmartLeadCredentialsField() -> SmartLeadCredentialsInput:
"""
Creates a SmartLead credentials input on a block.
"""
return CredentialsField(
description="The SmartLead integration can be used with an API Key.",
)

View File

@@ -0,0 +1,326 @@
from backend.blocks.smartlead._api import SmartLeadClient
from backend.blocks.smartlead._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
SmartLeadCredentials,
SmartLeadCredentialsInput,
)
from backend.blocks.smartlead.models import (
AddLeadsRequest,
AddLeadsToCampaignResponse,
CreateCampaignRequest,
CreateCampaignResponse,
LeadInput,
LeadUploadSettings,
SaveSequencesRequest,
SaveSequencesResponse,
Sequence,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class CreateCampaignBlock(Block):
"""Create a campaign in SmartLead"""
class Input(BlockSchema):
name: str = SchemaField(
description="The name of the campaign",
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
id: int = SchemaField(
description="The ID of the created campaign",
)
name: str = SchemaField(
description="The name of the created campaign",
)
created_at: str = SchemaField(
description="The date and time the campaign was created",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="8865699f-9188-43c4-89b0-79c84cfaa03e",
description="Create a campaign in SmartLead",
categories={BlockCategory.CRM},
input_schema=CreateCampaignBlock.Input,
output_schema=CreateCampaignBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"name": "Test Campaign", "credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"id",
1,
),
(
"name",
"Test Campaign",
),
(
"created_at",
"2024-01-01T00:00:00Z",
),
],
test_mock={
"create_campaign": lambda name, credentials: CreateCampaignResponse(
ok=True,
id=1,
name=name,
created_at="2024-01-01T00:00:00Z",
)
},
)
@staticmethod
def create_campaign(
name: str, credentials: SmartLeadCredentials
) -> CreateCampaignResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.create_campaign(CreateCampaignRequest(name=name))
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.create_campaign(input_data.name, credentials)
yield "id", response.id
yield "name", response.name
yield "created_at", response.created_at
if not response.ok:
yield "error", "Failed to create campaign"
class AddLeadToCampaignBlock(Block):
"""Add a lead to a campaign in SmartLead"""
class Input(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign to add the lead to",
)
lead_list: list[LeadInput] = SchemaField(
description="An array of JSON objects, each representing a lead's details. Can hold max 100 leads.",
max_length=100,
default_factory=list,
advanced=False,
)
settings: LeadUploadSettings = SchemaField(
description="Settings for lead upload",
default=LeadUploadSettings(),
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign the lead was added to (passed through)",
)
upload_count: int = SchemaField(
description="The number of leads added to the campaign",
)
already_added_to_campaign: int = SchemaField(
description="The number of leads that were already added to the campaign",
)
duplicate_count: int = SchemaField(
description="The number of emails that were duplicates",
)
invalid_email_count: int = SchemaField(
description="The number of emails that were invalidly formatted",
)
is_lead_limit_exhausted: bool = SchemaField(
description="Whether the lead limit was exhausted",
)
lead_import_stopped_count: int = SchemaField(
description="The number of leads that were not added to the campaign because the lead import was stopped",
)
error: str = SchemaField(
description="Error message if the lead was not added to the campaign",
default="",
)
def __init__(self):
super().__init__(
id="fb8106a4-1a8f-42f9-a502-f6d07e6fe0ec",
description="Add a lead to a campaign in SmartLead",
categories={BlockCategory.CRM},
input_schema=AddLeadToCampaignBlock.Input,
output_schema=AddLeadToCampaignBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"campaign_id": 1,
"lead_list": [],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
(
"campaign_id",
1,
),
(
"upload_count",
1,
),
],
test_mock={
"add_leads_to_campaign": lambda campaign_id, lead_list, credentials: AddLeadsToCampaignResponse(
ok=True,
upload_count=1,
already_added_to_campaign=0,
duplicate_count=0,
invalid_email_count=0,
is_lead_limit_exhausted=False,
lead_import_stopped_count=0,
error="",
total_leads=1,
block_count=0,
invalid_emails=[],
unsubscribed_leads=[],
bounce_count=0,
)
},
)
@staticmethod
def add_leads_to_campaign(
campaign_id: int, lead_list: list[LeadInput], credentials: SmartLeadCredentials
) -> AddLeadsToCampaignResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.add_leads_to_campaign(
AddLeadsRequest(
campaign_id=campaign_id,
lead_list=lead_list,
settings=LeadUploadSettings(
ignore_global_block_list=False,
ignore_unsubscribe_list=False,
ignore_community_bounce_list=False,
ignore_duplicate_leads_in_other_campaign=False,
),
),
)
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.add_leads_to_campaign(
input_data.campaign_id, input_data.lead_list, credentials
)
yield "campaign_id", input_data.campaign_id
yield "upload_count", response.upload_count
if response.already_added_to_campaign:
yield "already_added_to_campaign", response.already_added_to_campaign
if response.duplicate_count:
yield "duplicate_count", response.duplicate_count
if response.invalid_email_count:
yield "invalid_email_count", response.invalid_email_count
if response.is_lead_limit_exhausted:
yield "is_lead_limit_exhausted", response.is_lead_limit_exhausted
if response.lead_import_stopped_count:
yield "lead_import_stopped_count", response.lead_import_stopped_count
if response.error:
yield "error", response.error
if not response.ok:
yield "error", "Failed to add leads to campaign"
class SaveCampaignSequencesBlock(Block):
"""Save sequences within a campaign"""
class Input(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign to save sequences for",
)
sequences: list[Sequence] = SchemaField(
description="The sequences to save",
default_factory=list,
advanced=False,
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
data: dict | str | None = SchemaField(
description="Data from the API",
default=None,
)
message: str = SchemaField(
description="Message from the API",
default="",
)
error: str = SchemaField(
description="Error message if the sequences were not saved",
default="",
)
def __init__(self):
super().__init__(
id="e7d9f41c-dc10-4f39-98ba-a432abd128c0",
description="Save sequences within a campaign",
categories={BlockCategory.CRM},
input_schema=SaveCampaignSequencesBlock.Input,
output_schema=SaveCampaignSequencesBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"campaign_id": 1,
"sequences": [],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
(
"message",
"Sequences saved successfully",
),
],
test_mock={
"save_campaign_sequences": lambda campaign_id, sequences, credentials: SaveSequencesResponse(
ok=True,
message="Sequences saved successfully",
)
},
)
@staticmethod
def save_campaign_sequences(
campaign_id: int, sequences: list[Sequence], credentials: SmartLeadCredentials
) -> SaveSequencesResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.save_campaign_sequences(
campaign_id=campaign_id, request=SaveSequencesRequest(sequences=sequences)
)
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.save_campaign_sequences(
input_data.campaign_id, input_data.sequences, credentials
)
if response.data:
yield "data", response.data
if response.message:
yield "message", response.message
if response.error:
yield "error", response.error
if not response.ok:
yield "error", "Failed to save sequences"

View File

@@ -0,0 +1,147 @@
from enum import Enum
from pydantic import BaseModel
from backend.data.model import SchemaField
class CreateCampaignResponse(BaseModel):
ok: bool
id: int
name: str
created_at: str
class CreateCampaignRequest(BaseModel):
name: str
client_id: str | None = None
class AddLeadsToCampaignResponse(BaseModel):
ok: bool
upload_count: int
total_leads: int
block_count: int
duplicate_count: int
invalid_email_count: int
invalid_emails: list[str]
already_added_to_campaign: int
unsubscribed_leads: list[str]
is_lead_limit_exhausted: bool
lead_import_stopped_count: int
bounce_count: int
error: str | None = None
class LeadCustomFields(BaseModel):
"""Custom fields for a lead (max 20 fields)"""
fields: dict[str, str] = SchemaField(
description="Custom fields for a lead (max 20 fields)",
max_length=20,
default_factory=dict,
)
class LeadInput(BaseModel):
"""Single lead input data"""
first_name: str
last_name: str
email: str
phone_number: str | None = None # Changed from int to str for phone numbers
company_name: str | None = None
website: str | None = None
location: str | None = None
custom_fields: LeadCustomFields | None = None
linkedin_profile: str | None = None
company_url: str | None = None
class LeadUploadSettings(BaseModel):
"""Settings for lead upload"""
ignore_global_block_list: bool = SchemaField(
description="Ignore the global block list",
default=False,
)
ignore_unsubscribe_list: bool = SchemaField(
description="Ignore the unsubscribe list",
default=False,
)
ignore_community_bounce_list: bool = SchemaField(
description="Ignore the community bounce list",
default=False,
)
ignore_duplicate_leads_in_other_campaign: bool = SchemaField(
description="Ignore duplicate leads in other campaigns",
default=False,
)
class AddLeadsRequest(BaseModel):
"""Request body for adding leads to a campaign"""
lead_list: list[LeadInput] = SchemaField(
description="List of leads to add to the campaign",
max_length=100,
default_factory=list,
)
settings: LeadUploadSettings
campaign_id: int
class VariantDistributionType(str, Enum):
MANUAL_EQUAL = "MANUAL_EQUAL"
MANUAL_PERCENTAGE = "MANUAL_PERCENTAGE"
AI_EQUAL = "AI_EQUAL"
class WinningMetricProperty(str, Enum):
OPEN_RATE = "OPEN_RATE"
CLICK_RATE = "CLICK_RATE"
REPLY_RATE = "REPLY_RATE"
POSITIVE_REPLY_RATE = "POSITIVE_REPLY_RATE"
class SequenceDelayDetails(BaseModel):
delay_in_days: int
class SequenceVariant(BaseModel):
subject: str
email_body: str
variant_label: str
id: int | None = None # Optional for creation, required for updates
variant_distribution_percentage: int | None = None
class Sequence(BaseModel):
seq_number: int = SchemaField(
description="The sequence number",
default=1,
)
seq_delay_details: SequenceDelayDetails
id: int | None = None
variant_distribution_type: VariantDistributionType | None = None
lead_distribution_percentage: int | None = SchemaField(
None, ge=20, le=100
) # >= 20% for fair calculation
winning_metric_property: WinningMetricProperty | None = None
seq_variants: list[SequenceVariant] | None = None
subject: str = "" # blank makes the follow up in the same thread
email_body: str | None = None
class SaveSequencesRequest(BaseModel):
sequences: list[Sequence]
class SaveSequencesResponse(BaseModel):
ok: bool
message: str = SchemaField(
description="Message from the API",
default="",
)
data: dict | str | None = None
error: str | None = None

View File

@@ -156,6 +156,10 @@ class CountdownTimerBlock(Block):
days: Union[int, str] = SchemaField(
advanced=False, description="Duration in days", default=0
)
repeat: int = SchemaField(
description="Number of times to repeat the timer",
default=1,
)
class Output(BlockSchema):
output_message: Any = SchemaField(
@@ -187,5 +191,6 @@ class CountdownTimerBlock(Block):
total_seconds = seconds + minutes * 60 + hours * 3600 + days * 86400
time.sleep(total_seconds)
yield "output_message", input_data.input_message
for _ in range(input_data.repeat):
time.sleep(total_seconds)
yield "output_message", input_data.input_message

View File

@@ -7,6 +7,7 @@ from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TODOIST_OAUTH_IS_CONFIGURED,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
@@ -61,6 +62,7 @@ class TodoistCreateCommentBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateCommentBlock.Input,
output_schema=TodoistCreateCommentBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"content": "Test comment",
@@ -164,6 +166,7 @@ class TodoistGetCommentsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetCommentsBlock.Input,
output_schema=TodoistGetCommentsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"id_type": {"discriminator": "task", "task_id": "2995104339"},
@@ -268,6 +271,7 @@ class TodoistGetCommentBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetCommentBlock.Input,
output_schema=TodoistGetCommentBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",
@@ -346,6 +350,7 @@ class TodoistUpdateCommentBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateCommentBlock.Input,
output_schema=TodoistUpdateCommentBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",
@@ -404,6 +409,7 @@ class TodoistDeleteCommentBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteCommentBlock.Input,
output_schema=TodoistDeleteCommentBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",

View File

@@ -4,6 +4,7 @@ from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TODOIST_OAUTH_IS_CONFIGURED,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
@@ -42,6 +43,7 @@ class TodoistCreateLabelBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateLabelBlock.Input,
output_schema=TodoistCreateLabelBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"name": "Test Label",
@@ -130,6 +132,7 @@ class TodoistListLabelsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListLabelsBlock.Input,
output_schema=TodoistListLabelsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[
@@ -211,6 +214,7 @@ class TodoistGetLabelBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetLabelBlock.Input,
output_schema=TodoistGetLabelBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
@@ -293,6 +297,7 @@ class TodoistUpdateLabelBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateLabelBlock.Input,
output_schema=TodoistUpdateLabelBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
@@ -364,6 +369,7 @@ class TodoistDeleteLabelBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteLabelBlock.Input,
output_schema=TodoistDeleteLabelBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
@@ -415,6 +421,7 @@ class TodoistGetSharedLabelsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetSharedLabelsBlock.Input,
output_schema=TodoistGetSharedLabelsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[("labels", ["Label1", "Label2", "Label3"])],
@@ -471,6 +478,7 @@ class TodoistRenameSharedLabelsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistRenameSharedLabelsBlock.Input,
output_schema=TodoistRenameSharedLabelsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"name": "OldLabel",
@@ -526,6 +534,7 @@ class TodoistRemoveSharedLabelsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistRemoveSharedLabelsBlock.Input,
output_schema=TodoistRemoveSharedLabelsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "name": "LabelToRemove"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],

View File

@@ -4,6 +4,7 @@ from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TODOIST_OAUTH_IS_CONFIGURED,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
@@ -35,6 +36,7 @@ class TodoistListProjectsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListProjectsBlock.Input,
output_schema=TodoistListProjectsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
},
@@ -150,6 +152,7 @@ class TodoistCreateProjectBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateProjectBlock.Input,
output_schema=TodoistCreateProjectBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "name": "Test Project"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
@@ -230,6 +233,7 @@ class TodoistGetProjectBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetProjectBlock.Input,
output_schema=TodoistGetProjectBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
@@ -332,6 +336,7 @@ class TodoistUpdateProjectBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateProjectBlock.Input,
output_schema=TodoistUpdateProjectBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
@@ -413,6 +418,7 @@ class TodoistDeleteProjectBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteProjectBlock.Input,
output_schema=TodoistDeleteProjectBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
@@ -481,6 +487,7 @@ class TodoistListCollaboratorsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListCollaboratorsBlock.Input,
output_schema=TodoistListCollaboratorsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",

View File

@@ -4,6 +4,7 @@ from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TODOIST_OAUTH_IS_CONFIGURED,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
@@ -36,6 +37,7 @@ class TodoistListSectionsBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListSectionsBlock.Input,
output_schema=TodoistListSectionsBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
@@ -207,6 +209,7 @@ class TodoistGetSectionBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetSectionBlock.Input,
output_schema=TodoistGetSectionBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "section_id": "7025"},
test_credentials=TEST_CREDENTIALS,
test_output=[
@@ -275,6 +278,7 @@ class TodoistDeleteSectionBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteSectionBlock.Input,
output_schema=TodoistDeleteSectionBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "section_id": "7025"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],

View File

@@ -7,6 +7,7 @@ from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TODOIST_OAUTH_IS_CONFIGURED,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
@@ -86,6 +87,7 @@ class TodoistCreateTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateTaskBlock.Input,
output_schema=TodoistCreateTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"content": "Buy groceries",
@@ -217,6 +219,7 @@ class TodoistGetTasksBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetTasksBlock.Input,
output_schema=TodoistGetTasksBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
@@ -309,6 +312,7 @@ class TodoistGetTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetTaskBlock.Input,
output_schema=TodoistGetTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "task_id": "2995104339"},
test_credentials=TEST_CREDENTIALS,
test_output=[
@@ -428,6 +432,7 @@ class TodoistUpdateTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateTaskBlock.Input,
output_schema=TodoistUpdateTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"task_id": "2995104339",
@@ -467,32 +472,24 @@ class TodoistUpdateTaskBlock(Block):
)
task_updates = {}
if input_data.content is not None:
task_updates["content"] = input_data.content
if input_data.description is not None:
task_updates["description"] = input_data.description
if input_data.project_id is not None:
task_updates["project_id"] = input_data.project_id
if input_data.section_id is not None:
task_updates["section_id"] = input_data.section_id
if input_data.parent_id is not None:
task_updates["parent_id"] = input_data.parent_id
if input_data.order is not None:
task_updates["order"] = input_data.order
if input_data.labels is not None:
task_updates["labels"] = input_data.labels
if input_data.priority is not None:
task_updates["priority"] = input_data.priority
if due_date is not None:
task_updates["due_date"] = due_date
if deadline_date is not None:
task_updates["deadline_date"] = deadline_date
if input_data.assignee_id is not None:
task_updates["assignee_id"] = input_data.assignee_id
if input_data.duration is not None:
task_updates["duration"] = input_data.duration
if input_data.duration_unit is not None:
task_updates["duration_unit"] = input_data.duration_unit
update_fields = {
"content": input_data.content,
"description": input_data.description,
"project_id": input_data.project_id,
"section_id": input_data.section_id,
"parent_id": input_data.parent_id,
"order": input_data.order,
"labels": input_data.labels,
"priority": input_data.priority,
"due_date": due_date,
"deadline_date": deadline_date,
"assignee_id": input_data.assignee_id,
"duration": input_data.duration,
"duration_unit": input_data.duration_unit,
}
# Filter out None values
task_updates = {k: v for k, v in update_fields.items() if v is not None}
self.update_task(
credentials,
@@ -526,6 +523,7 @@ class TodoistCloseTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCloseTaskBlock.Input,
output_schema=TodoistCloseTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "task_id": "2995104339"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
@@ -576,6 +574,7 @@ class TodoistReopenTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistReopenTaskBlock.Input,
output_schema=TodoistReopenTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "task_id": "2995104339"},
test_credentials=TEST_CREDENTIALS,
test_output=[
@@ -628,6 +627,7 @@ class TodoistDeleteTaskBlock(Block):
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteTaskBlock.Input,
output_schema=TodoistDeleteTaskBlock.Output,
disabled=not TODOIST_OAUTH_IS_CONFIGURED,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "task_id": "2995104339"},
test_credentials=TEST_CREDENTIALS,
test_output=[

View File

@@ -1,4 +1,4 @@
# Todo : Add new Type support
# Todo : Add new Type support, and disable block if it's Oauth is not configured
# from typing import cast
# import tweepy

View File

@@ -1,4 +1,4 @@
# Todo : Add new Type support
# Todo : Add new Type support, and disable block if it's Oauth is not configured
# from typing import cast
@@ -156,7 +156,7 @@
# participant_ids: list[str] = SchemaField(
# description="Array of User IDs to create conversation with (max 50)",
# placeholder="Enter participant user IDs",
# default=[],
# default_factory=list,
# advanced=False
# )

View File

@@ -4,6 +4,7 @@ import tweepy
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -44,6 +45,7 @@ class TwitterUnfollowListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterUnfollowListBlock.Input,
output_schema=TwitterUnfollowListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={"list_id": "123456789", "credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[
@@ -106,6 +108,7 @@ class TwitterFollowListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterFollowListBlock.Input,
output_schema=TwitterFollowListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={"list_id": "123456789", "credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -39,7 +40,6 @@ class TwitterGetListBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to lookup",
placeholder="Enter list ID",
required=True,
)
class Output(BlockSchema):
@@ -64,6 +64,7 @@ class TwitterGetListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetListBlock.Input,
output_schema=TwitterGetListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "84839422",
"credentials": TEST_CREDENTIALS_INPUT,
@@ -184,7 +185,6 @@ class TwitterGetOwnedListsBlock(Block):
user_id: str = SchemaField(
description="The user ID whose owned Lists to retrieve",
placeholder="Enter user ID",
required=True,
)
max_results: int | None = SchemaField(
@@ -222,6 +222,7 @@ class TwitterGetOwnedListsBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetOwnedListsBlock.Input,
output_schema=TwitterGetOwnedListsBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"user_id": "2244994945",
"max_results": 10,

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -45,13 +46,11 @@ class TwitterRemoveListMemberBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to remove the member from",
placeholder="Enter list ID",
required=True,
)
user_id: str = SchemaField(
description="The ID of the user to remove from the List",
placeholder="Enter user ID to remove",
required=True,
)
class Output(BlockSchema):
@@ -67,6 +66,7 @@ class TwitterRemoveListMemberBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterRemoveListMemberBlock.Input,
output_schema=TwitterRemoveListMemberBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "123456789",
"user_id": "987654321",
@@ -120,13 +120,11 @@ class TwitterAddListMemberBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to add the member to",
placeholder="Enter list ID",
required=True,
)
user_id: str = SchemaField(
description="The ID of the user to add to the List",
placeholder="Enter user ID to add",
required=True,
)
class Output(BlockSchema):
@@ -142,6 +140,7 @@ class TwitterAddListMemberBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterAddListMemberBlock.Input,
output_schema=TwitterAddListMemberBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "123456789",
"user_id": "987654321",
@@ -195,7 +194,6 @@ class TwitterGetListMembersBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to get members from",
placeholder="Enter list ID",
required=True,
)
max_results: int | None = SchemaField(
@@ -234,6 +232,7 @@ class TwitterGetListMembersBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetListMembersBlock.Input,
output_schema=TwitterGetListMembersBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "123456789",
"max_results": 2,
@@ -376,7 +375,6 @@ class TwitterGetListMembershipsBlock(Block):
user_id: str = SchemaField(
description="The ID of the user whose List memberships to retrieve",
placeholder="Enter user ID",
required=True,
)
max_results: int | None = SchemaField(
@@ -411,6 +409,7 @@ class TwitterGetListMembershipsBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetListMembershipsBlock.Input,
output_schema=TwitterGetListMembershipsBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"user_id": "123456789",
"max_results": 1,

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -42,7 +43,6 @@ class TwitterGetListTweetsBlock(Block):
list_id: str = SchemaField(
description="The ID of the List whose Tweets you would like to retrieve",
placeholder="Enter list ID",
required=True,
)
max_results: int | None = SchemaField(
@@ -82,6 +82,7 @@ class TwitterGetListTweetsBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetListTweetsBlock.Input,
output_schema=TwitterGetListTweetsBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "84839422",
"max_results": 1,

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -28,7 +29,6 @@ class TwitterDeleteListBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to be deleted",
placeholder="Enter list ID",
required=True,
)
class Output(BlockSchema):
@@ -42,6 +42,7 @@ class TwitterDeleteListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterDeleteListBlock.Input,
output_schema=TwitterDeleteListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={"list_id": "1234567890", "credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
@@ -119,6 +120,7 @@ class TwitterUpdateListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterUpdateListBlock.Input,
output_schema=TwitterUpdateListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"list_id": "1234567890",
"name": "Updated List Name",
@@ -215,6 +217,7 @@ class TwitterCreateListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterCreateListBlock.Input,
output_schema=TwitterCreateListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"name": "New List Name",
"description": "New List Description",

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -39,7 +40,6 @@ class TwitterUnpinListBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to unpin",
placeholder="Enter list ID",
required=True,
)
class Output(BlockSchema):
@@ -53,6 +53,7 @@ class TwitterUnpinListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterUnpinListBlock.Input,
output_schema=TwitterUnpinListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={"list_id": "123456789", "credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
@@ -103,7 +104,6 @@ class TwitterPinListBlock(Block):
list_id: str = SchemaField(
description="The ID of the List to pin",
placeholder="Enter list ID",
required=True,
)
class Output(BlockSchema):
@@ -117,6 +117,7 @@ class TwitterPinListBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterPinListBlock.Input,
output_schema=TwitterPinListBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={"list_id": "123456789", "credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
@@ -186,6 +187,7 @@ class TwitterGetPinnedListsBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetPinnedListsBlock.Input,
output_schema=TwitterGetPinnedListsBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"expansions": None,
"list_fields": None,

View File

@@ -6,6 +6,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -78,6 +79,7 @@ class TwitterSearchSpacesBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterSearchSpacesBlock.Input,
output_schema=TwitterSearchSpacesBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"query": "tech",
"max_results": 1,

View File

@@ -7,6 +7,7 @@ from tweepy.client import Response
from backend.blocks.twitter._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TWITTER_OAUTH_IS_CONFIGURED,
TwitterCredentials,
TwitterCredentialsField,
TwitterCredentialsInput,
@@ -44,7 +45,7 @@ class SpaceList(BaseModel):
space_ids: list[str] = SchemaField(
description="List of Space IDs to lookup (up to 100)",
placeholder="Enter Space IDs",
default=[],
default_factory=list,
advanced=False,
)
@@ -54,7 +55,7 @@ class UserList(BaseModel):
user_ids: list[str] = SchemaField(
description="List of user IDs to lookup their Spaces (up to 100)",
placeholder="Enter user IDs",
default=[],
default_factory=list,
advanced=False,
)
@@ -94,6 +95,7 @@ class TwitterGetSpacesBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetSpacesBlock.Input,
output_schema=TwitterGetSpacesBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"identifier": {
"discriminator": "space_list",
@@ -227,7 +229,6 @@ class TwitterGetSpaceByIdBlock(Block):
space_id: str = SchemaField(
description="Space ID to lookup",
placeholder="Enter Space ID",
required=True,
)
class Output(BlockSchema):
@@ -250,6 +251,7 @@ class TwitterGetSpaceByIdBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetSpaceByIdBlock.Input,
output_schema=TwitterGetSpaceByIdBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"space_id": "1DXxyRYNejbKM",
"credentials": TEST_CREDENTIALS_INPUT,
@@ -389,7 +391,6 @@ class TwitterGetSpaceBuyersBlock(Block):
space_id: str = SchemaField(
description="Space ID to lookup buyers for",
placeholder="Enter Space ID",
required=True,
)
class Output(BlockSchema):
@@ -411,6 +412,7 @@ class TwitterGetSpaceBuyersBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetSpaceBuyersBlock.Input,
output_schema=TwitterGetSpaceBuyersBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"space_id": "1DXxyRYNejbKM",
"credentials": TEST_CREDENTIALS_INPUT,
@@ -517,7 +519,6 @@ class TwitterGetSpaceTweetsBlock(Block):
space_id: str = SchemaField(
description="Space ID to lookup tweets for",
placeholder="Enter Space ID",
required=True,
)
class Output(BlockSchema):
@@ -540,6 +541,7 @@ class TwitterGetSpaceTweetsBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=TwitterGetSpaceTweetsBlock.Input,
output_schema=TwitterGetSpaceTweetsBlock.Output,
disabled=not TWITTER_OAUTH_IS_CONFIGURED,
test_input={
"space_id": "1DXxyRYNejbKM",
"credentials": TEST_CREDENTIALS_INPUT,

Some files were not shown because too many files have changed in this diff Show More