Skip to content

feat: support both AI SDK v6 and v7 in Think and its dependencies#1940

Draft
cjol wants to merge 1 commit into
fix/jul9-ai-sdk-v7from
fix/think-ai-sdk-v6-v7-compat
Draft

feat: support both AI SDK v6 and v7 in Think and its dependencies#1940
cjol wants to merge 1 commit into
fix/jul9-ai-sdk-v7from
fix/think-ai-sdk-v6-v7-compat

Conversation

@cjol

@cjol cjol commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Do not merge until cloudflare/ai#601 (workers-ai-provider AI SDK v7 support) is released. agent-think depends on a pkg.pr.new preview build of workers-ai-provider (inherited from the base branch fix/jul9-ai-sdk-v7). The pkg.pr.new URL must be replaced with the published workers-ai-provider release before this reaches main.

This PR makes @cloudflare/think, agents, @cloudflare/ai-chat, and @cloudflare/codemode support both AI SDK v6 and v7, rather than the v7-only cutover in #1922. It stacks on #1922 (base branch fix/jul9-ai-sdk-v7) and is offered as an alternative: take #1922 for a clean v7-only move, or this PR to keep v6 working too.

Why

  • The v7-only migration forces every consumer of these packages to upgrade their own ai and @ai-sdk/* majors in lockstep. @cloudflare/ai-chat and @cloudflare/think declare ai as a required peer, so on npm 7+ a consumer staying on v6 hits an ERESOLVE install failure, not a warning.
  • v7 keeps the v6 option names as aliases (system, stepCountIs, experimental_telemetry, onStepFinish, experimental_onToolCallFinish), so calling the SDK through the shared names lets one code path serve both majors without a compile-time fork.
  • The alternative was maintaining two builds or a version-conditional type layer. That was rejected: the only genuine runtime divergences are the tool-finish event shape, the UI stream helper, and one tool-result content part, all of which are cheaper to normalize at the boundary than to fork.
  • Full type parity across both majors is not attempted. The shipped .d.ts is compiled against one major; consumers get correct types for whichever ai they install, and the runtime is correct for both.

Public API Surface

Symbol Kind Notes
ai peer range Changed ^7.0.0 to ^6.0.0 || ^7.0.0 on agents, @cloudflare/ai-chat, @cloudflare/codemode, @cloudflare/think. Additive: v7 consumers unaffected.
@ai-sdk/react peer range Changed ^4.0.0 to ^3.0.0 || ^4.0.0 on agents, @cloudflare/ai-chat, @cloudflare/think.

No exported symbols are added or removed. The change is to peer acceptance ranges only.

Code Changes

  • @cloudflare/think calls streamText through the names present in both majors: system, stepCountIs, experimental_telemetry, onStepFinish, and experimental_onToolCallFinish. In v7 the last resolves internally to onToolExecutionEnd and fires once, so there is no double dispatch.
  • normalizeToolFinishEvent collapses the two tool-execution-finished event shapes ({ success, output, error, durationMs, stepNumber } in v6, { toolOutput, toolExecutionMs } in v7) into one ToolCallResultContext so afterToolCall and extensions are version-agnostic.
  • The UI message stream uses the result's toUIMessageStream() method, which exists in both majors. The standalone toUIMessageStream({ stream }) helper and result.stream are v7-only.
  • The workspace read tool emits the file-data model-output content part, accepted by both majors. v7's newer { type: "file", data: { type: "data", data } } shape does not exist in v6.
  • A test helper called .getReader() on toUIMessageStream()'s result, which became a pure async iterable when readableStreamToAsyncIterable was introduced in the v7 migration. The resulting throw masked the intended error and failed 17 error-handling tests. It now consumes the async iterator.
  • Dropped the telemetry test that asserted on v7's telemetry.integrations callback API, which does not exist in v6, to avoid freezing v7-only behaviour.
  • Added .github/workflows/ai-sdk-compat.yml and scripts/use-ai-sdk-major.mjs: a matrix that installs each ai major and runs @cloudflare/think's typecheck and workers tests under both.

Compatibility

  • Consumers can stay on ai@6 / @ai-sdk/*@3 or move to ai@7 / @ai-sdk/*@4. Bumping these packages no longer forces an AI SDK major upgrade.
  • workers-ai-provider (Think's default model provider) has no v7 release yet, so a consumer on ai@6 who relies on Think's built-in default model may hit a provider-version mismatch. Passing an explicit LanguageModel avoids this.
  • agent-think (private, not published) uses the workers-ai-provider v7 preview from Add support for AI SDK 7 ai#601 and must be repointed at the release before merge, per the warning above.

@changeset-bot

changeset-bot Bot commented Jul 14, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 4c92b98

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes changesets to release 5 packages
Name Type
agents Minor
@cloudflare/ai-chat Minor
@cloudflare/codemode Minor
@cloudflare/think Minor
@cloudflare/agent-think Patch

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@cjol cjol force-pushed the fix/think-ai-sdk-v6-v7-compat branch 2 times, most recently from 455de86 to 93144a0 Compare July 14, 2026 15:23
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>
@cjol cjol force-pushed the fix/think-ai-sdk-v6-v7-compat branch from 93144a0 to 4c92b98 Compare July 14, 2026 15:36
@pkg-pr-new

pkg-pr-new Bot commented Jul 14, 2026

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@1940

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@1940

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@1940

create-think

npm i https://pkg.pr.new/create-think@1940

hono-agents

npm i https://pkg.pr.new/hono-agents@1940

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@1940

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@1940

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@1940

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@1940

commit: 4c92b98

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant