@yolk-sdk/agent 0.1.0-canary.52 → 0.1.0-canary.54

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 CHANGED
@@ -124,6 +124,11 @@ Codex rejects vendor `max_output_tokens`, so the Codex adapter retains the requi
124
124
  omits that field from requests. `OpenAiProviderLayer` reads both `OPENAI_API_KEY` and integer
125
125
  `OPENAI_MAX_COMPLETION_TOKENS` through Effect Config.
126
126
 
127
+ Set optional `reasoningEffort` on `run` or `runRuntime`; provider adapters lower it to vendor
128
+ configuration. Anthropic Claude forwards `low`, `medium`, `high`, and `xhigh` through
129
+ `output_config.effort`. It omits `minimal`, which Anthropic does not support. Hosts remain
130
+ responsible for choosing an effort accepted by the selected provider and model.
131
+
127
132
  ## Provider failures and retries
128
133
 
129
134
  Provider adapters classify safe failure metadata at the boundary. The loop owns bounded retry
@@ -286,6 +291,13 @@ const projection = events.reduce(
286
291
  Use `applyAgentEventToChatMessages` only for ephemeral local streams where append-only deltas cannot
287
292
  replay.
288
293
 
294
+ ## Parallel tool calls
295
+
296
+ OpenAI and OpenAI Codex requests enable vendor parallel tool calls when tools are available. The
297
+ Codex stream adapter preserves every sibling function call and suppresses final-response replays
298
+ by call id. The loop executes calls emitted in the same model turn concurrently, bounded by the
299
+ host-configured `LoopConfig.toolConcurrency`; dependent work waits for the next model turn.
300
+
289
301
  ## Transcript invariants
290
302
 
291
303
  Every assistant host tool call must be followed by a matching `ToolResultMessage` before the next
@@ -389,7 +401,9 @@ Recommended setup:
389
401
  - omit `task` from subagent toolsets
390
402
  - include only tools that are safe for autonomous delegated work
391
403
  - use `makeSubagentRunId(call.id)` for protocol-aligned run ids
392
- - return `makeTaskToolResult(...)` so UI can show subagent id, type, status, model, and timing
404
+ - optionally configure model and reasoning-effort choices so the parent can select child runtime settings
405
+ - treat omitted `model` and `reasoning_effort` parameters as inheritance of host runtime settings
406
+ - return `makeTaskToolResult(...)` so UI can show subagent id, type, status, model, reasoning effort, and timing
393
407
 
394
408
  Keep host-owned subagent execution wiring outside this package; pass only the package task contract across the boundary.
395
409
 
@@ -70,6 +70,9 @@ type AnthropicRequestBody = {
70
70
  readonly system: ReadonlyArray<AnthropicSystemBlock>;
71
71
  readonly messages: ReadonlyArray<AnthropicMessage>;
72
72
  readonly max_tokens: number;
73
+ readonly output_config?: {
74
+ readonly effort: 'low' | 'medium' | 'high' | 'xhigh';
75
+ };
73
76
  readonly stream?: true;
74
77
  readonly tools?: ReadonlyArray<AnthropicTool>;
75
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"claude-provider.d.mts","names":[],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"mappings":";;;;;;KAoDY,6BAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,WAAA;EAAA,SACA,SAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;AAAA;AAAA,KAG9B,kBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,oBAAA,GAAuB,kBAAkB;AAAA,KAEzC,mBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;AAAA;AAAA,KAIZ,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;EAAA,SAEN,KAAA;AAAA;AAAA,KAGN,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGN,+BAAA,GACD,kBAAA,GACA,mBAAA,GACA,sBAAA;AAAA,KAEC,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA,WAAkB,aAAa,CAAC,+BAAA;EAAA,SAChC,QAAA;AAAA;AAAA,KAGN,kBAAA,GACD,kBAAA,GACA,mBAAA,GACA,sBAAA,GACA,wBAAA;AAAA,KACC,uBAAA,GAA0B,kBAAA,GAAqB,qBAAqB;AAAA,KAEpE,gBAAA;EAAA,SACU,IAAA;EAAA,SAAuB,OAAA,WAAkB,aAAA,CAAc,kBAAA;AAAA;EAAA,SACvD,IAAA;EAAA,SAA4B,OAAA,EAAS,aAAA,CAAc,uBAAA;AAAA;AAAA,KAS7D,aAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGN,oBAAA;EAAA,SACM,KAAA;EAAA,SACA,MAAA,EAAQ,aAAA,CAAc,oBAAA;EAAA,SACtB,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA,SACxB,UAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,aAAA;AAAA;AAAA,cA4zBpB,4BAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SAAmB,SAAA;EAAA,SAA4B,MAAA;AAAA,MAC9C,MAAA,CAAO,MAAA,CAAO,oBAAA,EAAsB,QAAA;AAAA,cA8lB1B,6BAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cAoGd,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
1
+ {"version":3,"file":"claude-provider.d.mts","names":[],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"mappings":";;;;;;KAoDY,6BAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,WAAA;EAAA,SACA,SAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;AAAA;AAAA,KAG9B,kBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,oBAAA,GAAuB,kBAAkB;AAAA,KAEzC,mBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;AAAA;AAAA,KAIZ,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,MAAA;IAAA,SAEM,IAAA;IAAA,SACA,UAAA;IAAA,SACA,IAAA;EAAA;IAAA,SAGA,IAAA;IAAA,SACA,GAAA;EAAA;EAAA,SAEN,KAAA;AAAA;AAAA,KAGN,qBAAA;EAAA,SACM,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGN,+BAAA,GACD,kBAAA,GACA,mBAAA,GACA,sBAAA;AAAA,KAEC,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA,WAAkB,aAAa,CAAC,+BAAA;EAAA,SAChC,QAAA;AAAA;AAAA,KAGN,kBAAA,GACD,kBAAA,GACA,mBAAA,GACA,sBAAA,GACA,wBAAA;AAAA,KACC,uBAAA,GAA0B,kBAAA,GAAqB,qBAAqB;AAAA,KAEpE,gBAAA;EAAA,SACU,IAAA;EAAA,SAAuB,OAAA,WAAkB,aAAA,CAAc,kBAAA;AAAA;EAAA,SACvD,IAAA;EAAA,SAA4B,OAAA,EAAS,aAAA,CAAc,uBAAA;AAAA;AAAA,KAS7D,aAAA;EAAA,SACM,IAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGN,oBAAA;EAAA,SACM,KAAA;EAAA,SACA,MAAA,EAAQ,aAAA,CAAc,oBAAA;EAAA,SACtB,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA,SACxB,UAAA;EAAA,SACA,aAAA;IAAA,SACE,MAAA;EAAA;EAAA,SAEF,MAAA;EAAA,SACA,KAAA,GAAQ,aAAA,CAAc,aAAA;AAAA;AAAA,cA4zBpB,4BAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SAAmB,SAAA;EAAA,SAA4B,MAAA;AAAA,MAC9C,MAAA,CAAO,MAAA,CAAO,oBAAA,EAAsB,QAAA;AAAA,cAmmB1B,6BAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cAoGd,gCAAA,GAAoC,MAAA,EAAQ,6BAAA,KAA6B,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
@@ -478,11 +478,13 @@ const toAnthropicClaudeRequestBody = (request, config) => Effect.gen(function* (
478
478
  const rawMessages = yield* Effect.forEach(request.messages, toAnthropicMessage);
479
479
  const billingSystemBlock = yield* makeAnthropicClaudeBillingSystemBlock(rawMessages);
480
480
  const messages = prependSystemPromptToFirstUserMessage(rawMessages, request.systemPrompt);
481
+ const outputConfig = request.reasoningEffort === void 0 || request.reasoningEffort === "minimal" ? void 0 : { effort: request.reasoningEffort };
481
482
  const baseBody = {
482
483
  model: request.model,
483
484
  system: [billingSystemBlock, anthropicClaudeIdentitySystemBlock],
484
485
  messages,
485
- max_tokens: config.maxTokens
486
+ max_tokens: config.maxTokens,
487
+ ...outputConfig === void 0 ? {} : { output_config: outputConfig }
486
488
  };
487
489
  const body = config.stream === true ? {
488
490
  ...baseBody,
@@ -1 +1 @@
1
- {"version":3,"file":"claude-provider.mjs","names":["LLMTextDelta","LLMReasoningDelta"],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"sourcesContent":["import { Effect, Layer, Option, Ref, Result, Stream } from 'effect'\nimport {\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n ToolCall,\n attachmentSourceText,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type Content,\n type ContentPart,\n type ProviderFailureKind,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMReasoningDelta,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n anthropicClaudeAuthorizationHeaders,\n anthropicClaudeCodeEntrypoint,\n anthropicClaudeCodeVersion,\n anthropicClaudeOAuthUserAgent\n} from './claude.ts'\nimport type { OAuthAccessToken } from '@yolk-sdk/agent/oauth'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\nexport type AnthropicClaudeProviderConfig = {\n readonly token: OAuthAccessToken\n readonly messagesUrl?: string\n readonly maxTokens: number\n readonly extraHeaders?: Readonly<Record<string, string>>\n}\n\ntype AnthropicTextBlock = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype AnthropicSystemBlock = AnthropicTextBlock\n\ntype AnthropicImageBlock = {\n readonly type: 'image'\n readonly source:\n | {\n readonly type: 'base64'\n readonly media_type: string\n readonly data: string\n }\n | {\n readonly type: 'url'\n readonly url: string\n }\n}\n\ntype AnthropicDocumentBlock = {\n readonly type: 'document'\n readonly source:\n | {\n readonly type: 'base64'\n readonly media_type: 'application/pdf'\n readonly data: string\n }\n | {\n readonly type: 'url'\n readonly url: string\n }\n readonly title?: string\n}\n\ntype AnthropicToolUseBlock = {\n readonly type: 'tool_use'\n readonly id: string\n readonly name: string\n readonly input: unknown\n}\n\ntype AnthropicToolResultContentBlock =\n | AnthropicTextBlock\n | AnthropicImageBlock\n | AnthropicDocumentBlock\n\ntype AnthropicToolResultBlock = {\n readonly type: 'tool_result'\n readonly tool_use_id: string\n readonly content: string | ReadonlyArray<AnthropicToolResultContentBlock>\n readonly is_error?: boolean\n}\n\ntype AnthropicUserBlock =\n | AnthropicTextBlock\n | AnthropicImageBlock\n | AnthropicDocumentBlock\n | AnthropicToolResultBlock\ntype AnthropicAssistantBlock = AnthropicTextBlock | AnthropicToolUseBlock\n\ntype AnthropicMessage =\n | { readonly role: 'user'; readonly content: string | ReadonlyArray<AnthropicUserBlock> }\n | { readonly role: 'assistant'; readonly content: ReadonlyArray<AnthropicAssistantBlock> }\n\ntype JsonObject = Readonly<Record<string, unknown>>\ntype TopLevelJsonSchemaCombinatorKey = 'anyOf' | 'oneOf' | 'allOf'\ntype TopLevelJsonSchemaCombinator = {\n readonly key: TopLevelJsonSchemaCombinatorKey\n readonly items: ReadonlyArray<unknown>\n}\n\ntype AnthropicTool = {\n readonly name: string\n readonly description: string\n readonly input_schema: unknown\n}\n\ntype AnthropicRequestBody = {\n readonly model: string\n readonly system: ReadonlyArray<AnthropicSystemBlock>\n readonly messages: ReadonlyArray<AnthropicMessage>\n readonly max_tokens: number\n readonly stream?: true\n readonly tools?: ReadonlyArray<AnthropicTool>\n}\n\ntype AnthropicToolBlockState = {\n readonly id: string\n readonly name: string\n readonly partialJson: string\n}\n\nconst anthropicClaudeSystemIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\"\nconst anthropicClaudeBillingPrefix = 'x-anthropic-billing-header:'\nconst anthropicClaudeToolPrefix = 'mcp_'\nconst anthropicClaudeVersion = '2023-06-01'\nconst anthropicClaudeCchSalt = '59cf53e54c78'\nconst anthropicClaudeCchPositions: ReadonlyArray<number> = [4, 7, 20]\nconst anthropicClaudeEffortBeta = 'effort-2025-11-24'\nconst anthropicClaudeInterleavedThinkingBeta = 'interleaved-thinking-2025-05-14'\nconst anthropicClaudeRequiredBetas: ReadonlyArray<string> = [\n 'claude-code-20250219',\n 'oauth-2025-04-20',\n anthropicClaudeInterleavedThinkingBeta,\n 'prompt-caching-scope-2026-01-05',\n 'context-management-2025-06-27',\n 'advisor-tool-2026-03-01'\n]\nconst anthropicClaudeSystemTextReplacements: ReadonlyArray<{\n readonly match: string\n readonly replacement: string\n}> = [\n {\n match: 'if OpenCode honestly',\n replacement: 'if the assistant honestly'\n },\n {\n match: 'Here is some useful information about the environment you are running in:',\n replacement: 'Environment context you are running in:'\n }\n]\nconst anthropicClaudeStainlessPackageVersion = '0.81.0'\n\n// Claude subscription OAuth is fingerprinted against Claude Code tool names.\nconst prefixClaudeToolName = (name: string) =>\n `${anthropicClaudeToolPrefix}${name.charAt(0).toUpperCase()}${name.slice(1)}`\n\nconst unprefixClaudeToolName = (name: string) => {\n if (!name.startsWith(anthropicClaudeToolPrefix)) {\n return name\n }\n\n const unprefixed = name.slice(anthropicClaudeToolPrefix.length)\n\n if (unprefixed === 'StructuredOutput') {\n return unprefixed\n }\n\n return `${unprefixed.charAt(0).toLowerCase()}${unprefixed.slice(1)}`\n}\n\nconst anthropicClaudeMessagesUrl = 'https://api.anthropic.com/v1/messages?beta=true'\nconst anthropicClaudeIdentitySystemBlock: AnthropicSystemBlock = {\n type: 'text',\n text: anthropicClaudeSystemIdentity\n}\n\nconst randomHex = (byteLength: number) => {\n const crypto = globalThis.crypto\n const bytes = new Uint8Array(byteLength)\n\n if (crypto !== undefined && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(bytes)\n }\n\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('')\n}\n\nconst makeAnthropicClaudeRequestId = () => {\n const crypto = globalThis.crypto\n\n if (crypto !== undefined && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n\n return randomHex(16)\n}\n\nconst sha256Hex = (value: string): Effect.Effect<string, LLMError> => {\n const crypto = globalThis.crypto\n\n if (crypto === undefined || crypto.subtle === undefined) {\n return Effect.fail(\n new LLMError({\n cause: 'provider_error',\n message: 'Web Crypto SHA-256 is required for Anthropic Claude OAuth billing headers',\n retryable: false\n })\n )\n }\n\n return Effect.tryPromise({\n try: () =>\n crypto.subtle\n .digest('SHA-256', new TextEncoder().encode(value))\n .then(buffer =>\n Array.from(new Uint8Array(buffer), byte => byte.toString(16).padStart(2, '0')).join('')\n ),\n catch: error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not compute Anthropic Claude OAuth billing header: ${unknownToMessage(error)}`,\n retryable: false\n })\n })\n}\n\nconst computeAnthropicClaudeCch = (messageText: string) =>\n sha256Hex(messageText).pipe(Effect.map(hash => hash.slice(0, 5)))\n\nconst computeAnthropicClaudeVersionSuffix = (messageText: string) => {\n const chars = anthropicClaudeCchPositions.map(index => messageText[index] ?? '0').join('')\n\n return sha256Hex(`${anthropicClaudeCchSalt}${chars}${anthropicClaudeCodeVersion}`).pipe(\n Effect.map(hash => hash.slice(0, 3))\n )\n}\n\nconst firstUserMessageText = (messages: ReadonlyArray<AnthropicMessage>) => {\n for (const message of messages) {\n if (message.role !== 'user') {\n continue\n }\n\n if (typeof message.content === 'string') {\n return message.content\n }\n\n for (const block of message.content) {\n if (block.type === 'text') {\n return block.text\n }\n }\n }\n\n return ''\n}\n\nconst makeAnthropicClaudeBillingSystemBlock = (\n messages: ReadonlyArray<AnthropicMessage>\n): Effect.Effect<AnthropicSystemBlock, LLMError> => {\n const text = firstUserMessageText(messages)\n\n return Effect.all({\n cch: computeAnthropicClaudeCch(text),\n suffix: computeAnthropicClaudeVersionSuffix(text)\n }).pipe(\n Effect.map(\n ({ cch, suffix }): AnthropicSystemBlock => ({\n type: 'text',\n text:\n `${anthropicClaudeBillingPrefix} ` +\n `cc_version=${anthropicClaudeCodeVersion}.${suffix}; ` +\n `cc_entrypoint=${anthropicClaudeCodeEntrypoint}; ` +\n `cch=${cch};`\n })\n )\n )\n}\n\nconst sanitizeAnthropicClaudeSystemText = (text: string) => {\n let result = text\n\n for (const rule of anthropicClaudeSystemTextReplacements) {\n result = result.split(rule.match).join(rule.replacement)\n }\n\n return result\n}\n\nconst anthropicClaudeBetaHeader = (model: string) => {\n const lowerModel = model.toLowerCase()\n const baseBetas = lowerModel.includes('haiku')\n ? anthropicClaudeRequiredBetas.filter(beta => beta !== anthropicClaudeInterleavedThinkingBeta)\n : anthropicClaudeRequiredBetas\n\n if (\n !lowerModel.includes('haiku') &&\n (lowerModel.includes('4-6') || lowerModel.includes('4-7')) &&\n !baseBetas.includes(anthropicClaudeEffortBeta)\n ) {\n return [...baseBetas, anthropicClaudeEffortBeta].join(',')\n }\n\n return baseBetas.join(',')\n}\n\nconst makeAnthropicClaudeCompatibilityHeaders = (input: {\n readonly model: string\n readonly sessionId: string\n}) => ({\n 'anthropic-beta': anthropicClaudeBetaHeader(input.model),\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'anthropic-version': anthropicClaudeVersion,\n 'user-agent': anthropicClaudeOAuthUserAgent,\n 'x-app': 'cli',\n 'x-client-request-id': makeAnthropicClaudeRequestId(),\n 'X-Claude-Code-Session-Id': input.sessionId,\n 'x-stainless-arch': 'unknown',\n 'x-stainless-lang': 'js',\n 'x-stainless-os': 'unknown',\n 'x-stainless-package-version': anthropicClaudeStainlessPackageVersion,\n 'x-stainless-retry-count': '0',\n 'x-stainless-runtime': 'node',\n 'x-stainless-runtime-version': 'unknown',\n 'x-stainless-timeout': '600'\n})\n\n// Keep app instructions out of `system[]`; Anthropic can reject/limit otherwise.\nconst prependSystemPromptToFirstUserMessage = (\n messages: ReadonlyArray<AnthropicMessage>,\n systemPrompt: string\n): ReadonlyArray<AnthropicMessage> => {\n const sanitizedSystemPrompt = sanitizeAnthropicClaudeSystemText(systemPrompt).trim()\n\n if (sanitizedSystemPrompt.length === 0) {\n return messages\n }\n\n let relocated = false\n\n return messages.map(message => {\n if (relocated || message.role !== 'user') {\n return message\n }\n\n relocated = true\n\n if (typeof message.content === 'string') {\n return { ...message, content: `${sanitizedSystemPrompt}\\n\\n${message.content}` }\n }\n\n return {\n ...message,\n content: [{ type: 'text', text: sanitizedSystemPrompt }, ...message.content]\n }\n })\n}\n\nclass AnthropicTextResponseBlock extends Schema.Class<AnthropicTextResponseBlock>(\n 'AnthropicTextResponseBlock'\n)({\n type: Schema.Literal('text'),\n text: Schema.String\n}) {}\n\nclass AnthropicThinkingResponseBlock extends Schema.Class<AnthropicThinkingResponseBlock>(\n 'AnthropicThinkingResponseBlock'\n)({\n type: Schema.Literal('thinking'),\n thinking: Schema.String\n}) {}\n\nclass AnthropicToolUseResponseBlock extends Schema.Class<AnthropicToolUseResponseBlock>(\n 'AnthropicToolUseResponseBlock'\n)({\n type: Schema.Literal('tool_use'),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown\n}) {}\n\nconst AnthropicContentResponseBlock = Schema.Union([\n AnthropicTextResponseBlock,\n AnthropicThinkingResponseBlock,\n AnthropicToolUseResponseBlock\n])\n\nclass AnthropicUsageResponse extends Schema.Class<AnthropicUsageResponse>('AnthropicUsageResponse')(\n {\n input_tokens: Schema.Number,\n output_tokens: Schema.Number,\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number))\n }\n) {}\n\nclass AnthropicStreamUsageResponse extends Schema.Class<AnthropicStreamUsageResponse>(\n 'AnthropicStreamUsageResponse'\n)({\n input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n output_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number))\n}) {}\n\nclass AnthropicMessageResponse extends Schema.Class<AnthropicMessageResponse>(\n 'AnthropicMessageResponse'\n)({\n content: Schema.Array(AnthropicContentResponseBlock),\n stop_reason: Schema.NullOr(Schema.String),\n usage: Schema.optional(AnthropicUsageResponse)\n}) {}\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the Anthropic Claude provider yet`,\n retryable: false\n })\n\nconst imageToAnthropicBlock = (\n part: Extract<ContentPart, { readonly _tag: 'Image' }>\n): Effect.Effect<AnthropicImageBlock, LLMError> => {\n switch (part.source._tag) {\n case 'InlineBase64':\n return Effect.succeed({\n type: 'image',\n source: {\n type: 'base64',\n media_type: part.mimeType,\n data: part.source.data\n }\n })\n case 'Url':\n return Effect.succeed({\n type: 'image',\n source: {\n type: 'url',\n url: part.source.url\n }\n })\n case 'Ref':\n return Effect.fail(unsupportedContentError('Unresolved image source'))\n }\n}\n\nconst pdfDocumentToAnthropicBlock = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>\n): Effect.Effect<AnthropicDocumentBlock, LLMError> => {\n switch (part.source._tag) {\n case 'InlineBase64':\n return Effect.succeed({\n type: 'document',\n source: {\n type: 'base64',\n media_type: 'application/pdf',\n data: part.source.data\n },\n title: part.title ?? part.filename\n })\n case 'Url':\n return Effect.succeed({\n type: 'document',\n source: {\n type: 'url',\n url: part.source.url\n },\n title: part.title ?? part.filename\n })\n case 'Ref':\n return Effect.fail(unsupportedContentError('Unresolved document source'))\n }\n}\n\nconst textDocumentToAnthropicBlock = (part: Extract<ContentPart, { readonly _tag: 'Document' }>) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text')),\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.fail(unsupportedContentError('Unresolved document source')),\n onSome: text => {\n const block: AnthropicTextBlock = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToAnthropicBlock = (\n part: ContentPart\n): Effect.Effect<AnthropicToolResultContentBlock, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return imageToAnthropicBlock(part)\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToAnthropicBlock(part)\n : part.mimeType === 'application/pdf'\n ? pdfDocumentToAnthropicBlock(part)\n : Effect.fail(unsupportedContentError(`Document ${part.mimeType}`))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio'))\n }\n}\n\nconst contentToAnthropicContent = (\n content: Content\n): Effect.Effect<string | ReadonlyArray<AnthropicToolResultContentBlock>, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, contentPartToAnthropicBlock)\n\nconst contentPartToText = (part: ContentPart, owner: string): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`))\n }\n}\n\nconst contentToText = (content: Content, owner: string): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst toolCallToAnthropicBlock = (call: ToolCall): AnthropicToolUseBlock => ({\n type: 'tool_use',\n id: call.id,\n name: prefixClaudeToolName(call.name),\n input: call.params\n})\n\nconst isJsonObject = (value: unknown): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst jsonObjectField = (value: JsonObject, key: string) =>\n Object.getOwnPropertyDescriptor(value, key)?.value\n\nconst topLevelJsonSchemaCombinatorKeys: ReadonlyArray<TopLevelJsonSchemaCombinatorKey> = [\n 'anyOf',\n 'oneOf',\n 'allOf'\n]\n\nconst isTopLevelJsonSchemaCombinatorKey = (key: string): key is TopLevelJsonSchemaCombinatorKey =>\n key === 'anyOf' || key === 'oneOf' || key === 'allOf'\n\nconst topLevelJsonSchemaCombinator = (\n schema: JsonObject\n): TopLevelJsonSchemaCombinator | undefined => {\n for (const key of topLevelJsonSchemaCombinatorKeys) {\n const value = jsonObjectField(schema, key)\n\n if (Array.isArray(value)) {\n return { key, items: value }\n }\n }\n\n return undefined\n}\n\nconst withoutTopLevelJsonSchemaCombinators = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(schema).filter(([key]) => !isTopLevelJsonSchemaCombinatorKey(key))\n )\n\nconst withoutJsonSchemaCombinatorsAndTupleHints = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(schema).filter(\n ([key]) => !isTopLevelJsonSchemaCombinatorKey(key) && key !== 'prefixItems'\n )\n )\n\nconst jsonSchemaProperties = (schema: JsonObject) => {\n const properties = jsonObjectField(schema, 'properties')\n\n return isJsonObject(properties) ? properties : {}\n}\n\nconst jsonSchemaDefinitions = (schema: JsonObject) => {\n const definitions = jsonObjectField(schema, '$defs')\n\n return isJsonObject(definitions) ? definitions : {}\n}\n\nconst jsonSchemaRequired = (schema: JsonObject) => {\n const required = jsonObjectField(schema, 'required')\n\n return Array.isArray(required) ? required.filter(item => typeof item === 'string') : []\n}\n\nconst jsonValueKey = (value: unknown) =>\n Result.try(() => JSON.stringify(value)).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: encoded => encoded\n })\n )\n\nconst uniqueUnknownArray = (items: ReadonlyArray<unknown>): ReadonlyArray<unknown> => {\n const seen = new Set<string>()\n const result: Array<unknown> = []\n\n for (const item of items) {\n const key = jsonValueKey(item)\n\n if (key === undefined || seen.has(key)) {\n continue\n }\n\n seen.add(key)\n result.push(item)\n }\n\n return result\n}\n\nconst mergeEnumPropertySchemas = (left: unknown, right: unknown): unknown | undefined => {\n if (!isJsonObject(left) || !isJsonObject(right)) {\n return undefined\n }\n\n const leftEnum = jsonObjectField(left, 'enum')\n const rightEnum = jsonObjectField(right, 'enum')\n\n if (!Array.isArray(leftEnum) || !Array.isArray(rightEnum)) {\n return undefined\n }\n\n const leftType = jsonObjectField(left, 'type')\n const rightType = jsonObjectField(right, 'type')\n\n if (leftType !== rightType) {\n return undefined\n }\n\n return { ...left, ...right, enum: uniqueUnknownArray([...leftEnum, ...rightEnum]) }\n}\n\nconst jsonSchemaAnyOfItems = (schema: unknown) => {\n if (!isJsonObject(schema)) {\n return [schema]\n }\n\n const anyOf = jsonObjectField(schema, 'anyOf')\n\n return Array.isArray(anyOf) ? anyOf : [schema]\n}\n\nconst mergePropertySchemas = (left: unknown, right: unknown): unknown => {\n const leftKey = jsonValueKey(left)\n\n if (leftKey !== undefined && leftKey === jsonValueKey(right)) {\n return left\n }\n\n const mergedEnum = mergeEnumPropertySchemas(left, right)\n\n if (mergedEnum !== undefined) {\n return mergedEnum\n }\n\n return {\n anyOf: uniqueUnknownArray([...jsonSchemaAnyOfItems(left), ...jsonSchemaAnyOfItems(right)])\n }\n}\n\nconst mergeJsonSchemaObjects = (objects: ReadonlyArray<JsonObject>): JsonObject => {\n const merged = new Map<string, unknown>()\n\n for (const object of objects) {\n for (const [key, value] of Object.entries(object)) {\n if (merged.has(key)) {\n merged.set(key, mergePropertySchemas(merged.get(key), value))\n } else {\n merged.set(key, value)\n }\n }\n }\n\n return Object.fromEntries(merged)\n}\n\nconst normalizeJsonSchemaObjectFields = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(withoutJsonSchemaCombinatorsAndTupleHints(schema)).map(([key, value]) => [\n key,\n normalizeAnthropicToolSchema(value)\n ])\n )\n\nconst jsonSchemaType = (schema: JsonObject) => {\n const type = jsonObjectField(schema, 'type')\n\n return typeof type === 'string' ? type : undefined\n}\n\nconst isNullJsonSchema = (schema: JsonObject) => jsonSchemaType(schema) === 'null'\n\nconst firstJsonObject = (items: ReadonlyArray<JsonObject>) => items[0]\n\nconst mergeCompatibleVariants = (\n variants: ReadonlyArray<JsonObject>\n): JsonObject | undefined => {\n const first = firstJsonObject(variants)\n if (first === undefined) return undefined\n\n let merged: unknown = first\n\n for (const variant of variants.slice(1)) {\n merged = mergePropertySchemas(merged, variant)\n }\n\n if (!isJsonObject(merged)) return undefined\n\n if (Array.isArray(jsonObjectField(merged, 'anyOf'))) return undefined\n\n\n return merged\n}\n\nconst samePrimitiveTypeVariant = (variants: ReadonlyArray<JsonObject>): JsonObject | undefined => {\n const first = firstJsonObject(variants)\n const type = first === undefined ? undefined : jsonSchemaType(first)\n\n if (type === undefined || type === 'object' || type === 'array' || type === 'null') {\n return undefined\n }\n\n return variants.every(variant => jsonSchemaType(variant) === type) ? first : undefined\n}\n\nconst objectVariant = (variants: ReadonlyArray<JsonObject>): JsonObject | undefined => {\n if (\n variants.length === 0 ||\n variants.some(variant => {\n const type = jsonSchemaType(variant)\n\n return type !== undefined && type !== 'object'\n })\n ) {\n return undefined\n }\n\n return {\n type: 'object',\n properties: mergeJsonSchemaObjects(variants.map(jsonSchemaProperties)),\n required: mergeJsonSchemaRequired('oneOf', variants),\n $defs: mergeJsonSchemaObjects(variants.map(jsonSchemaDefinitions)),\n additionalProperties: mergeAdditionalProperties(variants) ?? false\n }\n}\n\nconst normalizeJsonSchemaCombinator = (\n schema: JsonObject,\n combinator: TopLevelJsonSchemaCombinator\n): JsonObject => {\n const base = normalizeJsonSchemaObjectFields(schema)\n const variants = combinator.items\n .map(normalizeAnthropicToolSchema)\n .filter(isJsonObject)\n .filter(variant => !isNullJsonSchema(variant))\n const first = firstJsonObject(variants)\n\n if (first === undefined) return base\n\n if (combinator.key === 'allOf') {\n return mergeJsonSchemaObjects([base, ...variants])\n }\n\n const merged =\n mergeCompatibleVariants(variants) ?? samePrimitiveTypeVariant(variants) ?? objectVariant(variants)\n\n return mergeJsonSchemaObjects([base, merged ?? first])\n}\n\nfunction normalizeAnthropicToolSchema(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(normalizeAnthropicToolSchema)\n if (!isJsonObject(value)) return value\n\n const combinator = topLevelJsonSchemaCombinator(value)\n if (combinator !== undefined) return normalizeJsonSchemaCombinator(value, combinator)\n\n return normalizeJsonSchemaObjectFields(value)\n}\n\nconst mergeJsonSchemaRequired = (\n combinatorKey: TopLevelJsonSchemaCombinatorKey,\n objects: ReadonlyArray<JsonObject>\n): ReadonlyArray<string> => {\n const requiredSets = objects.map(jsonSchemaRequired)\n\n if (requiredSets.length === 0) {\n return []\n }\n\n if (combinatorKey === 'allOf') {\n return Array.from(new Set(requiredSets.flat()))\n }\n\n const first = requiredSets[0] ?? []\n\n return first.filter(item => requiredSets.every(required => required.includes(item)))\n}\n\nconst mergeAdditionalProperties = (objects: ReadonlyArray<JsonObject>) => {\n const values = objects.map(object => jsonObjectField(object, 'additionalProperties'))\n\n if (values.every(value => value === false)) {\n return false\n }\n\n if (values.every(value => value === true)) {\n return true\n }\n\n return undefined\n}\n\n// Anthropic rejects root combinators. This widens provider-facing guidance only;\n// tool execution still validates calls against the original registry schema.\nconst flattenTopLevelCombinatorToolSchema = (\n schema: JsonObject,\n combinator: TopLevelJsonSchemaCombinator\n): JsonObject => {\n const base = withoutTopLevelJsonSchemaCombinators(schema)\n const objectVariants = combinator.items.filter(isJsonObject)\n const additionalProperties = mergeAdditionalProperties(objectVariants)\n const flattened = {\n ...base,\n type: 'object',\n properties: mergeJsonSchemaObjects(objectVariants.map(jsonSchemaProperties)),\n required: mergeJsonSchemaRequired(combinator.key, objectVariants),\n $defs: mergeJsonSchemaObjects([\n jsonSchemaDefinitions(schema),\n ...objectVariants.map(jsonSchemaDefinitions)\n ])\n }\n\n if (additionalProperties === undefined) {\n return flattened\n }\n\n return { ...flattened, additionalProperties }\n}\n\nconst anthropicToolInputSchema = (schema: unknown): unknown => {\n if (!isJsonObject(schema)) {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false\n }\n }\n\n const combinator = topLevelJsonSchemaCombinator(schema)\n\n if (combinator !== undefined) {\n return normalizeAnthropicToolSchema(flattenTopLevelCombinatorToolSchema(schema, combinator))\n }\n\n if (jsonObjectField(schema, 'type') !== undefined) {\n return normalizeAnthropicToolSchema(schema)\n }\n\n return normalizeAnthropicToolSchema({ ...schema, type: 'object' })\n}\n\nconst toAnthropicMessage = (message: AgentMessage): Effect.Effect<AnthropicMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToAnthropicContent(\n prependMessageContextToContent(message.content, messageContextText(message))\n )\n }\n case 'Assistant': {\n const text = yield* contentToText(\n prependMessageContextToContent(assistantContent(message), messageContextText(message)),\n 'Assistant'\n )\n const textBlocks: ReadonlyArray<AnthropicTextBlock> =\n text.length === 0 ? [] : [{ type: 'text', text }]\n const toolBlocks = assistantHostToolCalls(message).map(toolCallToAnthropicBlock)\n return { role: 'assistant', content: [...textBlocks, ...toolBlocks] }\n }\n case 'ToolResult':\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: yield* contentToAnthropicContent(\n prependMessageContextToContent(message.content, messageContextText(message))\n ),\n is_error: message.isError\n }\n ]\n }\n }\n })\n\nconst toAnthropicTool = (tool: ToolDef): AnthropicTool => ({\n name: prefixClaudeToolName(tool.name),\n description: tool.description,\n input_schema: anthropicToolInputSchema(tool.parameters)\n})\n\nexport const toAnthropicClaudeRequestBody = (\n request: LLMRequest,\n config: { readonly maxTokens: number; readonly stream?: boolean }\n): Effect.Effect<AnthropicRequestBody, LLMError> =>\n Effect.gen(function* () {\n yield* validateProviderTranscript(request.messages)\n const rawMessages = yield* Effect.forEach(request.messages, toAnthropicMessage)\n const billingSystemBlock = yield* makeAnthropicClaudeBillingSystemBlock(rawMessages)\n const messages = prependSystemPromptToFirstUserMessage(rawMessages, request.systemPrompt)\n const baseBody = {\n model: request.model,\n system: [billingSystemBlock, anthropicClaudeIdentitySystemBlock],\n messages,\n max_tokens: config.maxTokens\n }\n const body: AnthropicRequestBody =\n config.stream === true ? { ...baseBody, stream: true } : baseBody\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toAnthropicTool)\n }\n })\n\nconst anthropicClaudeProvider = 'anthropic_claude'\n\nconst toHttpClientLlmError =\n (message: string, retryable: boolean, kind: ProviderFailureKind = 'network') =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: anthropicClaudeProvider,\n kind: retryable ? kind : 'unknown'\n })\n })\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null\n\nconst field = (value: unknown, key: string) =>\n isRecord(value) ? Object.getOwnPropertyDescriptor(value, key)?.value : undefined\n\nconst stringField = (value: unknown, key: string) => {\n const raw = field(value, key)\n return typeof raw === 'string' ? raw : undefined\n}\n\ntype AnthropicHttpErrorInfo = {\n readonly message?: string\n readonly providerCode?: string\n}\n\nconst maxAnthropicHttpErrorMessageCharacters = 1_000\n\nconst boundedAnthropicHttpErrorMessage = (message: string) =>\n message.length <= maxAnthropicHttpErrorMessageCharacters\n ? message\n : `${message.slice(0, maxAnthropicHttpErrorMessageCharacters)}…`\n\nconst decodeAnthropicHttpErrorInfo = (\n raw: string\n): Effect.Effect<AnthropicHttpErrorInfo> =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.map(parsed => {\n const error = field(parsed, 'error')\n const message = stringField(error, 'message')\n const providerCode = stringField(error, 'type') ?? stringField(error, 'code')\n\n return {\n ...(message === undefined\n ? {}\n : { message: boundedAnthropicHttpErrorMessage(message) }),\n ...(providerCode === undefined ? {} : { providerCode })\n }\n }),\n Effect.catch(() => Effect.succeed({}))\n )\n\nconst providerSignalError = (input: {\n readonly message: string\n readonly providerCode?: string\n readonly fallbackKind?: ProviderFailureKind\n}) => {\n const provider = classifyProviderFailure({\n provider: anthropicClaudeProvider,\n message: input.message,\n ...(input.providerCode === undefined ? {} : { providerCode: input.providerCode }),\n ...(input.fallbackKind === undefined ? {} : { fallbackKind: input.fallbackKind })\n })\n\n return new LLMError({\n cause: providerFailureCause(provider.kind),\n message: input.message,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n}\n\nconst numberField = (value: unknown, key: string) => {\n const raw = field(value, key)\n return typeof raw === 'number' ? raw : undefined\n}\n\nconst sseDataFromBlock = (block: string) =>\n block\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice('data:'.length).trimStart())\n .join('\\n')\n .trim()\n\nconst dataFromSseBlock = (block: string) => {\n const data = sseDataFromBlock(block)\n\n if (data.length === 0 || data === '[DONE]') {\n return undefined\n }\n\n return data\n}\n\nconst normalizeNewlines = (text: string) => text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\nconst splitCompleteSseBlocks = (buffer: string) => {\n const blocks = buffer.split('\\n\\n')\n const tail = blocks.at(-1) ?? ''\n\n return { completeBlocks: blocks.slice(0, -1), tail }\n}\n\nconst parseToolParams = (raw: string) => {\n const trimmed = raw.trim()\n\n if (trimmed.length === 0) return Effect.succeed({})\n\n return decodeJsonString(trimmed, 'Invalid Anthropic Claude tool arguments JSON')\n}\n\ntype AnthropicUsageComponents = {\n readonly inputTokens: number\n readonly outputTokens: number\n readonly cacheReadInputTokens: number\n readonly cacheCreationInputTokens: number\n}\n\nconst zeroAnthropicUsageComponents: AnthropicUsageComponents = {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0\n}\n\nconst positiveOrUndefined = (value: number) => (value > 0 ? value : undefined)\n\nconst toAgentUsageFromComponents = (usage: AnthropicUsageComponents) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.inputTokens + usage.cacheReadInputTokens + usage.cacheCreationInputTokens,\n uncached: positiveOrUndefined(usage.inputTokens),\n cacheRead: positiveOrUndefined(usage.cacheReadInputTokens),\n cacheWrite: positiveOrUndefined(usage.cacheCreationInputTokens)\n }),\n output: AgentOutputUsage.make({\n total: usage.outputTokens,\n text: positiveOrUndefined(usage.outputTokens)\n })\n })\n\nconst toAgentUsage = (usage: AnthropicUsageResponse) =>\n toAgentUsageFromComponents({\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadInputTokens: usage.cache_read_input_tokens ?? 0,\n cacheCreationInputTokens: usage.cache_creation_input_tokens ?? 0\n })\n\nconst nextAnthropicUsageSnapshot = (\n previous: AnthropicUsageComponents,\n usage: AnthropicStreamUsageResponse\n): AnthropicUsageComponents => ({\n inputTokens: usage.input_tokens ?? previous.inputTokens,\n outputTokens: usage.output_tokens ?? previous.outputTokens,\n cacheReadInputTokens: usage.cache_read_input_tokens ?? previous.cacheReadInputTokens,\n cacheCreationInputTokens: usage.cache_creation_input_tokens ?? previous.cacheCreationInputTokens\n})\n\nconst usageComponentDelta = (previous: number, next: number) => Math.max(0, next - previous)\n\nconst anthropicUsageDelta = (\n previous: AnthropicUsageComponents,\n next: AnthropicUsageComponents\n): AnthropicUsageComponents => ({\n inputTokens: usageComponentDelta(previous.inputTokens, next.inputTokens),\n outputTokens: usageComponentDelta(previous.outputTokens, next.outputTokens),\n cacheReadInputTokens: usageComponentDelta(\n previous.cacheReadInputTokens,\n next.cacheReadInputTokens\n ),\n cacheCreationInputTokens: usageComponentDelta(\n previous.cacheCreationInputTokens,\n next.cacheCreationInputTokens\n )\n})\n\nconst hasAnthropicUsage = (usage: AnthropicUsageComponents) =>\n usage.inputTokens > 0 ||\n usage.outputTokens > 0 ||\n usage.cacheReadInputTokens > 0 ||\n usage.cacheCreationInputTokens > 0\n\ntype AnthropicStreamUsageStep = {\n readonly snapshot: AnthropicUsageComponents\n readonly events: ReadonlyArray<LLMEvent>\n}\n\nconst usageStepFromUnknown = (\n usage: unknown,\n previous: AnthropicUsageComponents\n): AnthropicStreamUsageStep => {\n const parsed = Schema.decodeUnknownOption(AnthropicStreamUsageResponse)(usage)\n\n if (parsed._tag === 'None') {\n return { snapshot: previous, events: [] }\n }\n\n const value = parsed.value\n const snapshot = nextAnthropicUsageSnapshot(previous, value)\n const delta = anthropicUsageDelta(previous, snapshot)\n\n return {\n snapshot,\n events: hasAnthropicUsage(delta)\n ? [LLMUsage.make({ usage: toAgentUsageFromComponents(delta) })]\n : []\n }\n}\n\nconst toLlmEvents = (\n response: AnthropicMessageResponse\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (response.stop_reason === 'max_tokens') {\n return yield* Effect.fail(anthropicMaxTokensError())\n }\n\n const events = yield* Effect.forEach(response.content, block => {\n switch (block.type) {\n case 'text':\n return Effect.succeed<LLMEvent>(LLMTextDelta.make({ text: block.text }))\n case 'thinking':\n return Effect.succeed<LLMEvent>(LLMReasoningDelta.make({ text: block.thinking }))\n case 'tool_use':\n return Effect.succeed<LLMEvent>(\n LLMToolCall.make({\n call: ToolCall.make({\n id: block.id,\n name: unprefixClaudeToolName(block.name),\n params: block.input\n })\n })\n )\n }\n })\n const stopReason = response.stop_reason === 'tool_use' ? 'tool_use' : 'stop'\n const usageEvent =\n response.usage === undefined ? [] : [LLMUsage.make({ usage: toAgentUsage(response.usage) })]\n\n return [...events, LLMDone.make({ stopReason }), ...usageEvent]\n })\n\nconst decodeAnthropicMessageResponse = (json: unknown) =>\n Schema.decodeUnknownEffect(AnthropicMessageResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid Anthropic Claude response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst parseAnthropicJsonResponse = (\n raw: string\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const json = yield* decodeJsonString(raw, 'Could not parse Anthropic Claude response JSON')\n const parsed = yield* decodeAnthropicMessageResponse(json)\n\n return yield* toLlmEvents(parsed)\n })\n\ntype AnthropicBodyFormat = 'undecided' | 'sse' | 'json'\n\ntype AnthropicSseState = {\n readonly hasToolCall: boolean\n readonly hasDone: boolean\n readonly stopReason?: string\n readonly usage: AnthropicUsageComponents\n}\n\ntype AnthropicSseStep = {\n readonly state: AnthropicSseState\n readonly events: ReadonlyArray<LLMEvent>\n}\n\ntype AnthropicBodyState = {\n readonly format: AnthropicBodyFormat\n readonly buffer: string\n readonly sse: AnthropicSseState\n}\n\nconst initialSseState: AnthropicSseState = {\n hasToolCall: false,\n hasDone: false,\n usage: zeroAnthropicUsageComponents\n}\n\nconst initialBodyState: AnthropicBodyState = {\n format: 'undecided',\n buffer: '',\n sse: initialSseState\n}\n\nconst classifyAnthropicBody = (buffer: string): AnthropicBodyFormat => {\n const trimmed = buffer.trimStart()\n\n if (trimmed.length === 0) {\n return 'undecided'\n }\n\n if (trimmed.startsWith('event:') || trimmed.startsWith('data:')) {\n return 'sse'\n }\n\n if ('event:'.startsWith(trimmed) || 'data:'.startsWith(trimmed)) {\n return 'undecided'\n }\n\n return 'json'\n}\n\nconst invalidToolUseStartError = () =>\n new LLMError({\n cause: 'invalid_response',\n message: 'Invalid Anthropic Claude tool_use stream block',\n retryable: false\n })\n\nconst anthropicMaxTokensError = () =>\n new LLMError({\n cause: 'invalid_response',\n message: 'Anthropic Claude stopped after reaching max_tokens',\n retryable: false\n })\n\nconst makeAnthropicStreamEmitter = () => {\n const toolBlocks = new Map<number, AnthropicToolBlockState>()\n\n return (state: AnthropicSseState, data: unknown): Effect.Effect<AnthropicSseStep, LLMError> => {\n const type = stringField(data, 'type')\n\n if (type === 'message_start') {\n const message = field(data, 'message')\n const step = usageStepFromUnknown(field(message, 'usage'), state.usage)\n\n return Effect.succeed({ state: { ...state, usage: step.snapshot }, events: step.events })\n }\n\n if (type === 'content_block_start') {\n const index = numberField(data, 'index')\n const block = field(data, 'content_block')\n\n if (index !== undefined && stringField(block, 'type') === 'tool_use') {\n const id = stringField(block, 'id')\n const name = stringField(block, 'name')\n\n if (id === undefined || name === undefined) {\n return Effect.fail(invalidToolUseStartError())\n }\n\n toolBlocks.set(index, {\n id,\n name: unprefixClaudeToolName(name),\n partialJson: ''\n })\n }\n\n return Effect.succeed({ state, events: [] })\n }\n\n if (type === 'content_block_delta') {\n const index = numberField(data, 'index')\n const delta = field(data, 'delta')\n const deltaType = stringField(delta, 'type')\n const text = stringField(delta, 'text')\n const thinking = stringField(delta, 'thinking')\n const partialJson = stringField(delta, 'partial_json')\n\n if (deltaType === 'text_delta' && text !== undefined) {\n return Effect.succeed({ state, events: [LLMTextDelta.make({ text })] })\n }\n\n if (deltaType === 'thinking_delta' && thinking !== undefined) {\n return Effect.succeed({ state, events: [LLMReasoningDelta.make({ text: thinking })] })\n }\n\n if (index !== undefined && deltaType === 'input_json_delta' && partialJson !== undefined) {\n const current = toolBlocks.get(index)\n if (current !== undefined) {\n toolBlocks.set(index, { ...current, partialJson: `${current.partialJson}${partialJson}` })\n }\n }\n\n return Effect.succeed({ state, events: [] })\n }\n\n if (type === 'content_block_stop') {\n const index = numberField(data, 'index')\n const toolBlock = index === undefined ? undefined : toolBlocks.get(index)\n\n if (toolBlock === undefined) return Effect.succeed({ state, events: [] })\n\n return parseToolParams(toolBlock.partialJson).pipe(\n Effect.map(params => {\n if (index !== undefined) toolBlocks.delete(index)\n\n return {\n state: { ...state, hasToolCall: true },\n events: [\n LLMToolCall.make({\n call: ToolCall.make({\n id: toolBlock.id,\n name: toolBlock.name,\n params\n })\n })\n ]\n }\n })\n )\n }\n\n if (type === 'message_delta') {\n const step = usageStepFromUnknown(field(data, 'usage'), state.usage)\n const delta = field(data, 'delta')\n const stopReason = stringField(delta, 'stop_reason')\n\n return Effect.succeed({\n state: {\n ...state,\n usage: step.snapshot,\n ...(stopReason === undefined ? {} : { stopReason })\n },\n events: step.events\n })\n }\n\n if (type === 'message_stop') {\n if (state.stopReason === 'max_tokens') return Effect.fail(anthropicMaxTokensError())\n\n return Effect.succeed({\n state: { ...state, hasDone: true },\n events: [LLMDone.make({ stopReason: state.hasToolCall ? 'tool_use' : 'stop' })]\n })\n }\n\n if (type === 'error') {\n const error = field(data, 'error')\n const providerCode = stringField(error, 'type') ?? stringField(error, 'code')\n\n return Effect.fail(\n providerSignalError({\n message: stringField(error, 'message') ?? 'Anthropic Claude stream error',\n ...(providerCode === undefined ? {} : { providerCode })\n })\n )\n }\n\n return Effect.succeed({ state, events: [] })\n }\n}\n\nconst processSseData = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n data: string\n): Effect.Effect<AnthropicSseStep, LLMError> =>\n decodeJsonString(data, 'Could not parse Anthropic Claude stream event JSON').pipe(\n Effect.flatMap(parsed => emitData(state, parsed))\n )\n\nconst processSseBlock = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n block: string\n): Effect.Effect<AnthropicSseStep, LLMError> => {\n const data = dataFromSseBlock(block)\n\n if (data === undefined) {\n return Effect.succeed({ state, events: [] })\n }\n\n return processSseData(emitData, state, data)\n}\n\nconst processSseBlocks = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n blocks: ReadonlyArray<string>\n): Effect.Effect<AnthropicSseStep, LLMError> =>\n Effect.gen(function* () {\n const events: Array<LLMEvent> = []\n let currentState = state\n\n for (const block of blocks) {\n const step = yield* processSseBlock(emitData, currentState, block)\n currentState = step.state\n events.push(...step.events)\n }\n\n return { state: currentState, events }\n })\n\nconst processBodyChunk = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicBodyState,\n chunk: string\n): Effect.Effect<AnthropicSseStep & { readonly bodyState: AnthropicBodyState }, LLMError> =>\n Effect.gen(function* () {\n const buffer = normalizeNewlines(`${state.buffer}${chunk}`)\n const format = state.format === 'undecided' ? classifyAnthropicBody(buffer) : state.format\n\n if (format !== 'sse') {\n return {\n state: state.sse,\n bodyState: { ...state, format, buffer },\n events: []\n }\n }\n\n const split = splitCompleteSseBlocks(buffer)\n const step = yield* processSseBlocks(emitData, state.sse, split.completeBlocks)\n\n return {\n state: step.state,\n bodyState: { format, buffer: split.tail, sse: step.state },\n events: step.events\n }\n })\n\nconst finalizeBodyState = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicBodyState\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const buffer = normalizeNewlines(state.buffer)\n const format = state.format === 'undecided' ? classifyAnthropicBody(buffer) : state.format\n\n if (format === 'json') {\n return yield* parseAnthropicJsonResponse(buffer)\n }\n\n const events: Array<LLMEvent> = []\n let sseState = state.sse\n\n if (format === 'sse') {\n const split = splitCompleteSseBlocks(buffer)\n const step = yield* processSseBlocks(emitData, sseState, split.completeBlocks)\n sseState = step.state\n events.push(...step.events)\n\n if (split.tail.trim().length > 0) {\n const tailStep = yield* processSseBlock(emitData, sseState, split.tail)\n sseState = tailStep.state\n events.push(...tailStep.events)\n }\n }\n\n if (sseState.stopReason === 'max_tokens') {\n return yield* Effect.fail(anthropicMaxTokensError())\n }\n\n if (!sseState.hasDone) {\n events.push(LLMDone.make({ stopReason: sseState.hasToolCall ? 'tool_use' : 'stop' }))\n }\n\n return events\n })\n\nexport const streamAnthropicClaudeResponse = (\n response: HttpClientResponse.HttpClientResponse\n): Stream.Stream<LLMEvent, LLMError> =>\n Stream.unwrap(\n Ref.make(initialBodyState).pipe(\n Effect.map(bodyStateRef => {\n const emitData = makeAnthropicStreamEmitter()\n const chunks = response.stream.pipe(\n Stream.mapError(\n toHttpClientLlmError('Could not read Anthropic Claude stream', true, 'stream')\n ),\n Stream.decodeText,\n Stream.mapEffect(chunk =>\n Effect.gen(function* () {\n const state = yield* Ref.get(bodyStateRef)\n const step = yield* processBodyChunk(emitData, state, chunk)\n yield* Ref.set(bodyStateRef, step.bodyState)\n return step.events\n })\n ),\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n const finalEvents = Stream.fromEffect(\n Ref.get(bodyStateRef).pipe(Effect.flatMap(state => finalizeBodyState(emitData, state)))\n ).pipe(Stream.flatMap(events => Stream.fromIterable(events)))\n\n return chunks.pipe(Stream.concat(finalEvents))\n })\n )\n )\n\nconst sendAnthropicClaudeRequest = (\n config: AnthropicClaudeProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient,\n sessionId: string\n): Effect.Effect<HttpClientResponse.HttpClientResponse, LLMError> =>\n Effect.gen(function* () {\n const body = yield* toAnthropicClaudeRequestBody(request, { ...config, stream: true })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n 'Could not serialize Anthropic Claude request'\n )\n const httpRequest = HttpClientRequest.post(\n config.messagesUrl ?? anthropicClaudeMessagesUrl\n ).pipe(\n HttpClientRequest.setHeaders({\n accept: 'text/event-stream',\n ...anthropicClaudeAuthorizationHeaders(config.token),\n 'content-type': 'application/json',\n ...makeAnthropicClaudeCompatibilityHeaders({ model: request.model, sessionId }),\n ...config.extraHeaders\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError('Anthropic Claude request failed', true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read Anthropic Claude error body: ${error.message}`,\n retryable: false\n })\n )\n )\n const errorInfo = yield* decodeAnthropicHttpErrorInfo(errorText)\n\n const provider = classifyProviderFailure({\n provider: anthropicClaudeProvider,\n status: response.status,\n headers: response.headers,\n body: errorText,\n ...(errorInfo.message === undefined ? {} : { message: errorInfo.message }),\n ...(errorInfo.providerCode === undefined\n ? {}\n : { providerCode: errorInfo.providerCode })\n })\n const message =\n errorInfo.message === undefined\n ? `Anthropic Claude returned ${response.status}`\n : `Anthropic Claude returned ${response.status}: ${errorInfo.message}`\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n return response\n }).pipe(Effect.withSpan('AnthropicClaudeProvider.stream'))\n\nexport const makeAnthropicClaudeProviderLayer = (config: AnthropicClaudeProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const sessionId = makeAnthropicClaudeRequestId()\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendAnthropicClaudeRequest(config, request, client, sessionId)).pipe(\n Stream.flatMap(streamAnthropicClaudeResponse)\n )\n })\n })\n )\n"],"mappings":"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"}
1
+ {"version":3,"file":"claude-provider.mjs","names":["LLMTextDelta","LLMReasoningDelta"],"sources":["../../../src/providers/anthropic/claude-provider.ts"],"sourcesContent":["import { Effect, Layer, Option, Ref, Result, Stream } from 'effect'\nimport {\n HttpClient,\n HttpClientRequest,\n type HttpClientError,\n type HttpClientResponse\n} from 'effect/unstable/http'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentInputUsage,\n AgentOutputUsage,\n AgentUsage,\n ToolCall,\n attachmentSourceText,\n assistantContent,\n assistantHostToolCalls,\n isTextDocumentMimeType,\n messageContextText,\n replaceLoneSurrogatesDeep,\n prependMessageContextToContent,\n type AgentMessage,\n type Content,\n type ContentPart,\n type ProviderFailureKind,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport {\n LLMError,\n LLMDone,\n LLMProvider,\n LLMReasoningDelta,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent,\n type LLMRequest\n} from '@yolk-sdk/agent/loop'\nimport {\n anthropicClaudeAuthorizationHeaders,\n anthropicClaudeCodeEntrypoint,\n anthropicClaudeCodeVersion,\n anthropicClaudeOAuthUserAgent\n} from './claude.ts'\nimport type { OAuthAccessToken } from '@yolk-sdk/agent/oauth'\nimport {\n classifyProviderFailure,\n providerErrorInfo,\n providerFailureCause,\n providerFailureRetryable\n} from '../provider-error.ts'\nimport { validateProviderTranscript } from '../transcript.ts'\n\nexport type AnthropicClaudeProviderConfig = {\n readonly token: OAuthAccessToken\n readonly messagesUrl?: string\n readonly maxTokens: number\n readonly extraHeaders?: Readonly<Record<string, string>>\n}\n\ntype AnthropicTextBlock = {\n readonly type: 'text'\n readonly text: string\n}\n\ntype AnthropicSystemBlock = AnthropicTextBlock\n\ntype AnthropicImageBlock = {\n readonly type: 'image'\n readonly source:\n | {\n readonly type: 'base64'\n readonly media_type: string\n readonly data: string\n }\n | {\n readonly type: 'url'\n readonly url: string\n }\n}\n\ntype AnthropicDocumentBlock = {\n readonly type: 'document'\n readonly source:\n | {\n readonly type: 'base64'\n readonly media_type: 'application/pdf'\n readonly data: string\n }\n | {\n readonly type: 'url'\n readonly url: string\n }\n readonly title?: string\n}\n\ntype AnthropicToolUseBlock = {\n readonly type: 'tool_use'\n readonly id: string\n readonly name: string\n readonly input: unknown\n}\n\ntype AnthropicToolResultContentBlock =\n | AnthropicTextBlock\n | AnthropicImageBlock\n | AnthropicDocumentBlock\n\ntype AnthropicToolResultBlock = {\n readonly type: 'tool_result'\n readonly tool_use_id: string\n readonly content: string | ReadonlyArray<AnthropicToolResultContentBlock>\n readonly is_error?: boolean\n}\n\ntype AnthropicUserBlock =\n | AnthropicTextBlock\n | AnthropicImageBlock\n | AnthropicDocumentBlock\n | AnthropicToolResultBlock\ntype AnthropicAssistantBlock = AnthropicTextBlock | AnthropicToolUseBlock\n\ntype AnthropicMessage =\n | { readonly role: 'user'; readonly content: string | ReadonlyArray<AnthropicUserBlock> }\n | { readonly role: 'assistant'; readonly content: ReadonlyArray<AnthropicAssistantBlock> }\n\ntype JsonObject = Readonly<Record<string, unknown>>\ntype TopLevelJsonSchemaCombinatorKey = 'anyOf' | 'oneOf' | 'allOf'\ntype TopLevelJsonSchemaCombinator = {\n readonly key: TopLevelJsonSchemaCombinatorKey\n readonly items: ReadonlyArray<unknown>\n}\n\ntype AnthropicTool = {\n readonly name: string\n readonly description: string\n readonly input_schema: unknown\n}\n\ntype AnthropicRequestBody = {\n readonly model: string\n readonly system: ReadonlyArray<AnthropicSystemBlock>\n readonly messages: ReadonlyArray<AnthropicMessage>\n readonly max_tokens: number\n readonly output_config?: {\n readonly effort: 'low' | 'medium' | 'high' | 'xhigh'\n }\n readonly stream?: true\n readonly tools?: ReadonlyArray<AnthropicTool>\n}\n\ntype AnthropicToolBlockState = {\n readonly id: string\n readonly name: string\n readonly partialJson: string\n}\n\nconst anthropicClaudeSystemIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\"\nconst anthropicClaudeBillingPrefix = 'x-anthropic-billing-header:'\nconst anthropicClaudeToolPrefix = 'mcp_'\nconst anthropicClaudeVersion = '2023-06-01'\nconst anthropicClaudeCchSalt = '59cf53e54c78'\nconst anthropicClaudeCchPositions: ReadonlyArray<number> = [4, 7, 20]\nconst anthropicClaudeEffortBeta = 'effort-2025-11-24'\nconst anthropicClaudeInterleavedThinkingBeta = 'interleaved-thinking-2025-05-14'\nconst anthropicClaudeRequiredBetas: ReadonlyArray<string> = [\n 'claude-code-20250219',\n 'oauth-2025-04-20',\n anthropicClaudeInterleavedThinkingBeta,\n 'prompt-caching-scope-2026-01-05',\n 'context-management-2025-06-27',\n 'advisor-tool-2026-03-01'\n]\nconst anthropicClaudeSystemTextReplacements: ReadonlyArray<{\n readonly match: string\n readonly replacement: string\n}> = [\n {\n match: 'if OpenCode honestly',\n replacement: 'if the assistant honestly'\n },\n {\n match: 'Here is some useful information about the environment you are running in:',\n replacement: 'Environment context you are running in:'\n }\n]\nconst anthropicClaudeStainlessPackageVersion = '0.81.0'\n\n// Claude subscription OAuth is fingerprinted against Claude Code tool names.\nconst prefixClaudeToolName = (name: string) =>\n `${anthropicClaudeToolPrefix}${name.charAt(0).toUpperCase()}${name.slice(1)}`\n\nconst unprefixClaudeToolName = (name: string) => {\n if (!name.startsWith(anthropicClaudeToolPrefix)) {\n return name\n }\n\n const unprefixed = name.slice(anthropicClaudeToolPrefix.length)\n\n if (unprefixed === 'StructuredOutput') {\n return unprefixed\n }\n\n return `${unprefixed.charAt(0).toLowerCase()}${unprefixed.slice(1)}`\n}\n\nconst anthropicClaudeMessagesUrl = 'https://api.anthropic.com/v1/messages?beta=true'\nconst anthropicClaudeIdentitySystemBlock: AnthropicSystemBlock = {\n type: 'text',\n text: anthropicClaudeSystemIdentity\n}\n\nconst randomHex = (byteLength: number) => {\n const crypto = globalThis.crypto\n const bytes = new Uint8Array(byteLength)\n\n if (crypto !== undefined && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(bytes)\n }\n\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('')\n}\n\nconst makeAnthropicClaudeRequestId = () => {\n const crypto = globalThis.crypto\n\n if (crypto !== undefined && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n\n return randomHex(16)\n}\n\nconst sha256Hex = (value: string): Effect.Effect<string, LLMError> => {\n const crypto = globalThis.crypto\n\n if (crypto === undefined || crypto.subtle === undefined) {\n return Effect.fail(\n new LLMError({\n cause: 'provider_error',\n message: 'Web Crypto SHA-256 is required for Anthropic Claude OAuth billing headers',\n retryable: false\n })\n )\n }\n\n return Effect.tryPromise({\n try: () =>\n crypto.subtle\n .digest('SHA-256', new TextEncoder().encode(value))\n .then(buffer =>\n Array.from(new Uint8Array(buffer), byte => byte.toString(16).padStart(2, '0')).join('')\n ),\n catch: error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not compute Anthropic Claude OAuth billing header: ${unknownToMessage(error)}`,\n retryable: false\n })\n })\n}\n\nconst computeAnthropicClaudeCch = (messageText: string) =>\n sha256Hex(messageText).pipe(Effect.map(hash => hash.slice(0, 5)))\n\nconst computeAnthropicClaudeVersionSuffix = (messageText: string) => {\n const chars = anthropicClaudeCchPositions.map(index => messageText[index] ?? '0').join('')\n\n return sha256Hex(`${anthropicClaudeCchSalt}${chars}${anthropicClaudeCodeVersion}`).pipe(\n Effect.map(hash => hash.slice(0, 3))\n )\n}\n\nconst firstUserMessageText = (messages: ReadonlyArray<AnthropicMessage>) => {\n for (const message of messages) {\n if (message.role !== 'user') {\n continue\n }\n\n if (typeof message.content === 'string') {\n return message.content\n }\n\n for (const block of message.content) {\n if (block.type === 'text') {\n return block.text\n }\n }\n }\n\n return ''\n}\n\nconst makeAnthropicClaudeBillingSystemBlock = (\n messages: ReadonlyArray<AnthropicMessage>\n): Effect.Effect<AnthropicSystemBlock, LLMError> => {\n const text = firstUserMessageText(messages)\n\n return Effect.all({\n cch: computeAnthropicClaudeCch(text),\n suffix: computeAnthropicClaudeVersionSuffix(text)\n }).pipe(\n Effect.map(\n ({ cch, suffix }): AnthropicSystemBlock => ({\n type: 'text',\n text:\n `${anthropicClaudeBillingPrefix} ` +\n `cc_version=${anthropicClaudeCodeVersion}.${suffix}; ` +\n `cc_entrypoint=${anthropicClaudeCodeEntrypoint}; ` +\n `cch=${cch};`\n })\n )\n )\n}\n\nconst sanitizeAnthropicClaudeSystemText = (text: string) => {\n let result = text\n\n for (const rule of anthropicClaudeSystemTextReplacements) {\n result = result.split(rule.match).join(rule.replacement)\n }\n\n return result\n}\n\nconst anthropicClaudeBetaHeader = (model: string) => {\n const lowerModel = model.toLowerCase()\n const baseBetas = lowerModel.includes('haiku')\n ? anthropicClaudeRequiredBetas.filter(beta => beta !== anthropicClaudeInterleavedThinkingBeta)\n : anthropicClaudeRequiredBetas\n\n if (\n !lowerModel.includes('haiku') &&\n (lowerModel.includes('4-6') || lowerModel.includes('4-7')) &&\n !baseBetas.includes(anthropicClaudeEffortBeta)\n ) {\n return [...baseBetas, anthropicClaudeEffortBeta].join(',')\n }\n\n return baseBetas.join(',')\n}\n\nconst makeAnthropicClaudeCompatibilityHeaders = (input: {\n readonly model: string\n readonly sessionId: string\n}) => ({\n 'anthropic-beta': anthropicClaudeBetaHeader(input.model),\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'anthropic-version': anthropicClaudeVersion,\n 'user-agent': anthropicClaudeOAuthUserAgent,\n 'x-app': 'cli',\n 'x-client-request-id': makeAnthropicClaudeRequestId(),\n 'X-Claude-Code-Session-Id': input.sessionId,\n 'x-stainless-arch': 'unknown',\n 'x-stainless-lang': 'js',\n 'x-stainless-os': 'unknown',\n 'x-stainless-package-version': anthropicClaudeStainlessPackageVersion,\n 'x-stainless-retry-count': '0',\n 'x-stainless-runtime': 'node',\n 'x-stainless-runtime-version': 'unknown',\n 'x-stainless-timeout': '600'\n})\n\n// Keep app instructions out of `system[]`; Anthropic can reject/limit otherwise.\nconst prependSystemPromptToFirstUserMessage = (\n messages: ReadonlyArray<AnthropicMessage>,\n systemPrompt: string\n): ReadonlyArray<AnthropicMessage> => {\n const sanitizedSystemPrompt = sanitizeAnthropicClaudeSystemText(systemPrompt).trim()\n\n if (sanitizedSystemPrompt.length === 0) {\n return messages\n }\n\n let relocated = false\n\n return messages.map(message => {\n if (relocated || message.role !== 'user') {\n return message\n }\n\n relocated = true\n\n if (typeof message.content === 'string') {\n return { ...message, content: `${sanitizedSystemPrompt}\\n\\n${message.content}` }\n }\n\n return {\n ...message,\n content: [{ type: 'text', text: sanitizedSystemPrompt }, ...message.content]\n }\n })\n}\n\nclass AnthropicTextResponseBlock extends Schema.Class<AnthropicTextResponseBlock>(\n 'AnthropicTextResponseBlock'\n)({\n type: Schema.Literal('text'),\n text: Schema.String\n}) {}\n\nclass AnthropicThinkingResponseBlock extends Schema.Class<AnthropicThinkingResponseBlock>(\n 'AnthropicThinkingResponseBlock'\n)({\n type: Schema.Literal('thinking'),\n thinking: Schema.String\n}) {}\n\nclass AnthropicToolUseResponseBlock extends Schema.Class<AnthropicToolUseResponseBlock>(\n 'AnthropicToolUseResponseBlock'\n)({\n type: Schema.Literal('tool_use'),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown\n}) {}\n\nconst AnthropicContentResponseBlock = Schema.Union([\n AnthropicTextResponseBlock,\n AnthropicThinkingResponseBlock,\n AnthropicToolUseResponseBlock\n])\n\nclass AnthropicUsageResponse extends Schema.Class<AnthropicUsageResponse>('AnthropicUsageResponse')(\n {\n input_tokens: Schema.Number,\n output_tokens: Schema.Number,\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number))\n }\n) {}\n\nclass AnthropicStreamUsageResponse extends Schema.Class<AnthropicStreamUsageResponse>(\n 'AnthropicStreamUsageResponse'\n)({\n input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n output_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number))\n}) {}\n\nclass AnthropicMessageResponse extends Schema.Class<AnthropicMessageResponse>(\n 'AnthropicMessageResponse'\n)({\n content: Schema.Array(AnthropicContentResponseBlock),\n stop_reason: Schema.NullOr(Schema.String),\n usage: Schema.optional(AnthropicUsageResponse)\n}) {}\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst encodeJsonString = (value: unknown, message: string) =>\n Schema.encodeUnknownEffect(Schema.UnknownFromJsonString)(value).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst unsupportedContentError = (contentType: string) =>\n new LLMError({\n cause: 'provider_error',\n message: `${contentType} content is not supported by the Anthropic Claude provider yet`,\n retryable: false\n })\n\nconst imageToAnthropicBlock = (\n part: Extract<ContentPart, { readonly _tag: 'Image' }>\n): Effect.Effect<AnthropicImageBlock, LLMError> => {\n switch (part.source._tag) {\n case 'InlineBase64':\n return Effect.succeed({\n type: 'image',\n source: {\n type: 'base64',\n media_type: part.mimeType,\n data: part.source.data\n }\n })\n case 'Url':\n return Effect.succeed({\n type: 'image',\n source: {\n type: 'url',\n url: part.source.url\n }\n })\n case 'Ref':\n return Effect.fail(unsupportedContentError('Unresolved image source'))\n }\n}\n\nconst pdfDocumentToAnthropicBlock = (\n part: Extract<ContentPart, { readonly _tag: 'Document' }>\n): Effect.Effect<AnthropicDocumentBlock, LLMError> => {\n switch (part.source._tag) {\n case 'InlineBase64':\n return Effect.succeed({\n type: 'document',\n source: {\n type: 'base64',\n media_type: 'application/pdf',\n data: part.source.data\n },\n title: part.title ?? part.filename\n })\n case 'Url':\n return Effect.succeed({\n type: 'document',\n source: {\n type: 'url',\n url: part.source.url\n },\n title: part.title ?? part.filename\n })\n case 'Ref':\n return Effect.fail(unsupportedContentError('Unresolved document source'))\n }\n}\n\nconst textDocumentToAnthropicBlock = (part: Extract<ContentPart, { readonly _tag: 'Document' }>) =>\n attachmentSourceText(part.source).pipe(\n Effect.mapError(() => unsupportedContentError('Invalid document text')),\n Effect.flatMap(\n Option.match({\n onNone: () => Effect.fail(unsupportedContentError('Unresolved document source')),\n onSome: text => {\n const block: AnthropicTextBlock = {\n type: 'text',\n text: `Document: ${part.title ?? part.filename}\\n\\n${text}`\n }\n\n return Effect.succeed(block)\n }\n })\n )\n )\n\nconst contentPartToAnthropicBlock = (\n part: ContentPart\n): Effect.Effect<AnthropicToolResultContentBlock, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed({ type: 'text', text: part.text })\n case 'Image':\n return imageToAnthropicBlock(part)\n case 'Document':\n return isTextDocumentMimeType(part.mimeType)\n ? textDocumentToAnthropicBlock(part)\n : part.mimeType === 'application/pdf'\n ? pdfDocumentToAnthropicBlock(part)\n : Effect.fail(unsupportedContentError(`Document ${part.mimeType}`))\n case 'Audio':\n return Effect.fail(unsupportedContentError('Audio'))\n }\n}\n\nconst contentToAnthropicContent = (\n content: Content\n): Effect.Effect<string | ReadonlyArray<AnthropicToolResultContentBlock>, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, contentPartToAnthropicBlock)\n\nconst contentPartToText = (part: ContentPart, owner: string): Effect.Effect<string, LLMError> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part.text)\n case 'Image':\n return Effect.fail(unsupportedContentError(`${owner} image`))\n case 'Document':\n return Effect.fail(unsupportedContentError(`${owner} document`))\n case 'Audio':\n return Effect.fail(unsupportedContentError(`${owner} audio`))\n }\n}\n\nconst contentToText = (content: Content, owner: string): Effect.Effect<string, LLMError> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => contentPartToText(part, owner)).pipe(\n Effect.map(textParts => textParts.join('\\n'))\n )\n\nconst toolCallToAnthropicBlock = (call: ToolCall): AnthropicToolUseBlock => ({\n type: 'tool_use',\n id: call.id,\n name: prefixClaudeToolName(call.name),\n input: call.params\n})\n\nconst isJsonObject = (value: unknown): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst jsonObjectField = (value: JsonObject, key: string) =>\n Object.getOwnPropertyDescriptor(value, key)?.value\n\nconst topLevelJsonSchemaCombinatorKeys: ReadonlyArray<TopLevelJsonSchemaCombinatorKey> = [\n 'anyOf',\n 'oneOf',\n 'allOf'\n]\n\nconst isTopLevelJsonSchemaCombinatorKey = (key: string): key is TopLevelJsonSchemaCombinatorKey =>\n key === 'anyOf' || key === 'oneOf' || key === 'allOf'\n\nconst topLevelJsonSchemaCombinator = (\n schema: JsonObject\n): TopLevelJsonSchemaCombinator | undefined => {\n for (const key of topLevelJsonSchemaCombinatorKeys) {\n const value = jsonObjectField(schema, key)\n\n if (Array.isArray(value)) {\n return { key, items: value }\n }\n }\n\n return undefined\n}\n\nconst withoutTopLevelJsonSchemaCombinators = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(schema).filter(([key]) => !isTopLevelJsonSchemaCombinatorKey(key))\n )\n\nconst withoutJsonSchemaCombinatorsAndTupleHints = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(schema).filter(\n ([key]) => !isTopLevelJsonSchemaCombinatorKey(key) && key !== 'prefixItems'\n )\n )\n\nconst jsonSchemaProperties = (schema: JsonObject) => {\n const properties = jsonObjectField(schema, 'properties')\n\n return isJsonObject(properties) ? properties : {}\n}\n\nconst jsonSchemaDefinitions = (schema: JsonObject) => {\n const definitions = jsonObjectField(schema, '$defs')\n\n return isJsonObject(definitions) ? definitions : {}\n}\n\nconst jsonSchemaRequired = (schema: JsonObject) => {\n const required = jsonObjectField(schema, 'required')\n\n return Array.isArray(required) ? required.filter(item => typeof item === 'string') : []\n}\n\nconst jsonValueKey = (value: unknown) =>\n Result.try(() => JSON.stringify(value)).pipe(\n Result.match({\n onFailure: () => undefined,\n onSuccess: encoded => encoded\n })\n )\n\nconst uniqueUnknownArray = (items: ReadonlyArray<unknown>): ReadonlyArray<unknown> => {\n const seen = new Set<string>()\n const result: Array<unknown> = []\n\n for (const item of items) {\n const key = jsonValueKey(item)\n\n if (key === undefined || seen.has(key)) {\n continue\n }\n\n seen.add(key)\n result.push(item)\n }\n\n return result\n}\n\nconst mergeEnumPropertySchemas = (left: unknown, right: unknown): unknown | undefined => {\n if (!isJsonObject(left) || !isJsonObject(right)) {\n return undefined\n }\n\n const leftEnum = jsonObjectField(left, 'enum')\n const rightEnum = jsonObjectField(right, 'enum')\n\n if (!Array.isArray(leftEnum) || !Array.isArray(rightEnum)) {\n return undefined\n }\n\n const leftType = jsonObjectField(left, 'type')\n const rightType = jsonObjectField(right, 'type')\n\n if (leftType !== rightType) {\n return undefined\n }\n\n return { ...left, ...right, enum: uniqueUnknownArray([...leftEnum, ...rightEnum]) }\n}\n\nconst jsonSchemaAnyOfItems = (schema: unknown) => {\n if (!isJsonObject(schema)) {\n return [schema]\n }\n\n const anyOf = jsonObjectField(schema, 'anyOf')\n\n return Array.isArray(anyOf) ? anyOf : [schema]\n}\n\nconst mergePropertySchemas = (left: unknown, right: unknown): unknown => {\n const leftKey = jsonValueKey(left)\n\n if (leftKey !== undefined && leftKey === jsonValueKey(right)) {\n return left\n }\n\n const mergedEnum = mergeEnumPropertySchemas(left, right)\n\n if (mergedEnum !== undefined) {\n return mergedEnum\n }\n\n return {\n anyOf: uniqueUnknownArray([...jsonSchemaAnyOfItems(left), ...jsonSchemaAnyOfItems(right)])\n }\n}\n\nconst mergeJsonSchemaObjects = (objects: ReadonlyArray<JsonObject>): JsonObject => {\n const merged = new Map<string, unknown>()\n\n for (const object of objects) {\n for (const [key, value] of Object.entries(object)) {\n if (merged.has(key)) {\n merged.set(key, mergePropertySchemas(merged.get(key), value))\n } else {\n merged.set(key, value)\n }\n }\n }\n\n return Object.fromEntries(merged)\n}\n\nconst normalizeJsonSchemaObjectFields = (schema: JsonObject): JsonObject =>\n Object.fromEntries(\n Object.entries(withoutJsonSchemaCombinatorsAndTupleHints(schema)).map(([key, value]) => [\n key,\n normalizeAnthropicToolSchema(value)\n ])\n )\n\nconst jsonSchemaType = (schema: JsonObject) => {\n const type = jsonObjectField(schema, 'type')\n\n return typeof type === 'string' ? type : undefined\n}\n\nconst isNullJsonSchema = (schema: JsonObject) => jsonSchemaType(schema) === 'null'\n\nconst firstJsonObject = (items: ReadonlyArray<JsonObject>) => items[0]\n\nconst mergeCompatibleVariants = (\n variants: ReadonlyArray<JsonObject>\n): JsonObject | undefined => {\n const first = firstJsonObject(variants)\n if (first === undefined) return undefined\n\n let merged: unknown = first\n\n for (const variant of variants.slice(1)) {\n merged = mergePropertySchemas(merged, variant)\n }\n\n if (!isJsonObject(merged)) return undefined\n\n if (Array.isArray(jsonObjectField(merged, 'anyOf'))) return undefined\n\n\n return merged\n}\n\nconst samePrimitiveTypeVariant = (variants: ReadonlyArray<JsonObject>): JsonObject | undefined => {\n const first = firstJsonObject(variants)\n const type = first === undefined ? undefined : jsonSchemaType(first)\n\n if (type === undefined || type === 'object' || type === 'array' || type === 'null') {\n return undefined\n }\n\n return variants.every(variant => jsonSchemaType(variant) === type) ? first : undefined\n}\n\nconst objectVariant = (variants: ReadonlyArray<JsonObject>): JsonObject | undefined => {\n if (\n variants.length === 0 ||\n variants.some(variant => {\n const type = jsonSchemaType(variant)\n\n return type !== undefined && type !== 'object'\n })\n ) {\n return undefined\n }\n\n return {\n type: 'object',\n properties: mergeJsonSchemaObjects(variants.map(jsonSchemaProperties)),\n required: mergeJsonSchemaRequired('oneOf', variants),\n $defs: mergeJsonSchemaObjects(variants.map(jsonSchemaDefinitions)),\n additionalProperties: mergeAdditionalProperties(variants) ?? false\n }\n}\n\nconst normalizeJsonSchemaCombinator = (\n schema: JsonObject,\n combinator: TopLevelJsonSchemaCombinator\n): JsonObject => {\n const base = normalizeJsonSchemaObjectFields(schema)\n const variants = combinator.items\n .map(normalizeAnthropicToolSchema)\n .filter(isJsonObject)\n .filter(variant => !isNullJsonSchema(variant))\n const first = firstJsonObject(variants)\n\n if (first === undefined) return base\n\n if (combinator.key === 'allOf') {\n return mergeJsonSchemaObjects([base, ...variants])\n }\n\n const merged =\n mergeCompatibleVariants(variants) ?? samePrimitiveTypeVariant(variants) ?? objectVariant(variants)\n\n return mergeJsonSchemaObjects([base, merged ?? first])\n}\n\nfunction normalizeAnthropicToolSchema(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(normalizeAnthropicToolSchema)\n if (!isJsonObject(value)) return value\n\n const combinator = topLevelJsonSchemaCombinator(value)\n if (combinator !== undefined) return normalizeJsonSchemaCombinator(value, combinator)\n\n return normalizeJsonSchemaObjectFields(value)\n}\n\nconst mergeJsonSchemaRequired = (\n combinatorKey: TopLevelJsonSchemaCombinatorKey,\n objects: ReadonlyArray<JsonObject>\n): ReadonlyArray<string> => {\n const requiredSets = objects.map(jsonSchemaRequired)\n\n if (requiredSets.length === 0) {\n return []\n }\n\n if (combinatorKey === 'allOf') {\n return Array.from(new Set(requiredSets.flat()))\n }\n\n const first = requiredSets[0] ?? []\n\n return first.filter(item => requiredSets.every(required => required.includes(item)))\n}\n\nconst mergeAdditionalProperties = (objects: ReadonlyArray<JsonObject>) => {\n const values = objects.map(object => jsonObjectField(object, 'additionalProperties'))\n\n if (values.every(value => value === false)) {\n return false\n }\n\n if (values.every(value => value === true)) {\n return true\n }\n\n return undefined\n}\n\n// Anthropic rejects root combinators. This widens provider-facing guidance only;\n// tool execution still validates calls against the original registry schema.\nconst flattenTopLevelCombinatorToolSchema = (\n schema: JsonObject,\n combinator: TopLevelJsonSchemaCombinator\n): JsonObject => {\n const base = withoutTopLevelJsonSchemaCombinators(schema)\n const objectVariants = combinator.items.filter(isJsonObject)\n const additionalProperties = mergeAdditionalProperties(objectVariants)\n const flattened = {\n ...base,\n type: 'object',\n properties: mergeJsonSchemaObjects(objectVariants.map(jsonSchemaProperties)),\n required: mergeJsonSchemaRequired(combinator.key, objectVariants),\n $defs: mergeJsonSchemaObjects([\n jsonSchemaDefinitions(schema),\n ...objectVariants.map(jsonSchemaDefinitions)\n ])\n }\n\n if (additionalProperties === undefined) {\n return flattened\n }\n\n return { ...flattened, additionalProperties }\n}\n\nconst anthropicToolInputSchema = (schema: unknown): unknown => {\n if (!isJsonObject(schema)) {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false\n }\n }\n\n const combinator = topLevelJsonSchemaCombinator(schema)\n\n if (combinator !== undefined) {\n return normalizeAnthropicToolSchema(flattenTopLevelCombinatorToolSchema(schema, combinator))\n }\n\n if (jsonObjectField(schema, 'type') !== undefined) {\n return normalizeAnthropicToolSchema(schema)\n }\n\n return normalizeAnthropicToolSchema({ ...schema, type: 'object' })\n}\n\nconst toAnthropicMessage = (message: AgentMessage): Effect.Effect<AnthropicMessage, LLMError> =>\n Effect.gen(function* () {\n switch (message._tag) {\n case 'User':\n return {\n role: 'user',\n content: yield* contentToAnthropicContent(\n prependMessageContextToContent(message.content, messageContextText(message))\n )\n }\n case 'Assistant': {\n const text = yield* contentToText(\n prependMessageContextToContent(assistantContent(message), messageContextText(message)),\n 'Assistant'\n )\n const textBlocks: ReadonlyArray<AnthropicTextBlock> =\n text.length === 0 ? [] : [{ type: 'text', text }]\n const toolBlocks = assistantHostToolCalls(message).map(toolCallToAnthropicBlock)\n return { role: 'assistant', content: [...textBlocks, ...toolBlocks] }\n }\n case 'ToolResult':\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: yield* contentToAnthropicContent(\n prependMessageContextToContent(message.content, messageContextText(message))\n ),\n is_error: message.isError\n }\n ]\n }\n }\n })\n\nconst toAnthropicTool = (tool: ToolDef): AnthropicTool => ({\n name: prefixClaudeToolName(tool.name),\n description: tool.description,\n input_schema: anthropicToolInputSchema(tool.parameters)\n})\n\nexport const toAnthropicClaudeRequestBody = (\n request: LLMRequest,\n config: { readonly maxTokens: number; readonly stream?: boolean }\n): Effect.Effect<AnthropicRequestBody, LLMError> =>\n Effect.gen(function* () {\n yield* validateProviderTranscript(request.messages)\n const rawMessages = yield* Effect.forEach(request.messages, toAnthropicMessage)\n const billingSystemBlock = yield* makeAnthropicClaudeBillingSystemBlock(rawMessages)\n const messages = prependSystemPromptToFirstUserMessage(rawMessages, request.systemPrompt)\n const outputConfig =\n request.reasoningEffort === undefined || request.reasoningEffort === 'minimal'\n ? undefined\n : { effort: request.reasoningEffort }\n const baseBody = {\n model: request.model,\n system: [billingSystemBlock, anthropicClaudeIdentitySystemBlock],\n messages,\n max_tokens: config.maxTokens,\n ...(outputConfig === undefined ? {} : { output_config: outputConfig })\n }\n const body: AnthropicRequestBody =\n config.stream === true ? { ...baseBody, stream: true } : baseBody\n\n if (request.tools.length === 0) {\n return body\n }\n\n return {\n ...body,\n tools: request.tools.map(toAnthropicTool)\n }\n })\n\nconst anthropicClaudeProvider = 'anthropic_claude'\n\nconst toHttpClientLlmError =\n (message: string, retryable: boolean, kind: ProviderFailureKind = 'network') =>\n (error: HttpClientError.HttpClientError) =>\n new LLMError({\n cause: 'provider_error',\n message: `${message}: ${error.message}`,\n retryable,\n provider: providerErrorInfo({\n provider: anthropicClaudeProvider,\n kind: retryable ? kind : 'unknown'\n })\n })\n\nconst decodeJsonString = (raw: string, message: string) =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `${message}: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null\n\nconst field = (value: unknown, key: string) =>\n isRecord(value) ? Object.getOwnPropertyDescriptor(value, key)?.value : undefined\n\nconst stringField = (value: unknown, key: string) => {\n const raw = field(value, key)\n return typeof raw === 'string' ? raw : undefined\n}\n\ntype AnthropicHttpErrorInfo = {\n readonly message?: string\n readonly providerCode?: string\n}\n\nconst maxAnthropicHttpErrorMessageCharacters = 1_000\n\nconst boundedAnthropicHttpErrorMessage = (message: string) =>\n message.length <= maxAnthropicHttpErrorMessageCharacters\n ? message\n : `${message.slice(0, maxAnthropicHttpErrorMessageCharacters)}…`\n\nconst decodeAnthropicHttpErrorInfo = (\n raw: string\n): Effect.Effect<AnthropicHttpErrorInfo> =>\n Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)(raw).pipe(\n Effect.map(parsed => {\n const error = field(parsed, 'error')\n const message = stringField(error, 'message')\n const providerCode = stringField(error, 'type') ?? stringField(error, 'code')\n\n return {\n ...(message === undefined\n ? {}\n : { message: boundedAnthropicHttpErrorMessage(message) }),\n ...(providerCode === undefined ? {} : { providerCode })\n }\n }),\n Effect.catch(() => Effect.succeed({}))\n )\n\nconst providerSignalError = (input: {\n readonly message: string\n readonly providerCode?: string\n readonly fallbackKind?: ProviderFailureKind\n}) => {\n const provider = classifyProviderFailure({\n provider: anthropicClaudeProvider,\n message: input.message,\n ...(input.providerCode === undefined ? {} : { providerCode: input.providerCode }),\n ...(input.fallbackKind === undefined ? {} : { fallbackKind: input.fallbackKind })\n })\n\n return new LLMError({\n cause: providerFailureCause(provider.kind),\n message: input.message,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n}\n\nconst numberField = (value: unknown, key: string) => {\n const raw = field(value, key)\n return typeof raw === 'number' ? raw : undefined\n}\n\nconst sseDataFromBlock = (block: string) =>\n block\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice('data:'.length).trimStart())\n .join('\\n')\n .trim()\n\nconst dataFromSseBlock = (block: string) => {\n const data = sseDataFromBlock(block)\n\n if (data.length === 0 || data === '[DONE]') {\n return undefined\n }\n\n return data\n}\n\nconst normalizeNewlines = (text: string) => text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n\nconst splitCompleteSseBlocks = (buffer: string) => {\n const blocks = buffer.split('\\n\\n')\n const tail = blocks.at(-1) ?? ''\n\n return { completeBlocks: blocks.slice(0, -1), tail }\n}\n\nconst parseToolParams = (raw: string) => {\n const trimmed = raw.trim()\n\n if (trimmed.length === 0) return Effect.succeed({})\n\n return decodeJsonString(trimmed, 'Invalid Anthropic Claude tool arguments JSON')\n}\n\ntype AnthropicUsageComponents = {\n readonly inputTokens: number\n readonly outputTokens: number\n readonly cacheReadInputTokens: number\n readonly cacheCreationInputTokens: number\n}\n\nconst zeroAnthropicUsageComponents: AnthropicUsageComponents = {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0\n}\n\nconst positiveOrUndefined = (value: number) => (value > 0 ? value : undefined)\n\nconst toAgentUsageFromComponents = (usage: AnthropicUsageComponents) =>\n AgentUsage.make({\n input: AgentInputUsage.make({\n total: usage.inputTokens + usage.cacheReadInputTokens + usage.cacheCreationInputTokens,\n uncached: positiveOrUndefined(usage.inputTokens),\n cacheRead: positiveOrUndefined(usage.cacheReadInputTokens),\n cacheWrite: positiveOrUndefined(usage.cacheCreationInputTokens)\n }),\n output: AgentOutputUsage.make({\n total: usage.outputTokens,\n text: positiveOrUndefined(usage.outputTokens)\n })\n })\n\nconst toAgentUsage = (usage: AnthropicUsageResponse) =>\n toAgentUsageFromComponents({\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadInputTokens: usage.cache_read_input_tokens ?? 0,\n cacheCreationInputTokens: usage.cache_creation_input_tokens ?? 0\n })\n\nconst nextAnthropicUsageSnapshot = (\n previous: AnthropicUsageComponents,\n usage: AnthropicStreamUsageResponse\n): AnthropicUsageComponents => ({\n inputTokens: usage.input_tokens ?? previous.inputTokens,\n outputTokens: usage.output_tokens ?? previous.outputTokens,\n cacheReadInputTokens: usage.cache_read_input_tokens ?? previous.cacheReadInputTokens,\n cacheCreationInputTokens: usage.cache_creation_input_tokens ?? previous.cacheCreationInputTokens\n})\n\nconst usageComponentDelta = (previous: number, next: number) => Math.max(0, next - previous)\n\nconst anthropicUsageDelta = (\n previous: AnthropicUsageComponents,\n next: AnthropicUsageComponents\n): AnthropicUsageComponents => ({\n inputTokens: usageComponentDelta(previous.inputTokens, next.inputTokens),\n outputTokens: usageComponentDelta(previous.outputTokens, next.outputTokens),\n cacheReadInputTokens: usageComponentDelta(\n previous.cacheReadInputTokens,\n next.cacheReadInputTokens\n ),\n cacheCreationInputTokens: usageComponentDelta(\n previous.cacheCreationInputTokens,\n next.cacheCreationInputTokens\n )\n})\n\nconst hasAnthropicUsage = (usage: AnthropicUsageComponents) =>\n usage.inputTokens > 0 ||\n usage.outputTokens > 0 ||\n usage.cacheReadInputTokens > 0 ||\n usage.cacheCreationInputTokens > 0\n\ntype AnthropicStreamUsageStep = {\n readonly snapshot: AnthropicUsageComponents\n readonly events: ReadonlyArray<LLMEvent>\n}\n\nconst usageStepFromUnknown = (\n usage: unknown,\n previous: AnthropicUsageComponents\n): AnthropicStreamUsageStep => {\n const parsed = Schema.decodeUnknownOption(AnthropicStreamUsageResponse)(usage)\n\n if (parsed._tag === 'None') {\n return { snapshot: previous, events: [] }\n }\n\n const value = parsed.value\n const snapshot = nextAnthropicUsageSnapshot(previous, value)\n const delta = anthropicUsageDelta(previous, snapshot)\n\n return {\n snapshot,\n events: hasAnthropicUsage(delta)\n ? [LLMUsage.make({ usage: toAgentUsageFromComponents(delta) })]\n : []\n }\n}\n\nconst toLlmEvents = (\n response: AnthropicMessageResponse\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n if (response.stop_reason === 'max_tokens') {\n return yield* Effect.fail(anthropicMaxTokensError())\n }\n\n const events = yield* Effect.forEach(response.content, block => {\n switch (block.type) {\n case 'text':\n return Effect.succeed<LLMEvent>(LLMTextDelta.make({ text: block.text }))\n case 'thinking':\n return Effect.succeed<LLMEvent>(LLMReasoningDelta.make({ text: block.thinking }))\n case 'tool_use':\n return Effect.succeed<LLMEvent>(\n LLMToolCall.make({\n call: ToolCall.make({\n id: block.id,\n name: unprefixClaudeToolName(block.name),\n params: block.input\n })\n })\n )\n }\n })\n const stopReason = response.stop_reason === 'tool_use' ? 'tool_use' : 'stop'\n const usageEvent =\n response.usage === undefined ? [] : [LLMUsage.make({ usage: toAgentUsage(response.usage) })]\n\n return [...events, LLMDone.make({ stopReason }), ...usageEvent]\n })\n\nconst decodeAnthropicMessageResponse = (json: unknown) =>\n Schema.decodeUnknownEffect(AnthropicMessageResponse)(json).pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'invalid_response',\n message: `Invalid Anthropic Claude response: ${unknownToMessage(error)}`,\n retryable: false\n })\n )\n )\n\nconst parseAnthropicJsonResponse = (\n raw: string\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const json = yield* decodeJsonString(raw, 'Could not parse Anthropic Claude response JSON')\n const parsed = yield* decodeAnthropicMessageResponse(json)\n\n return yield* toLlmEvents(parsed)\n })\n\ntype AnthropicBodyFormat = 'undecided' | 'sse' | 'json'\n\ntype AnthropicSseState = {\n readonly hasToolCall: boolean\n readonly hasDone: boolean\n readonly stopReason?: string\n readonly usage: AnthropicUsageComponents\n}\n\ntype AnthropicSseStep = {\n readonly state: AnthropicSseState\n readonly events: ReadonlyArray<LLMEvent>\n}\n\ntype AnthropicBodyState = {\n readonly format: AnthropicBodyFormat\n readonly buffer: string\n readonly sse: AnthropicSseState\n}\n\nconst initialSseState: AnthropicSseState = {\n hasToolCall: false,\n hasDone: false,\n usage: zeroAnthropicUsageComponents\n}\n\nconst initialBodyState: AnthropicBodyState = {\n format: 'undecided',\n buffer: '',\n sse: initialSseState\n}\n\nconst classifyAnthropicBody = (buffer: string): AnthropicBodyFormat => {\n const trimmed = buffer.trimStart()\n\n if (trimmed.length === 0) {\n return 'undecided'\n }\n\n if (trimmed.startsWith('event:') || trimmed.startsWith('data:')) {\n return 'sse'\n }\n\n if ('event:'.startsWith(trimmed) || 'data:'.startsWith(trimmed)) {\n return 'undecided'\n }\n\n return 'json'\n}\n\nconst invalidToolUseStartError = () =>\n new LLMError({\n cause: 'invalid_response',\n message: 'Invalid Anthropic Claude tool_use stream block',\n retryable: false\n })\n\nconst anthropicMaxTokensError = () =>\n new LLMError({\n cause: 'invalid_response',\n message: 'Anthropic Claude stopped after reaching max_tokens',\n retryable: false\n })\n\nconst makeAnthropicStreamEmitter = () => {\n const toolBlocks = new Map<number, AnthropicToolBlockState>()\n\n return (state: AnthropicSseState, data: unknown): Effect.Effect<AnthropicSseStep, LLMError> => {\n const type = stringField(data, 'type')\n\n if (type === 'message_start') {\n const message = field(data, 'message')\n const step = usageStepFromUnknown(field(message, 'usage'), state.usage)\n\n return Effect.succeed({ state: { ...state, usage: step.snapshot }, events: step.events })\n }\n\n if (type === 'content_block_start') {\n const index = numberField(data, 'index')\n const block = field(data, 'content_block')\n\n if (index !== undefined && stringField(block, 'type') === 'tool_use') {\n const id = stringField(block, 'id')\n const name = stringField(block, 'name')\n\n if (id === undefined || name === undefined) {\n return Effect.fail(invalidToolUseStartError())\n }\n\n toolBlocks.set(index, {\n id,\n name: unprefixClaudeToolName(name),\n partialJson: ''\n })\n }\n\n return Effect.succeed({ state, events: [] })\n }\n\n if (type === 'content_block_delta') {\n const index = numberField(data, 'index')\n const delta = field(data, 'delta')\n const deltaType = stringField(delta, 'type')\n const text = stringField(delta, 'text')\n const thinking = stringField(delta, 'thinking')\n const partialJson = stringField(delta, 'partial_json')\n\n if (deltaType === 'text_delta' && text !== undefined) {\n return Effect.succeed({ state, events: [LLMTextDelta.make({ text })] })\n }\n\n if (deltaType === 'thinking_delta' && thinking !== undefined) {\n return Effect.succeed({ state, events: [LLMReasoningDelta.make({ text: thinking })] })\n }\n\n if (index !== undefined && deltaType === 'input_json_delta' && partialJson !== undefined) {\n const current = toolBlocks.get(index)\n if (current !== undefined) {\n toolBlocks.set(index, { ...current, partialJson: `${current.partialJson}${partialJson}` })\n }\n }\n\n return Effect.succeed({ state, events: [] })\n }\n\n if (type === 'content_block_stop') {\n const index = numberField(data, 'index')\n const toolBlock = index === undefined ? undefined : toolBlocks.get(index)\n\n if (toolBlock === undefined) return Effect.succeed({ state, events: [] })\n\n return parseToolParams(toolBlock.partialJson).pipe(\n Effect.map(params => {\n if (index !== undefined) toolBlocks.delete(index)\n\n return {\n state: { ...state, hasToolCall: true },\n events: [\n LLMToolCall.make({\n call: ToolCall.make({\n id: toolBlock.id,\n name: toolBlock.name,\n params\n })\n })\n ]\n }\n })\n )\n }\n\n if (type === 'message_delta') {\n const step = usageStepFromUnknown(field(data, 'usage'), state.usage)\n const delta = field(data, 'delta')\n const stopReason = stringField(delta, 'stop_reason')\n\n return Effect.succeed({\n state: {\n ...state,\n usage: step.snapshot,\n ...(stopReason === undefined ? {} : { stopReason })\n },\n events: step.events\n })\n }\n\n if (type === 'message_stop') {\n if (state.stopReason === 'max_tokens') return Effect.fail(anthropicMaxTokensError())\n\n return Effect.succeed({\n state: { ...state, hasDone: true },\n events: [LLMDone.make({ stopReason: state.hasToolCall ? 'tool_use' : 'stop' })]\n })\n }\n\n if (type === 'error') {\n const error = field(data, 'error')\n const providerCode = stringField(error, 'type') ?? stringField(error, 'code')\n\n return Effect.fail(\n providerSignalError({\n message: stringField(error, 'message') ?? 'Anthropic Claude stream error',\n ...(providerCode === undefined ? {} : { providerCode })\n })\n )\n }\n\n return Effect.succeed({ state, events: [] })\n }\n}\n\nconst processSseData = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n data: string\n): Effect.Effect<AnthropicSseStep, LLMError> =>\n decodeJsonString(data, 'Could not parse Anthropic Claude stream event JSON').pipe(\n Effect.flatMap(parsed => emitData(state, parsed))\n )\n\nconst processSseBlock = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n block: string\n): Effect.Effect<AnthropicSseStep, LLMError> => {\n const data = dataFromSseBlock(block)\n\n if (data === undefined) {\n return Effect.succeed({ state, events: [] })\n }\n\n return processSseData(emitData, state, data)\n}\n\nconst processSseBlocks = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicSseState,\n blocks: ReadonlyArray<string>\n): Effect.Effect<AnthropicSseStep, LLMError> =>\n Effect.gen(function* () {\n const events: Array<LLMEvent> = []\n let currentState = state\n\n for (const block of blocks) {\n const step = yield* processSseBlock(emitData, currentState, block)\n currentState = step.state\n events.push(...step.events)\n }\n\n return { state: currentState, events }\n })\n\nconst processBodyChunk = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicBodyState,\n chunk: string\n): Effect.Effect<AnthropicSseStep & { readonly bodyState: AnthropicBodyState }, LLMError> =>\n Effect.gen(function* () {\n const buffer = normalizeNewlines(`${state.buffer}${chunk}`)\n const format = state.format === 'undecided' ? classifyAnthropicBody(buffer) : state.format\n\n if (format !== 'sse') {\n return {\n state: state.sse,\n bodyState: { ...state, format, buffer },\n events: []\n }\n }\n\n const split = splitCompleteSseBlocks(buffer)\n const step = yield* processSseBlocks(emitData, state.sse, split.completeBlocks)\n\n return {\n state: step.state,\n bodyState: { format, buffer: split.tail, sse: step.state },\n events: step.events\n }\n })\n\nconst finalizeBodyState = (\n emitData: ReturnType<typeof makeAnthropicStreamEmitter>,\n state: AnthropicBodyState\n): Effect.Effect<ReadonlyArray<LLMEvent>, LLMError> =>\n Effect.gen(function* () {\n const buffer = normalizeNewlines(state.buffer)\n const format = state.format === 'undecided' ? classifyAnthropicBody(buffer) : state.format\n\n if (format === 'json') {\n return yield* parseAnthropicJsonResponse(buffer)\n }\n\n const events: Array<LLMEvent> = []\n let sseState = state.sse\n\n if (format === 'sse') {\n const split = splitCompleteSseBlocks(buffer)\n const step = yield* processSseBlocks(emitData, sseState, split.completeBlocks)\n sseState = step.state\n events.push(...step.events)\n\n if (split.tail.trim().length > 0) {\n const tailStep = yield* processSseBlock(emitData, sseState, split.tail)\n sseState = tailStep.state\n events.push(...tailStep.events)\n }\n }\n\n if (sseState.stopReason === 'max_tokens') {\n return yield* Effect.fail(anthropicMaxTokensError())\n }\n\n if (!sseState.hasDone) {\n events.push(LLMDone.make({ stopReason: sseState.hasToolCall ? 'tool_use' : 'stop' }))\n }\n\n return events\n })\n\nexport const streamAnthropicClaudeResponse = (\n response: HttpClientResponse.HttpClientResponse\n): Stream.Stream<LLMEvent, LLMError> =>\n Stream.unwrap(\n Ref.make(initialBodyState).pipe(\n Effect.map(bodyStateRef => {\n const emitData = makeAnthropicStreamEmitter()\n const chunks = response.stream.pipe(\n Stream.mapError(\n toHttpClientLlmError('Could not read Anthropic Claude stream', true, 'stream')\n ),\n Stream.decodeText,\n Stream.mapEffect(chunk =>\n Effect.gen(function* () {\n const state = yield* Ref.get(bodyStateRef)\n const step = yield* processBodyChunk(emitData, state, chunk)\n yield* Ref.set(bodyStateRef, step.bodyState)\n return step.events\n })\n ),\n Stream.flatMap(events => Stream.fromIterable(events))\n )\n const finalEvents = Stream.fromEffect(\n Ref.get(bodyStateRef).pipe(Effect.flatMap(state => finalizeBodyState(emitData, state)))\n ).pipe(Stream.flatMap(events => Stream.fromIterable(events)))\n\n return chunks.pipe(Stream.concat(finalEvents))\n })\n )\n )\n\nconst sendAnthropicClaudeRequest = (\n config: AnthropicClaudeProviderConfig,\n request: LLMRequest,\n client: HttpClient.HttpClient,\n sessionId: string\n): Effect.Effect<HttpClientResponse.HttpClientResponse, LLMError> =>\n Effect.gen(function* () {\n const body = yield* toAnthropicClaudeRequestBody(request, { ...config, stream: true })\n // Replayed transcripts can carry lone surrogates; harden the lowered\n // body so one bad historical string cannot poison every model call.\n const serializedBody = yield* encodeJsonString(\n replaceLoneSurrogatesDeep(body),\n 'Could not serialize Anthropic Claude request'\n )\n const httpRequest = HttpClientRequest.post(\n config.messagesUrl ?? anthropicClaudeMessagesUrl\n ).pipe(\n HttpClientRequest.setHeaders({\n accept: 'text/event-stream',\n ...anthropicClaudeAuthorizationHeaders(config.token),\n 'content-type': 'application/json',\n ...makeAnthropicClaudeCompatibilityHeaders({ model: request.model, sessionId }),\n ...config.extraHeaders\n }),\n HttpClientRequest.bodyText(serializedBody, 'application/json')\n )\n const response = yield* client\n .execute(httpRequest)\n .pipe(Effect.mapError(toHttpClientLlmError('Anthropic Claude request failed', true)))\n\n if (response.status < 200 || response.status >= 300) {\n const errorText = yield* response.text.pipe(\n Effect.mapError(\n error =>\n new LLMError({\n cause: 'provider_error',\n message: `Could not read Anthropic Claude error body: ${error.message}`,\n retryable: false\n })\n )\n )\n const errorInfo = yield* decodeAnthropicHttpErrorInfo(errorText)\n\n const provider = classifyProviderFailure({\n provider: anthropicClaudeProvider,\n status: response.status,\n headers: response.headers,\n body: errorText,\n ...(errorInfo.message === undefined ? {} : { message: errorInfo.message }),\n ...(errorInfo.providerCode === undefined\n ? {}\n : { providerCode: errorInfo.providerCode })\n })\n const message =\n errorInfo.message === undefined\n ? `Anthropic Claude returned ${response.status}`\n : `Anthropic Claude returned ${response.status}: ${errorInfo.message}`\n\n return yield* Effect.fail(\n new LLMError({\n cause: providerFailureCause(provider.kind),\n message,\n retryable: providerFailureRetryable(provider.kind),\n provider\n })\n )\n }\n\n return response\n }).pipe(Effect.withSpan('AnthropicClaudeProvider.stream'))\n\nexport const makeAnthropicClaudeProviderLayer = (config: AnthropicClaudeProviderConfig) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient\n const sessionId = makeAnthropicClaudeRequestId()\n\n return LLMProvider.of({\n stream: request =>\n Stream.fromEffect(sendAnthropicClaudeRequest(config, request, client, sessionId)).pipe(\n Stream.flatMap(streamAnthropicClaudeResponse)\n )\n })\n })\n )\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-provider.d.mts","names":[],"sources":["../../../src/providers/openai/codex-provider.ts"],"mappings":";;;;;;;KAiDY,2BAAA;AAAA,KAEA,yBAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,eAAA;EAAA,SACA,YAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;EAAA,SACxB,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA;AAAA,KAGzB,uBAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA,WAAkB,aAAa,CAAC,2BAAA;AAAA;AAAA,KAGtC,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,yBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAS;AAAA;AAAA,KAGf,wBAAA;EAAA,SAEU,IAAA;EAAA,SACA,QAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGV,2BAAA,GACD,wBAAA,GACA,yBAAA,GACA,wBAAA;AAAA,KAEC,yBAAA,YAAqC,aAAa,CAAC,2BAAA;AAAA,KAEnD,4BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;AAAA;AAAA,KAGN,8BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,MAAA,EAAQ,yBAAyB;AAAA;AAAA,KAGvC,oBAAA,GACD,uBAAA,GACA,4BAAA,GACA,8BAAA;AAAA,KAEC,eAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAA;EAAA,SACA,WAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGN,sBAAA;EAAA,SACM,KAAA;EAAA,SACA,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,oBAAA;EAAA,SACrB,KAAA;EAAA,SACA,MAAA;EAAA,SACA,SAAA;IAAA,SACE,MAAA,EAAQ,oBAAA;IAAA,SACR,OAAA,EAAS,2BAAA;EAAA;EAAA,SAEX,KAAA,GAAQ,aAAA,CAAc,eAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,cA2RE,wBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SACW,eAAA;EAAA,SACA,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA,MAE7B,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,QAAA;AAAA,cA0lB5B,yBAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cA0Fd,4BAAA,GAAgC,MAAA,EAAQ,yBAAA,KAAyB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
1
+ {"version":3,"file":"codex-provider.d.mts","names":[],"sources":["../../../src/providers/openai/codex-provider.ts"],"mappings":";;;;;;;KAiDY,2BAAA;AAAA,KAEA,yBAAA;EAAA,SACD,KAAA,EAAO,gBAAA;EAAA,SACP,eAAA;EAAA,SACA,YAAA;EAAA,SACA,YAAA,GAAe,QAAA,CAAS,MAAA;EAAA,SACxB,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA;AAAA,KAGzB,uBAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA,WAAkB,aAAa,CAAC,2BAAA;AAAA;AAAA,KAGtC,wBAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGV,yBAAA;EAAA,SACM,IAAA;EAAA,SACA,SAAS;AAAA;AAAA,KAGf,wBAAA;EAAA,SAEU,IAAA;EAAA,SACA,QAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGV,2BAAA,GACD,wBAAA,GACA,yBAAA,GACA,wBAAA;AAAA,KAEC,yBAAA,YAAqC,aAAa,CAAC,2BAAA;AAAA,KAEnD,4BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;AAAA;AAAA,KAGN,8BAAA;EAAA,SACM,IAAA;EAAA,SACA,OAAA;EAAA,SACA,MAAA,EAAQ,yBAAyB;AAAA;AAAA,KAGvC,oBAAA,GACD,uBAAA,GACA,4BAAA,GACA,8BAAA;AAAA,KAEC,eAAA;EAAA,SACM,IAAA;EAAA,SACA,IAAA;EAAA,SACA,WAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGN,sBAAA;EAAA,SACM,KAAA;EAAA,SACA,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,oBAAA;EAAA,SACrB,KAAA;EAAA,SACA,MAAA;EAAA,SACA,SAAA;IAAA,SACE,MAAA,EAAQ,oBAAA;IAAA,SACR,OAAA,EAAS,2BAAA;EAAA;EAAA,SAEX,KAAA,GAAQ,aAAA,CAAc,eAAA;EAAA,SACtB,mBAAA;AAAA;AAAA,cA2RE,wBAAA,GACX,OAAA,EAAS,UAAA,EACT,MAAA;EAAA,SACW,eAAA;EAAA,SACA,sBAAA,GAAyB,oBAAA;EAAA,SACzB,gBAAA,GAAmB,2BAAA;AAAA,MAE7B,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,QAAA;AAAA,cA2lB5B,yBAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,kBAAA,KAC5B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAA;AAAA,cA0Fd,4BAAA,GAAgC,MAAA,EAAQ,yBAAA,KAAyB,KAAA,CAAA,KAAA,CAAA,WAAA,SAAA,UAAA,CAAA,UAAA"}
@@ -285,10 +285,18 @@ const initialBodyState = {
285
285
  sse: {
286
286
  hasTextDelta: false,
287
287
  hasReasoningDelta: false,
288
- hasToolCall: false,
288
+ toolCallIds: /* @__PURE__ */ new Set(),
289
289
  hasDone: false
290
290
  }
291
291
  };
292
+ const shouldEmitSseEvent = (state, event) => {
293
+ if (state.hasTextDelta && event._tag === "TextDelta") return false;
294
+ if (state.hasReasoningDelta && event._tag === "ReasoningDelta") return false;
295
+ if (event._tag === "ToolCall" && state.toolCallIds.has(event.call.id)) return false;
296
+ return true;
297
+ };
298
+ const dedupeSseEvents = (state, events) => events.filter((event) => shouldEmitSseEvent(state, event));
299
+ const toolCallIdsFromEvents = (events) => events.flatMap((event) => event._tag === "ToolCall" ? [event.call.id] : []);
292
300
  const normalizeNewlines = (text) => text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
293
301
  const classifyCodexBody = (buffer) => {
294
302
  const trimmed = buffer.trimStart();
@@ -344,15 +352,15 @@ const eventsFromOutputItemDone = (event) => Effect.gen(function* () {
344
352
  if (item === void 0) return yield* Effect.fail(invalidFunctionCallSseItemError());
345
353
  return yield* decodeOpenAiCodexOutputItem(item).pipe(Effect.flatMap(eventsFromOutputItem));
346
354
  });
355
+ const responseWithoutReplayedToolCalls = (response, emittedCallIds) => ({
356
+ ...response,
357
+ output: response.output.filter((item) => item.type !== "function_call" || !emittedCallIds.has(item.call_id))
358
+ });
347
359
  const finalResponseToEvents = (response, state) => Effect.gen(function* () {
348
- const finalEvents = yield* toLlmEvents(yield* decodeOpenAiCodexResponse(response), { allowEmptyStop: state.hasTextDelta || state.hasToolCall });
349
- const dedupedEvents = state.hasTextDelta || state.hasReasoningDelta || state.hasToolCall ? finalEvents.filter((event) => {
350
- if (state.hasTextDelta && event._tag === "TextDelta") return false;
351
- if (state.hasReasoningDelta && event._tag === "ReasoningDelta") return false;
352
- if (state.hasToolCall && event._tag === "ToolCall") return false;
353
- return true;
354
- }) : finalEvents;
355
- if (!state.hasToolCall) return dedupedEvents;
360
+ const hasToolCalls = state.toolCallIds.size > 0;
361
+ const finalEvents = yield* toLlmEvents(responseWithoutReplayedToolCalls(yield* decodeOpenAiCodexResponse(response), state.toolCallIds), { allowEmptyStop: state.hasTextDelta || hasToolCalls });
362
+ const dedupedEvents = state.hasTextDelta || state.hasReasoningDelta || hasToolCalls ? dedupeSseEvents(state, finalEvents) : finalEvents;
363
+ if (!hasToolCalls) return dedupedEvents;
356
364
  return dedupedEvents.map((event) => event._tag === "Done" ? LLMDone.make({ stopReason: "tool_use" }) : event);
357
365
  });
358
366
  const processSseData = (state, data) => Effect.gen(function* () {
@@ -377,17 +385,13 @@ const processSseData = (state, data) => Effect.gen(function* () {
377
385
  };
378
386
  const outputItemDoneEvents = yield* eventsFromOutputItemDone(parsed);
379
387
  if (outputItemDoneEvents.length > 0) {
380
- const events = outputItemDoneEvents.filter((event) => {
381
- if (state.hasTextDelta && event._tag === "TextDelta") return false;
382
- if (state.hasReasoningDelta && event._tag === "ReasoningDelta") return false;
383
- if (state.hasToolCall && event._tag === "ToolCall") return false;
384
- return true;
385
- });
388
+ const events = dedupeSseEvents(state, outputItemDoneEvents);
389
+ const emittedToolCallIds = toolCallIdsFromEvents(events);
386
390
  return {
387
391
  state: {
388
392
  hasTextDelta: state.hasTextDelta || events.some((event) => event._tag === "TextDelta"),
389
393
  hasReasoningDelta: state.hasReasoningDelta || events.some((event) => event._tag === "ReasoningDelta"),
390
- hasToolCall: state.hasToolCall || events.some((event) => event._tag === "ToolCall"),
394
+ toolCallIds: new Set([...state.toolCallIds, ...emittedToolCallIds]),
391
395
  hasDone: state.hasDone
392
396
  },
393
397
  events
@@ -397,12 +401,12 @@ const processSseData = (state, data) => Effect.gen(function* () {
397
401
  const events = yield* finalResponseToEvents(parsed.response, state);
398
402
  const emittedText = events.some((event) => event._tag === "TextDelta");
399
403
  const emittedReasoning = events.some((event) => event._tag === "ReasoningDelta");
400
- const emittedToolCall = events.some((event) => event._tag === "ToolCall");
404
+ const emittedToolCallIds = toolCallIdsFromEvents(events);
401
405
  return {
402
406
  state: {
403
407
  hasTextDelta: state.hasTextDelta || emittedText,
404
408
  hasReasoningDelta: state.hasReasoningDelta || emittedReasoning,
405
- hasToolCall: state.hasToolCall || emittedToolCall,
409
+ toolCallIds: new Set([...state.toolCallIds, ...emittedToolCallIds]),
406
410
  hasDone: true
407
411
  },
408
412
  events
@@ -491,7 +495,7 @@ const finalizeBodyState = (state) => Effect.gen(function* () {
491
495
  events.push(...tailStep.events);
492
496
  }
493
497
  }
494
- if (!sseState.hasDone) events.push(LLMDone.make({ stopReason: sseState.hasToolCall ? "tool_use" : "stop" }));
498
+ if (!sseState.hasDone) events.push(LLMDone.make({ stopReason: sseState.toolCallIds.size > 0 ? "tool_use" : "stop" }));
495
499
  return events;
496
500
  });
497
501
  const toHttpClientLlmError = (message, retryable, kind = "network") => (error) => new LLMError({