Skip to content

feat(models): unified createAI provider for Workers AI and AI Gateway (ai-sdk, pi-ai) - #2214

Open
mattzcarey wants to merge 3 commits into
mainfrom
feat/models-ai-sdk
Open

feat(models): unified createAI provider for Workers AI and AI Gateway (ai-sdk, pi-ai)#2214
mattzcarey wants to merge 3 commits into
mainfrom
feat/models-ai-sdk

Conversation

@mattzcarey

@mattzcarey mattzcarey commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds two experimental subpath exports, agents/models/ai-sdk and agents/models/pi-ai: one createAI factory per framework over the Workers AI binding and AI Gateway, following the Workers AI + AI Gateway unification (the model id is the whole API, the gateway is an option, Cloudflare holds the vendor credential).

One rule decides everything:

Workers AI is the only catalog this package keeps up with. Every other vendor brings its own code, and we only route it.

import { createAI } from "agents/models/ai-sdk";
import { createAnthropic } from "@ai-sdk/anthropic"; // the user's choice, installed by the user

const ai = createAI({ binding: env.AI, id: "prod", cacheTtl: 60 });
const anthropic = createAnthropic({ apiKey: "cloudflare" }); // placeholder: the gateway holds the real key

await generateText({ model: ai("@cf/zai-org/glm-4.7-flash") });               // Workers AI, ours
await generateText({ model: ai(anthropic("claude-opus-4-8")) });              // vendor model, routed
await generateText({ model: ai(anthropic("claude-opus-4-8"), { fallback: [ai("@cf/zai-org/glm-4.7-flash")] }) });
await embedMany({ model: ai.embedding("@cf/baai/bge-base-en-v1.5") });
  • ai("@cf/…") runs through env.AI.run with a compat layer (core/chat-completions) that maps Workers AI onto strict OpenAI chat completions, keyed by model family from live conformance captures. Only @cf/ strings are accepted.
  • ai(model) takes any AI SDK v4 model the user built, clones it per call, swaps its fetch for AI Gateway's universal request (env.AI.gateway(id).run), and hands the vendor's body and headers through untouched. The vendor's provider builds and parses; we add gateway options, fallback and providerMetadata.cloudflare.
  • Binding only: no REST transport, no API token, no HTTP.
  • agents takes no vendor package as a dependency or peer. @ai-sdk/provider and @earendil-works/pi-ai are optional peers; each subpath tree-shakes to its own framework.
  • Workers AI modalities on the same provider: ai.embedding, ai.image, ai.transcription, ai.speech, ai.reranking (+ their ProviderV4 aliases). The provider is a full ProviderV4, so it works with createProviderRegistry and as globalThis.AI_SDK_DEFAULT_PROVIDER.
  • agents/models/pi-ai is the equivalent for pi-ai (not a layer over the AI SDK one): ai("@cf/…"), ai(getBuiltinModel("anthropic", "claude-opus-4-8")), and ai("anthropic/claude-opus-4-8") when pi's own generated gateway registry knows the id. Dispatch by the pi model's api, pi's converters, pi's metadata for thinking.

What is in the change

  • packages/agents/src/models/core/ — framework-neutral: binding transport (run + universal), gateway options and precedence, gateway provider table (host → slug, from ai-gateway-provider), Workers AI id types, SSE decoding, errors, image helpers, and the Workers AI ↔ OpenAI compat layer (quirk table + request/response/stream normalizers, every row cited to a capture).
  • packages/agents/src/models/ai-sdk/ and packages/agents/src/models/pi-ai/ — identical skeletons (index, settings, catalog, errors, transport, models/*, wires/*).
  • packages/agents/src/tests/models/ — 306 tests, fixtures taken from live captures.
  • docs/agents/models.md, docs/agents/models-pi-ai.md, examples/next/models (a Worker exercising every call form of both modules), changeset (agents minor).

Verification

  • pnpm vitest --run --project workers src/tests/models: 20 files, 306 tests.
  • Root pnpm run typecheck (122 projects), pnpm run build, pnpm run check:exports, sherif, oxlint, oxfmt --check . all green.
  • Tree-shake: dist/models/ai-sdk references no pi-ai; dist/models/pi-ai references no @ai-sdk; neither imports a vendor package.
  • Live on the Workers AI Demos account (unified billing), tiny prompts: Workers AI generate/stream/tool loop; Anthropic generate/tool loop/stream; OpenAI generate; mixed vendor→Workers AI fallback; embeddings; a Workers AI image; and the three pi forms.
  • Design review: three adversarial rounds (seven lenses, every finding independently verified before being fixed) on top of a 21-model Workers AI conformance matrix plus deep probes of the newest ids (glm-5.3, kimi-k2.7, qwen3.8, nemotron-3).

Known gaps (documented)

  • OpenRouter reasoning_details replay is not implemented.
  • @cf/black-forest-labs/flux-2-* need a multipart body the JSON run path cannot send; they are off the autocomplete list rather than refused at runtime.
  • pi-ai's chat-completions wire builds only OpenAI's reasoning_effort shape; other compat.thinkingFormat values are the vendor package's job (stated in the docs).
  • Google models are not on unified billing today (the vendor's 403 surfaces as-is until a key is stored on the gateway).

Follow-ups

  • Replatform workers-ai-provider and ai-gateway-provider in cloudflare/ai as thin shims over these modules, with deprecation notices.
  • Platform findings from the probes (the /ai/v1/* endpoints wrap rather than translate; two id spellings between the run path and the universal request) are written up separately for the gateway team.

Devin Review

… (ai-sdk, pi-ai)

Adds experimental agents/models/ai-sdk and agents/models/pi-ai: one createAI
factory per framework over the Workers AI binding and AI Gateway.

Workers AI is the only catalog the package keeps up with: ai("@cf/...") runs
through env.AI.run with a compat layer that maps Workers AI onto strict OpenAI
chat completions. Every other vendor brings its own provider: ai(model) clones
the user's model per call, swaps its fetch for the gateway's universal request
(env.AI.gateway(id).run) and passes the vendor's body through untouched. Binding
only, no vendor package in agents, each subpath tree-shakes to its own framework.

Includes embeddings, image, transcription, speech and reranking on Workers AI,
ProviderV4 compliance (registry and default-provider hook), a framework-neutral
core with a capture-backed Workers AI quirk table, 306 tests, docs, an example
Worker exercising every call form, and a changeset.
@changeset-bot

changeset-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9e0af71

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
agents Minor
@cloudflare/agent-think Patch

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

devin-ai-integration[bot]

This comment was marked as resolved.

@pkg-pr-new

pkg-pr-new Bot commented Sep 4, 2026

Copy link
Copy Markdown

Open in StackBlitz

agents

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

@cloudflare/ai-chat

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

@cloudflare/codemode

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

hono-agents

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

@cloudflare/shell

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

@cloudflare/think

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

@cloudflare/voice

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

@cloudflare/worker-bundler

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

commit: 9e0af71

…ted fetch

A streaming leg that fails before its first output part (an error part, an
error finish, or a broken body) now hands over to the next fallback leg, with
its preamble dropped; a leg that has produced output keeps its failure. The
routed fetch reads the body and signal from a Request when a provider passes
one instead of (url, init).
@agent-think

agent-think Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

⚪ agents import sizes

Measured 279 runtime imports as minified bundles. The primary size is gzip; raw minified size is included for diagnosis. An existing import growing by more than 10% is marked red. This report is informational.

Red Yellow Green Unchanged New Removed
0 0 0 267 12 0

Compared ec93caf6 with 9e0af71f. Open workflow run.

Changed imports (12)
Status Import Base gzip Head gzip Delta
agents/models/ai-sdk#CloudflareAIError 3.0 KiB
agents/models/ai-sdk#createAI 19.3 KiB
agents/models/ai-sdk#GatewayLanguageModel 14.9 KiB
agents/models/pi-ai#CLOUDFLARE_AI_API 1.0 KiB
agents/models/pi-ai#CLOUDFLARE_AI_IMAGES_API 1.0 KiB
agents/models/pi-ai#CLOUDFLARE_DIAGNOSTIC 1.0 KiB
agents/models/pi-ai#CLOUDFLARE_ERROR_DIAGNOSTIC 1.0 KiB
agents/models/pi-ai#CLOUDFLARE_PROVIDER_ID 1.0 KiB
agents/models/pi-ai#CloudflareAIError 1.2 KiB
agents/models/pi-ai#createAI 77.0 KiB
agents/models/pi-ai#FALLBACK_DIAGNOSTIC 1.0 KiB
agents/models/pi-ai#GATEWAY_PROVIDER_NAMES 1.1 KiB
All 279 current runtime imports
Status Import Gzip Raw minified
agents#__DO_NOT_USE_WILL_BREAK__agentContext 258.6 KiB 1130.0 KiB
agents#__DO_NOT_USE_WILL_BREAK__withInvocationScope 258.6 KiB 1130.0 KiB
agents#Agent 258.6 KiB 1130.0 KiB
agents#AGENT_TOOL_MILESTONE_PART 258.6 KiB 1130.0 KiB
agents#AGENT_TOOL_PROGRESS_PART 258.6 KiB 1130.0 KiB
agents#buildAgentPath 259.1 KiB 1132.3 KiB
agents#buildAgentUrl 259.3 KiB 1132.7 KiB
agents#callable 258.6 KiB 1130.1 KiB
agents#camelCaseToKebabCase 258.6 KiB 1130.0 KiB
agents#createHeaderBasedEmailResolver 258.8 KiB 1130.4 KiB
agents#DEFAULT_AGENT_STATIC_OPTIONS 258.6 KiB 1130.0 KiB
agents#DurableObjectOAuthClientProvider 258.6 KiB 1130.0 KiB
agents#getAgentByName 258.6 KiB 1130.0 KiB
agents#getCurrentAgent 258.6 KiB 1130.0 KiB
agents#getSubAgentByName 258.9 KiB 1130.7 KiB
agents#isDurableObjectCodeUpdateReset 258.6 KiB 1130.0 KiB
agents#isDurableObjectMemoryLimitReset 258.6 KiB 1130.0 KiB
agents#isDurableObjectStorageReset 258.6 KiB 1130.1 KiB
agents#isPlatformTransientError 258.6 KiB 1130.0 KiB
agents#MCP_SERVER_ID_MAX_LENGTH 258.6 KiB 1130.0 KiB
agents#MessageType 258.8 KiB 1130.3 KiB
agents#normalizeServerId 258.6 KiB 1130.0 KiB
agents#parseSubAgentPath 258.6 KiB 1130.0 KiB
agents#routeAgentEmail 258.9 KiB 1130.7 KiB
agents#routeAgentRequest 259.2 KiB 1131.9 KiB
agents#routeSubAgentRequest 258.8 KiB 1130.6 KiB
agents#SqlError 258.6 KiB 1130.0 KiB
agents#StreamingResponse 258.6 KiB 1130.0 KiB
agents#SUB_PREFIX 258.6 KiB 1130.0 KiB
agents#unstable_callable 258.7 KiB 1130.2 KiB
agents/agent-tools#agentTool 112.5 KiB 538.2 KiB
agents/browser#BrowserConnector 50.5 KiB 176.6 KiB
agents/browser#browserContent 36.3 KiB 127.4 KiB
agents/browser#browserExtract 36.3 KiB 127.4 KiB
agents/browser#browserLinks 36.3 KiB 127.4 KiB
agents/browser#browserMarkdown 36.3 KiB 127.4 KiB
agents/browser#browserPdf 36.3 KiB 127.3 KiB
agents/browser#BrowserRenderingError 36.0 KiB 126.7 KiB
agents/browser#browserScrape 36.3 KiB 127.4 KiB
agents/browser#browserScreenshot 36.3 KiB 127.3 KiB
agents/browser#browserSnapshot 36.3 KiB 127.4 KiB
agents/browser#CdpSession 37.2 KiB 129.8 KiB
agents/browser#CodemodeRuntime 39.6 KiB 139.0 KiB
agents/browser#connectBrowser 37.8 KiB 131.4 KiB
agents/browser#connectBrowserSession 37.5 KiB 130.4 KiB
agents/browser#connectUrl 37.6 KiB 130.5 KiB
agents/browser#createBrowserSession 36.3 KiB 127.5 KiB
agents/browser#DEFAULT_EXEC_SWEEP_IDLE_MS 36.0 KiB 126.6 KiB
agents/browser#DEFAULT_SWEEP_IDLE_MS 36.0 KiB 126.6 KiB
agents/browser#deleteBrowserSession 36.1 KiB 126.9 KiB
agents/browser#DurableBrowserSessionStore 36.4 KiB 127.6 KiB
agents/browser#getBrowserRecording 36.2 KiB 127.1 KiB
agents/browser#listBrowserTargets 36.1 KiB 126.9 KiB
agents/browser#loadCdpSpec 36.6 KiB 128.3 KiB
agents/browser#runQuickAction 36.0 KiB 126.6 KiB
agents/browser/ai#createBrowserRuntime 146.0 KiB 630.3 KiB
agents/browser/ai#createBrowserTools 146.0 KiB 630.3 KiB
agents/browser/ai#createQuickActionTools 122.5 KiB 554.3 KiB
agents/browser/tanstack-ai#createBrowserTools 161.7 KiB 699.2 KiB
agents/chat#AbortRegistry 2.5 KiB 8.9 KiB
agents/chat#AGENT_TOOL_STREAM_PROGRESS_BUMP_THROTTLE_MS 2.3 KiB 8.2 KiB
agents/chat#AgentToolProgressEmitter 2.7 KiB 9.5 KiB
agents/chat#AgentToolStreamProgressThrottle 2.4 KiB 8.3 KiB
agents/chat#aiSdkRecoveryCodec 2.3 KiB 8.2 KiB
agents/chat#applyAgentToolEvent 3.2 KiB 11.0 KiB
agents/chat#applyChunkToParts 2.3 KiB 8.2 KiB
agents/chat#applyToolUpdate 2.4 KiB 8.4 KiB
agents/chat#AutoContinuationController 2.3 KiB 8.2 KiB
agents/chat#awaitWithDeadline 2.4 KiB 8.4 KiB
agents/chat#broadcastTransition 3.1 KiB 11.4 KiB
agents/chat#buildChatRecoveringFrame 2.4 KiB 8.4 KiB
agents/chat#buildInClauseStrings 2.4 KiB 8.4 KiB
agents/chat#bumpChatRecoveryProgress 2.4 KiB 8.3 KiB
agents/chat#byteLength 2.5 KiB 8.5 KiB
agents/chat#CHAT_LAST_TERMINAL_KEY 2.3 KiB 8.2 KiB
agents/chat#CHAT_MESSAGE_TYPES 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERING_FLAG_TTL_MS 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERING_KEY 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_ALARM_DEBOUNCE_MS 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_INCIDENT_KEY_PREFIX 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_INCIDENT_TTL_MS 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_PROGRESS_KEY 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_STABLE_RETRY_DELAY_SECONDS 2.3 KiB 8.2 KiB
agents/chat#CHAT_RECOVERY_TASK_NAME 2.3 KiB 8.2 KiB
agents/chat#CHAT_STREAM_PROGRESS_CREDIT_THROTTLE_MS 2.3 KiB 8.2 KiB
agents/chat#ChatRecoveryEngine 4.4 KiB 15.3 KiB
agents/chat#chatRecoveryTaskRunOptions 2.4 KiB 8.6 KiB
agents/chat#ChatStreamStalledError 2.4 KiB 8.3 KiB
agents/chat#classifyAgentToolChildRecovery 2.4 KiB 8.5 KiB
agents/chat#cleanupStreamBuffers 2.3 KiB 8.2 KiB
agents/chat#clearChatTerminal 2.3 KiB 8.3 KiB
agents/chat#clientResolvableToolNames 2.3 KiB 8.3 KiB
agents/chat#ContinuationState 2.7 KiB 9.8 KiB
agents/chat#createAgentToolEventState 2.3 KiB 8.3 KiB
agents/chat#createChatFiberSnapshot 2.5 KiB 8.6 KiB
agents/chat#createChatRecoveryTaskDefinition 2.6 KiB 9.0 KiB
agents/chat#createChatStreams 5.5 KiB 19.3 KiB
agents/chat#createChatTurnTaskDefinition 2.7 KiB 8.9 KiB
agents/chat#createToolsFromClientSchemas 114.3 KiB 545.4 KiB
agents/chat#crossMessageToolResultUpdate 2.4 KiB 8.6 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_MAX_ATTEMPTS 2.3 KiB 8.2 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_MAX_OOM_RETRIES 2.3 KiB 8.2 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_MAX_WORK 2.3 KiB 8.2 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_NO_PROGRESS_TIMEOUT_MS 2.3 KiB 8.2 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_STABLE_TIMEOUT_MS 2.3 KiB 8.2 KiB
agents/chat#DEFAULT_CHAT_RECOVERY_TERMINAL_MESSAGE 2.4 KiB 8.3 KiB
agents/chat#dispatchChatRecoveryToHandoff 3.0 KiB 9.9 KiB
agents/chat#drainInteractionApplies 2.3 KiB 8.3 KiB
agents/chat#enforceRowSizeLimit 3.5 KiB 11.2 KiB
agents/chat#hasIncompleteToolBatch 2.4 KiB 8.6 KiB
agents/chat#interceptAgentToolBroadcast 2.5 KiB 8.7 KiB
agents/chat#isPlatformFailure 2.6 KiB 8.9 KiB
agents/chat#isReplayChunk 2.4 KiB 8.7 KiB
agents/chat#iterateWithStallWatchdog 2.6 KiB 8.8 KiB
agents/chat#KV_DELETE_MAX_KEYS 2.3 KiB 8.2 KiB
agents/chat#listActiveChatRecoveryIncidents 2.4 KiB 8.4 KiB
agents/chat#MAX_BOUND_PARAMS 2.3 KiB 8.2 KiB
agents/chat#MessageType 2.4 KiB 9.0 KiB
agents/chat#normalizeToolInput 2.3 KiB 8.2 KiB
agents/chat#parseProtocolMessage 2.5 KiB 9.0 KiB
agents/chat#partAwaitsClientInteraction 2.4 KiB 8.6 KiB
agents/chat#pausedExecutionUpdate 2.4 KiB 8.4 KiB
agents/chat#pendingChatTerminal 2.3 KiB 8.3 KiB
agents/chat#persistReconstructedOrphan 3.1 KiB 11.0 KiB
agents/chat#PreStreamTurns 2.6 KiB 9.3 KiB
agents/chat#readChatRecoveryProgress 2.3 KiB 8.3 KiB
agents/chat#reconcileMessages 2.8 KiB 9.6 KiB
agents/chat#reconcileOrphanPartial 2.4 KiB 8.5 KiB
agents/chat#recordChatTerminal 2.4 KiB 8.3 KiB
agents/chat#repairInterruptedToolParts 2.6 KiB 9.1 KiB
agents/chat#resolveChatRecoveryConfig 2.6 KiB 8.9 KiB
agents/chat#resolveToolMergeId 2.4 KiB 8.5 KiB
agents/chat#ResumableStream 4.6 KiB 15.3 KiB
agents/chat#ResumeHandshake 3.0 KiB 10.4 KiB
agents/chat#ROW_MAX_BYTES 2.3 KiB 8.2 KiB
agents/chat#runChatRecoveryExhaustion 2.6 KiB 8.9 KiB
agents/chat#sanitizeMessage 2.5 KiB 8.8 KiB
agents/chat#sendIfOpen 2.4 KiB 8.4 KiB
agents/chat#setChatRecovering 2.5 KiB 8.5 KiB
agents/chat#shouldCreditStreamProgress 2.4 KiB 8.3 KiB
agents/chat#STREAM_CLEANUP_DELAY_SECONDS 2.3 KiB 8.2 KiB
agents/chat#STREAM_RESUME_NONE_REASONS 2.3 KiB 8.3 KiB
agents/chat#StreamAccumulator 2.9 KiB 10.7 KiB
agents/chat#StreamProgressCreditThrottle 2.4 KiB 8.3 KiB
agents/chat#SubmitConcurrencyController 2.9 KiB 10.3 KiB
agents/chat#sweepStaleChatRecoveryIncidents 2.4 KiB 8.5 KiB
agents/chat#TextSegmentJoiner 2.7 KiB 9.2 KiB
agents/chat#TIMED_OUT 2.3 KiB 8.2 KiB
agents/chat#toolApprovalUpdate 2.4 KiB 8.5 KiB
agents/chat#toolPartHasSettledResult 2.3 KiB 8.4 KiB
agents/chat#toolResultUpdate 2.4 KiB 8.5 KiB
agents/chat#truncateOlderMessages 3.2 KiB 10.4 KiB
agents/chat#TurnQueue 2.6 KiB 9.2 KiB
agents/chat#unwrapChatFiberSnapshot 2.4 KiB 8.5 KiB
agents/chat#wrapChatFiberSnapshot 2.3 KiB 8.2 KiB
agents/chat-sdk#ChatSdkStateAdapter 261.0 KiB 1141.6 KiB
agents/chat-sdk#ChatSdkStateAgent 260.4 KiB 1139.1 KiB
agents/chat-sdk#createChatSdkState 261.0 KiB 1141.6 KiB
agents/chat-sdk#defaultKeyShard 258.8 KiB 1130.2 KiB
agents/chat-sdk#defaultThreadShard 258.7 KiB 1130.1 KiB
agents/chat/react#detectToolsRequiringConfirmation 3.3 KiB 8.3 KiB
agents/chat/react#extractClientToolSchemas 3.2 KiB 8.3 KiB
agents/chat/react#getAgentMessages 3.4 KiB 8.6 KiB
agents/chat/react#getToolApproval 3.1 KiB 8.0 KiB
agents/chat/react#getToolCallId 3.1 KiB 8.0 KiB
agents/chat/react#getToolInput 3.1 KiB 8.0 KiB
agents/chat/react#getToolOutput 3.1 KiB 8.0 KiB
agents/chat/react#getToolPartState 3.2 KiB 8.2 KiB
agents/chat/react#useAgentChat 132.9 KiB 609.7 KiB
agents/chat/react#WebSocketChatTransport 5.7 KiB 17.1 KiB
agents/chat/transport#WebSocketChatTransport 2.8 KiB 9.2 KiB
agents/client#AgentClient 5.7 KiB 16.6 KiB
agents/client#AgentConnectionError 582 B 993 B
agents/client#agentFetch 4.2 KiB 12.3 KiB
agents/client#createStubProxy 638 B 1.0 KiB
agents/client#DEFAULT_CALL_TIMEOUT_MS 473 B 770 B
agents/client#isTerminalCloseEvent 509 B 822 B
agents/context#AgentContextProvider 412 B 792 B
agents/context#AgentSearchProvider 640 B 1.3 KiB
agents/context#ContextBlocks 87.4 KiB 429.7 KiB
agents/email#createAddressBasedEmailResolver 193 B 227 B
agents/email#createCatchAllEmailResolver 110 B 97 B
agents/email#createHeaderBasedEmailResolver 334 B 492 B
agents/email#createSecureReplyEmailResolver 718 B 1.3 KiB
agents/email#DEFAULT_MAX_AGE_SECONDS 56 B 39 B
agents/email#isAutoReplyEmail 201 B 249 B
agents/email#signAgentHeaders 424 B 812 B
agents/experimental/webmcp#registerWebMcp 85.2 KiB 295.8 KiB
agents/lifecycle#getCurrentAgent 376 B 798 B
agents/lifecycle#Lifecycle 8.3 KiB 25.8 KiB
agents/lifecycle#LifecycleCapability 484 B 975 B
agents/mcp#createLegacyMcpHandler 375.9 KiB 1572.2 KiB
agents/mcp#createMcpHandler 388.2 KiB 1617.4 KiB
agents/mcp#DurableObjectEventStore 342.5 KiB 1430.7 KiB
agents/mcp#ElicitRequestSchema 342.5 KiB 1430.7 KiB
agents/mcp#experimental_createMcpHandler 376.1 KiB 1572.5 KiB
agents/mcp#getMcpAuthContext 342.5 KiB 1430.8 KiB
agents/mcp#MCP_SERVER_ID_MAX_LENGTH 342.5 KiB 1430.7 KiB
agents/mcp#McpAgent 342.5 KiB 1430.7 KiB
agents/mcp#normalizeServerId 342.5 KiB 1430.7 KiB
agents/mcp#RPC_DO_PREFIX 342.5 KiB 1430.7 KiB
agents/mcp#RPCClientTransport 342.5 KiB 1430.7 KiB
agents/mcp#RPCServerTransport 342.5 KiB 1430.7 KiB
agents/mcp#SSEEdgeClientTransport 342.6 KiB 1431.0 KiB
agents/mcp#StreamableHTTPEdgeClientTransport 342.6 KiB 1431.0 KiB
agents/mcp#WorkerTransport 345.8 KiB 1447.6 KiB
agents/mcp/client#getNamespacedData 62.9 KiB 240.0 KiB
agents/mcp/client#MCP_SERVER_ID_MAX_LENGTH 62.9 KiB 239.9 KiB
agents/mcp/client#MCPClientManager 158.6 KiB 702.6 KiB
agents/mcp/client#normalizeServerId 63.0 KiB 240.2 KiB
agents/mcp/do-oauth-client-provider#DurableObjectOAuthClientProvider 2.1 KiB 6.6 KiB
agents/mcp/server#createMcpHandler 80.5 KiB 307.2 KiB
agents/mcp/server#getMcpAuthContext 64.0 KiB 245.5 KiB
agents/models/ai-sdk#CloudflareAIError 3.0 KiB 8.4 KiB
agents/models/ai-sdk#createAI 19.3 KiB 62.4 KiB
agents/models/ai-sdk#GatewayLanguageModel 14.9 KiB 46.8 KiB
agents/models/pi-ai#CLOUDFLARE_AI_API 1.0 KiB 2.5 KiB
agents/models/pi-ai#CLOUDFLARE_AI_IMAGES_API 1.0 KiB 2.5 KiB
agents/models/pi-ai#CLOUDFLARE_DIAGNOSTIC 1.0 KiB 2.5 KiB
agents/models/pi-ai#CLOUDFLARE_ERROR_DIAGNOSTIC 1.0 KiB 2.5 KiB
agents/models/pi-ai#CLOUDFLARE_PROVIDER_ID 1.0 KiB 2.5 KiB
agents/models/pi-ai#CloudflareAIError 1.2 KiB 2.9 KiB
agents/models/pi-ai#createAI 77.0 KiB 293.8 KiB
agents/models/pi-ai#FALLBACK_DIAGNOSTIC 1.0 KiB 2.5 KiB
agents/models/pi-ai#GATEWAY_PROVIDER_NAMES 1.1 KiB 2.7 KiB
agents/observability#channels 259 B 549 B
agents/observability#genericObservability 470 B 1.2 KiB
agents/observability#subscribe 324 B 668 B
agents/observability/ai#wrapAISDK 8.8 KiB 30.5 KiB
agents/react#_testUtils 3.8 KiB 9.5 KiB
agents/react#useAgent 10.8 KiB 31.1 KiB
agents/react#useAgentToolEvents 5.6 KiB 16.8 KiB
agents/routing#getAgentByName 795 B 1.7 KiB
agents/routing#routeAgentRequest 1.6 KiB 3.6 KiB
agents/routing#RoutedAgents 2.4 KiB 6.2 KiB
agents/schedule#getSchedulePrompt 85.8 KiB 424.7 KiB
agents/schedule#scheduleSchema 85.3 KiB 423.6 KiB
agents/schedule#unstable_getSchedulePrompt 85.9 KiB 424.9 KiB
agents/schedule#unstable_scheduleSchema 85.3 KiB 423.6 KiB
agents/schedules#Scheduler 6.8 KiB 22.0 KiB
agents/schedules/parser#getSchedulePrompt 85.8 KiB 424.7 KiB
agents/schedules/parser#scheduleSchema 85.3 KiB 423.6 KiB
agents/sessions#createCompactFunction 1.7 KiB 4.0 KiB
agents/sessions#Session 1.9 KiB 5.4 KiB
agents/sessions#Sessions 8.8 KiB 31.2 KiB
agents/skills#fromManifest 309.8 KiB 1084.0 KiB
agents/skills#parseSkillFrontmatter 328.4 KiB 1146.2 KiB
agents/skills#parseSkillMarkdown 328.6 KiB 1146.5 KiB
agents/skills#r2 330.2 KiB 1150.4 KiB
agents/skills#runner 369.0 KiB 1297.8 KiB
agents/skills#SkillRegistry 416.4 KiB 1581.7 KiB
agents/skills/compile#compileSkillScript 15.4 KiB 43.4 KiB
agents/skills/compile#isCompilableSkillScript 15.4 KiB 43.3 KiB
agents/streams#DEFAULT_MAX_CHUNK_BYTES 83 B 81 B
agents/streams#sseResponse 843 B 1.6 KiB
agents/streams#StreamClosedError 161 B 197 B
agents/streams#StreamNotFoundError 201 B 261 B
agents/streams#Streams 3.4 KiB 11.1 KiB
agents/streams#StreamSerializationError 158 B 186 B
agents/tasks#DuplicateTaskStepError 328 B 463 B
agents/tasks#MAX_SERIALIZED_BYTES 190 B 232 B
agents/tasks#MissingTaskDefinitionError 358 B 536 B
agents/tasks#NonRetryableError 238 B 308 B
agents/tasks#TaskReplayDivergedError 341 B 483 B
agents/tasks#Tasks 8.9 KiB 31.8 KiB
agents/tasks#TaskSerializationError 258 B 339 B
agents/types#MessageType 211 B 365 B
agents/vite#default 353.8 KiB 1356.1 KiB
agents/websockets#CALLABLES_RPC_QUERY 12.4 KiB 43.3 KiB
agents/websockets#CALLABLES_RPC_VALUE 12.4 KiB 43.3 KiB
agents/websockets#callablesFromDecorated 12.7 KiB 44.3 KiB
agents/websockets#callablesRpcUrl 12.5 KiB 43.5 KiB
agents/websockets#isCallablesRpcUpgrade 12.4 KiB 43.4 KiB
agents/websockets#WebSockets 17.7 KiB 62.2 KiB
agents/workflows#AgentWorkflow 260.0 KiB 1134.8 KiB
agents/workflows#WorkflowRejectedError 258.7 KiB 1130.2 KiB
agents/x402#normalizeNetwork 14.7 KiB 61.1 KiB
agents/x402#withX402 23.0 KiB 89.2 KiB
agents/x402#withX402Client 104.1 KiB 346.5 KiB

Reported by agent-think[bot].

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

1 flag not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)

Devin Review

Comment on lines +356 to +358
const logId = binding.aiGatewayLogId;
if (logId !== null && logId !== undefined) {
logIds.set(response, logId);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Concurrent requests misreport gateway logs

When concurrent calls settle together, binding.aiGatewayLogId can already identify another call. Provider metadata then links a response to the wrong log.

Prompt for agents
The binding-wide aiGatewayLogId property is mutable and shared across concurrent env.AI.run calls. In packages/agents/src/models/core/transport.ts, bindingTransport snapshots it only after awaiting raw.run, leaving a race where another completion can overwrite the property first. Preserve response-to-log correlation without relying on a shared post-await property. Prefer the response's cf-aig-log-id header when available, or change the transport and metadata flow so a per-call correlation value is captured atomically with that call's completion. Add a concurrency test where two runs complete close together and verify each response receives its own log ID.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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