From e199e5479114a1f3d0905f29125225fc9b259bbd Mon Sep 17 00:00:00 2001 From: Nicholas Tindle <nicholas.tindle@agpt.co> Date: Wed, 29 Jan 2025 05:47:01 -0600 Subject: [PATCH 01/12] ci(repo): deepsource config --- .deepsource.toml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 000000000..5ccd3d278 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,18 @@ +version = 1 + +test_patterns = ["test_*.py", "tests/**", "test/**", "*.spec.ts", "*_test.py"] + +exclude_patterns = ["classic/**"] + +[[analyzers]] +name = "javascript" + +[analyzers.meta] +plugins = ["react"] +environment = ["nodejs"] + +[[analyzers]] +name = "python" + +[analyzers.meta] +runtime_version = "3.x.x" From 5e2043b77436f46716d0adcea8c6f57f171b4123 Mon Sep 17 00:00:00 2001 From: Zamil Majdy <zamil.majdy@agpt.co> Date: Wed, 29 Jan 2025 13:17:40 +0100 Subject: [PATCH 02/12] fix(backend): Fix failing test_block_credit_reset when it's executed at the end of 31-days month (#9360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, the test is failing on Jan 29 because 29th Feb does not exist. ### Changes 🏗️ Force use the first day of the month for getting the current time. ### 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: Nicholas Tindle <nicholas.tindle@agpt.co> --- autogpt_platform/backend/test/data/test_credit.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/autogpt_platform/backend/test/data/test_credit.py b/autogpt_platform/backend/test/data/test_credit.py index 92b16e06d..d247d1b9b 100644 --- a/autogpt_platform/backend/test/data/test_credit.py +++ b/autogpt_platform/backend/test/data/test_credit.py @@ -92,17 +92,23 @@ async def test_block_credit_reset(server: SpinTestServer): month2 = 2 # set the calendar to month 2 but use current time from now - user_credit.time_now = lambda: datetime.now(timezone.utc).replace(month=month2) + user_credit.time_now = lambda: datetime.now(timezone.utc).replace( + month=month2, day=1 + ) month2credit = await user_credit.get_credits(DEFAULT_USER_ID) # Month 1 result should only affect month 1 - user_credit.time_now = lambda: datetime.now(timezone.utc).replace(month=month1) + user_credit.time_now = lambda: datetime.now(timezone.utc).replace( + month=month1, day=1 + ) month1credit = await user_credit.get_credits(DEFAULT_USER_ID) await top_up(100) assert await user_credit.get_credits(DEFAULT_USER_ID) == month1credit + 100 # Month 2 balance is unaffected - user_credit.time_now = lambda: datetime.now(timezone.utc).replace(month=month2) + user_credit.time_now = lambda: datetime.now(timezone.utc).replace( + month=month2, day=1 + ) assert await user_credit.get_credits(DEFAULT_USER_ID) == month2credit From 97a26dba7e8e049fc26e97de702ac449ee007d45 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle <nicholas.tindle@agpt.co> Date: Wed, 29 Jan 2025 12:32:35 +0000 Subject: [PATCH 03/12] fix(frontend): add typechecks and fix existing type errors in frontend (#9336) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Clearly explain the need for these changes: --> We want to be able to use typechecking and see errors before they occur. This is a PR to help enable us to do so by fixing the existing errors and hopefully not causing new ones. ### Changes 🏗️ - adds check to ci - disables some code points - fixes lots of type errors - fixes a bunch of the stories <!-- 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] added types - [x] Ran some of the stories - [x] Asked all the relevant parties for manual checks --------- Co-authored-by: SwiftyOS <craigswift13@gmail.com> --- .github/workflows/platform-frontend-ci.yml | 19 + .../src/app/admin/marketplace/page.tsx | 14 +- .../marketplace/(user)/integrations/page.tsx | 1 + .../src/app/marketplace/search/page.tsx | 6 +- .../frontend/src/components/Flow.tsx | 2 +- .../src/components/RunnerUIWrapper.tsx | 3 +- .../components/agptui/AgentInfo.stories.tsx | 3 +- .../components/agptui/AgentTable.stories.tsx | 42 +- .../agptui/AgentTableCard.stories.tsx | 4 +- .../src/components/agptui/AgentTableCard.tsx | 1 + .../agptui/BecomeACreator.stories.tsx | 3 - .../components/agptui/CreatorCard.stories.tsx | 9 +- .../agptui/CreatorLinks.stories.tsx | 49 +- .../agptui/FeaturedStoreCard.stories.tsx | 6 + .../agptui/MobileNavBar.stories.tsx | 4 - .../src/components/agptui/Navbar.stories.tsx | 47 +- .../frontend/src/components/agptui/Navbar.tsx | 7 +- .../src/components/agptui/NavbarLink.tsx | 6 +- .../agptui/ProfileInfoForm.stories.tsx | 93 ++-- .../agptui/PublishAgentSelect.stories.tsx | 22 +- .../agptui/PublishAgentSelectInfo.stories.tsx | 6 + .../agptui/PublishAgentSelectInfo.tsx | 24 +- .../components/agptui/RatingCard.stories.tsx | 27 +- .../src/components/agptui/Status.stories.tsx | 3 + .../composite/AgentsSection.stories.tsx | 61 ++- .../agptui/composite/AgentsSection.tsx | 1 + .../composite/FeaturedCreators.stories.tsx | 10 +- .../composite/FeaturedSection.stories.tsx | 69 +-- .../agptui/composite/PublishAgentPopout.tsx | 27 +- .../feature-flag/feature-flag-provider.tsx | 16 +- .../src/components/node-input-components.tsx | 21 +- .../src/components/ui/form.stories.tsx | 445 +++++++++++++++++- .../frontend/src/components/ui/tooltip.tsx | 8 +- .../frontend/src/hooks/useCopyPaste.ts | 15 +- .../src/lib/autogpt-server-api/types.ts | 14 + .../src/tests/fixtures/test-user.fixture.ts | 41 -- 36 files changed, 825 insertions(+), 304 deletions(-) diff --git a/.github/workflows/platform-frontend-ci.yml b/.github/workflows/platform-frontend-ci.yml index 114b19007..8fc27fde5 100644 --- a/.github/workflows/platform-frontend-ci.yml +++ b/.github/workflows/platform-frontend-ci.yml @@ -37,6 +37,25 @@ jobs: run: | yarn lint + type-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "21" + + - name: Install dependencies + run: | + yarn install --frozen-lockfile + + - name: Run tsc check + run: | + yarn type-check + test: runs-on: ubuntu-latest strategy: diff --git a/autogpt_platform/frontend/src/app/admin/marketplace/page.tsx b/autogpt_platform/frontend/src/app/admin/marketplace/page.tsx index 00fce1078..0dba6c7e9 100644 --- a/autogpt_platform/frontend/src/app/admin/marketplace/page.tsx +++ b/autogpt_platform/frontend/src/app/admin/marketplace/page.tsx @@ -1,18 +1,18 @@ import { withRoleAccess } from "@/lib/withRoleAccess"; import React from "react"; -import { getReviewableAgents } from "@/components/admin/marketplace/actions"; -import AdminMarketplaceAgentList from "@/components/admin/marketplace/AdminMarketplaceAgentList"; -import AdminFeaturedAgentsControl from "@/components/admin/marketplace/AdminFeaturedAgentsControl"; +// import { getReviewableAgents } from "@/components/admin/marketplace/actions"; +// import AdminMarketplaceAgentList from "@/components/admin/marketplace/AdminMarketplaceAgentList"; +// import AdminFeaturedAgentsControl from "@/components/admin/marketplace/AdminFeaturedAgentsControl"; import { Separator } from "@/components/ui/separator"; async function AdminMarketplace() { - const reviewableAgents = await getReviewableAgents(); + // const reviewableAgents = await getReviewableAgents(); return ( <> - <AdminMarketplaceAgentList agents={reviewableAgents.items} /> - <Separator className="my-4" /> - <AdminFeaturedAgentsControl className="mt-4" /> + {/* <AdminMarketplaceAgentList agents={reviewableAgents.items} /> + <Separator className="my-4" /> + <AdminFeaturedAgentsControl className="mt-4" /> */} </> ); } diff --git a/autogpt_platform/frontend/src/app/marketplace/(user)/integrations/page.tsx b/autogpt_platform/frontend/src/app/marketplace/(user)/integrations/page.tsx index fdc0bf2b4..f92d63344 100644 --- a/autogpt_platform/frontend/src/app/marketplace/(user)/integrations/page.tsx +++ b/autogpt_platform/frontend/src/app/marketplace/(user)/integrations/page.tsx @@ -179,6 +179,7 @@ export default function PrivatePage() { { oauth2: "OAuth2 credentials", api_key: "API key", + user_password: "Username & password", }[cred.type] }{" "} - <code>{cred.id}</code> diff --git a/autogpt_platform/frontend/src/app/marketplace/search/page.tsx b/autogpt_platform/frontend/src/app/marketplace/search/page.tsx index 7e3806fcf..717ac96cb 100644 --- a/autogpt_platform/frontend/src/app/marketplace/search/page.tsx +++ b/autogpt_platform/frontend/src/app/marketplace/search/page.tsx @@ -151,11 +151,7 @@ function SearchResults({ <div className="min-h-[500px] max-w-[1440px]"> {showAgents && agentsCount > 0 && ( <div className="mt-[36px]"> - <AgentsSection - agents={agents} - sectionTitle="Agents" - className="font-[Large-Poppins] text-[18px] font-semibold leading-[28px]" - /> + <AgentsSection agents={agents} sectionTitle="Agents" /> </div> )} diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index a8b45453f..df6a6b7b1 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -250,7 +250,7 @@ const FlowEditor: React.FC<{ if (deletedNodeData) { history.push({ type: "DELETE_NODE", - payload: { node: deletedNodeData }, + payload: { node: deletedNodeData.data }, undo: () => addNodes(deletedNodeData), redo: () => deleteElements({ nodes: [{ id: nodeID }] }), }); diff --git a/autogpt_platform/frontend/src/components/RunnerUIWrapper.tsx b/autogpt_platform/frontend/src/components/RunnerUIWrapper.tsx index 8a2b7f798..6187e0158 100644 --- a/autogpt_platform/frontend/src/components/RunnerUIWrapper.tsx +++ b/autogpt_platform/frontend/src/components/RunnerUIWrapper.tsx @@ -9,6 +9,7 @@ import RunnerOutputUI from "./runner-ui/RunnerOutputUI"; import { Node } from "@xyflow/react"; import { filterBlocksByType } from "@/lib/utils"; import { BlockIORootSchema, BlockUIType } from "@/lib/autogpt-server-api/types"; +import { CustomNode } from "./CustomNode"; interface HardcodedValues { name: any; @@ -27,7 +28,7 @@ export interface InputItem { interface RunnerUIWrapperProps { nodes: Node[]; - setNodes: React.Dispatch<React.SetStateAction<Node[]>>; + setNodes: React.Dispatch<React.SetStateAction<CustomNode[]>>; setIsScheduling: React.Dispatch<React.SetStateAction<boolean>>; isRunning: boolean; isScheduling: boolean; diff --git a/autogpt_platform/frontend/src/components/agptui/AgentInfo.stories.tsx b/autogpt_platform/frontend/src/components/agptui/AgentInfo.stories.tsx index c820e4af1..e97988a33 100644 --- a/autogpt_platform/frontend/src/components/agptui/AgentInfo.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/AgentInfo.stories.tsx @@ -10,7 +10,6 @@ const meta = { }, tags: ["autodocs"], argTypes: { - onRunAgent: { action: "run agent clicked" }, name: { control: "text" }, creator: { control: "text" }, shortDescription: { control: "text" }, @@ -28,8 +27,8 @@ type Story = StoryObj<typeof meta>; export const Default: Story = { args: { - onRunAgent: () => console.log("Run agent clicked"), name: "AI Video Generator", + storeListingVersionId: "123", creator: "Toran Richards", shortDescription: "Transform ideas into breathtaking images with this AI-powered Image Generator.", diff --git a/autogpt_platform/frontend/src/components/agptui/AgentTable.stories.tsx b/autogpt_platform/frontend/src/components/agptui/AgentTable.stories.tsx index 85595cc02..b4a0d80fd 100644 --- a/autogpt_platform/frontend/src/components/agptui/AgentTable.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/AgentTable.stories.tsx @@ -15,40 +15,64 @@ type Story = StoryObj<typeof AgentTable>; const sampleAgents: AgentTableRowProps[] = [ { - id: "agent-1", + id: 43, agentName: "Super Coder", description: "An AI agent that writes clean, efficient code", - imageSrc: + imageSrc: [ "https://ddz4ak4pa3d19.cloudfront.net/cache/53/b2/53b2bc7d7900f0e1e60bf64ebf38032d.jpg", + ], dateSubmitted: "2023-05-15", status: "approved", runs: 1500, rating: 4.8, - onEdit: () => console.log("Edit Super Coder"), + agent_id: "43", + agent_version: 1, + sub_heading: "Super Coder", + date_submitted: "2023-05-15", + onEditSubmission: () => console.log("Edit Super Coder"), + onDeleteSubmission: () => console.log("Delete Super Coder"), + selectedAgents: new Set(), + setSelectedAgents: () => {}, }, { - id: "agent-2", + id: 44, agentName: "Data Analyzer", description: "Processes and analyzes large datasets with ease", - imageSrc: + imageSrc: [ "https://ddz4ak4pa3d19.cloudfront.net/cache/40/f7/40f7bc97c952f8df0f9c88d29defe8d4.jpg", + ], dateSubmitted: "2023-05-10", status: "awaiting_review", runs: 1200, rating: 4.5, - onEdit: () => console.log("Edit Data Analyzer"), + agent_id: "44", + agent_version: 1, + sub_heading: "Data Analyzer", + date_submitted: "2023-05-10", + onEditSubmission: () => console.log("Edit Data Analyzer"), + onDeleteSubmission: () => console.log("Delete Data Analyzer"), + selectedAgents: new Set(), + setSelectedAgents: () => {}, }, { - id: "agent-3", + id: 45, agentName: "UI Designer", description: "Creates beautiful and intuitive user interfaces", - imageSrc: + imageSrc: [ "https://ddz4ak4pa3d19.cloudfront.net/cache/14/9e/149ebb9014aa8c0097e72ed89845af0e.jpg", + ], dateSubmitted: "2023-05-05", status: "draft", runs: 800, rating: 4.2, - onEdit: () => console.log("Edit UI Designer"), + agent_id: "45", + agent_version: 1, + sub_heading: "UI Designer", + date_submitted: "2023-05-05", + onEditSubmission: () => console.log("Edit UI Designer"), + onDeleteSubmission: () => console.log("Delete UI Designer"), + selectedAgents: new Set(), + setSelectedAgents: () => {}, }, ]; diff --git a/autogpt_platform/frontend/src/components/agptui/AgentTableCard.stories.tsx b/autogpt_platform/frontend/src/components/agptui/AgentTableCard.stories.tsx index a69603745..babacc26d 100644 --- a/autogpt_platform/frontend/src/components/agptui/AgentTableCard.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/AgentTableCard.stories.tsx @@ -16,13 +16,13 @@ export const Default: Story = { args: { agentName: "Super Coder", description: "An AI agent that writes clean, efficient code", - imageSrc: + imageSrc: [ "https://ddz4ak4pa3d19.cloudfront.net/cache/53/b2/53b2bc7d7900f0e1e60bf64ebf38032d.jpg", + ], dateSubmitted: "2023-05-15", status: "ACTIVE" as StatusType, runs: 1500, rating: 4.8, - onEdit: () => console.log("Edit Super Coder"), }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/AgentTableCard.tsx b/autogpt_platform/frontend/src/components/agptui/AgentTableCard.tsx index 0c948caea..f984cf433 100644 --- a/autogpt_platform/frontend/src/components/agptui/AgentTableCard.tsx +++ b/autogpt_platform/frontend/src/components/agptui/AgentTableCard.tsx @@ -4,6 +4,7 @@ import * as React from "react"; import Image from "next/image"; import { IconStarFilled, IconMore } from "@/components/ui/icons"; import { Status, StatusType } from "./Status"; +import { StoreSubmissionRequest } from "@/lib/autogpt-server-api"; export interface AgentTableCardProps { agent_id: string; diff --git a/autogpt_platform/frontend/src/components/agptui/BecomeACreator.stories.tsx b/autogpt_platform/frontend/src/components/agptui/BecomeACreator.stories.tsx index 58f830d21..763686f3e 100644 --- a/autogpt_platform/frontend/src/components/agptui/BecomeACreator.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/BecomeACreator.stories.tsx @@ -11,7 +11,6 @@ const meta = { tags: ["autodocs"], argTypes: { title: { control: "text" }, - heading: { control: "text" }, description: { control: "text" }, buttonText: { control: "text" }, onButtonClick: { action: "buttonClicked" }, @@ -24,7 +23,6 @@ type Story = StoryObj<typeof meta>; export const Default: Story = { args: { title: "Want to contribute?", - heading: "We're always looking for more Creators!", description: "Join our ever-growing community of hackers and tinkerers", buttonText: "Become a Creator", onButtonClick: () => console.log("Button clicked"), @@ -34,7 +32,6 @@ export const Default: Story = { export const CustomText: Story = { args: { title: "Become a Creator Today!", - heading: "Join Our Creator Community", description: "Share your ideas and build amazing AI agents with us", buttonText: "Start Creating", onButtonClick: () => console.log("Custom button clicked"), diff --git a/autogpt_platform/frontend/src/components/agptui/CreatorCard.stories.tsx b/autogpt_platform/frontend/src/components/agptui/CreatorCard.stories.tsx index d11aad5e7..ee2927545 100644 --- a/autogpt_platform/frontend/src/components/agptui/CreatorCard.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/CreatorCard.stories.tsx @@ -15,7 +15,6 @@ const meta = { bio: { control: "text" }, agentsUploaded: { control: "number" }, onClick: { action: "clicked" }, - avatarSrc: { control: "text" }, }, } satisfies Meta<typeof CreatorCard>; @@ -24,49 +23,49 @@ type Story = StoryObj<typeof meta>; export const Default: Story = { args: { + index: 0, creatorName: "John Doe", creatorImage: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", bio: "AI enthusiast and developer with a passion for creating innovative agents.", agentsUploaded: 15, onClick: () => console.log("Default CreatorCard clicked"), - avatarSrc: "https://github.com/shadcn.png", }, }; export const NewCreator: Story = { args: { + index: 1, creatorName: "Jane Smith", creatorImage: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", bio: "Excited to start my journey in AI agent development!", agentsUploaded: 1, onClick: () => console.log("NewCreator CreatorCard clicked"), - avatarSrc: "https://example.com/avatar2.jpg", }, }; export const ExperiencedCreator: Story = { args: { + index: 2, creatorName: "Alex Johnson", creatorImage: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", bio: "Veteran AI researcher with a focus on natural language processing and machine learning.", agentsUploaded: 50, onClick: () => console.log("ExperiencedCreator CreatorCard clicked"), - avatarSrc: "https://example.com/avatar3.jpg", }, }; export const WithInteraction: Story = { args: { + index: 3, creatorName: "Sam Brown", creatorImage: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", bio: "Exploring the frontiers of AI and its applications in everyday life.", agentsUploaded: 30, onClick: () => console.log("WithInteraction CreatorCard clicked"), - avatarSrc: "https://example.com/avatar4.jpg", }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); diff --git a/autogpt_platform/frontend/src/components/agptui/CreatorLinks.stories.tsx b/autogpt_platform/frontend/src/components/agptui/CreatorLinks.stories.tsx index a26f1d450..ad935f1df 100644 --- a/autogpt_platform/frontend/src/components/agptui/CreatorLinks.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/CreatorLinks.stories.tsx @@ -21,51 +21,48 @@ type Story = StoryObj<typeof meta>; export const Default: Story = { args: { - links: { - website: "https://example.com", - linkedin: "https://linkedin.com/in/johndoe", - github: "https://github.com/johndoe", - other: ["https://twitter.com/johndoe", "https://medium.com/@johndoe"], - }, + links: [ + "https://example.com", + "https://linkedin.com/in/johndoe", + "https://github.com/johndoe", + "https://twitter.com/johndoe", + "https://medium.com/@johndoe", + ], }, }; export const WebsiteOnly: Story = { args: { - links: { - website: "https://example.com", - }, + links: ["https://example.com"], }, }; export const SocialLinks: Story = { args: { - links: { - linkedin: "https://linkedin.com/in/janedoe", - github: "https://github.com/janedoe", - other: ["https://twitter.com/janedoe"], - }, + links: [ + "https://linkedin.com/in/janedoe", + "https://github.com/janedoe", + "https://twitter.com/janedoe", + ], }, }; export const NoLinks: Story = { args: { - links: {}, + links: [], }, }; export const MultipleOtherLinks: Story = { args: { - links: { - website: "https://example.com", - linkedin: "https://linkedin.com/in/creator", - github: "https://github.com/creator", - other: [ - "https://twitter.com/creator", - "https://medium.com/@creator", - "https://youtube.com/@creator", - "https://tiktok.com/@creator", - ], - }, + links: [ + "https://example.com", + "https://linkedin.com/in/creator", + "https://github.com/creator", + "https://twitter.com/creator", + "https://medium.com/@creator", + "https://youtube.com/@creator", + "https://tiktok.com/@creator", + ], }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/FeaturedStoreCard.stories.tsx b/autogpt_platform/frontend/src/components/agptui/FeaturedStoreCard.stories.tsx index 7986075b4..b941ba921 100644 --- a/autogpt_platform/frontend/src/components/agptui/FeaturedStoreCard.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/FeaturedStoreCard.stories.tsx @@ -43,6 +43,7 @@ export const Default: Story = { runs: 50000, rating: 4.7, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, }; @@ -60,6 +61,7 @@ export const LowRating: Story = { runs: 10000, rating: 2.8, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, }; @@ -77,6 +79,7 @@ export const HighRuns: Story = { runs: 1000000, rating: 4.9, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, }; @@ -92,6 +95,7 @@ export const NoCreatorImage: Story = { runs: 75000, rating: 4.5, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, }; @@ -108,6 +112,7 @@ export const ShortDescription: Story = { runs: 50000, rating: 4.2, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, }; @@ -125,6 +130,7 @@ export const WithInteraction: Story = { runs: 200000, rating: 4.6, onClick: () => console.log("Card clicked"), + backgroundColor: "bg-white", }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); diff --git a/autogpt_platform/frontend/src/components/agptui/MobileNavBar.stories.tsx b/autogpt_platform/frontend/src/components/agptui/MobileNavBar.stories.tsx index 053487d5c..09848688b 100644 --- a/autogpt_platform/frontend/src/components/agptui/MobileNavBar.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/MobileNavBar.stories.tsx @@ -13,7 +13,6 @@ const meta = { argTypes: { userName: { control: "text" }, userEmail: { control: "text" }, - activeLink: { control: "text" }, avatarSrc: { control: "text" }, menuItemGroups: { control: "object" }, }, @@ -67,7 +66,6 @@ export const Default: Story = { args: { userName: "John Doe", userEmail: "john.doe@example.com", - activeLink: "/marketplace", avatarSrc: "https://avatars.githubusercontent.com/u/123456789?v=4", menuItemGroups: defaultMenuItemGroups, }, @@ -77,7 +75,6 @@ export const NoAvatar: Story = { args: { userName: "Jane Smith", userEmail: "jane.smith@example.com", - activeLink: "/library", menuItemGroups: defaultMenuItemGroups, }, }; @@ -86,7 +83,6 @@ export const LongUserName: Story = { args: { userName: "Alexander Bartholomew Christopherson III", userEmail: "alexander@example.com", - activeLink: "/builder", avatarSrc: "https://avatars.githubusercontent.com/u/987654321?v=4", menuItemGroups: defaultMenuItemGroups, }, diff --git a/autogpt_platform/frontend/src/components/agptui/Navbar.stories.tsx b/autogpt_platform/frontend/src/components/agptui/Navbar.stories.tsx index 213c8623c..500466c3a 100644 --- a/autogpt_platform/frontend/src/components/agptui/Navbar.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/Navbar.stories.tsx @@ -1,9 +1,10 @@ import type { Meta, StoryObj } from "@storybook/react"; -import Navbar from "./Navbar"; +import { Navbar } from "./Navbar"; import { userEvent, within } from "@storybook/test"; import { IconType } from "../ui/icons"; import { ProfileDetails } from "@/lib/autogpt-server-api/types"; -import { jest } from "@jest/globals"; +// You can't import this here, jest is not available in storybook and will crash it +// import { jest } from "@jest/globals"; // Mock the API responses const mockProfileData: ProfileDetails = { @@ -19,14 +20,14 @@ const mockCreditData = { }; // Mock the API module -jest.mock("@/lib/autogpt-server-api", () => { - return function () { - return { - getStoreProfile: () => Promise.resolve(mockProfileData), - getUserCredit: () => Promise.resolve(mockCreditData), - }; - }; -}); +// jest.mock("@/lib/autogpt-server-api", () => { +// return function () { +// return { +// getStoreProfile: () => Promise.resolve(mockProfileData), +// getUserCredit: () => Promise.resolve(mockCreditData), +// }; +// }; +// }); const meta = { title: "AGPT UI/Navbar", @@ -36,12 +37,12 @@ const meta = { }, tags: ["autodocs"], argTypes: { - isLoggedIn: { control: "boolean" }, - avatarSrc: { control: "text" }, + // isLoggedIn: { control: "boolean" }, + // avatarSrc: { control: "text" }, links: { control: "object" }, - activeLink: { control: "text" }, + // activeLink: { control: "text" }, menuItemGroups: { control: "object" }, - params: { control: { type: "object", defaultValue: { lang: "en" } } }, + // params: { control: { type: "object", defaultValue: { lang: "en" } } }, }, } satisfies Meta<typeof Navbar>; @@ -90,11 +91,11 @@ const defaultLinks = [ export const Default: Story = { args: { - params: { lang: "en" }, - isLoggedIn: true, + // params: { lang: "en" }, + // isLoggedIn: true, links: defaultLinks, - activeLink: "/marketplace", - avatarSrc: mockProfileData.avatar_url, + // activeLink: "/marketplace", + // avatarSrc: mockProfileData.avatar_url, menuItemGroups: defaultMenuItemGroups, }, }; @@ -102,21 +103,21 @@ export const Default: Story = { export const WithActiveLink: Story = { args: { ...Default.args, - activeLink: "/library", + // activeLink: "/library", }, }; export const LongUserName: Story = { args: { ...Default.args, - avatarSrc: "https://avatars.githubusercontent.com/u/987654321?v=4", + // avatarSrc: "https://avatars.githubusercontent.com/u/987654321?v=4", }, }; export const NoAvatar: Story = { args: { ...Default.args, - avatarSrc: undefined, + // avatarSrc: undefined, }, }; @@ -138,8 +139,8 @@ export const WithInteraction: Story = { export const NotLoggedIn: Story = { args: { ...Default.args, - isLoggedIn: false, - avatarSrc: undefined, + // isLoggedIn: false, + // avatarSrc: undefined, }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/Navbar.tsx b/autogpt_platform/frontend/src/components/agptui/Navbar.tsx index 9c3c260b9..dd2307961 100644 --- a/autogpt_platform/frontend/src/components/agptui/Navbar.tsx +++ b/autogpt_platform/frontend/src/components/agptui/Navbar.tsx @@ -63,12 +63,7 @@ export const Navbar = async ({ links, menuItemGroups }: NavbarProps) => { <IconAutoGPTLogo className="h-full w-full" /> </div> {links.map((link) => ( - <NavbarLink - key={link.name} - name={link.name} - href={link.href} - className="font-poppins text-[20px] leading-[28px]" - /> + <NavbarLink key={link.name} name={link.name} href={link.href} /> ))} </div> {/* Profile section */} diff --git a/autogpt_platform/frontend/src/components/agptui/NavbarLink.tsx b/autogpt_platform/frontend/src/components/agptui/NavbarLink.tsx index 5bfe77d86..894bc04f2 100644 --- a/autogpt_platform/frontend/src/components/agptui/NavbarLink.tsx +++ b/autogpt_platform/frontend/src/components/agptui/NavbarLink.tsx @@ -20,7 +20,11 @@ export const NavbarLink = ({ name, href }: NavbarLinkProps) => { const activeLink = "/" + (parts.length > 2 ? parts[2] : parts[1]); return ( - <Link href={href} data-testid={`navbar-link-${name.toLowerCase()}`}> + <Link + href={href} + data-testid={`navbar-link-${name.toLowerCase()}`} + className="font-poppins text-[20px] leading-[28px]" + > <div className={`h-[48px] px-5 py-4 ${ activeLink === href diff --git a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx index 2df304f3c..479bfb6a8 100644 --- a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx @@ -9,29 +9,33 @@ const meta: Meta<typeof ProfileInfoForm> = { }, tags: ["autodocs"], argTypes: { - displayName: { - control: "text", - description: "The display name of the user", - }, - handle: { - control: "text", - description: "The user's handle/username", - }, - bio: { - control: "text", - description: "User's biography text", - }, - profileImage: { - control: "text", - description: "URL of the user's profile image", - }, - links: { + profile: { control: "object", - description: "Array of social media links", - }, - categories: { - control: "object", - description: "Array of selected categories", + description: "The profile details of the user", + displayName: { + control: "text", + description: "The display name of the user", + }, + handle: { + control: "text", + description: "The user's handle/username", + }, + bio: { + control: "text", + description: "User's biography text", + }, + profileImage: { + control: "text", + description: "URL of the user's profile image", + }, + links: { + control: "object", + description: "Array of social media links", + }, + categories: { + control: "object", + description: "Array of selected categories", + }, }, }, }; @@ -41,30 +45,35 @@ type Story = StoryObj<typeof ProfileInfoForm>; export const Empty: Story = { args: { - displayName: "", - handle: "", - bio: "", - profileImage: undefined, - links: [], - categories: [], + profile: { + name: "", + username: "", + description: "", + avatar_url: "", + links: [], + top_categories: [], + agent_rating: 0, + agent_runs: 0, + }, }, }; export const Filled: Story = { args: { - displayName: "Olivia Grace", - handle: "@ograce1421", - bio: "Our agents are designed to bring happiness and positive vibes to your daily routine. Each template helps you create and live more efficiently.", - profileImage: "https://via.placeholder.com/130x130", - links: [ - { id: 1, url: "www.websitelink.com" }, - { id: 2, url: "twitter.com/oliviagrace" }, - { id: 3, url: "github.com/ograce" }, - ], - categories: [ - { id: 1, name: "Entertainment" }, - { id: 2, name: "Blog" }, - { id: 3, name: "Content creation" }, - ], + profile: { + name: "Olivia Grace", + username: "@ograce1421", + description: + "Our agents are designed to bring happiness and positive vibes to your daily routine. Each template helps you create and live more efficiently.", + avatar_url: "https://via.placeholder.com/130x130", + links: [ + "www.websitelink.com", + "twitter.com/oliviagrace", + "github.com/ograce", + ], + top_categories: ["Entertainment", "Blog", "Content creation"], + agent_rating: 4.5, + agent_runs: 100, + }, }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelect.stories.tsx b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelect.stories.tsx index c9ddf9f7e..de12c560b 100644 --- a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelect.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelect.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react"; -import { PublishAgentSelect } from "./PublishAgentSelect"; +import { Agent, PublishAgentSelect } from "./PublishAgentSelect"; const meta: Meta<typeof PublishAgentSelect> = { title: "AGPT UI/Publish Agent Select", @@ -10,51 +10,69 @@ const meta: Meta<typeof PublishAgentSelect> = { export default meta; type Story = StoryObj<typeof PublishAgentSelect>; -const mockAgents = [ +const mockAgents: Agent[] = [ { name: "SEO Optimizer", lastEdited: "2 days ago", imageSrc: "https://picsum.photos/seed/seo/300/200", + id: "1", + version: 1, }, { name: "Content Writer", lastEdited: "5 days ago", imageSrc: "https://picsum.photos/seed/writer/300/200", + id: "1", + version: 1, }, { name: "Data Analyzer", lastEdited: "1 week ago", imageSrc: "https://picsum.photos/seed/data/300/200", + id: "1", + version: 1, }, { name: "Image Recognition", lastEdited: "2 weeks ago", imageSrc: "https://picsum.photos/seed/image/300/200", + id: "1", + version: 1, }, { name: "Chatbot Assistant", lastEdited: "3 weeks ago", imageSrc: "https://picsum.photos/seed/chat/300/200", + id: "1", + version: 1, }, { name: "Code Generator", lastEdited: "1 month ago", imageSrc: "https://picsum.photos/seed/code/300/200", + id: "1", + version: 1, }, { name: "AI Translator", lastEdited: "6 weeks ago", imageSrc: "https://picsum.photos/seed/translate/300/200", + id: "1", + version: 1, }, { name: "Voice Assistant", lastEdited: "2 months ago", imageSrc: "https://picsum.photos/seed/voice/300/200", + id: "1", + version: 1, }, { name: "Data Visualizer", lastEdited: "3 months ago", imageSrc: "https://picsum.photos/seed/visualize/300/200", + id: "1", + version: 1, }, ]; diff --git a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.stories.tsx b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.stories.tsx index a7cf251d3..f48f84904 100644 --- a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.stories.tsx @@ -29,6 +29,8 @@ export const Filled: Story = { args: { ...Default.args, initialData: { + agent_id: "1", + slug: "super-seo-optimizer", title: "Super SEO Optimizer", subheader: "Boost your website's search engine rankings", thumbnailSrc: "https://picsum.photos/seed/seo/500/350", @@ -44,6 +46,8 @@ export const ThreeImages: Story = { args: { ...Default.args, initialData: { + agent_id: "1", + slug: "super-seo-optimizer", title: "Multi-Image Agent", subheader: "Showcasing multiple images", thumbnailSrc: "https://picsum.photos/seed/initial/500/350", @@ -63,6 +67,8 @@ export const SixImages: Story = { args: { ...Default.args, initialData: { + agent_id: "1", + slug: "super-seo-optimizer", title: "Gallery Agent", subheader: "Showcasing a gallery of images", thumbnailSrc: "https://picsum.photos/seed/gallery1/500/350", diff --git a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.tsx b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.tsx index 7c5b273db..081c2f3bc 100644 --- a/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.tsx +++ b/autogpt_platform/frontend/src/components/agptui/PublishAgentSelectInfo.tsx @@ -6,6 +6,18 @@ import { Button } from "../agptui/Button"; import { IconClose, IconPlus } from "../ui/icons"; import BackendAPI from "@/lib/autogpt-server-api"; +export interface PublishAgentInfoInitialData { + agent_id: string; + title: string; + subheader: string; + slug: string; + thumbnailSrc: string; + youtubeLink: string; + category: string; + description: string; + additionalImages?: string[]; +} + interface PublishAgentInfoProps { onBack: () => void; onSubmit: ( @@ -18,17 +30,7 @@ interface PublishAgentInfoProps { categories: string[], ) => void; onClose: () => void; - initialData?: { - agent_id: string; - title: string; - subheader: string; - slug: string; - thumbnailSrc: string; - youtubeLink: string; - category: string; - description: string; - additionalImages?: string[]; - }; + initialData?: PublishAgentInfoInitialData; } export const PublishAgentInfo: React.FC<PublishAgentInfoProps> = ({ diff --git a/autogpt_platform/frontend/src/components/agptui/RatingCard.stories.tsx b/autogpt_platform/frontend/src/components/agptui/RatingCard.stories.tsx index 64b7a2f55..c122b7f56 100644 --- a/autogpt_platform/frontend/src/components/agptui/RatingCard.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/RatingCard.stories.tsx @@ -16,29 +16,32 @@ type Story = StoryObj<typeof meta>; export const Default: Story = { args: { agentName: "Test Agent", - onSubmit: (rating) => { - console.log("Rating submitted:", rating); - }, - onClose: () => { - console.log("Rating card closed"); - }, + // onSubmit: (rating) => { + // console.log("Rating submitted:", rating); + // }, + // onClose: () => { + // console.log("Rating card closed"); + // }, + storeListingVersionId: "1", }, }; export const LongAgentName: Story = { args: { agentName: "Very Long Agent Name That Might Need Special Handling", - onSubmit: (rating) => { - console.log("Rating submitted:", rating); - }, - onClose: () => { - console.log("Rating card closed"); - }, + // onSubmit: (rating) => { + // console.log("Rating submitted:", rating); + // }, + // onClose: () => { + // console.log("Rating card closed"); + // }, + storeListingVersionId: "1", }, }; export const WithoutCallbacks: Story = { args: { agentName: "Test Agent", + storeListingVersionId: "1", }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/Status.stories.tsx b/autogpt_platform/frontend/src/components/agptui/Status.stories.tsx index b4bb9e756..390dc0b50 100644 --- a/autogpt_platform/frontend/src/components/agptui/Status.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/Status.stories.tsx @@ -44,6 +44,9 @@ export const Rejected: Story = { }; export const AllStatuses: Story = { + args: { + status: "draft" as StatusType, + }, render: () => ( <div className="flex flex-col gap-4"> <Status status="draft" /> diff --git a/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.stories.tsx b/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.stories.tsx index f193f7bc7..7e23f22e6 100644 --- a/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react"; -import { AgentsSection } from "./AgentsSection"; +import { Agent, AgentsSection } from "./AgentsSection"; import { userEvent, within, expect } from "@storybook/test"; const meta = { @@ -16,7 +16,7 @@ const meta = { argTypes: { sectionTitle: { control: "text" }, agents: { control: "object" }, - onCardClick: { action: "clicked" }, + // onCardClick: { action: "clicked" }, }, } satisfies Meta<typeof AgentsSection>; @@ -25,41 +25,50 @@ type Story = StoryObj<typeof meta>; const mockTopAgents = [ { - agentName: "SEO Optimizer Pro", - agentImage: + agent_name: "SEO Optimizer Pro", + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", description: "Boost your website's search engine rankings with our advanced AI-powered SEO optimization tool.", runs: 50000, rating: 4.7, - avatarSrc: "https://example.com/avatar1.jpg", + creator_avatar: "https://example.com/avatar1.jpg", + slug: "seo-optimizer-pro", + creator: "John Doe", + sub_heading: "SEO Expert", }, { - agentName: "Content Writer AI", - agentImage: + agent_name: "Content Writer AI", + agent_image: "https://upload.wikimedia.org/wikipedia/commons/c/c5/Big_buck_bunny_poster_big.jpg", description: "Generate high-quality, engaging content for your blog, social media, or marketing campaigns.", runs: 75000, rating: 4.5, - avatarSrc: "https://example.com/avatar2.jpg", + creator_avatar: "https://example.com/avatar2.jpg", + slug: "content-writer-ai", + creator: "Jane Doe", + sub_heading: "Content Writer", }, { - agentName: "Data Analyzer Lite", - agentImage: + agent_name: "Data Analyzer Lite", + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", description: "A basic tool for analyzing small to medium-sized datasets.", runs: 10000, rating: 3.8, - avatarSrc: "https://example.com/avatar3.jpg", + creator_avatar: "https://example.com/avatar3.jpg", + slug: "data-analyzer-lite", + creator: "John Doe", + sub_heading: "Data Analyst", }, -]; +] satisfies Agent[]; export const Default: Story = { args: { sectionTitle: "Top Agents", agents: mockTopAgents, - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; @@ -67,7 +76,7 @@ export const SingleAgent: Story = { args: { sectionTitle: "Top Agents", agents: [mockTopAgents[0]], - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; @@ -75,7 +84,7 @@ export const NoAgents: Story = { args: { sectionTitle: "Top Agents", agents: [], - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; @@ -83,7 +92,7 @@ export const WithInteraction: Story = { args: { sectionTitle: "Top Agents", agents: mockTopAgents, - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); @@ -107,6 +116,9 @@ export const MultiRowAgents: Story = { runs: 60000, rating: 4.6, creator_avatar: "https://example.com/avatar4.jpg", + slug: "image-recognition-ai", + creator: "John Doe", + sub_heading: "Image Recognition", }, { agent_name: "Natural Language Processor", @@ -117,6 +129,9 @@ export const MultiRowAgents: Story = { runs: 80000, rating: 4.8, creator_avatar: "https://example.com/avatar5.jpg", + slug: "natural-language-processor", + creator: "John Doe", + sub_heading: "Natural Language Processing", }, { agent_name: "Sentiment Analyzer", @@ -127,6 +142,9 @@ export const MultiRowAgents: Story = { runs: 45000, rating: 4.3, creator_avatar: "https://example.com/avatar6.jpg", + slug: "sentiment-analyzer", + creator: "John Doe", + sub_heading: "Sentiment Analysis", }, { agent_name: "Chatbot Builder", @@ -137,6 +155,9 @@ export const MultiRowAgents: Story = { runs: 55000, rating: 4.4, creator_avatar: "https://example.com/avatar7.jpg", + slug: "chatbot-builder", + creator: "John Doe", + sub_heading: "Chatbot Developer", }, { agent_name: "Predictive Analytics Tool", @@ -147,6 +168,9 @@ export const MultiRowAgents: Story = { runs: 40000, rating: 4.2, creator_avatar: "https://example.com/avatar8.jpg", + slug: "predictive-analytics-tool", + creator: "John Doe", + sub_heading: "Predictive Analytics", }, { agent_name: "Text-to-Speech Converter", @@ -157,9 +181,12 @@ export const MultiRowAgents: Story = { runs: 35000, rating: 4.1, creator_avatar: "https://example.com/avatar9.jpg", + slug: "text-to-speech-converter", + creator: "John Doe", + sub_heading: "Text-to-Speech", }, ], - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.tsx b/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.tsx index 91cbfb1b0..2a2c00480 100644 --- a/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.tsx +++ b/autogpt_platform/frontend/src/components/agptui/composite/AgentsSection.tsx @@ -8,6 +8,7 @@ import { CarouselItem, } from "@/components/ui/carousel"; import { useRouter } from "next/navigation"; +import { cn } from "@/lib/utils"; export interface Agent { slug: string; diff --git a/autogpt_platform/frontend/src/components/agptui/composite/FeaturedCreators.stories.tsx b/autogpt_platform/frontend/src/components/agptui/composite/FeaturedCreators.stories.tsx index 19300e0e3..96c184ae7 100644 --- a/autogpt_platform/frontend/src/components/agptui/composite/FeaturedCreators.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/composite/FeaturedCreators.stories.tsx @@ -15,7 +15,7 @@ const meta = { tags: ["autodocs"], argTypes: { featuredCreators: { control: "object" }, - onCardClick: { action: "cardClicked" }, + // onCardClick: { action: "cardClicked" }, }, } satisfies Meta<typeof FeaturedCreators>; @@ -64,14 +64,14 @@ const defaultCreators = [ export const Default: Story = { args: { featuredCreators: defaultCreators, - onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), + // onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), }, }; export const SingleCreator: Story = { args: { featuredCreators: [defaultCreators[0]], - onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), + // onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), }, }; @@ -98,14 +98,14 @@ export const ManyCreators: Story = { num_agents: 25, }, ], - onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), + // onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), }, }; export const WithInteraction: Story = { args: { featuredCreators: defaultCreators, - onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), + // onCardClick: (creatorName) => console.log(`Clicked on ${creatorName}`), }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); diff --git a/autogpt_platform/frontend/src/components/agptui/composite/FeaturedSection.stories.tsx b/autogpt_platform/frontend/src/components/agptui/composite/FeaturedSection.stories.tsx index 664bbee8c..b57b6477f 100644 --- a/autogpt_platform/frontend/src/components/agptui/composite/FeaturedSection.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/composite/FeaturedSection.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react"; -import { FeaturedSection } from "./FeaturedSection"; +import { FeaturedAgent, FeaturedSection } from "./FeaturedSection"; import { userEvent, within, expect } from "@storybook/test"; const meta = { @@ -15,7 +15,7 @@ const meta = { tags: ["autodocs"], argTypes: { featuredAgents: { control: "object" }, - onCardClick: { action: "clicked" }, + // onCardClick: { action: "clicked" }, }, } satisfies Meta<typeof FeaturedSection>; @@ -24,97 +24,102 @@ type Story = StoryObj<typeof meta>; const mockFeaturedAgents = [ { - agentName: "Personalized Morning Coffee Newsletter example of three lines", - subHeading: + agent_name: "Personalized Morning Coffee Newsletter example of three lines", + sub_heading: "Transform ideas into breathtaking images with this AI-powered Image Generator.", - creatorName: "AI Solutions Inc.", + creator: "AI Solutions Inc.", description: "Elevate your web content with this powerful AI Webpage Copy Improver. Designed for marketers, SEO specialists, and web developers, this tool analyses and enhances website copy for maximum impact. Using advanced language models, it optimizes text for better clarity, SEO performance, and increased conversion rates.", runs: 50000, rating: 4.7, - agentImage: + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", - creatorImage: + creator_avatar: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", + slug: "personalized-morning-coffee-newsletter", }, { - agentName: "Data Analyzer Lite", - subHeading: "Basic data analysis tool", - creatorName: "DataTech", + agent_name: "Data Analyzer Lite", + sub_heading: "Basic data analysis tool", + creator: "DataTech", description: "A lightweight data analysis tool for basic data processing needs.", runs: 10000, rating: 2.8, - agentImage: + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", - creatorImage: + creator_avatar: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", + slug: "data-analyzer-lite", }, { - agentName: "CodeAssist AI", - subHeading: "Your AI coding companion", - creatorName: "DevTools Co.", + agent_name: "CodeAssist AI", + sub_heading: "Your AI coding companion", + creator: "DevTools Co.", description: "An intelligent coding assistant that helps developers write better code faster.", runs: 1000000, rating: 4.9, - agentImage: + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", - creatorImage: + creator_avatar: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", + slug: "codeassist-ai", }, { - agentName: "MultiTasker", - subHeading: "All-in-one productivity suite", - creatorName: "Productivity Plus", + agent_name: "MultiTasker", + sub_heading: "All-in-one productivity suite", + creator: "Productivity Plus", description: "A comprehensive productivity suite that combines task management, note-taking, and project planning into one seamless interface. Features include smart task prioritization, automated scheduling, and AI-powered insights to help you work more efficiently.", runs: 75000, rating: 4.5, - agentImage: + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", - creatorImage: + creator_avatar: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", + slug: "multitasker", }, { - agentName: "QuickTask", - subHeading: "Fast task automation", - creatorName: "EfficientWorks", + agent_name: "QuickTask", + sub_heading: "Fast task automation", + creator: "EfficientWorks", description: "Simple and efficient task automation tool.", runs: 50000, rating: 4.2, - agentImage: + agent_image: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", - creatorImage: + creator_avatar: "https://framerusercontent.com/images/KCIpxr9f97EGJgpaoqnjKsrOPwI.jpg", + slug: "quicktask", }, -]; +] satisfies FeaturedAgent[]; export const Default: Story = { args: { featuredAgents: mockFeaturedAgents, - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; export const SingleAgent: Story = { args: { featuredAgents: [mockFeaturedAgents[0]], - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; export const NoAgents: Story = { args: { featuredAgents: [], - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, }; export const WithInteraction: Story = { args: { featuredAgents: mockFeaturedAgents, - onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), + // onCardClick: (agentName: string) => console.log(`Clicked on ${agentName}`), }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); diff --git a/autogpt_platform/frontend/src/components/agptui/composite/PublishAgentPopout.tsx b/autogpt_platform/frontend/src/components/agptui/composite/PublishAgentPopout.tsx index 56cdac79e..8842f6dbb 100644 --- a/autogpt_platform/frontend/src/components/agptui/composite/PublishAgentPopout.tsx +++ b/autogpt_platform/frontend/src/components/agptui/composite/PublishAgentPopout.tsx @@ -8,7 +8,10 @@ import { PopoverAnchor, } from "@/components/ui/popover"; import { PublishAgentSelect } from "../PublishAgentSelect"; -import { PublishAgentInfo } from "../PublishAgentSelectInfo"; +import { + PublishAgentInfo, + PublishAgentInfoInitialData, +} from "../PublishAgentSelectInfo"; import { PublishAgentAwaitingReview } from "../PublishAgentAwaitingReview"; import { Button } from "../Button"; import { @@ -45,17 +48,17 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({ ); const [myAgents, setMyAgents] = React.useState<MyAgentsResponse | null>(null); const [selectedAgent, setSelectedAgent] = React.useState<string | null>(null); - const [initialData, setInitialData] = React.useState<{ - agent_id: string; - title: string; - subheader: string; - slug: string; - thumbnailSrc: string; - youtubeLink: string; - category: string; - description: string; - additionalImages?: string[]; - } | null>(null); + const [initialData, setInitialData] = + React.useState<PublishAgentInfoInitialData>({ + agent_id: "", + title: "", + subheader: "", + slug: "", + thumbnailSrc: "", + youtubeLink: "", + category: "", + description: "", + }); const [publishData, setPublishData] = React.useState<StoreSubmissionRequest>(submissionData); const [selectedAgentId, setSelectedAgentId] = React.useState<string | null>( diff --git a/autogpt_platform/frontend/src/components/feature-flag/feature-flag-provider.tsx b/autogpt_platform/frontend/src/components/feature-flag/feature-flag-provider.tsx index 682392a7e..a9b133ff9 100644 --- a/autogpt_platform/frontend/src/components/feature-flag/feature-flag-provider.tsx +++ b/autogpt_platform/frontend/src/components/feature-flag/feature-flag-provider.tsx @@ -2,16 +2,14 @@ import { LDProvider } from "launchdarkly-react-client-sdk"; import { ReactNode } from "react"; export function LaunchDarklyProvider({ children }: { children: ReactNode }) { - if ( - process.env.NEXT_PUBLIC_LAUNCHDARKLY_ENABLED === true && - !process.env.NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_ID - ) { + const clientId = process.env.NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_ID; + const enabled = process.env.NEXT_PUBLIC_LAUNCHDARKLY_ENABLED === "true"; + + if (!enabled) return <>{children}</>; + + if (!clientId) { throw new Error("NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_ID is not defined"); } - return ( - <LDProvider clientSideID={process.env.NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_ID}> - {children} - </LDProvider> - ); + return <LDProvider clientSideID={clientId}>{children}</LDProvider>; } diff --git a/autogpt_platform/frontend/src/components/node-input-components.tsx b/autogpt_platform/frontend/src/components/node-input-components.tsx index 66086873b..e863bd8c8 100644 --- a/autogpt_platform/frontend/src/components/node-input-components.tsx +++ b/autogpt_platform/frontend/src/components/node-input-components.tsx @@ -41,7 +41,6 @@ import { LocalValuedInput } from "./ui/input"; import NodeHandle from "./NodeHandle"; import { ConnectionData } from "./CustomNode"; import { CredentialsInput } from "./integrations/credentials-input"; -import { MultiSelect } from "./ui/multiselect-input"; type NodeObjectInputTreeProps = { nodeId: string; @@ -663,20 +662,6 @@ export const NodeGenericInputField: FC<{ handleInputClick={handleInputClick} /> ); - case "object": - return ( - <NodeKeyValueInput - nodeId={nodeId} - selfKey={propKey} - schema={propSchema} - entries={currentValue} - errors={errors} - className={className} - displayName={displayName} - connections={connections} - handleInputChange={handleInputChange} - /> - ); default: console.warn( `Schema for '${propKey}' specifies unknown type:`, @@ -968,10 +953,8 @@ const NodeKeyValueInput: FC<{ > <div> {keyValuePairs.map(({ key, value }, index) => ( - /* - The `index` is used as a DOM key instead of the actual `key` - because the `key` can change with each input, causing the input to lose focus. - */ + // The `index` is used as a DOM key instead of the actual `key` + // because the `key` can change with each input, causing the input to lose focus. <div key={index}> <NodeHandle keyName={getEntryKey(key)} diff --git a/autogpt_platform/frontend/src/components/ui/form.stories.tsx b/autogpt_platform/frontend/src/components/ui/form.stories.tsx index e10797b82..adfc78625 100644 --- a/autogpt_platform/frontend/src/components/ui/form.stories.tsx +++ b/autogpt_platform/frontend/src/components/ui/form.stories.tsx @@ -1,6 +1,14 @@ import React from "react"; import type { Meta, StoryObj } from "@storybook/react"; -import { useForm } from "react-hook-form"; +import { + FieldValues, + InternalFieldName, + RegisterOptions, + useForm, + UseFormHandleSubmit, + UseFormRegister, + UseFormWatch, +} from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -72,10 +80,300 @@ const FormExample = () => { }; export const Default: Story = { + args: { + children: <FormExample />, + // watch(callback: (data, { name, type }) => void, defaultValues?: {[key:string]: unknown}): { unsubscribe: () => void } + watch: (name?: any, defaultValue?: any) => { + if (typeof name === "function") { + return { unsubscribe: () => {} }; + } + return defaultValue || {}; + }, + getValues: () => [], + getFieldState: (name, formState) => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + setValue: () => {}, + trigger: async () => true, + reset: () => {}, + clearErrors: () => {}, + formState: { + errors: {}, + isDirty: false, + isSubmitting: false, + isValid: true, + isLoading: false, + isSubmitted: false, + isSubmitSuccessful: false, + isValidating: false, + defaultValues: {}, + dirtyFields: {}, + touchedFields: {}, + disabled: false, + submitCount: 0, + validatingFields: {}, + }, + resetField: () => {}, + handleSubmit: (() => { + return async (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }; + }) as unknown as UseFormHandleSubmit<any>, + unregister: () => {}, + control: { + _subjects: { + state: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + array: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + values: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + }, + _reset: () => {}, + _resetDefaultValues: () => {}, + _getFieldArray: () => [], + _setErrors: () => {}, + _updateDisabledField: () => {}, + _executeSchema: () => Promise.resolve({ errors: {} }), + handleSubmit: (onSubmit?: any) => (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }, + unregister: () => {}, + getFieldState: () => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + _disableForm: () => {}, + _removeUnmounted: () => {}, + _names: { + mount: new Set(), + array: new Set(), + watch: new Set(), + unMount: new Set(), + disabled: new Set(), + }, + _state: { mount: false, watch: false, action: false }, + _options: { mode: "onSubmit", defaultValues: {} }, + _formState: { + isDirty: false, + isSubmitted: false, + submitCount: 0, + isLoading: false, + isSubmitSuccessful: false, + isSubmitting: false, + isValidating: false, + isValid: true, + disabled: false, + dirtyFields: {}, + touchedFields: {}, + errors: {}, + validatingFields: {}, + }, + _fields: {}, + + _defaultValues: {}, + _formValues: {}, + _proxyFormState: { + isDirty: false, + dirtyFields: false, + touchedFields: false, + errors: false, + isValid: true, + isValidating: false, + validatingFields: false, + }, + _getDirty: () => false, + _updateValid: () => {}, + _updateFieldArray: () => {}, + _getWatch: () => ({}), + _updateFormState: () => {}, + register: ((name: string, options?: RegisterOptions<any>) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as unknown as UseFormRegister<any>, + }, + register: ((name: string) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as UseFormRegister<FieldValues>, + setFocus: () => {}, + }, render: () => <FormExample />, }; export const WithError: Story = { + args: { + children: <FormExample />, + // watch(callback: (data, { name, type }) => void, defaultValues?: {[key:string]: unknown}): { unsubscribe: () => void } + watch: (name?: any, defaultValue?: any) => { + if (typeof name === "function") { + return { unsubscribe: () => {} }; + } + return defaultValue || {}; + }, + getValues: () => [], + getFieldState: (name, formState) => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + setValue: () => {}, + trigger: async () => true, + reset: () => {}, + clearErrors: () => {}, + formState: { + errors: {}, + isDirty: false, + isSubmitting: false, + isValid: true, + isLoading: false, + isSubmitted: false, + isSubmitSuccessful: false, + isValidating: false, + defaultValues: {}, + dirtyFields: {}, + touchedFields: {}, + disabled: false, + submitCount: 0, + validatingFields: {}, + }, + resetField: () => {}, + handleSubmit: (() => { + return async (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }; + }) as unknown as UseFormHandleSubmit<any>, + unregister: () => {}, + control: { + _subjects: { + state: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + array: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + values: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + }, + _reset: () => {}, + _resetDefaultValues: () => {}, + _getFieldArray: () => [], + _setErrors: () => {}, + _updateDisabledField: () => {}, + _executeSchema: () => Promise.resolve({ errors: {} }), + handleSubmit: (onSubmit?: any) => (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }, + unregister: () => {}, + getFieldState: () => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + _disableForm: () => {}, + _removeUnmounted: () => {}, + _names: { + mount: new Set(), + array: new Set(), + watch: new Set(), + unMount: new Set(), + disabled: new Set(), + }, + _state: { mount: false, watch: false, action: false }, + _options: { mode: "onSubmit", defaultValues: {} }, + _formState: { + isDirty: false, + isSubmitted: false, + submitCount: 0, + isLoading: false, + isSubmitSuccessful: false, + isSubmitting: false, + isValidating: false, + isValid: true, + disabled: false, + dirtyFields: {}, + touchedFields: {}, + errors: {}, + validatingFields: {}, + }, + _fields: {}, + + _defaultValues: {}, + _formValues: {}, + _proxyFormState: { + isDirty: false, + dirtyFields: false, + touchedFields: false, + errors: false, + isValid: true, + isValidating: false, + validatingFields: false, + }, + _getDirty: () => false, + _updateValid: () => {}, + _updateFieldArray: () => {}, + _getWatch: () => ({}), + _updateFormState: () => {}, + register: ((name: string, options?: RegisterOptions<any>) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as unknown as UseFormRegister<any>, + }, + register: ((name: string) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as UseFormRegister<FieldValues>, + setFocus: () => {}, + }, render: () => { const FormWithError = () => { const form = useForm<z.infer<typeof formSchema>>({ @@ -126,6 +424,151 @@ export const WithError: Story = { }; export const WithDefaultValue: Story = { + args: { + children: <FormExample />, + // watch(callback: (data, { name, type }) => void, defaultValues?: {[key:string]: unknown}): { unsubscribe: () => void } + watch: (name?: any, defaultValue?: any) => { + if (typeof name === "function") { + return { unsubscribe: () => {} }; + } + return defaultValue || {}; + }, + getValues: () => [], + getFieldState: (name, formState) => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + setValue: () => {}, + trigger: async () => true, + reset: () => {}, + clearErrors: () => {}, + formState: { + errors: {}, + isDirty: false, + isSubmitting: false, + isValid: true, + isLoading: false, + isSubmitted: false, + isSubmitSuccessful: false, + isValidating: false, + defaultValues: {}, + dirtyFields: {}, + touchedFields: {}, + disabled: false, + submitCount: 0, + validatingFields: {}, + }, + resetField: () => {}, + handleSubmit: (() => { + return async (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }; + }) as unknown as UseFormHandleSubmit<any>, + unregister: () => {}, + control: { + _subjects: { + state: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + array: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + values: { + observers: [], + subscribe: () => ({ unsubscribe: () => {} }), + unsubscribe: () => {}, + next: () => {}, + }, + }, + _reset: () => {}, + _resetDefaultValues: () => {}, + _getFieldArray: () => [], + _setErrors: () => {}, + _updateDisabledField: () => {}, + _executeSchema: () => Promise.resolve({ errors: {} }), + handleSubmit: (onSubmit?: any) => (e?: React.BaseSyntheticEvent) => { + e?.preventDefault(); + return Promise.resolve(); + }, + unregister: () => {}, + getFieldState: () => ({ + invalid: false, + isDirty: false, + isTouched: false, + isValidating: false, + error: undefined, + }), + setError: () => {}, + _disableForm: () => {}, + _removeUnmounted: () => {}, + _names: { + mount: new Set(), + array: new Set(), + watch: new Set(), + unMount: new Set(), + disabled: new Set(), + }, + _state: { mount: false, watch: false, action: false }, + _options: { mode: "onSubmit", defaultValues: {} }, + _formState: { + isDirty: false, + isSubmitted: false, + submitCount: 0, + isLoading: false, + isSubmitSuccessful: false, + isSubmitting: false, + isValidating: false, + isValid: true, + disabled: false, + dirtyFields: {}, + touchedFields: {}, + errors: {}, + validatingFields: {}, + }, + _fields: {}, + + _defaultValues: {}, + _formValues: {}, + _proxyFormState: { + isDirty: false, + dirtyFields: false, + touchedFields: false, + errors: false, + isValid: true, + isValidating: false, + validatingFields: false, + }, + _getDirty: () => false, + _updateValid: () => {}, + _updateFieldArray: () => {}, + _getWatch: () => ({}), + _updateFormState: () => {}, + register: ((name: string, options?: RegisterOptions<any>) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as unknown as UseFormRegister<any>, + }, + register: ((name: string) => ({ + name, + onChange: (e: any) => Promise.resolve(), + onBlur: (e: any) => Promise.resolve(), + ref: () => {}, + })) as UseFormRegister<FieldValues>, + setFocus: () => {}, + }, render: () => { const FormWithDefaultValue = () => { const form = useForm<z.infer<typeof formSchema>>({ diff --git a/autogpt_platform/frontend/src/components/ui/tooltip.tsx b/autogpt_platform/frontend/src/components/ui/tooltip.tsx index dbc5383e4..016d329d5 100644 --- a/autogpt_platform/frontend/src/components/ui/tooltip.tsx +++ b/autogpt_platform/frontend/src/components/ui/tooltip.tsx @@ -7,7 +7,13 @@ import { cn } from "@/lib/utils"; const TooltipProvider = TooltipPrimitive.Provider; -const Tooltip = ({ children, delayDuration = 10 }) => ( +const Tooltip = ({ + children, + delayDuration = 10, +}: { + children: React.ReactNode; + delayDuration?: number; +}) => ( <TooltipPrimitive.Root delayDuration={delayDuration}> {children} </TooltipPrimitive.Root> diff --git a/autogpt_platform/frontend/src/hooks/useCopyPaste.ts b/autogpt_platform/frontend/src/hooks/useCopyPaste.ts index 56339e1b5..10498d429 100644 --- a/autogpt_platform/frontend/src/hooks/useCopyPaste.ts +++ b/autogpt_platform/frontend/src/hooks/useCopyPaste.ts @@ -1,6 +1,11 @@ import { useCallback } from "react"; import { Node, Edge, useReactFlow, useViewport } from "@xyflow/react"; +interface CopyableData { + nodes: Node[]; + edges: Edge[]; +} + export function useCopyPaste(getNextNodeId: () => string) { const { setNodes, addEdges, getNodes, getEdges } = useReactFlow(); const { x, y, zoom } = useViewport(); @@ -20,7 +25,7 @@ export function useCopyPaste(getNextNodeId: () => string) { selectedNodeIds.has(edge.target), ); - const copiedData = { + const copiedData: CopyableData = { nodes: selectedNodes.map((node) => ({ ...node, data: { @@ -36,7 +41,7 @@ export function useCopyPaste(getNextNodeId: () => string) { if (event.key === "v" || event.key === "V") { const copiedDataString = localStorage.getItem("copiedFlowData"); if (copiedDataString) { - const copiedData = JSON.parse(copiedDataString); + const copiedData = JSON.parse(copiedDataString) as CopyableData; const oldToNewIdMap: Record<string, string> = {}; const viewportCenter = { @@ -77,7 +82,7 @@ export function useCopyPaste(getNextNodeId: () => string) { }; }); - const pastedEdges = copiedData.edges.map((edge: Edge) => { + const pastedEdges = copiedData.edges.map((edge) => { const newSourceId = oldToNewIdMap[edge.source] ?? edge.source; const newTargetId = oldToNewIdMap[edge.target] ?? edge.target; return { @@ -99,10 +104,10 @@ export function useCopyPaste(getNextNodeId: () => string) { if (oldToNewIdMap[node.id]) { const nodeConnections = pastedEdges .filter( - (edge) => + (edge: Edge) => edge.source === node.id || edge.target === node.id, ) - .map((edge) => ({ + .map((edge: Edge) => ({ edge_id: edge.id, source: edge.source, target: edge.target, diff --git a/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts b/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts index 69fda51c3..a660c2f1d 100644 --- a/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts +++ b/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts @@ -65,18 +65,21 @@ export type BlockIOObjectSubSchema = BlockIOSubSchemaMeta & { properties: { [key: string]: BlockIOSubSchema }; default?: { [key: keyof BlockIOObjectSubSchema["properties"]]: any }; required?: (keyof BlockIOObjectSubSchema["properties"])[]; + secret?: boolean; }; export type BlockIOKVSubSchema = BlockIOSubSchemaMeta & { type: "object"; additionalProperties: { type: "string" | "number" | "integer" }; default?: { [key: string]: string | number }; + secret?: boolean; }; export type BlockIOArraySubSchema = BlockIOSubSchemaMeta & { type: "array"; items?: BlockIOSimpleTypeSubSchema; default?: Array<string>; + secret?: boolean; }; export type BlockIOStringSubSchema = BlockIOSubSchemaMeta & { @@ -90,11 +93,13 @@ export type BlockIOStringSubSchema = BlockIOSubSchemaMeta & { export type BlockIONumberSubSchema = BlockIOSubSchemaMeta & { type: "integer" | "number"; default?: number; + secret?: boolean; }; export type BlockIOBooleanSubSchema = BlockIOSubSchemaMeta & { type: "boolean"; default?: boolean; + secret?: boolean; }; export type CredentialsType = "api_key" | "oauth2" | "user_password"; @@ -143,16 +148,19 @@ export type CredentialsProviderName = (typeof PROVIDER_NAMES)[keyof typeof PROVIDER_NAMES]; export type BlockIOCredentialsSubSchema = BlockIOSubSchemaMeta & { + type: "object"; /* Mirror of backend/data/model.py:CredentialsFieldSchemaExtra */ credentials_provider: CredentialsProviderName[]; credentials_scopes?: string[]; credentials_types: Array<CredentialsType>; discriminator?: string; discriminator_mapping?: { [key: string]: CredentialsProviderName }; + secret?: boolean; }; export type BlockIONullSubSchema = BlockIOSubSchemaMeta & { type: "null"; + secret?: boolean; }; // At the time of writing, combined schemas only occur on the first nested level in a @@ -160,15 +168,21 @@ export type BlockIONullSubSchema = BlockIOSubSchemaMeta & { type BlockIOCombinedTypeSubSchema = BlockIOSubSchemaMeta & ( | { + type: "allOf"; allOf: [BlockIOSimpleTypeSubSchema]; + secret?: boolean; } | { + type: "anyOf"; anyOf: BlockIOSimpleTypeSubSchema[]; default?: string | number | boolean | null; + secret?: boolean; } | { + type: "oneOf"; oneOf: BlockIOSimpleTypeSubSchema[]; default?: string | number | boolean | null; + secret?: boolean; } ); diff --git a/autogpt_platform/frontend/src/tests/fixtures/test-user.fixture.ts b/autogpt_platform/frontend/src/tests/fixtures/test-user.fixture.ts index 76a935aa9..580121df6 100644 --- a/autogpt_platform/frontend/src/tests/fixtures/test-user.fixture.ts +++ b/autogpt_platform/frontend/src/tests/fixtures/test-user.fixture.ts @@ -1,6 +1,5 @@ /* eslint-disable react-hooks/rules-of-hooks */ import { createClient, SupabaseClient } from "@supabase/supabase-js"; -import { faker } from "@faker-js/faker"; export type TestUser = { email: string; @@ -26,24 +25,6 @@ function getSupabaseAdmin() { return supabase; } -async function createTestUser(userData: TestUser): Promise<TestUser> { - const supabase = getSupabaseAdmin(); - - const { data: authUser, error: authError } = await supabase.auth.signUp({ - email: userData.email, - password: userData.password, - }); - - if (authError) { - throw new Error(`Failed to create test user: ${authError.message}`); - } - - return { - ...userData, - id: authUser.user?.id, - }; -} - async function deleteTestUser(userId: string) { const supabase = getSupabaseAdmin(); @@ -59,25 +40,3 @@ async function deleteTestUser(userId: string) { ); } } - -function generateUserData(): TestUser { - return { - email: `test.${faker.string.uuid()}@example.com`, - password: faker.internet.password({ length: 12 }), - }; -} - -// Export just the fixture function -export const createTestUserFixture = async ({}, use) => { - let user: TestUser | null = null; - - try { - const userData = generateUserData(); - user = await createTestUser(userData); - await use(user); - } finally { - if (user?.id) { - await deleteTestUser(user.id); - } - } -}; From c31a2ec5655992502036c9fcfac3e554f67d7ef5 Mon Sep 17 00:00:00 2001 From: Zamil Majdy <zamil.majdy@agpt.co> Date: Wed, 29 Jan 2025 14:59:06 +0100 Subject: [PATCH 04/12] fix(backend): Remove hardcoded auto-top-up config definition on set_auto_top_up (#9361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Changes 🏗️ Make set_auto_top_up accepts AutoTopUpConfig & eliminate hardcoding of json value. ### 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> --- autogpt_platform/backend/backend/data/credit.py | 4 ++-- autogpt_platform/backend/backend/server/routers/v1.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/autogpt_platform/backend/backend/data/credit.py b/autogpt_platform/backend/backend/data/credit.py index dbde81eee..b4953eed2 100644 --- a/autogpt_platform/backend/backend/data/credit.py +++ b/autogpt_platform/backend/backend/data/credit.py @@ -517,10 +517,10 @@ async def get_stripe_customer_id(user_id: str) -> str: return customer.id -async def set_auto_top_up(user_id: str, threshold: int, amount: int): +async def set_auto_top_up(user_id: str, config: AutoTopUpConfig): await User.prisma().update( where={"id": user_id}, - data={"topUpConfig": Json({"threshold": threshold, "amount": amount})}, + data={"topUpConfig": Json(config.model_dump())}, ) diff --git a/autogpt_platform/backend/backend/server/routers/v1.py b/autogpt_platform/backend/backend/server/routers/v1.py index 795c82490..39d16632b 100644 --- a/autogpt_platform/backend/backend/server/routers/v1.py +++ b/autogpt_platform/backend/backend/server/routers/v1.py @@ -183,7 +183,9 @@ async def configure_user_auto_top_up( else: await _user_credit_model.top_up_credits(user_id, 0) - await set_auto_top_up(user_id, threshold=request.threshold, amount=request.amount) + await set_auto_top_up( + user_id, AutoTopUpConfig(threshold=request.threshold, amount=request.amount) + ) return "Auto top-up settings updated" From f67060fd8fc07a46f20ee6cbb13468b60dd7abbc Mon Sep 17 00:00:00 2001 From: Zamil Majdy <zamil.majdy@agpt.co> Date: Wed, 29 Jan 2025 15:25:50 +0100 Subject: [PATCH 05/12] fix(backend): Fix get balance error on user with null running balance (#9365) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Changes 🏗️ The current state can cause this error: ``` if (snapshot_time.year, snapshot_time.month) == (cur_time.year, cur_time.month): ^^^^^^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'year' ``` Which is caused by the timestamp return value possibly a string. ### 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> --- autogpt_platform/backend/backend/data/credit.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/autogpt_platform/backend/backend/data/credit.py b/autogpt_platform/backend/backend/data/credit.py index b4953eed2..5feb5f929 100644 --- a/autogpt_platform/backend/backend/data/credit.py +++ b/autogpt_platform/backend/backend/data/credit.py @@ -132,12 +132,14 @@ class UserCreditBase(ABC): }, ) transaction_balance = ( - transactions[0].get("_sum", {}).get("amount", 0) + snapshot_balance + int(transactions[0].get("_sum", {}).get("amount", 0) + snapshot_balance) if transactions else snapshot_balance ) transaction_time = ( - transactions[0].get("_max", {}).get("createdAt", datetime_min) + datetime.fromisoformat( + str(transactions[0].get("_max", {}).get("createdAt", datetime_min)) + ) if transactions else snapshot_time ) From f1bc9d158175c8f199b4be44b4597dd70781b30a Mon Sep 17 00:00:00 2001 From: Nicholas Tindle <nicholas.tindle@agpt.co> Date: Wed, 29 Jan 2025 10:31:57 -0600 Subject: [PATCH 06/12] Update .deepsource.toml --- .deepsource.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.deepsource.toml b/.deepsource.toml index 5ccd3d278..c68a25b03 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -1,6 +1,6 @@ version = 1 -test_patterns = ["test_*.py", "tests/**", "test/**", "*.spec.ts", "*_test.py"] +test_patterns = ["**/*.spec.ts","**/*_test.py","**/*_tests.py","**/test_*.py"] exclude_patterns = ["classic/**"] From ef118eff347cfced662b6e2902ccb8b52c1bd444 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:47:47 -0600 Subject: [PATCH 07/12] chore(libs/deps-dev): bump ruff from 0.9.2 to 0.9.3 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9343) 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.2 to 0.9.3 <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.3</h2> <h2>Release Notes</h2> <h3>Preview features</h3> <ul> <li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15633">#15633</a>)</li> <li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols (<a href="https://redirect.github.com/astral-sh/ruff/pull/15611">#15611</a>)</li> <li>[<code>flake8-bandit</code>] Report all references to suspicious functions (<code>S3</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15541">#15541</a>)</li> <li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty <code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15542">#15542</a>)</li> <li>[<code>flake8-simplify</code>] Avoid double negations (<code>SIM103</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15562">#15562</a>)</li> <li>[<code>pyflakes</code>] Fix infinite loop with unused local import in <code>__init__.py</code> (<code>F401</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15517">#15517</a>)</li> <li>[<code>pylint</code>] Do not report methods with only one <code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15507">#15507</a>)</li> <li>[<code>pylint</code>] Implement <code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/9640">#9640</a>)</li> <li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in classes and functions (<code>UP046</code>, <code>UP047</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15565">#15565</a>, <a href="https://redirect.github.com/astral-sh/ruff/pull/15659">#15659</a>)</li> <li>[<code>refurb</code>] Implement <code>for-loop-writes</code> (<code>FURB122</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/10630">#10630</a>)</li> <li>[<code>ruff</code>] Implement <code>needless-else</code> clause (<code>RUF047</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15051">#15051</a>)</li> <li>[<code>ruff</code>] Implement <code>starmap-zip</code> (<code>RUF058</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15483">#15483</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (<code>B903</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15549">#15549</a>)</li> <li>[<code>flake8-comprehensions</code>] strip parentheses around generators in <code>unnecessary-generator-set</code> (<code>C401</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15553">#15553</a>)</li> <li>[<code>flake8-pytest-style</code>] Rewrite references to <code>.exception</code> (<code>PT027</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15680">#15680</a>)</li> <li>[<code>flake8-simplify</code>] Mark fixes as unsafe (<code>SIM201</code>, <code>SIM202</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15626">#15626</a>)</li> <li>[<code>flake8-type-checking</code>] Fix some safe fixes being labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15638">#15638</a>)</li> <li>[<code>isort</code>] Omit trailing whitespace in <code>unsorted-imports</code> (<code>I001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15518">#15518</a>)</li> <li>[<code>pydoclint</code>] Allow ignoring one line docstrings for <code>DOC</code> rules (<a href="https://redirect.github.com/astral-sh/ruff/pull/13302">#13302</a>)</li> <li>[<code>pyflakes</code>] Apply redefinition fixes by source code order (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15575">#15575</a>)</li> <li>[<code>pyflakes</code>] Avoid removing too many imports in <code>redefined-while-unused</code> (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15585">#15585</a>)</li> <li>[<code>pyflakes</code>] Group redefinition fixes by source statement (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15574">#15574</a>)</li> <li>[<code>pylint</code>] Include name of base class in message for <code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15559">#15559</a>)</li> <li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use <code>var == value</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/15605">#15605</a>)</li> </ul> <h3>Formatter</h3> <ul> <li>Fix bracket spacing for single-element tuples in f-string expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/15537">#15537</a>)</li> <li>Fix unstable f-string formatting for expressions containing a trailing comma (<a href="https://redirect.github.com/astral-sh/ruff/pull/15545">#15545</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid quadratic membership check in import fixes (<a href="https://redirect.github.com/astral-sh/ruff/pull/15576">#15576</a>)</li> </ul> <h3>Server</h3> <ul> <li>Allow <code>unsafe-fixes</code> settings for code actions (<a href="https://redirect.github.com/astral-sh/ruff/pull/15666">#15666</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex flag (<code>S608</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15654">#15654</a>)</li> <li>[<code>flake8-import-conventions</code>] Fix infinite loop between <code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15480">#15480</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.3</h2> <h3>Preview features</h3> <ul> <li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15633">#15633</a>)</li> <li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols (<a href="https://redirect.github.com/astral-sh/ruff/pull/15611">#15611</a>)</li> <li>[<code>flake8-bandit</code>] Report all references to suspicious functions (<code>S3</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15541">#15541</a>)</li> <li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty <code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15542">#15542</a>)</li> <li>[<code>flake8-simplify</code>] Avoid double negations (<code>SIM103</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15562">#15562</a>)</li> <li>[<code>pyflakes</code>] Fix infinite loop with unused local import in <code>__init__.py</code> (<code>F401</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15517">#15517</a>)</li> <li>[<code>pylint</code>] Do not report methods with only one <code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15507">#15507</a>)</li> <li>[<code>pylint</code>] Implement <code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/9640">#9640</a>)</li> <li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in classes and functions (<code>UP046</code>, <code>UP047</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15565">#15565</a>, <a href="https://redirect.github.com/astral-sh/ruff/pull/15659">#15659</a>)</li> <li>[<code>refurb</code>] Implement <code>for-loop-writes</code> (<code>FURB122</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/10630">#10630</a>)</li> <li>[<code>ruff</code>] Implement <code>needless-else</code> clause (<code>RUF047</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15051">#15051</a>)</li> <li>[<code>ruff</code>] Implement <code>starmap-zip</code> (<code>RUF058</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15483">#15483</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument is present and target-python version is less or equals than 3.9 (<code>B903</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15549">#15549</a>)</li> <li>[<code>flake8-comprehensions</code>] strip parentheses around generators in <code>unnecessary-generator-set</code> (<code>C401</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15553">#15553</a>)</li> <li>[<code>flake8-pytest-style</code>] Rewrite references to <code>.exception</code> (<code>PT027</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15680">#15680</a>)</li> <li>[<code>flake8-simplify</code>] Mark fixes as unsafe (<code>SIM201</code>, <code>SIM202</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15626">#15626</a>)</li> <li>[<code>flake8-type-checking</code>] Fix some safe fixes being labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15638">#15638</a>)</li> <li>[<code>isort</code>] Omit trailing whitespace in <code>unsorted-imports</code> (<code>I001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15518">#15518</a>)</li> <li>[<code>pydoclint</code>] Allow ignoring one line docstrings for <code>DOC</code> rules (<a href="https://redirect.github.com/astral-sh/ruff/pull/13302">#13302</a>)</li> <li>[<code>pyflakes</code>] Apply redefinition fixes by source code order (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15575">#15575</a>)</li> <li>[<code>pyflakes</code>] Avoid removing too many imports in <code>redefined-while-unused</code> (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15585">#15585</a>)</li> <li>[<code>pyflakes</code>] Group redefinition fixes by source statement (<code>F811</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15574">#15574</a>)</li> <li>[<code>pylint</code>] Include name of base class in message for <code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15559">#15559</a>)</li> <li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use <code>var == value</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/15605">#15605</a>)</li> </ul> <h3>Formatter</h3> <ul> <li>Fix bracket spacing for single-element tuples in f-string expressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/15537">#15537</a>)</li> <li>Fix unstable f-string formatting for expressions containing a trailing comma (<a href="https://redirect.github.com/astral-sh/ruff/pull/15545">#15545</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid quadratic membership check in import fixes (<a href="https://redirect.github.com/astral-sh/ruff/pull/15576">#15576</a>)</li> </ul> <h3>Server</h3> <ul> <li>Allow <code>unsafe-fixes</code> settings for code actions (<a href="https://redirect.github.com/astral-sh/ruff/pull/15666">#15666</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex flag (<code>S608</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15654">#15654</a>)</li> <li>[<code>flake8-import-conventions</code>] Fix infinite loop between <code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15480">#15480</a>)</li> <li>[<code>flake8-simplify</code>] Do not emit diagnostics for expressions inside string type annotations (<code>SIM222</code>, <code>SIM223</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/15405">#15405</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/90589372daf58ec4d314cbd15db8d2ef572c33cc"><code>9058937</code></a> Fix grep for version number in docker build (<a href="https://redirect.github.com/astral-sh/ruff/issues/15699">#15699</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/b5ffb404de8ab05eb7b14d6547f79f4fe3a3e25f"><code>b5ffb40</code></a> Bump version to 0.9.3 (<a href="https://redirect.github.com/astral-sh/ruff/issues/15698">#15698</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/cffd1866ce1ac6da4d6a5bc12435316d2d99755b"><code>cffd186</code></a> Preserve raw string prefix and escapes (<a href="https://redirect.github.com/astral-sh/ruff/issues/15694">#15694</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/569060f46ca2e036cd54532c97121737884f26c0"><code>569060f</code></a> [<code>flake8-pytest-style</code>] Rewrite references to <code>.exception</code> (<code>PT027</code>) (<a href="https://redirect.github.com/astral-sh/ruff/issues/15680">#15680</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/15394a80282f589526497eefb2507a0afc662ca6"><code>15394a8</code></a> [red-knot] MDTests: Do not depend on precise public-symbol type inference (<a href="https://redirect.github.com/astral-sh/ruff/issues/1">#1</a>...</li> <li><a href="https://github.com/astral-sh/ruff/commit/fc2ebea7369b26c864769fce54201a8657d70058"><code>fc2ebea</code></a> [red-knot] Make <code>infer.rs</code> unit tests independent of public symbol inference ...</li> <li><a href="https://github.com/astral-sh/ruff/commit/43160b4c3edb9cda4c01ed857e94578213e70c6f"><code>43160b4</code></a> Tidy knot CLI tests (<a href="https://redirect.github.com/astral-sh/ruff/issues/15685">#15685</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/0173738eef808a9b2f492a0b966e3f70e8584e21"><code>0173738</code></a> [red-knot] Port comprehension tests to Markdown (<a href="https://redirect.github.com/astral-sh/ruff/issues/15688">#15688</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/05ea77b1d4d1863e6436101cf877fbf265e966f4"><code>05ea77b</code></a> Create Unknown rule diagnostics with a source range (<a href="https://redirect.github.com/astral-sh/ruff/issues/15648">#15648</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/1e790d3885919826e2cff2fbf6ddb31554714050"><code>1e790d3</code></a> [red-knot] Port 'deferred annotations' unit tests to Markdown (<a href="https://redirect.github.com/astral-sh/ruff/issues/15686">#15686</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.9.2...0.9.3">compare view</a></li> </ul> </details> <br /> [](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: Nicholas Tindle <nicholas.tindle@agpt.co> --- autogpt_platform/autogpt_libs/poetry.lock | 119 ++++--------------- autogpt_platform/autogpt_libs/pyproject.toml | 2 +- 2 files changed, 23 insertions(+), 98 deletions(-) diff --git a/autogpt_platform/autogpt_libs/poetry.lock b/autogpt_platform/autogpt_libs/poetry.lock index 3c8b01b1f..f507ccabc 100644 --- a/autogpt_platform/autogpt_libs/poetry.lock +++ b/autogpt_platform/autogpt_libs/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -6,7 +6,6 @@ version = "2.4.0" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, @@ -18,7 +17,6 @@ version = "3.10.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, @@ -131,7 +129,6 @@ version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, @@ -146,7 +143,6 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -158,7 +154,6 @@ version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, @@ -181,12 +176,10 @@ version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] -markers = {main = "python_version < \"3.11\"", dev = "python_full_version < \"3.11.3\""} [[package]] name = "attrs" @@ -194,7 +187,6 @@ version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, @@ -214,7 +206,6 @@ version = "5.5.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, @@ -226,7 +217,6 @@ version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -238,7 +228,6 @@ version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" -groups = ["main"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, @@ -338,7 +327,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -350,7 +338,6 @@ version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] files = [ {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, @@ -368,7 +355,6 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -383,8 +369,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -399,7 +383,6 @@ version = "1.2.2" description = "Dictionary with auto-expiring values for caching purposes" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "expiringdict-1.2.2-py3-none-any.whl", hash = "sha256:09a5d20bc361163e6432a874edd3179676e935eb81b925eccef48d409a8a45e8"}, {file = "expiringdict-1.2.2.tar.gz", hash = "sha256:300fb92a7e98f15b05cf9a856c1415b3bc4f2e132be07daa326da6414c23ee09"}, @@ -414,7 +397,6 @@ version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, @@ -501,7 +483,6 @@ version = "2.19.2" description = "Google API client core library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, @@ -533,7 +514,6 @@ version = "2.34.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, @@ -557,7 +537,6 @@ version = "1.4.5" description = "Google Cloud Appengine Logging API client library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google_cloud_appengine_logging-1.4.5-py2.py3-none-any.whl", hash = "sha256:344e0244404049b42164e4d6dc718ca2c81b393d066956e7cb85fd9407ed9c48"}, {file = "google_cloud_appengine_logging-1.4.5.tar.gz", hash = "sha256:de7d766e5d67b19fc5833974b505b32d2a5bbdfb283fd941e320e7cfdae4cb83"}, @@ -575,7 +554,6 @@ version = "0.3.0" description = "Google Cloud Audit Protos" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google_cloud_audit_log-0.3.0-py2.py3-none-any.whl", hash = "sha256:8340793120a1d5aa143605def8704ecdcead15106f754ef1381ae3bab533722f"}, {file = "google_cloud_audit_log-0.3.0.tar.gz", hash = "sha256:901428b257020d8c1d1133e0fa004164a555e5a395c7ca3cdbb8486513df3a65"}, @@ -591,7 +569,6 @@ version = "2.4.1" description = "Google Cloud API client core library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, @@ -610,7 +587,6 @@ version = "3.11.3" description = "Stackdriver Logging API client library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "google_cloud_logging-3.11.3-py2.py3-none-any.whl", hash = "sha256:b8ec23f2998f76a58f8492db26a0f4151dd500425c3f08448586b85972f3c494"}, {file = "google_cloud_logging-3.11.3.tar.gz", hash = "sha256:0a73cd94118875387d4535371d9e9426861edef8e44fba1261e86782d5b8d54f"}, @@ -636,7 +612,6 @@ version = "1.65.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, @@ -655,7 +630,6 @@ version = "2.11.1" description = "Python Client Library for Supabase Auth" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "gotrue-2.11.1-py3-none-any.whl", hash = "sha256:1b2d915bdc65fd0ad608532759ce9c72fa2e910145c1e6901f2188519e7bcd2d"}, {file = "gotrue-2.11.1.tar.gz", hash = "sha256:5594ceee60bd873e5f4fdd028b08dece3906f6013b6ed08e7786b71c0092fed0"}, @@ -671,7 +645,6 @@ version = "0.13.1" description = "IAM API client library" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "grpc-google-iam-v1-0.13.1.tar.gz", hash = "sha256:3ff4b2fd9d990965e410965253c0da6f66205d5a8291c4c31c6ebecca18a9001"}, {file = "grpc_google_iam_v1-0.13.1-py2.py3-none-any.whl", hash = "sha256:c3e86151a981811f30d5e7330f271cee53e73bb87755e88cc3b6f0c7b5fe374e"}, @@ -688,7 +661,6 @@ version = "1.66.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, @@ -747,7 +719,6 @@ version = "1.66.1" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "grpcio_status-1.66.1-py3-none-any.whl", hash = "sha256:cf9ed0b4a83adbe9297211c95cb5488b0cd065707e812145b842c85c4782ff02"}, {file = "grpcio_status-1.66.1.tar.gz", hash = "sha256:b3f7d34ccc46d83fea5261eea3786174459f763c31f6e34f1d24eba6d515d024"}, @@ -764,7 +735,6 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -776,7 +746,6 @@ version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" optional = false python-versions = ">=3.6.1" -groups = ["main"] files = [ {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, @@ -792,7 +761,6 @@ version = "4.0.0" description = "Pure-Python HPACK header compression" optional = false python-versions = ">=3.6.1" -groups = ["main"] files = [ {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, @@ -804,7 +772,6 @@ version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, @@ -826,7 +793,6 @@ version = "0.27.2" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, @@ -853,7 +819,6 @@ version = "6.0.1" description = "HTTP/2 framing layer for Python" optional = false python-versions = ">=3.6.1" -groups = ["main"] files = [ {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, @@ -865,7 +830,6 @@ version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, @@ -877,7 +841,6 @@ version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, @@ -897,7 +860,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -909,7 +871,6 @@ version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -1014,7 +975,6 @@ version = "1.27.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "opentelemetry_api-1.27.0-py3-none-any.whl", hash = "sha256:953d5871815e7c30c81b56d910c707588000fff7a3ca1c73e6531911d53065e7"}, {file = "opentelemetry_api-1.27.0.tar.gz", hash = "sha256:ed673583eaa5f81b5ce5e86ef7cdaf622f88ef65f0b9aab40b843dcae5bef342"}, @@ -1030,7 +990,6 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -1042,7 +1001,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1058,7 +1016,6 @@ version = "0.19.1" description = "PostgREST client for Python. This library provides an ORM interface to PostgREST." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "postgrest-0.19.1-py3-none-any.whl", hash = "sha256:a8e7be4e1abc69fd8eee5a49d7dc3a76dfbffbd778beed0b2bd7accb3f4f3a2a"}, {file = "postgrest-0.19.1.tar.gz", hash = "sha256:d8fa88953cced4f45efa0f412056c364f64ece8a35b5b35f458a7e58c133fbca"}, @@ -1076,7 +1033,6 @@ version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, @@ -1094,7 +1050,6 @@ version = "5.28.0" description = "" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0"}, {file = "protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6"}, @@ -1115,7 +1070,6 @@ version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -1127,7 +1081,6 @@ version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, @@ -1142,7 +1095,6 @@ version = "2.10.5" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, @@ -1163,7 +1115,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -1276,7 +1227,6 @@ version = "2.7.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, @@ -1297,7 +1247,6 @@ version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -1315,7 +1264,6 @@ version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, @@ -1338,7 +1286,6 @@ version = "0.25.2" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, @@ -1357,7 +1304,6 @@ version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, @@ -1375,7 +1321,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1390,7 +1335,6 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1405,7 +1349,6 @@ version = "2.0.2" description = "" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "realtime-2.0.2-py3-none-any.whl", hash = "sha256:2634c915bc38807f2013f21e8bcc4d2f79870dfd81460ddb9393883d0489928a"}, {file = "realtime-2.0.2.tar.gz", hash = "sha256:519da9325b3b8102139d51785013d592f6b2403d81fa21d838a0b0234723ed7d"}, @@ -1423,7 +1366,6 @@ version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, @@ -1442,7 +1384,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1464,7 +1405,6 @@ version = "4.9" description = "Pure-Python RSA implementation" optional = false python-versions = ">=3.6,<4" -groups = ["main"] files = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, @@ -1475,30 +1415,29 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.9.2" +version = "0.9.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ - {file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, - {file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, - {file = "ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df"}, - {file = "ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb"}, - {file = "ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a"}, - {file = "ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145"}, - {file = "ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5"}, - {file = "ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6"}, - {file = "ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0"}, + {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, + {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, + {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"}, + {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"}, + {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"}, + {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"}, + {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"}, + {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"}, + {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"}, ] [[package]] @@ -1507,7 +1446,6 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1519,7 +1457,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1531,7 +1468,6 @@ version = "0.11.0" description = "Supabase Storage client for Python." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "storage3-0.11.0-py3-none-any.whl", hash = "sha256:de2d8f9c9103ca91a9a9d0d69d80b07a3ab6f647b93e023e6a1a97d3607b9728"}, {file = "storage3-0.11.0.tar.gz", hash = "sha256:243583f2180686c0f0a19e6117d8a9796fd60c0ca72ec567d62b75a5af0d57a1"}, @@ -1547,7 +1483,6 @@ version = "0.4.15" description = "An Enum that inherits from str." optional = false python-versions = "*" -groups = ["main"] files = [ {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, @@ -1564,7 +1499,6 @@ version = "2.11.0" description = "Supabase client for Python." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "supabase-2.11.0-py3-none-any.whl", hash = "sha256:67a0da498895f4cd6554935e2854b4c41f87b297b78fb9c9414902a382041406"}, {file = "supabase-2.11.0.tar.gz", hash = "sha256:2a906f7909fd9a50f944cd9332ce66c684e2d37c0864284d34c5815e6c63cc01"}, @@ -1584,7 +1518,6 @@ version = "0.9.2" description = "Library for Supabase Functions" optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "supafunc-0.9.2-py3-none-any.whl", hash = "sha256:be5ee9f53842c4b0ba5f4abfb5bddf9f9e37e69e755ec0526852bb15af9d2ff5"}, {file = "supafunc-0.9.2.tar.gz", hash = "sha256:f5164114a3e65e7e552539f3f1050aa3d4970885abdd7405555c17fd216e2da1"}, @@ -1600,8 +1533,6 @@ version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, @@ -1613,7 +1544,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -1625,7 +1555,6 @@ version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, @@ -1643,7 +1572,6 @@ version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, @@ -1725,7 +1653,6 @@ version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, @@ -1805,7 +1732,6 @@ version = "1.11.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, @@ -1911,7 +1837,6 @@ version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, @@ -1926,6 +1851,6 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", type = ["pytest-mypy"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "53a31ce3d94999d9267f2a229c53a9d97d96c9413843bfdcb7ef0c0c21723e49" +content-hash = "62c4ef3f1ae73546a66783a2dc0672e664ce415a7b0514a7b92fc9fe1a23239e" diff --git a/autogpt_platform/autogpt_libs/pyproject.toml b/autogpt_platform/autogpt_libs/pyproject.toml index dcb06475f..5e553ee85 100644 --- a/autogpt_platform/autogpt_libs/pyproject.toml +++ b/autogpt_platform/autogpt_libs/pyproject.toml @@ -21,7 +21,7 @@ supabase = "^2.11.0" [tool.poetry.group.dev.dependencies] redis = "^5.2.1" -ruff = "^0.9.2" +ruff = "^0.9.3" [build-system] requires = ["poetry-core"] From 1b69bcbce22ea785432b765878bbce57129c654f Mon Sep 17 00:00:00 2001 From: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:56:05 +0100 Subject: [PATCH 08/12] fix(platform): PAYG system fixes (#9296) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Stripe is complaining about lack of return url in checkout. 2. Only frontend prevents users from topping-up amounts less than 5$. ### Changes 🏗️ - Set `return_url` and `customer_email` when creating checkout session. - Change `amount` to `credit_amount` and use credits instead of USD for clarity when requesting top up. - Accept only top-ups of 500+ credits (5$) and multiples of 100 credits *on the backend*. ### 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: Zamil Majdy <zamil.majdy@agpt.co> --- autogpt_platform/backend/backend/data/credit.py | 10 ++++++++++ autogpt_platform/backend/backend/server/model.py | 3 +-- autogpt_platform/backend/backend/server/routers/v1.py | 4 +++- autogpt_platform/frontend/src/hooks/useCredits.ts | 7 +++---- .../frontend/src/lib/autogpt-server-api/client.ts | 4 ++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/autogpt_platform/backend/backend/data/credit.py b/autogpt_platform/backend/backend/data/credit.py index 5feb5f929..12d5eec7b 100644 --- a/autogpt_platform/backend/backend/data/credit.py +++ b/autogpt_platform/backend/backend/data/credit.py @@ -362,12 +362,21 @@ class UserCredit(UserCreditBase): ) async def top_up_intent(self, user_id: str, amount: int) -> str: + if amount < 500 or amount % 100 != 0: + raise ValueError( + f"Top up amount must be at least 500 credits and multiple of 100 but is {amount}" + ) + + if not (user := await get_user_by_id(user_id)): + raise ValueError(f"User not found: {user_id}") + # Create checkout session # https://docs.stripe.com/checkout/quickstart?client=react # unit_amount param is always in the smallest currency unit (so cents for usd) # which is equal to amount of credits checkout_session = stripe.checkout.Session.create( customer=await get_stripe_customer_id(user_id), + customer_email=user.email, line_items=[ { "price_data": { @@ -387,6 +396,7 @@ class UserCredit(UserCreditBase): + "/marketplace/credits?topup=success", cancel_url=settings.config.platform_base_url + "/marketplace/credits?topup=cancel", + return_url=settings.config.platform_base_url + "/marketplace/credits", ) await self._add_transaction( diff --git a/autogpt_platform/backend/backend/server/model.py b/autogpt_platform/backend/backend/server/model.py index 14a7925c6..3980f7076 100644 --- a/autogpt_platform/backend/backend/server/model.py +++ b/autogpt_platform/backend/backend/server/model.py @@ -59,5 +59,4 @@ class UpdatePermissionsRequest(pydantic.BaseModel): class RequestTopUp(pydantic.BaseModel): - amount: int - """Amount of credits to top up.""" + credit_amount: int diff --git a/autogpt_platform/backend/backend/server/routers/v1.py b/autogpt_platform/backend/backend/server/routers/v1.py index 39d16632b..d819438a7 100644 --- a/autogpt_platform/backend/backend/server/routers/v1.py +++ b/autogpt_platform/backend/backend/server/routers/v1.py @@ -151,7 +151,9 @@ async def get_user_credits( async def request_top_up( request: RequestTopUp, user_id: Annotated[str, Depends(get_user_id)] ): - checkout_url = await _user_credit_model.top_up_intent(user_id, request.amount) + checkout_url = await _user_credit_model.top_up_intent( + user_id, request.credit_amount + ) return {"checkout_url": checkout_url} diff --git a/autogpt_platform/frontend/src/hooks/useCredits.ts b/autogpt_platform/frontend/src/hooks/useCredits.ts index c10d42fee..8994d03a7 100644 --- a/autogpt_platform/frontend/src/hooks/useCredits.ts +++ b/autogpt_platform/frontend/src/hooks/useCredits.ts @@ -10,7 +10,7 @@ const stripePromise = loadStripe( export default function useCredits(): { credits: number | null; fetchCredits: () => void; - requestTopUp: (amount: number) => Promise<void>; + requestTopUp: (credit_amount: number) => Promise<void>; autoTopUpConfig: { amount: number; threshold: number } | null; fetchAutoTopUpConfig: () => void; updateAutoTopUpConfig: (amount: number, threshold: number) => Promise<void>; @@ -51,15 +51,14 @@ export default function useCredits(): { ); const requestTopUp = useCallback( - async (amount: number) => { + async (credit_amount: number) => { const stripe = await stripePromise; if (!stripe) { return; } - // Convert dollar amount to credit count - const response = await api.requestTopUp(amount); + const response = await api.requestTopUp(credit_amount); router.push(response.checkout_url); }, [api, router], diff --git a/autogpt_platform/frontend/src/lib/autogpt-server-api/client.ts b/autogpt_platform/frontend/src/lib/autogpt-server-api/client.ts index b6a096d3d..6130ecf78 100644 --- a/autogpt_platform/frontend/src/lib/autogpt-server-api/client.ts +++ b/autogpt_platform/frontend/src/lib/autogpt-server-api/client.ts @@ -100,8 +100,8 @@ export default class BackendAPI { return this._request("POST", "/credits/auto-top-up", config); } - requestTopUp(amount: number): Promise<{ checkout_url: string }> { - return this._request("POST", "/credits", { amount }); + requestTopUp(credit_amount: number): Promise<{ checkout_url: string }> { + return this._request("POST", "/credits", { credit_amount }); } getUserPaymentPortalLink(): Promise<{ url: string }> { From a4b962462c520920f0ba2cffcb9929c135d13bfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:08:02 +0000 Subject: [PATCH 09/12] chore(backend/deps): bump the production-dependencies group across 1 directory with 9 updates (#9364) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the production-dependencies group with 9 updates in the /autogpt_platform/backend directory: | Package | From | To | | --- | --- | --- | | [anthropic](https://github.com/anthropics/anthropic-sdk-python) | `0.40.0` | `0.45.2` | | [google-api-python-client](https://github.com/googleapis/google-api-python-client) | `2.159.0` | `2.160.0` | | [groq](https://github.com/groq/groq-python) | `0.13.1` | `0.15.0` | | [openai](https://github.com/openai/openai-python) | `1.60.0` | `1.60.2` | | [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) | `0.25.2` | `0.25.3` | | [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.19.2` | `2.20.0` | | [stripe](https://github.com/stripe/stripe-python) | `11.4.1` | `11.5.0` | | [supabase](https://github.com/supabase/supabase-py) | `2.11.0` | `2.12.0` | | [mem0ai](https://github.com/mem0ai/mem0) | `0.1.44` | `0.1.48` | Updates `anthropic` from 0.40.0 to 0.45.2 <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.45.2</h2> <h2>0.45.2 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.1...v0.45.2">v0.45.1...v0.45.2</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>streaming:</strong> avoid invalid deser type error (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/72a2585680a4cc5d007bf93935424dbc4cecf2bd">72a2585</a>)</li> </ul> <h2>v0.45.1</h2> <h2>0.45.1 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.0...v0.45.1">v0.45.0...v0.45.1</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>streaming:</strong> accumulate citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/e665f2fefd4573fc45cd4c546a9480f15d18d1cd">e665f2f</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>docs:</strong> updates (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/fb10a7d658044062e5023cd8495c80d3344af8df">fb10a7d</a>)</li> </ul> <h2>v0.45.0</h2> <h2>0.45.0 (2025-01-23)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.44.0...v0.45.0">v0.44.0...v0.45.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/2ec74b6ff106c6e3d7d55e3c189e345098f8575e">2ec74b6</a>)</li> <li><strong>client:</strong> support results endpoint (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/5dd88bf2d20b8909736cc0bc1e81296ba6e322a9">5dd88bf</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> minor formatting changes (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/31eb826deb96a17d3c0bb953c728f39412c12ada">31eb826</a>)</li> </ul> <h2>v0.44.0</h2> <h2>0.44.0 (2025-01-21)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.43.1...v0.44.0">v0.43.1...v0.44.0</a></p> <h3>Features</h3> <ul> <li><strong>streaming:</strong> add request_id getter (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/831">#831</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/fb397e0851bd874a10a69a9531483fd196fc8a55">fb397e0</a>)</li> </ul> <h3>Bug Fixes</h3> <!-- 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.45.2 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.1...v0.45.2">v0.45.1...v0.45.2</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>streaming:</strong> avoid invalid deser type error (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/72a2585680a4cc5d007bf93935424dbc4cecf2bd">72a2585</a>)</li> </ul> <h2>0.45.1 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.0...v0.45.1">v0.45.0...v0.45.1</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>streaming:</strong> accumulate citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/e665f2fefd4573fc45cd4c546a9480f15d18d1cd">e665f2f</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>docs:</strong> updates (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/fb10a7d658044062e5023cd8495c80d3344af8df">fb10a7d</a>)</li> </ul> <h2>0.45.0 (2025-01-23)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.44.0...v0.45.0">v0.44.0...v0.45.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> add citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/2ec74b6ff106c6e3d7d55e3c189e345098f8575e">2ec74b6</a>)</li> <li><strong>client:</strong> support results endpoint (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/5dd88bf2d20b8909736cc0bc1e81296ba6e322a9">5dd88bf</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> minor formatting changes (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/31eb826deb96a17d3c0bb953c728f39412c12ada">31eb826</a>)</li> </ul> <h2>0.44.0 (2025-01-21)</h2> <p>Full Changelog: <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.43.1...v0.44.0">v0.43.1...v0.44.0</a></p> <h3>Features</h3> <ul> <li><strong>streaming:</strong> add request_id getter (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/831">#831</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/fb397e0851bd874a10a69a9531483fd196fc8a55">fb397e0</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>tests:</strong> make test_get_platform less flaky (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/830">#830</a>) (<a href="https://github.com/anthropics/anthropic-sdk-python/commit/f2c10cae0cbff6881bba2a41c93efdcc17e8d2ab">f2c10ca</a>)</li> </ul> <h3>Chores</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/0f9ccca8e26cf27b969e38c02899fde4b3489c86"><code>0f9ccca</code></a> release: 0.45.2</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/37acfbcda58d8c9047a9111e4433ea21595b7549"><code>37acfbc</code></a> fix(streaming): avoid invalid deser type error (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/d0f98a4e6b96e3bb438a43371c5b677209c4a168"><code>d0f98a4</code></a> release: 0.45.1</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/872c614851a3b7a563f64e8d0478e83c58e5f43d"><code>872c614</code></a> fix(streaming): accumulate citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/14bf8fe88f273ae329d922a390896a4e855b3e75"><code>14bf8fe</code></a> chore(docs): updates (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/c5102baffb2ffdca05196d9d222dddbe173ccf1e"><code>c5102ba</code></a> release: 0.45.0</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/67aa83e5d589f6afad5fbc8bd2e616cc71a80a29"><code>67aa83e</code></a> feat(api): add citations (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/bb1f52bfba3eb029942b71c1544021dd42f88651"><code>bb1f52b</code></a> chore(internal): minor formatting changes (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/4b9140284b9386747656d2b3b6cf707e6ff00121"><code>4b91402</code></a> feat(client): support results endpoint (<a href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>)</li> <li><a href="https://github.com/anthropics/anthropic-sdk-python/commit/d212ec9f6d5e956f13bc0ddc3d86b5888a954383"><code>d212ec9</code></a> release: 0.44.0</li> <li>Additional commits viewable in <a href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.40.0...v0.45.2">compare view</a></li> </ul> </details> <br /> Updates `google-api-python-client` from 2.159.0 to 2.160.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.160.0</h2> <h2><a href="https://github.com/googleapis/google-api-python-client/compare/v2.159.0...v2.160.0">2.160.0</a> (2025-01-21)</h2> <h3>Features</h3> <ul> <li><strong>accesscontextmanager:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/8b40ee693835e6f737b06d121394e8a0b485a9b8">https://togithub.com/googleapis/google-api-python-client/commit/8b40ee693835e6f737b06d121394e8a0b485a9b8</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>adsenseplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/04355c7c7c184536c4f808ab27f0e97448845683">https://togithub.com/googleapis/google-api-python-client/commit/04355c7c7c184536c4f808ab27f0e97448845683</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>aiplatform:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/24228d48862449405aa3486cf812a2fc5208ab32">https://togithub.com/googleapis/google-api-python-client/commit/24228d48862449405aa3486cf812a2fc5208ab32</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>analyticsadmin:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/dff2a84a823c6af6d59cb98d257d18aa4f39256c">https://togithub.com/googleapis/google-api-python-client/commit/dff2a84a823c6af6d59cb98d257d18aa4f39256c</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>analyticshub:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/0208b0b0288c703b0a344e0789675d3660caae2b">https://togithub.com/googleapis/google-api-python-client/commit/0208b0b0288c703b0a344e0789675d3660caae2b</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>androidenterprise:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/b7865bd3ff77dbfa296d3e9682623d048cc6b66d">https://togithub.com/googleapis/google-api-python-client/commit/b7865bd3ff77dbfa296d3e9682623d048cc6b66d</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>classroom:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/ef72b5f7f95abea4e3d851ee8807f628183a240f">https://togithub.com/googleapis/google-api-python-client/commit/ef72b5f7f95abea4e3d851ee8807f628183a240f</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>cloudbuild:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/41e76d1b7e678c5b8ec344dd1b6be9eb01820c03">https://togithub.com/googleapis/google-api-python-client/commit/41e76d1b7e678c5b8ec344dd1b6be9eb01820c03</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>compute:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/48c508dffa1ed1df4e02d7d2238542b6eb8840f7">https://togithub.com/googleapis/google-api-python-client/commit/48c508dffa1ed1df4e02d7d2238542b6eb8840f7</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>dialogflow:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/6c3ff8511522ff8fec923ef5a41384e0e3f1ee7b">https://togithub.com/googleapis/google-api-python-client/commit/6c3ff8511522ff8fec923ef5a41384e0e3f1ee7b</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>discoveryengine:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9afd49fbbf75e9088910a1f0a643579a67ea2b06">https://togithub.com/googleapis/google-api-python-client/commit/9afd49fbbf75e9088910a1f0a643579a67ea2b06</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>displayvideo:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/63b01f3147d6520061c67d4540701deac665c33b">https://togithub.com/googleapis/google-api-python-client/commit/63b01f3147d6520061c67d4540701deac665c33b</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>file:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/e7bf3e1cc7df45ec600553b433da3dc7ca4e2b6f">https://togithub.com/googleapis/google-api-python-client/commit/e7bf3e1cc7df45ec600553b433da3dc7ca4e2b6f</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>gkehub:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/aa81a39a6f952997b010d8804a37c09e767b9b44">https://togithub.com/googleapis/google-api-python-client/commit/aa81a39a6f952997b010d8804a37c09e767b9b44</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>integrations:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/da21dd8bebbd0eb4ca584b09df8f0ad78abf2fb5">https://togithub.com/googleapis/google-api-python-client/commit/da21dd8bebbd0eb4ca584b09df8f0ad78abf2fb5</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>merchantapi:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/c66e25ffad13cd34d42b0a0e40898688563d44af">https://togithub.com/googleapis/google-api-python-client/commit/c66e25ffad13cd34d42b0a0e40898688563d44af</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>migrationcenter:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/06c1759266fb5c72cbb1cc5aebebe26d6bbd5a6b">https://togithub.com/googleapis/google-api-python-client/commit/06c1759266fb5c72cbb1cc5aebebe26d6bbd5a6b</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>monitoring:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/6d1dc833753d7c076d966c3fb8bb105b618b22ec">https://togithub.com/googleapis/google-api-python-client/commit/6d1dc833753d7c076d966c3fb8bb105b618b22ec</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>netapp:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/628b723392cd62e63fa668f9602b398fb0474ec7">https://togithub.com/googleapis/google-api-python-client/commit/628b723392cd62e63fa668f9602b398fb0474ec7</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>networkmanagement:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/45d70c19e93b8edb0b52ca80e5235c0540cc1463">https://togithub.com/googleapis/google-api-python-client/commit/45d70c19e93b8edb0b52ca80e5235c0540cc1463</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>redis:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/a866933256348e166064a7ed1aee2d92a42630a9">https://togithub.com/googleapis/google-api-python-client/commit/a866933256348e166064a7ed1aee2d92a42630a9</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>spanner:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/9540ac50fcb9506cfaf204f2746f3da047cc2c08">https://togithub.com/googleapis/google-api-python-client/commit/9540ac50fcb9506cfaf204f2746f3da047cc2c08</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> <li><strong>websecurityscanner:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/5eae43739b774edf6fb5b91bd5807a1154533180">https://togithub.com/googleapis/google-api-python-client/commit/5eae43739b774edf6fb5b91bd5807a1154533180</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>secretmanager:</strong> Update the api <a href="https://togithub.com/googleapis/google-api-python-client/commit/477de50ccc8bc597101c3c8ac80505565674f6ac">https://togithub.com/googleapis/google-api-python-client/commit/477de50ccc8bc597101c3c8ac80505565674f6ac</a> (<a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d">165d3b5</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/google-api-python-client/commit/6ba5c06d12daa80acd78a2a063e6297426a57e91"><code>6ba5c06</code></a> chore(main): release 2.160.0 (<a href="https://redirect.github.com/googleapis/google-api-python-client/issues/2552">#2552</a>)</li> <li><a href="https://github.com/googleapis/google-api-python-client/commit/165d3b5ad067af9d88bb753046bf6407ebfc6f9d"><code>165d3b5</code></a> chore: Update discovery artifacts (<a href="https://redirect.github.com/googleapis/google-api-python-client/issues/2551">#2551</a>)</li> <li><a href="https://github.com/googleapis/google-api-python-client/commit/f4b30142124a30c2e604e7125ef2f4ee4cb5d533"><code>f4b3014</code></a> chore(python): exclude .github/workflows/unittest.yml in renovate config (<a href="https://redirect.github.com/googleapis/google-api-python-client/issues/2546">#2546</a>)</li> <li>See full diff in <a href="https://github.com/googleapis/google-api-python-client/compare/v2.159.0...v2.160.0">compare view</a></li> </ul> </details> <br /> Updates `groq` from 0.13.1 to 0.15.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.15.0</h2> <h2>0.15.0 (2025-01-11)</h2> <p>Full Changelog: <a href="https://github.com/groq/groq-python/compare/v0.14.0...v0.15.0">v0.14.0...v0.15.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/175">#175</a>) (<a href="https://github.com/groq/groq-python/commit/61cffbc78a279fd4ac04d338690925c4f19fa20a">61cffbc</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>correctly handle deserialising <code>cls</code> fields (<a href="https://redirect.github.com/groq/groq-python/issues/174">#174</a>) (<a href="https://github.com/groq/groq-python/commit/0b2e997ce4dfad51b7d4d87c5fa5d376488b4d04">0b2e997</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/172">#172</a>) (<a href="https://github.com/groq/groq-python/commit/d6ecadaa2433245acaa21bee0ea003e69a9bcb0a">d6ecada</a>)</li> </ul> <h2>v0.14.0</h2> <h2>0.14.0 (2025-01-09)</h2> <p>Full Changelog: <a href="https://github.com/groq/groq-python/compare/v0.13.1...v0.14.0">v0.13.1...v0.14.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/163">#163</a>) (<a href="https://github.com/groq/groq-python/commit/43a7a5b048b22f4a5edba53ec31b2b8967681708">43a7a5b</a>)</li> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/167">#167</a>) (<a href="https://github.com/groq/groq-python/commit/5016206e461c384806ac3c68b8dfab3d342ba93c">5016206</a>)</li> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/170">#170</a>) (<a href="https://github.com/groq/groq-python/commit/2b35e952e12020116adc45e40007c3fd61db1bb7">2b35e95</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>client:</strong> only call .close() when needed (<a href="https://redirect.github.com/groq/groq-python/issues/169">#169</a>) (<a href="https://github.com/groq/groq-python/commit/6a0ec576de707ed90a4a536ff206e9ee07fc5a3a">6a0ec57</a>)</li> </ul> <h3>Chores</h3> <ul> <li>add missing isclass check (<a href="https://redirect.github.com/groq/groq-python/issues/166">#166</a>) (<a href="https://github.com/groq/groq-python/commit/9cb1e727377c93c92d1bbd49f1c5b8613730c3a6">9cb1e72</a>)</li> <li><strong>internal:</strong> bump httpx dependency (<a href="https://redirect.github.com/groq/groq-python/issues/168">#168</a>) (<a href="https://github.com/groq/groq-python/commit/c260ae969caa5f4e7b48dd558802b933da98bed6">c260ae9</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/158">#158</a>) (<a href="https://github.com/groq/groq-python/commit/85b5765b2b6cfa9560c763600699fd05f7b2a632">85b5765</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/160">#160</a>) (<a href="https://github.com/groq/groq-python/commit/8b87c4d657e0a9d2296323eff6d298ec98b34b3e">8b87c4d</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/164">#164</a>) (<a href="https://github.com/groq/groq-python/commit/d7b6be5f4bba87002409330644045ba630856880">d7b6be5</a>)</li> <li><strong>internal:</strong> fix some typos (<a href="https://redirect.github.com/groq/groq-python/issues/162">#162</a>) (<a href="https://github.com/groq/groq-python/commit/32482ae691f24fdbd5c80282c597a299a48a247d">32482ae</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>readme:</strong> example snippet for client context manager (<a href="https://redirect.github.com/groq/groq-python/issues/161">#161</a>) (<a href="https://github.com/groq/groq-python/commit/b7bfd15768d60beb2059ab3d326bae1b19c6bf17">b7bfd15</a>)</li> </ul> </blockquote> </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.15.0 (2025-01-11)</h2> <p>Full Changelog: <a href="https://github.com/groq/groq-python/compare/v0.14.0...v0.15.0">v0.14.0...v0.15.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/175">#175</a>) (<a href="https://github.com/groq/groq-python/commit/61cffbc78a279fd4ac04d338690925c4f19fa20a">61cffbc</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>correctly handle deserialising <code>cls</code> fields (<a href="https://redirect.github.com/groq/groq-python/issues/174">#174</a>) (<a href="https://github.com/groq/groq-python/commit/0b2e997ce4dfad51b7d4d87c5fa5d376488b4d04">0b2e997</a>)</li> </ul> <h3>Chores</h3> <ul> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/172">#172</a>) (<a href="https://github.com/groq/groq-python/commit/d6ecadaa2433245acaa21bee0ea003e69a9bcb0a">d6ecada</a>)</li> </ul> <h2>0.14.0 (2025-01-09)</h2> <p>Full Changelog: <a href="https://github.com/groq/groq-python/compare/v0.13.1...v0.14.0">v0.13.1...v0.14.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/163">#163</a>) (<a href="https://github.com/groq/groq-python/commit/43a7a5b048b22f4a5edba53ec31b2b8967681708">43a7a5b</a>)</li> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/167">#167</a>) (<a href="https://github.com/groq/groq-python/commit/5016206e461c384806ac3c68b8dfab3d342ba93c">5016206</a>)</li> <li><strong>api:</strong> api update (<a href="https://redirect.github.com/groq/groq-python/issues/170">#170</a>) (<a href="https://github.com/groq/groq-python/commit/2b35e952e12020116adc45e40007c3fd61db1bb7">2b35e95</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>client:</strong> only call .close() when needed (<a href="https://redirect.github.com/groq/groq-python/issues/169">#169</a>) (<a href="https://github.com/groq/groq-python/commit/6a0ec576de707ed90a4a536ff206e9ee07fc5a3a">6a0ec57</a>)</li> </ul> <h3>Chores</h3> <ul> <li>add missing isclass check (<a href="https://redirect.github.com/groq/groq-python/issues/166">#166</a>) (<a href="https://github.com/groq/groq-python/commit/9cb1e727377c93c92d1bbd49f1c5b8613730c3a6">9cb1e72</a>)</li> <li><strong>internal:</strong> bump httpx dependency (<a href="https://redirect.github.com/groq/groq-python/issues/168">#168</a>) (<a href="https://github.com/groq/groq-python/commit/c260ae969caa5f4e7b48dd558802b933da98bed6">c260ae9</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/158">#158</a>) (<a href="https://github.com/groq/groq-python/commit/85b5765b2b6cfa9560c763600699fd05f7b2a632">85b5765</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/160">#160</a>) (<a href="https://github.com/groq/groq-python/commit/8b87c4d657e0a9d2296323eff6d298ec98b34b3e">8b87c4d</a>)</li> <li><strong>internal:</strong> codegen related update (<a href="https://redirect.github.com/groq/groq-python/issues/164">#164</a>) (<a href="https://github.com/groq/groq-python/commit/d7b6be5f4bba87002409330644045ba630856880">d7b6be5</a>)</li> <li><strong>internal:</strong> fix some typos (<a href="https://redirect.github.com/groq/groq-python/issues/162">#162</a>) (<a href="https://github.com/groq/groq-python/commit/32482ae691f24fdbd5c80282c597a299a48a247d">32482ae</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>readme:</strong> example snippet for client context manager (<a href="https://redirect.github.com/groq/groq-python/issues/161">#161</a>) (<a href="https://github.com/groq/groq-python/commit/b7bfd15768d60beb2059ab3d326bae1b19c6bf17">b7bfd15</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/groq/groq-python/commit/2b91340106d3e6b0f06f3cad4cfde436866cdfd2"><code>2b91340</code></a> release: 0.15.0 (<a href="https://redirect.github.com/groq/groq-python/issues/173">#173</a>)</li> <li><a href="https://github.com/groq/groq-python/commit/f6e2c46aa4a34f344521702b96c6fc0fb377112a"><code>f6e2c46</code></a> release: 0.14.0 (<a href="https://redirect.github.com/groq/groq-python/issues/159">#159</a>)</li> <li>See full diff in <a href="https://github.com/groq/groq-python/compare/v0.13.1...v0.15.0">compare view</a></li> </ul> </details> <br /> Updates `openai` from 1.60.0 to 1.60.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/openai/openai-python/releases">openai's releases</a>.</em></p> <blockquote> <h2>v1.60.2</h2> <h2>1.60.2 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v1.60.1...v1.60.2">v1.60.1...v1.60.2</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>parsing:</strong> don't validate input tools in the asynchronous <code>.parse()</code> method (<a href="https://github.com/openai/openai-python/commit/6fcfe73cd335853c7dd2cd3151a0d5d1785cfc9c">6fcfe73</a>)</li> </ul> <h2>v1.60.1</h2> <h2>1.60.1 (2025-01-24)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.1">v1.60.0...v1.60.1</a></p> <h3>Chores</h3> <ul> <li><strong>internal:</strong> minor formatting changes (<a href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>) (<a href="https://github.com/openai/openai-python/commit/9c44192be5776d9252d36dc027a33c60b33d81b2">9c44192</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>examples/azure:</strong> add async snippet (<a href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>) (<a href="https://github.com/openai/openai-python/commit/f60eda1c1e8caf0ec2274b18b3fb2252304196db">f60eda1</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/openai/openai-python/blob/main/CHANGELOG.md">openai's changelog</a>.</em></p> <blockquote> <h2>1.60.2 (2025-01-27)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v1.60.1...v1.60.2">v1.60.1...v1.60.2</a></p> <h3>Bug Fixes</h3> <ul> <li><strong>parsing:</strong> don't validate input tools in the asynchronous <code>.parse()</code> method (<a href="https://github.com/openai/openai-python/commit/6fcfe73cd335853c7dd2cd3151a0d5d1785cfc9c">6fcfe73</a>)</li> </ul> <h2>1.60.1 (2025-01-24)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.1">v1.60.0...v1.60.1</a></p> <h3>Chores</h3> <ul> <li><strong>internal:</strong> minor formatting changes (<a href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>) (<a href="https://github.com/openai/openai-python/commit/9c44192be5776d9252d36dc027a33c60b33d81b2">9c44192</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>examples/azure:</strong> add async snippet (<a href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>) (<a href="https://github.com/openai/openai-python/commit/f60eda1c1e8caf0ec2274b18b3fb2252304196db">f60eda1</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/openai/openai-python/commit/d16e6edde5a155626910b5758a0b939bfedb9ced"><code>d16e6ed</code></a> release: 1.60.2</li> <li><a href="https://github.com/openai/openai-python/commit/257d79e8a00144a7317d511401da2432a4201c7b"><code>257d79e</code></a> fix(parsing): don't validate input tools in the asynchronous <code>.parse()</code> method</li> <li><a href="https://github.com/openai/openai-python/commit/b95be16e7c8a76c3d63335df13ab0d55ba3d5c35"><code>b95be16</code></a> release: 1.60.1</li> <li><a href="https://github.com/openai/openai-python/commit/27d0e67b1d121ccc5b48c95e1f0bc3f6e93e9bd3"><code>27d0e67</code></a> chore(internal): minor formatting changes (<a href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>)</li> <li><a href="https://github.com/openai/openai-python/commit/abc5459c7504eec25a67b35104e2e09e7d8f232c"><code>abc5459</code></a> docs(examples/azure): add async snippet (<a href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>)</li> <li>See full diff in <a href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.2">compare view</a></li> </ul> </details> <br /> Updates `pytest-asyncio` from 0.25.2 to 0.25.3 <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.25.3</h2> <ul> <li>Avoid errors in cleanup of async generators when event loop is already closed <a href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1040">#1040</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pytest-dev/pytest-asyncio/commit/7c501923b00b4aeeb68d4b3b11065f0c3b5cba2c"><code>7c50192</code></a> fix: Avoid errors in cleanup of async generators when event loop is already c...</li> <li>See full diff in <a href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.2...v0.25.3">compare view</a></li> </ul> </details> <br /> Updates `sentry-sdk` from 2.19.2 to 2.20.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/getsentry/sentry-python/releases">sentry-sdk's releases</a>.</em></p> <blockquote> <h2>2.20.0</h2> <ul> <li> <p><strong>New integration:</strong> Add <a href="https://typer.tiangolo.com/">Typer</a> integration (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3869">#3869</a>) by <a href="https://github.com/patrick91"><code>@​patrick91</code></a></p> <p>For more information, see the documentation for the <a href="https://docs.sentry.io/platforms/python/integrations/typer/">TyperIntegration</a>.</p> </li> <li> <p><strong>New integration:</strong> Add <a href="https://www.getunleash.io/">Unleash</a> feature flagging integration (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> <p>For more information, see the documentation for the <a href="https://docs.sentry.io/platforms/python/integrations/unleash/">UnleashIntegration</a>.</p> </li> <li> <p>Add custom tracking of feature flag evaluations (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3860">#3860</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Feature Flags: Register LD hook in setup instead of init, and don't check for initialization (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3890">#3890</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Feature Flags: Moved adding of <code>flags</code> context into Scope (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Create a separate group for feature flag test suites (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Fix flaky LaunchDarkly tests (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3896">#3896</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Fix LRU cache copying (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3883">#3883</a>) by <a href="https://github.com/ffelixg"><code>@​ffelixg</code></a></p> </li> <li> <p>Fix cache pollution from mutable reference (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3887">#3887</a>) by <a href="https://github.com/cmanallen"><code>@​cmanallen</code></a></p> </li> <li> <p>Centralize minimum version checking (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Support SparkIntegration activation after SparkContext created (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3411">#3411</a>) by <a href="https://github.com/seyoon-lim"><code>@​seyoon-lim</code></a></p> </li> <li> <p>Preserve ARQ enqueue_job <strong>kwdefaults</strong> after patching (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3903">#3903</a>) by <a href="https://github.com/danmr"><code>@​danmr</code></a></p> </li> <li> <p>Add Github workflow to comment on issues when a fix was released (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3866">#3866</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Update test matrix for Sanic (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3904">#3904</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Rename scripts (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3885">#3885</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Fix CI (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3878">#3878</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Treat <code>potel-base</code> as release branch in CI (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>build(deps): bump actions/create-github-app-token from 1.11.0 to 1.11.1 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3893">#3893</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> <li> <p>build(deps): bump codecov/codecov-action from 5.0.7 to 5.1.1 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3867">#3867</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> <li> <p>build(deps): bump codecov/codecov-action from 5.1.1 to 5.1.2 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3892">#3892</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md">sentry-sdk's changelog</a>.</em></p> <blockquote> <h2>2.20.0</h2> <ul> <li> <p><strong>New integration:</strong> Add <a href="https://typer.tiangolo.com/">Typer</a> integration (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3869">#3869</a>) by <a href="https://github.com/patrick91"><code>@​patrick91</code></a></p> <p>For more information, see the documentation for the <a href="https://docs.sentry.io/platforms/python/integrations/typer/">TyperIntegration</a>.</p> </li> <li> <p><strong>New integration:</strong> Add <a href="https://www.getunleash.io/">Unleash</a> feature flagging integration (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> <p>For more information, see the documentation for the <a href="https://docs.sentry.io/platforms/python/integrations/unleash/">UnleashIntegration</a>.</p> </li> <li> <p>Add custom tracking of feature flag evaluations (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3860">#3860</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Feature Flags: Register LD hook in setup instead of init, and don't check for initialization (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3890">#3890</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Feature Flags: Moved adding of <code>flags</code> context into Scope (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Create a separate group for feature flag test suites (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Fix flaky LaunchDarkly tests (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3896">#3896</a>) by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p> </li> <li> <p>Fix LRU cache copying (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3883">#3883</a>) by <a href="https://github.com/ffelixg"><code>@​ffelixg</code></a></p> </li> <li> <p>Fix cache pollution from mutable reference (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3887">#3887</a>) by <a href="https://github.com/cmanallen"><code>@​cmanallen</code></a></p> </li> <li> <p>Centralize minimum version checking (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Support SparkIntegration activation after SparkContext created (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3411">#3411</a>) by <a href="https://github.com/seyoon-lim"><code>@​seyoon-lim</code></a></p> </li> <li> <p>Preserve ARQ enqueue_job <strong>kwdefaults</strong> after patching (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3903">#3903</a>) by <a href="https://github.com/danmr"><code>@​danmr</code></a></p> </li> <li> <p>Add Github workflow to comment on issues when a fix was released (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3866">#3866</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Update test matrix for Sanic (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3904">#3904</a>) by <a href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p> </li> <li> <p>Rename scripts (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3885">#3885</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Fix CI (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3878">#3878</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>Treat <code>potel-base</code> as release branch in CI (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>) by <a href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p> </li> <li> <p>build(deps): bump actions/create-github-app-token from 1.11.0 to 1.11.1 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3893">#3893</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> <li> <p>build(deps): bump codecov/codecov-action from 5.0.7 to 5.1.1 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3867">#3867</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> <li> <p>build(deps): bump codecov/codecov-action from 5.1.1 to 5.1.2 (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3892">#3892</a>) by <a href="https://github.com/dependabot"><code>@​dependabot</code></a></p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/getsentry/sentry-python/commit/4e0505ea5c58943f31de35f03d834daa18e7f7ed"><code>4e0505e</code></a> Updated changelog</li> <li><a href="https://github.com/getsentry/sentry-python/commit/ca68a7f3fb8e1cb6e1c58432211422b4c2bc4530"><code>ca68a7f</code></a> release: 2.20.0</li> <li><a href="https://github.com/getsentry/sentry-python/commit/2ee194c0d4fac809b40ef81d90ae859998962afa"><code>2ee194c</code></a> feat(flags): remove Unleash get_variant patching code (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3914">#3914</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/288f69a962e4ae9e929ae1116ec683297a0a416a"><code>288f69a</code></a> Moved adding of <code>flags</code> context into Scope (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/9f9ff345c6054e0623a293c1f90e6e590ceb8a9f"><code>9f9ff34</code></a> tests: Create a separate group for feature flag suites (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/fa241c3425e446878f173407fd7358f38d8bd529"><code>fa241c3</code></a> Treat potel-base as release branch in CI (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/be5327356fdae8efc77a9faa9a2ffb0773e80665"><code>be53273</code></a> Centralize minimum version checking (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/4432e26a45873080d4eaf20e769bc82f026851bb"><code>4432e26</code></a> Small contribution docs update (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3909">#3909</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/c6a89d64db965fe0ece6de10df38ab936af8f5e4"><code>c6a89d6</code></a> feat(flags): add Unleash feature flagging integration (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>)</li> <li><a href="https://github.com/getsentry/sentry-python/commit/bf65ede42172dd9bc6718b69e3ea9a9dd417c93d"><code>bf65ede</code></a> ref(flags): Beter naming for featureflags module and identifier (<a href="https://redirect.github.com/getsentry/sentry-python/issues/3902">#3902</a>)</li> <li>Additional commits viewable in <a href="https://github.com/getsentry/sentry-python/compare/2.19.2...2.20.0">compare view</a></li> </ul> </details> <br /> Updates `stripe` from 11.4.1 to 11.5.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/stripe/stripe-python/releases">stripe's releases</a>.</em></p> <blockquote> <h2>v11.5.0</h2> <h2>11.5.0 - 2025-01-27</h2> <ul> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1443">#1443</a> Update generated code <ul> <li>Add support for <code>pay_by_bank_payments</code> on resource class <code>stripe.Account.Capabilities</code> and parameter class <code>stripe.Account.CreateParamsCapabilities</code></li> <li>Add support for <code>directorship_declaration</code> on resource class <code>stripe.Account.Company</code> and parameter classes <code>stripe.Account.CreateParamsCompany</code> and <code>stripe.Token.CreateParamsAccountCompany</code></li> <li>Add support for <code>ownership_exemption_reason</code> on resource class <code>stripe.Account.Company</code> and parameter classes <code>stripe.Account.CreateParamsCompany</code> and <code>stripe.Token.CreateParamsAccountCompany</code></li> <li>Add support for <code>proof_of_ultimate_beneficial_ownership</code> on parameter class <code>stripe.Account.CreateParamsDocuments</code></li> <li>Add support for <code>financial_account</code> on resource classes <code>stripe.AccountSession.Components</code> and <code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails</code> and parameter class <code>stripe.AccountSession.CreateParamsComponents</code></li> <li>Add support for <code>issuing_card</code> on resource class <code>stripe.AccountSession.Components</code> and parameter class <code>stripe.AccountSession.CreateParamsComponents</code></li> <li>Add support for <code>advice_code</code> on resource classes <code>stripe.Charge.Outcome</code>, <code>stripe.Invoice.LastFinalizationError</code>, <code>stripe.PaymentIntent.LastPaymentError</code>, <code>stripe.SetupAttempt.SetupError</code>, and <code>stripe.SetupIntent.LastSetupError</code></li> <li>Add support for <code>country</code> on resource classes <code>stripe.Charge.PaymentMethodDetails.Paypal</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview.Paypal</code>, and <code>stripe.PaymentMethod.Paypal</code></li> <li>Add support for <code>pay_by_bank</code> on resource classes <code>stripe.Charge.PaymentMethodDetails</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview</code>, and <code>stripe.PaymentIntent.PaymentMethodOptions</code>, parameter classes <code>stripe.ConfirmationToken.CreateParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodOptions</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodOptions</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodOptions</code>, <code>stripe.PaymentMethod.CreateParams</code>, <code>stripe.PaymentMethod.ModifyParams</code>, <code>stripe.PaymentMethodConfiguration.CreateParams</code>, <code>stripe.PaymentMethodConfiguration.ModifyParams</code>, <code>stripe.SetupIntent.ConfirmParamsPaymentMethodData</code>, <code>stripe.SetupIntent.CreateParamsPaymentMethodData</code>, <code>stripe.SetupIntent.ModifyParamsPaymentMethodData</code>, and <code>stripe.checkout.Session.CreateParamsPaymentMethodOptions</code>, and resources <code>stripe.PaymentMethod</code> and <code>stripe.PaymentMethodConfiguration</code></li> <li>Add support for <code>phone_number_collection</code> on parameter class <code>stripe.PaymentLink.ModifyParams</code></li> <li>Add support for <code>discounts</code> on resource <code>stripe.checkout.Session</code></li> <li>Add support for <code>jpy</code> on parameter classes <code>stripe.terminal.Configuration.CreateParamsTipping</code> and <code>stripe.terminal.Configuration.ModifyParamsTipping</code> and resource class <code>stripe.terminal.Configuration.Tipping</code></li> <li>Add support for <code>nickname</code> on parameter classes <code>stripe.treasury.FinancialAccount.CreateParams</code> and <code>stripe.treasury.FinancialAccount.ModifyParams</code> and resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>forwarding_settings</code> on parameter class <code>stripe.treasury.FinancialAccount.ModifyParams</code></li> <li>Add support for <code>_cls_close</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>close</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>is_default</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>destination_payment_method_data</code> on parameter class <code>stripe.treasury.OutboundTransfer.CreateParams</code></li> <li>Add support for <code>outbound_transfer</code> on resource class <code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails</code></li> <li>Add support for <code>SD</code> on enums <code>stripe.checkout.Session.ShippingAddressCollection.allowed_countries</code>, <code>stripe.checkout.Session.CreateParamsShippingAddressCollection.allowed_countries</code>, <code>stripe.PaymentLink.ShippingAddressCollection.allowed_countries</code>, <code>stripe.PaymentLink.CreateParamsShippingAddressCollection.allowed_countries</code>, and <code>stripe.PaymentLink.ModifyParamsShippingAddressCollection.allowed_countries</code></li> <li>Add support for <code>pay_by_bank</code> on enums <code>stripe.checkout.Session.CreateParams.payment_method_types</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview.type</code>, <code>stripe.ConfirmationToken.CreateParamsPaymentMethodData.type</code>, <code>stripe.Customer.ListPaymentMethodsParams.type</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData.type</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodData.type</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodData.type</code>, <code>stripe.PaymentLink.payment_method_types</code>, <code>stripe.PaymentLink.CreateParams.payment_method_types</code>, <code>stripe.PaymentLink.ModifyParams.payment_method_types</code>, <code>stripe.PaymentMethod.type</code>, <code>stripe.PaymentMethod.CreateParams.type</code>, <code>stripe.PaymentMethod.ListParams.type</code>, <code>stripe.SetupIntent.ConfirmParamsPaymentMethodData.type</code>, <code>stripe.SetupIntent.CreateParamsPaymentMethodData.type</code>, and <code>stripe.SetupIntent.ModifyParamsPaymentMethodData.type</code></li> <li>Add support for <code>financial_account</code> on enum <code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails.type</code></li> <li>Add support for <code>outbound_transfer</code> on enums <code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails.type</code> and <code>stripe.treasury.ReceivedCredit.ListParamsLinkedFlows.source_flow_type</code></li> <li>Add support for <code>2025-01-27.acacia</code> on enum <code>stripe.WebhookEndpoint.CreateParams.api_version</code></li> <li>Change type of <code>pretax_credit_amounts</code> on <code>stripe.CreditNote</code> and <code>stripe.CreditNoteLineItem</code> from <code>Optional[List[PretaxCreditAmount]]</code> to <code>List[PretaxCreditAmount]</code></li> </ul> </li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1451">#1451</a> Upgrade to download-artifact@v4</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1448">#1448</a> Updated upload artifact ci action</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1446">#1446</a> add just to publish CI</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1444">#1444</a> Added CONTRIBUTING.md file</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1445">#1445</a> minor justfile fixes & pin CI version</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1440">#1440</a> add justfile, update readme, remove coveralls</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1442">#1442</a> Fix V2 ListObject.data type hint <ul> <li>Change <code>stripe.v2.ListObject.data</code> type hint from <code>List[StripeObject]</code> to <code>List[T]</code> where T is the specific stripe object contained within the list</li> </ul> </li> </ul> <p>See <a href="https://github.com/stripe/stripe-python/blob/v11.5.0b3/CHANGELOG.md">the changelog for more details</a>.</p> <h2>v11.5.0b3</h2> <ul> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1447">#1447</a> Update generated code for beta <ul> <li>Remove support for <code>stripe_account</code> on resource classes <code>stripe.terminal.Reader.Action.CollectPaymentMethod</code>, <code>stripe.terminal.Reader.Action.ConfirmPaymentIntent</code>, <code>stripe.terminal.Reader.Action.ProcessPaymentIntent</code>, and <code>stripe.terminal.Reader.Action.RefundPayment</code></li> </ul> </li> </ul> <p>See <a href="https://github.com/stripe/stripe-python/blob/v11.5.0b3/CHANGELOG.md">the changelog for more details</a>.</p> <h2>v11.5.0b2</h2> <ul> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1439">#1439</a> Update generated code for beta <ul> <li>Add support for <code>pay_by_bank_payments</code> on resource class <code>stripe.Account.Capabilities</code> and parameter class <code>stripe.Account.CreateParamsCapabilities</code></li> <li>Add support for <code>directorship_declaration</code> on parameter classes <code>stripe.Account.CreateParamsCompany</code> and <code>stripe.Token.CreateParamsAccountCompany</code></li> <li>Add support for <code>proof_of_ultimate_beneficial_ownership</code> on parameter class <code>stripe.Account.CreateParamsDocuments</code></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/stripe/stripe-python/blob/master/CHANGELOG.md">stripe's changelog</a>.</em></p> <blockquote> <h2>11.5.0 - 2025-01-27</h2> <ul> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1443">#1443</a> Update generated code <ul> <li>Add support for <code>pay_by_bank_payments</code> on resource class <code>stripe.Account.Capabilities</code> and parameter class <code>stripe.Account.CreateParamsCapabilities</code></li> <li>Add support for <code>directorship_declaration</code> on resource class <code>stripe.Account.Company</code> and parameter classes <code>stripe.Account.CreateParamsCompany</code> and <code>stripe.Token.CreateParamsAccountCompany</code></li> <li>Add support for <code>ownership_exemption_reason</code> on resource class <code>stripe.Account.Company</code> and parameter classes <code>stripe.Account.CreateParamsCompany</code> and <code>stripe.Token.CreateParamsAccountCompany</code></li> <li>Add support for <code>proof_of_ultimate_beneficial_ownership</code> on parameter class <code>stripe.Account.CreateParamsDocuments</code></li> <li>Add support for <code>financial_account</code> on resource classes <code>stripe.AccountSession.Components</code> and <code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails</code> and parameter class <code>stripe.AccountSession.CreateParamsComponents</code></li> <li>Add support for <code>issuing_card</code> on resource class <code>stripe.AccountSession.Components</code> and parameter class <code>stripe.AccountSession.CreateParamsComponents</code></li> <li>Add support for <code>advice_code</code> on resource classes <code>stripe.Charge.Outcome</code>, <code>stripe.Invoice.LastFinalizationError</code>, <code>stripe.PaymentIntent.LastPaymentError</code>, <code>stripe.SetupAttempt.SetupError</code>, and <code>stripe.SetupIntent.LastSetupError</code></li> <li>Add support for <code>country</code> on resource classes <code>stripe.Charge.PaymentMethodDetails.Paypal</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview.Paypal</code>, and <code>stripe.PaymentMethod.Paypal</code></li> <li>Add support for <code>pay_by_bank</code> on resource classes <code>stripe.Charge.PaymentMethodDetails</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview</code>, and <code>stripe.PaymentIntent.PaymentMethodOptions</code>, parameter classes <code>stripe.ConfirmationToken.CreateParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodOptions</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodOptions</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodData</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodOptions</code>, <code>stripe.PaymentMethod.CreateParams</code>, <code>stripe.PaymentMethod.ModifyParams</code>, <code>stripe.PaymentMethodConfiguration.CreateParams</code>, <code>stripe.PaymentMethodConfiguration.ModifyParams</code>, <code>stripe.SetupIntent.ConfirmParamsPaymentMethodData</code>, <code>stripe.SetupIntent.CreateParamsPaymentMethodData</code>, <code>stripe.SetupIntent.ModifyParamsPaymentMethodData</code>, and <code>stripe.checkout.Session.CreateParamsPaymentMethodOptions</code>, and resources <code>stripe.PaymentMethod</code> and <code>stripe.PaymentMethodConfiguration</code></li> <li>Add support for <code>phone_number_collection</code> on parameter class <code>stripe.PaymentLink.ModifyParams</code></li> <li>Add support for <code>discounts</code> on resource <code>stripe.checkout.Session</code></li> <li>Add support for <code>jpy</code> on parameter classes <code>stripe.terminal.Configuration.CreateParamsTipping</code> and <code>stripe.terminal.Configuration.ModifyParamsTipping</code> and resource class <code>stripe.terminal.Configuration.Tipping</code></li> <li>Add support for <code>nickname</code> on parameter classes <code>stripe.treasury.FinancialAccount.CreateParams</code> and <code>stripe.treasury.FinancialAccount.ModifyParams</code> and resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>forwarding_settings</code> on parameter class <code>stripe.treasury.FinancialAccount.ModifyParams</code></li> <li>Add support for <code>_cls_close</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>close</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>is_default</code> on resource <code>stripe.treasury.FinancialAccount</code></li> <li>Add support for <code>destination_payment_method_data</code> on parameter class <code>stripe.treasury.OutboundTransfer.CreateParams</code></li> <li>Add support for <code>outbound_transfer</code> on resource class <code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails</code></li> <li>Add support for <code>SD</code> on enums <code>stripe.checkout.Session.ShippingAddressCollection.allowed_countries</code>, <code>stripe.checkout.Session.CreateParamsShippingAddressCollection.allowed_countries</code>, <code>stripe.PaymentLink.ShippingAddressCollection.allowed_countries</code>, <code>stripe.PaymentLink.CreateParamsShippingAddressCollection.allowed_countries</code>, and <code>stripe.PaymentLink.ModifyParamsShippingAddressCollection.allowed_countries</code></li> <li>Add support for <code>pay_by_bank</code> on enums <code>stripe.checkout.Session.CreateParams.payment_method_types</code>, <code>stripe.ConfirmationToken.PaymentMethodPreview.type</code>, <code>stripe.ConfirmationToken.CreateParamsPaymentMethodData.type</code>, <code>stripe.Customer.ListPaymentMethodsParams.type</code>, <code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData.type</code>, <code>stripe.PaymentIntent.CreateParamsPaymentMethodData.type</code>, <code>stripe.PaymentIntent.ModifyParamsPaymentMethodData.type</code>, <code>stripe.PaymentLink.payment_method_types</code>, <code>stripe.PaymentLink.CreateParams.payment_method_types</code>, <code>stripe.PaymentLink.ModifyParams.payment_method_types</code>, <code>stripe.PaymentMethod.type</code>, <code>stripe.PaymentMethod.CreateParams.type</code>, <code>stripe.PaymentMethod.ListParams.type</code>, <code>stripe.SetupIntent.ConfirmParamsPaymentMethodData.type</code>, <code>stripe.SetupIntent.CreateParamsPaymentMethodData.type</code>, and <code>stripe.SetupIntent.ModifyParamsPaymentMethodData.type</code></li> <li>Add support for <code>financial_account</code> on enum <code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails.type</code></li> <li>Add support for <code>outbound_transfer</code> on enums <code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails.type</code> and <code>stripe.treasury.ReceivedCredit.ListParamsLinkedFlows.source_flow_type</code></li> <li>Add support for <code>2025-01-27.acacia</code> on enum <code>stripe.WebhookEndpoint.CreateParams.api_version</code></li> <li>Change type of <code>pretax_credit_amounts</code> on <code>stripe.CreditNote</code> and <code>stripe.CreditNoteLineItem</code> from <code>Optional[List[PretaxCreditAmount]]</code> to <code>List[PretaxCreditAmount]</code></li> </ul> </li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1451">#1451</a> Upgrade to download-artifact@v4</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1448">#1448</a> Updated upload artifact ci action</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1446">#1446</a> add just to publish CI</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1444">#1444</a> Added CONTRIBUTING.md file</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1445">#1445</a> minor justfile fixes & pin CI version</li> <li><a href="https://redirect.github.com/stripe/stripe-python/pull/1440">#1440</a> add justfile, update readme, remove coveralls</li> <li><a href="https://redirect... _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> --- autogpt_platform/backend/poetry.lock | 59 +++++++++++++------------ autogpt_platform/backend/pyproject.toml | 18 ++++---- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/autogpt_platform/backend/poetry.lock b/autogpt_platform/backend/poetry.lock index 8a195bc1b..deb4bc8fc 100644 --- a/autogpt_platform/backend/poetry.lock +++ b/autogpt_platform/backend/poetry.lock @@ -173,14 +173,14 @@ files = [ [[package]] name = "anthropic" -version = "0.40.0" +version = "0.45.2" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "anthropic-0.40.0-py3-none-any.whl", hash = "sha256:442028ae8790ff9e3b6f8912043918755af1230d193904ae2ef78cc22995280c"}, - {file = "anthropic-0.40.0.tar.gz", hash = "sha256:3efeca6d9e97813f93ed34322c6c7ea2279bf0824cd0aa71b59ce222665e2b87"}, + {file = "anthropic-0.45.2-py3-none-any.whl", hash = "sha256:ecd746f7274451dfcb7e1180571ead624c7e1195d1d46cb7c70143d2aedb4d35"}, + {file = "anthropic-0.45.2.tar.gz", hash = "sha256:32a18b9ecd12c91b2be4cae6ca2ab46a06937b5aa01b21308d97a6d29794fb5e"}, ] [package.dependencies] @@ -190,7 +190,7 @@ httpx = ">=0.23.0,<1" jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.10,<5" [package.extras] bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] @@ -1015,14 +1015,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.159.0" +version = "2.160.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "google_api_python_client-2.159.0-py2.py3-none-any.whl", hash = "sha256:baef0bb631a60a0bd7c0bf12a5499e3a40cd4388484de7ee55c1950bf820a0cf"}, - {file = "google_api_python_client-2.159.0.tar.gz", hash = "sha256:55197f430f25c907394b44fa078545ffef89d33fd4dca501b7db9f0d8e224bd6"}, + {file = "google_api_python_client-2.160.0-py2.py3-none-any.whl", hash = "sha256:63d61fb3e4cf3fb31a70a87f45567c22f6dfe87bbfa27252317e3e2c42900db4"}, + {file = "google_api_python_client-2.160.0.tar.gz", hash = "sha256:a8ccafaecfa42d15d5b5c3134ced8de08380019717fc9fb1ed510ca58eca3b7e"}, ] [package.dependencies] @@ -1393,14 +1393,14 @@ test = ["objgraph", "psutil"] [[package]] name = "groq" -version = "0.13.1" +version = "0.15.0" description = "The official Python library for the groq API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "groq-0.13.1-py3-none-any.whl", hash = "sha256:0c5d1d6df93de55de705fe73729b79baaa0c871f7575d6aa64b2962b56101b3e"}, - {file = "groq-0.13.1.tar.gz", hash = "sha256:588fd5bee984f4eb46ec89552778d5698b9e9614435defef868645c19463cbcc"}, + {file = "groq-0.15.0-py3-none-any.whl", hash = "sha256:c200558b67fee4b4f2bb89cc166337e3419a68c23280065770f8f8b0729c79ef"}, + {file = "groq-0.15.0.tar.gz", hash = "sha256:9ad08ba6156c67d0975595a8515b517f22ff63158e063c55192e161ed3648af1"}, ] [package.dependencies] @@ -2151,14 +2151,14 @@ files = [ [[package]] name = "mem0ai" -version = "0.1.44" +version = "0.1.48" description = "Long-term memory for AI Agents" optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "mem0ai-0.1.44-py3-none-any.whl", hash = "sha256:32260a2cd935035a1b16ce04ad2e4510a5bd97618709466e2d06303e0eb8d9d4"}, - {file = "mem0ai-0.1.44.tar.gz", hash = "sha256:93214272915d94f673d370bb8fe7a8bfc21806267e65700b471bec454dcdfa5c"}, + {file = "mem0ai-0.1.48-py3-none-any.whl", hash = "sha256:23d1bd591c36da9e1f9f013d6f87a79ef9eb1495ac27b1e380af7f819b07fee0"}, + {file = "mem0ai-0.1.48.tar.gz", hash = "sha256:f5cceb768fa2898e59d55d3d472ccb983e3d9ae82ccba1d435545e16853dbeb6"}, ] [package.dependencies] @@ -2439,14 +2439,14 @@ pydantic = ">=2.9.0,<3.0.0" [[package]] name = "openai" -version = "1.60.0" +version = "1.60.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-1.60.0-py3-none-any.whl", hash = "sha256:df06c43be8018274980ac363da07d4b417bd835ead1c66e14396f6f15a0d5dda"}, - {file = "openai-1.60.0.tar.gz", hash = "sha256:7fa536cd4b644718645b874d2706e36dbbef38b327e42ca0623275da347ee1a9"}, + {file = "openai-1.60.2-py3-none-any.whl", hash = "sha256:993bd11b96900b9098179c728026f016b4982ded7ee30dfcf4555eab1171fff9"}, + {file = "openai-1.60.2.tar.gz", hash = "sha256:a8f843e10f2855713007f491d96afb2694b11b5e02cb97c7d01a0be60bc5bb51"}, ] [package.dependencies] @@ -3451,14 +3451,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.25.2" +version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, - {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, + {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, + {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, ] [package.dependencies] @@ -3959,14 +3959,14 @@ files = [ [[package]] name = "sentry-sdk" -version = "2.19.2" +version = "2.20.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "sentry_sdk-2.19.2-py2.py3-none-any.whl", hash = "sha256:ebdc08228b4d131128e568d696c210d846e5b9d70aa0327dec6b1272d9d40b84"}, - {file = "sentry_sdk-2.19.2.tar.gz", hash = "sha256:467df6e126ba242d39952375dd816fbee0f217d119bf454a8ce74cf1e7909e8d"}, + {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"}, + {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"}, ] [package.dependencies] @@ -4011,6 +4011,7 @@ sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=6)"] +unleash = ["UnleashClient (>=6.0.1)"] [[package]] name = "serpent" @@ -4229,14 +4230,14 @@ test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] [[package]] name = "stripe" -version = "11.4.1" +version = "11.5.0" description = "Python bindings for the Stripe API" optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "stripe-11.4.1-py2.py3-none-any.whl", hash = "sha256:8aa47a241de0355c383c916c4ef7273ab666f096a44ee7081e357db4a36f0cce"}, - {file = "stripe-11.4.1.tar.gz", hash = "sha256:7ddd251b622d490fe57d78487855dc9f4d95b1bb113607e81fd377037a133d5a"}, + {file = "stripe-11.5.0-py2.py3-none-any.whl", hash = "sha256:3b2cd47ed3002328249bff5cacaee38d5e756c3899ab425d3bd07acdaf32534a"}, + {file = "stripe-11.5.0.tar.gz", hash = "sha256:bc3e0358ffc23d5ecfa8aafec1fa4f048ee8107c3237bcb00003e68c8c96fa02"}, ] [package.dependencies] @@ -4245,14 +4246,14 @@ typing-extensions = {version = ">=4.5.0", markers = "python_version >= \"3.7\""} [[package]] name = "supabase" -version = "2.11.0" +version = "2.12.0" description = "Supabase client for Python." optional = false python-versions = "<4.0,>=3.9" groups = ["main"] files = [ - {file = "supabase-2.11.0-py3-none-any.whl", hash = "sha256:67a0da498895f4cd6554935e2854b4c41f87b297b78fb9c9414902a382041406"}, - {file = "supabase-2.11.0.tar.gz", hash = "sha256:2a906f7909fd9a50f944cd9332ce66c684e2d37c0864284d34c5815e6c63cc01"}, + {file = "supabase-2.12.0-py3-none-any.whl", hash = "sha256:f8896f3314179fdf27f8bb8357947493ec32b98dcdac7114208aaf21cd59ce35"}, + {file = "supabase-2.12.0.tar.gz", hash = "sha256:284612c3e94ff4ed2f18c985f5eba4d6e17b5e2bf16a9a24290bb83c9c217078"}, ] [package.dependencies] @@ -5034,4 +5035,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "38a5c750ddca1a6264fd98b7ee74d199c2bbf57d3acc189264bd9f8ec90febc2" +content-hash = "7d37edf4fd4e1935811629fef29d463fa61f904d520aa497de2969fadeba92ec" diff --git a/autogpt_platform/backend/pyproject.toml b/autogpt_platform/backend/pyproject.toml index ad7061468..75305a5ab 100644 --- a/autogpt_platform/backend/pyproject.toml +++ b/autogpt_platform/backend/pyproject.toml @@ -10,7 +10,7 @@ packages = [{ include = "backend", format = "sdist" }] [tool.poetry.dependencies] python = ">=3.10,<3.13" aio-pika = "^9.5.4" -anthropic = "^0.40.0" +anthropic = "^0.45.2" apscheduler = "^3.11.0" autogpt-libs = { path = "../autogpt_libs", develop = true } click = "^8.1.7" @@ -19,14 +19,14 @@ e2b-code-interpreter = "^1.0.1" fastapi = "^0.115.5" feedparser = "^6.0.11" flake8 = "^7.0.0" -google-api-python-client = "^2.154.0" +google-api-python-client = "^2.160.0" google-auth-oauthlib = "^1.2.1" -groq = "^0.13.1" +groq = "^0.15.0" jinja2 = "^3.1.4" jsonref = "^1.1.0" jsonschema = "^4.22.0" ollama = "^0.4.1" -openai = "^1.57.4" +openai = "^1.60.2" praw = "~7.8.1" prisma = "^0.15.0" psutil = "^6.1.0" @@ -34,13 +34,13 @@ pydantic = "^2.9.2" pydantic-settings = "^2.3.4" pyro5 = "^5.15" pytest = "^8.2.1" -pytest-asyncio = "^0.25.0" +pytest-asyncio = "^0.25.3" python-dotenv = "^1.0.1" redis = "^5.2.0" -sentry-sdk = "2.19.2" +sentry-sdk = "2.20.0" strenum = "^0.4.9" -stripe = "^11.3.0" -supabase = "2.11.0" +stripe = "^11.5.0" +supabase = "2.12.0" tenacity = "^9.0.0" tweepy = "^4.14.0" uvicorn = { extras = ["standard"], version = "^0.34.0" } @@ -55,7 +55,7 @@ sqlalchemy = "^2.0.36" psycopg2-binary = "^2.9.10" google-cloud-storage = "^2.18.2" launchdarkly-server-sdk = "^9.8.0" -mem0ai = "^0.1.44" +mem0ai = "^0.1.48" moviepy = "^2.1.2" [tool.poetry.group.dev.dependencies] From b03e3e47a23697cf8b3f704004223db9c2a67c32 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle <nicholas.tindle@agpt.co> Date: Thu, 30 Jan 2025 09:33:59 +0000 Subject: [PATCH 10/12] feat(blocks): add text replace block (#9366) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Clearly explain the need for these changes: --> User in discord requested the replace text block ### Changes 🏗️ - Adds replace text block <!-- 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] Passed unit tests Co-authored-by: Bently <tomnoon9@gmail.com> --- .../backend/backend/blocks/text.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/autogpt_platform/backend/backend/blocks/text.py b/autogpt_platform/backend/backend/blocks/text.py index be0917abe..b2ad5e77e 100644 --- a/autogpt_platform/backend/backend/blocks/text.py +++ b/autogpt_platform/backend/backend/blocks/text.py @@ -252,3 +252,31 @@ class TextSplitBlock(Block): if input_data.strip: texts = [text.strip() for text in texts] yield "texts", texts + + +class TextReplaceBlock(Block): + class Input(BlockSchema): + text: str = SchemaField(description="The text to replace.") + old: str = SchemaField(description="The old text to replace.") + new: str = SchemaField(description="The new text to replace with.") + + class Output(BlockSchema): + output: str = SchemaField(description="The text with the replaced text.") + + def __init__(self): + super().__init__( + id="7e7c87ab-3469-4bcc-9abe-67705091b713", + description="This block is used to replace a text with a new text.", + categories={BlockCategory.TEXT}, + input_schema=TextReplaceBlock.Input, + output_schema=TextReplaceBlock.Output, + test_input=[ + {"text": "Hello, World!", "old": "Hello", "new": "Hi"}, + ], + test_output=[ + ("output", "Hi, World!"), + ], + ) + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + yield "output", input_data.text.replace(input_data.old, input_data.new) From e82df96e569c50ed832542436ce065a8e36ab663 Mon Sep 17 00:00:00 2001 From: Pratim Sadhu <pratimsadhu@icloud.com> Date: Thu, 30 Jan 2025 04:51:56 -0500 Subject: [PATCH 11/12] Fix: Allow further zooming out in the builder (#9325) (#9368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Clearly explain the need for these changes: --> The current minimum zoom level restricts zooming out fully. I reduced the minZoom level to allow more flexible zooming out for users. ### Changes 🏗️ Reduced minZoom from 0.2 to 0.1 in the ReactFlow component to allow further zooming out. <!-- 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 with different elements and zoom ranges to confirm its a smooth transition - [ x ] Checked that canvas and all nodes remain unchanged and interactive Co-authored-by: Bently <tomnoon9@gmail.com> --- autogpt_platform/frontend/src/components/Flow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index df6a6b7b1..3543b5ea1 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -660,7 +660,7 @@ const FlowEditor: React.FC<{ onNodeDragStop={onNodeDragEnd} onNodeDragStart={onNodeDragStart} deleteKeyCode={["Backspace", "Delete"]} - minZoom={0.2} + minZoom={0.1} maxZoom={2} className="dark:bg-slate-900" > From bd27ce5f26fbac4e35d2579ddb59793cb4c8778c Mon Sep 17 00:00:00 2001 From: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Date: Thu, 30 Jan 2025 13:30:59 +0100 Subject: [PATCH 12/12] fix(frontend): Center reset password page (#9377) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Changes 🏗️ - Add `div` to recenter page elements ### 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> --- .../frontend/src/app/reset_password/page.tsx | 148 +++++++++--------- 1 file changed, 75 insertions(+), 73 deletions(-) diff --git a/autogpt_platform/frontend/src/app/reset_password/page.tsx b/autogpt_platform/frontend/src/app/reset_password/page.tsx index 36d1413bf..a99fc378b 100644 --- a/autogpt_platform/frontend/src/app/reset_password/page.tsx +++ b/autogpt_platform/frontend/src/app/reset_password/page.tsx @@ -109,78 +109,80 @@ export default function ResetPasswordPage() { } return ( - <AuthCard> - <AuthHeader>Reset Password</AuthHeader> - {user ? ( - <form onSubmit={changePasswordForm.handleSubmit(onChangePassword)}> - <Form {...changePasswordForm}> - <FormField - control={changePasswordForm.control} - name="password" - render={({ field }) => ( - <FormItem className="mb-6"> - <FormLabel>Password</FormLabel> - <FormControl> - <PasswordInput {...field} /> - </FormControl> - <FormMessage /> - </FormItem> - )} - /> - <FormField - control={changePasswordForm.control} - name="confirmPassword" - render={({ field }) => ( - <FormItem className="mb-6"> - <FormLabel>Confirm Password</FormLabel> - <FormControl> - <PasswordInput {...field} /> - </FormControl> - <FormDescription className="text-sm font-normal leading-tight text-slate-500"> - Password needs to be at least 6 characters long - </FormDescription> - <FormMessage /> - </FormItem> - )} - /> - <AuthButton - onClick={() => onChangePassword(changePasswordForm.getValues())} - isLoading={isLoading} - type="submit" - > - Update password - </AuthButton> - <AuthFeedback message={feedback} isError={isError} /> - </Form> - </form> - ) : ( - <form onSubmit={sendEmailForm.handleSubmit(onSendEmail)}> - <Form {...sendEmailForm}> - <FormField - control={sendEmailForm.control} - name="email" - render={({ field }) => ( - <FormItem className="mb-6"> - <FormLabel>Email</FormLabel> - <FormControl> - <Input placeholder="m@example.com" {...field} /> - </FormControl> - <FormMessage /> - </FormItem> - )} - /> - <AuthButton - onClick={() => onSendEmail(sendEmailForm.getValues())} - isLoading={isLoading} - disabled={disabled} - type="submit" - > - Send reset email - </AuthButton> - <AuthFeedback message={feedback} isError={isError} /> - </Form> - </form> - )} - </AuthCard> + <div className="flex min-h-screen items-center justify-center"> + <AuthCard> + <AuthHeader>Reset Password</AuthHeader> + {user ? ( + <form onSubmit={changePasswordForm.handleSubmit(onChangePassword)}> + <Form {...changePasswordForm}> + <FormField + control={changePasswordForm.control} + name="password" + render={({ field }) => ( + <FormItem className="mb-6"> + <FormLabel>Password</FormLabel> + <FormControl> + <PasswordInput {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <FormField + control={changePasswordForm.control} + name="confirmPassword" + render={({ field }) => ( + <FormItem className="mb-6"> + <FormLabel>Confirm Password</FormLabel> + <FormControl> + <PasswordInput {...field} /> + </FormControl> + <FormDescription className="text-sm font-normal leading-tight text-slate-500"> + Password needs to be at least 6 characters long + </FormDescription> + <FormMessage /> + </FormItem> + )} + /> + <AuthButton + onClick={() => onChangePassword(changePasswordForm.getValues())} + isLoading={isLoading} + type="submit" + > + Update password + </AuthButton> + <AuthFeedback message={feedback} isError={isError} /> + </Form> + </form> + ) : ( + <form onSubmit={sendEmailForm.handleSubmit(onSendEmail)}> + <Form {...sendEmailForm}> + <FormField + control={sendEmailForm.control} + name="email" + render={({ field }) => ( + <FormItem className="mb-6"> + <FormLabel>Email</FormLabel> + <FormControl> + <Input placeholder="m@example.com" {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <AuthButton + onClick={() => onSendEmail(sendEmailForm.getValues())} + isLoading={isLoading} + disabled={disabled} + type="submit" + > + Send reset email + </AuthButton> + <AuthFeedback message={feedback} isError={isError} /> + </Form> + </form> + )} + </AuthCard> + </div> ); }