@standardagents/anthropic 0.41.4 → 0.41.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ Anthropic (Claude) provider for [Standard Agents](https://standardagentbuilder.c
12
12
  - Structured outputs via `output_config.format` for JSON schema response formats
13
13
  - Prompt caching opt-in for the system prompt (`providerOptions.cacheSystemPrompt`)
14
14
  - Live model listing and per-model capability detection via the Anthropic Models API
15
- - Usage normalization (prompt/completion/cached/reasoning tokens) plus exact per-request cost derived from raw billing buckets (cache writes at 1.25x/2x, cache reads at 0.1x) for documented Claude models
15
+ - Usage normalization (prompt/completion/cached/reasoning tokens) plus exact per-request cost derived from raw billing buckets (cache writes at 1.25x/2x, cache reads at each model's documented rate—including 0.025x for Fable/Mythos 5.1) for documented Claude models
16
16
 
17
17
  ## Usage
18
18
 
@@ -21,4 +21,4 @@ export {
21
21
  getAnthropicModelPricing,
22
22
  extractUsageBuckets
23
23
  };
24
- //# sourceMappingURL=chunk-VSU3CF6K.js.map
24
+ //# sourceMappingURL=chunk-N6RHANWH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pricing.ts"],"sourcesContent":["/**\n * Known Anthropic model pricing for request cost calculation.\n *\n * The Anthropic Messages API reports token usage (including cache buckets)\n * but no dollar cost, and the Models API exposes no pricing data — so cost\n * is derived here from the raw usage buckets and a maintained price table.\n * This is more accurate than a flat promptTokens * inputPrice calculation\n * because Anthropic bills the prompt in three differently-priced buckets:\n *\n * - uncached input tokens: base input rate\n * - cache writes: 1.25x input (5-minute TTL) or 2x input (1-hour TTL)\n * - cache reads: normally 0.1x input; Fable/Mythos 5.1 use 0.025x\n *\n * Thinking tokens are billed as ordinary output tokens (already included in\n * output_tokens), so no separate reasoning rate applies.\n */\n\nimport {\n calculateAnthropicUsageCost,\n getAnthropicModelPricing,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n} from '@standardagents/provider-pricing';\nimport type Anthropic from '@anthropic-ai/sdk';\n\ntype AnthropicUsage = Anthropic.Messages.Usage;\n\n/**\n * Extract billing buckets from an API usage object. When the per-TTL cache\n * creation breakdown is absent, all cache writes are assumed 5-minute TTL\n * (the API default and by far the most common case).\n */\nexport function extractUsageBuckets(usage: AnthropicUsage): AnthropicUsageBuckets {\n const totalCacheWrite = usage.cache_creation_input_tokens ?? 0;\n const write1h = usage.cache_creation?.ephemeral_1h_input_tokens ?? 0;\n const write5m = usage.cache_creation?.ephemeral_5m_input_tokens ?? Math.max(totalCacheWrite - write1h, 0);\n\n return {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cache_read_input_tokens ?? 0,\n cacheWrite5mTokens: write5m,\n cacheWrite1hTokens: write1h,\n };\n}\n\nexport {\n calculateAnthropicUsageCost,\n getAnthropicModelPricing,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n};\n"],"mappings":";AAiBA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAUA,SAAS,oBAAoB,OAA8C;AAChF,QAAM,kBAAkB,MAAM,+BAA+B;AAC7D,QAAM,UAAU,MAAM,gBAAgB,6BAA6B;AACnE,QAAM,UAAU,MAAM,gBAAgB,6BAA6B,KAAK,IAAI,kBAAkB,SAAS,CAAC;AAExG,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM,2BAA2B;AAAA,IAClD,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AACF;","names":[]}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  calculateAnthropicUsageCost,
3
3
  extractUsageBuckets,
4
4
  getAnthropicModelPricing
5
- } from "./chunk-VSU3CF6K.js";
5
+ } from "./chunk-N6RHANWH.js";
6
6
 
7
7
  // src/AnthropicProvider.ts
8
8
  import { ProviderError, defineTool } from "@standardagents/spec";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AnthropicProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type Anthropic from '@anthropic-ai/sdk';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n processStreamEvent,\n createErrorChunk,\n getThinkingMode,\n truncateBase64,\n DEFAULT_REASONING_LEVELS,\n} from './transformers';\nimport { getAnthropicIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\nfunction isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction parseRetryAfter(headers: unknown): number | undefined {\n let raw: unknown;\n if (isObjectLike(headers)) {\n const get = headers.get;\n if (typeof get === 'function') {\n raw = get.call(headers, 'retry-after');\n } else {\n raw = headers['retry-after'];\n }\n }\n if (typeof raw === 'number') {\n return raw;\n }\n if (typeof raw === 'string') {\n const parsed = parseInt(raw, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\n/**\n * Effort-based reasoning level mapping for adaptive-thinking models.\n */\nconst ADAPTIVE_REASONING_LEVELS: Record<number, string | null> = DEFAULT_REASONING_LEVELS;\n\n/**\n * Binary reasoning level mapping for budget-based extended thinking models.\n */\nconst BUDGET_REASONING_LEVELS: Record<number, string | null> = { 0: null, 100: 'enabled' };\n\n/**\n * No reasoning support (Claude 3.x).\n */\nconst NO_REASONING_LEVELS: Record<number, string | null> = { 0: null };\n\n/**\n * Anthropic provider implementation for Standard Agents\n *\n * Uses the Messages API for all requests via the official @anthropic-ai/sdk.\n * Supports the full Claude family: claude-fable-5-1, claude-fable-5, claude-opus-5,\n * claude-opus-4-x,\n * claude-sonnet-4-x, claude-haiku-4-5, claude-3-x, etc.\n */\nexport class AnthropicProvider implements Provider {\n readonly name = 'anthropic';\n readonly specificationVersion = '1' as const;\n\n private client: Anthropic | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: Anthropic.Models.ModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<Anthropic> {\n if (!this.client) {\n const { default: Anthropic } = await import('@anthropic-ai/sdk');\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return modelId.startsWith('claude-');\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the Anthropic icon since all models are from Anthropic.\n */\n getIcon(_modelId?: string): string {\n return getAnthropicIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Capability mappings for Anthropic models, keyed by model ID prefix.\n * Used as a fallback when the live Models API is unavailable; the API's\n * capability listing takes precedence when reachable.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'claude-fable-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-mythos': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-8': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-7': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-6': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-opus-4-1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 32000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-opus-4': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 32000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-sonnet-4-6': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 64000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-sonnet-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-sonnet-4': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-haiku-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-3-7-sonnet': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-3-5-sonnet': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-5-haiku': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-opus': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 4096,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-haiku': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 4096,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n };\n\n /**\n * Look up static capabilities for a model by exact then prefix match.\n */\n private static lookupStaticCapabilities(modelId: string): ModelCapabilities | null {\n if (AnthropicProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...AnthropicProvider.MODEL_CAPABILITIES[modelId] };\n }\n // Longest-prefix match so 'claude-opus-4-5' wins over 'claude-opus-4'\n let best: { prefix: string; caps: ModelCapabilities } | null = null;\n for (const [prefix, caps] of Object.entries(AnthropicProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix) && (!best || prefix.length > best.prefix.length)) {\n best = { prefix, caps };\n }\n }\n return best ? { ...best.caps } : null;\n }\n\n /**\n * Map a live Models API capability listing to Standard Agents capabilities.\n */\n private static mapLiveCapabilities(model: Anthropic.Models.ModelInfo): ModelCapabilities | null {\n const caps = model.capabilities;\n if (!caps) return null;\n\n let reasoningLevels: Record<number, string | null>;\n if (caps.thinking.types.adaptive.supported && caps.effort.supported) {\n reasoningLevels = ADAPTIVE_REASONING_LEVELS;\n } else if (caps.thinking.supported) {\n reasoningLevels = BUDGET_REASONING_LEVELS;\n } else {\n reasoningLevels = NO_REASONING_LEVELS;\n }\n\n return {\n supportsImages: caps.image_input.supported,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: caps.structured_outputs.supported,\n ...(model.max_input_tokens ? { maxContextTokens: model.max_input_tokens } : {}),\n ...(model.max_tokens ? { maxOutputTokens: model.max_tokens } : {}),\n reasoningLevels,\n };\n }\n\n /**\n * Get capabilities for a specific model.\n * Prefers the live Models API (which reports per-model capability flags)\n * and falls back to the static prefix table when the API is unreachable.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((m) => m.id === modelId);\n if (model) {\n const live = AnthropicProvider.mapLiveCapabilities(model);\n if (live) {\n return live;\n }\n }\n } catch {\n // Fall through to static lookup\n }\n\n const staticCaps = AnthropicProvider.lookupStaticCapabilities(modelId);\n if (staticCaps) {\n return staticCaps;\n }\n\n // Default capabilities for unknown Claude models\n return {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n };\n }\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are Anthropic's server-side tools that execute on Anthropic's\n * servers. The execute function is a no-op since execution is handled by\n * the provider; results surface as providerTools entries on the response.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by Anthropic - this is a passthrough\n return { status: 'success', result: 'Handled by Anthropic' };\n },\n executionMode: 'provider',\n executionProvider: 'anthropic',\n }),\n };\n\n /**\n * Get tools embedded in this provider.\n * Anthropic's web_search server tool is available on all current models.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(_modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n return { ...AnthropicProvider.TOOLS };\n }\n\n // ============================================================================\n // Model Listing\n // ============================================================================\n\n /**\n * Fetch models from the Anthropic Models API with caching.\n */\n private async fetchModelsWithCache(): Promise<Anthropic.Models.ModelInfo[]> {\n const now = Date.now();\n\n if (\n AnthropicProvider.modelsCache &&\n now - AnthropicProvider.modelsCacheTime < AnthropicProvider.CACHE_TTL\n ) {\n return AnthropicProvider.modelsCache;\n }\n\n const client = await this.getClient();\n const models: Anthropic.Models.ModelInfo[] = [];\n for await (const model of client.models.list({ limit: 100 })) {\n models.push(model);\n }\n\n AnthropicProvider.modelsCache = models;\n AnthropicProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Map Anthropic model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: Anthropic.Models.ModelInfo): ProviderModelInfo {\n const capabilities =\n AnthropicProvider.mapLiveCapabilities(model) ??\n AnthropicProvider.lookupStaticCapabilities(model.id) ??\n undefined;\n\n return {\n id: model.id,\n name: model.display_name,\n contextLength: model.max_input_tokens ?? capabilities?.maxContextTokens,\n iconId: this.getIcon(model.id),\n ...(capabilities ? { capabilities } : {}),\n };\n }\n\n /**\n * Get list of available models from Anthropic.\n * Fetches from the Models API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n let models = rawModels.map((m) => this.mapToProviderModelInfo(m));\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter)\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from Anthropic:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n /**\n * Resolve the default max_tokens for a model from the static capability\n * table, clamped so non-streaming requests stay under HTTP timeouts.\n */\n private defaultMaxTokensFor(modelId: string): number {\n const caps = AnthropicProvider.lookupStaticCapabilities(modelId);\n return Math.min(caps?.maxOutputTokens ?? 8192, 8192);\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n const response = await client.messages.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n const stream = await client.messages.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n const record = isObjectLike(error) ? error : null;\n const status =\n typeof record?.status === 'number'\n ? record.status\n : typeof record?.statusCode === 'number'\n ? record.statusCode\n : undefined;\n const message = error instanceof Error ? error.message : String(error);\n\n if (status === 429) {\n return new ProviderError(message, 'rate_limit', status, parseRetryAfter(record?.headers));\n }\n if (status === 401 || status === 403) {\n return new ProviderError(message, 'auth_error', status);\n }\n if (status === 400 || status === 404 || status === 413) {\n return new ProviderError(message, 'invalid_request', status);\n }\n if (status !== undefined && status >= 500) {\n // Includes 529 overloaded_error - retryable server-side condition\n return new ProviderError(message, 'server_error', status);\n }\n if (\n (error instanceof Error && error.name === 'AbortError') ||\n record?.code === 'ETIMEDOUT'\n ) {\n return new ProviderError(message, 'timeout');\n }\n\n return new ProviderError(message, 'unknown', status);\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to Anthropic Messages API format for inspection.\n * Returns the exact request body that would be sent, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n // Round-trip through JSON to get a plain serializable body for the UI\n const body: Record<string, unknown> = JSON.parse(JSON.stringify(params));\n\n return {\n body: truncateBase64(body),\n messagesPath: 'messages',\n metadata: {\n endpoint: 'messages.create',\n },\n };\n }\n}\n\n// Re-export for capability-aware consumers\nexport { getThinkingMode };\n","/**\n * Discrete transformer functions for the Anthropic Messages API provider.\n * These functions convert between Standard Agent types and Anthropic API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ProviderReasoningDetail,\n ProviderExecutedToolResult,\n} from '@standardagents/spec';\nimport { mapReasoningLevel } from '@standardagents/spec';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport {\n calculateAnthropicUsageCost,\n extractUsageBuckets,\n type AnthropicUsageBuckets,\n} from './pricing';\n\n// ============================================================================\n// Type aliases for Anthropic Messages API types\n// ============================================================================\n\ntype MessageParam = Anthropic.Messages.MessageParam;\ntype MessageCreateParams = Anthropic.Messages.MessageCreateParams;\ntype ContentBlockParam = Anthropic.Messages.ContentBlockParam;\ntype ContentBlock = Anthropic.Messages.ContentBlock;\ntype ToolResultBlockParam = Anthropic.Messages.ToolResultBlockParam;\ntype AnthropicTool = Anthropic.Messages.Tool;\ntype ToolUnion = Anthropic.Messages.ToolUnion;\ntype ToolChoice = Anthropic.Messages.ToolChoice;\ntype AnthropicMessage = Anthropic.Messages.Message;\ntype AnthropicUsage = Anthropic.Messages.Usage;\ntype MessageDeltaUsage = Anthropic.Messages.MessageDeltaUsage;\ntype RawMessageStreamEvent = Anthropic.Messages.RawMessageStreamEvent;\ntype StopReason = Anthropic.Messages.StopReason;\ntype ImageBlockParam = Anthropic.Messages.ImageBlockParam;\ntype DocumentBlockParam = Anthropic.Messages.DocumentBlockParam;\ntype TextBlockParam = Anthropic.Messages.TextBlockParam;\n\n/**\n * Reasoning detail formats used to round-trip Anthropic thinking blocks.\n * Thinking blocks must be replayed exactly as received (text + signature),\n * so both halves are stored on a single reasoning detail entry.\n */\nexport const THINKING_FORMAT = 'anthropic-thinking-v1';\nexport const REDACTED_THINKING_FORMAT = 'anthropic-redacted-thinking-v1';\n\n/**\n * Default mapping from the 0-100 reasoning scale to Anthropic effort levels.\n * Used for models that support adaptive thinking + the effort parameter.\n * 'xhigh'/'max' are intentionally excluded from the default mapping since\n * support varies by model; capability-aware callers can pass their own map.\n */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * Anthropic server-side tools. These execute on Anthropic's servers; results\n * come back as server_tool_use / *_tool_result content blocks rather than\n * client tool calls, so they are excluded from history replay.\n */\nexport const ANTHROPIC_NATIVE_TOOLS = new Set(['web_search']);\n\n/**\n * Default max_tokens when the request and model capabilities don't specify\n * one. The Messages API requires max_tokens on every request.\n */\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 8192;\n\n// ============================================================================\n// Thinking Mode Resolution\n// ============================================================================\n\n/**\n * How a Claude model expects extended thinking to be requested:\n * - 'adaptive': thinking: { type: 'adaptive' } + output_config.effort (4.6+)\n * - 'budget': thinking: { type: 'enabled', budget_tokens } (4.0-4.5, 3.7)\n * - 'none': no thinking support (Claude 3.x)\n */\nexport type ThinkingMode = 'adaptive' | 'budget' | 'none';\n\n/**\n * Ordered prefix table mapping model IDs to their thinking mode.\n * More specific prefixes must come before shorter ones.\n */\nconst THINKING_MODE_PREFIXES: Array<[string, ThinkingMode]> = [\n ['claude-fable-5', 'adaptive'],\n ['claude-mythos', 'adaptive'],\n ['claude-opus-5', 'adaptive'],\n ['claude-opus-4-8', 'adaptive'],\n ['claude-opus-4-7', 'adaptive'],\n ['claude-opus-4-6', 'adaptive'],\n ['claude-opus-4-5', 'budget'],\n ['claude-opus-4-1', 'budget'],\n ['claude-opus-4-0', 'budget'],\n ['claude-opus-4-2', 'budget'], // dated full IDs like claude-opus-4-20250514\n ['claude-sonnet-4-6', 'adaptive'],\n ['claude-sonnet-4-5', 'budget'],\n ['claude-sonnet-4-0', 'budget'],\n ['claude-sonnet-4-2', 'budget'], // dated full IDs like claude-sonnet-4-20250514\n ['claude-haiku-4-5', 'budget'],\n ['claude-3-7-sonnet', 'budget'],\n ['claude-3', 'none'],\n];\n\n/**\n * Resolve the thinking mode for a Claude model ID.\n * Unknown (future) models default to 'adaptive' since all current-generation\n * Claude models use adaptive thinking.\n */\nexport function getThinkingMode(modelId: string): ThinkingMode {\n for (const [prefix, mode] of THINKING_MODE_PREFIXES) {\n if (modelId.startsWith(prefix)) {\n return mode;\n }\n }\n return 'adaptive';\n}\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Split a data URI into media type and base64 payload.\n * Returns null when the string is not a data URI.\n */\nfunction parseDataUri(value: string): { mediaType: string; data: string } | null {\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(value);\n if (!match) return null;\n return {\n mediaType: match[1] || 'application/octet-stream',\n data: match[3],\n };\n}\n\ntype AnthropicImageMediaType = ImageBlockParam['source'] extends infer S\n ? S extends { type: 'base64'; media_type: infer M }\n ? M\n : never\n : never;\n\nconst SUPPORTED_IMAGE_MEDIA_TYPES = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n]);\n\nfunction normalizeImageMediaType(mediaType: string | undefined): AnthropicImageMediaType {\n if (mediaType && SUPPORTED_IMAGE_MEDIA_TYPES.has(mediaType)) {\n return mediaType as AnthropicImageMediaType;\n }\n return 'image/png';\n}\n\n/**\n * Build an Anthropic image block from base64 data or a URL.\n */\nfunction imageBlock(data: string, mediaType?: string): ImageBlockParam {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return { type: 'image', source: { type: 'url', url: data } };\n }\n const parsed = parseDataUri(data);\n if (parsed) {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: normalizeImageMediaType(parsed.mediaType),\n data: parsed.data,\n },\n };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: normalizeImageMediaType(mediaType),\n data,\n },\n };\n}\n\n/**\n * Decode a base64 string to UTF-8 text. Used for plain-text document sources.\n */\nfunction decodeBase64Text(data: string): string {\n try {\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n } catch {\n return data;\n }\n}\n\n/**\n * Build an Anthropic document block (or fallback text block) from a file part.\n * PDFs map to document blocks; text files map to plain-text document sources;\n * other media types are not supported by the Messages API and fall back to a\n * descriptive text block so the model knows an attachment existed.\n */\nfunction fileBlock(\n data: string,\n mediaType: string,\n filename?: string\n): DocumentBlockParam | TextBlockParam {\n const parsed = parseDataUri(data);\n const base64 = parsed ? parsed.data : data;\n const resolvedMediaType = parsed?.mediaType || mediaType;\n\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return { type: 'document', source: { type: 'url', url: data } };\n }\n\n if (resolvedMediaType === 'application/pdf') {\n return {\n type: 'document',\n source: { type: 'base64', media_type: 'application/pdf', data: base64 },\n ...(filename ? { title: filename } : {}),\n };\n }\n\n if (resolvedMediaType.startsWith('text/') || resolvedMediaType === 'application/json') {\n return {\n type: 'document',\n source: { type: 'text', media_type: 'text/plain', data: decodeBase64Text(base64) },\n ...(filename ? { title: filename } : {}),\n };\n }\n\n return {\n type: 'text',\n text: `[Unsupported file attachment${filename ? `: ${filename}` : ''} (${resolvedMediaType})]`,\n };\n}\n\n/**\n * Transform a single content part to an Anthropic content block.\n */\nexport function transformContentPart(part: ContentPart): ContentBlockParam {\n if (part.type === 'text') {\n return { type: 'text', text: part.text };\n }\n if (part.type === 'image') {\n return imageBlock(part.data || '', part.mediaType);\n }\n if (part.type === 'image_url') {\n return imageBlock(part.image_url?.url || '');\n }\n // File parts\n return fileBlock(part.data || '', part.mediaType || 'application/octet-stream', part.filename);\n}\n\n/**\n * Transform message content (string or parts array) to Anthropic format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | ContentBlockParam[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform an assistant message to an Anthropic assistant MessageParam.\n * Thinking blocks (rebuilt from reasoning details) come first, then text,\n * then tool_use blocks — matching the order the API emits them.\n *\n * Returns null when the message has nothing the API can replay (e.g. an\n * assistant turn that only contained server-tool calls).\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): MessageParam | null {\n const content: ContentBlockParam[] = [];\n\n // Rebuild thinking blocks exactly as received. Details from other\n // providers (different format markers) are skipped — they can't be\n // replayed against the Anthropic API.\n if (msg.reasoningDetails) {\n for (const detail of msg.reasoningDetails) {\n if (detail.format === THINKING_FORMAT && detail.text !== undefined) {\n content.push({\n type: 'thinking',\n thinking: detail.text,\n signature: detail.data ?? '',\n });\n } else if (detail.format === REDACTED_THINKING_FORMAT && detail.data) {\n content.push({ type: 'redacted_thinking', data: detail.data });\n }\n }\n }\n\n if (msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n // Server-side tools (web_search) are executed by Anthropic and can't be\n // replayed as client tool_use blocks.\n if (ANTHROPIC_NATIVE_TOOLS.has(tc.name)) {\n continue;\n }\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments,\n });\n }\n }\n\n if (content.length === 0) {\n return null;\n }\n\n return { role: 'assistant', content };\n}\n\n/**\n * Transform a tool result message to an Anthropic tool_result block.\n * Returns null for server-side tool results (they're skipped along with\n * their tool_use blocks during replay).\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ToolResultBlockParam | null {\n if (ANTHROPIC_NATIVE_TOOLS.has(msg.toolName)) {\n return null;\n }\n\n let text: string;\n let isError = false;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n text = msg.content.text;\n } else if (msg.content.type === 'error') {\n text = msg.content.error;\n isError = true;\n } else {\n text = JSON.stringify(msg.content);\n }\n } else {\n text = JSON.stringify(msg.content);\n }\n\n const blocks: Array<TextBlockParam | ImageBlockParam> = [];\n if (text) {\n blocks.push({ type: 'text', text });\n }\n\n // Image attachments from tool execution become image blocks inside the\n // tool_result so the model can see them.\n if (msg.attachments?.length) {\n for (const attachment of msg.attachments) {\n if (attachment.type === 'image' && attachment.data) {\n blocks.push(imageBlock(attachment.data, attachment.mediaType));\n }\n }\n }\n\n return {\n type: 'tool_result',\n tool_use_id: msg.toolCallId,\n ...(blocks.length > 0 ? { content: blocks } : {}),\n ...(isError ? { is_error: true } : {}),\n };\n}\n\n/**\n * Transform an array of ProviderMessages to Anthropic format.\n * System messages are extracted into the top-level system prompt.\n * Consecutive tool results are merged into a single user turn, which is how\n * the Messages API expects tool results to follow parallel tool calls.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n anthropicMessages: MessageParam[];\n system: string | undefined;\n} {\n let system: string | undefined;\n const anthropicMessages: MessageParam[] = [];\n let pendingToolResults: ToolResultBlockParam[] = [];\n\n const flushToolResults = () => {\n if (pendingToolResults.length > 0) {\n anthropicMessages.push({ role: 'user', content: pendingToolResults });\n pendingToolResults = [];\n }\n };\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n system = system ? `${system}\\n\\n${msg.content}` : msg.content;\n break;\n\n case 'user':\n flushToolResults();\n anthropicMessages.push({\n role: 'user',\n content: transformMessageContent(msg.content),\n });\n break;\n\n case 'assistant': {\n flushToolResults();\n const assistantMessage = transformAssistantMessage(msg);\n if (assistantMessage) {\n anthropicMessages.push(assistantMessage);\n }\n break;\n }\n\n case 'tool': {\n const toolResult = transformToolMessage(msg);\n if (toolResult) {\n pendingToolResults.push(toolResult);\n }\n break;\n }\n }\n }\n\n flushToolResults();\n\n return { anthropicMessages, system };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Transform a single ProviderTool to an Anthropic custom tool definition.\n */\nexport function transformTool(tool: ProviderTool): AnthropicTool {\n const parameters = isRecord(tool.function.parameters)\n ? tool.function.parameters\n : { type: 'object', properties: {} };\n\n return {\n name: tool.function.name,\n ...(tool.function.description ? { description: tool.function.description } : {}),\n input_schema: {\n ...parameters,\n type: 'object',\n },\n };\n}\n\n/**\n * Transform an array of ProviderTools to Anthropic format.\n * Separates client function tools from Anthropic server-side tools.\n */\nexport function transformTools(tools: ProviderTool[]): ToolUnion[] {\n const result: ToolUnion[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n if (tool.executionMode === 'provider' && ANTHROPIC_NATIVE_TOOLS.has(toolName)) {\n if (toolName === 'web_search') {\n result.push({ type: 'web_search_20250305', name: 'web_search' });\n }\n } else {\n result.push(transformTool(tool));\n }\n }\n\n return result;\n}\n\n/**\n * Transform tool choice option to Anthropic format.\n * parallelToolCalls=false maps to disable_parallel_tool_use on the choice.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice'],\n parallelToolCalls?: boolean\n): ToolChoice | undefined {\n const disable = parallelToolCalls === false ? { disable_parallel_tool_use: true } : {};\n\n if (choice === 'none') {\n return { type: 'none' };\n }\n if (choice === 'required') {\n return { type: 'any', ...disable };\n }\n if (typeof choice === 'object' && choice !== null && 'name' in choice) {\n return { type: 'tool', name: choice.name, ...disable };\n }\n if (choice === 'auto' || parallelToolCalls === false) {\n return { type: 'auto', ...disable };\n }\n return undefined;\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map an Anthropic stop reason to a Provider finish reason.\n */\nexport function mapFinishReason(stopReason: StopReason | null): ProviderFinishReason {\n switch (stopReason) {\n case 'end_turn':\n case 'stop_sequence':\n case 'pause_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool_calls';\n case 'refusal':\n return 'content_filter';\n default:\n return 'stop';\n }\n}\n\n/**\n * Extract text content from response content blocks.\n */\nexport function extractTextContent(content: ContentBlock[]): string | null {\n const textParts: string[] = [];\n for (const block of content) {\n if (block.type === 'text') {\n textParts.push(block.text);\n }\n }\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning (thinking) content from response content blocks.\n * Each thinking block becomes one reasoning detail carrying both the text\n * and its signature so it can be replayed verbatim on the next turn.\n */\nexport function extractReasoningContent(content: ContentBlock[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const block of content) {\n if (block.type === 'thinking') {\n if (block.thinking) {\n reasoning = reasoning ? `${reasoning}\\n${block.thinking}` : block.thinking;\n }\n reasoningDetails.push({\n type: 'text',\n text: block.thinking,\n data: block.signature,\n format: THINKING_FORMAT,\n });\n } else if (block.type === 'redacted_thinking') {\n reasoningDetails.push({\n type: 'encrypted',\n data: block.data,\n format: REDACTED_THINKING_FORMAT,\n });\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract client tool calls from response content blocks.\n */\nexport function extractToolCalls(\n content: ContentBlock[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: isRecord(block.input) ? block.input : {},\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\nfunction webSearchToolResult(\n id: string,\n input: unknown,\n resultContent: unknown\n): ProviderExecutedToolResult {\n const query = isRecord(input) && typeof input.query === 'string' ? input.query : undefined;\n\n let status: ProviderExecutedToolResult['status'] = 'completed';\n let sources: Array<{ type?: string; url: string; title?: string }> | undefined;\n\n if (Array.isArray(resultContent)) {\n sources = resultContent\n .filter(isRecord)\n .filter((item) => item.type === 'web_search_result' && typeof item.url === 'string')\n .map((item) => ({\n type: 'url',\n url: item.url as string,\n ...(typeof item.title === 'string' ? { title: item.title } : {}),\n }));\n } else if (isRecord(resultContent) && resultContent.type === 'web_search_tool_result_error') {\n status = 'failed';\n }\n\n return {\n name: 'web_search',\n type: 'web_search',\n provider: 'anthropic',\n id,\n status,\n result: {\n actions: [{\n type: 'search',\n ...(query ? { query } : {}),\n ...(sources && sources.length > 0 ? { sources } : {}),\n }],\n },\n };\n}\n\n/**\n * Extract server-side tool executions (web search) from response content\n * blocks, pairing server_tool_use blocks with their result blocks.\n */\nexport function extractProviderToolResults(\n content: ContentBlock[]\n): ProviderExecutedToolResult[] | undefined {\n const providerTools: ProviderExecutedToolResult[] = [];\n const serverToolUses = new Map<string, { name: string; input: unknown }>();\n\n for (const block of content) {\n if (block.type === 'server_tool_use') {\n serverToolUses.set(block.id, { name: block.name, input: block.input });\n } else if (block.type === 'web_search_tool_result') {\n const use = serverToolUses.get(block.tool_use_id);\n providerTools.push(\n webSearchToolResult(block.tool_use_id, use?.input, block.content)\n );\n }\n }\n\n return providerTools.length > 0 ? providerTools : undefined;\n}\n\n/**\n * Transform Anthropic usage to Provider usage format.\n *\n * Anthropic's input_tokens excludes cached tokens, while the Standard Agents\n * convention (matching OpenAI) is that promptTokens covers the full prompt\n * with cachedTokens as the subset read from cache. The buckets are summed\n * here so usage totals stay comparable across providers.\n *\n * When the model has known pricing, the exact dollar cost is computed from\n * the raw billing buckets (cache writes at 1.25x/2x, cache reads at 0.1x) —\n * the API itself reports tokens only, never cost.\n */\nexport function transformUsage(\n usage: AnthropicUsage | undefined,\n modelId?: string\n): ProviderUsage {\n if (!usage) {\n return { promptTokens: 0, completionTokens: 0, totalTokens: 0, provider: 'anthropic' };\n }\n\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n const promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n const completionTokens = usage.output_tokens;\n const reasoningTokens = usage.output_tokens_details?.thinking_tokens;\n const cost = modelId\n ? calculateAnthropicUsageCost(modelId, extractUsageBuckets(usage))\n : undefined;\n\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n ...(cacheRead > 0 ? { cachedTokens: cacheRead } : {}),\n ...(cost !== undefined ? { cost } : {}),\n provider: 'anthropic',\n };\n}\n\n/**\n * Transform a complete Anthropic Message response to ProviderResponse.\n */\nexport function transformResponse(message: AnthropicMessage): ProviderResponse {\n const content = extractTextContent(message.content);\n const { reasoning, reasoningDetails } = extractReasoningContent(message.content);\n const toolCalls = extractToolCalls(message.content);\n const providerTools = extractProviderToolResults(message.content);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n providerTools,\n finishReason: mapFinishReason(message.stop_reason),\n usage: transformUsage(message.usage, message.model),\n metadata: {\n model: message.model,\n provider: 'anthropic',\n requestId: message.id,\n ...(message.stop_sequence ? { stopSequence: message.stop_sequence } : {}),\n ...(message.usage?.cache_creation_input_tokens\n ? { cacheCreationInputTokens: message.usage.cache_creation_input_tokens }\n : {}),\n ...(message.usage?.cache_read_input_tokens\n ? { cacheReadInputTokens: message.usage.cache_read_input_tokens }\n : {}),\n ...(message.usage?.service_tier ? { serviceTier: message.usage.service_tier } : {}),\n ...(message.usage?.server_tool_use\n ? { serverToolUse: { ...message.usage.server_tool_use } }\n : {}),\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Validate a providerOptions thinking override into the SDK's config shape.\n * Unknown shapes are ignored so a bad option can't produce a malformed request.\n */\nfunction resolveThinkingOverride(\n value: unknown\n): Anthropic.Messages.ThinkingConfigParam | undefined {\n if (!isRecord(value)) return undefined;\n\n const display =\n value.display === 'summarized' || value.display === 'omitted'\n ? value.display\n : undefined;\n\n if (value.type === 'adaptive') {\n return { type: 'adaptive', ...(display ? { display } : {}) };\n }\n if (value.type === 'enabled' && typeof value.budget_tokens === 'number') {\n return {\n type: 'enabled',\n budget_tokens: value.budget_tokens,\n ...(display ? { display } : {}),\n };\n }\n if (value.type === 'disabled') {\n return { type: 'disabled' };\n }\n return undefined;\n}\n\n/**\n * Clamp a thinking budget to the valid range: >= 1024 and < maxTokens.\n * Returns null when there isn't enough output headroom for thinking.\n */\nfunction resolveThinkingBudget(\n level: number,\n maxTokens: number,\n explicitBudget?: number\n): number | null {\n if (maxTokens < 2048) {\n return null;\n }\n const ceiling = maxTokens - 1024;\n const scaled = explicitBudget ?? Math.floor((maxTokens * Math.min(level, 100)) / 100 * 0.75);\n return Math.max(1024, Math.min(scaled, ceiling));\n}\n\n/**\n * Build a Messages API create request from a ProviderRequest.\n *\n * Thinking configuration is derived from the request's 0-100 reasoning level\n * and the model's thinking mode: adaptive models get\n * `thinking: { type: 'adaptive' }` plus an effort level, while\n * budget-mode models get `thinking: { type: 'enabled', budget_tokens }`.\n * When thinking is active, sampling parameters are omitted — the API rejects\n * temperature/top_p/top_k alongside thinking.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS,\n defaultMaxTokens: number = DEFAULT_MAX_OUTPUT_TOKENS\n): MessageCreateParams {\n const { anthropicMessages, system } = transformMessages(request.messages);\n\n const maxTokens = request.maxOutputTokens ?? defaultMaxTokens;\n\n const params: MessageCreateParams = {\n model: request.model,\n max_tokens: maxTokens,\n messages: anthropicMessages,\n };\n\n // Provider options that this builder manages itself.\n const providerOptions = isRecord(request.providerOptions) ? request.providerOptions : {};\n const {\n cacheSystemPrompt,\n thinking: thinkingOverride,\n ...passthroughOptions\n } = providerOptions;\n\n let systemText = system;\n\n // Response format: structured outputs via output_config when a schema is\n // provided; otherwise fall back to a system prompt instruction since the\n // Messages API has no bare JSON mode.\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.output_config = {\n format: { type: 'json_schema', schema: request.responseFormat.schema },\n };\n } else {\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON.';\n systemText = systemText ? `${systemText}\\n\\n${jsonInstruction}` : jsonInstruction;\n }\n }\n\n if (systemText) {\n params.system = cacheSystemPrompt === true\n ? [{ type: 'text', text: systemText, cache_control: { type: 'ephemeral' } }]\n : systemText;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n params.tools = transformTools(request.tools);\n }\n const toolChoice = transformToolChoice(request.toolChoice, request.parallelToolCalls);\n if (toolChoice && params.tools && params.tools.length > 0) {\n params.tool_choice = toolChoice;\n }\n\n // Thinking configuration\n const thinkingMode = getThinkingMode(request.model);\n let thinkingEnabled = false;\n\n const resolvedOverride = resolveThinkingOverride(thinkingOverride);\n if (resolvedOverride) {\n params.thinking = resolvedOverride;\n thinkingEnabled = resolvedOverride.type !== 'disabled';\n } else if (request.reasoning?.level !== undefined && request.reasoning.level > 0) {\n if (thinkingMode === 'adaptive') {\n params.thinking = {\n type: 'adaptive',\n ...(request.reasoning.exclude ? { display: 'omitted' } : {}),\n };\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.output_config = {\n ...params.output_config,\n effort: effort as 'low' | 'medium' | 'high' | 'xhigh' | 'max',\n };\n }\n thinkingEnabled = true;\n } else if (thinkingMode === 'budget') {\n const budget = resolveThinkingBudget(\n request.reasoning.level,\n maxTokens,\n request.reasoning.maxTokens\n );\n if (budget !== null) {\n params.thinking = {\n type: 'enabled',\n budget_tokens: budget,\n ...(request.reasoning.exclude ? { display: 'omitted' } : {}),\n };\n thinkingEnabled = true;\n }\n }\n // thinkingMode 'none': Claude 3.x — no thinking parameter\n }\n\n // Sampling parameters are incompatible with thinking (the API requires\n // temperature 1 and rejects top_p/top_k when thinking is on), and the\n // newest models reject them entirely — only forward when thinking is off.\n if (!thinkingEnabled) {\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n if (request.topK !== undefined) {\n params.top_k = request.topK;\n }\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop_sequences = request.stopSequences;\n }\n\n // Merge remaining provider-specific options (service_tier, metadata, ...).\n Object.assign(params, passthroughOptions);\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\ninterface StreamToolCall {\n id: string;\n name: string;\n argumentsJson: string;\n}\n\ninterface StreamThinkingBlock {\n thinking: string;\n signature: string;\n}\n\ninterface StreamServerToolUse {\n id: string;\n name: string;\n inputJson: string;\n}\n\nexport interface StreamState {\n /** Open content blocks keyed by stream index */\n toolCallsByIndex: Map<number, StreamToolCall>;\n thinkingByIndex: Map<number, StreamThinkingBlock>;\n serverToolsByIndex: Map<number, StreamServerToolUse>;\n /** Completed server tool uses awaiting their result block */\n pendingServerTools: Map<string, { name: string; input: unknown }>;\n reasoningDetails: ProviderReasoningDetail[];\n hasContent: boolean;\n hasReasoning: boolean;\n /** Usage captured from message_start (input/cache buckets) */\n usage: ProviderUsage;\n /** Raw billing buckets for exact cost calculation at message_stop */\n buckets: AnthropicUsageBuckets;\n finishReason: ProviderFinishReason;\n model: string | null;\n messageId: string | null;\n serverToolUse: { web_search_requests: number; web_fetch_requests: number } | null;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCallsByIndex: new Map(),\n thinkingByIndex: new Map(),\n serverToolsByIndex: new Map(),\n pendingServerTools: new Map(),\n reasoningDetails: [],\n hasContent: false,\n hasReasoning: false,\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, provider: 'anthropic' },\n buckets: {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWrite5mTokens: 0,\n cacheWrite1hTokens: 0,\n },\n finishReason: 'stop',\n model: null,\n messageId: null,\n serverToolUse: null,\n };\n}\n\nfunction parseToolCallArguments(argumentsJson: string): Record<string, unknown> {\n try {\n const parsed: unknown = argumentsJson ? JSON.parse(argumentsJson) : {};\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction applyDeltaUsage(state: StreamState, usage: MessageDeltaUsage): void {\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n // message_delta usage is cumulative; input buckets repeat message_start\n // values when present, so prefer them when provided.\n if (usage.input_tokens !== null && usage.input_tokens !== undefined) {\n state.usage.promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n if (cacheRead > 0) {\n state.usage.cachedTokens = cacheRead;\n }\n state.buckets.inputTokens = usage.input_tokens;\n state.buckets.cacheReadTokens = cacheRead;\n // The delta has no per-TTL cache-write breakdown; keep the 1h split from\n // message_start and attribute the remainder to the 5-minute bucket.\n state.buckets.cacheWrite5mTokens = Math.max(\n cacheCreation - state.buckets.cacheWrite1hTokens,\n 0\n );\n }\n state.buckets.outputTokens = usage.output_tokens;\n state.usage.completionTokens = usage.output_tokens;\n const thinkingTokens = usage.output_tokens_details?.thinking_tokens;\n if (thinkingTokens !== undefined) {\n state.usage.reasoningTokens = thinkingTokens;\n }\n state.usage.totalTokens = state.usage.promptTokens + state.usage.completionTokens;\n if (usage.server_tool_use) {\n state.serverToolUse = { ...usage.server_tool_use };\n }\n}\n\n/**\n * Process an Anthropic stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: RawMessageStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n\n switch (event.type) {\n case 'message_start': {\n const usage = event.message.usage;\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n state.usage.promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n if (cacheRead > 0) {\n state.usage.cachedTokens = cacheRead;\n }\n state.usage.completionTokens = usage.output_tokens;\n state.usage.totalTokens = state.usage.promptTokens + state.usage.completionTokens;\n state.buckets = extractUsageBuckets(usage);\n state.model = event.message.model;\n state.messageId = event.message.id;\n break;\n }\n\n case 'content_block_start': {\n const block = event.content_block;\n if (block.type === 'tool_use') {\n state.toolCallsByIndex.set(event.index, {\n id: block.id,\n name: block.name,\n argumentsJson: '',\n });\n chunks.push({ type: 'tool-call-start', id: block.id, name: block.name });\n } else if (block.type === 'thinking') {\n state.thinkingByIndex.set(event.index, {\n thinking: block.thinking || '',\n signature: block.signature || '',\n });\n } else if (block.type === 'redacted_thinking') {\n state.reasoningDetails.push({\n type: 'encrypted',\n data: block.data,\n format: REDACTED_THINKING_FORMAT,\n });\n } else if (block.type === 'server_tool_use') {\n state.serverToolsByIndex.set(event.index, {\n id: block.id,\n name: block.name,\n inputJson: '',\n });\n } else if (block.type === 'web_search_tool_result') {\n const use = state.pendingServerTools.get(block.tool_use_id);\n chunks.push({\n type: 'provider-tool-done',\n tool: webSearchToolResult(block.tool_use_id, use?.input, block.content),\n });\n state.pendingServerTools.delete(block.tool_use_id);\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta.type === 'text_delta') {\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: delta.text });\n } else if (delta.type === 'thinking_delta') {\n state.hasReasoning = true;\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n thinkingBlock.thinking += delta.thinking;\n }\n chunks.push({ type: 'reasoning-delta', delta: delta.thinking });\n } else if (delta.type === 'signature_delta') {\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n thinkingBlock.signature += delta.signature;\n }\n } else if (delta.type === 'input_json_delta') {\n const toolCall = state.toolCallsByIndex.get(event.index);\n if (toolCall) {\n toolCall.argumentsJson += delta.partial_json;\n chunks.push({\n type: 'tool-call-delta',\n id: toolCall.id,\n argumentsDelta: delta.partial_json,\n });\n } else {\n const serverTool = state.serverToolsByIndex.get(event.index);\n if (serverTool) {\n serverTool.inputJson += delta.partial_json;\n }\n }\n }\n break;\n }\n\n case 'content_block_stop': {\n const toolCall = state.toolCallsByIndex.get(event.index);\n if (toolCall) {\n chunks.push({\n type: 'tool-call-done',\n id: toolCall.id,\n arguments: parseToolCallArguments(toolCall.argumentsJson),\n });\n state.toolCallsByIndex.delete(event.index);\n break;\n }\n\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n state.reasoningDetails.push({\n type: 'text',\n text: thinkingBlock.thinking,\n data: thinkingBlock.signature,\n format: THINKING_FORMAT,\n });\n state.thinkingByIndex.delete(event.index);\n break;\n }\n\n const serverTool = state.serverToolsByIndex.get(event.index);\n if (serverTool) {\n state.pendingServerTools.set(serverTool.id, {\n name: serverTool.name,\n input: parseToolCallArguments(serverTool.inputJson),\n });\n state.serverToolsByIndex.delete(event.index);\n }\n break;\n }\n\n case 'message_delta': {\n if (event.delta.stop_reason) {\n state.finishReason = mapFinishReason(event.delta.stop_reason);\n }\n applyDeltaUsage(state, event.usage);\n break;\n }\n\n case 'message_stop': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n const cost = calculateAnthropicUsageCost(state.model, state.buckets);\n chunks.push({\n type: 'finish',\n finishReason: state.finishReason,\n usage: { ...state.usage, ...(cost !== undefined ? { cost } : {}) },\n ...(state.reasoningDetails.length > 0\n ? { reasoningDetails: [...state.reasoningDetails] }\n : {}),\n });\n break;\n }\n\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n */\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","/**\n * Anthropic icon (Claude).\n */\nexport const ANTHROPIC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n<rect width=\"48\" height=\"48\" fill=\"#F0EFEA\"/>\n<path d=\"M32.84 10H26.72L37.88 38H44L32.84 10Z\" fill=\"black\"/>\n<path d=\"M15.16 10L4 38H10.24L12.5224 32.12H24.1976L26.48 38H32.72L21.56 10H15.16ZM14.5408 26.92L18.36 17.08L22.1793 26.92H14.5408Z\" fill=\"black\"/>\n</svg>`;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the Anthropic icon as a data URI.\n */\nexport function getAnthropicIconDataUri(): string {\n return normalizeIcon(ANTHROPIC_ICON);\n}\n","/**\n * Anthropic provider options schema.\n *\n * Defines typed providerOptions for Anthropic (Claude) models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.claude.com/docs/en/api/messages\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * Anthropic provider options schema.\n *\n * These options are passed directly to the Anthropic Messages API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'auto',\n * metadata: { user_id: 'user-123' },\n * cacheSystemPrompt: true,\n * }\n * ```\n */\nexport const anthropicProviderOptions = z.object({\n /** Request priority tier: 'auto' uses priority capacity when available, 'standard_only' opts out */\n service_tier: z.enum(['auto', 'standard_only']).optional(),\n\n /** Request metadata. user_id is an opaque identifier for abuse monitoring */\n metadata: z.object({\n user_id: z.string().optional(),\n }).optional(),\n\n /**\n * Cache the system prompt with a prompt-caching breakpoint.\n * Adds `cache_control: { type: 'ephemeral' }` to the system prompt so\n * repeated requests with the same prefix bill cached-input rates.\n */\n cacheSystemPrompt: z.boolean().optional(),\n\n /**\n * Explicit thinking configuration override. When set, this takes precedence\n * over the thinking config derived from the request's reasoning level.\n * Accepts the Anthropic API shape, e.g. `{ type: 'adaptive' }` or\n * `{ type: 'enabled', budget_tokens: 8192 }`.\n */\n thinking: z.record(z.string(), z.unknown()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for Anthropic provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type AnthropicProviderOptions = z.infer<typeof anthropicProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig } from '@standardagents/spec';\nimport { AnthropicProvider } from './AnthropicProvider';\nimport { anthropicProviderOptions } from './providerOptions';\n\n/**\n * Anthropic (Claude) provider factory for Standard Agents\n *\n * Includes typed providerOptions for Anthropic-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { anthropic } from '@standardagents/anthropic';\n *\n * export default defineModel({\n * name: 'claude-opus',\n * provider: anthropic,\n * model: 'claude-opus-5',\n * inputPrice: 5,\n * outputPrice: 25,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 1000000,\n * },\n * providerOptions: {\n * cacheSystemPrompt: true,\n * },\n * });\n * ```\n */\nexport const anthropic: ProviderFactoryWithOptions<typeof anthropicProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new AnthropicProvider(config),\n { providerOptions: anthropicProviderOptions }\n );\n\n// Re-export the provider options schema and types\nexport { anthropicProviderOptions, type AnthropicProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { AnthropicProvider } from './AnthropicProvider';\n\n// Re-export pricing helpers for cost-aware consumers\nexport {\n getAnthropicModelPricing,\n calculateAnthropicUsageCost,\n extractUsageBuckets,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n} from './pricing';\n"],"mappings":"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","names":["z"]}
1
+ {"version":3,"sources":["../src/AnthropicProvider.ts","../src/transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type Anthropic from '@anthropic-ai/sdk';\nimport type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n ToolDefinition,\n ToolArgs,\n ToolTenvs,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError, defineTool } from '@standardagents/spec';\nimport { z } from 'zod';\nimport {\n buildCreateParams,\n transformResponse,\n createStreamState,\n processStreamEvent,\n createErrorChunk,\n getThinkingMode,\n truncateBase64,\n DEFAULT_REASONING_LEVELS,\n} from './transformers';\nimport { getAnthropicIconDataUri } from './icons';\n\n// Re-export ProviderError for consumers\nexport { ProviderError };\n\nfunction isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction parseRetryAfter(headers: unknown): number | undefined {\n let raw: unknown;\n if (isObjectLike(headers)) {\n const get = headers.get;\n if (typeof get === 'function') {\n raw = get.call(headers, 'retry-after');\n } else {\n raw = headers['retry-after'];\n }\n }\n if (typeof raw === 'number') {\n return raw;\n }\n if (typeof raw === 'string') {\n const parsed = parseInt(raw, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\n/**\n * Effort-based reasoning level mapping for adaptive-thinking models.\n */\nconst ADAPTIVE_REASONING_LEVELS: Record<number, string | null> = DEFAULT_REASONING_LEVELS;\n\n/**\n * Binary reasoning level mapping for budget-based extended thinking models.\n */\nconst BUDGET_REASONING_LEVELS: Record<number, string | null> = { 0: null, 100: 'enabled' };\n\n/**\n * No reasoning support (Claude 3.x).\n */\nconst NO_REASONING_LEVELS: Record<number, string | null> = { 0: null };\n\n/**\n * Anthropic provider implementation for Standard Agents\n *\n * Uses the Messages API for all requests via the official @anthropic-ai/sdk.\n * Supports the full Claude family: claude-fable-5-1, claude-fable-5, claude-opus-5,\n * claude-opus-4-x,\n * claude-sonnet-4-x, claude-haiku-4-5, claude-3-x, etc.\n */\nexport class AnthropicProvider implements Provider {\n readonly name = 'anthropic';\n readonly specificationVersion = '1' as const;\n\n private client: Anthropic | null = null;\n private config: ProviderFactoryConfig;\n\n /** Cache for models list to avoid repeated API calls */\n private static modelsCache: Anthropic.Models.ModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private async getClient(): Promise<Anthropic> {\n if (!this.client) {\n const { default: Anthropic } = await import('@anthropic-ai/sdk');\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n timeout: this.config.timeout,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return modelId.startsWith('claude-');\n }\n\n /**\n * Get the icon for this provider as a data URI.\n * Always returns the Anthropic icon since all models are from Anthropic.\n */\n getIcon(_modelId?: string): string {\n return getAnthropicIconDataUri();\n }\n\n // ============================================================================\n // Model Capabilities\n // ============================================================================\n\n /**\n * Capability mappings for Anthropic models, keyed by model ID prefix.\n * Used as a fallback when the live Models API is unavailable; the API's\n * capability listing takes precedence when reachable.\n */\n private static readonly MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'claude-fable-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-mythos': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-8': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-7': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-6': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 128000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-opus-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-opus-4-1': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 32000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-opus-4': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 32000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-sonnet-4-6': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1000000,\n maxOutputTokens: 64000,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n },\n 'claude-sonnet-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-sonnet-4': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-haiku-4-5': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-3-7-sonnet': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 64000,\n reasoningLevels: BUDGET_REASONING_LEVELS,\n },\n 'claude-3-5-sonnet': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-5-haiku': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-opus': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 4096,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n 'claude-3-haiku': {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 200000,\n maxOutputTokens: 4096,\n reasoningLevels: NO_REASONING_LEVELS,\n },\n };\n\n /**\n * Look up static capabilities for a model by exact then prefix match.\n */\n private static lookupStaticCapabilities(modelId: string): ModelCapabilities | null {\n if (AnthropicProvider.MODEL_CAPABILITIES[modelId]) {\n return { ...AnthropicProvider.MODEL_CAPABILITIES[modelId] };\n }\n // Longest-prefix match so 'claude-opus-4-5' wins over 'claude-opus-4'\n let best: { prefix: string; caps: ModelCapabilities } | null = null;\n for (const [prefix, caps] of Object.entries(AnthropicProvider.MODEL_CAPABILITIES)) {\n if (modelId.startsWith(prefix) && (!best || prefix.length > best.prefix.length)) {\n best = { prefix, caps };\n }\n }\n return best ? { ...best.caps } : null;\n }\n\n /**\n * Map a live Models API capability listing to Standard Agents capabilities.\n */\n private static mapLiveCapabilities(model: Anthropic.Models.ModelInfo): ModelCapabilities | null {\n const caps = model.capabilities;\n if (!caps) return null;\n\n let reasoningLevels: Record<number, string | null>;\n if (caps.thinking.types.adaptive.supported && caps.effort.supported) {\n reasoningLevels = ADAPTIVE_REASONING_LEVELS;\n } else if (caps.thinking.supported) {\n reasoningLevels = BUDGET_REASONING_LEVELS;\n } else {\n reasoningLevels = NO_REASONING_LEVELS;\n }\n\n return {\n supportsImages: caps.image_input.supported,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: caps.structured_outputs.supported,\n ...(model.max_input_tokens ? { maxContextTokens: model.max_input_tokens } : {}),\n ...(model.max_tokens ? { maxOutputTokens: model.max_tokens } : {}),\n reasoningLevels,\n };\n }\n\n /**\n * Get capabilities for a specific model.\n * Prefers the live Models API (which reports per-model capability flags)\n * and falls back to the static prefix table when the API is unreachable.\n */\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((m) => m.id === modelId);\n if (model) {\n const live = AnthropicProvider.mapLiveCapabilities(model);\n if (live) {\n return live;\n }\n }\n } catch {\n // Fall through to static lookup\n }\n\n const staticCaps = AnthropicProvider.lookupStaticCapabilities(modelId);\n if (staticCaps) {\n return staticCaps;\n }\n\n // Default capabilities for unknown Claude models\n return {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 200000,\n maxOutputTokens: 8192,\n reasoningLevels: ADAPTIVE_REASONING_LEVELS,\n };\n }\n\n // ============================================================================\n // Provider-Embedded Tools\n // ============================================================================\n\n /**\n * Provider-embedded tools using defineTool().\n * These are Anthropic's server-side tools that execute on Anthropic's\n * servers. The execute function is a no-op since execution is handled by\n * the provider; results surface as providerTools entries on the response.\n */\n private static readonly TOOLS: Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> = {\n web_search: defineTool({\n description: 'Search the web for up-to-date information with citations',\n args: z.object({\n query: z.string().describe('Search query'),\n }),\n execute: async (_state, _args) => {\n // Execution handled by Anthropic - this is a passthrough\n return { status: 'success', result: 'Handled by Anthropic' };\n },\n executionMode: 'provider',\n executionProvider: 'anthropic',\n }),\n };\n\n /**\n * Get tools embedded in this provider.\n * Anthropic's web_search server tool is available on all current models.\n *\n * @param modelId - Optional filter to get tools available for a specific model\n * @returns Record of tool name to tool definition\n */\n getTools(_modelId?: string): Record<string, ToolDefinition<any, ToolArgs | null, ToolTenvs | null>> {\n return { ...AnthropicProvider.TOOLS };\n }\n\n // ============================================================================\n // Model Listing\n // ============================================================================\n\n /**\n * Fetch models from the Anthropic Models API with caching.\n */\n private async fetchModelsWithCache(): Promise<Anthropic.Models.ModelInfo[]> {\n const now = Date.now();\n\n if (\n AnthropicProvider.modelsCache &&\n now - AnthropicProvider.modelsCacheTime < AnthropicProvider.CACHE_TTL\n ) {\n return AnthropicProvider.modelsCache;\n }\n\n const client = await this.getClient();\n const models: Anthropic.Models.ModelInfo[] = [];\n for await (const model of client.models.list({ limit: 100 })) {\n models.push(model);\n }\n\n AnthropicProvider.modelsCache = models;\n AnthropicProvider.modelsCacheTime = now;\n\n return models;\n }\n\n /**\n * Map Anthropic model info to ProviderModelInfo.\n */\n private mapToProviderModelInfo(model: Anthropic.Models.ModelInfo): ProviderModelInfo {\n const capabilities =\n AnthropicProvider.mapLiveCapabilities(model) ??\n AnthropicProvider.lookupStaticCapabilities(model.id) ??\n undefined;\n\n return {\n id: model.id,\n name: model.display_name,\n contextLength: model.max_input_tokens ?? capabilities?.maxContextTokens,\n iconId: this.getIcon(model.id),\n ...(capabilities ? { capabilities } : {}),\n };\n }\n\n /**\n * Get list of available models from Anthropic.\n * Fetches from the Models API with caching.\n *\n * @param filter - Optional search string to filter models by name/id\n */\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n const rawModels = await this.fetchModelsWithCache();\n\n let models = rawModels.map((m) => this.mapToProviderModelInfo(m));\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (m) =>\n m.id.toLowerCase().includes(lowerFilter) ||\n m.name.toLowerCase().includes(lowerFilter)\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from Anthropic:', error);\n return [];\n }\n }\n\n // ============================================================================\n // Generation Methods\n // ============================================================================\n\n /**\n * Resolve the default max_tokens for a model from the static capability\n * table, clamped so non-streaming requests stay under HTTP timeouts.\n */\n private defaultMaxTokensFor(modelId: string): number {\n const caps = AnthropicProvider.lookupStaticCapabilities(modelId);\n return Math.min(caps?.maxOutputTokens ?? 8192, 8192);\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const client = await this.getClient();\n\n try {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n const response = await client.messages.create(\n { ...params, stream: false },\n { signal: request.signal }\n );\n\n return transformResponse(response);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const client = await this.getClient();\n const self = this;\n\n try {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n const stream = await client.messages.create(\n { ...params, stream: true },\n { signal: request.signal }\n );\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createStreamState();\n\n try {\n for await (const event of stream) {\n const chunks = processStreamEvent(event, state);\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n const record = isObjectLike(error) ? error : null;\n const status =\n typeof record?.status === 'number'\n ? record.status\n : typeof record?.statusCode === 'number'\n ? record.statusCode\n : undefined;\n const message = error instanceof Error ? error.message : String(error);\n\n if (status === 429) {\n return new ProviderError(message, 'rate_limit', status, parseRetryAfter(record?.headers));\n }\n if (status === 401 || status === 403) {\n return new ProviderError(message, 'auth_error', status);\n }\n if (status === 400 || status === 404 || status === 413) {\n return new ProviderError(message, 'invalid_request', status);\n }\n if (status !== undefined && status >= 500) {\n // Includes 529 overloaded_error - retryable server-side condition\n return new ProviderError(message, 'server_error', status);\n }\n if (\n (error instanceof Error && error.name === 'AbortError') ||\n record?.code === 'ETIMEDOUT'\n ) {\n return new ProviderError(message, 'timeout');\n }\n\n return new ProviderError(message, 'unknown', status);\n }\n\n // ============================================================================\n // Inspection\n // ============================================================================\n\n /**\n * Transform a ProviderRequest to Anthropic Messages API format for inspection.\n * Returns the exact request body that would be sent, with base64 data truncated.\n */\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildCreateParams(\n request,\n DEFAULT_REASONING_LEVELS,\n this.defaultMaxTokensFor(request.model)\n );\n\n // Round-trip through JSON to get a plain serializable body for the UI\n const body: Record<string, unknown> = JSON.parse(JSON.stringify(params));\n\n return {\n body: truncateBase64(body),\n messagesPath: 'messages',\n metadata: {\n endpoint: 'messages.create',\n },\n };\n }\n}\n\n// Re-export for capability-aware consumers\nexport { getThinkingMode };\n","/**\n * Discrete transformer functions for the Anthropic Messages API provider.\n * These functions convert between Standard Agent types and Anthropic API types.\n * Kept as pure functions for easy testing.\n */\n\nimport type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ProviderReasoningDetail,\n ProviderExecutedToolResult,\n} from '@standardagents/spec';\nimport { mapReasoningLevel } from '@standardagents/spec';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport {\n calculateAnthropicUsageCost,\n extractUsageBuckets,\n type AnthropicUsageBuckets,\n} from './pricing';\n\n// ============================================================================\n// Type aliases for Anthropic Messages API types\n// ============================================================================\n\ntype MessageParam = Anthropic.Messages.MessageParam;\ntype MessageCreateParams = Anthropic.Messages.MessageCreateParams;\ntype ContentBlockParam = Anthropic.Messages.ContentBlockParam;\ntype ContentBlock = Anthropic.Messages.ContentBlock;\ntype ToolResultBlockParam = Anthropic.Messages.ToolResultBlockParam;\ntype AnthropicTool = Anthropic.Messages.Tool;\ntype ToolUnion = Anthropic.Messages.ToolUnion;\ntype ToolChoice = Anthropic.Messages.ToolChoice;\ntype AnthropicMessage = Anthropic.Messages.Message;\ntype AnthropicUsage = Anthropic.Messages.Usage;\ntype MessageDeltaUsage = Anthropic.Messages.MessageDeltaUsage;\ntype RawMessageStreamEvent = Anthropic.Messages.RawMessageStreamEvent;\ntype StopReason = Anthropic.Messages.StopReason;\ntype ImageBlockParam = Anthropic.Messages.ImageBlockParam;\ntype DocumentBlockParam = Anthropic.Messages.DocumentBlockParam;\ntype TextBlockParam = Anthropic.Messages.TextBlockParam;\n\n/**\n * Reasoning detail formats used to round-trip Anthropic thinking blocks.\n * Thinking blocks must be replayed exactly as received (text + signature),\n * so both halves are stored on a single reasoning detail entry.\n */\nexport const THINKING_FORMAT = 'anthropic-thinking-v1';\nexport const REDACTED_THINKING_FORMAT = 'anthropic-redacted-thinking-v1';\n\n/**\n * Default mapping from the 0-100 reasoning scale to Anthropic effort levels.\n * Used for models that support adaptive thinking + the effort parameter.\n * 'xhigh'/'max' are intentionally excluded from the default mapping since\n * support varies by model; capability-aware callers can pass their own map.\n */\nexport const DEFAULT_REASONING_LEVELS: Record<number, string | null> = {\n 0: null,\n 33: 'low',\n 66: 'medium',\n 100: 'high',\n};\n\n/**\n * Anthropic server-side tools. These execute on Anthropic's servers; results\n * come back as server_tool_use / *_tool_result content blocks rather than\n * client tool calls, so they are excluded from history replay.\n */\nexport const ANTHROPIC_NATIVE_TOOLS = new Set(['web_search']);\n\n/**\n * Default max_tokens when the request and model capabilities don't specify\n * one. The Messages API requires max_tokens on every request.\n */\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 8192;\n\n// ============================================================================\n// Thinking Mode Resolution\n// ============================================================================\n\n/**\n * How a Claude model expects extended thinking to be requested:\n * - 'adaptive': thinking: { type: 'adaptive' } + output_config.effort (4.6+)\n * - 'budget': thinking: { type: 'enabled', budget_tokens } (4.0-4.5, 3.7)\n * - 'none': no thinking support (Claude 3.x)\n */\nexport type ThinkingMode = 'adaptive' | 'budget' | 'none';\n\n/**\n * Ordered prefix table mapping model IDs to their thinking mode.\n * More specific prefixes must come before shorter ones.\n */\nconst THINKING_MODE_PREFIXES: Array<[string, ThinkingMode]> = [\n ['claude-fable-5', 'adaptive'],\n ['claude-mythos', 'adaptive'],\n ['claude-opus-5', 'adaptive'],\n ['claude-opus-4-8', 'adaptive'],\n ['claude-opus-4-7', 'adaptive'],\n ['claude-opus-4-6', 'adaptive'],\n ['claude-opus-4-5', 'budget'],\n ['claude-opus-4-1', 'budget'],\n ['claude-opus-4-0', 'budget'],\n ['claude-opus-4-2', 'budget'], // dated full IDs like claude-opus-4-20250514\n ['claude-sonnet-4-6', 'adaptive'],\n ['claude-sonnet-4-5', 'budget'],\n ['claude-sonnet-4-0', 'budget'],\n ['claude-sonnet-4-2', 'budget'], // dated full IDs like claude-sonnet-4-20250514\n ['claude-haiku-4-5', 'budget'],\n ['claude-3-7-sonnet', 'budget'],\n ['claude-3', 'none'],\n];\n\n/**\n * Resolve the thinking mode for a Claude model ID.\n * Unknown (future) models default to 'adaptive' since all current-generation\n * Claude models use adaptive thinking.\n */\nexport function getThinkingMode(modelId: string): ThinkingMode {\n for (const [prefix, mode] of THINKING_MODE_PREFIXES) {\n if (modelId.startsWith(prefix)) {\n return mode;\n }\n }\n return 'adaptive';\n}\n\n// ============================================================================\n// Input Content Transformers\n// ============================================================================\n\n/**\n * Split a data URI into media type and base64 payload.\n * Returns null when the string is not a data URI.\n */\nfunction parseDataUri(value: string): { mediaType: string; data: string } | null {\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(value);\n if (!match) return null;\n return {\n mediaType: match[1] || 'application/octet-stream',\n data: match[3],\n };\n}\n\ntype AnthropicImageMediaType = ImageBlockParam['source'] extends infer S\n ? S extends { type: 'base64'; media_type: infer M }\n ? M\n : never\n : never;\n\nconst SUPPORTED_IMAGE_MEDIA_TYPES = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n]);\n\nfunction normalizeImageMediaType(mediaType: string | undefined): AnthropicImageMediaType {\n if (mediaType && SUPPORTED_IMAGE_MEDIA_TYPES.has(mediaType)) {\n return mediaType as AnthropicImageMediaType;\n }\n return 'image/png';\n}\n\n/**\n * Build an Anthropic image block from base64 data or a URL.\n */\nfunction imageBlock(data: string, mediaType?: string): ImageBlockParam {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return { type: 'image', source: { type: 'url', url: data } };\n }\n const parsed = parseDataUri(data);\n if (parsed) {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: normalizeImageMediaType(parsed.mediaType),\n data: parsed.data,\n },\n };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: normalizeImageMediaType(mediaType),\n data,\n },\n };\n}\n\n/**\n * Decode a base64 string to UTF-8 text. Used for plain-text document sources.\n */\nfunction decodeBase64Text(data: string): string {\n try {\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n } catch {\n return data;\n }\n}\n\n/**\n * Build an Anthropic document block (or fallback text block) from a file part.\n * PDFs map to document blocks; text files map to plain-text document sources;\n * other media types are not supported by the Messages API and fall back to a\n * descriptive text block so the model knows an attachment existed.\n */\nfunction fileBlock(\n data: string,\n mediaType: string,\n filename?: string\n): DocumentBlockParam | TextBlockParam {\n const parsed = parseDataUri(data);\n const base64 = parsed ? parsed.data : data;\n const resolvedMediaType = parsed?.mediaType || mediaType;\n\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return { type: 'document', source: { type: 'url', url: data } };\n }\n\n if (resolvedMediaType === 'application/pdf') {\n return {\n type: 'document',\n source: { type: 'base64', media_type: 'application/pdf', data: base64 },\n ...(filename ? { title: filename } : {}),\n };\n }\n\n if (resolvedMediaType.startsWith('text/') || resolvedMediaType === 'application/json') {\n return {\n type: 'document',\n source: { type: 'text', media_type: 'text/plain', data: decodeBase64Text(base64) },\n ...(filename ? { title: filename } : {}),\n };\n }\n\n return {\n type: 'text',\n text: `[Unsupported file attachment${filename ? `: ${filename}` : ''} (${resolvedMediaType})]`,\n };\n}\n\n/**\n * Transform a single content part to an Anthropic content block.\n */\nexport function transformContentPart(part: ContentPart): ContentBlockParam {\n if (part.type === 'text') {\n return { type: 'text', text: part.text };\n }\n if (part.type === 'image') {\n return imageBlock(part.data || '', part.mediaType);\n }\n if (part.type === 'image_url') {\n return imageBlock(part.image_url?.url || '');\n }\n // File parts\n return fileBlock(part.data || '', part.mediaType || 'application/octet-stream', part.filename);\n}\n\n/**\n * Transform message content (string or parts array) to Anthropic format.\n */\nexport function transformMessageContent(\n content: string | ContentPart[]\n): string | ContentBlockParam[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformContentPart);\n}\n\n// ============================================================================\n// Message Transformers\n// ============================================================================\n\n/**\n * Transform an assistant message to an Anthropic assistant MessageParam.\n * Thinking blocks (rebuilt from reasoning details) come first, then text,\n * then tool_use blocks — matching the order the API emits them.\n *\n * Returns null when the message has nothing the API can replay (e.g. an\n * assistant turn that only contained server-tool calls).\n */\nexport function transformAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): MessageParam | null {\n const content: ContentBlockParam[] = [];\n\n // Rebuild thinking blocks exactly as received. Details from other\n // providers (different format markers) are skipped — they can't be\n // replayed against the Anthropic API.\n if (msg.reasoningDetails) {\n for (const detail of msg.reasoningDetails) {\n if (detail.format === THINKING_FORMAT && detail.text !== undefined) {\n content.push({\n type: 'thinking',\n thinking: detail.text,\n signature: detail.data ?? '',\n });\n } else if (detail.format === REDACTED_THINKING_FORMAT && detail.data) {\n content.push({ type: 'redacted_thinking', data: detail.data });\n }\n }\n }\n\n if (msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n // Server-side tools (web_search) are executed by Anthropic and can't be\n // replayed as client tool_use blocks.\n if (ANTHROPIC_NATIVE_TOOLS.has(tc.name)) {\n continue;\n }\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments,\n });\n }\n }\n\n if (content.length === 0) {\n return null;\n }\n\n return { role: 'assistant', content };\n}\n\n/**\n * Transform a tool result message to an Anthropic tool_result block.\n * Returns null for server-side tool results (they're skipped along with\n * their tool_use blocks during replay).\n */\nexport function transformToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): ToolResultBlockParam | null {\n if (ANTHROPIC_NATIVE_TOOLS.has(msg.toolName)) {\n return null;\n }\n\n let text: string;\n let isError = false;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n text = msg.content.text;\n } else if (msg.content.type === 'error') {\n text = msg.content.error;\n isError = true;\n } else {\n text = JSON.stringify(msg.content);\n }\n } else {\n text = JSON.stringify(msg.content);\n }\n\n const blocks: Array<TextBlockParam | ImageBlockParam> = [];\n if (text) {\n blocks.push({ type: 'text', text });\n }\n\n // Image attachments from tool execution become image blocks inside the\n // tool_result so the model can see them.\n if (msg.attachments?.length) {\n for (const attachment of msg.attachments) {\n if (attachment.type === 'image' && attachment.data) {\n blocks.push(imageBlock(attachment.data, attachment.mediaType));\n }\n }\n }\n\n return {\n type: 'tool_result',\n tool_use_id: msg.toolCallId,\n ...(blocks.length > 0 ? { content: blocks } : {}),\n ...(isError ? { is_error: true } : {}),\n };\n}\n\n/**\n * Transform an array of ProviderMessages to Anthropic format.\n * System messages are extracted into the top-level system prompt.\n * Consecutive tool results are merged into a single user turn, which is how\n * the Messages API expects tool results to follow parallel tool calls.\n */\nexport function transformMessages(messages: ProviderMessage[]): {\n anthropicMessages: MessageParam[];\n system: string | undefined;\n} {\n let system: string | undefined;\n const anthropicMessages: MessageParam[] = [];\n let pendingToolResults: ToolResultBlockParam[] = [];\n\n const flushToolResults = () => {\n if (pendingToolResults.length > 0) {\n anthropicMessages.push({ role: 'user', content: pendingToolResults });\n pendingToolResults = [];\n }\n };\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n system = system ? `${system}\\n\\n${msg.content}` : msg.content;\n break;\n\n case 'user':\n flushToolResults();\n anthropicMessages.push({\n role: 'user',\n content: transformMessageContent(msg.content),\n });\n break;\n\n case 'assistant': {\n flushToolResults();\n const assistantMessage = transformAssistantMessage(msg);\n if (assistantMessage) {\n anthropicMessages.push(assistantMessage);\n }\n break;\n }\n\n case 'tool': {\n const toolResult = transformToolMessage(msg);\n if (toolResult) {\n pendingToolResults.push(toolResult);\n }\n break;\n }\n }\n }\n\n flushToolResults();\n\n return { anthropicMessages, system };\n}\n\n// ============================================================================\n// Tool Transformers\n// ============================================================================\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Transform a single ProviderTool to an Anthropic custom tool definition.\n */\nexport function transformTool(tool: ProviderTool): AnthropicTool {\n const parameters = isRecord(tool.function.parameters)\n ? tool.function.parameters\n : { type: 'object', properties: {} };\n\n return {\n name: tool.function.name,\n ...(tool.function.description ? { description: tool.function.description } : {}),\n input_schema: {\n ...parameters,\n type: 'object',\n },\n };\n}\n\n/**\n * Transform an array of ProviderTools to Anthropic format.\n * Separates client function tools from Anthropic server-side tools.\n */\nexport function transformTools(tools: ProviderTool[]): ToolUnion[] {\n const result: ToolUnion[] = [];\n\n for (const tool of tools) {\n const toolName = tool.function.name;\n\n if (tool.executionMode === 'provider' && ANTHROPIC_NATIVE_TOOLS.has(toolName)) {\n if (toolName === 'web_search') {\n result.push({ type: 'web_search_20250305', name: 'web_search' });\n }\n } else {\n result.push(transformTool(tool));\n }\n }\n\n return result;\n}\n\n/**\n * Transform tool choice option to Anthropic format.\n * parallelToolCalls=false maps to disable_parallel_tool_use on the choice.\n */\nexport function transformToolChoice(\n choice: ProviderRequest['toolChoice'],\n parallelToolCalls?: boolean\n): ToolChoice | undefined {\n const disable = parallelToolCalls === false ? { disable_parallel_tool_use: true } : {};\n\n if (choice === 'none') {\n return { type: 'none' };\n }\n if (choice === 'required') {\n return { type: 'any', ...disable };\n }\n if (typeof choice === 'object' && choice !== null && 'name' in choice) {\n return { type: 'tool', name: choice.name, ...disable };\n }\n if (choice === 'auto' || parallelToolCalls === false) {\n return { type: 'auto', ...disable };\n }\n return undefined;\n}\n\n// ============================================================================\n// Response Transformers\n// ============================================================================\n\n/**\n * Map an Anthropic stop reason to a Provider finish reason.\n */\nexport function mapFinishReason(stopReason: StopReason | null): ProviderFinishReason {\n switch (stopReason) {\n case 'end_turn':\n case 'stop_sequence':\n case 'pause_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool_calls';\n case 'refusal':\n return 'content_filter';\n default:\n return 'stop';\n }\n}\n\n/**\n * Extract text content from response content blocks.\n */\nexport function extractTextContent(content: ContentBlock[]): string | null {\n const textParts: string[] = [];\n for (const block of content) {\n if (block.type === 'text') {\n textParts.push(block.text);\n }\n }\n return textParts.length > 0 ? textParts.join('') : null;\n}\n\n/**\n * Extract reasoning (thinking) content from response content blocks.\n * Each thinking block becomes one reasoning detail carrying both the text\n * and its signature so it can be replayed verbatim on the next turn.\n */\nexport function extractReasoningContent(content: ContentBlock[]): {\n reasoning: string | null;\n reasoningDetails: ProviderReasoningDetail[] | undefined;\n} {\n let reasoning: string | null = null;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const block of content) {\n if (block.type === 'thinking') {\n if (block.thinking) {\n reasoning = reasoning ? `${reasoning}\\n${block.thinking}` : block.thinking;\n }\n reasoningDetails.push({\n type: 'text',\n text: block.thinking,\n data: block.signature,\n format: THINKING_FORMAT,\n });\n } else if (block.type === 'redacted_thinking') {\n reasoningDetails.push({\n type: 'encrypted',\n data: block.data,\n format: REDACTED_THINKING_FORMAT,\n });\n }\n }\n\n return {\n reasoning,\n reasoningDetails: reasoningDetails.length > 0 ? reasoningDetails : undefined,\n };\n}\n\n/**\n * Extract client tool calls from response content blocks.\n */\nexport function extractToolCalls(\n content: ContentBlock[]\n): ProviderToolCallPart[] | undefined {\n const toolCalls: ProviderToolCallPart[] = [];\n\n for (const block of content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: isRecord(block.input) ? block.input : {},\n });\n }\n }\n\n return toolCalls.length > 0 ? toolCalls : undefined;\n}\n\nfunction webSearchToolResult(\n id: string,\n input: unknown,\n resultContent: unknown\n): ProviderExecutedToolResult {\n const query = isRecord(input) && typeof input.query === 'string' ? input.query : undefined;\n\n let status: ProviderExecutedToolResult['status'] = 'completed';\n let sources: Array<{ type?: string; url: string; title?: string }> | undefined;\n\n if (Array.isArray(resultContent)) {\n sources = resultContent\n .filter(isRecord)\n .filter((item) => item.type === 'web_search_result' && typeof item.url === 'string')\n .map((item) => ({\n type: 'url',\n url: item.url as string,\n ...(typeof item.title === 'string' ? { title: item.title } : {}),\n }));\n } else if (isRecord(resultContent) && resultContent.type === 'web_search_tool_result_error') {\n status = 'failed';\n }\n\n return {\n name: 'web_search',\n type: 'web_search',\n provider: 'anthropic',\n id,\n status,\n result: {\n actions: [{\n type: 'search',\n ...(query ? { query } : {}),\n ...(sources && sources.length > 0 ? { sources } : {}),\n }],\n },\n };\n}\n\n/**\n * Extract server-side tool executions (web search) from response content\n * blocks, pairing server_tool_use blocks with their result blocks.\n */\nexport function extractProviderToolResults(\n content: ContentBlock[]\n): ProviderExecutedToolResult[] | undefined {\n const providerTools: ProviderExecutedToolResult[] = [];\n const serverToolUses = new Map<string, { name: string; input: unknown }>();\n\n for (const block of content) {\n if (block.type === 'server_tool_use') {\n serverToolUses.set(block.id, { name: block.name, input: block.input });\n } else if (block.type === 'web_search_tool_result') {\n const use = serverToolUses.get(block.tool_use_id);\n providerTools.push(\n webSearchToolResult(block.tool_use_id, use?.input, block.content)\n );\n }\n }\n\n return providerTools.length > 0 ? providerTools : undefined;\n}\n\n/**\n * Transform Anthropic usage to Provider usage format.\n *\n * Anthropic's input_tokens excludes cached tokens, while the Standard Agents\n * convention (matching OpenAI) is that promptTokens covers the full prompt\n * with cachedTokens as the subset read from cache. The buckets are summed\n * here so usage totals stay comparable across providers.\n *\n * When the model has known pricing, the exact dollar cost is computed from\n * the raw billing buckets (cache writes at 1.25x/2x and model-specific cache reads) —\n * the API itself reports tokens only, never cost.\n */\nexport function transformUsage(\n usage: AnthropicUsage | undefined,\n modelId?: string\n): ProviderUsage {\n if (!usage) {\n return { promptTokens: 0, completionTokens: 0, totalTokens: 0, provider: 'anthropic' };\n }\n\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n const promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n const completionTokens = usage.output_tokens;\n const reasoningTokens = usage.output_tokens_details?.thinking_tokens;\n const cost = modelId\n ? calculateAnthropicUsageCost(modelId, extractUsageBuckets(usage))\n : undefined;\n\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n ...(cacheRead > 0 ? { cachedTokens: cacheRead } : {}),\n ...(cost !== undefined ? { cost } : {}),\n provider: 'anthropic',\n };\n}\n\n/**\n * Transform a complete Anthropic Message response to ProviderResponse.\n */\nexport function transformResponse(message: AnthropicMessage): ProviderResponse {\n const content = extractTextContent(message.content);\n const { reasoning, reasoningDetails } = extractReasoningContent(message.content);\n const toolCalls = extractToolCalls(message.content);\n const providerTools = extractProviderToolResults(message.content);\n\n return {\n content,\n reasoning,\n reasoningDetails,\n toolCalls,\n providerTools,\n finishReason: mapFinishReason(message.stop_reason),\n usage: transformUsage(message.usage, message.model),\n metadata: {\n model: message.model,\n provider: 'anthropic',\n requestId: message.id,\n ...(message.stop_sequence ? { stopSequence: message.stop_sequence } : {}),\n ...(message.usage?.cache_creation_input_tokens\n ? { cacheCreationInputTokens: message.usage.cache_creation_input_tokens }\n : {}),\n ...(message.usage?.cache_read_input_tokens\n ? { cacheReadInputTokens: message.usage.cache_read_input_tokens }\n : {}),\n ...(message.usage?.service_tier ? { serviceTier: message.usage.service_tier } : {}),\n ...(message.usage?.server_tool_use\n ? { serverToolUse: { ...message.usage.server_tool_use } }\n : {}),\n },\n };\n}\n\n// ============================================================================\n// Request Builder\n// ============================================================================\n\n/**\n * Validate a providerOptions thinking override into the SDK's config shape.\n * Unknown shapes are ignored so a bad option can't produce a malformed request.\n */\nfunction resolveThinkingOverride(\n value: unknown\n): Anthropic.Messages.ThinkingConfigParam | undefined {\n if (!isRecord(value)) return undefined;\n\n const display =\n value.display === 'summarized' || value.display === 'omitted'\n ? value.display\n : undefined;\n\n if (value.type === 'adaptive') {\n return { type: 'adaptive', ...(display ? { display } : {}) };\n }\n if (value.type === 'enabled' && typeof value.budget_tokens === 'number') {\n return {\n type: 'enabled',\n budget_tokens: value.budget_tokens,\n ...(display ? { display } : {}),\n };\n }\n if (value.type === 'disabled') {\n return { type: 'disabled' };\n }\n return undefined;\n}\n\n/**\n * Clamp a thinking budget to the valid range: >= 1024 and < maxTokens.\n * Returns null when there isn't enough output headroom for thinking.\n */\nfunction resolveThinkingBudget(\n level: number,\n maxTokens: number,\n explicitBudget?: number\n): number | null {\n if (maxTokens < 2048) {\n return null;\n }\n const ceiling = maxTokens - 1024;\n const scaled = explicitBudget ?? Math.floor((maxTokens * Math.min(level, 100)) / 100 * 0.75);\n return Math.max(1024, Math.min(scaled, ceiling));\n}\n\n/**\n * Build a Messages API create request from a ProviderRequest.\n *\n * Thinking configuration is derived from the request's 0-100 reasoning level\n * and the model's thinking mode: adaptive models get\n * `thinking: { type: 'adaptive' }` plus an effort level, while\n * budget-mode models get `thinking: { type: 'enabled', budget_tokens }`.\n * When thinking is active, sampling parameters are omitted — the API rejects\n * temperature/top_p/top_k alongside thinking.\n */\nexport function buildCreateParams(\n request: ProviderRequest,\n reasoningLevels: Record<number, string | null> = DEFAULT_REASONING_LEVELS,\n defaultMaxTokens: number = DEFAULT_MAX_OUTPUT_TOKENS\n): MessageCreateParams {\n const { anthropicMessages, system } = transformMessages(request.messages);\n\n const maxTokens = request.maxOutputTokens ?? defaultMaxTokens;\n\n const params: MessageCreateParams = {\n model: request.model,\n max_tokens: maxTokens,\n messages: anthropicMessages,\n };\n\n // Provider options that this builder manages itself.\n const providerOptions = isRecord(request.providerOptions) ? request.providerOptions : {};\n const {\n cacheSystemPrompt,\n thinking: thinkingOverride,\n ...passthroughOptions\n } = providerOptions;\n\n let systemText = system;\n\n // Response format: structured outputs via output_config when a schema is\n // provided; otherwise fall back to a system prompt instruction since the\n // Messages API has no bare JSON mode.\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.output_config = {\n format: { type: 'json_schema', schema: request.responseFormat.schema },\n };\n } else {\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON.';\n systemText = systemText ? `${systemText}\\n\\n${jsonInstruction}` : jsonInstruction;\n }\n }\n\n if (systemText) {\n params.system = cacheSystemPrompt === true\n ? [{ type: 'text', text: systemText, cache_control: { type: 'ephemeral' } }]\n : systemText;\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n params.tools = transformTools(request.tools);\n }\n const toolChoice = transformToolChoice(request.toolChoice, request.parallelToolCalls);\n if (toolChoice && params.tools && params.tools.length > 0) {\n params.tool_choice = toolChoice;\n }\n\n // Thinking configuration\n const thinkingMode = getThinkingMode(request.model);\n let thinkingEnabled = false;\n\n const resolvedOverride = resolveThinkingOverride(thinkingOverride);\n if (resolvedOverride) {\n params.thinking = resolvedOverride;\n thinkingEnabled = resolvedOverride.type !== 'disabled';\n } else if (request.reasoning?.level !== undefined && request.reasoning.level > 0) {\n if (thinkingMode === 'adaptive') {\n params.thinking = {\n type: 'adaptive',\n ...(request.reasoning.exclude ? { display: 'omitted' } : {}),\n };\n const effort = mapReasoningLevel(request.reasoning.level, reasoningLevels);\n if (effort) {\n params.output_config = {\n ...params.output_config,\n effort: effort as 'low' | 'medium' | 'high' | 'xhigh' | 'max',\n };\n }\n thinkingEnabled = true;\n } else if (thinkingMode === 'budget') {\n const budget = resolveThinkingBudget(\n request.reasoning.level,\n maxTokens,\n request.reasoning.maxTokens\n );\n if (budget !== null) {\n params.thinking = {\n type: 'enabled',\n budget_tokens: budget,\n ...(request.reasoning.exclude ? { display: 'omitted' } : {}),\n };\n thinkingEnabled = true;\n }\n }\n // thinkingMode 'none': Claude 3.x — no thinking parameter\n }\n\n // Sampling parameters are incompatible with thinking (the API requires\n // temperature 1 and rejects top_p/top_k when thinking is on), and the\n // newest models reject them entirely — only forward when thinking is off.\n if (!thinkingEnabled) {\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n if (request.topK !== undefined) {\n params.top_k = request.topK;\n }\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop_sequences = request.stopSequences;\n }\n\n // Merge remaining provider-specific options (service_tier, metadata, ...).\n Object.assign(params, passthroughOptions);\n\n return params;\n}\n\n// ============================================================================\n// Stream State and Chunk Transformers\n// ============================================================================\n\ninterface StreamToolCall {\n id: string;\n name: string;\n argumentsJson: string;\n}\n\ninterface StreamThinkingBlock {\n thinking: string;\n signature: string;\n}\n\ninterface StreamServerToolUse {\n id: string;\n name: string;\n inputJson: string;\n}\n\nexport interface StreamState {\n /** Open content blocks keyed by stream index */\n toolCallsByIndex: Map<number, StreamToolCall>;\n thinkingByIndex: Map<number, StreamThinkingBlock>;\n serverToolsByIndex: Map<number, StreamServerToolUse>;\n /** Completed server tool uses awaiting their result block */\n pendingServerTools: Map<string, { name: string; input: unknown }>;\n reasoningDetails: ProviderReasoningDetail[];\n hasContent: boolean;\n hasReasoning: boolean;\n /** Usage captured from message_start (input/cache buckets) */\n usage: ProviderUsage;\n /** Raw billing buckets for exact cost calculation at message_stop */\n buckets: AnthropicUsageBuckets;\n finishReason: ProviderFinishReason;\n model: string | null;\n messageId: string | null;\n serverToolUse: { web_search_requests: number; web_fetch_requests: number } | null;\n}\n\nexport function createStreamState(): StreamState {\n return {\n toolCallsByIndex: new Map(),\n thinkingByIndex: new Map(),\n serverToolsByIndex: new Map(),\n pendingServerTools: new Map(),\n reasoningDetails: [],\n hasContent: false,\n hasReasoning: false,\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, provider: 'anthropic' },\n buckets: {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWrite5mTokens: 0,\n cacheWrite1hTokens: 0,\n },\n finishReason: 'stop',\n model: null,\n messageId: null,\n serverToolUse: null,\n };\n}\n\nfunction parseToolCallArguments(argumentsJson: string): Record<string, unknown> {\n try {\n const parsed: unknown = argumentsJson ? JSON.parse(argumentsJson) : {};\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction applyDeltaUsage(state: StreamState, usage: MessageDeltaUsage): void {\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n // message_delta usage is cumulative; input buckets repeat message_start\n // values when present, so prefer them when provided.\n if (usage.input_tokens !== null && usage.input_tokens !== undefined) {\n state.usage.promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n if (cacheRead > 0) {\n state.usage.cachedTokens = cacheRead;\n }\n state.buckets.inputTokens = usage.input_tokens;\n state.buckets.cacheReadTokens = cacheRead;\n // The delta has no per-TTL cache-write breakdown; keep the 1h split from\n // message_start and attribute the remainder to the 5-minute bucket.\n state.buckets.cacheWrite5mTokens = Math.max(\n cacheCreation - state.buckets.cacheWrite1hTokens,\n 0\n );\n }\n state.buckets.outputTokens = usage.output_tokens;\n state.usage.completionTokens = usage.output_tokens;\n const thinkingTokens = usage.output_tokens_details?.thinking_tokens;\n if (thinkingTokens !== undefined) {\n state.usage.reasoningTokens = thinkingTokens;\n }\n state.usage.totalTokens = state.usage.promptTokens + state.usage.completionTokens;\n if (usage.server_tool_use) {\n state.serverToolUse = { ...usage.server_tool_use };\n }\n}\n\n/**\n * Process an Anthropic stream event and return provider stream chunks.\n */\nexport function processStreamEvent(\n event: RawMessageStreamEvent,\n state: StreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n\n switch (event.type) {\n case 'message_start': {\n const usage = event.message.usage;\n const cacheCreation = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n state.usage.promptTokens = usage.input_tokens + cacheCreation + cacheRead;\n if (cacheRead > 0) {\n state.usage.cachedTokens = cacheRead;\n }\n state.usage.completionTokens = usage.output_tokens;\n state.usage.totalTokens = state.usage.promptTokens + state.usage.completionTokens;\n state.buckets = extractUsageBuckets(usage);\n state.model = event.message.model;\n state.messageId = event.message.id;\n break;\n }\n\n case 'content_block_start': {\n const block = event.content_block;\n if (block.type === 'tool_use') {\n state.toolCallsByIndex.set(event.index, {\n id: block.id,\n name: block.name,\n argumentsJson: '',\n });\n chunks.push({ type: 'tool-call-start', id: block.id, name: block.name });\n } else if (block.type === 'thinking') {\n state.thinkingByIndex.set(event.index, {\n thinking: block.thinking || '',\n signature: block.signature || '',\n });\n } else if (block.type === 'redacted_thinking') {\n state.reasoningDetails.push({\n type: 'encrypted',\n data: block.data,\n format: REDACTED_THINKING_FORMAT,\n });\n } else if (block.type === 'server_tool_use') {\n state.serverToolsByIndex.set(event.index, {\n id: block.id,\n name: block.name,\n inputJson: '',\n });\n } else if (block.type === 'web_search_tool_result') {\n const use = state.pendingServerTools.get(block.tool_use_id);\n chunks.push({\n type: 'provider-tool-done',\n tool: webSearchToolResult(block.tool_use_id, use?.input, block.content),\n });\n state.pendingServerTools.delete(block.tool_use_id);\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta.type === 'text_delta') {\n state.hasContent = true;\n chunks.push({ type: 'content-delta', delta: delta.text });\n } else if (delta.type === 'thinking_delta') {\n state.hasReasoning = true;\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n thinkingBlock.thinking += delta.thinking;\n }\n chunks.push({ type: 'reasoning-delta', delta: delta.thinking });\n } else if (delta.type === 'signature_delta') {\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n thinkingBlock.signature += delta.signature;\n }\n } else if (delta.type === 'input_json_delta') {\n const toolCall = state.toolCallsByIndex.get(event.index);\n if (toolCall) {\n toolCall.argumentsJson += delta.partial_json;\n chunks.push({\n type: 'tool-call-delta',\n id: toolCall.id,\n argumentsDelta: delta.partial_json,\n });\n } else {\n const serverTool = state.serverToolsByIndex.get(event.index);\n if (serverTool) {\n serverTool.inputJson += delta.partial_json;\n }\n }\n }\n break;\n }\n\n case 'content_block_stop': {\n const toolCall = state.toolCallsByIndex.get(event.index);\n if (toolCall) {\n chunks.push({\n type: 'tool-call-done',\n id: toolCall.id,\n arguments: parseToolCallArguments(toolCall.argumentsJson),\n });\n state.toolCallsByIndex.delete(event.index);\n break;\n }\n\n const thinkingBlock = state.thinkingByIndex.get(event.index);\n if (thinkingBlock) {\n state.reasoningDetails.push({\n type: 'text',\n text: thinkingBlock.thinking,\n data: thinkingBlock.signature,\n format: THINKING_FORMAT,\n });\n state.thinkingByIndex.delete(event.index);\n break;\n }\n\n const serverTool = state.serverToolsByIndex.get(event.index);\n if (serverTool) {\n state.pendingServerTools.set(serverTool.id, {\n name: serverTool.name,\n input: parseToolCallArguments(serverTool.inputJson),\n });\n state.serverToolsByIndex.delete(event.index);\n }\n break;\n }\n\n case 'message_delta': {\n if (event.delta.stop_reason) {\n state.finishReason = mapFinishReason(event.delta.stop_reason);\n }\n applyDeltaUsage(state, event.usage);\n break;\n }\n\n case 'message_stop': {\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n const cost = calculateAnthropicUsageCost(state.model, state.buckets);\n chunks.push({\n type: 'finish',\n finishReason: state.finishReason,\n usage: { ...state.usage, ...(cost !== undefined ? { cost } : {}) },\n ...(state.reasoningDetails.length > 0\n ? { reasoningDetails: [...state.reasoningDetails] }\n : {}),\n });\n break;\n }\n\n default:\n break;\n }\n\n return chunks;\n}\n\n/**\n * Create error chunk.\n */\nexport function createErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\n// ============================================================================\n// Inspection Utilities\n// ============================================================================\n\n/**\n * Check if a string looks like base64 data that should be truncated.\n */\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\n/**\n * Recursively truncate base64 data in an object for inspection.\n */\nexport function truncateBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n if (isBase64Like(obj)) {\n return truncateBase64String(obj, maxLength) as T;\n }\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => truncateBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","/**\n * Anthropic icon (Claude).\n */\nexport const ANTHROPIC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n<rect width=\"48\" height=\"48\" fill=\"#F0EFEA\"/>\n<path d=\"M32.84 10H26.72L37.88 38H44L32.84 10Z\" fill=\"black\"/>\n<path d=\"M15.16 10L4 38H10.24L12.5224 32.12H24.1976L26.48 38H32.72L21.56 10H15.16ZM14.5408 26.92L18.36 17.08L22.1793 26.92H14.5408Z\" fill=\"black\"/>\n</svg>`;\n\n/**\n * Convert SVG string to data URI for use in img src.\n */\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.endsWith('.svg') || icon.includes('.svg?')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\n/**\n * Get the Anthropic icon as a data URI.\n */\nexport function getAnthropicIconDataUri(): string {\n return normalizeIcon(ANTHROPIC_ICON);\n}\n","/**\n * Anthropic provider options schema.\n *\n * Defines typed providerOptions for Anthropic (Claude) models, providing\n * TypeScript autocompletion and runtime validation.\n *\n * @see https://platform.claude.com/docs/en/api/messages\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * Anthropic provider options schema.\n *\n * These options are passed directly to the Anthropic Messages API and control\n * various aspects of request handling and generation.\n *\n * @example\n * ```typescript\n * providerOptions: {\n * service_tier: 'auto',\n * metadata: { user_id: 'user-123' },\n * cacheSystemPrompt: true,\n * }\n * ```\n */\nexport const anthropicProviderOptions = z.object({\n /** Request priority tier: 'auto' uses priority capacity when available, 'standard_only' opts out */\n service_tier: z.enum(['auto', 'standard_only']).optional(),\n\n /** Request metadata. user_id is an opaque identifier for abuse monitoring */\n metadata: z.object({\n user_id: z.string().optional(),\n }).optional(),\n\n /**\n * Cache the system prompt with a prompt-caching breakpoint.\n * Adds `cache_control: { type: 'ephemeral' }` to the system prompt so\n * repeated requests with the same prefix bill cached-input rates.\n */\n cacheSystemPrompt: z.boolean().optional(),\n\n /**\n * Explicit thinking configuration override. When set, this takes precedence\n * over the thinking config derived from the request's reasoning level.\n * Accepts the Anthropic API shape, e.g. `{ type: 'adaptive' }` or\n * `{ type: 'enabled', budget_tokens: 8192 }`.\n */\n thinking: z.record(z.string(), z.unknown()).optional(),\n}).passthrough(); // Allow unknown keys for forward compatibility\n\n/**\n * TypeScript type for Anthropic provider options.\n * Inferred from the Zod schema for type-safe usage.\n */\nexport type AnthropicProviderOptions = z.infer<typeof anthropicProviderOptions>;\n","import type { ProviderFactoryWithOptions, ProviderFactoryConfig } from '@standardagents/spec';\nimport { AnthropicProvider } from './AnthropicProvider';\nimport { anthropicProviderOptions } from './providerOptions';\n\n/**\n * Anthropic (Claude) provider factory for Standard Agents\n *\n * Includes typed providerOptions for Anthropic-specific configuration.\n *\n * @example\n * ```typescript\n * import { defineModel } from '@standardagents/builder';\n * import { anthropic } from '@standardagents/anthropic';\n *\n * export default defineModel({\n * name: 'claude-opus',\n * provider: anthropic,\n * model: 'claude-opus-5',\n * inputPrice: 5,\n * outputPrice: 25,\n * capabilities: {\n * supportsImages: true,\n * supportsToolCalls: true,\n * supportsJsonMode: true,\n * maxContextTokens: 1000000,\n * },\n * providerOptions: {\n * cacheSystemPrompt: true,\n * },\n * });\n * ```\n */\nexport const anthropic: ProviderFactoryWithOptions<typeof anthropicProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new AnthropicProvider(config),\n { providerOptions: anthropicProviderOptions }\n );\n\n// Re-export the provider options schema and types\nexport { anthropicProviderOptions, type AnthropicProviderOptions } from './providerOptions';\n\n// Re-export the provider class for advanced usage\nexport { AnthropicProvider } from './AnthropicProvider';\n\n// Re-export pricing helpers for cost-aware consumers\nexport {\n getAnthropicModelPricing,\n calculateAnthropicUsageCost,\n extractUsageBuckets,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n} from './pricing';\n"],"mappings":";;;;;;;AAcA,SAAS,eAAe,kBAAkB;AAC1C,SAAS,SAAS;;;ACIlB,SAAS,yBAAyB;AAkC3B,IAAM,kBAAkB;AACxB,IAAM,2BAA2B;AAQjC,IAAM,2BAA0D;AAAA,EACrE,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP;AAOO,IAAM,yBAAyB,oBAAI,IAAI,CAAC,YAAY,CAAC;AAMrD,IAAM,4BAA4B;AAkBzC,IAAM,yBAAwD;AAAA,EAC5D,CAAC,kBAAkB,UAAU;AAAA,EAC7B,CAAC,iBAAiB,UAAU;AAAA,EAC5B,CAAC,iBAAiB,UAAU;AAAA,EAC5B,CAAC,mBAAmB,UAAU;AAAA,EAC9B,CAAC,mBAAmB,UAAU;AAAA,EAC9B,CAAC,mBAAmB,UAAU;AAAA,EAC9B,CAAC,mBAAmB,QAAQ;AAAA,EAC5B,CAAC,mBAAmB,QAAQ;AAAA,EAC5B,CAAC,mBAAmB,QAAQ;AAAA,EAC5B,CAAC,mBAAmB,QAAQ;AAAA;AAAA,EAC5B,CAAC,qBAAqB,UAAU;AAAA,EAChC,CAAC,qBAAqB,QAAQ;AAAA,EAC9B,CAAC,qBAAqB,QAAQ;AAAA,EAC9B,CAAC,qBAAqB,QAAQ;AAAA;AAAA,EAC9B,CAAC,oBAAoB,QAAQ;AAAA,EAC7B,CAAC,qBAAqB,QAAQ;AAAA,EAC9B,CAAC,YAAY,MAAM;AACrB;AAOO,SAAS,gBAAgB,SAA+B;AAC7D,aAAW,CAAC,QAAQ,IAAI,KAAK,wBAAwB;AACnD,QAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAUA,SAAS,aAAa,OAA2D;AAC/E,QAAM,QAAQ,mCAAmC,KAAK,KAAK;AAC3D,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,WAAW,MAAM,CAAC,KAAK;AAAA,IACvB,MAAM,MAAM,CAAC;AAAA,EACf;AACF;AAQA,IAAM,8BAA8B,oBAAI,IAAI;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,wBAAwB,WAAwD;AACvF,MAAI,aAAa,4BAA4B,IAAI,SAAS,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,WAAW,MAAc,WAAqC;AACrE,MAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AAC7D,WAAO,EAAE,MAAM,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,KAAK,EAAE;AAAA,EAC7D;AACA,QAAM,SAAS,aAAa,IAAI;AAChC,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY,wBAAwB,OAAO,SAAS;AAAA,QACpD,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,YAAY,wBAAwB,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,MAAsB;AAC9C,MAAI;AACF,UAAM,SAAS,KAAK,IAAI;AACxB,UAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,IAChC;AACA,WAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,SAAS,UACP,MACA,WACA,UACqC;AACrC,QAAM,SAAS,aAAa,IAAI;AAChC,QAAM,SAAS,SAAS,OAAO,OAAO;AACtC,QAAM,oBAAoB,QAAQ,aAAa;AAE/C,MAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AAC7D,WAAO,EAAE,MAAM,YAAY,QAAQ,EAAE,MAAM,OAAO,KAAK,KAAK,EAAE;AAAA,EAChE;AAEA,MAAI,sBAAsB,mBAAmB;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU,YAAY,mBAAmB,MAAM,OAAO;AAAA,MACtE,GAAI,WAAW,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,kBAAkB,WAAW,OAAO,KAAK,sBAAsB,oBAAoB;AACrF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,QAAQ,YAAY,cAAc,MAAM,iBAAiB,MAAM,EAAE;AAAA,MACjF,GAAI,WAAW,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,+BAA+B,WAAW,KAAK,QAAQ,KAAK,EAAE,KAAK,iBAAiB;AAAA,EAC5F;AACF;AAKO,SAAS,qBAAqB,MAAsC;AACzE,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,EACzC;AACA,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,SAAS;AAAA,EACnD;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,WAAW,KAAK,WAAW,OAAO,EAAE;AAAA,EAC7C;AAEA,SAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,aAAa,4BAA4B,KAAK,QAAQ;AAC/F;AAKO,SAAS,wBACd,SAC8B;AAC9B,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,IAAI,oBAAoB;AACzC;AAcO,SAAS,0BACd,KACqB;AACrB,QAAM,UAA+B,CAAC;AAKtC,MAAI,IAAI,kBAAkB;AACxB,eAAW,UAAU,IAAI,kBAAkB;AACzC,UAAI,OAAO,WAAW,mBAAmB,OAAO,SAAS,QAAW;AAClE,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO,QAAQ;AAAA,QAC5B,CAAC;AAAA,MACH,WAAW,OAAO,WAAW,4BAA4B,OAAO,MAAM;AACpE,gBAAQ,KAAK,EAAE,MAAM,qBAAqB,MAAM,OAAO,KAAK,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,IAAI,SAAS;AACf,YAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,IAAI,QAAQ,CAAC;AAAA,EAClD;AAEA,MAAI,IAAI,WAAW;AACjB,eAAW,MAAM,IAAI,WAAW;AAG9B,UAAI,uBAAuB,IAAI,GAAG,IAAI,GAAG;AACvC;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,OAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,MAAM,aAAa,QAAQ;AACtC;AAOO,SAAS,qBACd,KAC6B;AAC7B,MAAI,uBAAuB,IAAI,IAAI,QAAQ,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI,UAAU;AAEd,MAAI,OAAO,IAAI,YAAY,UAAU;AACnC,WAAO,IAAI;AAAA,EACb,WAAW,UAAU,IAAI,SAAS;AAChC,QAAI,IAAI,QAAQ,SAAS,QAAQ;AAC/B,aAAO,IAAI,QAAQ;AAAA,IACrB,WAAW,IAAI,QAAQ,SAAS,SAAS;AACvC,aAAO,IAAI,QAAQ;AACnB,gBAAU;AAAA,IACZ,OAAO;AACL,aAAO,KAAK,UAAU,IAAI,OAAO;AAAA,IACnC;AAAA,EACF,OAAO;AACL,WAAO,KAAK,UAAU,IAAI,OAAO;AAAA,EACnC;AAEA,QAAM,SAAkD,CAAC;AACzD,MAAI,MAAM;AACR,WAAO,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EACpC;AAIA,MAAI,IAAI,aAAa,QAAQ;AAC3B,eAAW,cAAc,IAAI,aAAa;AACxC,UAAI,WAAW,SAAS,WAAW,WAAW,MAAM;AAClD,eAAO,KAAK,WAAW,WAAW,MAAM,WAAW,SAAS,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,IAAI;AAAA,IACjB,GAAI,OAAO,SAAS,IAAI,EAAE,SAAS,OAAO,IAAI,CAAC;AAAA,IAC/C,GAAI,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,EACtC;AACF;AAQO,SAAS,kBAAkB,UAGhC;AACA,MAAI;AACJ,QAAM,oBAAoC,CAAC;AAC3C,MAAI,qBAA6C,CAAC;AAElD,QAAM,mBAAmB,MAAM;AAC7B,QAAI,mBAAmB,SAAS,GAAG;AACjC,wBAAkB,KAAK,EAAE,MAAM,QAAQ,SAAS,mBAAmB,CAAC;AACpE,2BAAqB,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,iBAAS,SAAS,GAAG,MAAM;AAAA;AAAA,EAAO,IAAI,OAAO,KAAK,IAAI;AACtD;AAAA,MAEF,KAAK;AACH,yBAAiB;AACjB,0BAAkB,KAAK;AAAA,UACrB,MAAM;AAAA,UACN,SAAS,wBAAwB,IAAI,OAAO;AAAA,QAC9C,CAAC;AACD;AAAA,MAEF,KAAK,aAAa;AAChB,yBAAiB;AACjB,cAAM,mBAAmB,0BAA0B,GAAG;AACtD,YAAI,kBAAkB;AACpB,4BAAkB,KAAK,gBAAgB;AAAA,QACzC;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,aAAa,qBAAqB,GAAG;AAC3C,YAAI,YAAY;AACd,6BAAmB,KAAK,UAAU;AAAA,QACpC;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB;AAEjB,SAAO,EAAE,mBAAmB,OAAO;AACrC;AAMA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKO,SAAS,cAAc,MAAmC;AAC/D,QAAM,aAAa,SAAS,KAAK,SAAS,UAAU,IAChD,KAAK,SAAS,aACd,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAErC,SAAO;AAAA,IACL,MAAM,KAAK,SAAS;AAAA,IACpB,GAAI,KAAK,SAAS,cAAc,EAAE,aAAa,KAAK,SAAS,YAAY,IAAI,CAAC;AAAA,IAC9E,cAAc;AAAA,MACZ,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAMO,SAAS,eAAe,OAAoC;AACjE,QAAM,SAAsB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,SAAS;AAE/B,QAAI,KAAK,kBAAkB,cAAc,uBAAuB,IAAI,QAAQ,GAAG;AAC7E,UAAI,aAAa,cAAc;AAC7B,eAAO,KAAK,EAAE,MAAM,uBAAuB,MAAM,aAAa,CAAC;AAAA,MACjE;AAAA,IACF,OAAO;AACL,aAAO,KAAK,cAAc,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,oBACd,QACA,mBACwB;AACxB,QAAM,UAAU,sBAAsB,QAAQ,EAAE,2BAA2B,KAAK,IAAI,CAAC;AAErF,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,MAAI,WAAW,YAAY;AACzB,WAAO,EAAE,MAAM,OAAO,GAAG,QAAQ;AAAA,EACnC;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,UAAU,QAAQ;AACrE,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,QAAQ;AAAA,EACvD;AACA,MAAI,WAAW,UAAU,sBAAsB,OAAO;AACpD,WAAO,EAAE,MAAM,QAAQ,GAAG,QAAQ;AAAA,EACpC;AACA,SAAO;AACT;AASO,SAAS,gBAAgB,YAAqD;AACnF,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,mBAAmB,SAAwC;AACzE,QAAM,YAAsB,CAAC;AAC7B,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,QAAQ;AACzB,gBAAU,KAAK,MAAM,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI;AACrD;AAOO,SAAS,wBAAwB,SAGtC;AACA,MAAI,YAA2B;AAC/B,QAAM,mBAA8C,CAAC;AAErD,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,MAAM,UAAU;AAClB,oBAAY,YAAY,GAAG,SAAS;AAAA,EAAK,MAAM,QAAQ,KAAK,MAAM;AAAA,MACpE;AACA,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,WAAW,MAAM,SAAS,qBAAqB;AAC7C,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,EACrE;AACF;AAKO,SAAS,iBACd,SACoC;AACpC,QAAM,YAAoC,CAAC;AAE3C,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,YAAY;AAC7B,gBAAU,KAAK;AAAA,QACb,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,WAAW,SAAS,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAAS,oBACP,IACA,OACA,eAC4B;AAC5B,QAAM,QAAQ,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAEjF,MAAI,SAA+C;AACnD,MAAI;AAEJ,MAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,cAAU,cACP,OAAO,QAAQ,EACf,OAAO,CAAC,SAAS,KAAK,SAAS,uBAAuB,OAAO,KAAK,QAAQ,QAAQ,EAClF,IAAI,CAAC,UAAU;AAAA,MACd,MAAM;AAAA,MACN,KAAK,KAAK;AAAA,MACV,GAAI,OAAO,KAAK,UAAU,WAAW,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAChE,EAAE;AAAA,EACN,WAAW,SAAS,aAAa,KAAK,cAAc,SAAS,gCAAgC;AAC3F,aAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,QACzB,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAMO,SAAS,2BACd,SAC0C;AAC1C,QAAM,gBAA8C,CAAC;AACrD,QAAM,iBAAiB,oBAAI,IAA8C;AAEzE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,mBAAmB;AACpC,qBAAe,IAAI,MAAM,IAAI,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA,IACvE,WAAW,MAAM,SAAS,0BAA0B;AAClD,YAAM,MAAM,eAAe,IAAI,MAAM,WAAW;AAChD,oBAAc;AAAA,QACZ,oBAAoB,MAAM,aAAa,KAAK,OAAO,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,cAAc,SAAS,IAAI,gBAAgB;AACpD;AAcO,SAAS,eACd,OACA,SACe;AACf,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,cAAc,GAAG,kBAAkB,GAAG,aAAa,GAAG,UAAU,YAAY;AAAA,EACvF;AAEA,QAAM,gBAAgB,MAAM,+BAA+B;AAC3D,QAAM,YAAY,MAAM,2BAA2B;AACnD,QAAM,eAAe,MAAM,eAAe,gBAAgB;AAC1D,QAAM,mBAAmB,MAAM;AAC/B,QAAM,kBAAkB,MAAM,uBAAuB;AACrD,QAAM,OAAO,UACT,4BAA4B,SAAS,oBAAoB,KAAK,CAAC,IAC/D;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,eAAe;AAAA,IAC5B,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC3D,GAAI,YAAY,IAAI,EAAE,cAAc,UAAU,IAAI,CAAC;AAAA,IACnD,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,UAAU;AAAA,EACZ;AACF;AAKO,SAAS,kBAAkB,SAA6C;AAC7E,QAAM,UAAU,mBAAmB,QAAQ,OAAO;AAClD,QAAM,EAAE,WAAW,iBAAiB,IAAI,wBAAwB,QAAQ,OAAO;AAC/E,QAAM,YAAY,iBAAiB,QAAQ,OAAO;AAClD,QAAM,gBAAgB,2BAA2B,QAAQ,OAAO;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,gBAAgB,QAAQ,WAAW;AAAA,IACjD,OAAO,eAAe,QAAQ,OAAO,QAAQ,KAAK;AAAA,IAClD,UAAU;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,UAAU;AAAA,MACV,WAAW,QAAQ;AAAA,MACnB,GAAI,QAAQ,gBAAgB,EAAE,cAAc,QAAQ,cAAc,IAAI,CAAC;AAAA,MACvE,GAAI,QAAQ,OAAO,8BACf,EAAE,0BAA0B,QAAQ,MAAM,4BAA4B,IACtE,CAAC;AAAA,MACL,GAAI,QAAQ,OAAO,0BACf,EAAE,sBAAsB,QAAQ,MAAM,wBAAwB,IAC9D,CAAC;AAAA,MACL,GAAI,QAAQ,OAAO,eAAe,EAAE,aAAa,QAAQ,MAAM,aAAa,IAAI,CAAC;AAAA,MACjF,GAAI,QAAQ,OAAO,kBACf,EAAE,eAAe,EAAE,GAAG,QAAQ,MAAM,gBAAgB,EAAE,IACtD,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAUA,SAAS,wBACP,OACoD;AACpD,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAE7B,QAAM,UACJ,MAAM,YAAY,gBAAgB,MAAM,YAAY,YAChD,MAAM,UACN;AAEN,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,EAAE,MAAM,YAAY,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG;AAAA,EAC7D;AACA,MAAI,MAAM,SAAS,aAAa,OAAO,MAAM,kBAAkB,UAAU;AACvE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,EAAE,MAAM,WAAW;AAAA,EAC5B;AACA,SAAO;AACT;AAMA,SAAS,sBACP,OACA,WACA,gBACe;AACf,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,YAAY;AAC5B,QAAM,SAAS,kBAAkB,KAAK,MAAO,YAAY,KAAK,IAAI,OAAO,GAAG,IAAK,MAAM,IAAI;AAC3F,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,OAAO,CAAC;AACjD;AAYO,SAAS,kBACd,SACA,kBAAiD,0BACjD,mBAA2B,2BACN;AACrB,QAAM,EAAE,mBAAmB,OAAO,IAAI,kBAAkB,QAAQ,QAAQ;AAExE,QAAM,YAAY,QAAQ,mBAAmB;AAE7C,QAAM,SAA8B;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAGA,QAAM,kBAAkB,SAAS,QAAQ,eAAe,IAAI,QAAQ,kBAAkB,CAAC;AACvF,QAAM;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EACL,IAAI;AAEJ,MAAI,aAAa;AAKjB,MAAI,QAAQ,gBAAgB,SAAS,QAAQ;AAC3C,QAAI,QAAQ,eAAe,QAAQ;AACjC,aAAO,gBAAgB;AAAA,QACrB,QAAQ,EAAE,MAAM,eAAe,QAAQ,QAAQ,eAAe,OAAO;AAAA,MACvE;AAAA,IACF,OAAO;AACL,YAAM,kBAAkB;AACxB,mBAAa,aAAa,GAAG,UAAU;AAAA;AAAA,EAAO,eAAe,KAAK;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,YAAY;AACd,WAAO,SAAS,sBAAsB,OAClC,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,eAAe,EAAE,MAAM,YAAY,EAAE,CAAC,IACzE;AAAA,EACN;AAGA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,WAAO,QAAQ,eAAe,QAAQ,KAAK;AAAA,EAC7C;AACA,QAAM,aAAa,oBAAoB,QAAQ,YAAY,QAAQ,iBAAiB;AACpF,MAAI,cAAc,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AACzD,WAAO,cAAc;AAAA,EACvB;AAGA,QAAM,eAAe,gBAAgB,QAAQ,KAAK;AAClD,MAAI,kBAAkB;AAEtB,QAAM,mBAAmB,wBAAwB,gBAAgB;AACjE,MAAI,kBAAkB;AACpB,WAAO,WAAW;AAClB,sBAAkB,iBAAiB,SAAS;AAAA,EAC9C,WAAW,QAAQ,WAAW,UAAU,UAAa,QAAQ,UAAU,QAAQ,GAAG;AAChF,QAAI,iBAAiB,YAAY;AAC/B,aAAO,WAAW;AAAA,QAChB,MAAM;AAAA,QACN,GAAI,QAAQ,UAAU,UAAU,EAAE,SAAS,UAAU,IAAI,CAAC;AAAA,MAC5D;AACA,YAAM,SAAS,kBAAkB,QAAQ,UAAU,OAAO,eAAe;AACzE,UAAI,QAAQ;AACV,eAAO,gBAAgB;AAAA,UACrB,GAAG,OAAO;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA,wBAAkB;AAAA,IACpB,WAAW,iBAAiB,UAAU;AACpC,YAAM,SAAS;AAAA,QACb,QAAQ,UAAU;AAAA,QAClB;AAAA,QACA,QAAQ,UAAU;AAAA,MACpB;AACA,UAAI,WAAW,MAAM;AACnB,eAAO,WAAW;AAAA,UAChB,MAAM;AAAA,UACN,eAAe;AAAA,UACf,GAAI,QAAQ,UAAU,UAAU,EAAE,SAAS,UAAU,IAAI,CAAC;AAAA,QAC5D;AACA,0BAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EAEF;AAKA,MAAI,CAAC,iBAAiB;AACpB,QAAI,QAAQ,gBAAgB,QAAW;AACrC,aAAO,cAAc,QAAQ;AAAA,IAC/B;AACA,QAAI,QAAQ,SAAS,QAAW;AAC9B,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,QAAI,QAAQ,SAAS,QAAW;AAC9B,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,WAAO,iBAAiB,QAAQ;AAAA,EAClC;AAGA,SAAO,OAAO,QAAQ,kBAAkB;AAExC,SAAO;AACT;AA2CO,SAAS,oBAAiC;AAC/C,SAAO;AAAA,IACL,kBAAkB,oBAAI,IAAI;AAAA,IAC1B,iBAAiB,oBAAI,IAAI;AAAA,IACzB,oBAAoB,oBAAI,IAAI;AAAA,IAC5B,oBAAoB,oBAAI,IAAI;AAAA,IAC5B,kBAAkB,CAAC;AAAA,IACnB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAO,EAAE,cAAc,GAAG,kBAAkB,GAAG,aAAa,GAAG,UAAU,YAAY;AAAA,IACrF,SAAS;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,IACP,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,uBAAuB,eAAgD;AAC9E,MAAI;AACF,UAAM,SAAkB,gBAAgB,KAAK,MAAM,aAAa,IAAI,CAAC;AACrE,WAAO,SAAS,MAAM,IAAI,SAAS,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,OAAoB,OAAgC;AAC3E,QAAM,gBAAgB,MAAM,+BAA+B;AAC3D,QAAM,YAAY,MAAM,2BAA2B;AAGnD,MAAI,MAAM,iBAAiB,QAAQ,MAAM,iBAAiB,QAAW;AACnE,UAAM,MAAM,eAAe,MAAM,eAAe,gBAAgB;AAChE,QAAI,YAAY,GAAG;AACjB,YAAM,MAAM,eAAe;AAAA,IAC7B;AACA,UAAM,QAAQ,cAAc,MAAM;AAClC,UAAM,QAAQ,kBAAkB;AAGhC,UAAM,QAAQ,qBAAqB,KAAK;AAAA,MACtC,gBAAgB,MAAM,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,eAAe,MAAM;AACnC,QAAM,MAAM,mBAAmB,MAAM;AACrC,QAAM,iBAAiB,MAAM,uBAAuB;AACpD,MAAI,mBAAmB,QAAW;AAChC,UAAM,MAAM,kBAAkB;AAAA,EAChC;AACA,QAAM,MAAM,cAAc,MAAM,MAAM,eAAe,MAAM,MAAM;AACjE,MAAI,MAAM,iBAAiB;AACzB,UAAM,gBAAgB,EAAE,GAAG,MAAM,gBAAgB;AAAA,EACnD;AACF;AAKO,SAAS,mBACd,OACA,OACuB;AACvB,QAAM,SAAgC,CAAC;AAEvC,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,iBAAiB;AACpB,YAAM,QAAQ,MAAM,QAAQ;AAC5B,YAAM,gBAAgB,MAAM,+BAA+B;AAC3D,YAAM,YAAY,MAAM,2BAA2B;AACnD,YAAM,MAAM,eAAe,MAAM,eAAe,gBAAgB;AAChE,UAAI,YAAY,GAAG;AACjB,cAAM,MAAM,eAAe;AAAA,MAC7B;AACA,YAAM,MAAM,mBAAmB,MAAM;AACrC,YAAM,MAAM,cAAc,MAAM,MAAM,eAAe,MAAM,MAAM;AACjE,YAAM,UAAU,oBAAoB,KAAK;AACzC,YAAM,QAAQ,MAAM,QAAQ;AAC5B,YAAM,YAAY,MAAM,QAAQ;AAChC;AAAA,IACF;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,QAAQ,MAAM;AACpB,UAAI,MAAM,SAAS,YAAY;AAC7B,cAAM,iBAAiB,IAAI,MAAM,OAAO;AAAA,UACtC,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,eAAe;AAAA,QACjB,CAAC;AACD,eAAO,KAAK,EAAE,MAAM,mBAAmB,IAAI,MAAM,IAAI,MAAM,MAAM,KAAK,CAAC;AAAA,MACzE,WAAW,MAAM,SAAS,YAAY;AACpC,cAAM,gBAAgB,IAAI,MAAM,OAAO;AAAA,UACrC,UAAU,MAAM,YAAY;AAAA,UAC5B,WAAW,MAAM,aAAa;AAAA,QAChC,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,qBAAqB;AAC7C,cAAM,iBAAiB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,mBAAmB;AAC3C,cAAM,mBAAmB,IAAI,MAAM,OAAO;AAAA,UACxC,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,WAAW;AAAA,QACb,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,0BAA0B;AAClD,cAAM,MAAM,MAAM,mBAAmB,IAAI,MAAM,WAAW;AAC1D,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,oBAAoB,MAAM,aAAa,KAAK,OAAO,MAAM,OAAO;AAAA,QACxE,CAAC;AACD,cAAM,mBAAmB,OAAO,MAAM,WAAW;AAAA,MACnD;AACA;AAAA,IACF;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,QAAQ,MAAM;AACpB,UAAI,MAAM,SAAS,cAAc;AAC/B,cAAM,aAAa;AACnB,eAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,MAAM,KAAK,CAAC;AAAA,MAC1D,WAAW,MAAM,SAAS,kBAAkB;AAC1C,cAAM,eAAe;AACrB,cAAM,gBAAgB,MAAM,gBAAgB,IAAI,MAAM,KAAK;AAC3D,YAAI,eAAe;AACjB,wBAAc,YAAY,MAAM;AAAA,QAClC;AACA,eAAO,KAAK,EAAE,MAAM,mBAAmB,OAAO,MAAM,SAAS,CAAC;AAAA,MAChE,WAAW,MAAM,SAAS,mBAAmB;AAC3C,cAAM,gBAAgB,MAAM,gBAAgB,IAAI,MAAM,KAAK;AAC3D,YAAI,eAAe;AACjB,wBAAc,aAAa,MAAM;AAAA,QACnC;AAAA,MACF,WAAW,MAAM,SAAS,oBAAoB;AAC5C,cAAM,WAAW,MAAM,iBAAiB,IAAI,MAAM,KAAK;AACvD,YAAI,UAAU;AACZ,mBAAS,iBAAiB,MAAM;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,SAAS;AAAA,YACb,gBAAgB,MAAM;AAAA,UACxB,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,aAAa,MAAM,mBAAmB,IAAI,MAAM,KAAK;AAC3D,cAAI,YAAY;AACd,uBAAW,aAAa,MAAM;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IAEA,KAAK,sBAAsB;AACzB,YAAM,WAAW,MAAM,iBAAiB,IAAI,MAAM,KAAK;AACvD,UAAI,UAAU;AACZ,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,SAAS;AAAA,UACb,WAAW,uBAAuB,SAAS,aAAa;AAAA,QAC1D,CAAC;AACD,cAAM,iBAAiB,OAAO,MAAM,KAAK;AACzC;AAAA,MACF;AAEA,YAAM,gBAAgB,MAAM,gBAAgB,IAAI,MAAM,KAAK;AAC3D,UAAI,eAAe;AACjB,cAAM,iBAAiB,KAAK;AAAA,UAC1B,MAAM;AAAA,UACN,MAAM,cAAc;AAAA,UACpB,MAAM,cAAc;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,gBAAgB,OAAO,MAAM,KAAK;AACxC;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,mBAAmB,IAAI,MAAM,KAAK;AAC3D,UAAI,YAAY;AACd,cAAM,mBAAmB,IAAI,WAAW,IAAI;AAAA,UAC1C,MAAM,WAAW;AAAA,UACjB,OAAO,uBAAuB,WAAW,SAAS;AAAA,QACpD,CAAC;AACD,cAAM,mBAAmB,OAAO,MAAM,KAAK;AAAA,MAC7C;AACA;AAAA,IACF;AAAA,IAEA,KAAK,iBAAiB;AACpB,UAAI,MAAM,MAAM,aAAa;AAC3B,cAAM,eAAe,gBAAgB,MAAM,MAAM,WAAW;AAAA,MAC9D;AACA,sBAAgB,OAAO,MAAM,KAAK;AAClC;AAAA,IACF;AAAA,IAEA,KAAK,gBAAgB;AACnB,UAAI,MAAM,YAAY;AACpB,eAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA,MACtC;AACA,UAAI,MAAM,cAAc;AACtB,eAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAAA,MACxC;AACA,YAAM,OAAO,4BAA4B,MAAM,OAAO,MAAM,OAAO;AACnE,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,cAAc,MAAM;AAAA,QACpB,OAAO,EAAE,GAAG,MAAM,OAAO,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,EAAG;AAAA,QACjE,GAAI,MAAM,iBAAiB,SAAS,IAChC,EAAE,kBAAkB,CAAC,GAAG,MAAM,gBAAgB,EAAE,IAChD,CAAC;AAAA,MACP,CAAC;AACD;AAAA,IACF;AAAA,IAEA;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAKO,SAAS,iBAAiB,OAAe,MAAoC;AAClF,SAAO,EAAE,MAAM,SAAS,OAAO,KAAK;AACtC;AASA,SAAS,aAAa,KAAsB;AAC1C,MAAI,IAAI,WAAW,OAAO,EAAG,QAAO;AAEpC,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,gBAAgB;AACtB,WAAO,cAAc,KAAK,IAAI,UAAU,GAAG,GAAG,CAAC;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAa,YAAoB,IAAY;AACzE,MAAI,IAAI,UAAU,UAAW,QAAO;AAEpC,QAAM,UAAU,IAAI,UAAU,GAAG,SAAS;AAC1C,SAAO,GAAG,OAAO,kBAAkB,IAAI,OAAO,eAAe,CAAC;AAChE;AAKO,SAAS,eAAkB,KAAQ,YAAoB,IAAO;AACnE,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,aAAa,GAAG,GAAG;AACrB,aAAO,qBAAqB,KAAK,SAAS;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,UAAQ,eAAe,MAAM,SAAS,CAAC;AAAA,EACxD;AAEA,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,aAAO,GAAG,IAAI,eAAe,OAAO,SAAS;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC1vCO,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AASvB,SAAS,aAAa,KAAqB;AAChD,QAAM,UAAU,mBAAmB,GAAG,EACnC,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,KAAK;AACtB,SAAO,sBAAsB,OAAO;AACtC;AAEA,SAAS,cAAc,MAAsB;AAC3C,MAAI,KAAK,WAAW,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,SAAO,aAAa,IAAI;AAC1B;AAKO,SAAS,0BAAkC;AAChD,SAAO,cAAc,cAAc;AACrC;;;AFAA,SAAS,aAAa,OAAkD;AACtE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,gBAAgB,SAAsC;AAC7D,MAAI;AACJ,MAAI,aAAa,OAAO,GAAG;AACzB,UAAM,MAAM,QAAQ;AACpB,QAAI,OAAO,QAAQ,YAAY;AAC7B,YAAM,IAAI,KAAK,SAAS,aAAa;AAAA,IACvC,OAAO;AACL,YAAM,QAAQ,aAAa;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAS,SAAS,KAAK,EAAE;AAC/B,WAAO,OAAO,MAAM,MAAM,IAAI,SAAY;AAAA,EAC5C;AACA,SAAO;AACT;AAKA,IAAM,4BAA2D;AAKjE,IAAM,0BAAyD,EAAE,GAAG,MAAM,KAAK,UAAU;AAKzF,IAAM,sBAAqD,EAAE,GAAG,KAAK;AAU9D,IAAM,oBAAN,MAAM,mBAAsC;AAAA,EACxC,OAAO;AAAA,EACP,uBAAuB;AAAA,EAExB,SAA2B;AAAA,EAC3B;AAAA;AAAA,EAGR,OAAe,cAAmD;AAAA,EAClE,OAAe,kBAAkB;AAAA,EACjC,OAAwB,YAAY,IAAI,KAAK;AAAA;AAAA,EAE7C,YAAY,QAA+B;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,YAAgC;AAC5C,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,OAAO,mBAAmB;AAC/D,WAAK,SAAS,IAAI,UAAU;AAAA,QAC1B,QAAQ,KAAK,OAAO;AAAA,QACpB,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK,OAAO;AAAA,MACvB,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,SAA0B;AACtC,WAAO,QAAQ,WAAW,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,UAA2B;AACjC,WAAO,wBAAwB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAwB,qBAAwD;AAAA,IAC9E,kBAAkB;AAAA,MAChB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,qBAAqB;AAAA,MACnB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,qBAAqB;AAAA,MACnB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,oBAAoB;AAAA,MAClB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,qBAAqB;AAAA,MACnB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,qBAAqB;AAAA,MACnB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,oBAAoB;AAAA,MAClB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,kBAAkB;AAAA,MAChB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,yBAAyB,SAA2C;AACjF,QAAI,mBAAkB,mBAAmB,OAAO,GAAG;AACjD,aAAO,EAAE,GAAG,mBAAkB,mBAAmB,OAAO,EAAE;AAAA,IAC5D;AAEA,QAAI,OAA2D;AAC/D,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,mBAAkB,kBAAkB,GAAG;AACjF,UAAI,QAAQ,WAAW,MAAM,MAAM,CAAC,QAAQ,OAAO,SAAS,KAAK,OAAO,SAAS;AAC/E,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB;AAAA,IACF;AACA,WAAO,OAAO,EAAE,GAAG,KAAK,KAAK,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAoB,OAA6D;AAC9F,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI;AACJ,QAAI,KAAK,SAAS,MAAM,SAAS,aAAa,KAAK,OAAO,WAAW;AACnE,wBAAkB;AAAA,IACpB,WAAW,KAAK,SAAS,WAAW;AAClC,wBAAkB;AAAA,IACpB,OAAO;AACL,wBAAkB;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,gBAAgB,KAAK,YAAY;AAAA,MACjC,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB,KAAK,mBAAmB;AAAA,MAC1C,GAAI,MAAM,mBAAmB,EAAE,kBAAkB,MAAM,iBAAiB,IAAI,CAAC;AAAA,MAC7E,GAAI,MAAM,aAAa,EAAE,iBAAiB,MAAM,WAAW,IAAI,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAqB,SAAoD;AAC7E,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,YAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACjD,UAAI,OAAO;AACT,cAAM,OAAO,mBAAkB,oBAAoB,KAAK;AACxD,YAAI,MAAM;AACR,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,aAAa,mBAAkB,yBAAyB,OAAO;AACrE,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAwB,QAAgF;AAAA,IACtG,YAAY,WAAW;AAAA,MACrB,aAAa;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,QACb,OAAO,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,MAC3C,CAAC;AAAA,MACD,SAAS,OAAO,QAAQ,UAAU;AAEhC,eAAO,EAAE,QAAQ,WAAW,QAAQ,uBAAuB;AAAA,MAC7D;AAAA,MACA,eAAe;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,UAA2F;AAClG,WAAO,EAAE,GAAG,mBAAkB,MAAM;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,uBAA8D;AAC1E,UAAM,MAAM,KAAK,IAAI;AAErB,QACE,mBAAkB,eAClB,MAAM,mBAAkB,kBAAkB,mBAAkB,WAC5D;AACA,aAAO,mBAAkB;AAAA,IAC3B;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,SAAuC,CAAC;AAC9C,qBAAiB,SAAS,OAAO,OAAO,KAAK,EAAE,OAAO,IAAI,CAAC,GAAG;AAC5D,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,uBAAkB,cAAc;AAChC,uBAAkB,kBAAkB;AAEpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAAsD;AACnF,UAAM,eACJ,mBAAkB,oBAAoB,KAAK,KAC3C,mBAAkB,yBAAyB,MAAM,EAAE,KACnD;AAEF,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,eAAe,MAAM,oBAAoB,cAAc;AAAA,MACvD,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,MAC7B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,QAA+C;AAC7D,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,qBAAqB;AAElD,UAAI,SAAS,UAAU,IAAI,CAAC,MAAM,KAAK,uBAAuB,CAAC,CAAC;AAEhE,UAAI,QAAQ;AACV,cAAM,cAAc,OAAO,YAAY;AACvC,iBAAS,OAAO;AAAA,UACd,CAAC,MACC,EAAE,GAAG,YAAY,EAAE,SAAS,WAAW,KACvC,EAAE,KAAK,YAAY,EAAE,SAAS,WAAW;AAAA,QAC7C;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,0CAA0C,KAAK;AAC7D,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,oBAAoB,SAAyB;AACnD,UAAM,OAAO,mBAAkB,yBAAyB,OAAO;AAC/D,WAAO,KAAK,IAAI,MAAM,mBAAmB,MAAM,IAAI;AAAA,EACrD;AAAA,EAEA,MAAM,SAAS,SAAqD;AAClE,UAAM,SAAS,MAAM,KAAK,UAAU;AAEpC,QAAI;AACF,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA,KAAK,oBAAoB,QAAQ,KAAK;AAAA,MACxC;AAEA,YAAM,WAAW,MAAM,OAAO,SAAS;AAAA,QACrC,EAAE,GAAG,QAAQ,QAAQ,MAAM;AAAA,QAC3B,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC3B;AAEA,aAAO,kBAAkB,QAAQ;AAAA,IACnC,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAuE;AAClF,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,OAAO;AAEb,QAAI;AACF,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA,KAAK,oBAAoB,QAAQ,KAAK;AAAA,MACxC;AAEA,YAAM,SAAS,MAAM,OAAO,SAAS;AAAA,QACnC,EAAE,GAAG,QAAQ,QAAQ,KAAK;AAAA,QAC1B,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,gBAAM,QAAQ,kBAAkB;AAEhC,cAAI;AACF,6BAAiB,SAAS,QAAQ;AAChC,oBAAM,SAAS,mBAAmB,OAAO,KAAK;AAC9C,yBAAW,SAAS,QAAQ;AAC1B,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,gBAAgB,KAAK,gBAAgB,KAAK;AAChD,kBAAM,iBAAiB,cAAc,SAAS,cAAc,IAAI;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,OAA+B;AACrD,QAAI,iBAAiB,eAAe;AAClC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,aAAa,KAAK,IAAI,QAAQ;AAC7C,UAAM,SACJ,OAAO,QAAQ,WAAW,WACtB,OAAO,SACP,OAAO,QAAQ,eAAe,WAC5B,OAAO,aACP;AACR,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,QAAI,WAAW,KAAK;AAClB,aAAO,IAAI,cAAc,SAAS,cAAc,QAAQ,gBAAgB,QAAQ,OAAO,CAAC;AAAA,IAC1F;AACA,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,aAAO,IAAI,cAAc,SAAS,cAAc,MAAM;AAAA,IACxD;AACA,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,KAAK;AACtD,aAAO,IAAI,cAAc,SAAS,mBAAmB,MAAM;AAAA,IAC7D;AACA,QAAI,WAAW,UAAa,UAAU,KAAK;AAEzC,aAAO,IAAI,cAAc,SAAS,gBAAgB,MAAM;AAAA,IAC1D;AACA,QACG,iBAAiB,SAAS,MAAM,SAAS,gBAC1C,QAAQ,SAAS,aACjB;AACA,aAAO,IAAI,cAAc,SAAS,SAAS;AAAA,IAC7C;AAEA,WAAO,IAAI,cAAc,SAAS,WAAW,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe,SAAqD;AACxE,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA,KAAK,oBAAoB,QAAQ,KAAK;AAAA,IACxC;AAGA,UAAM,OAAgC,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAEvE,WAAO;AAAA,MACL,MAAM,eAAe,IAAI;AAAA,MACzB,cAAc;AAAA,MACd,UAAU;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;AGpmBA,SAAS,KAAAA,UAAS;AAiBX,IAAM,2BAA2BA,GAAE,OAAO;AAAA;AAAA,EAE/C,cAAcA,GAAE,KAAK,CAAC,QAAQ,eAAe,CAAC,EAAE,SAAS;AAAA;AAAA,EAGzD,UAAUA,GAAE,OAAO;AAAA,IACjB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AACvD,CAAC,EAAE,YAAY;;;AClBR,IAAM,YACX,OAAO;AAAA,EACL,CAAC,WAAkC,IAAI,kBAAkB,MAAM;AAAA,EAC/D,EAAE,iBAAiB,yBAAyB;AAC9C;","names":["z"]}
package/dist/pricing.d.ts CHANGED
@@ -13,7 +13,7 @@ import Anthropic from '@anthropic-ai/sdk';
13
13
  *
14
14
  * - uncached input tokens: base input rate
15
15
  * - cache writes: 1.25x input (5-minute TTL) or 2x input (1-hour TTL)
16
- * - cache reads: 0.1x input
16
+ * - cache reads: normally 0.1x input; Fable/Mythos 5.1 use 0.025x
17
17
  *
18
18
  * Thinking tokens are billed as ordinary output tokens (already included in
19
19
  * output_tokens), so no separate reasoning rate applies.
package/dist/pricing.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  calculateAnthropicUsageCost,
3
3
  extractUsageBuckets,
4
4
  getAnthropicModelPricing
5
- } from "./chunk-VSU3CF6K.js";
5
+ } from "./chunk-N6RHANWH.js";
6
6
  export {
7
7
  calculateAnthropicUsageCost,
8
8
  extractUsageBuckets,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standardagents/anthropic",
3
- "version": "0.41.4",
3
+ "version": "0.41.6",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -33,14 +33,14 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@anthropic-ai/sdk": "^0.104.1",
36
- "@standardagents/provider-pricing": "0.41.4",
36
+ "@standardagents/provider-pricing": "0.41.6",
37
37
  "zod": "^4.3.5"
38
38
  },
39
39
  "peerDependencies": {
40
- "@standardagents/spec": "^0.41.4"
40
+ "@standardagents/spec": "^0.41.6"
41
41
  },
42
42
  "devDependencies": {
43
- "@standardagents/spec": "0.41.4",
43
+ "@standardagents/spec": "0.41.6",
44
44
  "tsup": "^8.3.5",
45
45
  "typescript": "^5.9.0"
46
46
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pricing.ts"],"sourcesContent":["/**\n * Known Anthropic model pricing for request cost calculation.\n *\n * The Anthropic Messages API reports token usage (including cache buckets)\n * but no dollar cost, and the Models API exposes no pricing data — so cost\n * is derived here from the raw usage buckets and a maintained price table.\n * This is more accurate than a flat promptTokens * inputPrice calculation\n * because Anthropic bills the prompt in three differently-priced buckets:\n *\n * - uncached input tokens: base input rate\n * - cache writes: 1.25x input (5-minute TTL) or 2x input (1-hour TTL)\n * - cache reads: 0.1x input\n *\n * Thinking tokens are billed as ordinary output tokens (already included in\n * output_tokens), so no separate reasoning rate applies.\n */\n\nimport {\n calculateAnthropicUsageCost,\n getAnthropicModelPricing,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n} from '@standardagents/provider-pricing';\nimport type Anthropic from '@anthropic-ai/sdk';\n\ntype AnthropicUsage = Anthropic.Messages.Usage;\n\n/**\n * Extract billing buckets from an API usage object. When the per-TTL cache\n * creation breakdown is absent, all cache writes are assumed 5-minute TTL\n * (the API default and by far the most common case).\n */\nexport function extractUsageBuckets(usage: AnthropicUsage): AnthropicUsageBuckets {\n const totalCacheWrite = usage.cache_creation_input_tokens ?? 0;\n const write1h = usage.cache_creation?.ephemeral_1h_input_tokens ?? 0;\n const write5m = usage.cache_creation?.ephemeral_5m_input_tokens ?? Math.max(totalCacheWrite - write1h, 0);\n\n return {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cache_read_input_tokens ?? 0,\n cacheWrite5mTokens: write5m,\n cacheWrite1hTokens: write1h,\n };\n}\n\nexport {\n calculateAnthropicUsageCost,\n getAnthropicModelPricing,\n type AnthropicModelPricing,\n type AnthropicUsageBuckets,\n};\n"],"mappings":";AAiBA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAUA,SAAS,oBAAoB,OAA8C;AAChF,QAAM,kBAAkB,MAAM,+BAA+B;AAC7D,QAAM,UAAU,MAAM,gBAAgB,6BAA6B;AACnE,QAAM,UAAU,MAAM,gBAAgB,6BAA6B,KAAK,IAAI,kBAAkB,SAAS,CAAC;AAExG,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM,2BAA2B;AAAA,IAClD,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AACF;","names":[]}