From 834617d2219924fbee93cd39abcb3178a700c185 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Fri, 31 Oct 2025 12:28:05 -0500 Subject: [PATCH 1/3] hotfix(backend): Clarify prompt requirements for list generation for our friend claude (#11293) --- autogpt_platform/backend/backend/blocks/llm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index 03986e2817..74f53d4bf1 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -1778,6 +1778,7 @@ class AIListGeneratorBlock(AIBlockBase): |``` |Do not include any explanations or additional text, just respond with the list in the format specified above. + |Do not include code fences or any other formatting, just the raw list. """ # If a focus is provided, add it to the prompt if input_data.focus: From 42b9facd4a1940de5ca8092268f7df7cefdeb28b Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Fri, 31 Oct 2025 22:40:44 +0100 Subject: [PATCH 2/3] hotfix(backend/scheduler): Bump `apscheduler` to DST-fixed version 3.11.1 (#11294) - #11273 - Bump `apscheduler` to v3.11.1 which contains a fix for the issue - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] "It's a rather ugly solution but the test proves that it works." ~the maintainer - [x] CI passes --- autogpt_platform/backend/poetry.lock | 8 ++++---- autogpt_platform/backend/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/autogpt_platform/backend/poetry.lock b/autogpt_platform/backend/poetry.lock index 8fc29f7387..99cd853032 100644 --- a/autogpt_platform/backend/poetry.lock +++ b/autogpt_platform/backend/poetry.lock @@ -272,14 +272,14 @@ trio = ["trio (>=0.26.1)"] [[package]] name = "apscheduler" -version = "3.11.0" +version = "3.11.1" description = "In-process task scheduler with Cron-like capabilities" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"}, - {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"}, + {file = "apscheduler-3.11.1-py3-none-any.whl", hash = "sha256:6162cb5683cb09923654fa9bdd3130c4be4bfda6ad8990971c9597ecd52965d2"}, + {file = "apscheduler-3.11.1.tar.gz", hash = "sha256:0db77af6400c84d1747fe98a04b8b58f0080c77d11d338c4f507a9752880f221"}, ] [package.dependencies] @@ -7277,4 +7277,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "ff0f6f8d90793ea95f1f7008f7c845432ff46fca0937d5068b4f7cfec0ee7674" +content-hash = "4d7134993527a5ff91b531a4e28b36bcab7cef2db18cf00702a950e34ae9ea1d" diff --git a/autogpt_platform/backend/pyproject.toml b/autogpt_platform/backend/pyproject.toml index bdb195e40d..7c517c8d67 100644 --- a/autogpt_platform/backend/pyproject.toml +++ b/autogpt_platform/backend/pyproject.toml @@ -13,7 +13,7 @@ aio-pika = "^9.5.5" aiohttp = "^3.10.0" aiodns = "^3.5.0" anthropic = "^0.59.0" -apscheduler = "^3.11.0" +apscheduler = "^3.11.1" autogpt-libs = { path = "../autogpt_libs", develop = true } bleach = { extras = ["css"], version = "^6.2.0" } click = "^8.2.0" From f97e19f418033c69f6bb50eca10c635dc664686d Mon Sep 17 00:00:00 2001 From: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Date: Sat, 1 Nov 2025 18:19:55 +0900 Subject: [PATCH 3/3] hotfix: Patch onboarding (#11299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Changes 🏗️ - Prevent removing progress of user onboarding tasks by merging arrays on the backend instead of replacing them - New endpoint for onboarding reset ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] Tasks are not being reset - [x] `/onboarding/reset` works --- .../backend/backend/data/onboarding.py | 40 +++++++++++++++---- .../backend/backend/server/routers/v1.py | 11 +++++ .../app/(no-navbar)/onboarding/reset/page.ts | 15 +------ .../frontend/src/app/api/openapi.json | 17 ++++++++ .../src/providers/onboarding/helpers.ts | 8 ++-- .../onboarding/onboarding-provider.tsx | 4 +- 6 files changed, 69 insertions(+), 26 deletions(-) diff --git a/autogpt_platform/backend/backend/data/onboarding.py b/autogpt_platform/backend/backend/data/onboarding.py index 6bfc9b494d..ecbb44bab0 100644 --- a/autogpt_platform/backend/backend/data/onboarding.py +++ b/autogpt_platform/backend/backend/data/onboarding.py @@ -52,10 +52,36 @@ async def get_user_onboarding(user_id: str): ) +async def reset_user_onboarding(user_id: str): + return await UserOnboarding.prisma().upsert( + where={"userId": user_id}, + data={ + "create": UserOnboardingCreateInput(userId=user_id), + "update": { + "completedSteps": [], + "walletShown": False, + "notified": [], + "usageReason": None, + "integrations": [], + "otherIntegrations": None, + "selectedStoreListingVersionId": None, + "agentInput": prisma.Json({}), + "onboardingAgentExecutionId": None, + "agentRuns": 0, + "lastRunAt": None, + "consecutiveRunDays": 0, + }, + }, + ) + + async def update_user_onboarding(user_id: str, data: UserOnboardingUpdate): update: UserOnboardingUpdateInput = {} + onboarding = await get_user_onboarding(user_id) if data.completedSteps is not None: - update["completedSteps"] = list(set(data.completedSteps)) + update["completedSteps"] = list( + set(data.completedSteps + onboarding.completedSteps) + ) for step in ( OnboardingStep.AGENT_NEW_RUN, OnboardingStep.MARKETPLACE_VISIT, @@ -71,11 +97,11 @@ async def update_user_onboarding(user_id: str, data: UserOnboardingUpdate): OnboardingStep.RUN_AGENTS_100, ): if step in data.completedSteps: - await reward_user(user_id, step) - if data.walletShown is not None: + await reward_user(user_id, step, onboarding) + if data.walletShown: update["walletShown"] = data.walletShown if data.notified is not None: - update["notified"] = list(set(data.notified)) + update["notified"] = list(set(data.notified + onboarding.notified)) if data.usageReason is not None: update["usageReason"] = data.usageReason if data.integrations is not None: @@ -88,7 +114,7 @@ async def update_user_onboarding(user_id: str, data: UserOnboardingUpdate): update["agentInput"] = SafeJson(data.agentInput) if data.onboardingAgentExecutionId is not None: update["onboardingAgentExecutionId"] = data.onboardingAgentExecutionId - if data.agentRuns is not None: + if data.agentRuns is not None and data.agentRuns > onboarding.agentRuns: update["agentRuns"] = data.agentRuns if data.lastRunAt is not None: update["lastRunAt"] = data.lastRunAt @@ -104,7 +130,7 @@ async def update_user_onboarding(user_id: str, data: UserOnboardingUpdate): ) -async def reward_user(user_id: str, step: OnboardingStep): +async def reward_user(user_id: str, step: OnboardingStep, onboarding: UserOnboarding): reward = 0 match step: # Reward user when they clicked New Run during onboarding @@ -138,8 +164,6 @@ async def reward_user(user_id: str, step: OnboardingStep): if reward == 0: return - onboarding = await get_user_onboarding(user_id) - # Skip if already rewarded if step in onboarding.rewardedFor: return diff --git a/autogpt_platform/backend/backend/server/routers/v1.py b/autogpt_platform/backend/backend/server/routers/v1.py index b4cdb0905b..6cf00cbb5f 100644 --- a/autogpt_platform/backend/backend/server/routers/v1.py +++ b/autogpt_platform/backend/backend/server/routers/v1.py @@ -52,6 +52,7 @@ from backend.data.onboarding import ( get_recommended_agents, get_user_onboarding, onboarding_enabled, + reset_user_onboarding, update_user_onboarding, ) from backend.data.user import ( @@ -259,6 +260,16 @@ async def is_onboarding_enabled(): return await onboarding_enabled() +@v1_router.post( + "/onboarding/reset", + summary="Reset onboarding progress", + tags=["onboarding"], + dependencies=[Security(requires_user)], +) +async def reset_onboarding(user_id: Annotated[str, Security(get_user_id)]): + return await reset_user_onboarding(user_id) + + ######################################################## ##################### Blocks ########################### ######################################################## diff --git a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/reset/page.ts b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/reset/page.ts index a35d9aec86..493ce44ed5 100644 --- a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/reset/page.ts +++ b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/reset/page.ts @@ -1,18 +1,7 @@ -import BackendAPI from "@/lib/autogpt-server-api"; +import { postV1ResetOnboardingProgress } from "@/app/api/__generated__/endpoints/onboarding/onboarding"; import { redirect } from "next/navigation"; export default async function OnboardingResetPage() { - const api = new BackendAPI(); - await api.updateUserOnboarding({ - completedSteps: [], - walletShown: false, - notified: [], - usageReason: null, - integrations: [], - otherIntegrations: "", - selectedStoreListingVersionId: null, - agentInput: {}, - onboardingAgentExecutionId: null, - }); + await postV1ResetOnboardingProgress(); redirect("/onboarding/1-welcome"); } diff --git a/autogpt_platform/frontend/src/app/api/openapi.json b/autogpt_platform/frontend/src/app/api/openapi.json index 86de904112..3f9c487aeb 100644 --- a/autogpt_platform/frontend/src/app/api/openapi.json +++ b/autogpt_platform/frontend/src/app/api/openapi.json @@ -906,6 +906,23 @@ "security": [{ "HTTPBearerJWT": [] }] } }, + "/api/onboarding/reset": { + "post": { + "tags": ["v1", "onboarding"], + "summary": "Reset onboarding progress", + "operationId": "postV1Reset onboarding progress", + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "401": { + "$ref": "#/components/responses/HTTP401NotAuthenticatedError" + } + }, + "security": [{ "HTTPBearerJWT": [] }] + } + }, "/api/blocks": { "get": { "tags": ["v1", "blocks"], diff --git a/autogpt_platform/frontend/src/providers/onboarding/helpers.ts b/autogpt_platform/frontend/src/providers/onboarding/helpers.ts index 8b8ce0469c..34d7e6f5d0 100644 --- a/autogpt_platform/frontend/src/providers/onboarding/helpers.ts +++ b/autogpt_platform/frontend/src/providers/onboarding/helpers.ts @@ -52,10 +52,10 @@ export function getRunMilestoneSteps( ): OnboardingStep[] { const steps: OnboardingStep[] = []; - if (newRunCount === 10) steps.push("RUN_AGENTS"); - if (newRunCount === 100) steps.push("RUN_AGENTS_100"); - if (consecutiveDays === 3) steps.push("RUN_3_DAYS"); - if (consecutiveDays === 14) steps.push("RUN_14_DAYS"); + if (newRunCount >= 10) steps.push("RUN_AGENTS"); + if (newRunCount >= 100) steps.push("RUN_AGENTS_100"); + if (consecutiveDays >= 3) steps.push("RUN_3_DAYS"); + if (consecutiveDays >= 14) steps.push("RUN_14_DAYS"); return steps; } diff --git a/autogpt_platform/frontend/src/providers/onboarding/onboarding-provider.tsx b/autogpt_platform/frontend/src/providers/onboarding/onboarding-provider.tsx index b4504bb88c..bf40003f98 100644 --- a/autogpt_platform/frontend/src/providers/onboarding/onboarding-provider.tsx +++ b/autogpt_platform/frontend/src/providers/onboarding/onboarding-provider.tsx @@ -188,7 +188,9 @@ export default function OnboardingProvider({ updateState({ agentRuns: newRunCount, - completedSteps: [...state.completedSteps, ...milestoneSteps], + completedSteps: Array.from( + new Set([...state.completedSteps, ...milestoneSteps]), + ), ...consecutiveData, }); }, [state, updateState]);