From 876f312a2ec56049dbda33d768e431cd66d28b8f Mon Sep 17 00:00:00 2001 From: ajnart Date: Mon, 10 Aug 2026 14:48:00 +0200 Subject: [PATCH] chore upgrade assistant to AI SDK v7 --- apps/docs/docs/management/assistant.mdx | 5 ++++ .../assistant/assistant-provider.tsx | 4 ++++ .../assistant-runtime-provider.spec.ts | 10 ++++++++ .../assistant/assistant-runtime-provider.tsx | 1 + packages/api/src/router/assistant.ts | 1 + pnpm-workspace.yaml | 24 ++++++++++++------- 6 files changed, 37 insertions(+), 8 deletions(-) diff --git a/apps/docs/docs/management/assistant.mdx b/apps/docs/docs/management/assistant.mdx index 0151d5cae..a65208956 100644 --- a/apps/docs/docs/management/assistant.mdx +++ b/apps/docs/docs/management/assistant.mdx @@ -42,6 +42,11 @@ conversation instead of copying text into another widget or the floating panel. When the assistant is unavailable, its command-menu result remains visible but disabled and explains that an administrator must configure and enable it. +The assistant uses the assistant-ui runtime for **AI SDK v7**. Homarr tracks the newest mutually compatible +package set permitted by its supply-chain release-age policy. Persisted message rows can still report the upstream +codec name `ai-sdk/v6`; assistant-ui's current v7 adapter deliberately retains that identifier for its compatible +UI-message wire format. It does not mean the application is running AI SDK v6. + ## Configure a model provider Homarr includes presets for OpenRouter, OpenAI, Anthropic Claude, Google Gemini, xAI, Groq, Mistral AI, diff --git a/apps/nextjs/src/components/assistant/assistant-provider.tsx b/apps/nextjs/src/components/assistant/assistant-provider.tsx index bfb033a41..feb4d5933 100644 --- a/apps/nextjs/src/components/assistant/assistant-provider.tsx +++ b/apps/nextjs/src/components/assistant/assistant-provider.tsx @@ -259,6 +259,8 @@ const createHistoryAdapter = (threadId: string | undefined): ThreadHistoryAdapte withFormat>( formatAdapter: MessageFormatAdapter, ) { + // assistant-ui's current AI SDK v7 runtime intentionally keeps this identifier for its + // persisted UIMessage wire format. It is a storage codec name, not the installed SDK version. if (formatAdapter.format !== "ai-sdk/v6") { throw new Error(`Unsupported assistant message format: ${formatAdapter.format}`); } @@ -375,6 +377,8 @@ const AssistantThreadRuntime = () => { sendAutomaticallyWhen: shouldAutomaticallyContinueAssistant, }); + // The lower-level AI SDK v7 runtime is intentional: Homarr supplies its own tRPC-backed + // thread list and history adapters and shares this chat instance with its custom transport. const runtime = useAISDKRuntime(chat, { ...assistantAiSdkRuntimeOptions, adapters: { diff --git a/apps/nextjs/src/components/assistant/assistant-runtime-provider.spec.ts b/apps/nextjs/src/components/assistant/assistant-runtime-provider.spec.ts index bc5fc42ed..ea0b7d037 100644 --- a/apps/nextjs/src/components/assistant/assistant-runtime-provider.spec.ts +++ b/apps/nextjs/src/components/assistant/assistant-runtime-provider.spec.ts @@ -305,6 +305,16 @@ describe("AssistantRuntimeProviderWithTools", () => { await act(async () => root.unmount()); }); + test("forwards main-thread reloads through the surface runtime", async () => { + const { root, a, sharedRuntime } = await renderSurfaceTestAssistant(); + const reloadMainThread = vi.spyOn(sharedRuntime.threads, "reloadMainThread").mockResolvedValue(); + + await act(async () => a.threads().reloadMainThread()); + + expect(reloadMainThread).toHaveBeenCalledOnce(); + await act(async () => root.unmount()); + }); + test("restores focus after the Lexical run-start behavior tries to focus every surface", async () => { const outsideInput = document.createElement("input"); document.body.append(outsideInput); diff --git a/apps/nextjs/src/components/assistant/assistant-runtime-provider.tsx b/apps/nextjs/src/components/assistant/assistant-runtime-provider.tsx index 544fdd3c2..42e5342b2 100644 --- a/apps/nextjs/src/components/assistant/assistant-runtime-provider.tsx +++ b/apps/nextjs/src/components/assistant/assistant-runtime-provider.tsx @@ -348,6 +348,7 @@ export const createAssistantSurfaceRuntime = (runtime: AssistantRuntime): Assist switchToNewThread: () => sharedThreads.switchToNewThread(), getLoadThreadsPromise: () => sharedThreads.getLoadThreadsPromise(), reload: () => sharedThreads.reload(), + reloadMainThread: () => sharedThreads.reloadMainThread(), loadMore: () => sharedThreads.loadMore(), }; diff --git a/packages/api/src/router/assistant.ts b/packages/api/src/router/assistant.ts index d540e4bb8..209f544df 100644 --- a/packages/api/src/router/assistant.ts +++ b/packages/api/src/router/assistant.ts @@ -796,6 +796,7 @@ export const assistantRouter = createTRPCRouter({ threadId: z.string().max(64), id: z.string().min(1).max(128), parentId: z.string().max(128).nullable(), + // The current assistant-ui AI SDK v7 adapter uses this value as its persisted wire-format identifier. format: z.literal("ai-sdk/v6"), content: z.unknown(), }), diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5b8815de3..fd9fc4539 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,7 +3,7 @@ packages: - packages/* - tooling/* catalog: - "@ai-sdk/react": ^4.0.55 + "@ai-sdk/react": ^4.0.59 "@babel/parser": ^7.29.7 "@codemirror/autocomplete": ^6.20.3 "@codemirror/commands": ^6.10.3 @@ -215,13 +215,13 @@ catalog: zod: ^4.4.3 zod-form-data: ^3.0.2 zod-validation-error: ^5.0.0 - "@assistant-ui/react": ^0.14.27 - "@assistant-ui/react-ai-sdk": ^1.3.41 - "@assistant-ui/react-lexical": 0.2.0 - "@assistant-ui/react-markdown": ^0.14.7 - ai: ^7.0.37 - assistant-stream: ^0.3.26 - "@ai-sdk/openai-compatible": 3.0.14 + "@assistant-ui/react": 0.15.8 + "@assistant-ui/react-ai-sdk": 1.4.4 + "@assistant-ui/react-lexical": 0.2.7 + "@assistant-ui/react-markdown": 0.14.9 + ai: ^7.0.56 + assistant-stream: 0.3.34 + "@ai-sdk/openai-compatible": 3.0.25 remark-breaks: ^4.0.0 remark-directive: ^3.0.1 remark-gfm: ^4.0.1 @@ -247,6 +247,14 @@ minimumReleaseAgeExclude: # Renovate security update: esbuild@0.28.1 - esbuild@0.28.1 overrides: + "@assistant-ui/react-ai-sdk>@ai-sdk/mcp": 2.0.27 + "@assistant-ui/react-ai-sdk>@ai-sdk/react": 4.0.59 + "@assistant-ui/react-ai-sdk>ai": 7.0.56 + "@assistant-ui/react-ai-sdk>assistant-stream": 0.3.34 + "@assistant-ui/core": 0.3.7 + "@assistant-ui/store": 0.3.5 + "@assistant-ui/tap": 0.9.10 + "assistant-cloud": 0.1.38 "@babel/helpers@<7.26.10": ">=7.29.7" "@babel/runtime@<7.26.10": ">=7.29.7" "axios@>=1.0.0 <1.8.2": ">=1.18.1"