agents 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{agent-tool-types-CzGGB-20.d.ts → agent-routing-CnkaHb-v.d.ts} +2921 -3057
- package/dist/agent-routing.d.ts +14 -0
- package/dist/agent-routing.js +187 -0
- package/dist/agent-routing.js.map +1 -0
- package/dist/agent-tool-types.d.ts +26 -26
- package/dist/{agent-tools-zR2d5uij.d.ts → agent-tools-C0XJqWzB.d.ts} +7 -7
- package/dist/agent-tools.d.ts +21 -21
- package/dist/agent-tools.js +2 -1
- package/dist/agent-tools.js.map +1 -1
- package/dist/browser/ai.js +2 -1
- package/dist/browser/ai.js.map +1 -1
- package/dist/capability-BjSKYpzg.js +42 -0
- package/dist/capability-BjSKYpzg.js.map +1 -0
- package/dist/capability-runner-CvHGZqUu.d.ts +150 -0
- package/dist/chat/index.d.ts +22 -15
- package/dist/chat/index.js +4 -4
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.d.ts +14 -1
- package/dist/chat/react.js +82 -52
- package/dist/chat/react.js.map +1 -1
- package/dist/chat/transport.js +1 -1
- package/dist/chat-sdk/index.d.ts +4 -4
- package/dist/chat-sdk/index.js +1 -1
- package/dist/{client-zqKcsyFa.js → client-jagG8a9_.js} +129 -37
- package/dist/client-jagG8a9_.js.map +1 -0
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/{cloudflare-BduZwmYK.js → cloudflare-Dzvc7V2N.js} +10 -3
- package/dist/{cloudflare-BduZwmYK.js.map → cloudflare-Dzvc7V2N.js.map} +1 -1
- package/dist/current-agent-CuMErtly.d.ts +283 -0
- package/dist/current-agent-DhoDkSnH.js +51 -0
- package/dist/current-agent-DhoDkSnH.js.map +1 -0
- package/dist/diagnostics-CaBjfz4J.js +41 -0
- package/dist/diagnostics-CaBjfz4J.js.map +1 -0
- package/dist/{do-oauth-client-provider-VTZj2VtM.d.ts → do-oauth-client-provider-Tmf1vgKz.d.ts} +2 -2
- package/dist/durable-object-lifecycle-D6nNQJJd.js +862 -0
- package/dist/durable-object-lifecycle-D6nNQJJd.js.map +1 -0
- package/dist/{email-CL27preh.d.ts → email-7TatiTnl.d.ts} +38 -9
- package/dist/email-send.d.ts +15 -0
- package/dist/email-send.js +32 -0
- package/dist/email-send.js.map +1 -0
- package/dist/email.d.ts +14 -10
- package/dist/email.js.map +1 -1
- package/dist/experimental/memory/session/index.d.ts +3 -2
- package/dist/experimental/memory/session/index.js +15 -10
- package/dist/experimental/memory/session/index.js.map +1 -1
- package/dist/{handler-stateless-C_bo-Ytq.d.ts → handler-stateless-DxYpJ_XF.d.ts} +3 -3
- package/dist/{handler-stateless-CIkKPETH.js → handler-stateless-VvrWSAVA.js} +5 -5
- package/dist/handler-stateless-VvrWSAVA.js.map +1 -0
- package/dist/{index-BRnybD6X.d.ts → index-DcSAZKsB.d.ts} +19 -31
- package/dist/index.d.ts +98 -95
- package/dist/index.js +10 -7234
- package/dist/internal_context-BlxFEWfn.d.ts +19 -0
- package/dist/internal_context.d.ts +10 -4
- package/dist/internal_context.js +1 -10
- package/dist/{client-invoker-BNSZxAkv.d.ts → invoker-CG0_p_Wq.d.ts} +2 -2
- package/dist/{client-invoker-VNZ7X0nn.js → invoker-CHMnoxIA.js} +2 -2
- package/dist/invoker-CHMnoxIA.js.map +1 -0
- package/dist/lifecycle/index.d.ts +48 -0
- package/dist/lifecycle/index.js +4 -0
- package/dist/mcp/{do-oauth-client-provider.d.ts → client/do-oauth-client-provider.d.ts} +1 -1
- package/dist/mcp/{do-oauth-client-provider.js → client/do-oauth-client-provider.js} +1 -1
- package/dist/mcp/client/do-oauth-client-provider.js.map +1 -0
- package/dist/mcp/client/index.d.ts +42 -0
- package/dist/mcp/{client.js → client/index.js} +1 -1
- package/dist/mcp/{x402.d.ts → client/x402.d.ts} +2 -2
- package/dist/mcp/{x402.js → client/x402.js} +2 -2
- package/dist/mcp/client/x402.js.map +1 -0
- package/dist/mcp/index.d.ts +36 -36
- package/dist/mcp/index.js +14 -16
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/{server.d.ts → server/index.d.ts} +1 -1
- package/dist/mcp/{server.js → server/index.js} +1 -1
- package/dist/observability/ai/index.js +50 -35
- package/dist/observability/ai/index.js.map +1 -1
- package/dist/observability/index.d.ts +4 -4
- package/dist/observability/index.js +3 -50
- package/dist/observability/index.js.map +1 -1
- package/dist/{protocol-Dqc2MQxo.js → protocol-B0nh6KNf.js} +19 -21
- package/dist/protocol-B0nh6KNf.js.map +1 -0
- package/dist/react.d.ts +4 -4
- package/dist/react.js +1 -1
- package/dist/schedule.d.ts +25 -94
- package/dist/schedule.js +1 -98
- package/dist/schedule.js.map +1 -1
- package/dist/scheduler-CR9RHGos.js +857 -0
- package/dist/scheduler-CR9RHGos.js.map +1 -0
- package/dist/scheduler-DQoTGoAW.d.ts +224 -0
- package/dist/schedules/index.d.ts +22 -0
- package/dist/schedules/index.js +2 -0
- package/dist/schedules/parser.d.ts +79 -0
- package/dist/schedules/parser.js +103 -0
- package/dist/schedules/parser.js.map +1 -0
- package/dist/serializable.d.ts +1 -1
- package/dist/sql-error-CPY-GXyI.d.ts +12 -0
- package/dist/sql-error.d.ts +2 -0
- package/dist/sql-error.js +16 -0
- package/dist/sql-error.js.map +1 -0
- package/dist/src-5W6JNKVb.js +6613 -0
- package/dist/src-5W6JNKVb.js.map +1 -0
- package/dist/sub-routing.d.ts +12 -12
- package/dist/workflow-types.d.ts +25 -25
- package/dist/workflows.d.ts +22 -22
- package/dist/workflows.js +2 -1
- package/dist/workflows.js.map +1 -1
- package/dist/{ws-chat-transport-CIoOBbO7.js → ws-chat-transport-rWwta645.js} +152 -15
- package/dist/ws-chat-transport-rWwta645.js.map +1 -0
- package/docs/agent-class.md +28 -86
- package/docs/chat-agents.md +13 -12
- package/docs/durable-execution.md +1 -1
- package/docs/http-websockets.md +1 -11
- package/docs/human-in-the-loop.md +1 -1
- package/docs/index.md +1 -0
- package/docs/lifecycle.md +323 -0
- package/docs/long-running-agents.md +2 -4
- package/docs/mcp-client.md +55 -0
- package/docs/observability.md +11 -11
- package/docs/resumable-streaming.md +1 -1
- package/docs/scheduling.md +175 -15
- package/docs/server-driven-messages.md +1 -1
- package/docs/sub-agents.md +1 -1
- package/package.json +30 -21
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +0 -26
- package/dist/cli/index.js.map +0 -1
- package/dist/client-invoker-VNZ7X0nn.js.map +0 -1
- package/dist/client-zqKcsyFa.js.map +0 -1
- package/dist/handler-stateless-CIkKPETH.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal_context-Dg4Cgjcu.d.ts +0 -37
- package/dist/internal_context.js.map +0 -1
- package/dist/mcp/client.d.ts +0 -42
- package/dist/mcp/do-oauth-client-provider.js.map +0 -1
- package/dist/mcp/x402.js.map +0 -1
- package/dist/protocol-Dqc2MQxo.js.map +0 -1
- package/dist/ws-chat-transport-CIoOBbO7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["record","isAsyncIterable","agentContext"],"sources":["../../../src/observability/ai/read.ts","../../../src/observability/genai/attributes.ts","../../../src/observability/genai/telemetry.ts","../../../src/observability/ai/wrapper/extract.ts","../../../src/observability/ai/ai-gateway.ts","../../../src/observability/ai/content.ts","../../../src/observability/ai/wrapper/streams.ts","../../../src/observability/ai/wrapper/model.ts","../../../src/observability/ai/wrapper/tools.ts","../../../src/observability/ai/wrapper/wrap.ts","../../../src/observability/ai/index.ts"],"sourcesContent":["/** Narrows an unknown value to a string. */\nexport function readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/** Narrows an unknown value to a number. */\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\n/** AI SDK token counts are either a plain number or `{ total?: number, ... }`. */\nexport function readTokenCount(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"object\" && value !== null) {\n // SAFETY: AI SDK nested token count has a numeric total field.\n const total = (value as Record<string, unknown>).total;\n return typeof total === \"number\" ? total : undefined;\n }\n\n return undefined;\n}\n\n/** Reads a numeric sub-field from a nested AI SDK token count object. */\nexport function readNestedTokenField(\n value: unknown,\n key: string\n): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK nested token count has known numeric sub-fields.\n const nested = (value as Record<string, unknown>)[key];\n return typeof nested === \"number\" ? nested : undefined;\n}\n","/**\n * Local trace attribute keys used by the Cloudflare GenAI projection.\n *\n * `gen_ai.*` keys follow OpenTelemetry GenAI semantic conventions where they\n * exist (Development status — tracked so spec churn stays an internal edit;\n * none of these constants are exported from the package). Keys with no\n * semconv home live under the `cloudflare.agents.*` vendor namespace — never\n * bare top-level keys, never `ai.*` (the Vercel AI SDK's de-facto namespace).\n */\nexport const TraceAttribute = {\n Cloudflare: {\n AIGatewayLogID: \"cloudflare.ai_gateway.log.id\",\n IntegrationName: \"cloudflare.agents.integration.name\",\n MetadataPrefix: \"cloudflare.agents.metadata.\",\n OperationName: \"cloudflare.agents.operation.name\",\n ResponseFinishReason: \"cloudflare.agents.response.finish_reason\",\n RuntimeContextPrefix: \"cloudflare.agents.runtime_context.\",\n ToolApprovalState: \"cloudflare.agents.tool.approval.state\",\n ToolCount: \"cloudflare.agents.tool.count\",\n TurnAdmission: \"cloudflare.agents.turn.admission\",\n TurnChannel: \"cloudflare.agents.turn.channel\",\n TurnContinuation: \"cloudflare.agents.turn.continuation\",\n TurnGeneration: \"cloudflare.agents.turn.generation\",\n TurnRequestID: \"cloudflare.agents.turn.request_id\",\n TurnTrigger: \"cloudflare.agents.turn.trigger\",\n UsageTotalTokens: \"cloudflare.agents.usage.total_tokens\"\n },\n General: {\n UserID: \"user.id\"\n },\n GenAI: {\n AgentID: \"gen_ai.agent.id\",\n AgentName: \"gen_ai.agent.name\",\n AgentVersion: \"gen_ai.agent.version\",\n ConversationID: \"gen_ai.conversation.id\",\n InputMessages: \"gen_ai.input.messages\",\n OperationName: \"gen_ai.operation.name\",\n OperationNameValueChat: \"chat\",\n OperationNameValueExecuteTool: \"execute_tool\",\n OperationNameValueInvokeAgent: \"invoke_agent\",\n OutputMessages: \"gen_ai.output.messages\",\n OutputType: \"gen_ai.output.type\",\n ProviderName: \"gen_ai.provider.name\",\n RequestFrequencyPenalty: \"gen_ai.request.frequency_penalty\",\n RequestMaxTokens: \"gen_ai.request.max_tokens\",\n RequestModel: \"gen_ai.request.model\",\n RequestPresencePenalty: \"gen_ai.request.presence_penalty\",\n RequestSeed: \"gen_ai.request.seed\",\n RequestStream: \"gen_ai.request.stream\",\n RequestTemperature: \"gen_ai.request.temperature\",\n RequestTopK: \"gen_ai.request.top_k\",\n RequestTopP: \"gen_ai.request.top_p\",\n ResponseID: \"gen_ai.response.id\",\n ResponseModel: \"gen_ai.response.model\",\n ResponseTimeToFirstChunk: \"gen_ai.response.time_to_first_chunk\",\n ToolCallArguments: \"gen_ai.tool.call.arguments\",\n ToolCallID: \"gen_ai.tool.call.id\",\n ToolCallResult: \"gen_ai.tool.call.result\",\n ToolName: \"gen_ai.tool.name\",\n ToolType: \"gen_ai.tool.type\",\n UsageCacheCreationInputTokens: \"gen_ai.usage.cache_creation.input_tokens\",\n UsageCacheReadInputTokens: \"gen_ai.usage.cache_read.input_tokens\",\n UsageInputTokens: \"gen_ai.usage.input_tokens\",\n UsageOutputTokens: \"gen_ai.usage.output_tokens\",\n UsageReasoningOutputTokens: \"gen_ai.usage.reasoning.output_tokens\"\n }\n} as const;\n","import { TraceAttribute } from \"./attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n/** Canonical token usage shape used by model adapters. */\nexport type TokenUsageSummary = {\n readonly cacheCreationInputTokens?: number | undefined;\n readonly cacheReadInputTokens?: number | undefined;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly reasoningTokens?: number | undefined;\n readonly totalTokens?: number | undefined;\n};\n\n/** Safe request settings that map to scalar GenAI semantic attributes. */\nexport type RequestSummary = {\n readonly frequencyPenalty?: number | undefined;\n readonly maxTokens?: number | undefined;\n readonly outputType?: string | undefined;\n readonly presencePenalty?: number | undefined;\n readonly seed?: number | undefined;\n readonly stream?: boolean | undefined;\n readonly temperature?: number | undefined;\n readonly topK?: number | undefined;\n readonly topP?: number | undefined;\n};\n\n/** Safe response metadata that maps to scalar GenAI semantic attributes. */\nexport type ResponseSummary = {\n readonly id?: string | undefined;\n readonly model?: string | undefined;\n};\n\n/** Safe agent/conversation metadata provided explicitly by callers. */\nexport type SemanticContext = {\n readonly agentId?: string | undefined;\n readonly agentName?: string | undefined;\n readonly agentVersion?: string | undefined;\n readonly conversationId?: string | undefined;\n};\n\n/** Name and initial attributes for a model-operation span. */\nexport type SpanSpec = {\n readonly attributes: TraceAttributes;\n readonly name: string;\n};\n\n/**\n * Builds a semconv-formula span name (`\"{operation} {target}\"`), falling back\n * to the bare operation when the target is unavailable or the combined name\n * exceeds the Workers Observability 64 UTF-8-byte budget. The full target\n * remains available as an attribute; the stable query key is always\n * `gen_ai.operation.name`, never the span name.\n */\nfunction spanName(operation: string, target: string | undefined): string {\n if (!target) {\n return operation;\n }\n\n const name = `${operation} ${target}`;\n return new TextEncoder().encode(name).length <= 64 ? name : operation;\n}\n\n/**\n * Normalizes an AI SDK provider identifier to the semconv\n * `gen_ai.provider.name` enum where a member exists: sub-provider suffixes\n * are stripped (`anthropic.messages` → `anthropic`) and known aliases mapped.\n * Unknown providers pass through verbatim (semconv sanctions custom values).\n */\nfunction normalizeProviderName(\n provider: string | undefined\n): string | undefined {\n if (provider === undefined) {\n return undefined;\n }\n\n const lower = provider.toLowerCase();\n const mappings: ReadonlyArray<readonly [prefix: string, value: string]> = [\n [\"google.vertex\", \"gcp.vertex_ai\"],\n [\"google.generative-ai\", \"gcp.gemini\"],\n [\"google-vertex\", \"gcp.vertex_ai\"],\n [\"amazon-bedrock\", \"aws.bedrock\"],\n [\"azure-openai\", \"azure.ai.openai\"],\n [\"anthropic\", \"anthropic\"],\n [\"openai\", \"openai\"],\n [\"azure\", \"azure.ai.inference\"],\n [\"google\", \"gcp.gemini\"],\n [\"mistral\", \"mistral_ai\"],\n [\"cohere\", \"cohere\"],\n [\"bedrock\", \"aws.bedrock\"],\n [\"groq\", \"groq\"],\n [\"deepseek\", \"deepseek\"],\n [\"perplexity\", \"perplexity\"],\n [\"xai\", \"x_ai\"]\n ];\n\n for (const [prefix, value] of mappings) {\n if (\n lower === prefix ||\n lower.startsWith(`${prefix}.`) ||\n lower.startsWith(`${prefix}-`)\n ) {\n return value;\n }\n }\n\n return provider;\n}\n\n/**\n * Reserved telemetry-metadata keys that map to dedicated attributes on the\n * operation root span. Everything else scalar passes through under\n * `cloudflare.agents.metadata.{key}`; identity keys are consumed by\n * SemanticContext extraction and never passed through.\n */\nconst RESERVED_METADATA_ATTRIBUTES: Readonly<Record<string, string>> = {\n [TraceAttribute.Cloudflare.TurnAdmission]:\n TraceAttribute.Cloudflare.TurnAdmission,\n [TraceAttribute.Cloudflare.TurnChannel]:\n TraceAttribute.Cloudflare.TurnChannel,\n [TraceAttribute.Cloudflare.TurnContinuation]:\n TraceAttribute.Cloudflare.TurnContinuation,\n [TraceAttribute.Cloudflare.TurnGeneration]:\n TraceAttribute.Cloudflare.TurnGeneration,\n [TraceAttribute.Cloudflare.TurnRequestID]:\n TraceAttribute.Cloudflare.TurnRequestID,\n [TraceAttribute.Cloudflare.TurnTrigger]:\n TraceAttribute.Cloudflare.TurnTrigger,\n [TraceAttribute.General.UserID]: TraceAttribute.General.UserID\n};\n\nconst CONSUMED_METADATA_KEYS = new Set([\n \"agentId\",\n \"agentName\",\n \"agentVersion\",\n \"conversationId\",\n \"gen_ai.agent.id\",\n \"gen_ai.agent.name\",\n \"gen_ai.agent.version\",\n \"gen_ai.conversation.id\"\n]);\n\n/**\n * Projects a per-call telemetry record onto root span attributes: reserved\n * keys map to their dedicated attributes, any other SCALAR entry passes\n * through under `passthroughPrefix`, and object/array values are dropped\n * (scalar-only attribute rule).\n *\n * v6 passes `experimental_telemetry.metadata` and keeps the default prefix;\n * v7 has no metadata option and passes the included subset of `runtimeContext`\n * under its own prefix. Reserved keys land on the same attribute either way,\n * so turn identity does not move namespace between SDK majors.\n */\nexport function metadataAttributes(\n metadata: Record<string, unknown> | undefined,\n passthroughPrefix: string = TraceAttribute.Cloudflare.MetadataPrefix\n): TraceAttributes {\n if (metadata === undefined) {\n return {};\n }\n\n const attributes: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (CONSUMED_METADATA_KEYS.has(key)) {\n continue;\n }\n if (\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n continue;\n }\n\n const reserved = Object.hasOwn(RESERVED_METADATA_ATTRIBUTES, key)\n ? RESERVED_METADATA_ATTRIBUTES[key]\n : undefined;\n attributes[reserved ?? `${passthroughPrefix}${key}`] = value;\n }\n\n return attributes;\n}\n\n/**\n * Cheap root-span name for an agent operation: needs only the agent name (the\n * one value instrumentation may read before the sampling check), never the\n * full attribute spec.\n */\nexport function operationSpanName(agentName: string | undefined): string {\n return spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n agentName\n );\n}\n\n/** Builds the root span for an SDK operation such as generateText or streamText. */\nexport function operationSpan(input: {\n readonly attributes: TraceAttributes | undefined;\n readonly context?: SemanticContext | undefined;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.AgentID]: input.context?.agentId,\n [TraceAttribute.GenAI.AgentName]: input.context?.agentName,\n [TraceAttribute.GenAI.AgentVersion]: input.context?.agentVersion,\n [TraceAttribute.GenAI.ConversationID]: input.context?.conversationId,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n input.context?.agentName\n )\n };\n}\n\n/** Builds the child span for an underlying model call. */\nexport function modelCallSpan(input: {\n readonly attributes?: TraceAttributes | undefined;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueChat,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(TraceAttribute.GenAI.OperationNameValueChat, input.model)\n };\n}\n\nfunction requestAttributes(\n request: RequestSummary | undefined,\n model: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputType]: request?.outputType,\n [TraceAttribute.GenAI.RequestFrequencyPenalty]: request?.frequencyPenalty,\n [TraceAttribute.GenAI.RequestMaxTokens]: request?.maxTokens,\n [TraceAttribute.GenAI.RequestModel]: model,\n [TraceAttribute.GenAI.RequestPresencePenalty]: request?.presencePenalty,\n [TraceAttribute.GenAI.RequestSeed]: request?.seed,\n // Semconv: gen_ai.request.stream is set if and only if streaming.\n [TraceAttribute.GenAI.RequestStream]:\n request?.stream === true ? true : undefined,\n [TraceAttribute.GenAI.RequestTemperature]: request?.temperature,\n [TraceAttribute.GenAI.RequestTopK]: request?.topK,\n [TraceAttribute.GenAI.RequestTopP]: request?.topP\n };\n}\n\n/** Builds the child span for a tool execution. */\nexport function toolCallSpan(input: {\n readonly operation: string;\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n input.toolName\n )\n };\n}\n\n/** Builds a bounded child span for one tool-approval lifecycle segment. */\nexport function toolApprovalSpan(input: {\n readonly state: \"approved\" | \"denied\" | \"requested\";\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: \"tool.approval\",\n [TraceAttribute.Cloudflare.ToolApprovalState]: input.state,\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\"tool_approval\", input.toolName)\n };\n}\n\n/** Projects a completed model operation into canonical finish attributes. */\nexport function finishAttributes(input: {\n readonly aiGatewayLogId?: string | undefined;\n readonly finishReason: string | undefined;\n readonly response?: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds?: number | undefined;\n readonly toolCallCount?: number | undefined;\n readonly usage: TokenUsageSummary | undefined;\n}): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: input.aiGatewayLogId,\n [TraceAttribute.Cloudflare.ResponseFinishReason]: input.finishReason,\n [TraceAttribute.Cloudflare.ToolCount]: input.toolCallCount,\n [TraceAttribute.Cloudflare.UsageTotalTokens]: totalTokens(input.usage),\n [TraceAttribute.GenAI.ResponseID]: input.response?.id,\n [TraceAttribute.GenAI.ResponseModel]: input.response?.model,\n [TraceAttribute.GenAI.ResponseTimeToFirstChunk]:\n input.timeToFirstChunkSeconds,\n [TraceAttribute.GenAI.UsageCacheCreationInputTokens]:\n input.usage?.cacheCreationInputTokens,\n [TraceAttribute.GenAI.UsageCacheReadInputTokens]:\n input.usage?.cacheReadInputTokens,\n [TraceAttribute.GenAI.UsageInputTokens]: input.usage?.inputTokens,\n [TraceAttribute.GenAI.UsageOutputTokens]: input.usage?.outputTokens,\n [TraceAttribute.GenAI.UsageReasoningOutputTokens]:\n input.usage?.reasoningTokens\n };\n}\n\n/** Attribute projection for an AI Gateway log reference discovered on error. */\nexport function aiGatewayLogAttributes(\n aiGatewayLogId: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: aiGatewayLogId\n };\n}\n\nfunction totalTokens(usage: TokenUsageSummary | undefined): number | undefined {\n if (usage?.totalTokens !== undefined) {\n return usage.totalTokens;\n }\n return usage?.inputTokens !== undefined && usage.outputTokens !== undefined\n ? usage.inputTokens + usage.outputTokens\n : undefined;\n}\n","import { finishAttributes } from \"../../genai/telemetry\";\nimport type {\n RequestSummary,\n ResponseSummary,\n TokenUsageSummary\n} from \"../../genai/telemetry\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport {\n readNestedTokenField,\n readNumber,\n readString,\n readTokenCount\n} from \"../read\";\n\n/** Identity fields extracted from an AI SDK language model object. */\nexport type ModelInfo = {\n readonly modelId: string | undefined;\n readonly provider: string | undefined;\n};\n\nexport function finishAttributesFromResult(\n result: unknown,\n options: {\n readonly aiGatewayLogId?: string | undefined;\n readonly includeResponse?: boolean;\n } = {}\n): TraceAttributes {\n return finishAttributes({\n aiGatewayLogId: options.aiGatewayLogId,\n finishReason: extractFinishReason(result),\n response: options.includeResponse ? extractResponseInfo(result) : undefined,\n toolCallCount: extractToolCallCount(result),\n usage: extractAISDKTokenUsage(result)\n });\n}\n\nexport function extractRequestSummary(\n params: Record<string, unknown>,\n operation: string\n): RequestSummary {\n return {\n frequencyPenalty: readNumber(params.frequencyPenalty),\n maxTokens: readNumber(params.maxOutputTokens ?? params.maxTokens),\n outputType:\n operation === \"generateObject\" || operation === \"streamObject\"\n ? \"json\"\n : \"text\",\n presencePenalty: readNumber(params.presencePenalty),\n seed: readNumber(params.seed),\n stream: operation === \"streamText\" || operation === \"streamObject\",\n temperature: readNumber(params.temperature),\n topK: readNumber(params.topK),\n topP: readNumber(params.topP)\n };\n}\n\n/** Extracts model identity from an AI SDK model object. */\nexport function extractModelInfo(value: unknown): ModelInfo | undefined {\n // Gateway-style string model ids still identify the model.\n if (typeof value === \"string\") {\n return value.length > 0\n ? { modelId: value, provider: undefined }\n : undefined;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK model objects are records; we only read modelId and provider.\n const record = value as Record<string, unknown>;\n const modelId =\n typeof record.modelId === \"string\" ? record.modelId : undefined;\n const provider =\n typeof record.provider === \"string\" ? record.provider : undefined;\n\n if (modelId === undefined && provider === undefined) {\n return undefined;\n }\n\n return { modelId, provider };\n}\n\n/**\n * Extracts token usage from an AI SDK result or stream chunk across supported\n * majors. Token counts may be plain numbers or nested objects such as\n * `{ total, cacheRead, cacheWrite }` / `{ total, reasoning }`.\n */\nexport function extractAISDKTokenUsage(\n value: unknown\n): TokenUsageSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result/chunk objects are records with known optional fields.\n const record = value as Record<string, unknown>;\n\n // Results expose totalUsage (multi-step aggregate) or usage.\n const raw = record.totalUsage ?? record.usage;\n if (typeof raw !== \"object\" || raw === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK usage is a record with inputTokens, outputTokens, totalTokens.\n const usage = raw as Record<string, unknown>;\n\n const inputTokens = readTokenCount(usage.inputTokens);\n const outputTokens = readTokenCount(usage.outputTokens);\n const totalTokens = readNumber(usage.totalTokens);\n // The public result usage keeps details in inputTokenDetails/outputTokenDetails\n // (with deprecated flat fields); provider-level usage nests them on the token\n // counts themselves. Read all shapes.\n const cacheReadInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheReadTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheRead\") ??\n readNumber(usage.cachedInputTokens);\n const cacheCreationInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheWriteTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheWrite\");\n const reasoningTokens =\n readNestedTokenField(usage.outputTokenDetails, \"reasoningTokens\") ??\n readNestedTokenField(usage.outputTokens, \"reasoning\") ??\n readNumber(usage.reasoningTokens);\n\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined &&\n cacheReadInputTokens === undefined &&\n cacheCreationInputTokens === undefined &&\n reasoningTokens === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(cacheCreationInputTokens !== undefined\n ? { cacheCreationInputTokens }\n : {}),\n ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {})\n };\n}\n\nfunction extractToolCallCount(value: unknown): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const toolCalls = (value as Record<string, unknown>).toolCalls;\n return Array.isArray(toolCalls) && toolCalls.length > 0\n ? toolCalls.length\n : undefined;\n}\n\n/**\n * Reads a finish reason from an AI SDK result or `finish`-type stream chunk.\n */\nexport function extractFinishReason(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects are records with an optional finishReason field.\n const record = value as Record<string, unknown>;\n const finishReason = record.finishReason;\n\n if (typeof finishReason === \"string\") {\n return finishReason;\n }\n\n // The SDK may expose finishReason as { unified: string }.\n if (typeof finishReason === \"object\" && finishReason !== null) {\n // SAFETY: finishReason object has an optional unified string field.\n const unified = (finishReason as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n }\n\n return undefined;\n}\n\nexport function extractResponseInfo(\n value: unknown\n): ResponseSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects may expose a response record with id/model.\n const record = value as Record<string, unknown>;\n\n // Provider-level `response-metadata` stream parts carry id/modelId at the\n // top level (no nested response record).\n if (record.type === \"response-metadata\") {\n const id = readString(record.id);\n const model = readString(record.modelId);\n if (id === undefined && model === undefined) {\n return undefined;\n }\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n }\n\n const response =\n typeof record.response === \"object\" && record.response !== null\n ? (record.response as Record<string, unknown>)\n : undefined;\n const id = readString(record.responseId ?? response?.id);\n const model = readString(\n record.responseModel ?? response?.modelId ?? response?.model\n );\n\n if (id === undefined && model === undefined) {\n return undefined;\n }\n\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n}\n","const MAX_AI_GATEWAY_LOG_ID_BYTES = 256;\nconst AI_GATEWAY_CONTAINER_KEYS = new Set([\n \"aigateway\",\n \"binding\",\n \"cause\",\n \"cloudflare\",\n \"config\",\n \"context\",\n \"error\",\n \"gateway\",\n \"providermetadata\",\n \"rawresponse\",\n \"response\",\n \"workersai\"\n]);\n\n/**\n * Reads an AI Gateway log id from explicit provider surfaces only: response\n * headers, provider metadata, gateway errors, or a Workers AI binding. The\n * walk is bounded and uses data-property descriptors, so telemetry cannot get\n * stuck on cycles or invoke arbitrary application getters. Unknown shapes fail\n * open and simply omit the attribute.\n */\nexport function extractAIGatewayLogId(value: unknown): string | undefined {\n const seen = new Set<object>();\n let visited = 0;\n\n const visit = (\n candidate: unknown,\n depth: number,\n gatewayScoped: boolean,\n providerMetadata: boolean,\n responseScoped: boolean\n ): string | undefined => {\n if (\n candidate === null ||\n candidate === undefined ||\n depth > 6 ||\n (typeof candidate !== \"object\" && typeof candidate !== \"function\") ||\n seen.has(candidate) ||\n visited >= 200\n ) {\n return undefined;\n }\n seen.add(candidate);\n visited += 1;\n\n if (typeof Response !== \"undefined\" && candidate instanceof Response) {\n return readHeaderLogId(candidate.headers);\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(candidate);\n } catch {\n return undefined;\n }\n\n const objectName = dataString(descriptors.name);\n const scopedHere =\n gatewayScoped ||\n (objectName !== undefined && isGatewayKey(normalizeKey(objectName)));\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n\n const normalizedKey = normalizeKey(key);\n if (\n normalizedKey === \"cfaiglogid\" ||\n normalizedKey === \"aigatewaylogid\"\n ) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (\n normalizedKey === \"responseheaders\" ||\n (normalizedKey === \"headers\" && responseScoped)\n ) {\n const logId = readHeaderLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (normalizedKey === \"logid\" && scopedHere) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n }\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n const normalizedKey = normalizeKey(key);\n if (!providerMetadata && !AI_GATEWAY_CONTAINER_KEYS.has(normalizedKey)) {\n continue;\n }\n\n const nested = visit(\n descriptor.value,\n depth + 1,\n scopedHere || isGatewayKey(normalizedKey),\n providerMetadata || normalizedKey === \"providermetadata\",\n normalizedKey === \"response\" || normalizedKey === \"rawresponse\"\n );\n if (nested !== undefined) {\n return nested;\n }\n }\n\n return undefined;\n };\n\n return visit(value, 0, false, false, false);\n}\n\n/** Per-wrapped-model view of a Workers AI binding's latest response log id. */\nexport type AIGatewayLogCapture = {\n readonly model: object;\n get(): string | undefined;\n reset(): void;\n};\n\n/**\n * workers-ai-provider currently exposes the gateway ID on its `Ai` binding,\n * not in the LanguageModel result. Clone only that known runtime shape and\n * proxy `binding.run` so the ID is captured as that call settles instead of\n * reading the binding's mutable latest value later when the span ends.\n */\nexport function captureAIGatewayLogFromModel(\n model: object,\n provider: string | undefined\n): AIGatewayLogCapture {\n let logId: string | undefined;\n const capture = {\n model,\n get: () => logId,\n reset: () => {\n logId = undefined;\n }\n };\n\n if (!provider?.toLowerCase().startsWith(\"workersai\")) {\n return capture;\n }\n\n try {\n const modelDescriptors = Object.getOwnPropertyDescriptors(model);\n const configDescriptor = modelDescriptors.config;\n if (!configDescriptor || !(\"value\" in configDescriptor)) {\n return capture;\n }\n\n const config = configDescriptor.value;\n if (typeof config !== \"object\" || config === null) {\n return capture;\n }\n const configDescriptors = Object.getOwnPropertyDescriptors(config);\n const bindingDescriptor = configDescriptors.binding;\n if (!bindingDescriptor || !(\"value\" in bindingDescriptor)) {\n return capture;\n }\n\n const binding = bindingDescriptor.value;\n if (\n typeof binding !== \"object\" ||\n binding === null ||\n !(\"aiGatewayLogId\" in binding) ||\n typeof (binding as { run?: unknown }).run !== \"function\"\n ) {\n return capture;\n }\n\n const bindingProxy = new Proxy(binding, {\n get(target, property, receiver) {\n if (property !== \"run\") {\n return Reflect.get(target, property, receiver);\n }\n\n return (...args: readonly unknown[]) => {\n const run = Reflect.get(target, property, target) as (\n ...runArgs: readonly unknown[]\n ) => unknown;\n const previousLogId = extractAIGatewayLogId(target);\n logId = undefined;\n const captureResult = (result: unknown): void => {\n const resultLogId = extractAIGatewayLogId(result);\n const currentLogId = extractAIGatewayLogId(target);\n logId =\n resultLogId ??\n (currentLogId !== previousLogId ? currentLogId : undefined);\n };\n try {\n return Promise.resolve(Reflect.apply(run, target, args)).then(\n (result) => {\n captureResult(result);\n return result;\n },\n (cause: unknown) => {\n captureResult(cause);\n throw cause;\n }\n );\n } catch (cause: unknown) {\n captureResult(cause);\n throw cause;\n }\n };\n }\n });\n\n const configClone = Object.create(Object.getPrototypeOf(config), {\n ...configDescriptors,\n binding: { ...bindingDescriptor, value: bindingProxy }\n }) as object;\n capture.model = Object.create(Object.getPrototypeOf(model), {\n ...modelDescriptors,\n config: { ...configDescriptor, value: configClone }\n }) as object;\n } catch {\n // Unknown/frozen/proxied provider shape: keep the original model. Header\n // and provider-metadata extraction still work when the result exposes them.\n }\n\n return capture;\n}\n\nfunction readHeaderLogId(value: unknown): string | undefined {\n if (isHeadersLike(value)) {\n try {\n return boundedAIGatewayLogId(value.get(\"cf-aig-log-id\"));\n } catch {\n return undefined;\n }\n }\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(value);\n } catch {\n return undefined;\n }\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (\"value\" in descriptor && key.toLowerCase() === \"cf-aig-log-id\") {\n return boundedAIGatewayLogId(descriptor.value);\n }\n }\n return undefined;\n}\n\nfunction isHeadersLike(\n value: unknown\n): value is { get(name: string): string | null } {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n try {\n return \"get\" in value && typeof value.get === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isGatewayKey(value: string): boolean {\n return (\n value.includes(\"gateway\") ||\n value.includes(\"aig\") ||\n value.includes(\"workersai\") ||\n value === \"cloudflare\"\n );\n}\n\nfunction normalizeKey(value: string): string {\n return value.toLowerCase().replaceAll(/[-_.]/g, \"\");\n}\n\nfunction dataString(\n descriptor: PropertyDescriptor | undefined\n): string | undefined {\n return descriptor && \"value\" in descriptor\n ? nonEmptyString(descriptor.value)\n : undefined;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction boundedAIGatewayLogId(value: unknown): string | undefined {\n const id = nonEmptyString(value);\n return id !== undefined &&\n new TextEncoder().encode(id).length <= MAX_AI_GATEWAY_LOG_ID_BYTES\n ? id\n : undefined;\n}\n","import { TraceAttribute } from \"../genai/attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n// Two payload attributes plus scalar metadata stay under workerd's 64 KiB cap.\nconst MAX_ATTRIBUTE_BYTES = 28 * 1024;\nconst PROTECTED_HEAD_MESSAGES = 2;\n\ntype GenAIMessagePart = Record<string, unknown>;\ntype GenAIInputMessage = {\n readonly name?: string;\n readonly parts: GenAIMessagePart[];\n readonly role: string;\n};\ntype GenAIOutputMessage = GenAIInputMessage & {\n readonly finish_reason: string;\n};\n\nexport function inputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const messages = Array.isArray(record.prompt)\n ? record.prompt\n : Array.isArray(record.messages)\n ? record.messages\n : typeof record.prompt === \"string\"\n ? [{ role: \"user\", content: record.prompt }]\n : undefined;\n return {\n [TraceAttribute.GenAI.InputMessages]: serializeMessages(\n messages === undefined ? undefined : formatInputMessages(messages)\n )\n };\n}\n\nexport function outputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const parts = outputParts(record);\n const finishReason = readFinishReason(record);\n return outputMessageAttributesFrom(\n parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined\n );\n}\n\nexport function outputMessageAttributesFrom(\n messages: readonly unknown[] | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputMessages]: serializeMessages(messages)\n };\n}\n\nexport function toolInputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallArguments]: serialize(value) }\n : {};\n}\n\nexport function toolOutputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallResult]: serialize(value) }\n : {};\n}\n\nexport function createStreamMessages(): {\n messages(finishReason?: string): unknown[] | undefined;\n observe(chunk: unknown): void;\n} {\n let text = \"\";\n let reasoning = \"\";\n const toolParts: GenAIMessagePart[] = [];\n\n return {\n messages(finishReason) {\n const parts = [\n ...(reasoning\n ? [{ type: \"reasoning\", content: reasoning } as GenAIMessagePart]\n : []),\n ...(text ? [{ type: \"text\", content: text } as GenAIMessagePart] : []),\n ...toolParts\n ];\n return parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined;\n },\n observe(chunk) {\n if (typeof chunk !== \"object\" || chunk === null) return;\n const record = chunk as Record<string, unknown>;\n const delta = record.text ?? record.delta;\n if (record.type === \"text-delta\" && typeof delta === \"string\") {\n text += delta;\n } else if (\n record.type === \"reasoning-delta\" &&\n typeof delta === \"string\"\n ) {\n reasoning += delta;\n } else if (record.type === \"tool-call\" || record.type === \"tool-result\") {\n const part = formatMessagePart(record);\n if (part !== undefined) toolParts.push(part);\n }\n }\n };\n}\n\nfunction formatInputMessages(\n messages: readonly unknown[]\n): GenAIInputMessage[] {\n const formatted: GenAIInputMessage[] = [];\n for (const message of messages) {\n const next = formatInputMessage(message);\n if (next !== undefined) formatted.push(next);\n }\n return formatted;\n}\n\nfunction formatInputMessage(value: unknown): GenAIInputMessage | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const record = value as Record<string, unknown>;\n if (typeof record.role !== \"string\") return undefined;\n\n const rawParts = Array.isArray(record.parts)\n ? record.parts\n : Array.isArray(record.content)\n ? record.content\n : typeof record.content === \"string\"\n ? [record.content]\n : [];\n const parts = rawParts\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n const name = typeof record.name === \"string\" ? record.name : undefined;\n\n return {\n role: record.role,\n parts,\n ...(name !== undefined ? { name } : {})\n };\n}\n\nfunction outputParts(record: Record<string, unknown>): GenAIMessagePart[] {\n if (Array.isArray(record.content)) {\n return record.content\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n }\n\n const parts: GenAIMessagePart[] = [];\n appendReasoningParts(parts, record.reasoning);\n if (typeof record.text === \"string\" && record.text.length > 0) {\n parts.push({ type: \"text\", content: record.text });\n }\n if (Array.isArray(record.toolCalls)) {\n for (const toolCall of record.toolCalls) {\n const part = formatMessagePart(toolCall);\n if (part !== undefined) parts.push(part);\n }\n }\n return parts;\n}\n\nfunction appendReasoningParts(\n parts: GenAIMessagePart[],\n reasoning: unknown\n): void {\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n parts.push({ type: \"reasoning\", content: reasoning });\n return;\n }\n if (!Array.isArray(reasoning)) return;\n\n for (const entry of reasoning) {\n if (typeof entry !== \"object\" || entry === null) continue;\n const text = (entry as Record<string, unknown>).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"reasoning\", content: text });\n }\n }\n}\n\nfunction formatMessagePart(value: unknown): GenAIMessagePart | undefined {\n if (typeof value === \"string\") {\n return { type: \"text\", content: value };\n }\n if (typeof value !== \"object\" || value === null) return undefined;\n\n const record = value as Record<string, unknown>;\n if (typeof record.type !== \"string\") return undefined;\n\n switch (record.type) {\n case \"text\":\n case \"reasoning\": {\n const content = record.content ?? record.text;\n return typeof content === \"string\"\n ? { type: record.type, content }\n : undefined;\n }\n case \"tool-call\":\n case \"tool_call\":\n return formatToolCall(record);\n case \"tool-result\":\n case \"tool_result\":\n case \"tool_call_response\":\n return formatToolCallResponse(record);\n default:\n // The OTel schema permits extensible generic parts. Keep their type but\n // do not leak AI SDK-native property names into known semantic parts.\n return { type: record.type.replaceAll(\"-\", \"_\") };\n }\n}\n\nfunction formatToolCall(\n record: Record<string, unknown>\n): GenAIMessagePart | undefined {\n const name = record.name ?? record.toolName;\n if (typeof name !== \"string\") return undefined;\n const id = record.id ?? record.toolCallId;\n const args = record.arguments ?? record.input;\n\n return {\n type: \"tool_call\",\n ...(typeof id === \"string\" ? { id } : {}),\n name,\n ...(args !== undefined ? { arguments: parseJson(args) } : {})\n };\n}\n\nfunction formatToolCallResponse(\n record: Record<string, unknown>\n): GenAIMessagePart {\n const id = record.id ?? record.toolCallId;\n const rawResponse = record.response ?? record.output ?? record.result ?? null;\n\n return {\n type: \"tool_call_response\",\n ...(typeof id === \"string\" ? { id } : {}),\n response: toolResponse(rawResponse)\n };\n}\n\nfunction toolResponse(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const record = value as Record<string, unknown>;\n switch (record.type) {\n case \"text\":\n case \"error-text\":\n case \"json\":\n case \"error-json\":\n case \"content\":\n return record.value ?? null;\n case \"execution-denied\":\n return {\n denied: true,\n ...(typeof record.reason === \"string\" ? { reason: record.reason } : {})\n };\n default:\n return value;\n }\n}\n\nfunction outputMessage(\n parts: GenAIMessagePart[],\n finishReason: string | undefined\n): GenAIOutputMessage {\n return {\n role: \"assistant\",\n parts,\n // AI SDK normally always reports this. Keep the schema valid if a custom\n // provider omits it rather than emitting an output message without the\n // required field.\n finish_reason: normalizeFinishReason(finishReason ?? \"unknown\")\n };\n}\n\nfunction readFinishReason(record: Record<string, unknown>): string | undefined {\n const value = record.finishReason ?? record.finish_reason;\n if (typeof value === \"string\") return value;\n if (typeof value !== \"object\" || value === null) return undefined;\n const unified = (value as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n}\n\nfunction normalizeFinishReason(value: string): string {\n switch (value) {\n case \"content-filter\":\n return \"content_filter\";\n case \"tool-calls\":\n case \"tool_calls\":\n return \"tool_call\";\n case \"other\":\n case \"unknown\":\n return \"stop\";\n default:\n return value;\n }\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction serializeMessages(\n messages: readonly unknown[] | undefined\n): string | undefined {\n if (messages === undefined) return undefined;\n\n const kept = [...messages];\n while (true) {\n const json = stringify(kept);\n if (json === undefined) return undefined;\n if (byteLength(json) <= MAX_ATTRIBUTE_BYTES) return json;\n if (kept.length <= PROTECTED_HEAD_MESSAGES) return undefined;\n kept.splice(PROTECTED_HEAD_MESSAGES, 1);\n }\n}\n\nfunction serialize(value: unknown): string | undefined {\n const json = stringify(value);\n return json !== undefined && byteLength(json) <= MAX_ATTRIBUTE_BYTES\n ? json\n : undefined;\n}\n\nfunction stringify(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n","import {\n aiGatewayLogAttributes,\n finishAttributes\n} from \"../../genai/telemetry\";\nimport type { ResponseSummary, TokenUsageSummary } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes, AgentSpan } from \"../../tracing/tracer\";\nimport { extractAIGatewayLogId } from \"../ai-gateway\";\nimport { createStreamMessages, outputMessageAttributesFrom } from \"../content\";\nimport {\n extractAISDKTokenUsage,\n extractFinishReason,\n extractResponseInfo\n} from \"./extract\";\n\ntype StreamSummary = {\n readonly aiGatewayLogId?: string;\n readonly finishReason?: string;\n readonly outputMessages?: unknown[];\n readonly response?: ResponseSummary;\n readonly toolCallCount?: number;\n readonly timeToFirstChunkSeconds?: number;\n readonly usage?: TokenUsageSummary;\n};\n\nexport function finishWhenStreamCompletes(\n result: unknown,\n span: AgentSpan,\n options: {\n readonly aiGatewayLogId?: string;\n readonly includeAIGatewayLog?: boolean;\n readonly includeResponse?: boolean;\n readonly storeMessages?: boolean;\n readonly startedAtMs?: number;\n } = {}\n): unknown {\n return patchStreamFields(\n result,\n {\n onComplete: (summary) => {\n span.finish(\n finishAttributesFromStreamSummary(\n summary,\n options.includeResponse === true,\n options.includeAIGatewayLog === true,\n options.aiGatewayLogId,\n options.storeMessages === true\n )\n );\n },\n onError: (cause, observedAIGatewayLogId, observed) => {\n if (options.includeAIGatewayLog) {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(\n observedAIGatewayLogId ??\n extractAIGatewayLogId(cause) ??\n options.aiGatewayLogId\n )\n );\n }\n // A turn that fails or is cancelled part-way still spent the tokens it\n // already reported. `fail` records only the classification, so write\n // what the stream did tell us first — otherwise the turn reads as\n // having used nothing at all.\n if (observed !== undefined) {\n writeSpanAttributes(\n span,\n finishAttributesFromStreamSummary(\n observed,\n options.includeResponse === true,\n options.includeAIGatewayLog === true,\n options.aiGatewayLogId,\n options.storeMessages === true\n )\n );\n }\n span.fail(cause);\n }\n },\n options.startedAtMs,\n options.includeAIGatewayLog ? options.aiGatewayLogId : undefined,\n options.storeMessages === true\n );\n}\n\nfunction finishAttributesFromStreamSummary(\n summary: StreamSummary | undefined,\n includeResponse: boolean,\n includeAIGatewayLog: boolean,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): TraceAttributes {\n return {\n ...finishAttributes({\n aiGatewayLogId: includeAIGatewayLog\n ? (summary?.aiGatewayLogId ?? initialAIGatewayLogId)\n : undefined,\n finishReason: summary?.finishReason,\n response: includeResponse ? summary?.response : undefined,\n timeToFirstChunkSeconds: summary?.timeToFirstChunkSeconds,\n toolCallCount: summary?.toolCallCount,\n usage: summary?.usage\n }),\n ...outputMessageAttributesFrom(\n storeMessages ? summary?.outputMessages : undefined\n )\n };\n}\n\nfunction patchStreamFields(\n result: unknown,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): unknown {\n if (typeof result !== \"object\" || result === null) {\n hooks.onComplete(undefined);\n return result;\n }\n\n // SAFETY: AI SDK stream results are records with stream fields.\n const record = result as Record<string, unknown>;\n\n let patchedAny = false;\n let closed = false;\n\n const completeOnce = (summary: StreamSummary | undefined) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onComplete(summary);\n };\n\n const errorOnce = (\n cause: unknown,\n observedAIGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onError(cause, observedAIGatewayLogId, observed);\n };\n\n // Instrumentation must fail open: if the SDK's private stream fields change\n // shape or refuse patching, close the span and return the result untouched\n // rather than breaking an otherwise valid call.\n try {\n if (isReadableStream(record.baseStream)) {\n Object.defineProperty(record, \"baseStream\", {\n configurable: true,\n enumerable: true,\n value: wrapReadableStream(\n record.baseStream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n return result;\n }\n\n const streamField = findStreamField(record, [\n \"partialObjectStream\",\n \"textStream\",\n \"fullStream\",\n \"stream\"\n ]);\n\n if (streamField) {\n Object.defineProperty(record, streamField.field, {\n configurable: true,\n enumerable: true,\n value:\n streamField.kind === \"readable\"\n ? wrapReadableStream(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n )\n : wrapAsyncIterable(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n patchedAny = true;\n }\n } catch {\n patchedAny = false;\n }\n\n if (!patchedAny) {\n hooks.onComplete(undefined);\n return result;\n }\n\n return result;\n}\n\nfunction findStreamField(\n result: Record<string, unknown>,\n candidateFields: readonly string[]\n):\n | {\n readonly field: string;\n readonly kind: \"asyncIterable\";\n readonly stream: AsyncIterable<unknown>;\n }\n | {\n readonly field: string;\n readonly kind: \"readable\";\n readonly stream: ReadableStream<unknown>;\n }\n | undefined {\n for (const field of candidateFields) {\n try {\n const stream = result[field];\n if (isReadableStream(stream)) {\n return { field, kind: \"readable\", stream };\n }\n if (isAsyncIterable(stream)) {\n return { field, kind: \"asyncIterable\", stream };\n }\n } catch {\n // Ignore getter failures.\n }\n }\n\n return undefined;\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): ReadableStream<unknown> {\n let reader: ReadableStreamDefaultReader<unknown> | undefined;\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n\n return new ReadableStream<unknown>({\n async pull(controller) {\n reader ??= stream.getReader();\n try {\n const result = await reader.read();\n if (state.closed) {\n return;\n }\n\n if (result.done) {\n state.complete();\n controller.close();\n releaseReader();\n return;\n }\n\n state.observeChunk(result.value);\n controller.enqueue(result.value);\n } catch (cause: unknown) {\n if (!state.closed) {\n state.fail(cause);\n controller.error(cause);\n }\n releaseReader();\n }\n },\n async cancel(reason) {\n state.cancel();\n try {\n if (reader) {\n await reader.cancel(reason);\n return;\n }\n\n await stream.cancel(reason);\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n releaseReader();\n }\n }\n });\n\n function releaseReader(): void {\n if (!reader) {\n return;\n }\n\n try {\n reader.releaseLock();\n } catch {\n // Ignore lock release failures after stream errors or cancellation.\n } finally {\n reader = undefined;\n }\n }\n}\n\nfunction wrapAsyncIterable(\n stream: AsyncIterable<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n try {\n for await (const chunk of stream) {\n state.observeChunk(chunk);\n yield chunk;\n }\n\n state.complete();\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n state.cancel();\n }\n }\n };\n}\n\nfunction createStreamState(\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): {\n readonly closed: boolean;\n cancel(): void;\n complete(): void;\n fail(cause: unknown): void;\n observeChunk(chunk: unknown): void;\n} {\n let closed = false;\n let aiGatewayLogId = initialAIGatewayLogId;\n let finishReason: string | undefined;\n let toolCallCount = 0;\n let usage: TokenUsageSummary | undefined;\n let response: ResponseSummary | undefined;\n let observedError: { readonly cause: unknown } | undefined;\n let observedAbort = false;\n let firstChunkAtMs: number | undefined;\n const output = createStreamMessages();\n\n /** What the stream reported before it stopped, complete or not. */\n const observedSummary = (): StreamSummary =>\n streamSummaryFromParts({\n aiGatewayLogId,\n finishReason,\n outputMessages: storeMessages ? output.messages(finishReason) : undefined,\n response,\n timeToFirstChunkSeconds:\n firstChunkAtMs === undefined || startedAtMs === undefined\n ? undefined\n : (firstChunkAtMs - startedAtMs) / 1000,\n toolCallCount,\n usage\n });\n\n const settleObserved = (): boolean => {\n if (observedError) {\n hooks.onError(observedError.cause, aiGatewayLogId, observedSummary());\n return true;\n }\n\n if (observedAbort) {\n // AI SDK v6 signals aborts as an in-band `{ type: \"abort\" }` chunk and\n // completes the stream normally — it never rejects with an AbortError.\n // Surface a structurally AbortError-shaped cause so the tracer\n // classifies the span as canceled instead of a false success.\n hooks.onError({ name: \"AbortError\" }, aiGatewayLogId, observedSummary());\n return true;\n }\n\n return false;\n };\n\n return {\n get closed() {\n return closed;\n },\n cancel() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(undefined);\n },\n complete() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(\n streamSummaryFromParts({\n aiGatewayLogId,\n finishReason,\n outputMessages: storeMessages\n ? output.messages(finishReason)\n : undefined,\n response,\n timeToFirstChunkSeconds:\n firstChunkAtMs === undefined || startedAtMs === undefined\n ? undefined\n : (firstChunkAtMs - startedAtMs) / 1000,\n toolCallCount,\n usage\n })\n );\n },\n fail(cause) {\n if (closed) {\n return;\n }\n\n closed = true;\n hooks.onError(cause, aiGatewayLogId);\n },\n observeChunk(rawChunk) {\n firstChunkAtMs ??= Date.now();\n const chunk = unwrapChunkEnvelope(rawChunk);\n aiGatewayLogId = extractAIGatewayLogId(chunk) ?? aiGatewayLogId;\n if (storeMessages) output.observe(chunk);\n // AI SDK v6 signals mid-stream provider failures as an in-band\n // `{ type: \"error\" }` chunk rather than rejecting the stream, so the\n // stream still reaches normal completion afterward. Record it here and\n // fail the span on completion instead of treating it as a success.\n if (isErrorChunk(chunk)) {\n observedError = { cause: chunk.error };\n }\n if (isAbortChunk(chunk)) {\n observedAbort = true;\n }\n if (isToolCallChunk(chunk)) {\n toolCallCount += 1;\n }\n finishReason = extractFinishReason(chunk) ?? finishReason;\n usage = extractAISDKTokenUsage(chunk) ?? usage;\n response = extractResponseInfo(chunk) ?? response;\n }\n };\n}\n\n/**\n * The streamText result's private `baseStream` carries `{ part, partialOutput }`\n * envelopes rather than bare stream parts; `fullStream` and provider-level\n * streams carry bare parts. Unwrap the envelope when present so chunk\n * inspection sees the actual part in both cases.\n */\nfunction unwrapChunkEnvelope(chunk: unknown): unknown {\n if (typeof chunk !== \"object\" || chunk === null) {\n return chunk;\n }\n\n const part = (chunk as Record<string, unknown>).part;\n return typeof part === \"object\" &&\n part !== null &&\n \"type\" in (part as Record<string, unknown>)\n ? part\n : chunk;\n}\n\nfunction isErrorChunk(chunk: unknown): chunk is { readonly error: unknown } {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"error\"\n );\n}\n\nfunction isAbortChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"abort\"\n );\n}\n\nfunction streamSummaryFromParts(input: {\n readonly aiGatewayLogId: string | undefined;\n readonly finishReason: string | undefined;\n readonly outputMessages: unknown[] | undefined;\n readonly response: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds: number | undefined;\n readonly toolCallCount: number;\n readonly usage: TokenUsageSummary | undefined;\n}): StreamSummary {\n return {\n ...(input.aiGatewayLogId !== undefined\n ? { aiGatewayLogId: input.aiGatewayLogId }\n : {}),\n ...(input.finishReason !== undefined\n ? { finishReason: input.finishReason }\n : {}),\n ...(input.outputMessages !== undefined\n ? { outputMessages: input.outputMessages }\n : {}),\n ...(input.response ? { response: input.response } : {}),\n ...(input.timeToFirstChunkSeconds !== undefined\n ? { timeToFirstChunkSeconds: input.timeToFirstChunkSeconds }\n : {}),\n ...(input.toolCallCount > 0 ? { toolCallCount: input.toolCallCount } : {}),\n ...(input.usage ? { usage: input.usage } : {})\n };\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"pipeThrough\" in value &&\n typeof value.pipeThrough === \"function\" &&\n \"getReader\" in value &&\n typeof value.getReader === \"function\"\n );\n}\n\nfunction isToolCallChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"tool-call\"\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof value[Symbol.asyncIterator] === \"function\"\n );\n}\n","import { aiGatewayLogAttributes, modelCallSpan } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\nimport {\n captureAIGatewayLogFromModel,\n extractAIGatewayLogId\n} from \"../ai-gateway\";\nimport { inputMessageAttributes, outputMessageAttributes } from \"../content\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport type { AISDKWrapLanguageModel } from \"./types\";\n\nexport function wrapModel(\n tracer: AgentTracer,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n model: unknown,\n parentOperation: string,\n storeMessages: boolean,\n boundToInvocation = false\n): unknown {\n if (!wrapLanguageModel) {\n return model;\n }\n\n // Gateway-style string model ids can't take middleware; leave them to the\n // SDK's own resolution (the operation root span still carries the model).\n if (typeof model !== \"object\" || model === null) {\n return model;\n }\n\n const modelInfo = extractModelInfo(model);\n const aiGatewayLog = captureAIGatewayLogFromModel(model, modelInfo?.provider);\n return wrapLanguageModel({\n model: aiGatewayLog.model,\n middleware: {\n wrapGenerate: async ({ doGenerate, params }) => {\n const span = modelCallSpanForModel(\n \"doGenerate\",\n modelInfo,\n params,\n parentOperation,\n storeMessages\n );\n return tracer.withSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const result = await doGenerate();\n modelCall.finish({\n ...finishAttributesFromResult(result, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeResponse: true\n }),\n ...outputMessageAttributes(result, storeMessages)\n });\n return result;\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n throw cause;\n }\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n },\n wrapStream: async ({ doStream, params }) => {\n const span = modelCallSpanForModel(\n \"doStream\",\n modelInfo,\n params,\n parentOperation,\n storeMessages\n );\n // The provider call runs INSIDE the activation callback so its work\n // (fetch subrequests, etc.) nests under the chat span; the span stays\n // caller-owned because the stream outlives the callback.\n return tracer.openSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const startedAtMs = Date.now();\n const result = await doStream();\n return finishWhenStreamCompletes(result, modelCall, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeAIGatewayLog: true,\n includeResponse: true,\n storeMessages,\n startedAtMs\n });\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n modelCall.fail(cause);\n throw cause;\n }\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n }\n }\n });\n}\n\nfunction recordAIGatewayLogOnError(\n span: AgentSpan,\n cause: unknown,\n capturedLogId: string | undefined\n): void {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(extractAIGatewayLogId(cause) ?? capturedLogId)\n );\n}\n\nfunction modelCallSpanForModel(\n operation: string,\n model: ModelInfo | undefined,\n params: unknown,\n parentOperation: string,\n storeMessages: boolean\n): ReturnType<typeof modelCallSpan> {\n const record =\n typeof params === \"object\" && params !== null\n ? (params as Record<string, unknown>)\n : {};\n const span = modelCallSpan({\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(record, parentOperation)\n });\n return {\n ...span,\n attributes: {\n ...span.attributes,\n ...inputMessageAttributes(record, storeMessages)\n }\n };\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { toolApprovalSpan, toolCallSpan } from \"../../genai/telemetry\";\nimport { toolInputAttributes, toolOutputAttributes } from \"../content\";\nimport { readString } from \"../read\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\n\n/** Context snapshot type returned by AsyncLocalStorage.snapshot(). */\ntype ContextSnapshot = <R>(fn: () => R) => R;\n\nexport function wrapTools(\n tracer: AgentTracer,\n tools: unknown,\n storeTools: boolean,\n boundToInvocation = false,\n approvedToolCalls?: Map<string, string>\n): unknown {\n if (typeof tools !== \"object\" || tools === null) {\n return tools;\n }\n\n // SAFETY: AI SDK tools are a record of named tool objects.\n const toolRecord = tools as Record<string, unknown>;\n const wrappedTools: Record<string, unknown> = {};\n for (const [toolName, tool] of Object.entries(toolRecord)) {\n wrappedTools[toolName] = wrapTool(\n tracer,\n toolName,\n tool,\n storeTools,\n boundToInvocation,\n approvedToolCalls\n );\n }\n return wrappedTools;\n}\n\nfunction wrapTool(\n tracer: AgentTracer,\n toolName: string,\n tool: unknown,\n storeTools: boolean,\n boundToInvocation: boolean,\n approvedToolCalls: Map<string, string> | undefined\n): unknown {\n if (typeof tool !== \"object\" || tool === null) {\n return tool;\n }\n\n // SAFETY: AI SDK tool objects have optional execute / needsApproval fields.\n const toolRecord = tool as Record<string, unknown>;\n const hasExecute = typeof toolRecord.execute === \"function\";\n const hasApproval =\n typeof toolRecord.needsApproval === \"boolean\" ||\n typeof toolRecord.needsApproval === \"function\";\n if (!hasExecute && !hasApproval) {\n return tool;\n }\n\n const wrappedTool = Object.assign(\n Object.create(Object.getPrototypeOf(tool)),\n tool\n ) as Record<string, unknown> & {\n execute: (...args: readonly unknown[]) => unknown;\n };\n if (hasApproval) {\n wrapApprovalCheck(\n tracer,\n wrappedTool,\n toolRecord,\n tool,\n toolName,\n boundToInvocation\n );\n }\n if (!hasExecute) {\n return wrappedTool;\n }\n\n const execute = toolRecord.execute;\n if (typeof execute !== \"function\") {\n return wrappedTool;\n }\n const originalExecute = execute.bind(tool) as (\n ...args: readonly unknown[]\n ) => unknown;\n\n wrappedTool.execute = (...args) => {\n const span = toolCallSpan({\n operation: \"tool.execute\",\n toolCallId: extractToolCallId(args[1]),\n toolName\n });\n const attributes = {\n ...span.attributes,\n ...toolInputAttributes(args[0], storeTools)\n };\n // The span may outlive this call frame (streaming tools yield after\n // returning), so the wrapper owns the span lifetime via openSpan.\n return tracer.openSpan(\n span.name,\n attributes,\n (toolSpan) => {\n // Captured inside the activation so generator bodies (which resume at\n // the consumer's next() call sites) can be re-entered into the tool\n // span's async context.\n const inSpanContext = AsyncLocalStorage.snapshot() as ContextSnapshot;\n const toolCallId = extractToolCallId(args[1]);\n const approval = approvalResponseForOptions(args[1], toolCallId);\n if (\n approval?.approved === true ||\n (toolCallId !== undefined &&\n approvedToolCalls?.get(toolCallId) === toolName)\n ) {\n recordApprovalChild(\n tracer,\n toolName,\n toolCallId,\n \"approved\",\n boundToInvocation\n );\n if (toolCallId !== undefined) approvedToolCalls?.delete(toolCallId);\n }\n const result = originalExecute(...args);\n\n if (isPromiseLike(result)) {\n return Promise.resolve(result).then(\n (resolved) =>\n settleToolResult(resolved, toolSpan, inSpanContext, storeTools),\n (cause: unknown) => {\n toolSpan.fail(cause);\n throw cause;\n }\n );\n }\n\n return settleToolResult(result, toolSpan, inSpanContext, storeTools);\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n\n return wrappedTool;\n}\n\nfunction wrapApprovalCheck(\n tracer: AgentTracer,\n wrappedTool: Record<string, unknown>,\n toolRecord: Record<string, unknown>,\n tool: object,\n toolName: string,\n boundToInvocation: boolean\n): void {\n const approval = toolRecord.needsApproval;\n const original =\n typeof approval === \"function\"\n ? (approval.bind(tool) as (...args: readonly unknown[]) => unknown)\n : undefined;\n\n wrappedTool.needsApproval = (...args: readonly unknown[]) => {\n const result = original ? original(...args) : approval;\n const recordRequested = (needed: unknown): unknown => {\n const toolCallId = extractToolCallId(args[1]);\n if (needed === true && !hasApprovalResponse(args[1], toolCallId)) {\n recordApprovalSegment(\n tracer,\n toolName,\n toolCallId,\n \"requested\",\n boundToInvocation\n );\n }\n return needed;\n };\n\n return isPromiseLike(result)\n ? Promise.resolve(result).then(recordRequested)\n : recordRequested(result);\n };\n}\n\n/** Instruments AI SDK v7's top-level tool approval policy. */\nexport function wrapToolApprovalPolicy(\n tracer: AgentTracer,\n policy: unknown,\n approvedToolCalls: Map<string, string>,\n boundToInvocation = false\n): unknown {\n if (typeof policy === \"function\") {\n return (...args: readonly unknown[]) => {\n const options = recordValue(args[0]);\n const toolCall = recordValue(options?.toolCall);\n return observePolicyResult(\n policy(...args),\n readString(toolCall?.toolName) ?? \"tool\",\n readString(toolCall?.toolCallId),\n tracer,\n approvedToolCalls,\n boundToInvocation\n );\n };\n }\n if (typeof policy !== \"object\" || policy === null) return policy;\n\n return Object.fromEntries(\n Object.entries(policy as Record<string, unknown>).map(\n ([toolName, setting]) => [\n toolName,\n (...args: readonly unknown[]) =>\n observePolicyResult(\n typeof setting === \"function\" ? setting(...args) : setting,\n toolName,\n extractToolCallId(args[1]),\n tracer,\n approvedToolCalls,\n boundToInvocation\n )\n ]\n )\n );\n}\n\nfunction observePolicyResult(\n result: unknown,\n toolName: string,\n toolCallId: string | undefined,\n tracer: AgentTracer,\n approvedToolCalls: Map<string, string>,\n boundToInvocation = false\n): unknown {\n const observe = (status: unknown): unknown => {\n if (toolCallId === undefined) return status;\n const type =\n typeof status === \"string\"\n ? status\n : readString(recordValue(status)?.type);\n if (type === \"approved\") {\n approvedToolCalls.set(toolCallId, toolName);\n } else if (type === \"user-approval\" || type === \"denied\") {\n recordApprovalSegment(\n tracer,\n toolName,\n toolCallId,\n type === \"denied\" ? \"denied\" : \"requested\",\n boundToInvocation\n );\n }\n return status;\n };\n return isPromiseLike(result)\n ? Promise.resolve(result).then(observe)\n : observe(result);\n}\n\n/** Records denied responses, whose tool never reaches execute(). */\nexport function recordDeniedApprovalResponses(\n tracer: AgentTracer,\n messages: unknown\n): void {\n for (const response of approvalResponses(messages)) {\n if (!response.approved) {\n recordApprovalSegment(\n tracer,\n response.toolName,\n response.toolCallId,\n \"denied\"\n );\n }\n }\n}\n\nfunction recordApprovalSegment(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\",\n boundToInvocation = false\n): void {\n const tool = toolCallSpan({\n operation: \"tool.approval\",\n toolCallId,\n toolName\n });\n tracer.withSpan(\n tool.name,\n tool.attributes,\n () => {\n recordApprovalChild(\n tracer,\n toolName,\n toolCallId,\n state,\n boundToInvocation\n );\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n}\n\nfunction recordApprovalChild(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\",\n boundToInvocation = false\n): void {\n const approval = toolApprovalSpan({ state, toolCallId, toolName });\n tracer.withSpan(\n approval.name,\n approval.attributes,\n () => undefined,\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n}\n\nfunction hasApprovalResponse(\n options: unknown,\n toolCallId: string | undefined\n): boolean {\n return approvalResponseForOptions(options, toolCallId) !== undefined;\n}\n\nfunction approvalResponseForOptions(\n options: unknown,\n toolCallId: string | undefined\n): ReturnType<typeof approvalResponses>[number] | undefined {\n if (\n toolCallId === undefined ||\n typeof options !== \"object\" ||\n options === null\n ) {\n return undefined;\n }\n return approvalResponses((options as Record<string, unknown>).messages).find(\n (response) => response.toolCallId === toolCallId\n );\n}\n\nfunction approvalResponses(messagesValue: unknown): Array<{\n readonly approved: boolean;\n readonly toolCallId: string;\n readonly toolName: string;\n}> {\n if (!Array.isArray(messagesValue)) {\n return [];\n }\n\n const approvalToTool = new Map<string, string>();\n const toolNames = new Map<string, string>();\n for (const message of messagesValue) {\n if (typeof message !== \"object\" || message === null) continue;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n const type = readString(record.type);\n if (type === \"tool-call\") {\n const toolCallId = readString(record.toolCallId);\n const toolName = readString(record.toolName);\n if (toolCallId && toolName) toolNames.set(toolCallId, toolName);\n } else if (type === \"tool-approval-request\") {\n const approvalId = readString(record.approvalId);\n const toolCallId = readString(record.toolCallId);\n if (approvalId && toolCallId)\n approvalToTool.set(approvalId, toolCallId);\n }\n }\n }\n\n const lastMessage = messagesValue.at(-1);\n const lastContent =\n typeof lastMessage === \"object\" && lastMessage !== null\n ? (lastMessage as Record<string, unknown>).content\n : undefined;\n const decisions: Array<{\n readonly approvalId: string;\n readonly approved: boolean;\n }> = [];\n if (Array.isArray(lastContent)) {\n for (const part of lastContent) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n if (record.type !== \"tool-approval-response\") continue;\n const approvalId = readString(record.approvalId);\n if (approvalId && typeof record.approved === \"boolean\") {\n decisions.push({ approvalId, approved: record.approved });\n }\n }\n }\n\n return decisions.flatMap(({ approvalId, approved }) => {\n const toolCallId = approvalToTool.get(approvalId);\n if (!toolCallId) return [];\n return [\n {\n approved,\n toolCallId,\n toolName: toolNames.get(toolCallId) ?? \"tool\"\n }\n ];\n });\n}\n\n/**\n * Finishes the tool span for a settled result. Streaming tools (async\n * generators) return an iterable whose consumption is the tool's real\n * duration, so the span closes when iteration ends instead of at creation.\n */\nfunction settleToolResult(\n result: unknown,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): unknown {\n if (isAsyncIterable(result)) {\n return finishWhenIterableCompletes(result, span, inSpanContext, storeTools);\n }\n\n span.finish(toolOutputAttributes(result, storeTools));\n return result;\n}\n\nfunction finishWhenIterableCompletes(\n iterable: AsyncIterable<unknown>,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n // Each pull re-enters the tool span's captured async context, so the\n // generator body (which otherwise resumes under the CONSUMER's context)\n // runs — and creates any nested spans — under the tool span.\n const iterator = inSpanContext(() => iterable[Symbol.asyncIterator]());\n let exhausted = false;\n let returnValue: unknown;\n try {\n while (true) {\n const step = await inSpanContext(() => iterator.next());\n if (step.done) {\n exhausted = true;\n returnValue = step.value;\n return step.value;\n }\n yield step.value;\n }\n } catch (cause: unknown) {\n span.fail(cause);\n throw cause;\n } finally {\n if (!exhausted) {\n // Early consumer termination (break/cancel while suspended at\n // yield): forward return() so the tool generator's own finally\n // blocks run, still inside the tool span's context. A no-op when\n // the underlying iterator already settled (e.g. next() threw).\n try {\n await inSpanContext(() => iterator.return?.(undefined));\n } catch {\n // Cleanup failures must not mask the consumer's exit reason.\n }\n }\n // Covers normal completion and early consumer return; a no-op after\n // fail() since span closure is idempotent.\n span.finish(toolOutputAttributes(returnValue, storeTools));\n }\n }\n };\n}\n\n/** Reads the AI SDK tool-call id from the execute options argument. */\nfunction extractToolCallId(options: unknown): string | undefined {\n if (typeof options !== \"object\" || options === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK tool execute options carry a toolCallId string field.\n return readString((options as Record<string, unknown>).toolCallId);\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof (value as Record<PropertyKey, unknown>)[Symbol.asyncIterator] ===\n \"function\"\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n value !== null &&\n value !== undefined &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n","import { __DO_NOT_USE_WILL_BREAK__agentContext as agentContext } from \"../../../internal_context\";\nimport type {\n AISDKInstrumentationOptions,\n ResolvedAISDKStorageOptions\n} from \"../options\";\nimport { readString } from \"../read\";\nimport { TraceAttribute } from \"../../genai/attributes\";\nimport {\n metadataAttributes,\n operationSpan,\n operationSpanName\n} from \"../../genai/telemetry\";\nimport type { SemanticContext } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport type { AgentTracer } from \"../../tracing/tracer\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { wrapModel } from \"./model\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport {\n recordDeniedApprovalResponses,\n wrapToolApprovalPolicy,\n wrapTools\n} from \"./tools\";\nimport type {\n AISDKCallParams,\n AISDKOperation,\n AISDKWrapLanguageModel\n} from \"./types\";\n\ntype AISDKOperationName =\n | \"generateObject\"\n | \"generateText\"\n | \"streamObject\"\n | \"streamText\";\n\nexport type { AISDKNamespace } from \"./types\";\n\n/** Tracing configuration for the AI SDK compatibility wrapper. */\nexport type AISDKWrapperInstrumentation = {\n readonly options?: AISDKInstrumentationOptions;\n readonly tracer: AgentTracer;\n};\n\n/**\n * Wraps an AI SDK namespace object with tracing while preserving its public\n * shape and overloaded call signatures across supported majors.\n */\nexport function createAISDKWrapper<T extends Record<string, unknown>>(\n ai: T,\n instrumentation: AISDKWrapperInstrumentation\n): T {\n const target = isModuleNamespace(ai) ? Object.setPrototypeOf({}, ai) : ai;\n // Cache wrappers so repeated property reads return the same function\n // (memoization patterns like `wrapped.streamText === wrapped.streamText`).\n const wrapperCache = new Map<PropertyKey, AISDKOperation>();\n\n return new Proxy(target, {\n get(proxyTarget, property, receiver) {\n const original = Reflect.get(proxyTarget, property, receiver) as unknown;\n\n if (isWrappedOperationName(property) && typeof original === \"function\") {\n let wrapper = wrapperCache.get(property);\n if (!wrapper) {\n wrapper = createOperationWrapper(\n property,\n toAISDKOperation(original),\n readWrapLanguageModel(ai),\n instrumentation\n );\n wrapperCache.set(property, wrapper);\n }\n return wrapper;\n }\n\n return original;\n }\n }) as T;\n}\n\nfunction readWrapLanguageModel(\n ai: Record<string, unknown>\n): AISDKWrapLanguageModel | undefined {\n const value = ai.wrapLanguageModel;\n if (typeof value !== \"function\") {\n return undefined;\n }\n\n // SAFETY: This is a vendored structural contract shared by the supported AI\n // SDK majors; the public wrapper preserves the caller's installed SDK type.\n return value as AISDKWrapLanguageModel;\n}\n\nfunction toAISDKOperation(value: unknown): AISDKOperation {\n // SAFETY: The proxy only calls this after selecting known AI SDK operation\n // export names. The wrapper uses the narrow params fields it reads/replaces.\n return value as AISDKOperation;\n}\n\nfunction isModuleNamespace(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n if (value.constructor?.name === \"Module\") {\n return true;\n }\n\n try {\n const keys = Object.keys(value);\n const firstKey = keys[0];\n if (firstKey === undefined) {\n return false;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(value, firstKey);\n return descriptor\n ? !descriptor.configurable && !descriptor.writable\n : false;\n } catch {\n return false;\n }\n}\n\nfunction createOperationWrapper(\n operationName: AISDKOperationName,\n operation: AISDKOperation,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n instrumentation: AISDKWrapperInstrumentation\n): AISDKOperation {\n const storage: ResolvedAISDKStorageOptions = {\n storeMessages: instrumentation.options?.storeMessages === true,\n storeTools: instrumentation.options?.storeTools === true\n };\n\n // Only the span NAME is computed before the sampling check (it is required\n // to open a span at all, and needs a single metadata property the SDK reads\n // anyway). The full attribute spec — metadata enumeration, request fields,\n // context allowlists — is computed lazily, after isTraced confirms someone\n // is listening, so untraced calls never touch caller getters beyond that.\n if (isStreamOperation(operationName)) {\n return (params, ...args) => {\n const boundToInvocation = isAISDKInvocationBounded(params);\n return instrumentation.tracer.openSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n (operationSpan) => {\n // Untraced invocations take the pristine path: original params, no\n // tool wrapping, no model middleware, no stream patching.\n if (!operationSpan.isTraced) {\n operationSpan.finish();\n return operation(params, ...args);\n }\n\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(\n instrumentation.tracer,\n params.messages\n );\n\n const startedAtMs = Date.now();\n const result = operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage,\n boundToInvocation\n ),\n ...args\n );\n const hasModelSpan = canWrapModel(wrapLanguageModel, params.model);\n\n return finishWhenStreamCompletes(result, operationSpan, {\n includeResponse: !hasModelSpan,\n startedAtMs: hasModelSpan ? undefined : startedAtMs\n });\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n }\n\n return async (params, ...args) => {\n const boundToInvocation = isAISDKInvocationBounded(params);\n return instrumentation.tracer.withSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n async (operationSpan) => {\n if (!operationSpan.isTraced) {\n return operation(params, ...args);\n }\n\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(instrumentation.tracer, params.messages);\n\n const result = await operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage,\n boundToInvocation\n ),\n ...args\n );\n\n operationSpan.finish(\n finishAttributesFromResult(result, {\n includeResponse: !canWrapModel(wrapLanguageModel, params.model)\n })\n );\n return result;\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n}\n\n/**\n * Reads only the agent name for the span name, from the same sources and in\n * the same order as {@link semanticContext}, so the span name and\n * `gen_ai.agent.name` never disagree. `functionId` is the AI SDK's canonical\n * projection; an explicit name from v6 metadata or v7 runtime context wins.\n */\nfunction agentNameForCall(params: AISDKCallParams): string | undefined {\n const telemetry = telemetryOptions(params);\n const metadata = telemetryMetadata(params);\n const runtimeContext = runtimeContextRecord(params);\n\n return (\n metadataValue(metadata, \"agentName\", \"gen_ai.agent.name\") ??\n metadataValue(runtimeContext, \"agentName\", \"gen_ai.agent.name\") ??\n readString(telemetry?.functionId)\n );\n}\n\nfunction operationParamsForCall(\n params: AISDKCallParams,\n operationName: AISDKOperationName,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n tracer: AgentTracer,\n storage: ResolvedAISDKStorageOptions,\n boundToInvocation = false\n): AISDKCallParams {\n const approvedToolCalls = new Map<string, string>();\n return {\n ...params,\n ...(shouldWrapTools(operationName) && params.tools !== undefined\n ? {\n tools: wrapTools(\n tracer,\n params.tools,\n storage.storeTools,\n boundToInvocation,\n approvedToolCalls\n )\n }\n : {}),\n ...(params.toolApproval !== undefined\n ? {\n toolApproval: wrapToolApprovalPolicy(\n tracer,\n params.toolApproval,\n approvedToolCalls,\n boundToInvocation\n )\n }\n : {}),\n ...(params.model !== undefined\n ? {\n model: wrapModel(\n tracer,\n wrapLanguageModel,\n params.model,\n operationName,\n storage.storeMessages,\n boundToInvocation\n )\n }\n : {})\n };\n}\n\nfunction canWrapModel(\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n model: unknown\n): boolean {\n return (\n wrapLanguageModel !== undefined &&\n typeof model === \"object\" &&\n model !== null\n );\n}\n\nfunction isStreamOperation(operationName: AISDKOperationName): boolean {\n return operationName === \"streamObject\" || operationName === \"streamText\";\n}\n\nfunction shouldWrapTools(operationName: AISDKOperationName): boolean {\n return operationName === \"generateText\" || operationName === \"streamText\";\n}\n\nfunction isWrappedOperationName(\n value: PropertyKey\n): value is AISDKOperationName {\n return (\n value === \"generateObject\" ||\n value === \"generateText\" ||\n value === \"streamObject\" ||\n value === \"streamText\"\n );\n}\n\nfunction operationSpanForCall(\n operation: string,\n model: ModelInfo | undefined,\n params: AISDKCallParams,\n options: AISDKInstrumentationOptions | undefined\n): ReturnType<typeof operationSpan> {\n return operationSpan({\n attributes: {\n ...metadataAttributes(\n includedRuntimeContext(params),\n TraceAttribute.Cloudflare.RuntimeContextPrefix\n ),\n ...metadataAttributes(telemetryMetadata(params)),\n ...contextAttributes(params, options)\n },\n context: semanticContext(params),\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(params, operation)\n });\n}\n\n/** Reads the per-call `experimental_telemetry.metadata` record, if present. */\nfunction telemetryMetadata(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const telemetry = telemetryOptions(params);\n\n return typeof telemetry?.metadata === \"object\" && telemetry.metadata !== null\n ? (telemetry.metadata as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * The caller's application-data channel: `runtimeContext` on v7, the\n * `experimental_context` it replaced on v6. Read through one accessor so the\n * two majors cannot drift on which one identity and metadata come from.\n */\nfunction runtimeContextRecord(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const value = params.runtimeContext ?? params.experimental_context;\n\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction telemetryOptions(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const telemetryValue = params.telemetry ?? params.experimental_telemetry;\n\n return typeof telemetryValue === \"object\" && telemetryValue !== null\n ? (telemetryValue as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * The v7 stand-in for `experimental_telemetry.metadata`.\n *\n * v7 dropped `metadata` from its telemetry options; callers put the same\n * values in `runtimeContext` and mark the telemetry-visible ones through the\n * SDK's own `telemetry.includeRuntimeContext`. Running the included subset\n * through {@link metadataAttributes} is what keeps reserved keys — Think's\n * `cloudflare.agents.turn.*` above all — on the attribute names v6 emits, so\n * a query written against v6 traces still matches v7 ones. Everything else\n * passes through as documented, under `cloudflare.agents.runtime_context.*`.\n *\n * Runtime context the caller did not mark as included stays off the span as a\n * passthrough attribute: on v7 this is a general application-data channel, not\n * a telemetry bag. Identity (`agentId`, `agentName`, `agentVersion`,\n * `conversationId`) is separate — {@link semanticContext} reads it regardless,\n * because it names the operation rather than describing it, and v7 left\n * callers nowhere else to put it.\n */\nfunction includedRuntimeContext(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const runtimeContext = runtimeContextRecord(params);\n if (runtimeContext === undefined) {\n return undefined;\n }\n\n const included = includedContextKeys(telemetryOptions(params));\n if (included === undefined) {\n return undefined;\n }\n\n const projected: Record<string, unknown> = {};\n for (const key of included) {\n if (Object.hasOwn(runtimeContext, key)) {\n projected[key] = runtimeContext[key];\n }\n }\n\n return projected;\n}\n\n/**\n * The keys a caller marked as telemetry-visible.\n *\n * The SDK's own shape is `{ [key]: boolean }`, included only when explicitly\n * true; a plain array of key names is accepted too, since that is the shape of\n * the wrapper's option of the same name and silently ignoring it would be\n * worse than honouring it. There is deliberately no \"include everything\"\n * shorthand — runtime context routinely carries credentials and user data that\n * no one asked to put on a span.\n */\nfunction includedContextKeys(\n telemetry: Record<string, unknown> | undefined\n): string[] | undefined {\n const included = telemetry?.includeRuntimeContext;\n if (Array.isArray(included)) {\n return included.filter((key): key is string => typeof key === \"string\");\n }\n if (typeof included !== \"object\" || included === null) {\n return undefined;\n }\n\n return Object.entries(included as Record<string, unknown>)\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n}\n\n/**\n * Whether the caller explicitly opted a key OUT. Identity is read from runtime\n * context without an opt-in — on v7 there is nowhere else to put it, and\n * requiring one would silently cost every caller `gen_ai.agent.id` — but an\n * explicit `false` is a stated intention and is honoured.\n */\nfunction isExcludedFromContext(params: AISDKCallParams, key: string): boolean {\n const included = telemetryOptions(params)?.includeRuntimeContext;\n\n return (\n typeof included === \"object\" &&\n included !== null &&\n !Array.isArray(included) &&\n (included as Record<string, unknown>)[key] === false\n );\n}\n\n/**\n * Reads agent/conversation semantic context from the AI SDK's own telemetry\n * fields. The AI SDK maps `functionId` to `gen_ai.agent.name`; an explicit\n * name takes priority. Each field comes from v6 `telemetry.metadata` or, on\n * v7 where that option no longer exists, from `runtimeContext`.\n */\nfunction semanticContext(params: AISDKCallParams): SemanticContext {\n const telemetry = telemetryOptions(params);\n const metadata = telemetryMetadata(params);\n const runtimeContext = runtimeContextRecord(params);\n\n const fromContext = (key: string, semanticKey: string) =>\n isExcludedFromContext(params, key)\n ? undefined\n : metadataValue(runtimeContext, key, semanticKey);\n\n return {\n agentId:\n metadataValue(metadata, \"agentId\", \"gen_ai.agent.id\") ??\n fromContext(\"agentId\", \"gen_ai.agent.id\"),\n agentName:\n metadataValue(metadata, \"agentName\", \"gen_ai.agent.name\") ??\n fromContext(\"agentName\", \"gen_ai.agent.name\") ??\n readString(telemetry?.functionId),\n agentVersion:\n metadataValue(metadata, \"agentVersion\", \"gen_ai.agent.version\") ??\n fromContext(\"agentVersion\", \"gen_ai.agent.version\"),\n conversationId:\n metadataValue(metadata, \"conversationId\", \"gen_ai.conversation.id\") ??\n fromContext(\"conversationId\", \"gen_ai.conversation.id\")\n };\n}\n\nfunction metadataValue(\n metadata: Record<string, unknown> | undefined,\n key: string,\n semanticKey: string\n): string | undefined {\n return readString(metadata?.[key] ?? metadata?.[semanticKey]);\n}\n\n/**\n * The wrapper-level allowlist, set once for the instrumentation rather than\n * per call. It selects from the same context and lands on the same attributes\n * as the SDK's per-call allowlist: selecting a key through both must produce\n * one attribute, not a canonical one and a `runtime_context.*` near-duplicate.\n */\nfunction contextAttributes(\n params: AISDKCallParams,\n options: AISDKInstrumentationOptions | undefined\n): TraceAttributes | undefined {\n const included = options?.includeRuntimeContext;\n if (included === undefined || included.length === 0) {\n return undefined;\n }\n\n const runtimeContext = runtimeContextRecord(params);\n if (runtimeContext === undefined) {\n return undefined;\n }\n\n const projected: Record<string, unknown> = {};\n for (const key of included) {\n if (Object.hasOwn(runtimeContext, key)) {\n projected[key] = runtimeContext[key];\n }\n }\n\n return metadataAttributes(\n projected,\n TraceAttribute.Cloudflare.RuntimeContextPrefix\n );\n}\n\nconst invocationBounded = Symbol.for(\n \"cloudflare.agents.ai-sdk.invocation-bounded\"\n);\n\nfunction isAISDKInvocationBounded(params: AISDKCallParams): boolean {\n return (\n (params as Record<PropertyKey, unknown>)[invocationBounded] === true ||\n agentContext.getStore()?.connection !== undefined\n );\n}\n","import type { AISDKInstrumentationOptions } from \"./options\";\nimport { createAISDKWrapper } from \"./wrapper/wrap\";\nimport { tracer } from \"../tracing/cloudflare\";\n\n/**\n * Wraps an AI SDK namespace with tracing.\n */\nexport function wrapAISDK<T extends Record<string, unknown>>(\n ai: T,\n options: AISDKInstrumentationOptions = {}\n): T {\n return createAISDKWrapper(ai, {\n options,\n tracer\n });\n}\n\nexport type {\n AISDKInstrumentationOptions,\n AISDKStorageOptions\n} from \"./options\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["record","isAsyncIterable","agentContext"],"sources":["../../../src/observability/ai/read.ts","../../../src/observability/genai/attributes.ts","../../../src/observability/genai/telemetry.ts","../../../src/observability/ai/wrapper/extract.ts","../../../src/observability/ai/ai-gateway.ts","../../../src/observability/ai/content.ts","../../../src/observability/ai/wrapper/streams.ts","../../../src/observability/ai/wrapper/model.ts","../../../src/observability/ai/wrapper/tools.ts","../../../src/observability/ai/wrapper/wrap.ts","../../../src/observability/ai/index.ts"],"sourcesContent":["/** Narrows an unknown value to a string. */\nexport function readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/** Narrows an unknown value to a number. */\nexport function readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\n/** AI SDK token counts are either a plain number or `{ total?: number, ... }`. */\nexport function readTokenCount(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value === \"object\" && value !== null) {\n // SAFETY: AI SDK nested token count has a numeric total field.\n const total = (value as Record<string, unknown>).total;\n return typeof total === \"number\" ? total : undefined;\n }\n\n return undefined;\n}\n\n/** Reads a numeric sub-field from a nested AI SDK token count object. */\nexport function readNestedTokenField(\n value: unknown,\n key: string\n): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK nested token count has known numeric sub-fields.\n const nested = (value as Record<string, unknown>)[key];\n return typeof nested === \"number\" ? nested : undefined;\n}\n","/**\n * Local trace attribute keys used by the Cloudflare GenAI projection.\n *\n * `gen_ai.*` keys follow OpenTelemetry GenAI semantic conventions where they\n * exist (Development status — tracked so spec churn stays an internal edit;\n * none of these constants are exported from the package). Keys with no\n * semconv home live under the `cloudflare.agents.*` vendor namespace — never\n * bare top-level keys, never `ai.*` (the Vercel AI SDK's de-facto namespace).\n */\nexport const TraceAttribute = {\n Cloudflare: {\n AIGatewayLogID: \"cloudflare.ai_gateway.log.id\",\n IntegrationName: \"cloudflare.agents.integration.name\",\n MetadataPrefix: \"cloudflare.agents.metadata.\",\n OperationName: \"cloudflare.agents.operation.name\",\n ResponseFinishReason: \"cloudflare.agents.response.finish_reason\",\n RuntimeContextPrefix: \"cloudflare.agents.runtime_context.\",\n ToolApprovalState: \"cloudflare.agents.tool.approval.state\",\n ToolCount: \"cloudflare.agents.tool.count\",\n TurnAdmission: \"cloudflare.agents.turn.admission\",\n TurnChannel: \"cloudflare.agents.turn.channel\",\n TurnContinuation: \"cloudflare.agents.turn.continuation\",\n TurnGeneration: \"cloudflare.agents.turn.generation\",\n TurnRequestID: \"cloudflare.agents.turn.request_id\",\n TurnTrigger: \"cloudflare.agents.turn.trigger\",\n UsageTotalTokens: \"cloudflare.agents.usage.total_tokens\"\n },\n General: {\n UserID: \"user.id\"\n },\n GenAI: {\n AgentID: \"gen_ai.agent.id\",\n AgentName: \"gen_ai.agent.name\",\n AgentVersion: \"gen_ai.agent.version\",\n ConversationID: \"gen_ai.conversation.id\",\n InputMessages: \"gen_ai.input.messages\",\n OperationName: \"gen_ai.operation.name\",\n OperationNameValueChat: \"chat\",\n OperationNameValueExecuteTool: \"execute_tool\",\n OperationNameValueInvokeAgent: \"invoke_agent\",\n OutputMessages: \"gen_ai.output.messages\",\n OutputType: \"gen_ai.output.type\",\n ProviderName: \"gen_ai.provider.name\",\n RequestFrequencyPenalty: \"gen_ai.request.frequency_penalty\",\n RequestMaxTokens: \"gen_ai.request.max_tokens\",\n RequestModel: \"gen_ai.request.model\",\n RequestPresencePenalty: \"gen_ai.request.presence_penalty\",\n RequestSeed: \"gen_ai.request.seed\",\n RequestStream: \"gen_ai.request.stream\",\n RequestTemperature: \"gen_ai.request.temperature\",\n RequestTopK: \"gen_ai.request.top_k\",\n RequestTopP: \"gen_ai.request.top_p\",\n ResponseID: \"gen_ai.response.id\",\n ResponseModel: \"gen_ai.response.model\",\n ResponseTimeToFirstChunk: \"gen_ai.response.time_to_first_chunk\",\n ToolCallArguments: \"gen_ai.tool.call.arguments\",\n ToolCallID: \"gen_ai.tool.call.id\",\n ToolCallResult: \"gen_ai.tool.call.result\",\n ToolName: \"gen_ai.tool.name\",\n ToolType: \"gen_ai.tool.type\",\n UsageCacheCreationInputTokens: \"gen_ai.usage.cache_creation.input_tokens\",\n UsageCacheReadInputTokens: \"gen_ai.usage.cache_read.input_tokens\",\n UsageInputTokens: \"gen_ai.usage.input_tokens\",\n UsageOutputTokens: \"gen_ai.usage.output_tokens\",\n UsageReasoningOutputTokens: \"gen_ai.usage.reasoning.output_tokens\"\n }\n} as const;\n","import { TraceAttribute } from \"./attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n/** Canonical token usage shape used by model adapters. */\nexport type TokenUsageSummary = {\n readonly cacheCreationInputTokens?: number | undefined;\n readonly cacheReadInputTokens?: number | undefined;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly reasoningTokens?: number | undefined;\n readonly totalTokens?: number | undefined;\n};\n\n/** Safe request settings that map to scalar GenAI semantic attributes. */\nexport type RequestSummary = {\n readonly frequencyPenalty?: number | undefined;\n readonly maxTokens?: number | undefined;\n readonly outputType?: string | undefined;\n readonly presencePenalty?: number | undefined;\n readonly seed?: number | undefined;\n readonly stream?: boolean | undefined;\n readonly temperature?: number | undefined;\n readonly topK?: number | undefined;\n readonly topP?: number | undefined;\n};\n\n/** Safe response metadata that maps to scalar GenAI semantic attributes. */\nexport type ResponseSummary = {\n readonly id?: string | undefined;\n readonly model?: string | undefined;\n};\n\n/** Safe agent/conversation metadata provided explicitly by callers. */\nexport type SemanticContext = {\n readonly agentId?: string | undefined;\n readonly agentName?: string | undefined;\n readonly agentVersion?: string | undefined;\n readonly conversationId?: string | undefined;\n};\n\n/** Name and initial attributes for a model-operation span. */\nexport type SpanSpec = {\n readonly attributes: TraceAttributes;\n readonly name: string;\n};\n\n/**\n * Builds a semconv-formula span name (`\"{operation} {target}\"`), falling back\n * to the bare operation when the target is unavailable or the combined name\n * exceeds the Workers Observability 64 UTF-8-byte budget. The full target\n * remains available as an attribute; the stable query key is always\n * `gen_ai.operation.name`, never the span name.\n */\nfunction spanName(operation: string, target: string | undefined): string {\n if (!target) {\n return operation;\n }\n\n const name = `${operation} ${target}`;\n return new TextEncoder().encode(name).length <= 64 ? name : operation;\n}\n\n/**\n * Normalizes an AI SDK provider identifier to the semconv\n * `gen_ai.provider.name` enum where a member exists: sub-provider suffixes\n * are stripped (`anthropic.messages` → `anthropic`) and known aliases mapped.\n * Unknown providers pass through verbatim (semconv sanctions custom values).\n */\nfunction normalizeProviderName(\n provider: string | undefined\n): string | undefined {\n if (provider === undefined) {\n return undefined;\n }\n\n const lower = provider.toLowerCase();\n const mappings: ReadonlyArray<readonly [prefix: string, value: string]> = [\n [\"google.vertex\", \"gcp.vertex_ai\"],\n [\"google.generative-ai\", \"gcp.gemini\"],\n [\"google-vertex\", \"gcp.vertex_ai\"],\n [\"amazon-bedrock\", \"aws.bedrock\"],\n [\"azure-openai\", \"azure.ai.openai\"],\n [\"anthropic\", \"anthropic\"],\n [\"openai\", \"openai\"],\n [\"azure\", \"azure.ai.inference\"],\n [\"google\", \"gcp.gemini\"],\n [\"mistral\", \"mistral_ai\"],\n [\"cohere\", \"cohere\"],\n [\"bedrock\", \"aws.bedrock\"],\n [\"groq\", \"groq\"],\n [\"deepseek\", \"deepseek\"],\n [\"perplexity\", \"perplexity\"],\n [\"xai\", \"x_ai\"]\n ];\n\n for (const [prefix, value] of mappings) {\n if (\n lower === prefix ||\n lower.startsWith(`${prefix}.`) ||\n lower.startsWith(`${prefix}-`)\n ) {\n return value;\n }\n }\n\n return provider;\n}\n\n/**\n * Reserved telemetry-metadata keys that map to dedicated attributes on the\n * operation root span. Everything else scalar passes through under\n * `cloudflare.agents.metadata.{key}`; identity keys are consumed by\n * SemanticContext extraction and never passed through.\n */\nconst RESERVED_METADATA_ATTRIBUTES: Readonly<Record<string, string>> = {\n [TraceAttribute.Cloudflare.TurnAdmission]:\n TraceAttribute.Cloudflare.TurnAdmission,\n [TraceAttribute.Cloudflare.TurnChannel]:\n TraceAttribute.Cloudflare.TurnChannel,\n [TraceAttribute.Cloudflare.TurnContinuation]:\n TraceAttribute.Cloudflare.TurnContinuation,\n [TraceAttribute.Cloudflare.TurnGeneration]:\n TraceAttribute.Cloudflare.TurnGeneration,\n [TraceAttribute.Cloudflare.TurnRequestID]:\n TraceAttribute.Cloudflare.TurnRequestID,\n [TraceAttribute.Cloudflare.TurnTrigger]:\n TraceAttribute.Cloudflare.TurnTrigger,\n [TraceAttribute.General.UserID]: TraceAttribute.General.UserID\n};\n\nconst CONSUMED_METADATA_KEYS = new Set([\n \"agentId\",\n \"agentName\",\n \"agentVersion\",\n \"conversationId\",\n \"gen_ai.agent.id\",\n \"gen_ai.agent.name\",\n \"gen_ai.agent.version\",\n \"gen_ai.conversation.id\"\n]);\n\n/**\n * Projects a per-call telemetry record onto root span attributes: reserved\n * keys map to their dedicated attributes, any other SCALAR entry passes\n * through under `passthroughPrefix`, and object/array values are dropped\n * (scalar-only attribute rule).\n *\n * v6 passes `experimental_telemetry.metadata` and keeps the default prefix;\n * v7 has no metadata option and passes the included subset of `runtimeContext`\n * under its own prefix. Reserved keys land on the same attribute either way,\n * so turn identity does not move namespace between SDK majors.\n */\nexport function metadataAttributes(\n metadata: Record<string, unknown> | undefined,\n passthroughPrefix: string = TraceAttribute.Cloudflare.MetadataPrefix\n): TraceAttributes {\n if (metadata === undefined) {\n return {};\n }\n\n const attributes: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (CONSUMED_METADATA_KEYS.has(key)) {\n continue;\n }\n if (\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n continue;\n }\n\n const reserved = Object.hasOwn(RESERVED_METADATA_ATTRIBUTES, key)\n ? RESERVED_METADATA_ATTRIBUTES[key]\n : undefined;\n attributes[reserved ?? `${passthroughPrefix}${key}`] = value;\n }\n\n return attributes;\n}\n\n/**\n * Cheap root-span name for an agent operation: needs only the agent name (the\n * one value instrumentation may read before the sampling check), never the\n * full attribute spec.\n */\nexport function operationSpanName(agentName: string | undefined): string {\n return spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n agentName\n );\n}\n\nfunction semanticContextAttributes(\n context: SemanticContext | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.AgentID]: context?.agentId,\n [TraceAttribute.GenAI.AgentName]: context?.agentName,\n [TraceAttribute.GenAI.AgentVersion]: context?.agentVersion,\n [TraceAttribute.GenAI.ConversationID]: context?.conversationId\n };\n}\n\n/** Builds the root span for an SDK operation such as generateText or streamText. */\nexport function operationSpan(input: {\n readonly attributes: TraceAttributes | undefined;\n readonly context?: SemanticContext | undefined;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n ...semanticContextAttributes(input.context),\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueInvokeAgent,\n input.context?.agentName\n )\n };\n}\n\n/** Builds the child span for an underlying model call. */\nexport function modelCallSpan(input: {\n readonly attributes?: TraceAttributes | undefined;\n readonly context?: SemanticContext | undefined;\n readonly model: string | undefined;\n readonly operation: string;\n readonly provider: string | undefined;\n readonly request?: RequestSummary | undefined;\n}): SpanSpec {\n return {\n attributes: {\n ...input.attributes,\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n ...semanticContextAttributes(input.context),\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueChat,\n [TraceAttribute.GenAI.ProviderName]: normalizeProviderName(\n input.provider\n ),\n ...requestAttributes(input.request, input.model)\n },\n name: spanName(TraceAttribute.GenAI.OperationNameValueChat, input.model)\n };\n}\n\nfunction requestAttributes(\n request: RequestSummary | undefined,\n model: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputType]: request?.outputType,\n [TraceAttribute.GenAI.RequestFrequencyPenalty]: request?.frequencyPenalty,\n [TraceAttribute.GenAI.RequestMaxTokens]: request?.maxTokens,\n [TraceAttribute.GenAI.RequestModel]: model,\n [TraceAttribute.GenAI.RequestPresencePenalty]: request?.presencePenalty,\n [TraceAttribute.GenAI.RequestSeed]: request?.seed,\n // Semconv: gen_ai.request.stream is set if and only if streaming.\n [TraceAttribute.GenAI.RequestStream]:\n request?.stream === true ? true : undefined,\n [TraceAttribute.GenAI.RequestTemperature]: request?.temperature,\n [TraceAttribute.GenAI.RequestTopK]: request?.topK,\n [TraceAttribute.GenAI.RequestTopP]: request?.topP\n };\n}\n\n/** Builds the child span for a tool execution. */\nexport function toolCallSpan(input: {\n readonly context?: SemanticContext | undefined;\n readonly operation: string;\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: input.operation,\n ...semanticContextAttributes(input.context),\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n input.toolName\n )\n };\n}\n\n/** Builds a bounded child span for one tool-approval lifecycle segment. */\nexport function toolApprovalSpan(input: {\n readonly context?: SemanticContext | undefined;\n readonly state: \"approved\" | \"denied\" | \"requested\";\n readonly toolCallId?: string | undefined;\n readonly toolName: string;\n}): SpanSpec {\n return {\n attributes: {\n [TraceAttribute.Cloudflare.IntegrationName]: \"ai-sdk\",\n [TraceAttribute.Cloudflare.OperationName]: \"tool.approval\",\n [TraceAttribute.Cloudflare.ToolApprovalState]: input.state,\n ...semanticContextAttributes(input.context),\n [TraceAttribute.GenAI.OperationName]:\n TraceAttribute.GenAI.OperationNameValueExecuteTool,\n [TraceAttribute.GenAI.ToolCallID]: input.toolCallId,\n [TraceAttribute.GenAI.ToolName]: input.toolName,\n [TraceAttribute.GenAI.ToolType]: \"function\"\n },\n name: spanName(\"tool_approval\", input.toolName)\n };\n}\n\n/** Projects a completed model operation into canonical finish attributes. */\nexport function finishAttributes(input: {\n readonly aiGatewayLogId?: string | undefined;\n readonly finishReason: string | undefined;\n readonly response?: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds?: number | undefined;\n readonly toolCallCount?: number | undefined;\n readonly usage: TokenUsageSummary | undefined;\n}): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: input.aiGatewayLogId,\n [TraceAttribute.Cloudflare.ResponseFinishReason]: input.finishReason,\n [TraceAttribute.Cloudflare.ToolCount]: input.toolCallCount,\n [TraceAttribute.Cloudflare.UsageTotalTokens]: totalTokens(input.usage),\n [TraceAttribute.GenAI.ResponseID]: input.response?.id,\n [TraceAttribute.GenAI.ResponseModel]: input.response?.model,\n [TraceAttribute.GenAI.ResponseTimeToFirstChunk]:\n input.timeToFirstChunkSeconds,\n [TraceAttribute.GenAI.UsageCacheCreationInputTokens]:\n input.usage?.cacheCreationInputTokens,\n [TraceAttribute.GenAI.UsageCacheReadInputTokens]:\n input.usage?.cacheReadInputTokens,\n [TraceAttribute.GenAI.UsageInputTokens]: input.usage?.inputTokens,\n [TraceAttribute.GenAI.UsageOutputTokens]: input.usage?.outputTokens,\n [TraceAttribute.GenAI.UsageReasoningOutputTokens]:\n input.usage?.reasoningTokens\n };\n}\n\n/** Attribute projection for an AI Gateway log reference discovered on error. */\nexport function aiGatewayLogAttributes(\n aiGatewayLogId: string | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.Cloudflare.AIGatewayLogID]: aiGatewayLogId\n };\n}\n\nfunction totalTokens(usage: TokenUsageSummary | undefined): number | undefined {\n if (usage?.totalTokens !== undefined) {\n return usage.totalTokens;\n }\n return usage?.inputTokens !== undefined && usage.outputTokens !== undefined\n ? usage.inputTokens + usage.outputTokens\n : undefined;\n}\n","import { finishAttributes } from \"../../genai/telemetry\";\nimport type {\n RequestSummary,\n ResponseSummary,\n TokenUsageSummary\n} from \"../../genai/telemetry\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport {\n readNestedTokenField,\n readNumber,\n readString,\n readTokenCount\n} from \"../read\";\n\n/** Identity fields extracted from an AI SDK language model object. */\nexport type ModelInfo = {\n readonly modelId: string | undefined;\n readonly provider: string | undefined;\n};\n\nexport function finishAttributesFromResult(\n result: unknown,\n options: {\n readonly aiGatewayLogId?: string | undefined;\n readonly includeResponse?: boolean;\n } = {}\n): TraceAttributes {\n return finishAttributes({\n aiGatewayLogId: options.aiGatewayLogId,\n finishReason: extractFinishReason(result),\n response: options.includeResponse ? extractResponseInfo(result) : undefined,\n toolCallCount: extractToolCallCount(result),\n usage: extractAISDKTokenUsage(result)\n });\n}\n\nexport function extractRequestSummary(\n params: Record<string, unknown>,\n operation: string\n): RequestSummary {\n return {\n frequencyPenalty: readNumber(params.frequencyPenalty),\n maxTokens: readNumber(params.maxOutputTokens ?? params.maxTokens),\n outputType:\n operation === \"generateObject\" || operation === \"streamObject\"\n ? \"json\"\n : \"text\",\n presencePenalty: readNumber(params.presencePenalty),\n seed: readNumber(params.seed),\n stream: operation === \"streamText\" || operation === \"streamObject\",\n temperature: readNumber(params.temperature),\n topK: readNumber(params.topK),\n topP: readNumber(params.topP)\n };\n}\n\n/** Extracts model identity from an AI SDK model object. */\nexport function extractModelInfo(value: unknown): ModelInfo | undefined {\n // Gateway-style string model ids still identify the model.\n if (typeof value === \"string\") {\n return value.length > 0\n ? { modelId: value, provider: undefined }\n : undefined;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK model objects are records; we only read modelId and provider.\n const record = value as Record<string, unknown>;\n const modelId =\n typeof record.modelId === \"string\" ? record.modelId : undefined;\n const provider =\n typeof record.provider === \"string\" ? record.provider : undefined;\n\n if (modelId === undefined && provider === undefined) {\n return undefined;\n }\n\n return { modelId, provider };\n}\n\n/**\n * Extracts token usage from an AI SDK result or stream chunk across supported\n * majors. Token counts may be plain numbers or nested objects such as\n * `{ total, cacheRead, cacheWrite }` / `{ total, reasoning }`.\n */\nexport function extractAISDKTokenUsage(\n value: unknown\n): TokenUsageSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result/chunk objects are records with known optional fields.\n const record = value as Record<string, unknown>;\n\n // Results expose totalUsage (multi-step aggregate) or usage.\n const raw = record.totalUsage ?? record.usage;\n if (typeof raw !== \"object\" || raw === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK usage is a record with inputTokens, outputTokens, totalTokens.\n const usage = raw as Record<string, unknown>;\n\n const inputTokens = readTokenCount(usage.inputTokens);\n const outputTokens = readTokenCount(usage.outputTokens);\n const totalTokens = readNumber(usage.totalTokens);\n // The public result usage keeps details in inputTokenDetails/outputTokenDetails\n // (with deprecated flat fields); provider-level usage nests them on the token\n // counts themselves. Read all shapes.\n const cacheReadInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheReadTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheRead\") ??\n readNumber(usage.cachedInputTokens);\n const cacheCreationInputTokens =\n readNestedTokenField(usage.inputTokenDetails, \"cacheWriteTokens\") ??\n readNestedTokenField(usage.inputTokens, \"cacheWrite\");\n const reasoningTokens =\n readNestedTokenField(usage.outputTokenDetails, \"reasoningTokens\") ??\n readNestedTokenField(usage.outputTokens, \"reasoning\") ??\n readNumber(usage.reasoningTokens);\n\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined &&\n cacheReadInputTokens === undefined &&\n cacheCreationInputTokens === undefined &&\n reasoningTokens === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(cacheCreationInputTokens !== undefined\n ? { cacheCreationInputTokens }\n : {}),\n ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {})\n };\n}\n\nfunction extractToolCallCount(value: unknown): number | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const toolCalls = (value as Record<string, unknown>).toolCalls;\n return Array.isArray(toolCalls) && toolCalls.length > 0\n ? toolCalls.length\n : undefined;\n}\n\n/**\n * Reads a finish reason from an AI SDK result or `finish`-type stream chunk.\n */\nexport function extractFinishReason(value: unknown): string | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects are records with an optional finishReason field.\n const record = value as Record<string, unknown>;\n const finishReason = record.finishReason;\n\n if (typeof finishReason === \"string\") {\n return finishReason;\n }\n\n // The SDK may expose finishReason as { unified: string }.\n if (typeof finishReason === \"object\" && finishReason !== null) {\n // SAFETY: finishReason object has an optional unified string field.\n const unified = (finishReason as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n }\n\n return undefined;\n}\n\nexport function extractResponseInfo(\n value: unknown\n): ResponseSummary | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK result objects may expose a response record with id/model.\n const record = value as Record<string, unknown>;\n\n // Provider-level `response-metadata` stream parts carry id/modelId at the\n // top level (no nested response record).\n if (record.type === \"response-metadata\") {\n const id = readString(record.id);\n const model = readString(record.modelId);\n if (id === undefined && model === undefined) {\n return undefined;\n }\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n }\n\n const response =\n typeof record.response === \"object\" && record.response !== null\n ? (record.response as Record<string, unknown>)\n : undefined;\n const id = readString(record.responseId ?? response?.id);\n const model = readString(\n record.responseModel ?? response?.modelId ?? response?.model\n );\n\n if (id === undefined && model === undefined) {\n return undefined;\n }\n\n return {\n ...(id !== undefined ? { id } : {}),\n ...(model !== undefined ? { model } : {})\n };\n}\n","const MAX_AI_GATEWAY_LOG_ID_BYTES = 256;\nconst AI_GATEWAY_CONTAINER_KEYS = new Set([\n \"aigateway\",\n \"binding\",\n \"cause\",\n \"cloudflare\",\n \"config\",\n \"context\",\n \"error\",\n \"gateway\",\n \"providermetadata\",\n \"rawresponse\",\n \"response\",\n \"workersai\"\n]);\n\n/**\n * Reads an AI Gateway log id from explicit provider surfaces only: response\n * headers, provider metadata, gateway errors, or a Workers AI binding. The\n * walk is bounded and uses data-property descriptors, so telemetry cannot get\n * stuck on cycles or invoke arbitrary application getters. Unknown shapes fail\n * open and simply omit the attribute.\n */\nexport function extractAIGatewayLogId(value: unknown): string | undefined {\n const seen = new Set<object>();\n let visited = 0;\n\n const visit = (\n candidate: unknown,\n depth: number,\n gatewayScoped: boolean,\n providerMetadata: boolean,\n responseScoped: boolean\n ): string | undefined => {\n if (\n candidate === null ||\n candidate === undefined ||\n depth > 6 ||\n (typeof candidate !== \"object\" && typeof candidate !== \"function\") ||\n seen.has(candidate) ||\n visited >= 200\n ) {\n return undefined;\n }\n seen.add(candidate);\n visited += 1;\n\n if (typeof Response !== \"undefined\" && candidate instanceof Response) {\n return readHeaderLogId(candidate.headers);\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(candidate);\n } catch {\n return undefined;\n }\n\n const objectName = dataString(descriptors.name);\n const scopedHere =\n gatewayScoped ||\n (objectName !== undefined && isGatewayKey(normalizeKey(objectName)));\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n\n const normalizedKey = normalizeKey(key);\n if (\n normalizedKey === \"cfaiglogid\" ||\n normalizedKey === \"aigatewaylogid\"\n ) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (\n normalizedKey === \"responseheaders\" ||\n (normalizedKey === \"headers\" && responseScoped)\n ) {\n const logId = readHeaderLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n\n if (normalizedKey === \"logid\" && scopedHere) {\n const logId = boundedAIGatewayLogId(descriptor.value);\n if (logId !== undefined) {\n return logId;\n }\n }\n }\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!(\"value\" in descriptor)) {\n continue;\n }\n const normalizedKey = normalizeKey(key);\n if (!providerMetadata && !AI_GATEWAY_CONTAINER_KEYS.has(normalizedKey)) {\n continue;\n }\n\n const nested = visit(\n descriptor.value,\n depth + 1,\n scopedHere || isGatewayKey(normalizedKey),\n providerMetadata || normalizedKey === \"providermetadata\",\n normalizedKey === \"response\" || normalizedKey === \"rawresponse\"\n );\n if (nested !== undefined) {\n return nested;\n }\n }\n\n return undefined;\n };\n\n return visit(value, 0, false, false, false);\n}\n\n/** Per-wrapped-model view of a Workers AI binding's latest response log id. */\nexport type AIGatewayLogCapture = {\n readonly model: object;\n get(): string | undefined;\n reset(): void;\n};\n\n/**\n * workers-ai-provider currently exposes the gateway ID on its `Ai` binding,\n * not in the LanguageModel result. Clone only that known runtime shape and\n * proxy `binding.run` so the ID is captured as that call settles instead of\n * reading the binding's mutable latest value later when the span ends.\n */\nexport function captureAIGatewayLogFromModel(\n model: object,\n provider: string | undefined\n): AIGatewayLogCapture {\n let logId: string | undefined;\n const capture = {\n model,\n get: () => logId,\n reset: () => {\n logId = undefined;\n }\n };\n\n if (!provider?.toLowerCase().startsWith(\"workersai\")) {\n return capture;\n }\n\n try {\n const modelDescriptors = Object.getOwnPropertyDescriptors(model);\n const configDescriptor = modelDescriptors.config;\n if (!configDescriptor || !(\"value\" in configDescriptor)) {\n return capture;\n }\n\n const config = configDescriptor.value;\n if (typeof config !== \"object\" || config === null) {\n return capture;\n }\n const configDescriptors = Object.getOwnPropertyDescriptors(config);\n const bindingDescriptor = configDescriptors.binding;\n if (!bindingDescriptor || !(\"value\" in bindingDescriptor)) {\n return capture;\n }\n\n const binding = bindingDescriptor.value;\n if (\n typeof binding !== \"object\" ||\n binding === null ||\n !(\"aiGatewayLogId\" in binding) ||\n typeof (binding as { run?: unknown }).run !== \"function\"\n ) {\n return capture;\n }\n\n const bindingProxy = new Proxy(binding, {\n get(target, property, receiver) {\n if (property !== \"run\") {\n return Reflect.get(target, property, receiver);\n }\n\n return (...args: readonly unknown[]) => {\n const run = Reflect.get(target, property, target) as (\n ...runArgs: readonly unknown[]\n ) => unknown;\n const previousLogId = extractAIGatewayLogId(target);\n logId = undefined;\n const captureResult = (result: unknown): void => {\n const resultLogId = extractAIGatewayLogId(result);\n const currentLogId = extractAIGatewayLogId(target);\n logId =\n resultLogId ??\n (currentLogId !== previousLogId ? currentLogId : undefined);\n };\n try {\n return Promise.resolve(Reflect.apply(run, target, args)).then(\n (result) => {\n captureResult(result);\n return result;\n },\n (cause: unknown) => {\n captureResult(cause);\n throw cause;\n }\n );\n } catch (cause: unknown) {\n captureResult(cause);\n throw cause;\n }\n };\n }\n });\n\n const configClone = Object.create(Object.getPrototypeOf(config), {\n ...configDescriptors,\n binding: { ...bindingDescriptor, value: bindingProxy }\n }) as object;\n capture.model = Object.create(Object.getPrototypeOf(model), {\n ...modelDescriptors,\n config: { ...configDescriptor, value: configClone }\n }) as object;\n } catch {\n // Unknown/frozen/proxied provider shape: keep the original model. Header\n // and provider-metadata extraction still work when the result exposes them.\n }\n\n return capture;\n}\n\nfunction readHeaderLogId(value: unknown): string | undefined {\n if (isHeadersLike(value)) {\n try {\n return boundedAIGatewayLogId(value.get(\"cf-aig-log-id\"));\n } catch {\n return undefined;\n }\n }\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n let descriptors: PropertyDescriptorMap;\n try {\n descriptors = Object.getOwnPropertyDescriptors(value);\n } catch {\n return undefined;\n }\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (\"value\" in descriptor && key.toLowerCase() === \"cf-aig-log-id\") {\n return boundedAIGatewayLogId(descriptor.value);\n }\n }\n return undefined;\n}\n\nfunction isHeadersLike(\n value: unknown\n): value is { get(name: string): string | null } {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n try {\n return \"get\" in value && typeof value.get === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isGatewayKey(value: string): boolean {\n return (\n value.includes(\"gateway\") ||\n value.includes(\"aig\") ||\n value.includes(\"workersai\") ||\n value === \"cloudflare\"\n );\n}\n\nfunction normalizeKey(value: string): string {\n return value.toLowerCase().replaceAll(/[-_.]/g, \"\");\n}\n\nfunction dataString(\n descriptor: PropertyDescriptor | undefined\n): string | undefined {\n return descriptor && \"value\" in descriptor\n ? nonEmptyString(descriptor.value)\n : undefined;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction boundedAIGatewayLogId(value: unknown): string | undefined {\n const id = nonEmptyString(value);\n return id !== undefined &&\n new TextEncoder().encode(id).length <= MAX_AI_GATEWAY_LOG_ID_BYTES\n ? id\n : undefined;\n}\n","import { TraceAttribute } from \"../genai/attributes\";\nimport type { TraceAttributes } from \"../tracing/tracer\";\n\n// Two payload attributes plus scalar metadata stay under workerd's 64 KiB cap.\nconst MAX_ATTRIBUTE_BYTES = 28 * 1024;\nconst PROTECTED_HEAD_MESSAGES = 2;\n\ntype GenAIMessagePart = Record<string, unknown>;\ntype GenAIInputMessage = {\n readonly name?: string;\n readonly parts: GenAIMessagePart[];\n readonly role: string;\n};\ntype GenAIOutputMessage = GenAIInputMessage & {\n readonly finish_reason: string;\n};\n\nexport function inputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const messages = Array.isArray(record.prompt)\n ? record.prompt\n : Array.isArray(record.messages)\n ? record.messages\n : typeof record.prompt === \"string\"\n ? [{ role: \"user\", content: record.prompt }]\n : undefined;\n return {\n [TraceAttribute.GenAI.InputMessages]: serializeMessages(\n messages === undefined ? undefined : formatInputMessages(messages)\n )\n };\n}\n\nexport function outputMessageAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n if (!enabled || typeof value !== \"object\" || value === null) return {};\n const record = value as Record<string, unknown>;\n const parts = outputParts(record);\n const finishReason = readFinishReason(record);\n return outputMessageAttributesFrom(\n parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined\n );\n}\n\nexport function outputMessageAttributesFrom(\n messages: readonly unknown[] | undefined\n): TraceAttributes {\n return {\n [TraceAttribute.GenAI.OutputMessages]: serializeMessages(messages)\n };\n}\n\nexport function toolInputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallArguments]: serialize(value) }\n : {};\n}\n\nexport function toolOutputAttributes(\n value: unknown,\n enabled: boolean\n): TraceAttributes {\n return enabled\n ? { [TraceAttribute.GenAI.ToolCallResult]: serialize(value) }\n : {};\n}\n\nexport function createStreamMessages(): {\n messages(finishReason?: string): unknown[] | undefined;\n observe(chunk: unknown): void;\n} {\n let text = \"\";\n let reasoning = \"\";\n const toolParts: GenAIMessagePart[] = [];\n\n return {\n messages(finishReason) {\n const parts = [\n ...(reasoning\n ? [{ type: \"reasoning\", content: reasoning } as GenAIMessagePart]\n : []),\n ...(text ? [{ type: \"text\", content: text } as GenAIMessagePart] : []),\n ...toolParts\n ];\n return parts.length > 0 || finishReason !== undefined\n ? [outputMessage(parts, finishReason)]\n : undefined;\n },\n observe(chunk) {\n if (typeof chunk !== \"object\" || chunk === null) return;\n const record = chunk as Record<string, unknown>;\n const delta = record.text ?? record.delta;\n if (record.type === \"text-delta\" && typeof delta === \"string\") {\n text += delta;\n } else if (\n record.type === \"reasoning-delta\" &&\n typeof delta === \"string\"\n ) {\n reasoning += delta;\n } else if (record.type === \"tool-call\" || record.type === \"tool-result\") {\n const part = formatMessagePart(record);\n if (part !== undefined) toolParts.push(part);\n }\n }\n };\n}\n\nfunction formatInputMessages(\n messages: readonly unknown[]\n): GenAIInputMessage[] {\n const formatted: GenAIInputMessage[] = [];\n for (const message of messages) {\n const next = formatInputMessage(message);\n if (next !== undefined) formatted.push(next);\n }\n return formatted;\n}\n\nfunction formatInputMessage(value: unknown): GenAIInputMessage | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const record = value as Record<string, unknown>;\n if (typeof record.role !== \"string\") return undefined;\n\n const rawParts = Array.isArray(record.parts)\n ? record.parts\n : Array.isArray(record.content)\n ? record.content\n : typeof record.content === \"string\"\n ? [record.content]\n : [];\n const parts = rawParts\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n const name = typeof record.name === \"string\" ? record.name : undefined;\n\n return {\n role: record.role,\n parts,\n ...(name !== undefined ? { name } : {})\n };\n}\n\nfunction outputParts(record: Record<string, unknown>): GenAIMessagePart[] {\n if (Array.isArray(record.content)) {\n return record.content\n .map(formatMessagePart)\n .filter((part): part is GenAIMessagePart => part !== undefined);\n }\n\n const parts: GenAIMessagePart[] = [];\n appendReasoningParts(parts, record.reasoning);\n if (typeof record.text === \"string\" && record.text.length > 0) {\n parts.push({ type: \"text\", content: record.text });\n }\n if (Array.isArray(record.toolCalls)) {\n for (const toolCall of record.toolCalls) {\n const part = formatMessagePart(toolCall);\n if (part !== undefined) parts.push(part);\n }\n }\n return parts;\n}\n\nfunction appendReasoningParts(\n parts: GenAIMessagePart[],\n reasoning: unknown\n): void {\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n parts.push({ type: \"reasoning\", content: reasoning });\n return;\n }\n if (!Array.isArray(reasoning)) return;\n\n for (const entry of reasoning) {\n if (typeof entry !== \"object\" || entry === null) continue;\n const text = (entry as Record<string, unknown>).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"reasoning\", content: text });\n }\n }\n}\n\nfunction formatMessagePart(value: unknown): GenAIMessagePart | undefined {\n if (typeof value === \"string\") {\n return { type: \"text\", content: value };\n }\n if (typeof value !== \"object\" || value === null) return undefined;\n\n const record = value as Record<string, unknown>;\n if (typeof record.type !== \"string\") return undefined;\n\n switch (record.type) {\n case \"text\":\n case \"reasoning\": {\n const content = record.content ?? record.text;\n return typeof content === \"string\"\n ? { type: record.type, content }\n : undefined;\n }\n case \"tool-call\":\n case \"tool_call\":\n return formatToolCall(record);\n case \"tool-result\":\n case \"tool_result\":\n case \"tool_call_response\":\n return formatToolCallResponse(record);\n default:\n // The OTel schema permits extensible generic parts. Keep their type but\n // do not leak AI SDK-native property names into known semantic parts.\n return { type: record.type.replaceAll(\"-\", \"_\") };\n }\n}\n\nfunction formatToolCall(\n record: Record<string, unknown>\n): GenAIMessagePart | undefined {\n const name = record.name ?? record.toolName;\n if (typeof name !== \"string\") return undefined;\n const id = record.id ?? record.toolCallId;\n const args = record.arguments ?? record.input;\n\n return {\n type: \"tool_call\",\n ...(typeof id === \"string\" ? { id } : {}),\n name,\n ...(args !== undefined ? { arguments: parseJson(args) } : {})\n };\n}\n\nfunction formatToolCallResponse(\n record: Record<string, unknown>\n): GenAIMessagePart {\n const id = record.id ?? record.toolCallId;\n const rawResponse = record.response ?? record.output ?? record.result ?? null;\n\n return {\n type: \"tool_call_response\",\n ...(typeof id === \"string\" ? { id } : {}),\n response: toolResponse(rawResponse)\n };\n}\n\nfunction toolResponse(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const record = value as Record<string, unknown>;\n switch (record.type) {\n case \"text\":\n case \"error-text\":\n case \"json\":\n case \"error-json\":\n case \"content\":\n return record.value ?? null;\n case \"execution-denied\":\n return {\n denied: true,\n ...(typeof record.reason === \"string\" ? { reason: record.reason } : {})\n };\n default:\n return value;\n }\n}\n\nfunction outputMessage(\n parts: GenAIMessagePart[],\n finishReason: string | undefined\n): GenAIOutputMessage {\n return {\n role: \"assistant\",\n parts,\n // AI SDK normally always reports this. Keep the schema valid if a custom\n // provider omits it rather than emitting an output message without the\n // required field.\n finish_reason: normalizeFinishReason(finishReason ?? \"unknown\")\n };\n}\n\nfunction readFinishReason(record: Record<string, unknown>): string | undefined {\n const value = record.finishReason ?? record.finish_reason;\n if (typeof value === \"string\") return value;\n if (typeof value !== \"object\" || value === null) return undefined;\n const unified = (value as Record<string, unknown>).unified;\n return typeof unified === \"string\" ? unified : undefined;\n}\n\nfunction normalizeFinishReason(value: string): string {\n switch (value) {\n case \"content-filter\":\n return \"content_filter\";\n case \"tool-calls\":\n case \"tool_calls\":\n return \"tool_call\";\n case \"other\":\n case \"unknown\":\n return \"stop\";\n default:\n return value;\n }\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction serializeMessages(\n messages: readonly unknown[] | undefined\n): string | undefined {\n if (messages === undefined) return undefined;\n\n const kept = [...messages];\n while (true) {\n const json = stringify(kept);\n if (json === undefined) return undefined;\n if (byteLength(json) <= MAX_ATTRIBUTE_BYTES) return json;\n if (kept.length <= PROTECTED_HEAD_MESSAGES) return undefined;\n kept.splice(PROTECTED_HEAD_MESSAGES, 1);\n }\n}\n\nfunction serialize(value: unknown): string | undefined {\n const json = stringify(value);\n return json !== undefined && byteLength(json) <= MAX_ATTRIBUTE_BYTES\n ? json\n : undefined;\n}\n\nfunction stringify(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n","import {\n aiGatewayLogAttributes,\n finishAttributes\n} from \"../../genai/telemetry\";\nimport type { ResponseSummary, TokenUsageSummary } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes, AgentSpan } from \"../../tracing/tracer\";\nimport { extractAIGatewayLogId } from \"../ai-gateway\";\nimport { createStreamMessages, outputMessageAttributesFrom } from \"../content\";\nimport {\n extractAISDKTokenUsage,\n extractFinishReason,\n extractResponseInfo\n} from \"./extract\";\n\ntype StreamSummary = {\n readonly aiGatewayLogId?: string;\n readonly finishReason?: string;\n readonly outputMessages?: unknown[];\n readonly response?: ResponseSummary;\n readonly toolCallCount?: number;\n readonly timeToFirstChunkSeconds?: number;\n readonly usage?: TokenUsageSummary;\n};\n\nexport function finishWhenStreamCompletes(\n result: unknown,\n span: AgentSpan,\n options: {\n readonly aiGatewayLogId?: string;\n readonly includeAIGatewayLog?: boolean;\n readonly includeResponse?: boolean;\n readonly storeMessages?: boolean;\n readonly startedAtMs?: number;\n } = {}\n): unknown {\n return patchStreamFields(\n result,\n {\n onComplete: (summary) => {\n span.finish(\n finishAttributesFromStreamSummary(\n summary,\n options.includeResponse === true,\n options.includeAIGatewayLog === true,\n options.aiGatewayLogId,\n options.storeMessages === true\n )\n );\n },\n onError: (cause, observedAIGatewayLogId, observed) => {\n if (options.includeAIGatewayLog) {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(\n observedAIGatewayLogId ??\n extractAIGatewayLogId(cause) ??\n options.aiGatewayLogId\n )\n );\n }\n // A turn that fails or is cancelled part-way still spent the tokens it\n // already reported. `fail` records only the classification, so write\n // what the stream did tell us first — otherwise the turn reads as\n // having used nothing at all.\n if (observed !== undefined) {\n writeSpanAttributes(\n span,\n finishAttributesFromStreamSummary(\n observed,\n options.includeResponse === true,\n options.includeAIGatewayLog === true,\n options.aiGatewayLogId,\n options.storeMessages === true\n )\n );\n }\n span.fail(cause);\n }\n },\n options.startedAtMs,\n options.includeAIGatewayLog ? options.aiGatewayLogId : undefined,\n options.storeMessages === true\n );\n}\n\nfunction finishAttributesFromStreamSummary(\n summary: StreamSummary | undefined,\n includeResponse: boolean,\n includeAIGatewayLog: boolean,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): TraceAttributes {\n return {\n ...finishAttributes({\n aiGatewayLogId: includeAIGatewayLog\n ? (summary?.aiGatewayLogId ?? initialAIGatewayLogId)\n : undefined,\n finishReason: summary?.finishReason,\n response: includeResponse ? summary?.response : undefined,\n timeToFirstChunkSeconds: summary?.timeToFirstChunkSeconds,\n toolCallCount: summary?.toolCallCount,\n usage: summary?.usage\n }),\n ...outputMessageAttributesFrom(\n storeMessages ? summary?.outputMessages : undefined\n )\n };\n}\n\nfunction patchStreamFields(\n result: unknown,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): unknown {\n if (typeof result !== \"object\" || result === null) {\n hooks.onComplete(undefined);\n return result;\n }\n\n // SAFETY: AI SDK stream results are records with stream fields.\n const record = result as Record<string, unknown>;\n\n let patchedAny = false;\n let closed = false;\n\n const completeOnce = (summary: StreamSummary | undefined) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onComplete(summary);\n };\n\n const errorOnce = (\n cause: unknown,\n observedAIGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => {\n if (closed) {\n return;\n }\n closed = true;\n hooks.onError(cause, observedAIGatewayLogId, observed);\n };\n\n // Instrumentation must fail open: if the SDK's private stream fields change\n // shape or refuse patching, close the span and return the result untouched\n // rather than breaking an otherwise valid call.\n try {\n if (isReadableStream(record.baseStream)) {\n Object.defineProperty(record, \"baseStream\", {\n configurable: true,\n enumerable: true,\n value: wrapReadableStream(\n record.baseStream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n return result;\n }\n\n const streamField = findStreamField(record, [\n \"partialObjectStream\",\n \"textStream\",\n \"fullStream\",\n \"stream\"\n ]);\n\n if (streamField) {\n Object.defineProperty(record, streamField.field, {\n configurable: true,\n enumerable: true,\n value:\n streamField.kind === \"readable\"\n ? wrapReadableStream(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n )\n : wrapAsyncIterable(\n streamField.stream,\n {\n onComplete: completeOnce,\n onError: errorOnce\n },\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n ),\n writable: true\n });\n patchedAny = true;\n }\n } catch {\n patchedAny = false;\n }\n\n if (!patchedAny) {\n hooks.onComplete(undefined);\n return result;\n }\n\n return result;\n}\n\nfunction findStreamField(\n result: Record<string, unknown>,\n candidateFields: readonly string[]\n):\n | {\n readonly field: string;\n readonly kind: \"asyncIterable\";\n readonly stream: AsyncIterable<unknown>;\n }\n | {\n readonly field: string;\n readonly kind: \"readable\";\n readonly stream: ReadableStream<unknown>;\n }\n | undefined {\n for (const field of candidateFields) {\n try {\n const stream = result[field];\n if (isReadableStream(stream)) {\n return { field, kind: \"readable\", stream };\n }\n if (isAsyncIterable(stream)) {\n return { field, kind: \"asyncIterable\", stream };\n }\n } catch {\n // Ignore getter failures.\n }\n }\n\n return undefined;\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): ReadableStream<unknown> {\n let reader: ReadableStreamDefaultReader<unknown> | undefined;\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n\n return new ReadableStream<unknown>({\n async pull(controller) {\n reader ??= stream.getReader();\n try {\n const result = await reader.read();\n if (state.closed) {\n return;\n }\n\n if (result.done) {\n state.complete();\n controller.close();\n releaseReader();\n return;\n }\n\n state.observeChunk(result.value);\n controller.enqueue(result.value);\n } catch (cause: unknown) {\n if (!state.closed) {\n state.fail(cause);\n controller.error(cause);\n }\n releaseReader();\n }\n },\n async cancel(reason) {\n state.cancel();\n try {\n if (reader) {\n await reader.cancel(reason);\n return;\n }\n\n await stream.cancel(reason);\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n releaseReader();\n }\n }\n });\n\n function releaseReader(): void {\n if (!reader) {\n return;\n }\n\n try {\n reader.releaseLock();\n } catch {\n // Ignore lock release failures after stream errors or cancellation.\n } finally {\n reader = undefined;\n }\n }\n}\n\nfunction wrapAsyncIterable(\n stream: AsyncIterable<unknown>,\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n aiGatewayLogId: string | undefined,\n storeMessages: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState(\n hooks,\n startedAtMs,\n aiGatewayLogId,\n storeMessages\n );\n try {\n for await (const chunk of stream) {\n state.observeChunk(chunk);\n yield chunk;\n }\n\n state.complete();\n } catch (cause: unknown) {\n state.fail(cause);\n throw cause;\n } finally {\n state.cancel();\n }\n }\n };\n}\n\nfunction createStreamState(\n hooks: {\n readonly onComplete: (summary: StreamSummary | undefined) => void;\n readonly onError: (\n cause: unknown,\n aiGatewayLogId: string | undefined,\n observed?: StreamSummary\n ) => void;\n },\n startedAtMs: number | undefined,\n initialAIGatewayLogId: string | undefined,\n storeMessages: boolean\n): {\n readonly closed: boolean;\n cancel(): void;\n complete(): void;\n fail(cause: unknown): void;\n observeChunk(chunk: unknown): void;\n} {\n let closed = false;\n let aiGatewayLogId = initialAIGatewayLogId;\n let finishReason: string | undefined;\n let toolCallCount = 0;\n let usage: TokenUsageSummary | undefined;\n let response: ResponseSummary | undefined;\n let observedError: { readonly cause: unknown } | undefined;\n let observedAbort = false;\n let firstChunkAtMs: number | undefined;\n const output = createStreamMessages();\n\n /** What the stream reported before it stopped, complete or not. */\n const observedSummary = (): StreamSummary =>\n streamSummaryFromParts({\n aiGatewayLogId,\n finishReason,\n outputMessages: storeMessages ? output.messages(finishReason) : undefined,\n response,\n timeToFirstChunkSeconds:\n firstChunkAtMs === undefined || startedAtMs === undefined\n ? undefined\n : (firstChunkAtMs - startedAtMs) / 1000,\n toolCallCount,\n usage\n });\n\n const settleObserved = (): boolean => {\n if (observedError) {\n hooks.onError(observedError.cause, aiGatewayLogId, observedSummary());\n return true;\n }\n\n if (observedAbort) {\n // AI SDK v6 signals aborts as an in-band `{ type: \"abort\" }` chunk and\n // completes the stream normally — it never rejects with an AbortError.\n // Surface a structurally AbortError-shaped cause so the tracer\n // classifies the span as canceled instead of a false success.\n hooks.onError({ name: \"AbortError\" }, aiGatewayLogId, observedSummary());\n return true;\n }\n\n return false;\n };\n\n return {\n get closed() {\n return closed;\n },\n cancel() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(undefined);\n },\n complete() {\n if (closed) {\n return;\n }\n\n closed = true;\n if (settleObserved()) {\n return;\n }\n\n hooks.onComplete(\n streamSummaryFromParts({\n aiGatewayLogId,\n finishReason,\n outputMessages: storeMessages\n ? output.messages(finishReason)\n : undefined,\n response,\n timeToFirstChunkSeconds:\n firstChunkAtMs === undefined || startedAtMs === undefined\n ? undefined\n : (firstChunkAtMs - startedAtMs) / 1000,\n toolCallCount,\n usage\n })\n );\n },\n fail(cause) {\n if (closed) {\n return;\n }\n\n closed = true;\n hooks.onError(cause, aiGatewayLogId);\n },\n observeChunk(rawChunk) {\n firstChunkAtMs ??= Date.now();\n const chunk = unwrapChunkEnvelope(rawChunk);\n aiGatewayLogId = extractAIGatewayLogId(chunk) ?? aiGatewayLogId;\n if (storeMessages) output.observe(chunk);\n // AI SDK v6 signals mid-stream provider failures as an in-band\n // `{ type: \"error\" }` chunk rather than rejecting the stream, so the\n // stream still reaches normal completion afterward. Record it here and\n // fail the span on completion instead of treating it as a success.\n if (isErrorChunk(chunk)) {\n observedError = { cause: chunk.error };\n }\n if (isAbortChunk(chunk)) {\n observedAbort = true;\n }\n if (isToolCallChunk(chunk)) {\n toolCallCount += 1;\n }\n finishReason = extractFinishReason(chunk) ?? finishReason;\n usage = extractAISDKTokenUsage(chunk) ?? usage;\n response = extractResponseInfo(chunk) ?? response;\n }\n };\n}\n\n/**\n * The streamText result's private `baseStream` carries `{ part, partialOutput }`\n * envelopes rather than bare stream parts; `fullStream` and provider-level\n * streams carry bare parts. Unwrap the envelope when present so chunk\n * inspection sees the actual part in both cases.\n */\nfunction unwrapChunkEnvelope(chunk: unknown): unknown {\n if (typeof chunk !== \"object\" || chunk === null) {\n return chunk;\n }\n\n const part = (chunk as Record<string, unknown>).part;\n return typeof part === \"object\" &&\n part !== null &&\n \"type\" in (part as Record<string, unknown>)\n ? part\n : chunk;\n}\n\nfunction isErrorChunk(chunk: unknown): chunk is { readonly error: unknown } {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"error\"\n );\n}\n\nfunction isAbortChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"abort\"\n );\n}\n\nfunction streamSummaryFromParts(input: {\n readonly aiGatewayLogId: string | undefined;\n readonly finishReason: string | undefined;\n readonly outputMessages: unknown[] | undefined;\n readonly response: ResponseSummary | undefined;\n readonly timeToFirstChunkSeconds: number | undefined;\n readonly toolCallCount: number;\n readonly usage: TokenUsageSummary | undefined;\n}): StreamSummary {\n return {\n ...(input.aiGatewayLogId !== undefined\n ? { aiGatewayLogId: input.aiGatewayLogId }\n : {}),\n ...(input.finishReason !== undefined\n ? { finishReason: input.finishReason }\n : {}),\n ...(input.outputMessages !== undefined\n ? { outputMessages: input.outputMessages }\n : {}),\n ...(input.response ? { response: input.response } : {}),\n ...(input.timeToFirstChunkSeconds !== undefined\n ? { timeToFirstChunkSeconds: input.timeToFirstChunkSeconds }\n : {}),\n ...(input.toolCallCount > 0 ? { toolCallCount: input.toolCallCount } : {}),\n ...(input.usage ? { usage: input.usage } : {})\n };\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"pipeThrough\" in value &&\n typeof value.pipeThrough === \"function\" &&\n \"getReader\" in value &&\n typeof value.getReader === \"function\"\n );\n}\n\nfunction isToolCallChunk(chunk: unknown): boolean {\n return (\n typeof chunk === \"object\" &&\n chunk !== null &&\n (chunk as Record<string, unknown>).type === \"tool-call\"\n );\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof value[Symbol.asyncIterator] === \"function\"\n );\n}\n","import { aiGatewayLogAttributes, modelCallSpan } from \"../../genai/telemetry\";\nimport type { SemanticContext } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\nimport {\n captureAIGatewayLogFromModel,\n extractAIGatewayLogId\n} from \"../ai-gateway\";\nimport { inputMessageAttributes, outputMessageAttributes } from \"../content\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport type { AISDKWrapLanguageModel } from \"./types\";\n\nexport function wrapModel(\n tracer: AgentTracer,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n model: unknown,\n parentOperation: string,\n storeMessages: boolean,\n context: SemanticContext,\n boundToInvocation = false\n): unknown {\n if (!wrapLanguageModel) {\n return model;\n }\n\n // Gateway-style string model ids can't take middleware; leave them to the\n // SDK's own resolution (the operation root span still carries the model).\n if (typeof model !== \"object\" || model === null) {\n return model;\n }\n\n const modelInfo = extractModelInfo(model);\n const aiGatewayLog = captureAIGatewayLogFromModel(model, modelInfo?.provider);\n return wrapLanguageModel({\n model: aiGatewayLog.model,\n middleware: {\n wrapGenerate: async ({ doGenerate, params }) => {\n const span = modelCallSpanForModel(\n \"doGenerate\",\n modelInfo,\n params,\n parentOperation,\n storeMessages,\n context\n );\n return tracer.withSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const result = await doGenerate();\n modelCall.finish({\n ...finishAttributesFromResult(result, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeResponse: true\n }),\n ...outputMessageAttributes(result, storeMessages)\n });\n return result;\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n throw cause;\n }\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n },\n wrapStream: async ({ doStream, params }) => {\n const span = modelCallSpanForModel(\n \"doStream\",\n modelInfo,\n params,\n parentOperation,\n storeMessages,\n context\n );\n // The provider call runs INSIDE the activation callback so its work\n // (fetch subrequests, etc.) nests under the chat span; the span stays\n // caller-owned because the stream outlives the callback.\n return tracer.openSpan(\n span.name,\n span.attributes,\n async (modelCall) => {\n aiGatewayLog.reset();\n try {\n const startedAtMs = Date.now();\n const result = await doStream();\n return finishWhenStreamCompletes(result, modelCall, {\n aiGatewayLogId:\n extractAIGatewayLogId(result) ?? aiGatewayLog.get(),\n includeAIGatewayLog: true,\n includeResponse: true,\n storeMessages,\n startedAtMs\n });\n } catch (cause: unknown) {\n recordAIGatewayLogOnError(modelCall, cause, aiGatewayLog.get());\n modelCall.fail(cause);\n throw cause;\n }\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n }\n }\n });\n}\n\nfunction recordAIGatewayLogOnError(\n span: AgentSpan,\n cause: unknown,\n capturedLogId: string | undefined\n): void {\n writeSpanAttributes(\n span,\n aiGatewayLogAttributes(extractAIGatewayLogId(cause) ?? capturedLogId)\n );\n}\n\nfunction modelCallSpanForModel(\n operation: string,\n model: ModelInfo | undefined,\n params: unknown,\n parentOperation: string,\n storeMessages: boolean,\n context: SemanticContext\n): ReturnType<typeof modelCallSpan> {\n const record =\n typeof params === \"object\" && params !== null\n ? (params as Record<string, unknown>)\n : {};\n const span = modelCallSpan({\n context,\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(record, parentOperation)\n });\n return {\n ...span,\n attributes: {\n ...span.attributes,\n ...inputMessageAttributes(record, storeMessages)\n }\n };\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { toolApprovalSpan, toolCallSpan } from \"../../genai/telemetry\";\nimport type { SemanticContext } from \"../../genai/telemetry\";\nimport { toolInputAttributes, toolOutputAttributes } from \"../content\";\nimport { readString } from \"../read\";\nimport type { AgentSpan, AgentTracer } from \"../../tracing/tracer\";\n\n/** Context snapshot type returned by AsyncLocalStorage.snapshot(). */\ntype ContextSnapshot = <R>(fn: () => R) => R;\n\nexport function wrapTools(\n tracer: AgentTracer,\n tools: unknown,\n storeTools: boolean,\n context: SemanticContext,\n boundToInvocation = false,\n approvedToolCalls?: Map<string, string>\n): unknown {\n if (typeof tools !== \"object\" || tools === null) {\n return tools;\n }\n\n // SAFETY: AI SDK tools are a record of named tool objects.\n const toolRecord = tools as Record<string, unknown>;\n const wrappedTools: Record<string, unknown> = {};\n for (const [toolName, tool] of Object.entries(toolRecord)) {\n wrappedTools[toolName] = wrapTool(\n tracer,\n toolName,\n tool,\n storeTools,\n context,\n boundToInvocation,\n approvedToolCalls\n );\n }\n return wrappedTools;\n}\n\nfunction wrapTool(\n tracer: AgentTracer,\n toolName: string,\n tool: unknown,\n storeTools: boolean,\n context: SemanticContext,\n boundToInvocation: boolean,\n approvedToolCalls: Map<string, string> | undefined\n): unknown {\n if (typeof tool !== \"object\" || tool === null) {\n return tool;\n }\n\n // SAFETY: AI SDK tool objects have optional execute / needsApproval fields.\n const toolRecord = tool as Record<string, unknown>;\n const hasExecute = typeof toolRecord.execute === \"function\";\n const hasApproval =\n typeof toolRecord.needsApproval === \"boolean\" ||\n typeof toolRecord.needsApproval === \"function\";\n if (!hasExecute && !hasApproval) {\n return tool;\n }\n\n const wrappedTool = Object.assign(\n Object.create(Object.getPrototypeOf(tool)),\n tool\n ) as Record<string, unknown> & {\n execute: (...args: readonly unknown[]) => unknown;\n };\n if (hasApproval) {\n wrapApprovalCheck(\n tracer,\n wrappedTool,\n toolRecord,\n tool,\n toolName,\n context,\n boundToInvocation\n );\n }\n if (!hasExecute) {\n return wrappedTool;\n }\n\n const execute = toolRecord.execute;\n if (typeof execute !== \"function\") {\n return wrappedTool;\n }\n const originalExecute = execute.bind(tool) as (\n ...args: readonly unknown[]\n ) => unknown;\n\n wrappedTool.execute = (...args) => {\n const span = toolCallSpan({\n context,\n operation: \"tool.execute\",\n toolCallId: extractToolCallId(args[1]),\n toolName\n });\n const attributes = {\n ...span.attributes,\n ...toolInputAttributes(args[0], storeTools)\n };\n // The span may outlive this call frame (streaming tools yield after\n // returning), so the wrapper owns the span lifetime via openSpan.\n return tracer.openSpan(\n span.name,\n attributes,\n (toolSpan) => {\n // Captured inside the activation so generator bodies (which resume at\n // the consumer's next() call sites) can be re-entered into the tool\n // span's async context.\n const inSpanContext = AsyncLocalStorage.snapshot() as ContextSnapshot;\n const toolCallId = extractToolCallId(args[1]);\n const approval = approvalResponseForOptions(args[1], toolCallId);\n if (\n approval?.approved === true ||\n (toolCallId !== undefined &&\n approvedToolCalls?.get(toolCallId) === toolName)\n ) {\n recordApprovalChild(\n tracer,\n toolName,\n toolCallId,\n \"approved\",\n context,\n boundToInvocation\n );\n if (toolCallId !== undefined) approvedToolCalls?.delete(toolCallId);\n }\n const result = originalExecute(...args);\n\n if (isPromiseLike(result)) {\n return Promise.resolve(result).then(\n (resolved) =>\n settleToolResult(resolved, toolSpan, inSpanContext, storeTools),\n (cause: unknown) => {\n toolSpan.fail(cause);\n throw cause;\n }\n );\n }\n\n return settleToolResult(result, toolSpan, inSpanContext, storeTools);\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n\n return wrappedTool;\n}\n\nfunction wrapApprovalCheck(\n tracer: AgentTracer,\n wrappedTool: Record<string, unknown>,\n toolRecord: Record<string, unknown>,\n tool: object,\n toolName: string,\n context: SemanticContext,\n boundToInvocation: boolean\n): void {\n const approval = toolRecord.needsApproval;\n const original =\n typeof approval === \"function\"\n ? (approval.bind(tool) as (...args: readonly unknown[]) => unknown)\n : undefined;\n\n wrappedTool.needsApproval = (...args: readonly unknown[]) => {\n const result = original ? original(...args) : approval;\n const recordRequested = (needed: unknown): unknown => {\n const toolCallId = extractToolCallId(args[1]);\n if (needed === true && !hasApprovalResponse(args[1], toolCallId)) {\n recordApprovalSegment(\n tracer,\n toolName,\n toolCallId,\n \"requested\",\n context,\n boundToInvocation\n );\n }\n return needed;\n };\n\n return isPromiseLike(result)\n ? Promise.resolve(result).then(recordRequested)\n : recordRequested(result);\n };\n}\n\n/** Instruments AI SDK v7's top-level tool approval policy. */\nexport function wrapToolApprovalPolicy(\n tracer: AgentTracer,\n policy: unknown,\n approvedToolCalls: Map<string, string>,\n context: SemanticContext,\n boundToInvocation = false\n): unknown {\n if (typeof policy === \"function\") {\n return (...args: readonly unknown[]) => {\n const options = recordValue(args[0]);\n const toolCall = recordValue(options?.toolCall);\n return observePolicyResult(\n policy(...args),\n readString(toolCall?.toolName) ?? \"tool\",\n readString(toolCall?.toolCallId),\n tracer,\n approvedToolCalls,\n context,\n boundToInvocation\n );\n };\n }\n if (typeof policy !== \"object\" || policy === null) return policy;\n\n return Object.fromEntries(\n Object.entries(policy as Record<string, unknown>).map(\n ([toolName, setting]) => [\n toolName,\n (...args: readonly unknown[]) =>\n observePolicyResult(\n typeof setting === \"function\" ? setting(...args) : setting,\n toolName,\n extractToolCallId(args[1]),\n tracer,\n approvedToolCalls,\n context,\n boundToInvocation\n )\n ]\n )\n );\n}\n\nfunction observePolicyResult(\n result: unknown,\n toolName: string,\n toolCallId: string | undefined,\n tracer: AgentTracer,\n approvedToolCalls: Map<string, string>,\n context: SemanticContext,\n boundToInvocation = false\n): unknown {\n const observe = (status: unknown): unknown => {\n if (toolCallId === undefined) return status;\n const type =\n typeof status === \"string\"\n ? status\n : readString(recordValue(status)?.type);\n if (type === \"approved\") {\n approvedToolCalls.set(toolCallId, toolName);\n } else if (type === \"user-approval\" || type === \"denied\") {\n recordApprovalSegment(\n tracer,\n toolName,\n toolCallId,\n type === \"denied\" ? \"denied\" : \"requested\",\n context,\n boundToInvocation\n );\n }\n return status;\n };\n return isPromiseLike(result)\n ? Promise.resolve(result).then(observe)\n : observe(result);\n}\n\n/** Records denied responses, whose tool never reaches execute(). */\nexport function recordDeniedApprovalResponses(\n tracer: AgentTracer,\n messages: unknown,\n context: SemanticContext\n): void {\n for (const response of approvalResponses(messages)) {\n if (!response.approved) {\n recordApprovalSegment(\n tracer,\n response.toolName,\n response.toolCallId,\n \"denied\",\n context\n );\n }\n }\n}\n\nfunction recordApprovalSegment(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\",\n context: SemanticContext,\n boundToInvocation = false\n): void {\n const tool = toolCallSpan({\n context,\n operation: \"tool.approval\",\n toolCallId,\n toolName\n });\n tracer.withSpan(\n tool.name,\n tool.attributes,\n () => {\n recordApprovalChild(\n tracer,\n toolName,\n toolCallId,\n state,\n context,\n boundToInvocation\n );\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n}\n\nfunction recordApprovalChild(\n tracer: AgentTracer,\n toolName: string,\n toolCallId: string | undefined,\n state: \"approved\" | \"denied\" | \"requested\",\n context: SemanticContext,\n boundToInvocation = false\n): void {\n const approval = toolApprovalSpan({\n context,\n state,\n toolCallId,\n toolName\n });\n tracer.withSpan(\n approval.name,\n approval.attributes,\n () => undefined,\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n}\n\nfunction hasApprovalResponse(\n options: unknown,\n toolCallId: string | undefined\n): boolean {\n return approvalResponseForOptions(options, toolCallId) !== undefined;\n}\n\nfunction approvalResponseForOptions(\n options: unknown,\n toolCallId: string | undefined\n): ReturnType<typeof approvalResponses>[number] | undefined {\n if (\n toolCallId === undefined ||\n typeof options !== \"object\" ||\n options === null\n ) {\n return undefined;\n }\n return approvalResponses((options as Record<string, unknown>).messages).find(\n (response) => response.toolCallId === toolCallId\n );\n}\n\nfunction approvalResponses(messagesValue: unknown): Array<{\n readonly approved: boolean;\n readonly toolCallId: string;\n readonly toolName: string;\n}> {\n if (!Array.isArray(messagesValue)) {\n return [];\n }\n\n const approvalToTool = new Map<string, string>();\n const toolNames = new Map<string, string>();\n for (const message of messagesValue) {\n if (typeof message !== \"object\" || message === null) continue;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n const type = readString(record.type);\n if (type === \"tool-call\") {\n const toolCallId = readString(record.toolCallId);\n const toolName = readString(record.toolName);\n if (toolCallId && toolName) toolNames.set(toolCallId, toolName);\n } else if (type === \"tool-approval-request\") {\n const approvalId = readString(record.approvalId);\n const toolCallId = readString(record.toolCallId);\n if (approvalId && toolCallId)\n approvalToTool.set(approvalId, toolCallId);\n }\n }\n }\n\n const lastMessage = messagesValue.at(-1);\n const lastContent =\n typeof lastMessage === \"object\" && lastMessage !== null\n ? (lastMessage as Record<string, unknown>).content\n : undefined;\n const decisions: Array<{\n readonly approvalId: string;\n readonly approved: boolean;\n }> = [];\n if (Array.isArray(lastContent)) {\n for (const part of lastContent) {\n if (typeof part !== \"object\" || part === null) continue;\n const record = part as Record<string, unknown>;\n if (record.type !== \"tool-approval-response\") continue;\n const approvalId = readString(record.approvalId);\n if (approvalId && typeof record.approved === \"boolean\") {\n decisions.push({ approvalId, approved: record.approved });\n }\n }\n }\n\n return decisions.flatMap(({ approvalId, approved }) => {\n const toolCallId = approvalToTool.get(approvalId);\n if (!toolCallId) return [];\n return [\n {\n approved,\n toolCallId,\n toolName: toolNames.get(toolCallId) ?? \"tool\"\n }\n ];\n });\n}\n\n/**\n * Finishes the tool span for a settled result. Streaming tools (async\n * generators) return an iterable whose consumption is the tool's real\n * duration, so the span closes when iteration ends instead of at creation.\n */\nfunction settleToolResult(\n result: unknown,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): unknown {\n if (isAsyncIterable(result)) {\n return finishWhenIterableCompletes(result, span, inSpanContext, storeTools);\n }\n\n span.finish(toolOutputAttributes(result, storeTools));\n return result;\n}\n\nfunction finishWhenIterableCompletes(\n iterable: AsyncIterable<unknown>,\n span: AgentSpan,\n inSpanContext: ContextSnapshot,\n storeTools: boolean\n): AsyncIterable<unknown> {\n return {\n async *[Symbol.asyncIterator]() {\n // Each pull re-enters the tool span's captured async context, so the\n // generator body (which otherwise resumes under the CONSUMER's context)\n // runs — and creates any nested spans — under the tool span.\n const iterator = inSpanContext(() => iterable[Symbol.asyncIterator]());\n let exhausted = false;\n let returnValue: unknown;\n try {\n while (true) {\n const step = await inSpanContext(() => iterator.next());\n if (step.done) {\n exhausted = true;\n returnValue = step.value;\n return step.value;\n }\n yield step.value;\n }\n } catch (cause: unknown) {\n span.fail(cause);\n throw cause;\n } finally {\n if (!exhausted) {\n // Early consumer termination (break/cancel while suspended at\n // yield): forward return() so the tool generator's own finally\n // blocks run, still inside the tool span's context. A no-op when\n // the underlying iterator already settled (e.g. next() threw).\n try {\n await inSpanContext(() => iterator.return?.(undefined));\n } catch {\n // Cleanup failures must not mask the consumer's exit reason.\n }\n }\n // Covers normal completion and early consumer return; a no-op after\n // fail() since span closure is idempotent.\n span.finish(toolOutputAttributes(returnValue, storeTools));\n }\n }\n };\n}\n\n/** Reads the AI SDK tool-call id from the execute options argument. */\nfunction extractToolCallId(options: unknown): string | undefined {\n if (typeof options !== \"object\" || options === null) {\n return undefined;\n }\n\n // SAFETY: AI SDK tool execute options carry a toolCallId string field.\n return readString((options as Record<string, unknown>).toolCallId);\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof (value as Record<PropertyKey, unknown>)[Symbol.asyncIterator] ===\n \"function\"\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n value !== null &&\n value !== undefined &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n","import { __DO_NOT_USE_WILL_BREAK__agentContext as agentContext } from \"../../../internal_context\";\nimport type {\n AISDKInstrumentationOptions,\n ResolvedAISDKStorageOptions\n} from \"../options\";\nimport { readString } from \"../read\";\nimport { TraceAttribute } from \"../../genai/attributes\";\nimport {\n metadataAttributes,\n operationSpan,\n operationSpanName\n} from \"../../genai/telemetry\";\nimport type { SemanticContext } from \"../../genai/telemetry\";\nimport { writeSpanAttributes } from \"../../tracing/tracer\";\nimport type { TraceAttributes } from \"../../tracing/tracer\";\nimport type { AgentTracer } from \"../../tracing/tracer\";\nimport {\n extractModelInfo,\n extractRequestSummary,\n finishAttributesFromResult\n} from \"./extract\";\nimport type { ModelInfo } from \"./extract\";\nimport { wrapModel } from \"./model\";\nimport { finishWhenStreamCompletes } from \"./streams\";\nimport {\n recordDeniedApprovalResponses,\n wrapToolApprovalPolicy,\n wrapTools\n} from \"./tools\";\nimport type {\n AISDKCallParams,\n AISDKOperation,\n AISDKWrapLanguageModel\n} from \"./types\";\n\ntype AISDKOperationName =\n | \"generateObject\"\n | \"generateText\"\n | \"streamObject\"\n | \"streamText\";\n\nexport type { AISDKNamespace } from \"./types\";\n\n/** Tracing configuration for the AI SDK compatibility wrapper. */\nexport type AISDKWrapperInstrumentation = {\n readonly options?: AISDKInstrumentationOptions;\n readonly tracer: AgentTracer;\n};\n\n/**\n * Wraps an AI SDK namespace object with tracing while preserving its public\n * shape and overloaded call signatures across supported majors.\n */\nexport function createAISDKWrapper<T extends Record<string, unknown>>(\n ai: T,\n instrumentation: AISDKWrapperInstrumentation\n): T {\n const target = isModuleNamespace(ai) ? Object.setPrototypeOf({}, ai) : ai;\n // Cache wrappers so repeated property reads return the same function\n // (memoization patterns like `wrapped.streamText === wrapped.streamText`).\n const wrapperCache = new Map<PropertyKey, AISDKOperation>();\n\n return new Proxy(target, {\n get(proxyTarget, property, receiver) {\n const original = Reflect.get(proxyTarget, property, receiver) as unknown;\n\n if (isWrappedOperationName(property) && typeof original === \"function\") {\n let wrapper = wrapperCache.get(property);\n if (!wrapper) {\n wrapper = createOperationWrapper(\n property,\n toAISDKOperation(original),\n readWrapLanguageModel(ai),\n instrumentation\n );\n wrapperCache.set(property, wrapper);\n }\n return wrapper;\n }\n\n return original;\n }\n }) as T;\n}\n\nfunction readWrapLanguageModel(\n ai: Record<string, unknown>\n): AISDKWrapLanguageModel | undefined {\n const value = ai.wrapLanguageModel;\n if (typeof value !== \"function\") {\n return undefined;\n }\n\n // SAFETY: This is a vendored structural contract shared by the supported AI\n // SDK majors; the public wrapper preserves the caller's installed SDK type.\n return value as AISDKWrapLanguageModel;\n}\n\nfunction toAISDKOperation(value: unknown): AISDKOperation {\n // SAFETY: The proxy only calls this after selecting known AI SDK operation\n // export names. The wrapper uses the narrow params fields it reads/replaces.\n return value as AISDKOperation;\n}\n\nfunction isModuleNamespace(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n if (value.constructor?.name === \"Module\") {\n return true;\n }\n\n try {\n const keys = Object.keys(value);\n const firstKey = keys[0];\n if (firstKey === undefined) {\n return false;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(value, firstKey);\n return descriptor\n ? !descriptor.configurable && !descriptor.writable\n : false;\n } catch {\n return false;\n }\n}\n\nfunction createOperationWrapper(\n operationName: AISDKOperationName,\n operation: AISDKOperation,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n instrumentation: AISDKWrapperInstrumentation\n): AISDKOperation {\n const storage: ResolvedAISDKStorageOptions = {\n storeMessages: instrumentation.options?.storeMessages === true,\n storeTools: instrumentation.options?.storeTools === true\n };\n\n // Only the span NAME is computed before the sampling check (it is required\n // to open a span at all, and needs a single metadata property the SDK reads\n // anyway). The full attribute spec — metadata enumeration, request fields,\n // context allowlists — is computed lazily, after isTraced confirms someone\n // is listening, so untraced calls never touch caller getters beyond that.\n if (isStreamOperation(operationName)) {\n return (params, ...args) => {\n const boundToInvocation = isAISDKInvocationBounded(params);\n return instrumentation.tracer.openSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n (operationSpan) => {\n // Untraced invocations take the pristine path: original params, no\n // tool wrapping, no model middleware, no stream patching.\n if (!operationSpan.isTraced) {\n operationSpan.finish();\n return operation(params, ...args);\n }\n\n const context = semanticContext(params);\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(\n instrumentation.tracer,\n params.messages,\n context\n );\n\n const startedAtMs = Date.now();\n const result = operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage,\n context,\n boundToInvocation\n ),\n ...args\n );\n const hasModelSpan = canWrapModel(wrapLanguageModel, params.model);\n\n return finishWhenStreamCompletes(result, operationSpan, {\n includeResponse: !hasModelSpan,\n startedAtMs: hasModelSpan ? undefined : startedAtMs\n });\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n }\n\n return async (params, ...args) => {\n const boundToInvocation = isAISDKInvocationBounded(params);\n return instrumentation.tracer.withSpan(\n operationSpanName(agentNameForCall(params)),\n {},\n async (operationSpan) => {\n if (!operationSpan.isTraced) {\n return operation(params, ...args);\n }\n\n const context = semanticContext(params);\n const span = operationSpanForCall(\n operationName,\n extractModelInfo(params.model),\n params,\n instrumentation.options\n );\n writeSpanAttributes(operationSpan, span.attributes);\n recordDeniedApprovalResponses(\n instrumentation.tracer,\n params.messages,\n context\n );\n\n const result = await operation(\n operationParamsForCall(\n params,\n operationName,\n wrapLanguageModel,\n instrumentation.tracer,\n storage,\n context,\n boundToInvocation\n ),\n ...args\n );\n\n operationSpan.finish(\n finishAttributesFromResult(result, {\n includeResponse: !canWrapModel(wrapLanguageModel, params.model)\n })\n );\n return result;\n },\n boundToInvocation ? { boundToInvocation: true } : undefined\n );\n };\n}\n\n/**\n * Reads only the agent name for the span name, from the same sources and in\n * the same order as {@link semanticContext}, so the span name and\n * `gen_ai.agent.name` never disagree. `functionId` is the AI SDK's canonical\n * projection; an explicit name from v6 metadata or v7 runtime context wins.\n */\nfunction agentNameForCall(params: AISDKCallParams): string | undefined {\n const telemetry = telemetryOptions(params);\n const metadata = telemetryMetadata(params);\n const runtimeContext = runtimeContextRecord(params);\n\n return (\n metadataValue(metadata, \"agentName\", \"gen_ai.agent.name\") ??\n metadataValue(runtimeContext, \"agentName\", \"gen_ai.agent.name\") ??\n readString(telemetry?.functionId)\n );\n}\n\nfunction operationParamsForCall(\n params: AISDKCallParams,\n operationName: AISDKOperationName,\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n tracer: AgentTracer,\n storage: ResolvedAISDKStorageOptions,\n context: SemanticContext,\n boundToInvocation = false\n): AISDKCallParams {\n const approvedToolCalls = new Map<string, string>();\n return {\n ...params,\n ...(shouldWrapTools(operationName) && params.tools !== undefined\n ? {\n tools: wrapTools(\n tracer,\n params.tools,\n storage.storeTools,\n context,\n boundToInvocation,\n approvedToolCalls\n )\n }\n : {}),\n ...(params.toolApproval !== undefined\n ? {\n toolApproval: wrapToolApprovalPolicy(\n tracer,\n params.toolApproval,\n approvedToolCalls,\n context,\n boundToInvocation\n )\n }\n : {}),\n ...(params.model !== undefined\n ? {\n model: wrapModel(\n tracer,\n wrapLanguageModel,\n params.model,\n operationName,\n storage.storeMessages,\n context,\n boundToInvocation\n )\n }\n : {})\n };\n}\n\nfunction canWrapModel(\n wrapLanguageModel: AISDKWrapLanguageModel | undefined,\n model: unknown\n): boolean {\n return (\n wrapLanguageModel !== undefined &&\n typeof model === \"object\" &&\n model !== null\n );\n}\n\nfunction isStreamOperation(operationName: AISDKOperationName): boolean {\n return operationName === \"streamObject\" || operationName === \"streamText\";\n}\n\nfunction shouldWrapTools(operationName: AISDKOperationName): boolean {\n return operationName === \"generateText\" || operationName === \"streamText\";\n}\n\nfunction isWrappedOperationName(\n value: PropertyKey\n): value is AISDKOperationName {\n return (\n value === \"generateObject\" ||\n value === \"generateText\" ||\n value === \"streamObject\" ||\n value === \"streamText\"\n );\n}\n\nfunction operationSpanForCall(\n operation: string,\n model: ModelInfo | undefined,\n params: AISDKCallParams,\n options: AISDKInstrumentationOptions | undefined\n): ReturnType<typeof operationSpan> {\n return operationSpan({\n attributes: {\n ...metadataAttributes(\n includedRuntimeContext(params),\n TraceAttribute.Cloudflare.RuntimeContextPrefix\n ),\n ...metadataAttributes(telemetryMetadata(params)),\n ...contextAttributes(params, options)\n },\n context: semanticContext(params),\n model: model?.modelId,\n operation,\n provider: model?.provider,\n request: extractRequestSummary(params, operation)\n });\n}\n\n/** Reads the per-call `experimental_telemetry.metadata` record, if present. */\nfunction telemetryMetadata(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const telemetry = telemetryOptions(params);\n\n return typeof telemetry?.metadata === \"object\" && telemetry.metadata !== null\n ? (telemetry.metadata as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * The caller's application-data channel: `runtimeContext` on v7, the\n * `experimental_context` it replaced on v6. Read through one accessor so the\n * two majors cannot drift on which one identity and metadata come from.\n */\nfunction runtimeContextRecord(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const value = params.runtimeContext ?? params.experimental_context;\n\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction telemetryOptions(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const telemetryValue = params.telemetry ?? params.experimental_telemetry;\n\n return typeof telemetryValue === \"object\" && telemetryValue !== null\n ? (telemetryValue as Record<string, unknown>)\n : undefined;\n}\n\n/**\n * The v7 stand-in for `experimental_telemetry.metadata`.\n *\n * v7 dropped `metadata` from its telemetry options; callers put the same\n * values in `runtimeContext` and mark the telemetry-visible ones through the\n * SDK's own `telemetry.includeRuntimeContext`. Running the included subset\n * through {@link metadataAttributes} is what keeps reserved keys — Think's\n * `cloudflare.agents.turn.*` above all — on the attribute names v6 emits, so\n * a query written against v6 traces still matches v7 ones. Everything else\n * passes through as documented, under `cloudflare.agents.runtime_context.*`.\n *\n * Runtime context the caller did not mark as included stays off the span as a\n * passthrough attribute: on v7 this is a general application-data channel, not\n * a telemetry bag. Identity (`agentId`, `agentName`, `agentVersion`,\n * `conversationId`) is separate — {@link semanticContext} reads it regardless,\n * because it names the operation rather than describing it, and v7 left\n * callers nowhere else to put it.\n */\nfunction includedRuntimeContext(\n params: AISDKCallParams\n): Record<string, unknown> | undefined {\n const runtimeContext = runtimeContextRecord(params);\n if (runtimeContext === undefined) {\n return undefined;\n }\n\n const included = includedContextKeys(telemetryOptions(params));\n if (included === undefined) {\n return undefined;\n }\n\n const projected: Record<string, unknown> = {};\n for (const key of included) {\n if (Object.hasOwn(runtimeContext, key)) {\n projected[key] = runtimeContext[key];\n }\n }\n\n return projected;\n}\n\n/**\n * The keys a caller marked as telemetry-visible.\n *\n * The SDK's own shape is `{ [key]: boolean }`, included only when explicitly\n * true; a plain array of key names is accepted too, since that is the shape of\n * the wrapper's option of the same name and silently ignoring it would be\n * worse than honouring it. There is deliberately no \"include everything\"\n * shorthand — runtime context routinely carries credentials and user data that\n * no one asked to put on a span.\n */\nfunction includedContextKeys(\n telemetry: Record<string, unknown> | undefined\n): string[] | undefined {\n const included = telemetry?.includeRuntimeContext;\n if (Array.isArray(included)) {\n return included.filter((key): key is string => typeof key === \"string\");\n }\n if (typeof included !== \"object\" || included === null) {\n return undefined;\n }\n\n return Object.entries(included as Record<string, unknown>)\n .filter(([, enabled]) => enabled === true)\n .map(([key]) => key);\n}\n\n/**\n * Whether the caller explicitly opted a key OUT. Identity is read from runtime\n * context without an opt-in — on v7 there is nowhere else to put it, and\n * requiring one would silently cost every caller `gen_ai.agent.id` — but an\n * explicit `false` is a stated intention and is honoured.\n */\nfunction isExcludedFromContext(params: AISDKCallParams, key: string): boolean {\n const included = telemetryOptions(params)?.includeRuntimeContext;\n\n return (\n typeof included === \"object\" &&\n included !== null &&\n !Array.isArray(included) &&\n (included as Record<string, unknown>)[key] === false\n );\n}\n\n/**\n * Reads agent/conversation semantic context from the AI SDK's own telemetry\n * fields. The AI SDK maps `functionId` to `gen_ai.agent.name`; an explicit\n * name takes priority. Each field comes from v6 `telemetry.metadata` or, on\n * v7 where that option no longer exists, from `runtimeContext`.\n */\nfunction semanticContext(params: AISDKCallParams): SemanticContext {\n const telemetry = telemetryOptions(params);\n const metadata = telemetryMetadata(params);\n const runtimeContext = runtimeContextRecord(params);\n\n const fromContext = (key: string, semanticKey: string) =>\n isExcludedFromContext(params, key)\n ? undefined\n : metadataValue(runtimeContext, key, semanticKey);\n\n return {\n agentId:\n metadataValue(metadata, \"agentId\", \"gen_ai.agent.id\") ??\n fromContext(\"agentId\", \"gen_ai.agent.id\"),\n agentName:\n metadataValue(metadata, \"agentName\", \"gen_ai.agent.name\") ??\n fromContext(\"agentName\", \"gen_ai.agent.name\") ??\n readString(telemetry?.functionId),\n agentVersion:\n metadataValue(metadata, \"agentVersion\", \"gen_ai.agent.version\") ??\n fromContext(\"agentVersion\", \"gen_ai.agent.version\"),\n conversationId:\n metadataValue(metadata, \"conversationId\", \"gen_ai.conversation.id\") ??\n fromContext(\"conversationId\", \"gen_ai.conversation.id\")\n };\n}\n\nfunction metadataValue(\n metadata: Record<string, unknown> | undefined,\n key: string,\n semanticKey: string\n): string | undefined {\n return readString(metadata?.[key] ?? metadata?.[semanticKey]);\n}\n\n/**\n * The wrapper-level allowlist, set once for the instrumentation rather than\n * per call. It selects from the same context and lands on the same attributes\n * as the SDK's per-call allowlist: selecting a key through both must produce\n * one attribute, not a canonical one and a `runtime_context.*` near-duplicate.\n */\nfunction contextAttributes(\n params: AISDKCallParams,\n options: AISDKInstrumentationOptions | undefined\n): TraceAttributes | undefined {\n const included = options?.includeRuntimeContext;\n if (included === undefined || included.length === 0) {\n return undefined;\n }\n\n const runtimeContext = runtimeContextRecord(params);\n if (runtimeContext === undefined) {\n return undefined;\n }\n\n const projected: Record<string, unknown> = {};\n for (const key of included) {\n if (Object.hasOwn(runtimeContext, key)) {\n projected[key] = runtimeContext[key];\n }\n }\n\n return metadataAttributes(\n projected,\n TraceAttribute.Cloudflare.RuntimeContextPrefix\n );\n}\n\nconst invocationBounded = Symbol.for(\n \"cloudflare.agents.ai-sdk.invocation-bounded\"\n);\n\nfunction isAISDKInvocationBounded(params: AISDKCallParams): boolean {\n return (\n (params as Record<PropertyKey, unknown>)[invocationBounded] === true ||\n agentContext.getStore()?.connection !== undefined\n );\n}\n","import type { AISDKInstrumentationOptions } from \"./options\";\nimport { createAISDKWrapper } from \"./wrapper/wrap\";\nimport { tracer } from \"../tracing/cloudflare\";\n\n/**\n * Wraps an AI SDK namespace with tracing.\n */\nexport function wrapAISDK<T extends Record<string, unknown>>(\n ai: T,\n options: AISDKInstrumentationOptions = {}\n): T {\n return createAISDKWrapper(ai, {\n options,\n tracer\n });\n}\n\nexport type {\n AISDKInstrumentationOptions,\n AISDKStorageOptions\n} from \"./options\";\n"],"mappings":"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"}
|