@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 +15 -1
- package/dist/providers/anthropic/claude-provider.d.mts +3 -0
- package/dist/providers/anthropic/claude-provider.d.mts.map +1 -1
- package/dist/providers/anthropic/claude-provider.mjs +3 -1
- package/dist/providers/anthropic/claude-provider.mjs.map +1 -1
- package/dist/providers/openai/codex-provider.d.mts.map +1 -1
- package/dist/providers/openai/codex-provider.mjs +23 -19
- package/dist/providers/openai/codex-provider.mjs.map +1 -1
- package/dist/tools/index.d.mts +2 -2
- package/dist/tools/task.d.mts +24 -11
- package/dist/tools/task.d.mts.map +1 -1
- package/dist/tools/task.mjs +52 -10
- package/dist/tools/task.mjs.map +1 -1
- package/package.json +1 -1
- package/src/providers/anthropic/claude-provider.ts +9 -1
- package/src/providers/openai/codex-provider.ts +44 -43
- package/src/tools/README.md +23 -3
- package/src/tools/index.ts +3 -0
- package/src/tools/task.ts +117 -14
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
|
-
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
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
|
|
381
|
-
|
|
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
|
-
|
|
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
|
|
404
|
+
const emittedToolCallIds = toolCallIdsFromEvents(events);
|
|
401
405
|
return {
|
|
402
406
|
state: {
|
|
403
407
|
hasTextDelta: state.hasTextDelta || emittedText,
|
|
404
408
|
hasReasoningDelta: state.hasReasoningDelta || emittedReasoning,
|
|
405
|
-
|
|
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.
|
|
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({
|