feat: update AI SDK to v7#1922
Conversation
This PR updates the repo from AI SDK v6 to v7 across the published packages, examples, guides, experiments, and starters. It migrates the current implementations only: new optimisations or improvements made available by the v7 SDK are intentionally out of scope for this change. ## Why - Consumers need the Agents SDK packages to work with AI SDK v7 and the matching @ai-sdk/* package majors. - A version-only bump was not enough because v7 renamed prompt, stop-condition, lifecycle callback, telemetry, and tool execution APIs used throughout the repo. - We could have renamed the Think-facing API to match v7 directly, but that would add a second API migration on top of the dependency migration. This keeps Think's existing caller-facing names where practical and translates at the AI SDK boundary. - We could have adopted v7-only follow-up improvements like stateless UI message stream helpers, final-step result audits, or media part cleanup here, but those are behaviour and design choices rather than required compatibility fixes. ## Public API Surface | Symbol | Kind | Notes | | ------ | ---- | ----- | | package peer dependencies | Breaking | Published packages now require ai@7 and @ai-sdk/react@4 where applicable. | | @cloudflare/think TurnConfig.experimental_telemetry | Changed | Still accepted, but now typed against the v7 telemetry option. v6 metadata is no longer supported by AI SDK v7. | | @cloudflare/think TurnConfig.telemetry | Additive | Accepted as the v7 option name and forwarded ahead of experimental_telemetry when present. | | @cloudflare/think StepContext | Changed | Still exported under the same name, now derived from GenerateTextOnStepFinishCallback. | | @cloudflare/ai-chat AIChatAgent.onChatMessage | Changed | The onFinish callback type now uses GenerateTextOnFinishCallback. | - Think still exposes system, onStepFinish, and experimental_telemetry as current top-level API names where callers already use them. - Think adapts v7 onToolExecutionEnd events back into the existing ToolCallResultContext shape for afterToolCall hooks and extensions. - ToolCallResultContext.stepNumber is now undefined for tool completion callbacks because AI SDK v7 no longer provides that value on the tool execution end event. ## Code Changes - Dependency ranges move from ai@6 and @ai-sdk/*@3 to ai@7 and @ai-sdk/*@4 across packages, examples, experiments, starters, and the lockfile. - AI SDK call sites use v7 names: instructions instead of system, isStepCount instead of stepCountIs, telemetry instead of experimental_telemetry at the SDK boundary, and onStepEnd or onToolExecutionEnd instead of the old lifecycle callback names. - Think keeps its public turn configuration and hook names stable while translating them into v7 streamText options internally. - Tool schema adapters in agents, codemode, and browser tooling normalize function-valued tool descriptions because downstream connectors still expect string descriptions. - agent-think drops telemetry metadata and uses functionId because AI SDK v7 removed TelemetryOptions.metadata. - forever-chat uses includeRawChunks directly for raw OpenAI response chunk handling. ## Compatibility - Consumers of published packages must install ai@7 and @ai-sdk/*@4-compatible peers. - Code that passed TelemetryOptions.metadata through Think's experimental_telemetry must move that identity into supported v7 telemetry fields or an integration. - Code that relied on stepNumber inside Think tool completion callbacks should treat it as unavailable for v7-backed executions. - This change does not migrate callers to new v7 capabilities beyond what is needed to keep the current implementations working.
🦋 Changeset detectedLatest commit: 2497133 The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
AI SDK v7 breaking changes encountered
|
# Conflicts: # agent-think/package.json
agent-think uses workers-ai-provider's createClientFallbackModel, which had no AI SDK v7 (LanguageModelV4) release on npm (latest 3.3.1 is v6/LanguageModelV3). Pinning agent-think to v6 instead caused a dual ai instance in the monorepo (agent-think on ai@6 vs the workspace think/agents packages on their own ai@7 devDeps), which does not type-check. Point workers-ai-provider at the v7 preview build from cloudflare/ai#601 (https://pkg.pr.new/cloudflare/ai/workers-ai-provider@601) and put agent-think fully on v7 (ai@7, @ai-sdk/*@4). This yields a single ai@7 instance across the workspace and type-checks cleanly. TODO: swap the pkg.pr.new URL for the published workers-ai-provider v7 release once cloudflare/ai#601 lands.
…t helper The AI SDK v7 migration wrapped StreamableResult.toUIMessageStream() in readableStreamToAsyncIterable, changing its return from a ReadableStream to a pure async generator. A test helper in tests/agents/think-session.ts still called getReader() on it, throwing "getReader is not a function" mid-stream. That throw masked the intended simulated error and failed 17 error-handling tests. Consume the stream via its async iterator (next / return) instead, matching the documented AsyncIterable contract.
Widen the "ai" peer range to "^6 || ^7" (and "@ai-sdk/react" to "^3 || ^4") across agents, @cloudflare/ai-chat, @cloudflare/codemode, and @cloudflare/think, so consumers can upgrade these packages without being forced onto AI SDK v7. Think now calls the AI SDK through the option names present in both majors (stepCountIs, system, experimental_telemetry, onStepFinish, experimental_onToolCallFinish) and normalizes the genuine divergences at the boundary: - normalizeToolFinishEvent collapses the v6 and v7 tool-execution-finished event shapes into one ToolCallResultContext. - The UI message stream uses the result's toUIMessageStream() method (present in both majors) instead of the v7-only standalone helper + result.stream. - The workspace read tool emits the "file-data" model output content part, which both majors accept (v7's newer "file" shape does not exist in v6). Also fix a v7-migration test regression: a test helper called getReader() on toUIMessageStream()'s result, which became a pure async iterable when readableStreamToAsyncIterable was introduced, masking the intended error and failing 17 error-handling tests. It now consumes the async iterator. Drop the v7-only telemetry test that froze telemetry.integrations behavior (v6 has no such API). Add an ai@6 / ai@7 CI matrix (.github/workflows/ai-sdk-compat.yml + scripts/use-ai-sdk-major.mjs) that type-checks and runs Think's workers tests under each major. Verified: 0 typecheck errors and full workers suite passing on both. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
agents
@cloudflare/ai-chat
@cloudflare/codemode
create-think
hono-agents
@cloudflare/shell
@cloudflare/think
@cloudflare/voice
@cloudflare/worker-bundler
commit: |
|
when is it expected to be merged? |
) Widen the "ai" peer range to "^6 || ^7" (and "@ai-sdk/react" to "^3 || ^4") across agents, @cloudflare/ai-chat, @cloudflare/codemode, and @cloudflare/think, so consumers can upgrade these packages without being forced onto AI SDK v7. Think now calls the AI SDK through the option names present in both majors (stepCountIs, system, experimental_telemetry, onStepFinish, experimental_onToolCallFinish) and normalizes the genuine divergences at the boundary: - normalizeToolFinishEvent collapses the v6 and v7 tool-execution-finished event shapes into one ToolCallResultContext. - The UI message stream uses the result's toUIMessageStream() method (present in both majors) instead of the v7-only standalone helper + result.stream. - The workspace read tool emits the "file-data" model output content part, which both majors accept (v7's newer "file" shape does not exist in v6). Also fix a v7-migration test regression: a test helper called getReader() on toUIMessageStream()'s result, which became a pure async iterable when readableStreamToAsyncIterable was introduced, masking the intended error and failing 17 error-handling tests. It now consumes the async iterator. Drop the v7-only telemetry test that froze telemetry.integrations behavior (v6 has no such API). Add an ai@6 / ai@7 CI matrix (.github/workflows/ai-sdk-compat.yml + scripts/use-ai-sdk-major.mjs) that type-checks and runs Think's workers tests under each major. Verified: 0 typecheck errors and full workers suite passing on both. Generated with [Devin](https://devin.ai) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@agent-think fix the conflicts on this pr. then force push. |
| } | ||
|
|
||
| if (isToolOrDynamicToolUIPart(part)) { | ||
| if (isToolUIPart(part)) { |
There was a problem hiding this comment.
🟡 Dynamic tool calls stop rendering in the sandbox coding agent UI
The message part check was switched (isToolUIPart at examples/sandbox-coding-agent/src/client.tsx:196, and also :314 and :416) to one that only recognizes regular tool parts, so any dynamic tool part in an assistant turn is no longer rendered and silently disappears from the conversation.
Impact: In that example, a tool call that arrives as a dynamic tool (e.g. MCP-style tools) shows nothing to the user instead of its input/output/error.
Why this narrows behavior vs. the rest of the repo
The previous guard isToolOrDynamicToolUIPart matched both tool-* parts and dynamic-tool parts. isToolUIPart only matches tool-* parts. Every other client in the repo (e.g. examples/ai-chat/src/client.tsx, examples/assistant/src/client.tsx, the think-starters, etc.) still imports and uses isToolOrDynamicToolUIPart, which confirms the symbol still exists under AI SDK v7 — so this file was changed unnecessarily and now diverges. Both the top-level part branch (:196), the ToolPart guard (:314), and the nested delegate-part branch (:416) were narrowed, so a dynamic-tool part returns null and is dropped rather than displayed. The AGENTS.md chat-rendering rules require rendering tool input/output/errors for every tool; dropping dynamic tools violates that.
Prompt for agents
In examples/sandbox-coding-agent/src/client.tsx the type guard was changed from isToolOrDynamicToolUIPart to isToolUIPart in three places (around lines 196, 314, and 416), and the import at the top was changed accordingly. isToolUIPart only matches parts whose type starts with tool-, whereas isToolOrDynamicToolUIPart also matches dynamic-tool parts. This narrows rendering so dynamic tool parts no longer display. All other client.tsx files in the repo still use isToolOrDynamicToolUIPart under AI SDK v7, so the symbol is still available. Restore isToolOrDynamicToolUIPart (both the import and the three usage sites) to keep dynamic tool parts rendering, matching the rest of the examples and the chat-rendering rules in examples/AGENTS.md.
Was this helpful? React with 👍 or 👎 to provide feedback.
This PR updates the repository to AI SDK v7 while preserving AI SDK v6 compatibility for the published packages. It also moves Workers AI integrations to the published
workers-ai-provider@4release.Why
@ai-sdk/*package majors without forcing existing AI SDK v6 consumers to migrate immediately.Public API Surface
agents,@cloudflare/ai-chat,@cloudflare/codemode, and@cloudflare/thinkaccept their corresponding AI SDK v6 and v7 majors.@cloudflare/thinkTurnConfig.telemetryexperimental_telemetry.@cloudflare/thinkTurnConfig.experimental_telemetry@cloudflare/thinkStepContext@cloudflare/ai-chatAIChatAgent.onChatMessageonFinishcallback uses the generate-text completion callback contract.system,onStepFinish, andexperimental_telemetrywhere callers already use them.onToolExecutionEndevents into the existingToolCallResultContextshape.stepNumberis unavailable for v7 tool completion events.Code Changes
ai,@ai-sdk/*, andworkers-ai-provider@4releases.workers-ai-provider@3, builds the v7 distribution first, then validates Think as a v6 consumer.agent-thinkusesfunctionIdbecause AI SDK v7 removed telemetry metadata.forever-chatpreserves the provider specification version when wrapping v3 and v4 language models for buffered replay.Compatibility
workers-ai-provider@4.LanguageModel.TelemetryOptions.metadata; use supported telemetry fields or an integration instead.stepNumberto Think tool completion callbacks.chat@4.31.0still advertises anai@^6peer and does not yet declare v7 support.