@tanstack/ai-anthropic 0.16.4 → 0.16.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/dist/esm/adapters/text.js +1 -0
- package/dist/esm/adapters/text.js.map +1 -1
- package/dist/esm/model-meta.d.ts +56 -12
- package/dist/esm/model-meta.js +47 -1
- package/dist/esm/model-meta.js.map +1 -1
- package/dist/esm/text/text-provider-options.d.ts +16 -1
- package/dist/esm/text/text-provider-options.js.map +1 -1
- package/dist/esm/tools/code-execution-tool.js +5 -4
- package/dist/esm/tools/code-execution-tool.js.map +1 -1
- package/package.json +5 -5
- package/src/adapters/text.ts +1 -0
- package/src/model-meta.ts +123 -20
- package/src/text/text-provider-options.ts +18 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","names":[],"sources":["../../../src/adapters/text.ts"],"sourcesContent":["import { EventType, normalizeSystemPrompts } from '@tanstack/ai'\nimport { toRunErrorRawEvent } from '@tanstack/ai/adapter-internals'\nimport { BaseTextAdapter } from '@tanstack/ai/adapters'\nimport { convertToolsToProviderFormat } from '../tools/tool-converter'\nimport {\n readCodeExecutionConfig,\n readCodeExecutionSkills,\n} from '../tools/code-execution-tool'\nimport { validateTextProviderOptions } from '../text/text-provider-options'\nimport { buildAnthropicUsage } from '../usage'\nimport {\n createAnthropicClient,\n generateId,\n getAnthropicApiKeyFromEnv,\n} from '../utils/client'\nimport {\n ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS,\n getAnthropicDefaultMaxTokens,\n} from '../model-meta'\nimport type {\n ANTHROPIC_MODELS,\n AnthropicChatModelProviderOptionsByName,\n AnthropicChatModelToolCapabilitiesByName,\n AnthropicModelInputModalitiesByName,\n} from '../model-meta'\nimport type {\n StructuredOutputOptions,\n StructuredOutputResult,\n} from '@tanstack/ai/adapters'\nimport type { InternalLogger } from '@tanstack/ai/adapter-internals'\nimport type {\n Base64ImageSource,\n Base64PDFSource,\n ContentBlockParam,\n DocumentBlockParam,\n ImageBlockParam,\n ServerToolUseBlockParam,\n TextBlockParam,\n ThinkingBlockParam,\n ToolUseBlockParam,\n URLImageSource,\n URLPDFSource,\n WebFetchToolResultBlockParam,\n WebSearchToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type Anthropic_SDK from '@anthropic-ai/sdk'\nimport type { AnthropicBeta } from '@anthropic-ai/sdk/resources/beta/beta'\nimport type {\n AnyTool,\n ContentPart,\n Modality,\n ModelMessage,\n StreamChunk,\n TextOptions,\n} from '@tanstack/ai'\nimport type {\n AnthropicSystemPromptMetadata,\n ExternalTextProviderOptions,\n InternalTextProviderOptions,\n} from '../text/text-provider-options'\nimport type {\n AnthropicDocumentMetadata,\n AnthropicImageMetadata,\n AnthropicMessageMetadataByModality,\n AnthropicTextMetadata,\n} from '../message-types'\nimport type { AnthropicClientConfig } from '../utils/client'\n\n/**\n * The block type carried by an Anthropic provider-executed (server) tool's\n * stored result. Mirrors the `*_tool_result` block emitted by the streaming\n * API so it can be replayed verbatim into a later turn.\n */\ntype AnthropicServerToolResultBlockType =\n | 'web_search_tool_result'\n | 'web_fetch_tool_result'\n\n/**\n * Anthropic payload stashed on a provider-executed tool call's `metadata`\n * (under the `anthropic` key, alongside `providerExecuted: true`). Holds enough\n * to reconstruct the original `server_tool_use` + `*_tool_result` blocks so the\n * model still sees prior `web_search` / `web_fetch` evidence on the next turn.\n */\ninterface AnthropicServerToolMetadata {\n serverToolType: ServerToolUseBlockParam['name']\n resultBlockType: AnthropicServerToolResultBlockType\n /** Raw result block content, preserved verbatim from the stream. */\n result: unknown\n}\n\n/**\n * Narrow an opaque tool-call `metadata` to {@link AnthropicServerToolMetadata}\n * when it follows the provider-executed convention, else `null`.\n */\nfunction readAnthropicServerToolMetadata(\n metadata: unknown,\n): AnthropicServerToolMetadata | null {\n if (typeof metadata !== 'object' || metadata === null) return null\n const outer = metadata as { providerExecuted?: unknown; anthropic?: unknown }\n if (outer.providerExecuted !== true) return null\n const inner = outer.anthropic\n if (typeof inner !== 'object' || inner === null) return null\n const { serverToolType, resultBlockType, result } = inner as {\n serverToolType?: unknown\n resultBlockType?: unknown\n result?: unknown\n }\n if (\n typeof serverToolType !== 'string' ||\n (resultBlockType !== 'web_search_tool_result' &&\n resultBlockType !== 'web_fetch_tool_result')\n ) {\n return null\n }\n return {\n // Validated as a string above; widen back to the SDK's tool-name union.\n serverToolType: serverToolType as ServerToolUseBlockParam['name'],\n resultBlockType,\n result,\n }\n}\n\n/**\n * Reconstruct the `*_tool_result` block param from stored server-tool metadata.\n * The `result` content is opaque round-trip data, asserted to the SDK's param\n * content type at this single boundary.\n */\nfunction buildServerToolResultBlock(\n toolUseId: string,\n meta: AnthropicServerToolMetadata,\n): WebSearchToolResultBlockParam | WebFetchToolResultBlockParam {\n if (meta.resultBlockType === 'web_search_tool_result') {\n return {\n type: 'web_search_tool_result',\n tool_use_id: toolUseId,\n content: meta.result as WebSearchToolResultBlockParam['content'],\n }\n }\n return {\n type: 'web_fetch_tool_result',\n tool_use_id: toolUseId,\n content: meta.result as WebFetchToolResultBlockParam['content'],\n }\n}\n\n/**\n * Computes the `betas` array for a Messages request. Unions:\n * - `interleaved-thinking-2025-05-14` when interleaved thinking is enabled,\n * - `code-execution-2025-08-25` when a `code_execution` tool is present,\n * - `skills-2025-10-02` when that tool carries skills.\n * Returns `undefined` when none apply (so the call site omits `betas`).\n */\nexport function computeAnthropicBetas(\n tools: Array<AnyTool> | undefined,\n modelOptions:\n | {\n thinking?: {\n type?: 'enabled' | 'disabled' | 'adaptive'\n budget_tokens?: number\n }\n }\n | undefined,\n): Array<AnthropicBeta> | undefined {\n const betas = new Set<AnthropicBeta>()\n\n const useInterleavedThinking =\n modelOptions?.thinking?.type === 'enabled' &&\n typeof modelOptions.thinking.budget_tokens === 'number' &&\n modelOptions.thinking.budget_tokens > 0\n if (useInterleavedThinking) betas.add('interleaved-thinking-2025-05-14')\n\n // Code-execution beta is version-aware: select from the FIRST code_execution\n // tool's config type.\n const codeExecTool = tools?.find((t) => t.name === 'code_execution')\n if (codeExecTool) {\n const cfgType = readCodeExecutionConfig(codeExecTool)?.type\n // Each code_execution tool version pairs with a specific beta. Known\n // legacy variant maps explicitly; current/future variants (e.g.\n // `code_execution_20250825` and later) use the latest `-08-25` beta.\n betas.add(\n cfgType === 'code_execution_20250522'\n ? 'code-execution-2025-05-22'\n : 'code-execution-2025-08-25',\n )\n }\n\n // Skills beta: scan ALL code_execution tools so this AGREES with the\n // container-lift, which lifts skills from any code_execution tool that\n // carries them (not just the first).\n const hasSkills = tools?.some(\n (t) =>\n t.name === 'code_execution' &&\n (readCodeExecutionSkills(t)?.length ?? 0) > 0,\n )\n if (hasSkills) betas.add('skills-2025-10-02')\n\n return betas.size > 0 ? Array.from(betas) : undefined\n}\n\n/**\n * Configuration for Anthropic text adapter\n */\nexport interface AnthropicTextConfig extends AnthropicClientConfig {}\n\n/**\n * Anthropic-specific provider options for text/chat\n */\nexport type AnthropicTextProviderOptions = ExternalTextProviderOptions\n\n// ===========================\n// Type Resolution Helpers\n// ===========================\n\n/**\n * Resolve provider options for a specific model.\n * If the model has explicit options in the map, use those; otherwise use base options.\n */\ntype ResolveProviderOptions<TModel extends string> =\n TModel extends keyof AnthropicChatModelProviderOptionsByName\n ? AnthropicChatModelProviderOptionsByName[TModel]\n : AnthropicTextProviderOptions\n\n/**\n * Resolve input modalities for a specific model.\n * If the model has explicit modalities in the map, use those; otherwise use default.\n */\ntype ResolveInputModalities<TModel extends string> =\n TModel extends keyof AnthropicModelInputModalitiesByName\n ? AnthropicModelInputModalitiesByName[TModel]\n : readonly ['text', 'image', 'document']\n\ntype ResolveToolCapabilities<TModel extends string> =\n TModel extends keyof AnthropicChatModelToolCapabilitiesByName\n ? NonNullable<AnthropicChatModelToolCapabilitiesByName[TModel]>\n : readonly []\n\n// ===========================\n// Adapter Implementation\n// ===========================\n\n/**\n * Anthropic Text (Chat) Adapter\n *\n * Tree-shakeable adapter for Anthropic chat/text completion functionality.\n * Import only what you need for smaller bundle sizes.\n */\nexport class AnthropicTextAdapter<\n TModel extends (typeof ANTHROPIC_MODELS)[number],\n TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>,\n TInputModalities extends ReadonlyArray<Modality> =\n ResolveInputModalities<TModel>,\n TToolCapabilities extends ReadonlyArray<string> =\n ResolveToolCapabilities<TModel>,\n> extends BaseTextAdapter<\n TModel,\n TProviderOptions,\n TInputModalities,\n AnthropicMessageMetadataByModality,\n TToolCapabilities,\n // TToolCallMetadata — anthropic has no tool-call metadata round-tripping\n unknown,\n // TSystemPromptMetadata — narrows `systemPrompts[i].metadata` at the\n // chat() call site so users get `cache_control` autocomplete.\n AnthropicSystemPromptMetadata\n> {\n override readonly kind = 'text' as const\n readonly name = 'anthropic' as const\n\n private readonly client: Anthropic_SDK\n\n constructor(config: AnthropicTextConfig, model: TModel) {\n super({}, model)\n this.client = createAnthropicClient(config)\n }\n\n async *chatStream(\n options: TextOptions<TProviderOptions>,\n ): AsyncIterable<StreamChunk> {\n const { logger } = options\n try {\n const requestParams = this.mapCommonOptionsToAnthropic(options)\n\n logger.request(\n `activity=chat provider=anthropic model=${this.model} messages=${options.messages.length} tools=${options.tools?.length ?? 0} stream=true`,\n { provider: 'anthropic', model: this.model },\n )\n\n // `betas` is attached at the call site rather than in the shared mapper\n // because the beta set depends on both the tools and the modelOptions.\n const betas = computeAnthropicBetas(options.tools, options.modelOptions)\n\n // `client.beta.messages` is Anthropic's permanent staging surface, not a\n // sunset path: it's a superset of `client.messages` that additionally\n // accepts the `betas: AnthropicBeta[]` header (e.g. interleaved\n // thinking) plus richer `container` (skills) and `context_management`\n // shapes that `InternalTextProviderOptions` carries. We route every\n // Messages call through it so the request mapper stays single-shape.\n const stream = await this.client.beta.messages.create(\n {\n ...requestParams,\n stream: true,\n ...(betas && { betas }),\n },\n {\n signal: options.request?.signal,\n headers: options.request?.headers,\n },\n )\n\n yield* this.processAnthropicStream(\n stream,\n options,\n () => generateId(this.name),\n logger,\n )\n } catch (error: unknown) {\n const err = error as Error & { status?: number; code?: string }\n const rawEvent = toRunErrorRawEvent(error)\n logger.errors('anthropic.chatStream fatal', {\n error,\n source: 'anthropic.chatStream',\n })\n yield {\n type: EventType.RUN_ERROR,\n model: options.model,\n timestamp: Date.now(),\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n // Forward the Anthropic SDK error's `.error` response body (e.g.\n // `{ type, message }`) when present; never the raw exception object.\n ...(rawEvent !== undefined && { rawEvent }),\n error: {\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n },\n }\n }\n }\n\n /**\n * Generate structured output using Anthropic's tool-based approach.\n * Anthropic doesn't have native structured output, so we use a tool with the schema\n * and force the model to call it.\n * The outputSchema is already JSON Schema (converted in the ai layer).\n */\n async structuredOutput(\n options: StructuredOutputOptions<TProviderOptions>,\n ): Promise<StructuredOutputResult<unknown>> {\n const { chatOptions, outputSchema } = options\n const { logger } = chatOptions\n\n // `structuredOutput()` issues a non-streaming `messages.create({ stream:\n // false })` below, so the defaulted `max_tokens` must stay under the SDK's\n // non-streaming 10-minute guard (issue #849) — pass `stream: false`.\n const requestParams = this.mapCommonOptionsToAnthropic(chatOptions, {\n stream: false,\n })\n\n // Create a tool that will capture the structured output\n // Anthropic's SDK requires input_schema with type: 'object' literal\n const structuredOutputTool = {\n name: 'structured_output',\n description:\n 'Use this tool to provide your response in the required structured format.',\n input_schema: {\n type: 'object' as const,\n properties: outputSchema.properties ?? {},\n required: outputSchema.required ?? [],\n },\n }\n\n try {\n logger.request(\n `activity=chat provider=anthropic model=${this.model} messages=${chatOptions.messages.length} tools=${chatOptions.tools?.length ?? 0} stream=false`,\n { provider: 'anthropic', model: this.model },\n )\n const betas = computeAnthropicBetas(\n chatOptions.tools,\n chatOptions.modelOptions,\n )\n // Make non-streaming request with tool_choice forced to our structured output tool\n const response = await this.client.beta.messages.create(\n {\n ...requestParams,\n stream: false,\n tools: [structuredOutputTool],\n tool_choice: { type: 'tool', name: 'structured_output' },\n ...(betas && { betas }),\n },\n {\n signal: chatOptions.request?.signal,\n headers: chatOptions.request?.headers,\n },\n )\n\n // Extract the tool use content from the response\n let parsed: unknown = null\n let rawText = ''\n\n for (const block of response.content) {\n if (block.type === 'tool_use' && block.name === 'structured_output') {\n parsed = block.input\n rawText = JSON.stringify(block.input)\n break\n }\n }\n\n if (parsed === null) {\n // Fallback: try to extract text content and parse as JSON\n rawText = response.content\n .map((b) => {\n if (b.type === 'text') {\n return b.text\n }\n return ''\n })\n .join('')\n try {\n parsed = JSON.parse(rawText)\n } catch {\n throw new Error(\n `Failed to extract structured output from response. Content: ${rawText.slice(0, 200)}${rawText.length > 200 ? '...' : ''}`,\n )\n }\n }\n\n return {\n data: parsed,\n rawText,\n usage: buildAnthropicUsage(response.usage),\n }\n } catch (error: unknown) {\n const err = error as Error\n logger.errors('anthropic.structuredOutput fatal', {\n error,\n source: 'anthropic.structuredOutput',\n })\n throw new Error(\n `Structured output generation failed: ${err.message || 'Unknown error occurred'}`,\n )\n }\n }\n\n private mapCommonOptionsToAnthropic(\n options: TextOptions<AnthropicTextProviderOptions>,\n { stream = true }: { stream?: boolean } = {},\n ) {\n const modelOptions = options.modelOptions\n\n const formattedMessages = this.formatMessages(options.messages)\n const tools = options.tools\n ? convertToolsToProviderFormat(options.tools)\n : undefined\n\n const validProviderOptions: Partial<InternalTextProviderOptions> = {}\n if (modelOptions) {\n const validKeys: Array<keyof AnthropicTextProviderOptions> = [\n 'container',\n 'context_management',\n 'effort',\n 'mcp_servers',\n 'output_config',\n 'service_tier',\n 'stop_sequences',\n 'thinking',\n 'tool_choice',\n 'top_k',\n 'temperature',\n 'top_p',\n ]\n // `max_tokens` is a legitimate public modelOptions field, but it is read\n // via a dedicated path (defaultMaxTokens below) rather than copied into\n // validProviderOptions. Exempt it from the dropped-key warning here so a\n // correct `modelOptions: { max_tokens }` call doesn't log a spurious\n // \"dropped unknown key\" error, while keeping it out of the copy loop.\n const droppedKeyExemptSet = new Set<string>([...validKeys, 'max_tokens'])\n const droppedKeys = Object.keys(modelOptions).filter(\n (key) => !droppedKeyExemptSet.has(key),\n )\n if (droppedKeys.length > 0) {\n // Reachable when callers cast around the public type (e.g.\n // `modelOptions: { system: ... } as any`). Without this warning the\n // unknown keys are silently dropped — `system` in particular was a\n // previously-tested path for attaching `cache_control` and we don't\n // want that to fail in production with no signal.\n options.logger.errors(\n `anthropic.mapCommonOptionsToAnthropic dropped unknown modelOptions key(s): ${droppedKeys.join(', ')}`,\n {\n source: 'anthropic.mapCommonOptionsToAnthropic',\n droppedKeys,\n hint: droppedKeys.includes('system')\n ? 'pass system prompts via the top-level `systemPrompts` option; `modelOptions.system` is no longer honored'\n : undefined,\n },\n )\n }\n for (const key of validKeys) {\n if (key in modelOptions) {\n const value = modelOptions[key]\n if (key === 'tool_choice' && typeof value === 'string') {\n ;(validProviderOptions as Record<string, unknown>)[key] = {\n type: value,\n }\n } else {\n ;(validProviderOptions as Record<string, unknown>)[key] = value\n }\n }\n }\n }\n\n const thinkingBudget =\n validProviderOptions.thinking?.type === 'enabled'\n ? validProviderOptions.thinking.budget_tokens\n : undefined\n // Anthropic's Messages API *requires* `max_tokens`, so we must always send a\n // value. When the caller doesn't specify one, default to the resolved\n // model's real output ceiling (from model-meta) rather than a low constant\n // that silently truncates long responses with `stop_reason: \"max_tokens\"`\n // (issue #849). `max_tokens` is a ceiling, not a reservation — billing is on\n // tokens actually generated, so a higher default costs nothing extra.\n // For non-streaming requests (the `structuredOutput()` path) the default is\n // clamped to the SDK's non-streaming-safe limit so it doesn't trip the\n // \"streaming required\" 10-minute guard — see getAnthropicDefaultMaxTokens.\n const defaultMaxTokens =\n modelOptions?.max_tokens ??\n getAnthropicDefaultMaxTokens(this.model, { stream })\n const maxTokens =\n thinkingBudget && thinkingBudget >= defaultMaxTokens\n ? thinkingBudget + 1\n : defaultMaxTokens\n\n // `InternalTextProviderOptions.system` is typed\n // `string | Array<TextBlockParam>` (no `| undefined`), so build it\n // outside the literal and spread it conditionally rather than\n // assigning `undefined` under exactOptionalPropertyTypes.\n const systemBlocks = ((): Array<TextBlockParam> | undefined => {\n const normalized = normalizeSystemPrompts<AnthropicSystemPromptMetadata>(\n options.systemPrompts,\n )\n if (normalized.length === 0) return undefined\n return normalized.map(\n (p): TextBlockParam => ({\n type: 'text',\n text: p.content,\n ...(p.metadata?.cache_control && {\n cache_control: p.metadata.cache_control,\n }),\n }),\n )\n })()\n // Wire engine-threaded outputSchema into Messages `output_config.format`\n // alongside any `tools` so the model emits tool calls during the agent\n // loop and a single schema-constrained JSON message on its final turn.\n // Merge into any existing `output_config` so callers can keep tuning\n // `output_config.effort` alongside the schema.\n const combinedSchema = options.outputSchema as\n | Record<string, unknown>\n | undefined\n const outputConfig = combinedSchema\n ? {\n output_config: {\n ...(validProviderOptions.output_config ?? {}),\n format: {\n type: 'json_schema' as const,\n schema: combinedSchema,\n },\n },\n }\n : undefined\n\n // Lift skills attached to a `code_execution` tool into the top-level\n // `container.skills` request param (Anthropic's required shape). Preserve any\n // `container.id` supplied via modelOptions for container reuse. This is the\n // canonical path for skills; `modelOptions.container.skills` is deprecated.\n const toolSkills = options.tools\n ?.map((tool) =>\n tool.name === 'code_execution'\n ? readCodeExecutionSkills(tool)\n : undefined,\n )\n .find((skills) => skills && skills.length > 0)\n\n if (toolSkills && toolSkills.length > 0) {\n const existingContainer = validProviderOptions.container ?? undefined\n validProviderOptions.container = {\n id: existingContainer?.id ?? null,\n skills: toolSkills,\n }\n }\n\n // `temperature`/`top_p` arrive via `...validProviderOptions` (sourced from\n // `modelOptions`). `InternalTextProviderOptions` declares `system` and\n // `tools` as `T?: ...` (no `| undefined`), so spread them conditionally\n // rather than passing explicit `undefined` under exactOptionalPropertyTypes.\n const requestParams: InternalTextProviderOptions = {\n model: options.model,\n max_tokens: maxTokens,\n messages: formattedMessages,\n ...(systemBlocks !== undefined && { system: systemBlocks }),\n ...(tools !== undefined && { tools }),\n ...validProviderOptions,\n ...(outputConfig ?? {}),\n }\n validateTextProviderOptions(requestParams)\n return requestParams\n }\n\n /**\n * Anthropic supports `output_config.format` + `tools` in a single streaming\n * Messages request only for Claude 4.5+ (GA 2026-01-29). For 4.4 and\n * earlier we keep the forced-tool-use workaround in\n * {@link structuredOutput} via the engine's finalization path.\n */\n supportsCombinedToolsAndSchema(): boolean {\n return ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS.has(this.model)\n }\n\n private convertContentPartToAnthropic(\n part: ContentPart,\n ): TextBlockParam | ImageBlockParam | DocumentBlockParam {\n switch (part.type) {\n case 'text': {\n const metadata = part.metadata as AnthropicTextMetadata | undefined\n return {\n type: 'text',\n text: part.content,\n ...metadata,\n }\n }\n\n case 'image': {\n const metadata = part.metadata as AnthropicImageMetadata | undefined\n const imageSource: Base64ImageSource | URLImageSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: part.source.mimeType as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n }\n : {\n type: 'url',\n url: part.source.value,\n }\n return {\n type: 'image',\n source: imageSource,\n ...metadata,\n }\n }\n case 'document': {\n const metadata = part.metadata as AnthropicDocumentMetadata | undefined\n const docSource: Base64PDFSource | URLPDFSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: part.source.mimeType as 'application/pdf',\n }\n : {\n type: 'url',\n url: part.source.value,\n }\n return {\n type: 'document',\n source: docSource,\n ...metadata,\n }\n }\n case 'audio':\n case 'video':\n throw new Error(\n `Anthropic does not support ${part.type} content directly`,\n )\n default: {\n const _exhaustiveCheck: never = part\n throw new Error(\n `Unsupported content part type: ${(_exhaustiveCheck as ContentPart).type}`,\n )\n }\n }\n }\n\n private formatMessages(\n messages: Array<ModelMessage>,\n ): InternalTextProviderOptions['messages'] {\n const formattedMessages: InternalTextProviderOptions['messages'] = []\n\n for (const message of messages) {\n const role = message.role\n\n if (role === 'tool' && message.toolCallId) {\n const toolContent = message.content\n formattedMessages.push({\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: Array.isArray(toolContent)\n ? toolContent.map((part) =>\n this.convertContentPartToAnthropic(part),\n )\n : typeof toolContent === 'string'\n ? toolContent\n : '',\n },\n ],\n })\n continue\n }\n\n if (role === 'assistant' && message.toolCalls?.length) {\n const contentBlocks: Array<ContentBlockParam> = []\n\n this.appendThinkingBlocks(contentBlocks, message.thinking)\n\n if (message.content) {\n const content =\n typeof message.content === 'string' ? message.content : ''\n const textBlock: TextBlockParam = {\n type: 'text',\n text: content,\n }\n contentBlocks.push(textBlock)\n }\n\n for (const toolCall of message.toolCalls) {\n let parsedInput: unknown = {}\n try {\n const parsed = toolCall.function.arguments\n ? JSON.parse(toolCall.function.arguments)\n : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = toolCall.function.arguments\n }\n\n // Provider-executed server tools (e.g. web_search) replay as the\n // original `server_tool_use` + result blocks so the model still sees\n // the prior evidence. Their result was captured verbatim during\n // streaming (see processAnthropicStream).\n const serverMeta = readAnthropicServerToolMetadata(toolCall.metadata)\n if (serverMeta) {\n const serverToolUseBlock: ServerToolUseBlockParam = {\n type: 'server_tool_use',\n id: toolCall.id,\n name: serverMeta.serverToolType,\n input: parsedInput,\n }\n contentBlocks.push(serverToolUseBlock)\n contentBlocks.push(\n buildServerToolResultBlock(toolCall.id, serverMeta),\n )\n continue\n }\n\n const toolUseBlock: ToolUseBlockParam = {\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: parsedInput,\n }\n contentBlocks.push(toolUseBlock)\n }\n\n formattedMessages.push({\n role: 'assistant',\n content: contentBlocks,\n })\n\n continue\n }\n\n if (role === 'assistant') {\n const contentBlocks: Array<ContentBlockParam> = []\n this.appendThinkingBlocks(contentBlocks, message.thinking)\n\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n contentBlocks.push(this.convertContentPartToAnthropic(part))\n }\n } else if (message.content) {\n contentBlocks.push({\n type: 'text',\n text: message.content,\n })\n }\n\n formattedMessages.push({\n role: 'assistant',\n content: contentBlocks.length > 0 ? contentBlocks : '',\n })\n continue\n }\n\n if (role === 'user' && Array.isArray(message.content)) {\n const contentBlocks = message.content.map((part) =>\n this.convertContentPartToAnthropic(part),\n )\n formattedMessages.push({\n role: 'user',\n content: contentBlocks,\n })\n continue\n }\n\n formattedMessages.push({\n role: 'user',\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content\n ? message.content.map((c) =>\n this.convertContentPartToAnthropic(c),\n )\n : '',\n })\n }\n\n // Post-process: Anthropic requires strictly alternating user/assistant roles.\n // Tool results are sent as role:'user' messages, which can create consecutive\n // user messages when followed by a new user message. Merge them.\n return this.mergeConsecutiveSameRoleMessages(formattedMessages)\n }\n\n private appendThinkingBlocks(\n contentBlocks: Array<ContentBlockParam>,\n thinkingParts: ModelMessage['thinking'],\n ): void {\n if (!thinkingParts?.length) return\n\n for (const thinking of thinkingParts) {\n if (!thinking.signature) continue\n const block: ThinkingBlockParam = {\n type: 'thinking',\n thinking: thinking.content,\n signature: thinking.signature,\n }\n contentBlocks.push(block)\n }\n }\n\n /**\n * Merge consecutive messages of the same role into a single message.\n * Anthropic's API requires strictly alternating user/assistant roles.\n * Tool results are wrapped as role:'user' messages, which can collide\n * with actual user messages in multi-turn conversations.\n *\n * Also filters out empty assistant messages (e.g., from a previous failed request).\n */\n private mergeConsecutiveSameRoleMessages(\n messages: InternalTextProviderOptions['messages'],\n ): InternalTextProviderOptions['messages'] {\n const merged: InternalTextProviderOptions['messages'] = []\n\n for (const msg of messages) {\n // Skip empty assistant messages (no content or empty string)\n if (msg.role === 'assistant') {\n const hasContent = Array.isArray(msg.content)\n ? msg.content.length > 0\n : typeof msg.content === 'string' && msg.content.length > 0\n if (!hasContent) {\n continue\n }\n }\n\n const prev = merged[merged.length - 1]\n if (prev && prev.role === msg.role) {\n // Normalize both contents to arrays and concatenate\n const prevBlocks = Array.isArray(prev.content)\n ? prev.content\n : typeof prev.content === 'string' && prev.content\n ? [{ type: 'text' as const, text: prev.content }]\n : []\n const msgBlocks = Array.isArray(msg.content)\n ? msg.content\n : typeof msg.content === 'string' && msg.content\n ? [{ type: 'text' as const, text: msg.content }]\n : []\n prev.content = [...prevBlocks, ...msgBlocks]\n } else {\n merged.push({ ...msg })\n }\n }\n\n // De-duplicate tool_result blocks with the same tool_use_id.\n // This can happen when the core layer generates tool results from both\n // the tool-result part and the tool-call part's output field.\n for (const msg of merged) {\n if (Array.isArray(msg.content)) {\n const seenToolResultIds = new Set<string>()\n msg.content = msg.content.filter((block: any) => {\n if (block.type === 'tool_result' && block.tool_use_id) {\n if (seenToolResultIds.has(block.tool_use_id)) {\n return false // Remove duplicate\n }\n seenToolResultIds.add(block.tool_use_id)\n }\n return true\n })\n }\n }\n\n return merged\n }\n\n private async *processAnthropicStream(\n stream: AsyncIterable<Anthropic_SDK.Beta.BetaRawMessageStreamEvent>,\n options: TextOptions<AnthropicTextProviderOptions>,\n genId: () => string,\n logger: InternalLogger,\n ): AsyncIterable<StreamChunk> {\n const model = options.model\n let accumulatedContent = ''\n let accumulatedThinking = ''\n let accumulatedSignature = ''\n const toolCallsMap = new Map<\n number,\n { id: string; name: string; input: string; started: boolean }\n >()\n let currentToolIndex = -1\n // Server-side tools share the `input_json_delta` wire format with client\n // `tool_use` blocks; routing both to the same buffer corrupts client tool\n // input.\n let currentServerTool: { id: string; name: string; input: string } | null =\n null\n // Completed server tools awaiting their matching result block. Anthropic\n // emits `server_tool_use` then a separate `*_tool_result` block; we hold\n // the call here (keyed by id) until the result arrives so we can emit a\n // single provider-executed tool call carrying the raw result for round-trip.\n const completedServerTools = new Map<\n string,\n { id: string; name: string; input: string }\n >()\n\n // AG-UI lifecycle tracking\n const runId = options.runId ?? genId()\n const threadId = options.threadId ?? genId()\n const messageId = genId()\n let stepId: string | null = null\n let reasoningMessageId: string | null = null\n let hasClosedReasoning = false\n let hasEmittedRunStarted = false\n let hasEmittedTextMessageStart = false\n let hasEmittedRunFinished = false\n // Track current content block type for proper content_block_stop handling\n let currentBlockType: string | null = null\n\n try {\n for await (const event of stream) {\n logger.provider(`provider=anthropic type=${event.type}`, {\n chunk: event,\n })\n // Emit RUN_STARTED on first event\n if (!hasEmittedRunStarted) {\n hasEmittedRunStarted = true\n yield {\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n parentRunId: options.parentRunId,\n }\n }\n\n if (event.type === 'content_block_start') {\n currentBlockType = event.content_block.type\n if (event.content_block.type === 'tool_use') {\n currentToolIndex++\n toolCallsMap.set(currentToolIndex, {\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n started: false,\n })\n } else if (event.content_block.type === 'server_tool_use') {\n currentServerTool = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n }\n } else if (\n event.content_block.type === 'web_fetch_tool_result' ||\n event.content_block.type === 'web_search_tool_result'\n ) {\n // The result content arrives in full at content_block_start (no\n // deltas). Surface error variants so a failed fetch/search isn't\n // invisible to the consumer.\n const content = event.content_block.content as\n | { type?: string; error_code?: string }\n | Array<unknown>\n const errorBlock =\n !Array.isArray(content) &&\n (content.type === 'web_fetch_tool_result_error' ||\n content.type === 'web_search_tool_result_error')\n ? content\n : null\n if (errorBlock) {\n logger.errors(\n `anthropic.${event.content_block.type} error_code=${errorBlock.error_code}`,\n {\n toolUseId: event.content_block.tool_use_id,\n blockType: event.content_block.type,\n errorCode: errorBlock.error_code,\n source: 'anthropic.processAnthropicStream',\n },\n )\n }\n\n // Emit the server tool as a single provider-executed tool call,\n // carrying its raw result so the evidence (e.g. web_search sources)\n // round-trips into the next turn's request. The agent loop skips\n // provider-executed calls, so this never triggers client execution.\n const serverTool = completedServerTools.get(\n event.content_block.tool_use_id,\n )\n if (serverTool) {\n completedServerTools.delete(serverTool.id)\n\n let parsedInput: unknown = {}\n try {\n const parsed = serverTool.input\n ? JSON.parse(serverTool.input)\n : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = {}\n }\n\n const serverToolMetadata = {\n providerExecuted: true,\n anthropic: {\n serverToolType: serverTool.name,\n resultBlockType: event.content_block.type,\n result: content,\n },\n }\n\n currentToolIndex++\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: serverTool.id,\n toolCallName: serverTool.name,\n toolName: serverTool.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n metadata: serverToolMetadata,\n }\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: serverTool.id,\n toolCallName: serverTool.name,\n toolName: serverTool.name,\n model,\n timestamp: Date.now(),\n input: parsedInput,\n }\n\n // Text after the server tool starts a fresh message segment.\n hasEmittedTextMessageStart = false\n }\n } else if (event.content_block.type === 'thinking') {\n accumulatedThinking = ''\n accumulatedSignature = ''\n // Emit REASONING and STEP_STARTED for thinking\n stepId = genId()\n reasoningMessageId = genId()\n\n // Spec REASONING events\n yield {\n type: EventType.REASONING_START,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_MESSAGE_START,\n messageId: reasoningMessageId,\n role: 'reasoning' as const,\n model,\n timestamp: Date.now(),\n }\n\n // Legacy STEP events (kept during transition)\n yield {\n type: EventType.STEP_STARTED,\n stepName: stepId,\n stepId,\n model,\n timestamp: Date.now(),\n stepType: 'thinking',\n }\n }\n } else if (event.type === 'content_block_delta') {\n if (event.delta.type === 'text_delta') {\n // Close reasoning before text starts\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n // Emit TEXT_MESSAGE_START on first text content\n if (!hasEmittedTextMessageStart) {\n hasEmittedTextMessageStart = true\n yield {\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n model,\n timestamp: Date.now(),\n role: 'assistant',\n }\n }\n\n const delta = event.delta.text\n accumulatedContent += delta\n yield {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n model,\n timestamp: Date.now(),\n delta,\n content: accumulatedContent,\n }\n } else if (\n event.delta.type === 'thinking_delta' &&\n reasoningMessageId\n ) {\n const delta = event.delta.thinking\n accumulatedThinking += delta\n\n // Spec REASONING content event\n yield {\n type: EventType.REASONING_MESSAGE_CONTENT,\n messageId: reasoningMessageId,\n delta,\n model,\n timestamp: Date.now(),\n }\n\n // Legacy STEP event\n yield {\n type: EventType.STEP_FINISHED,\n stepName: stepId || genId(),\n stepId: stepId || genId(),\n model,\n timestamp: Date.now(),\n delta,\n content: accumulatedThinking,\n }\n } else if (\n (event.delta as { type: string }).type === 'signature_delta'\n ) {\n accumulatedSignature +=\n (event.delta as { signature: string }).signature || ''\n } else if (event.delta.type === 'input_json_delta') {\n // Route deltas by current block type so server_tool_use input\n // never appends onto the prior client tool's buffer.\n if (currentBlockType === 'tool_use') {\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing) {\n // Emit TOOL_CALL_START on first args delta\n if (!existing.started) {\n existing.started = true\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n }\n }\n\n existing.input += event.delta.partial_json\n\n yield {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: existing.id,\n model,\n timestamp: Date.now(),\n delta: event.delta.partial_json,\n args: existing.input,\n }\n }\n } else if (\n currentBlockType === 'server_tool_use' &&\n currentServerTool\n ) {\n // Accumulate server tool input internally. We don't emit\n // TOOL_CALL_* events: the call is executed by Anthropic, not\n // by our agent loop, so surfacing it as a client tool call\n // would cause downstream code to try (and fail) to run it.\n currentServerTool.input += event.delta.partial_json\n }\n }\n } else if (event.type === 'content_block_stop') {\n if (currentBlockType === 'thinking') {\n // Emit signature so it can be replayed in multi-turn context\n if (accumulatedSignature && stepId) {\n yield {\n type: EventType.STEP_FINISHED,\n stepName: stepId,\n stepId,\n model,\n timestamp: Date.now(),\n delta: '',\n content: accumulatedThinking,\n signature: accumulatedSignature,\n }\n }\n } else if (currentBlockType === 'tool_use') {\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing) {\n // If tool call wasn't started yet (no args), start it now\n if (!existing.started) {\n existing.started = true\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n }\n }\n\n // Emit TOOL_CALL_END\n let parsedInput: unknown = {}\n try {\n const parsed = existing.input ? JSON.parse(existing.input) : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = {}\n }\n\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n model,\n timestamp: Date.now(),\n input: parsedInput,\n }\n\n // Reset so a new TEXT_MESSAGE_START is emitted if text follows tool calls\n hasEmittedTextMessageStart = false\n }\n } else if (currentBlockType === 'server_tool_use') {\n if (currentServerTool) {\n // Anthropic executes the call; we only need a breadcrumb so\n // consumers (devtools, telemetry) can see what ran.\n logger.provider(\n `provider=anthropic server_tool_use name=${currentServerTool.name}`,\n {\n toolUseId: currentServerTool.id,\n name: currentServerTool.name,\n input: currentServerTool.input,\n },\n )\n // Hold the call until its result block arrives so we can emit\n // both together as one provider-executed tool call.\n completedServerTools.set(currentServerTool.id, currentServerTool)\n }\n currentServerTool = null\n } else if (\n currentBlockType === 'web_fetch_tool_result' ||\n currentBlockType === 'web_search_tool_result'\n ) {\n // The model already consumed the result; error variants were\n // already surfaced at content_block_start.\n } else {\n // Emit TEXT_MESSAGE_END only for text blocks (not tool_use blocks)\n if (hasEmittedTextMessageStart && accumulatedContent) {\n yield {\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n model,\n timestamp: Date.now(),\n }\n }\n }\n currentBlockType = null\n } else if (event.type === 'message_stop') {\n // Close reasoning events if still open\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n // Only emit RUN_FINISHED from message_stop if message_delta didn't already emit one.\n // message_delta carries the real stop_reason (tool_use, end_turn, etc.),\n // while message_stop is just a completion signal.\n if (!hasEmittedRunFinished) {\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'stop',\n }\n }\n } else if (event.type === 'message_delta') {\n if (event.delta.stop_reason) {\n hasEmittedRunFinished = true\n\n // Close reasoning events if still open\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n switch (event.delta.stop_reason) {\n case 'tool_use': {\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'tool_calls',\n usage: buildAnthropicUsage(event.usage),\n }\n break\n }\n case 'max_tokens': {\n // Surface a warning when the truncating cap was the\n // adapter-supplied default (caller didn't pass `max_tokens`), so\n // the truncation isn't silently attributed to the model \"doing\n // nothing\" (issue #849). When the caller set `max_tokens`\n // themselves, hitting it is their own deliberate ceiling.\n if (options.modelOptions?.max_tokens == null) {\n const defaultedMaxTokens = getAnthropicDefaultMaxTokens(model)\n logger.warn(\n `anthropic response truncated at the default max_tokens (${defaultedMaxTokens}) for model=${model}; pass maxTokens (or modelOptions.max_tokens) to raise the output ceiling`,\n {\n source: 'anthropic.processAnthropicStream',\n model,\n defaultedMaxTokens,\n },\n )\n }\n yield {\n type: EventType.RUN_ERROR,\n model,\n timestamp: Date.now(),\n message:\n 'The response was cut off because the maximum token limit was reached.',\n code: 'max_tokens',\n error: {\n message:\n 'The response was cut off because the maximum token limit was reached.',\n code: 'max_tokens',\n },\n }\n break\n }\n case 'stop_sequence':\n case 'end_turn':\n case 'pause_turn':\n case 'refusal':\n case 'model_context_window_exceeded':\n case 'compaction':\n default: {\n // All remaining Anthropic stop_reason variants map to the\n // generic \"stop\" finish reason — they describe *why* the\n // stream ended, but for AG-UI consumers the resulting event\n // shape is identical.\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: buildAnthropicUsage(event.usage),\n }\n }\n }\n }\n }\n }\n } catch (error: unknown) {\n const err = error as Error & { status?: number; code?: string }\n const rawEvent = toRunErrorRawEvent(error)\n\n logger.errors('anthropic.processAnthropicStream fatal', {\n error,\n source: 'anthropic.processAnthropicStream',\n })\n yield {\n type: EventType.RUN_ERROR,\n model,\n timestamp: Date.now(),\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n // Forward the Anthropic SDK error's `.error` response body when present.\n ...(rawEvent !== undefined && { rawEvent }),\n error: {\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n },\n }\n }\n }\n}\n\n/**\n * Creates an Anthropic chat adapter with explicit API key.\n * Type resolution happens here at the call site.\n */\nexport function createAnthropicChat<\n TModel extends (typeof ANTHROPIC_MODELS)[number],\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<AnthropicTextConfig, 'apiKey'>,\n): AnthropicTextAdapter<\n TModel,\n ResolveProviderOptions<TModel>,\n ResolveInputModalities<TModel>\n> {\n return new AnthropicTextAdapter({ apiKey, ...config }, model)\n}\n\n/**\n * Creates an Anthropic text adapter with automatic API key detection.\n * Type resolution happens here at the call site.\n */\nexport function anthropicText<TModel extends (typeof ANTHROPIC_MODELS)[number]>(\n model: TModel,\n config?: Omit<AnthropicTextConfig, 'apiKey'>,\n): AnthropicTextAdapter<\n TModel,\n ResolveProviderOptions<TModel>,\n ResolveInputModalities<TModel>\n> {\n const apiKey = getAnthropicApiKeyFromEnv()\n return createAnthropicChat(model, apiKey, config)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"text.js","names":[],"sources":["../../../src/adapters/text.ts"],"sourcesContent":["import { EventType, normalizeSystemPrompts } from '@tanstack/ai'\nimport { toRunErrorRawEvent } from '@tanstack/ai/adapter-internals'\nimport { BaseTextAdapter } from '@tanstack/ai/adapters'\nimport { convertToolsToProviderFormat } from '../tools/tool-converter'\nimport {\n readCodeExecutionConfig,\n readCodeExecutionSkills,\n} from '../tools/code-execution-tool'\nimport { validateTextProviderOptions } from '../text/text-provider-options'\nimport { buildAnthropicUsage } from '../usage'\nimport {\n createAnthropicClient,\n generateId,\n getAnthropicApiKeyFromEnv,\n} from '../utils/client'\nimport {\n ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS,\n getAnthropicDefaultMaxTokens,\n} from '../model-meta'\nimport type {\n ANTHROPIC_MODELS,\n AnthropicChatModelProviderOptionsByName,\n AnthropicChatModelToolCapabilitiesByName,\n AnthropicModelInputModalitiesByName,\n} from '../model-meta'\nimport type {\n StructuredOutputOptions,\n StructuredOutputResult,\n} from '@tanstack/ai/adapters'\nimport type { InternalLogger } from '@tanstack/ai/adapter-internals'\nimport type {\n Base64ImageSource,\n Base64PDFSource,\n ContentBlockParam,\n DocumentBlockParam,\n ImageBlockParam,\n ServerToolUseBlockParam,\n TextBlockParam,\n ThinkingBlockParam,\n ToolUseBlockParam,\n URLImageSource,\n URLPDFSource,\n WebFetchToolResultBlockParam,\n WebSearchToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\nimport type Anthropic_SDK from '@anthropic-ai/sdk'\nimport type { AnthropicBeta } from '@anthropic-ai/sdk/resources/beta/beta'\nimport type {\n AnyTool,\n ContentPart,\n Modality,\n ModelMessage,\n StreamChunk,\n TextOptions,\n} from '@tanstack/ai'\nimport type {\n AnthropicSystemPromptMetadata,\n ExternalTextProviderOptions,\n InternalTextProviderOptions,\n} from '../text/text-provider-options'\nimport type {\n AnthropicDocumentMetadata,\n AnthropicImageMetadata,\n AnthropicMessageMetadataByModality,\n AnthropicTextMetadata,\n} from '../message-types'\nimport type { AnthropicClientConfig } from '../utils/client'\n\n/**\n * The block type carried by an Anthropic provider-executed (server) tool's\n * stored result. Mirrors the `*_tool_result` block emitted by the streaming\n * API so it can be replayed verbatim into a later turn.\n */\ntype AnthropicServerToolResultBlockType =\n | 'web_search_tool_result'\n | 'web_fetch_tool_result'\n\n/**\n * Anthropic payload stashed on a provider-executed tool call's `metadata`\n * (under the `anthropic` key, alongside `providerExecuted: true`). Holds enough\n * to reconstruct the original `server_tool_use` + `*_tool_result` blocks so the\n * model still sees prior `web_search` / `web_fetch` evidence on the next turn.\n */\ninterface AnthropicServerToolMetadata {\n serverToolType: ServerToolUseBlockParam['name']\n resultBlockType: AnthropicServerToolResultBlockType\n /** Raw result block content, preserved verbatim from the stream. */\n result: unknown\n}\n\n/**\n * Narrow an opaque tool-call `metadata` to {@link AnthropicServerToolMetadata}\n * when it follows the provider-executed convention, else `null`.\n */\nfunction readAnthropicServerToolMetadata(\n metadata: unknown,\n): AnthropicServerToolMetadata | null {\n if (typeof metadata !== 'object' || metadata === null) return null\n const outer = metadata as { providerExecuted?: unknown; anthropic?: unknown }\n if (outer.providerExecuted !== true) return null\n const inner = outer.anthropic\n if (typeof inner !== 'object' || inner === null) return null\n const { serverToolType, resultBlockType, result } = inner as {\n serverToolType?: unknown\n resultBlockType?: unknown\n result?: unknown\n }\n if (\n typeof serverToolType !== 'string' ||\n (resultBlockType !== 'web_search_tool_result' &&\n resultBlockType !== 'web_fetch_tool_result')\n ) {\n return null\n }\n return {\n // Validated as a string above; widen back to the SDK's tool-name union.\n serverToolType: serverToolType as ServerToolUseBlockParam['name'],\n resultBlockType,\n result,\n }\n}\n\n/**\n * Reconstruct the `*_tool_result` block param from stored server-tool metadata.\n * The `result` content is opaque round-trip data, asserted to the SDK's param\n * content type at this single boundary.\n */\nfunction buildServerToolResultBlock(\n toolUseId: string,\n meta: AnthropicServerToolMetadata,\n): WebSearchToolResultBlockParam | WebFetchToolResultBlockParam {\n if (meta.resultBlockType === 'web_search_tool_result') {\n return {\n type: 'web_search_tool_result',\n tool_use_id: toolUseId,\n content: meta.result as WebSearchToolResultBlockParam['content'],\n }\n }\n return {\n type: 'web_fetch_tool_result',\n tool_use_id: toolUseId,\n content: meta.result as WebFetchToolResultBlockParam['content'],\n }\n}\n\n/**\n * Computes the `betas` array for a Messages request. Unions:\n * - `interleaved-thinking-2025-05-14` when interleaved thinking is enabled,\n * - `code-execution-2025-08-25` when a `code_execution` tool is present,\n * - `skills-2025-10-02` when that tool carries skills.\n * Returns `undefined` when none apply (so the call site omits `betas`).\n */\nexport function computeAnthropicBetas(\n tools: Array<AnyTool> | undefined,\n modelOptions:\n | {\n thinking?: {\n type?: 'enabled' | 'disabled' | 'adaptive'\n budget_tokens?: number\n }\n }\n | undefined,\n): Array<AnthropicBeta> | undefined {\n const betas = new Set<AnthropicBeta>()\n\n const useInterleavedThinking =\n modelOptions?.thinking?.type === 'enabled' &&\n typeof modelOptions.thinking.budget_tokens === 'number' &&\n modelOptions.thinking.budget_tokens > 0\n if (useInterleavedThinking) betas.add('interleaved-thinking-2025-05-14')\n\n // Code-execution beta is version-aware: select from the FIRST code_execution\n // tool's config type.\n const codeExecTool = tools?.find((t) => t.name === 'code_execution')\n if (codeExecTool) {\n const cfgType = readCodeExecutionConfig(codeExecTool)?.type\n // Each code_execution tool version pairs with a specific beta. Known\n // legacy variant maps explicitly; current/future variants (e.g.\n // `code_execution_20250825` and later) use the latest `-08-25` beta.\n betas.add(\n cfgType === 'code_execution_20250522'\n ? 'code-execution-2025-05-22'\n : 'code-execution-2025-08-25',\n )\n }\n\n // Skills beta: scan ALL code_execution tools so this AGREES with the\n // container-lift, which lifts skills from any code_execution tool that\n // carries them (not just the first).\n const hasSkills = tools?.some(\n (t) =>\n t.name === 'code_execution' &&\n (readCodeExecutionSkills(t)?.length ?? 0) > 0,\n )\n if (hasSkills) betas.add('skills-2025-10-02')\n\n return betas.size > 0 ? Array.from(betas) : undefined\n}\n\n/**\n * Configuration for Anthropic text adapter\n */\nexport interface AnthropicTextConfig extends AnthropicClientConfig {}\n\n/**\n * Anthropic-specific provider options for text/chat\n */\nexport type AnthropicTextProviderOptions = ExternalTextProviderOptions\n\n// ===========================\n// Type Resolution Helpers\n// ===========================\n\n/**\n * Resolve provider options for a specific model.\n * If the model has explicit options in the map, use those; otherwise use base options.\n */\ntype ResolveProviderOptions<TModel extends string> =\n TModel extends keyof AnthropicChatModelProviderOptionsByName\n ? AnthropicChatModelProviderOptionsByName[TModel]\n : AnthropicTextProviderOptions\n\n/**\n * Resolve input modalities for a specific model.\n * If the model has explicit modalities in the map, use those; otherwise use default.\n */\ntype ResolveInputModalities<TModel extends string> =\n TModel extends keyof AnthropicModelInputModalitiesByName\n ? AnthropicModelInputModalitiesByName[TModel]\n : readonly ['text', 'image', 'document']\n\ntype ResolveToolCapabilities<TModel extends string> =\n TModel extends keyof AnthropicChatModelToolCapabilitiesByName\n ? NonNullable<AnthropicChatModelToolCapabilitiesByName[TModel]>\n : readonly []\n\n// ===========================\n// Adapter Implementation\n// ===========================\n\n/**\n * Anthropic Text (Chat) Adapter\n *\n * Tree-shakeable adapter for Anthropic chat/text completion functionality.\n * Import only what you need for smaller bundle sizes.\n */\nexport class AnthropicTextAdapter<\n TModel extends (typeof ANTHROPIC_MODELS)[number],\n TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>,\n TInputModalities extends ReadonlyArray<Modality> =\n ResolveInputModalities<TModel>,\n TToolCapabilities extends ReadonlyArray<string> =\n ResolveToolCapabilities<TModel>,\n> extends BaseTextAdapter<\n TModel,\n TProviderOptions,\n TInputModalities,\n AnthropicMessageMetadataByModality,\n TToolCapabilities,\n // TToolCallMetadata — anthropic has no tool-call metadata round-tripping\n unknown,\n // TSystemPromptMetadata — narrows `systemPrompts[i].metadata` at the\n // chat() call site so users get `cache_control` autocomplete.\n AnthropicSystemPromptMetadata\n> {\n override readonly kind = 'text' as const\n readonly name = 'anthropic' as const\n\n private readonly client: Anthropic_SDK\n\n constructor(config: AnthropicTextConfig, model: TModel) {\n super({}, model)\n this.client = createAnthropicClient(config)\n }\n\n async *chatStream(\n options: TextOptions<TProviderOptions>,\n ): AsyncIterable<StreamChunk> {\n const { logger } = options\n try {\n const requestParams = this.mapCommonOptionsToAnthropic(options)\n\n logger.request(\n `activity=chat provider=anthropic model=${this.model} messages=${options.messages.length} tools=${options.tools?.length ?? 0} stream=true`,\n { provider: 'anthropic', model: this.model },\n )\n\n // `betas` is attached at the call site rather than in the shared mapper\n // because the beta set depends on both the tools and the modelOptions.\n const betas = computeAnthropicBetas(options.tools, options.modelOptions)\n\n // `client.beta.messages` is Anthropic's permanent staging surface, not a\n // sunset path: it's a superset of `client.messages` that additionally\n // accepts the `betas: AnthropicBeta[]` header (e.g. interleaved\n // thinking) plus richer `container` (skills) and `context_management`\n // shapes that `InternalTextProviderOptions` carries. We route every\n // Messages call through it so the request mapper stays single-shape.\n const stream = await this.client.beta.messages.create(\n {\n ...requestParams,\n stream: true,\n ...(betas && { betas }),\n },\n {\n signal: options.request?.signal,\n headers: options.request?.headers,\n },\n )\n\n yield* this.processAnthropicStream(\n stream,\n options,\n () => generateId(this.name),\n logger,\n )\n } catch (error: unknown) {\n const err = error as Error & { status?: number; code?: string }\n const rawEvent = toRunErrorRawEvent(error)\n logger.errors('anthropic.chatStream fatal', {\n error,\n source: 'anthropic.chatStream',\n })\n yield {\n type: EventType.RUN_ERROR,\n model: options.model,\n timestamp: Date.now(),\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n // Forward the Anthropic SDK error's `.error` response body (e.g.\n // `{ type, message }`) when present; never the raw exception object.\n ...(rawEvent !== undefined && { rawEvent }),\n error: {\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n },\n }\n }\n }\n\n /**\n * Generate structured output using Anthropic's tool-based approach.\n * Anthropic doesn't have native structured output, so we use a tool with the schema\n * and force the model to call it.\n * The outputSchema is already JSON Schema (converted in the ai layer).\n */\n async structuredOutput(\n options: StructuredOutputOptions<TProviderOptions>,\n ): Promise<StructuredOutputResult<unknown>> {\n const { chatOptions, outputSchema } = options\n const { logger } = chatOptions\n\n // `structuredOutput()` issues a non-streaming `messages.create({ stream:\n // false })` below, so the defaulted `max_tokens` must stay under the SDK's\n // non-streaming 10-minute guard (issue #849) — pass `stream: false`.\n const requestParams = this.mapCommonOptionsToAnthropic(chatOptions, {\n stream: false,\n })\n\n // Create a tool that will capture the structured output\n // Anthropic's SDK requires input_schema with type: 'object' literal\n const structuredOutputTool = {\n name: 'structured_output',\n description:\n 'Use this tool to provide your response in the required structured format.',\n input_schema: {\n type: 'object' as const,\n properties: outputSchema.properties ?? {},\n required: outputSchema.required ?? [],\n },\n }\n\n try {\n logger.request(\n `activity=chat provider=anthropic model=${this.model} messages=${chatOptions.messages.length} tools=${chatOptions.tools?.length ?? 0} stream=false`,\n { provider: 'anthropic', model: this.model },\n )\n const betas = computeAnthropicBetas(\n chatOptions.tools,\n chatOptions.modelOptions,\n )\n // Make non-streaming request with tool_choice forced to our structured output tool\n const response = await this.client.beta.messages.create(\n {\n ...requestParams,\n stream: false,\n tools: [structuredOutputTool],\n tool_choice: { type: 'tool', name: 'structured_output' },\n ...(betas && { betas }),\n },\n {\n signal: chatOptions.request?.signal,\n headers: chatOptions.request?.headers,\n },\n )\n\n // Extract the tool use content from the response\n let parsed: unknown = null\n let rawText = ''\n\n for (const block of response.content) {\n if (block.type === 'tool_use' && block.name === 'structured_output') {\n parsed = block.input\n rawText = JSON.stringify(block.input)\n break\n }\n }\n\n if (parsed === null) {\n // Fallback: try to extract text content and parse as JSON\n rawText = response.content\n .map((b) => {\n if (b.type === 'text') {\n return b.text\n }\n return ''\n })\n .join('')\n try {\n parsed = JSON.parse(rawText)\n } catch {\n throw new Error(\n `Failed to extract structured output from response. Content: ${rawText.slice(0, 200)}${rawText.length > 200 ? '...' : ''}`,\n )\n }\n }\n\n return {\n data: parsed,\n rawText,\n usage: buildAnthropicUsage(response.usage),\n }\n } catch (error: unknown) {\n const err = error as Error\n logger.errors('anthropic.structuredOutput fatal', {\n error,\n source: 'anthropic.structuredOutput',\n })\n throw new Error(\n `Structured output generation failed: ${err.message || 'Unknown error occurred'}`,\n )\n }\n }\n\n private mapCommonOptionsToAnthropic(\n options: TextOptions<AnthropicTextProviderOptions>,\n { stream = true }: { stream?: boolean } = {},\n ) {\n const modelOptions = options.modelOptions\n\n const formattedMessages = this.formatMessages(options.messages)\n const tools = options.tools\n ? convertToolsToProviderFormat(options.tools)\n : undefined\n\n const validProviderOptions: Partial<InternalTextProviderOptions> = {}\n if (modelOptions) {\n const validKeys: Array<keyof AnthropicTextProviderOptions> = [\n 'cache_control',\n 'container',\n 'context_management',\n 'effort',\n 'mcp_servers',\n 'output_config',\n 'service_tier',\n 'stop_sequences',\n 'thinking',\n 'tool_choice',\n 'top_k',\n 'temperature',\n 'top_p',\n ]\n // `max_tokens` is a legitimate public modelOptions field, but it is read\n // via a dedicated path (defaultMaxTokens below) rather than copied into\n // validProviderOptions. Exempt it from the dropped-key warning here so a\n // correct `modelOptions: { max_tokens }` call doesn't log a spurious\n // \"dropped unknown key\" error, while keeping it out of the copy loop.\n const droppedKeyExemptSet = new Set<string>([...validKeys, 'max_tokens'])\n const droppedKeys = Object.keys(modelOptions).filter(\n (key) => !droppedKeyExemptSet.has(key),\n )\n if (droppedKeys.length > 0) {\n // Reachable when callers cast around the public type (e.g.\n // `modelOptions: { system: ... } as any`). Without this warning the\n // unknown keys are silently dropped — `system` in particular was a\n // previously-tested path for attaching `cache_control` and we don't\n // want that to fail in production with no signal.\n options.logger.errors(\n `anthropic.mapCommonOptionsToAnthropic dropped unknown modelOptions key(s): ${droppedKeys.join(', ')}`,\n {\n source: 'anthropic.mapCommonOptionsToAnthropic',\n droppedKeys,\n hint: droppedKeys.includes('system')\n ? 'pass system prompts via the top-level `systemPrompts` option; `modelOptions.system` is no longer honored'\n : undefined,\n },\n )\n }\n for (const key of validKeys) {\n if (key in modelOptions) {\n const value = modelOptions[key]\n if (key === 'tool_choice' && typeof value === 'string') {\n ;(validProviderOptions as Record<string, unknown>)[key] = {\n type: value,\n }\n } else {\n ;(validProviderOptions as Record<string, unknown>)[key] = value\n }\n }\n }\n }\n\n const thinkingBudget =\n validProviderOptions.thinking?.type === 'enabled'\n ? validProviderOptions.thinking.budget_tokens\n : undefined\n // Anthropic's Messages API *requires* `max_tokens`, so we must always send a\n // value. When the caller doesn't specify one, default to the resolved\n // model's real output ceiling (from model-meta) rather than a low constant\n // that silently truncates long responses with `stop_reason: \"max_tokens\"`\n // (issue #849). `max_tokens` is a ceiling, not a reservation — billing is on\n // tokens actually generated, so a higher default costs nothing extra.\n // For non-streaming requests (the `structuredOutput()` path) the default is\n // clamped to the SDK's non-streaming-safe limit so it doesn't trip the\n // \"streaming required\" 10-minute guard — see getAnthropicDefaultMaxTokens.\n const defaultMaxTokens =\n modelOptions?.max_tokens ??\n getAnthropicDefaultMaxTokens(this.model, { stream })\n const maxTokens =\n thinkingBudget && thinkingBudget >= defaultMaxTokens\n ? thinkingBudget + 1\n : defaultMaxTokens\n\n // `InternalTextProviderOptions.system` is typed\n // `string | Array<TextBlockParam>` (no `| undefined`), so build it\n // outside the literal and spread it conditionally rather than\n // assigning `undefined` under exactOptionalPropertyTypes.\n const systemBlocks = ((): Array<TextBlockParam> | undefined => {\n const normalized = normalizeSystemPrompts<AnthropicSystemPromptMetadata>(\n options.systemPrompts,\n )\n if (normalized.length === 0) return undefined\n return normalized.map(\n (p): TextBlockParam => ({\n type: 'text',\n text: p.content,\n ...(p.metadata?.cache_control && {\n cache_control: p.metadata.cache_control,\n }),\n }),\n )\n })()\n // Wire engine-threaded outputSchema into Messages `output_config.format`\n // alongside any `tools` so the model emits tool calls during the agent\n // loop and a single schema-constrained JSON message on its final turn.\n // Merge into any existing `output_config` so callers can keep tuning\n // `output_config.effort` alongside the schema.\n const combinedSchema = options.outputSchema as\n | Record<string, unknown>\n | undefined\n const outputConfig = combinedSchema\n ? {\n output_config: {\n ...(validProviderOptions.output_config ?? {}),\n format: {\n type: 'json_schema' as const,\n schema: combinedSchema,\n },\n },\n }\n : undefined\n\n // Lift skills attached to a `code_execution` tool into the top-level\n // `container.skills` request param (Anthropic's required shape). Preserve any\n // `container.id` supplied via modelOptions for container reuse. This is the\n // canonical path for skills; `modelOptions.container.skills` is deprecated.\n const toolSkills = options.tools\n ?.map((tool) =>\n tool.name === 'code_execution'\n ? readCodeExecutionSkills(tool)\n : undefined,\n )\n .find((skills) => skills && skills.length > 0)\n\n if (toolSkills && toolSkills.length > 0) {\n const existingContainer = validProviderOptions.container ?? undefined\n validProviderOptions.container = {\n id: existingContainer?.id ?? null,\n skills: toolSkills,\n }\n }\n\n // `temperature`/`top_p` arrive via `...validProviderOptions` (sourced from\n // `modelOptions`). `InternalTextProviderOptions` declares `system` and\n // `tools` as `T?: ...` (no `| undefined`), so spread them conditionally\n // rather than passing explicit `undefined` under exactOptionalPropertyTypes.\n const requestParams: InternalTextProviderOptions = {\n model: options.model,\n max_tokens: maxTokens,\n messages: formattedMessages,\n ...(systemBlocks !== undefined && { system: systemBlocks }),\n ...(tools !== undefined && { tools }),\n ...validProviderOptions,\n ...(outputConfig ?? {}),\n }\n validateTextProviderOptions(requestParams)\n return requestParams\n }\n\n /**\n * Anthropic supports `output_config.format` + `tools` in a single streaming\n * Messages request only for Claude 4.5+ (GA 2026-01-29). For 4.4 and\n * earlier we keep the forced-tool-use workaround in\n * {@link structuredOutput} via the engine's finalization path.\n */\n supportsCombinedToolsAndSchema(): boolean {\n return ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS.has(this.model)\n }\n\n private convertContentPartToAnthropic(\n part: ContentPart,\n ): TextBlockParam | ImageBlockParam | DocumentBlockParam {\n switch (part.type) {\n case 'text': {\n const metadata = part.metadata as AnthropicTextMetadata | undefined\n return {\n type: 'text',\n text: part.content,\n ...metadata,\n }\n }\n\n case 'image': {\n const metadata = part.metadata as AnthropicImageMetadata | undefined\n const imageSource: Base64ImageSource | URLImageSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: part.source.mimeType as\n | 'image/jpeg'\n | 'image/png'\n | 'image/gif'\n | 'image/webp',\n }\n : {\n type: 'url',\n url: part.source.value,\n }\n return {\n type: 'image',\n source: imageSource,\n ...metadata,\n }\n }\n case 'document': {\n const metadata = part.metadata as AnthropicDocumentMetadata | undefined\n const docSource: Base64PDFSource | URLPDFSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: part.source.mimeType as 'application/pdf',\n }\n : {\n type: 'url',\n url: part.source.value,\n }\n return {\n type: 'document',\n source: docSource,\n ...metadata,\n }\n }\n case 'audio':\n case 'video':\n throw new Error(\n `Anthropic does not support ${part.type} content directly`,\n )\n default: {\n const _exhaustiveCheck: never = part\n throw new Error(\n `Unsupported content part type: ${(_exhaustiveCheck as ContentPart).type}`,\n )\n }\n }\n }\n\n private formatMessages(\n messages: Array<ModelMessage>,\n ): InternalTextProviderOptions['messages'] {\n const formattedMessages: InternalTextProviderOptions['messages'] = []\n\n for (const message of messages) {\n const role = message.role\n\n if (role === 'tool' && message.toolCallId) {\n const toolContent = message.content\n formattedMessages.push({\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: Array.isArray(toolContent)\n ? toolContent.map((part) =>\n this.convertContentPartToAnthropic(part),\n )\n : typeof toolContent === 'string'\n ? toolContent\n : '',\n },\n ],\n })\n continue\n }\n\n if (role === 'assistant' && message.toolCalls?.length) {\n const contentBlocks: Array<ContentBlockParam> = []\n\n this.appendThinkingBlocks(contentBlocks, message.thinking)\n\n if (message.content) {\n const content =\n typeof message.content === 'string' ? message.content : ''\n const textBlock: TextBlockParam = {\n type: 'text',\n text: content,\n }\n contentBlocks.push(textBlock)\n }\n\n for (const toolCall of message.toolCalls) {\n let parsedInput: unknown = {}\n try {\n const parsed = toolCall.function.arguments\n ? JSON.parse(toolCall.function.arguments)\n : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = toolCall.function.arguments\n }\n\n // Provider-executed server tools (e.g. web_search) replay as the\n // original `server_tool_use` + result blocks so the model still sees\n // the prior evidence. Their result was captured verbatim during\n // streaming (see processAnthropicStream).\n const serverMeta = readAnthropicServerToolMetadata(toolCall.metadata)\n if (serverMeta) {\n const serverToolUseBlock: ServerToolUseBlockParam = {\n type: 'server_tool_use',\n id: toolCall.id,\n name: serverMeta.serverToolType,\n input: parsedInput,\n }\n contentBlocks.push(serverToolUseBlock)\n contentBlocks.push(\n buildServerToolResultBlock(toolCall.id, serverMeta),\n )\n continue\n }\n\n const toolUseBlock: ToolUseBlockParam = {\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: parsedInput,\n }\n contentBlocks.push(toolUseBlock)\n }\n\n formattedMessages.push({\n role: 'assistant',\n content: contentBlocks,\n })\n\n continue\n }\n\n if (role === 'assistant') {\n const contentBlocks: Array<ContentBlockParam> = []\n this.appendThinkingBlocks(contentBlocks, message.thinking)\n\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n contentBlocks.push(this.convertContentPartToAnthropic(part))\n }\n } else if (message.content) {\n contentBlocks.push({\n type: 'text',\n text: message.content,\n })\n }\n\n formattedMessages.push({\n role: 'assistant',\n content: contentBlocks.length > 0 ? contentBlocks : '',\n })\n continue\n }\n\n if (role === 'user' && Array.isArray(message.content)) {\n const contentBlocks = message.content.map((part) =>\n this.convertContentPartToAnthropic(part),\n )\n formattedMessages.push({\n role: 'user',\n content: contentBlocks,\n })\n continue\n }\n\n formattedMessages.push({\n role: 'user',\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content\n ? message.content.map((c) =>\n this.convertContentPartToAnthropic(c),\n )\n : '',\n })\n }\n\n // Post-process: Anthropic requires strictly alternating user/assistant roles.\n // Tool results are sent as role:'user' messages, which can create consecutive\n // user messages when followed by a new user message. Merge them.\n return this.mergeConsecutiveSameRoleMessages(formattedMessages)\n }\n\n private appendThinkingBlocks(\n contentBlocks: Array<ContentBlockParam>,\n thinkingParts: ModelMessage['thinking'],\n ): void {\n if (!thinkingParts?.length) return\n\n for (const thinking of thinkingParts) {\n if (!thinking.signature) continue\n const block: ThinkingBlockParam = {\n type: 'thinking',\n thinking: thinking.content,\n signature: thinking.signature,\n }\n contentBlocks.push(block)\n }\n }\n\n /**\n * Merge consecutive messages of the same role into a single message.\n * Anthropic's API requires strictly alternating user/assistant roles.\n * Tool results are wrapped as role:'user' messages, which can collide\n * with actual user messages in multi-turn conversations.\n *\n * Also filters out empty assistant messages (e.g., from a previous failed request).\n */\n private mergeConsecutiveSameRoleMessages(\n messages: InternalTextProviderOptions['messages'],\n ): InternalTextProviderOptions['messages'] {\n const merged: InternalTextProviderOptions['messages'] = []\n\n for (const msg of messages) {\n // Skip empty assistant messages (no content or empty string)\n if (msg.role === 'assistant') {\n const hasContent = Array.isArray(msg.content)\n ? msg.content.length > 0\n : typeof msg.content === 'string' && msg.content.length > 0\n if (!hasContent) {\n continue\n }\n }\n\n const prev = merged[merged.length - 1]\n if (prev && prev.role === msg.role) {\n // Normalize both contents to arrays and concatenate\n const prevBlocks = Array.isArray(prev.content)\n ? prev.content\n : typeof prev.content === 'string' && prev.content\n ? [{ type: 'text' as const, text: prev.content }]\n : []\n const msgBlocks = Array.isArray(msg.content)\n ? msg.content\n : typeof msg.content === 'string' && msg.content\n ? [{ type: 'text' as const, text: msg.content }]\n : []\n prev.content = [...prevBlocks, ...msgBlocks]\n } else {\n merged.push({ ...msg })\n }\n }\n\n // De-duplicate tool_result blocks with the same tool_use_id.\n // This can happen when the core layer generates tool results from both\n // the tool-result part and the tool-call part's output field.\n for (const msg of merged) {\n if (Array.isArray(msg.content)) {\n const seenToolResultIds = new Set<string>()\n msg.content = msg.content.filter((block: any) => {\n if (block.type === 'tool_result' && block.tool_use_id) {\n if (seenToolResultIds.has(block.tool_use_id)) {\n return false // Remove duplicate\n }\n seenToolResultIds.add(block.tool_use_id)\n }\n return true\n })\n }\n }\n\n return merged\n }\n\n private async *processAnthropicStream(\n stream: AsyncIterable<Anthropic_SDK.Beta.BetaRawMessageStreamEvent>,\n options: TextOptions<AnthropicTextProviderOptions>,\n genId: () => string,\n logger: InternalLogger,\n ): AsyncIterable<StreamChunk> {\n const model = options.model\n let accumulatedContent = ''\n let accumulatedThinking = ''\n let accumulatedSignature = ''\n const toolCallsMap = new Map<\n number,\n { id: string; name: string; input: string; started: boolean }\n >()\n let currentToolIndex = -1\n // Server-side tools share the `input_json_delta` wire format with client\n // `tool_use` blocks; routing both to the same buffer corrupts client tool\n // input.\n let currentServerTool: { id: string; name: string; input: string } | null =\n null\n // Completed server tools awaiting their matching result block. Anthropic\n // emits `server_tool_use` then a separate `*_tool_result` block; we hold\n // the call here (keyed by id) until the result arrives so we can emit a\n // single provider-executed tool call carrying the raw result for round-trip.\n const completedServerTools = new Map<\n string,\n { id: string; name: string; input: string }\n >()\n\n // AG-UI lifecycle tracking\n const runId = options.runId ?? genId()\n const threadId = options.threadId ?? genId()\n const messageId = genId()\n let stepId: string | null = null\n let reasoningMessageId: string | null = null\n let hasClosedReasoning = false\n let hasEmittedRunStarted = false\n let hasEmittedTextMessageStart = false\n let hasEmittedRunFinished = false\n // Track current content block type for proper content_block_stop handling\n let currentBlockType: string | null = null\n\n try {\n for await (const event of stream) {\n logger.provider(`provider=anthropic type=${event.type}`, {\n chunk: event,\n })\n // Emit RUN_STARTED on first event\n if (!hasEmittedRunStarted) {\n hasEmittedRunStarted = true\n yield {\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n parentRunId: options.parentRunId,\n }\n }\n\n if (event.type === 'content_block_start') {\n currentBlockType = event.content_block.type\n if (event.content_block.type === 'tool_use') {\n currentToolIndex++\n toolCallsMap.set(currentToolIndex, {\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n started: false,\n })\n } else if (event.content_block.type === 'server_tool_use') {\n currentServerTool = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: '',\n }\n } else if (\n event.content_block.type === 'web_fetch_tool_result' ||\n event.content_block.type === 'web_search_tool_result'\n ) {\n // The result content arrives in full at content_block_start (no\n // deltas). Surface error variants so a failed fetch/search isn't\n // invisible to the consumer.\n const content = event.content_block.content as\n | { type?: string; error_code?: string }\n | Array<unknown>\n const errorBlock =\n !Array.isArray(content) &&\n (content.type === 'web_fetch_tool_result_error' ||\n content.type === 'web_search_tool_result_error')\n ? content\n : null\n if (errorBlock) {\n logger.errors(\n `anthropic.${event.content_block.type} error_code=${errorBlock.error_code}`,\n {\n toolUseId: event.content_block.tool_use_id,\n blockType: event.content_block.type,\n errorCode: errorBlock.error_code,\n source: 'anthropic.processAnthropicStream',\n },\n )\n }\n\n // Emit the server tool as a single provider-executed tool call,\n // carrying its raw result so the evidence (e.g. web_search sources)\n // round-trips into the next turn's request. The agent loop skips\n // provider-executed calls, so this never triggers client execution.\n const serverTool = completedServerTools.get(\n event.content_block.tool_use_id,\n )\n if (serverTool) {\n completedServerTools.delete(serverTool.id)\n\n let parsedInput: unknown = {}\n try {\n const parsed = serverTool.input\n ? JSON.parse(serverTool.input)\n : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = {}\n }\n\n const serverToolMetadata = {\n providerExecuted: true,\n anthropic: {\n serverToolType: serverTool.name,\n resultBlockType: event.content_block.type,\n result: content,\n },\n }\n\n currentToolIndex++\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: serverTool.id,\n toolCallName: serverTool.name,\n toolName: serverTool.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n metadata: serverToolMetadata,\n }\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: serverTool.id,\n toolCallName: serverTool.name,\n toolName: serverTool.name,\n model,\n timestamp: Date.now(),\n input: parsedInput,\n }\n\n // Text after the server tool starts a fresh message segment.\n hasEmittedTextMessageStart = false\n }\n } else if (event.content_block.type === 'thinking') {\n accumulatedThinking = ''\n accumulatedSignature = ''\n // Emit REASONING and STEP_STARTED for thinking\n stepId = genId()\n reasoningMessageId = genId()\n\n // Spec REASONING events\n yield {\n type: EventType.REASONING_START,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_MESSAGE_START,\n messageId: reasoningMessageId,\n role: 'reasoning' as const,\n model,\n timestamp: Date.now(),\n }\n\n // Legacy STEP events (kept during transition)\n yield {\n type: EventType.STEP_STARTED,\n stepName: stepId,\n stepId,\n model,\n timestamp: Date.now(),\n stepType: 'thinking',\n }\n }\n } else if (event.type === 'content_block_delta') {\n if (event.delta.type === 'text_delta') {\n // Close reasoning before text starts\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n // Emit TEXT_MESSAGE_START on first text content\n if (!hasEmittedTextMessageStart) {\n hasEmittedTextMessageStart = true\n yield {\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n model,\n timestamp: Date.now(),\n role: 'assistant',\n }\n }\n\n const delta = event.delta.text\n accumulatedContent += delta\n yield {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n model,\n timestamp: Date.now(),\n delta,\n content: accumulatedContent,\n }\n } else if (\n event.delta.type === 'thinking_delta' &&\n reasoningMessageId\n ) {\n const delta = event.delta.thinking\n accumulatedThinking += delta\n\n // Spec REASONING content event\n yield {\n type: EventType.REASONING_MESSAGE_CONTENT,\n messageId: reasoningMessageId,\n delta,\n model,\n timestamp: Date.now(),\n }\n\n // Legacy STEP event\n yield {\n type: EventType.STEP_FINISHED,\n stepName: stepId || genId(),\n stepId: stepId || genId(),\n model,\n timestamp: Date.now(),\n delta,\n content: accumulatedThinking,\n }\n } else if (\n (event.delta as { type: string }).type === 'signature_delta'\n ) {\n accumulatedSignature +=\n (event.delta as { signature: string }).signature || ''\n } else if (event.delta.type === 'input_json_delta') {\n // Route deltas by current block type so server_tool_use input\n // never appends onto the prior client tool's buffer.\n if (currentBlockType === 'tool_use') {\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing) {\n // Emit TOOL_CALL_START on first args delta\n if (!existing.started) {\n existing.started = true\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n }\n }\n\n existing.input += event.delta.partial_json\n\n yield {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: existing.id,\n model,\n timestamp: Date.now(),\n delta: event.delta.partial_json,\n args: existing.input,\n }\n }\n } else if (\n currentBlockType === 'server_tool_use' &&\n currentServerTool\n ) {\n // Accumulate server tool input internally. We don't emit\n // TOOL_CALL_* events: the call is executed by Anthropic, not\n // by our agent loop, so surfacing it as a client tool call\n // would cause downstream code to try (and fail) to run it.\n currentServerTool.input += event.delta.partial_json\n }\n }\n } else if (event.type === 'content_block_stop') {\n if (currentBlockType === 'thinking') {\n // Emit signature so it can be replayed in multi-turn context\n if (accumulatedSignature && stepId) {\n yield {\n type: EventType.STEP_FINISHED,\n stepName: stepId,\n stepId,\n model,\n timestamp: Date.now(),\n delta: '',\n content: accumulatedThinking,\n signature: accumulatedSignature,\n }\n }\n } else if (currentBlockType === 'tool_use') {\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing) {\n // If tool call wasn't started yet (no args), start it now\n if (!existing.started) {\n existing.started = true\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n parentMessageId: messageId,\n model,\n timestamp: Date.now(),\n index: currentToolIndex,\n }\n }\n\n // Emit TOOL_CALL_END\n let parsedInput: unknown = {}\n try {\n const parsed = existing.input ? JSON.parse(existing.input) : {}\n parsedInput = parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n parsedInput = {}\n }\n\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: existing.id,\n toolCallName: existing.name,\n toolName: existing.name,\n model,\n timestamp: Date.now(),\n input: parsedInput,\n }\n\n // Reset so a new TEXT_MESSAGE_START is emitted if text follows tool calls\n hasEmittedTextMessageStart = false\n }\n } else if (currentBlockType === 'server_tool_use') {\n if (currentServerTool) {\n // Anthropic executes the call; we only need a breadcrumb so\n // consumers (devtools, telemetry) can see what ran.\n logger.provider(\n `provider=anthropic server_tool_use name=${currentServerTool.name}`,\n {\n toolUseId: currentServerTool.id,\n name: currentServerTool.name,\n input: currentServerTool.input,\n },\n )\n // Hold the call until its result block arrives so we can emit\n // both together as one provider-executed tool call.\n completedServerTools.set(currentServerTool.id, currentServerTool)\n }\n currentServerTool = null\n } else if (\n currentBlockType === 'web_fetch_tool_result' ||\n currentBlockType === 'web_search_tool_result'\n ) {\n // The model already consumed the result; error variants were\n // already surfaced at content_block_start.\n } else {\n // Emit TEXT_MESSAGE_END only for text blocks (not tool_use blocks)\n if (hasEmittedTextMessageStart && accumulatedContent) {\n yield {\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n model,\n timestamp: Date.now(),\n }\n }\n }\n currentBlockType = null\n } else if (event.type === 'message_stop') {\n // Close reasoning events if still open\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n // Only emit RUN_FINISHED from message_stop if message_delta didn't already emit one.\n // message_delta carries the real stop_reason (tool_use, end_turn, etc.),\n // while message_stop is just a completion signal.\n if (!hasEmittedRunFinished) {\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'stop',\n }\n }\n } else if (event.type === 'message_delta') {\n if (event.delta.stop_reason) {\n hasEmittedRunFinished = true\n\n // Close reasoning events if still open\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n yield {\n type: EventType.REASONING_END,\n messageId: reasoningMessageId,\n model,\n timestamp: Date.now(),\n }\n }\n\n switch (event.delta.stop_reason) {\n case 'tool_use': {\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'tool_calls',\n usage: buildAnthropicUsage(event.usage),\n }\n break\n }\n case 'max_tokens': {\n // Surface a warning when the truncating cap was the\n // adapter-supplied default (caller didn't pass `max_tokens`), so\n // the truncation isn't silently attributed to the model \"doing\n // nothing\" (issue #849). When the caller set `max_tokens`\n // themselves, hitting it is their own deliberate ceiling.\n if (options.modelOptions?.max_tokens == null) {\n const defaultedMaxTokens = getAnthropicDefaultMaxTokens(model)\n logger.warn(\n `anthropic response truncated at the default max_tokens (${defaultedMaxTokens}) for model=${model}; pass maxTokens (or modelOptions.max_tokens) to raise the output ceiling`,\n {\n source: 'anthropic.processAnthropicStream',\n model,\n defaultedMaxTokens,\n },\n )\n }\n yield {\n type: EventType.RUN_ERROR,\n model,\n timestamp: Date.now(),\n message:\n 'The response was cut off because the maximum token limit was reached.',\n code: 'max_tokens',\n error: {\n message:\n 'The response was cut off because the maximum token limit was reached.',\n code: 'max_tokens',\n },\n }\n break\n }\n case 'stop_sequence':\n case 'end_turn':\n case 'pause_turn':\n case 'refusal':\n case 'model_context_window_exceeded':\n case 'compaction':\n default: {\n // All remaining Anthropic stop_reason variants map to the\n // generic \"stop\" finish reason — they describe *why* the\n // stream ended, but for AG-UI consumers the resulting event\n // shape is identical.\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: buildAnthropicUsage(event.usage),\n }\n }\n }\n }\n }\n }\n } catch (error: unknown) {\n const err = error as Error & { status?: number; code?: string }\n const rawEvent = toRunErrorRawEvent(error)\n\n logger.errors('anthropic.processAnthropicStream fatal', {\n error,\n source: 'anthropic.processAnthropicStream',\n })\n yield {\n type: EventType.RUN_ERROR,\n model,\n timestamp: Date.now(),\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n // Forward the Anthropic SDK error's `.error` response body when present.\n ...(rawEvent !== undefined && { rawEvent }),\n error: {\n message: err.message || 'Unknown error occurred',\n code: err.code || String(err.status),\n },\n }\n }\n }\n}\n\n/**\n * Creates an Anthropic chat adapter with explicit API key.\n * Type resolution happens here at the call site.\n */\nexport function createAnthropicChat<\n TModel extends (typeof ANTHROPIC_MODELS)[number],\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<AnthropicTextConfig, 'apiKey'>,\n): AnthropicTextAdapter<\n TModel,\n ResolveProviderOptions<TModel>,\n ResolveInputModalities<TModel>\n> {\n return new AnthropicTextAdapter({ apiKey, ...config }, model)\n}\n\n/**\n * Creates an Anthropic text adapter with automatic API key detection.\n * Type resolution happens here at the call site.\n */\nexport function anthropicText<TModel extends (typeof ANTHROPIC_MODELS)[number]>(\n model: TModel,\n config?: Omit<AnthropicTextConfig, 'apiKey'>,\n): AnthropicTextAdapter<\n TModel,\n ResolveProviderOptions<TModel>,\n ResolveInputModalities<TModel>\n> {\n const apiKey = getAnthropicApiKeyFromEnv()\n return createAnthropicChat(model, apiKey, config)\n}\n"],"mappings":"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"}
|
package/dist/esm/model-meta.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnthropicAdaptiveOnlyThinkingOptions, AnthropicAdaptiveOrDisabledThinkingOptions, AnthropicAdaptiveThinkingOptions, AnthropicContainerOptions, AnthropicContextManagementOptions, AnthropicMCPOptions, AnthropicMaxTokensOptions, AnthropicOutputConfigOptions, AnthropicSamplingOptions, AnthropicServiceTierOptions, AnthropicStopSequencesOptions, AnthropicThinkingOptions, AnthropicToolChoiceOptions } from './text/text-provider-options.js';
|
|
1
|
+
import { AnthropicAdaptiveOnlyThinkingOptions, AnthropicAdaptiveOrDisabledThinkingOptions, AnthropicAdaptiveThinkingOptions, AnthropicCacheControlOptions, AnthropicContainerOptions, AnthropicContextManagementOptions, AnthropicMCPOptions, AnthropicMaxTokensOptions, AnthropicOutputConfigOptions, AnthropicSamplingOptions, AnthropicServiceTierOptions, AnthropicStopSequencesOptions, AnthropicThinkingOptions, AnthropicToolChoiceOptions } from './text/text-provider-options.js';
|
|
2
2
|
declare const CLAUDE_OPUS_4_6: {
|
|
3
3
|
readonly name: "claude-opus-4-6";
|
|
4
4
|
readonly id: "claude-opus-4-6";
|
|
@@ -224,7 +224,45 @@ declare const CLAUDE_SONNET_5: {
|
|
|
224
224
|
* via the `speed` parameter, not a model id) were removed after Anthropic
|
|
225
225
|
* turned them off.
|
|
226
226
|
*/
|
|
227
|
-
|
|
227
|
+
declare const CLAUDE_OPUS_5: {
|
|
228
|
+
readonly name: "claude-opus-5";
|
|
229
|
+
readonly id: "claude-opus-5";
|
|
230
|
+
readonly context_window: 1000000;
|
|
231
|
+
readonly max_output_tokens: 128000;
|
|
232
|
+
readonly supports: {
|
|
233
|
+
readonly input: ["text", "image", "document"];
|
|
234
|
+
readonly tools: [];
|
|
235
|
+
};
|
|
236
|
+
readonly pricing: {
|
|
237
|
+
readonly input: {
|
|
238
|
+
readonly normal: 5;
|
|
239
|
+
readonly cached: 0.5;
|
|
240
|
+
};
|
|
241
|
+
readonly output: {
|
|
242
|
+
readonly normal: 25;
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
declare const CLAUDE_OPUS_5_FAST: {
|
|
247
|
+
readonly name: "claude-opus-5-fast";
|
|
248
|
+
readonly id: "claude-opus-5-fast";
|
|
249
|
+
readonly context_window: 1000000;
|
|
250
|
+
readonly max_output_tokens: 128000;
|
|
251
|
+
readonly supports: {
|
|
252
|
+
readonly input: ["text", "image", "document"];
|
|
253
|
+
readonly tools: [];
|
|
254
|
+
};
|
|
255
|
+
readonly pricing: {
|
|
256
|
+
readonly input: {
|
|
257
|
+
readonly normal: 10;
|
|
258
|
+
readonly cached: 1;
|
|
259
|
+
};
|
|
260
|
+
readonly output: {
|
|
261
|
+
readonly normal: 50;
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
export declare const ANTHROPIC_MODELS: readonly ["claude-opus-5", "claude-opus-5-fast", "claude-opus-4-6", "claude-opus-4-5", "claude-sonnet-4-6", "claude-sonnet-4-5", "claude-haiku-4-5", "claude-opus-4-1", "claude-opus-4-7", "claude-opus-4-8", "claude-fable-5", "claude-sonnet-5"];
|
|
228
266
|
/**
|
|
229
267
|
* Fallback `max_tokens` ceiling for a model whose metadata carries no
|
|
230
268
|
* `max_output_tokens` (e.g. an unrecognized model id). Anthropic's Messages
|
|
@@ -277,16 +315,18 @@ export declare function getAnthropicDefaultMaxTokens(model: string, { stream }?:
|
|
|
277
315
|
export declare const ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS: Set<string>;
|
|
278
316
|
export type AnthropicChatModel = (typeof ANTHROPIC_MODELS)[number];
|
|
279
317
|
export type AnthropicChatModelProviderOptionsByName = {
|
|
280
|
-
[CLAUDE_OPUS_4_6.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
281
|
-
[CLAUDE_SONNET_4_6.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
282
|
-
[CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
283
|
-
[CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
284
|
-
[CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
285
|
-
[CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
286
|
-
[CLAUDE_OPUS_4_7.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
287
|
-
[CLAUDE_OPUS_4_8.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
288
|
-
[CLAUDE_FABLE_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOnlyThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
289
|
-
[CLAUDE_SONNET_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
318
|
+
[CLAUDE_OPUS_4_6.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
319
|
+
[CLAUDE_SONNET_4_6.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
320
|
+
[CLAUDE_OPUS_4_5.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
321
|
+
[CLAUDE_SONNET_4_5.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
322
|
+
[CLAUDE_HAIKU_4_5.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
323
|
+
[CLAUDE_OPUS_4_1.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
324
|
+
[CLAUDE_OPUS_4_7.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
325
|
+
[CLAUDE_OPUS_4_8.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
326
|
+
[CLAUDE_FABLE_5.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOnlyThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
327
|
+
[CLAUDE_SONNET_5.id]: AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicAdaptiveOrDisabledThinkingOptions & AnthropicToolChoiceOptions & AnthropicMaxTokensOptions & AnthropicOutputConfigOptions;
|
|
328
|
+
[CLAUDE_OPUS_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
329
|
+
[CLAUDE_OPUS_5_FAST.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions;
|
|
290
330
|
};
|
|
291
331
|
export type AnthropicChatModelToolCapabilitiesByName = {
|
|
292
332
|
[CLAUDE_OPUS_4_6.id]: typeof CLAUDE_OPUS_4_6.supports.tools;
|
|
@@ -299,6 +339,8 @@ export type AnthropicChatModelToolCapabilitiesByName = {
|
|
|
299
339
|
[CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.tools;
|
|
300
340
|
[CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.tools;
|
|
301
341
|
[CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.tools;
|
|
342
|
+
[CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.tools;
|
|
343
|
+
[CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.tools;
|
|
302
344
|
};
|
|
303
345
|
/**
|
|
304
346
|
* Type-only map from chat model name to its supported input modalities.
|
|
@@ -322,5 +364,7 @@ export type AnthropicModelInputModalitiesByName = {
|
|
|
322
364
|
[CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.input;
|
|
323
365
|
[CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.input;
|
|
324
366
|
[CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.input;
|
|
367
|
+
[CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.input;
|
|
368
|
+
[CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.input;
|
|
325
369
|
};
|
|
326
370
|
export {};
|
package/dist/esm/model-meta.js
CHANGED
|
@@ -312,7 +312,51 @@ var CLAUDE_SONNET_5 = {
|
|
|
312
312
|
* via the `speed` parameter, not a model id) were removed after Anthropic
|
|
313
313
|
* turned them off.
|
|
314
314
|
*/
|
|
315
|
+
var CLAUDE_OPUS_5 = {
|
|
316
|
+
name: "claude-opus-5",
|
|
317
|
+
id: "claude-opus-5",
|
|
318
|
+
context_window: 1e6,
|
|
319
|
+
max_output_tokens: 128e3,
|
|
320
|
+
supports: {
|
|
321
|
+
input: [
|
|
322
|
+
"text",
|
|
323
|
+
"image",
|
|
324
|
+
"document"
|
|
325
|
+
],
|
|
326
|
+
tools: []
|
|
327
|
+
},
|
|
328
|
+
pricing: {
|
|
329
|
+
input: {
|
|
330
|
+
normal: 5,
|
|
331
|
+
cached: .5
|
|
332
|
+
},
|
|
333
|
+
output: { normal: 25 }
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
var CLAUDE_OPUS_5_FAST = {
|
|
337
|
+
name: "claude-opus-5-fast",
|
|
338
|
+
id: "claude-opus-5-fast",
|
|
339
|
+
context_window: 1e6,
|
|
340
|
+
max_output_tokens: 128e3,
|
|
341
|
+
supports: {
|
|
342
|
+
input: [
|
|
343
|
+
"text",
|
|
344
|
+
"image",
|
|
345
|
+
"document"
|
|
346
|
+
],
|
|
347
|
+
tools: []
|
|
348
|
+
},
|
|
349
|
+
pricing: {
|
|
350
|
+
input: {
|
|
351
|
+
normal: 10,
|
|
352
|
+
cached: 1
|
|
353
|
+
},
|
|
354
|
+
output: { normal: 50 }
|
|
355
|
+
}
|
|
356
|
+
};
|
|
315
357
|
var ANTHROPIC_MODELS = [
|
|
358
|
+
CLAUDE_OPUS_5.id,
|
|
359
|
+
CLAUDE_OPUS_5_FAST.id,
|
|
316
360
|
CLAUDE_OPUS_4_6.id,
|
|
317
361
|
CLAUDE_OPUS_4_5.id,
|
|
318
362
|
CLAUDE_SONNET_4_6.id,
|
|
@@ -357,7 +401,9 @@ var ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS = {
|
|
|
357
401
|
[CLAUDE_OPUS_4_7.id]: CLAUDE_OPUS_4_7.max_output_tokens,
|
|
358
402
|
[CLAUDE_OPUS_4_8.id]: CLAUDE_OPUS_4_8.max_output_tokens,
|
|
359
403
|
[CLAUDE_FABLE_5.id]: CLAUDE_FABLE_5.max_output_tokens,
|
|
360
|
-
[CLAUDE_SONNET_5.id]: CLAUDE_SONNET_5.max_output_tokens
|
|
404
|
+
[CLAUDE_SONNET_5.id]: CLAUDE_SONNET_5.max_output_tokens,
|
|
405
|
+
[CLAUDE_OPUS_5.id]: CLAUDE_OPUS_5.max_output_tokens,
|
|
406
|
+
[CLAUDE_OPUS_5_FAST.id]: CLAUDE_OPUS_5_FAST.max_output_tokens
|
|
361
407
|
};
|
|
362
408
|
/**
|
|
363
409
|
* Largest `max_tokens` the Anthropic SDK permits on a **non-streaming**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-meta.js","names":[],"sources":["../../src/model-meta.ts"],"sourcesContent":["import type {\n AnthropicAdaptiveOnlyThinkingOptions,\n AnthropicAdaptiveOrDisabledThinkingOptions,\n AnthropicAdaptiveThinkingOptions,\n AnthropicContainerOptions,\n AnthropicContextManagementOptions,\n AnthropicMCPOptions,\n AnthropicMaxTokensOptions,\n AnthropicOutputConfigOptions,\n AnthropicSamplingOptions,\n AnthropicServiceTierOptions,\n AnthropicStopSequencesOptions,\n AnthropicThinkingOptions,\n AnthropicToolChoiceOptions,\n} from './text/text-provider-options'\n\ninterface ModelMeta<\n TProviderOptions = unknown,\n TToolCapabilities = unknown,\n TMessageCapabilities = unknown,\n> {\n name: string\n id: string\n supports: {\n input: Array<'text' | 'image' | 'audio' | 'video' | 'document'>\n extended_thinking?: boolean\n adaptive_thinking?: boolean\n priority_tier?: boolean\n tools?: Array<\n | 'web_search'\n | 'web_fetch'\n | 'code_execution'\n | 'computer_use'\n | 'bash'\n | 'text_editor'\n | 'memory'\n >\n }\n context_window?: number\n max_output_tokens?: number\n knowledge_cutoff?: string\n pricing: {\n input: {\n normal: number\n cached?: number\n }\n output: {\n normal: number\n }\n }\n /**\n * Type-level description of which provider options this model supports.\n */\n providerOptions?: TProviderOptions\n /**\n * Type-level description of which tool capabilities this model supports.\n */\n toolCapabilities?: TToolCapabilities\n /**\n * Type-level description of which message/input capabilities this model supports.\n */\n messageCapabilities?: TMessageCapabilities\n}\n\n// Claude Opus 4.6 accepts adaptive thinking alongside the deprecated\n// budget-based extended thinking, and still accepts sampling parameters.\nconst CLAUDE_OPUS_4_6 = {\n name: 'claude-opus-4-6',\n id: 'claude-opus-4-6',\n context_window: 200_000,\n max_output_tokens: 128_000,\n knowledge_cutoff: '2025-05-01',\n pricing: {\n input: {\n normal: 5,\n },\n output: {\n normal: 25,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_OPUS_4_5 = {\n name: 'claude-opus-4-5',\n id: 'claude-opus-4-5',\n context_window: 200_000,\n max_output_tokens: 32_000,\n knowledge_cutoff: '2025-11-01',\n pricing: {\n input: {\n normal: 15,\n },\n output: {\n normal: 75,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\n// Claude Sonnet 4.6 accepts adaptive thinking alongside the deprecated\n// budget-based extended thinking, and still accepts sampling parameters.\nconst CLAUDE_SONNET_4_6 = {\n name: 'claude-sonnet-4-6',\n id: 'claude-sonnet-4-6',\n context_window: 1_000_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-08-01',\n pricing: {\n input: {\n normal: 3,\n },\n output: {\n normal: 15,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_SONNET_4_5 = {\n name: 'claude-sonnet-4-5',\n id: 'claude-sonnet-4-5',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-09-29',\n pricing: {\n input: {\n normal: 3,\n },\n output: {\n normal: 15,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_HAIKU_4_5 = {\n name: 'claude-haiku-4-5',\n id: 'claude-haiku-4-5',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-10-01',\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 5,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_OPUS_4_1 = {\n name: 'claude-opus-4-1',\n id: 'claude-opus-4-1',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-08-05',\n pricing: {\n input: {\n normal: 15,\n },\n output: {\n normal: 75,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\n// Claude Opus 4.7 removed budget-based extended thinking and the sampling\n// parameters (`temperature`, `top_p`, `top_k`) — sending either returns a\n// 400. Use adaptive thinking with `output_config.effort` instead.\nconst CLAUDE_OPUS_4_7 = {\n name: 'claude-opus-4-7',\n id: 'claude-opus-4-7',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 5,\n cached: 0.5,\n },\n output: {\n normal: 25,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Opus 4.8 keeps the same request surface as Opus 4.7: adaptive\n// thinking only (budget_tokens 400s), no sampling parameters.\nconst CLAUDE_OPUS_4_8 = {\n name: 'claude-opus-4-8',\n id: 'claude-opus-4-8',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 5,\n cached: 0.5,\n },\n output: {\n normal: 25,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Fable 5: thinking is always on — the only accepted explicit\n// `thinking` config is `{type: 'adaptive'}` (disabled/budget_tokens 400),\n// and the sampling parameters (`temperature`, `top_p`, `top_k`) are\n// rejected. Its provider options therefore use the adaptive-only thinking\n// shape and `max_tokens` without the sampling knobs.\nconst CLAUDE_FABLE_5 = {\n name: 'claude-fable-5',\n id: 'claude-fable-5',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 10,\n cached: 1,\n },\n output: {\n normal: 50,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOnlyThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Sonnet 5: adaptive thinking is the default (omitting `thinking`\n// runs adaptive); `{type: 'disabled'}` opts out, but the manual\n// `{type: 'enabled', budget_tokens}` shape and non-default sampling\n// parameters (`temperature`, `top_p`, `top_k`) are rejected with a 400.\n// Pricing below is the sticker $3/$15 per MTok (an introductory $2/$10\n// applies through 2026-08-31).\nconst CLAUDE_SONNET_5 = {\n name: 'claude-sonnet-5',\n id: 'claude-sonnet-5',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 3,\n cached: 0.3,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n/**\n * Model ids accepted by the Anthropic text adapter.\n *\n * Every id here resolves against the first-party Anthropic API\n * (`GET /v1/models/{id}`). Retired models (Claude 3.x, Sonnet 3.7,\n * Opus 4 / Sonnet 4) and the `-fast` variant ids (fast mode is requested\n * via the `speed` parameter, not a model id) were removed after Anthropic\n * turned them off.\n */\nexport const ANTHROPIC_MODELS = [\n CLAUDE_OPUS_4_6.id,\n CLAUDE_OPUS_4_5.id,\n CLAUDE_SONNET_4_6.id,\n CLAUDE_SONNET_4_5.id,\n CLAUDE_HAIKU_4_5.id,\n CLAUDE_OPUS_4_1.id,\n\n CLAUDE_OPUS_4_7.id,\n CLAUDE_OPUS_4_8.id,\n\n CLAUDE_FABLE_5.id,\n CLAUDE_SONNET_5.id,\n] as const\n\n/**\n * Fallback `max_tokens` ceiling for a model whose metadata carries no\n * `max_output_tokens` (e.g. an unrecognized model id). Anthropic's Messages\n * API *requires* `max_tokens`, so the adapter must always send a value. 64K is\n * the output ceiling of the current mainstream Claude tier (Sonnet/Haiku 4.5),\n * so it's a sane default for an unknown — almost certainly modern — model and\n * avoids silently truncating long generations (issue #849). Recognized models\n * use their exact `max_output_tokens` from {@link ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS}\n * (e.g. 128K for Opus), so this fallback only ever applies to ids not in the\n * map.\n */\nexport const ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS = 64_000\n\n/**\n * Runtime lookup of each model's maximum output-token ceiling, keyed by model\n * id. Lets the text adapter default the required `max_tokens` request field to\n * the model's real ceiling when the caller doesn't specify one, rather than a\n * low constant that truncates responses mid-stream (issue #849).\n *\n * Kept in sync with {@link ANTHROPIC_MODELS} by `scripts/sync-provider-models.ts`\n * — when that script adds a model it also inserts the model's `max_output_tokens`\n * here, so a freshly-synced model resolves to its real ceiling rather than the\n * fallback above.\n */\nconst ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS: Record<string, number> = {\n [CLAUDE_OPUS_4_6.id]: CLAUDE_OPUS_4_6.max_output_tokens,\n [CLAUDE_OPUS_4_5.id]: CLAUDE_OPUS_4_5.max_output_tokens,\n [CLAUDE_SONNET_4_6.id]: CLAUDE_SONNET_4_6.max_output_tokens,\n [CLAUDE_SONNET_4_5.id]: CLAUDE_SONNET_4_5.max_output_tokens,\n [CLAUDE_HAIKU_4_5.id]: CLAUDE_HAIKU_4_5.max_output_tokens,\n [CLAUDE_OPUS_4_1.id]: CLAUDE_OPUS_4_1.max_output_tokens,\n [CLAUDE_OPUS_4_7.id]: CLAUDE_OPUS_4_7.max_output_tokens,\n [CLAUDE_OPUS_4_8.id]: CLAUDE_OPUS_4_8.max_output_tokens,\n [CLAUDE_FABLE_5.id]: CLAUDE_FABLE_5.max_output_tokens,\n [CLAUDE_SONNET_5.id]: CLAUDE_SONNET_5.max_output_tokens,\n}\n\n/**\n * Largest `max_tokens` the Anthropic SDK permits on a **non-streaming**\n * request. The SDK refuses to make a non-streaming call it estimates could\n * exceed its 10-minute timeout, computed as\n * `(60min * max_tokens) / 128_000 > 10min` — i.e. it throws\n * `\"Streaming is required for operations that may take longer than 10 minutes\"`\n * once `max_tokens > 128_000 * 10 / 60 ≈ 21_333`\n * (`@anthropic-ai/sdk`'s `calculateNonstreamingTimeout`). The text adapter's\n * only non-streaming call is the forced-tool `structuredOutput()` request, so\n * its defaulted ceiling must stay at or below this; the streaming chat path\n * keeps the model's full {@link getAnthropicDefaultMaxTokens} ceiling. We sit\n * just under the boundary (`21_333` would round-trip to exactly 10min). This\n * caps only the *default* — an explicit oversized `max_tokens` from the caller\n * still surfaces the SDK's \"use streaming\" error, which is the correct signal.\n */\nexport const ANTHROPIC_MAX_NONSTREAMING_TOKENS = 21_000\n\n/**\n * Resolve the default `max_tokens` for a model: its known `max_output_tokens`\n * ceiling, or {@link ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS} for unknown models.\n * Callers that pass an explicit `max_tokens` bypass this entirely.\n *\n * Pass `stream: false` for non-streaming requests (the `structuredOutput()`\n * path): the result is then clamped to {@link ANTHROPIC_MAX_NONSTREAMING_TOKENS}\n * so the defaulted ceiling doesn't trip the SDK's non-streaming 10-minute guard\n * (issue #849). Streaming requests (the default) are unaffected and get the\n * model's full ceiling.\n */\nexport function getAnthropicDefaultMaxTokens(\n model: string,\n { stream = true }: { stream?: boolean } = {},\n): number {\n const ceiling =\n ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS[model] ??\n ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS\n return stream ? ceiling : Math.min(ceiling, ANTHROPIC_MAX_NONSTREAMING_TOKENS)\n}\n\n/**\n * Anthropic models that support combining `tools` + JSON-Schema-constrained\n * output in a single streaming Messages request (per issue #605). GA'd\n * 2026-01-29 for Claude 4.5+ via `output_format` on the beta messages\n * endpoint. Older Claude models still need the forced-tool-use workaround\n * in `structuredOutput`.\n */\nexport const ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([\n CLAUDE_OPUS_4_5.id,\n CLAUDE_OPUS_4_6.id,\n CLAUDE_OPUS_4_7.id,\n CLAUDE_OPUS_4_8.id,\n CLAUDE_FABLE_5.id,\n CLAUDE_SONNET_5.id,\n CLAUDE_SONNET_4_5.id,\n CLAUDE_SONNET_4_6.id,\n CLAUDE_HAIKU_4_5.id,\n])\n\n// const ANTHROPIC_IMAGE_MODELS = [] as const\n// const ANTHROPIC_EMBEDDING_MODELS = [] as const\n// const ANTHROPIC_AUDIO_MODELS = [] as const\n// const ANTHROPIC_VIDEO_MODELS = [] as const\n\nexport type AnthropicChatModel = (typeof ANTHROPIC_MODELS)[number]\n// Manual type map for per-model provider options\n// Models are differentiated by which thinking shapes and sampling\n// parameters the API accepts.\nexport type AnthropicChatModelProviderOptionsByName = {\n // 4.6 generation: adaptive thinking plus the deprecated budget-based\n // shape; sampling parameters still accepted.\n [CLAUDE_OPUS_4_6.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_SONNET_4_6.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Pre-4.6 models: budget-based extended thinking and sampling parameters.\n [CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Opus 4.7/4.8: adaptive thinking (or explicit disable), no\n // budget_tokens, no sampling parameters — see the constants above.\n [CLAUDE_OPUS_4_7.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n [CLAUDE_OPUS_4_8.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n\n // Claude Fable 5: thinking always on (adaptive-only config); sampling\n // parameters removed — see the CLAUDE_FABLE_5 constant above.\n [CLAUDE_FABLE_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOnlyThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n // Claude Sonnet 5: adaptive thinking by default, explicit disable\n // allowed; no budget_tokens, no sampling parameters — see the\n // CLAUDE_SONNET_5 constant above.\n [CLAUDE_SONNET_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n}\n\nexport type AnthropicChatModelToolCapabilitiesByName = {\n [CLAUDE_OPUS_4_6.id]: typeof CLAUDE_OPUS_4_6.supports.tools\n [CLAUDE_OPUS_4_5.id]: typeof CLAUDE_OPUS_4_5.supports.tools\n [CLAUDE_SONNET_4_6.id]: typeof CLAUDE_SONNET_4_6.supports.tools\n [CLAUDE_SONNET_4_5.id]: typeof CLAUDE_SONNET_4_5.supports.tools\n [CLAUDE_HAIKU_4_5.id]: typeof CLAUDE_HAIKU_4_5.supports.tools\n [CLAUDE_OPUS_4_1.id]: typeof CLAUDE_OPUS_4_1.supports.tools\n [CLAUDE_OPUS_4_7.id]: typeof CLAUDE_OPUS_4_7.supports.tools\n [CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.tools\n [CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.tools\n [CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.tools\n}\n\n/**\n * Type-only map from chat model name to its supported input modalities.\n * All Anthropic Claude models support text, image, and document (PDF) input.\n * Used by the core AI types to constrain ContentPart types based on the selected model.\n * Note: These must be inlined as readonly arrays (not typeof) because the model\n * constants are not exported and typeof references don't work in .d.ts files\n * when consumed by external packages.\n *\n * @see https://docs.anthropic.com/claude/docs/vision\n * @see https://docs.anthropic.com/claude/docs/pdf-support\n */\nexport type AnthropicModelInputModalitiesByName = {\n [CLAUDE_OPUS_4_6.id]: typeof CLAUDE_OPUS_4_6.supports.input\n [CLAUDE_OPUS_4_5.id]: typeof CLAUDE_OPUS_4_5.supports.input\n [CLAUDE_SONNET_4_6.id]: typeof CLAUDE_SONNET_4_6.supports.input\n [CLAUDE_SONNET_4_5.id]: typeof CLAUDE_SONNET_4_5.supports.input\n [CLAUDE_HAIKU_4_5.id]: typeof CLAUDE_HAIKU_4_5.supports.input\n [CLAUDE_OPUS_4_1.id]: typeof CLAUDE_OPUS_4_1.supports.input\n [CLAUDE_OPUS_4_7.id]: typeof CLAUDE_OPUS_4_7.supports.input\n [CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.input\n [CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.input\n [CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.input\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-meta.js","names":[],"sources":["../../src/model-meta.ts"],"sourcesContent":["import type {\n AnthropicAdaptiveOnlyThinkingOptions,\n AnthropicAdaptiveOrDisabledThinkingOptions,\n AnthropicAdaptiveThinkingOptions,\n AnthropicCacheControlOptions,\n AnthropicContainerOptions,\n AnthropicContextManagementOptions,\n AnthropicMCPOptions,\n AnthropicMaxTokensOptions,\n AnthropicOutputConfigOptions,\n AnthropicSamplingOptions,\n AnthropicServiceTierOptions,\n AnthropicStopSequencesOptions,\n AnthropicThinkingOptions,\n AnthropicToolChoiceOptions,\n} from './text/text-provider-options'\n\ninterface ModelMeta<\n TProviderOptions = unknown,\n TToolCapabilities = unknown,\n TMessageCapabilities = unknown,\n> {\n name: string\n id: string\n supports: {\n input: Array<'text' | 'image' | 'audio' | 'video' | 'document'>\n extended_thinking?: boolean\n adaptive_thinking?: boolean\n priority_tier?: boolean\n tools?: Array<\n | 'web_search'\n | 'web_fetch'\n | 'code_execution'\n | 'computer_use'\n | 'bash'\n | 'text_editor'\n | 'memory'\n >\n }\n context_window?: number\n max_output_tokens?: number\n knowledge_cutoff?: string\n pricing: {\n input: {\n normal: number\n cached?: number\n }\n output: {\n normal: number\n }\n }\n /**\n * Type-level description of which provider options this model supports.\n */\n providerOptions?: TProviderOptions\n /**\n * Type-level description of which tool capabilities this model supports.\n */\n toolCapabilities?: TToolCapabilities\n /**\n * Type-level description of which message/input capabilities this model supports.\n */\n messageCapabilities?: TMessageCapabilities\n}\n\n// Claude Opus 4.6 accepts adaptive thinking alongside the deprecated\n// budget-based extended thinking, and still accepts sampling parameters.\nconst CLAUDE_OPUS_4_6 = {\n name: 'claude-opus-4-6',\n id: 'claude-opus-4-6',\n context_window: 200_000,\n max_output_tokens: 128_000,\n knowledge_cutoff: '2025-05-01',\n pricing: {\n input: {\n normal: 5,\n },\n output: {\n normal: 25,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_OPUS_4_5 = {\n name: 'claude-opus-4-5',\n id: 'claude-opus-4-5',\n context_window: 200_000,\n max_output_tokens: 32_000,\n knowledge_cutoff: '2025-11-01',\n pricing: {\n input: {\n normal: 15,\n },\n output: {\n normal: 75,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\n// Claude Sonnet 4.6 accepts adaptive thinking alongside the deprecated\n// budget-based extended thinking, and still accepts sampling parameters.\nconst CLAUDE_SONNET_4_6 = {\n name: 'claude-sonnet-4-6',\n id: 'claude-sonnet-4-6',\n context_window: 1_000_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-08-01',\n pricing: {\n input: {\n normal: 3,\n },\n output: {\n normal: 15,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_SONNET_4_5 = {\n name: 'claude-sonnet-4-5',\n id: 'claude-sonnet-4-5',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-09-29',\n pricing: {\n input: {\n normal: 3,\n },\n output: {\n normal: 15,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_HAIKU_4_5 = {\n name: 'claude-haiku-4-5',\n id: 'claude-haiku-4-5',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-10-01',\n pricing: {\n input: {\n normal: 1,\n },\n output: {\n normal: 5,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_OPUS_4_1 = {\n name: 'claude-opus-4-1',\n id: 'claude-opus-4-1',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-08-05',\n pricing: {\n input: {\n normal: 15,\n },\n output: {\n normal: 75,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\n// Claude Opus 4.7 removed budget-based extended thinking and the sampling\n// parameters (`temperature`, `top_p`, `top_k`) — sending either returns a\n// 400. Use adaptive thinking with `output_config.effort` instead.\nconst CLAUDE_OPUS_4_7 = {\n name: 'claude-opus-4-7',\n id: 'claude-opus-4-7',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 5,\n cached: 0.5,\n },\n output: {\n normal: 25,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Opus 4.8 keeps the same request surface as Opus 4.7: adaptive\n// thinking only (budget_tokens 400s), no sampling parameters.\nconst CLAUDE_OPUS_4_8 = {\n name: 'claude-opus-4-8',\n id: 'claude-opus-4-8',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 5,\n cached: 0.5,\n },\n output: {\n normal: 25,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Fable 5: thinking is always on — the only accepted explicit\n// `thinking` config is `{type: 'adaptive'}` (disabled/budget_tokens 400),\n// and the sampling parameters (`temperature`, `top_p`, `top_k`) are\n// rejected. Its provider options therefore use the adaptive-only thinking\n// shape and `max_tokens` without the sampling knobs.\nconst CLAUDE_FABLE_5 = {\n name: 'claude-fable-5',\n id: 'claude-fable-5',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 10,\n cached: 1,\n },\n output: {\n normal: 50,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOnlyThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n// Claude Sonnet 5: adaptive thinking is the default (omitting `thinking`\n// runs adaptive); `{type: 'disabled'}` opts out, but the manual\n// `{type: 'enabled', budget_tokens}` shape and non-default sampling\n// parameters (`temperature`, `top_p`, `top_k`) are rejected with a 400.\n// Pricing below is the sticker $3/$15 per MTok (an introductory $2/$10\n// applies through 2026-08-31).\nconst CLAUDE_SONNET_5 = {\n name: 'claude-sonnet-5',\n id: 'claude-sonnet-5',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n adaptive_thinking: true,\n priority_tier: true,\n tools: [\n 'web_search',\n 'web_fetch',\n 'code_execution',\n 'computer_use',\n 'bash',\n 'text_editor',\n 'memory',\n ],\n },\n pricing: {\n input: {\n normal: 3,\n cached: 0.3,\n },\n output: {\n normal: 15,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n>\n\n/**\n * Model ids accepted by the Anthropic text adapter.\n *\n * Every id here resolves against the first-party Anthropic API\n * (`GET /v1/models/{id}`). Retired models (Claude 3.x, Sonnet 3.7,\n * Opus 4 / Sonnet 4) and the `-fast` variant ids (fast mode is requested\n * via the `speed` parameter, not a model id) were removed after Anthropic\n * turned them off.\n */\nconst CLAUDE_OPUS_5 = {\n name: 'claude-opus-5',\n id: 'claude-opus-5',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n tools: [],\n },\n pricing: {\n input: {\n normal: 5,\n cached: 0.5,\n },\n output: {\n normal: 25,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nconst CLAUDE_OPUS_5_FAST = {\n name: 'claude-opus-5-fast',\n id: 'claude-opus-5-fast',\n context_window: 1_000_000,\n max_output_tokens: 128_000,\n supports: {\n input: ['text', 'image', 'document'],\n tools: [],\n },\n pricing: {\n input: {\n normal: 10,\n cached: 1,\n },\n output: {\n normal: 50,\n },\n },\n} as const satisfies ModelMeta<\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n>\n\nexport const ANTHROPIC_MODELS = [\n CLAUDE_OPUS_5.id,\n CLAUDE_OPUS_5_FAST.id,\n CLAUDE_OPUS_4_6.id,\n CLAUDE_OPUS_4_5.id,\n CLAUDE_SONNET_4_6.id,\n CLAUDE_SONNET_4_5.id,\n CLAUDE_HAIKU_4_5.id,\n CLAUDE_OPUS_4_1.id,\n\n CLAUDE_OPUS_4_7.id,\n CLAUDE_OPUS_4_8.id,\n\n CLAUDE_FABLE_5.id,\n CLAUDE_SONNET_5.id,\n] as const\n\n/**\n * Fallback `max_tokens` ceiling for a model whose metadata carries no\n * `max_output_tokens` (e.g. an unrecognized model id). Anthropic's Messages\n * API *requires* `max_tokens`, so the adapter must always send a value. 64K is\n * the output ceiling of the current mainstream Claude tier (Sonnet/Haiku 4.5),\n * so it's a sane default for an unknown — almost certainly modern — model and\n * avoids silently truncating long generations (issue #849). Recognized models\n * use their exact `max_output_tokens` from {@link ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS}\n * (e.g. 128K for Opus), so this fallback only ever applies to ids not in the\n * map.\n */\nexport const ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS = 64_000\n\n/**\n * Runtime lookup of each model's maximum output-token ceiling, keyed by model\n * id. Lets the text adapter default the required `max_tokens` request field to\n * the model's real ceiling when the caller doesn't specify one, rather than a\n * low constant that truncates responses mid-stream (issue #849).\n *\n * Kept in sync with {@link ANTHROPIC_MODELS} by `scripts/sync-provider-models.ts`\n * — when that script adds a model it also inserts the model's `max_output_tokens`\n * here, so a freshly-synced model resolves to its real ceiling rather than the\n * fallback above.\n */\nconst ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS: Record<string, number> = {\n [CLAUDE_OPUS_4_6.id]: CLAUDE_OPUS_4_6.max_output_tokens,\n [CLAUDE_OPUS_4_5.id]: CLAUDE_OPUS_4_5.max_output_tokens,\n [CLAUDE_SONNET_4_6.id]: CLAUDE_SONNET_4_6.max_output_tokens,\n [CLAUDE_SONNET_4_5.id]: CLAUDE_SONNET_4_5.max_output_tokens,\n [CLAUDE_HAIKU_4_5.id]: CLAUDE_HAIKU_4_5.max_output_tokens,\n [CLAUDE_OPUS_4_1.id]: CLAUDE_OPUS_4_1.max_output_tokens,\n [CLAUDE_OPUS_4_7.id]: CLAUDE_OPUS_4_7.max_output_tokens,\n [CLAUDE_OPUS_4_8.id]: CLAUDE_OPUS_4_8.max_output_tokens,\n [CLAUDE_FABLE_5.id]: CLAUDE_FABLE_5.max_output_tokens,\n [CLAUDE_SONNET_5.id]: CLAUDE_SONNET_5.max_output_tokens,\n [CLAUDE_OPUS_5.id]: CLAUDE_OPUS_5.max_output_tokens,\n [CLAUDE_OPUS_5_FAST.id]: CLAUDE_OPUS_5_FAST.max_output_tokens,\n}\n\n/**\n * Largest `max_tokens` the Anthropic SDK permits on a **non-streaming**\n * request. The SDK refuses to make a non-streaming call it estimates could\n * exceed its 10-minute timeout, computed as\n * `(60min * max_tokens) / 128_000 > 10min` — i.e. it throws\n * `\"Streaming is required for operations that may take longer than 10 minutes\"`\n * once `max_tokens > 128_000 * 10 / 60 ≈ 21_333`\n * (`@anthropic-ai/sdk`'s `calculateNonstreamingTimeout`). The text adapter's\n * only non-streaming call is the forced-tool `structuredOutput()` request, so\n * its defaulted ceiling must stay at or below this; the streaming chat path\n * keeps the model's full {@link getAnthropicDefaultMaxTokens} ceiling. We sit\n * just under the boundary (`21_333` would round-trip to exactly 10min). This\n * caps only the *default* — an explicit oversized `max_tokens` from the caller\n * still surfaces the SDK's \"use streaming\" error, which is the correct signal.\n */\nexport const ANTHROPIC_MAX_NONSTREAMING_TOKENS = 21_000\n\n/**\n * Resolve the default `max_tokens` for a model: its known `max_output_tokens`\n * ceiling, or {@link ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS} for unknown models.\n * Callers that pass an explicit `max_tokens` bypass this entirely.\n *\n * Pass `stream: false` for non-streaming requests (the `structuredOutput()`\n * path): the result is then clamped to {@link ANTHROPIC_MAX_NONSTREAMING_TOKENS}\n * so the defaulted ceiling doesn't trip the SDK's non-streaming 10-minute guard\n * (issue #849). Streaming requests (the default) are unaffected and get the\n * model's full ceiling.\n */\nexport function getAnthropicDefaultMaxTokens(\n model: string,\n { stream = true }: { stream?: boolean } = {},\n): number {\n const ceiling =\n ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS[model] ??\n ANTHROPIC_DEFAULT_MAX_OUTPUT_TOKENS\n return stream ? ceiling : Math.min(ceiling, ANTHROPIC_MAX_NONSTREAMING_TOKENS)\n}\n\n/**\n * Anthropic models that support combining `tools` + JSON-Schema-constrained\n * output in a single streaming Messages request (per issue #605). GA'd\n * 2026-01-29 for Claude 4.5+ via `output_format` on the beta messages\n * endpoint. Older Claude models still need the forced-tool-use workaround\n * in `structuredOutput`.\n */\nexport const ANTHROPIC_COMBINED_TOOLS_AND_SCHEMA_MODELS = new Set<string>([\n CLAUDE_OPUS_4_5.id,\n CLAUDE_OPUS_4_6.id,\n CLAUDE_OPUS_4_7.id,\n CLAUDE_OPUS_4_8.id,\n CLAUDE_FABLE_5.id,\n CLAUDE_SONNET_5.id,\n CLAUDE_SONNET_4_5.id,\n CLAUDE_SONNET_4_6.id,\n CLAUDE_HAIKU_4_5.id,\n])\n\n// const ANTHROPIC_IMAGE_MODELS = [] as const\n// const ANTHROPIC_EMBEDDING_MODELS = [] as const\n// const ANTHROPIC_AUDIO_MODELS = [] as const\n// const ANTHROPIC_VIDEO_MODELS = [] as const\n\nexport type AnthropicChatModel = (typeof ANTHROPIC_MODELS)[number]\n// Manual type map for per-model provider options\n// Models are differentiated by which thinking shapes and sampling\n// parameters the API accepts.\nexport type AnthropicChatModelProviderOptionsByName = {\n // 4.6 generation: adaptive thinking plus the deprecated budget-based\n // shape; sampling parameters still accepted.\n [CLAUDE_OPUS_4_6.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_SONNET_4_6.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Pre-4.6 models: budget-based extended thinking and sampling parameters.\n [CLAUDE_OPUS_4_5.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_SONNET_4_5.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_HAIKU_4_5.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_OPUS_4_1.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Opus 4.7/4.8: adaptive thinking (or explicit disable), no\n // budget_tokens, no sampling parameters — see the constants above.\n [CLAUDE_OPUS_4_7.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n [CLAUDE_OPUS_4_8.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n\n // Claude Fable 5: thinking always on (adaptive-only config); sampling\n // parameters removed — see the CLAUDE_FABLE_5 constant above.\n [CLAUDE_FABLE_5.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOnlyThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n // Claude Sonnet 5: adaptive thinking by default, explicit disable\n // allowed; no budget_tokens, no sampling parameters — see the\n // CLAUDE_SONNET_5 constant above.\n [CLAUDE_SONNET_5.id]: AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicAdaptiveOrDisabledThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicMaxTokensOptions &\n AnthropicOutputConfigOptions\n [CLAUDE_OPUS_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_OPUS_5_FAST.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n}\n\nexport type AnthropicChatModelToolCapabilitiesByName = {\n [CLAUDE_OPUS_4_6.id]: typeof CLAUDE_OPUS_4_6.supports.tools\n [CLAUDE_OPUS_4_5.id]: typeof CLAUDE_OPUS_4_5.supports.tools\n [CLAUDE_SONNET_4_6.id]: typeof CLAUDE_SONNET_4_6.supports.tools\n [CLAUDE_SONNET_4_5.id]: typeof CLAUDE_SONNET_4_5.supports.tools\n [CLAUDE_HAIKU_4_5.id]: typeof CLAUDE_HAIKU_4_5.supports.tools\n [CLAUDE_OPUS_4_1.id]: typeof CLAUDE_OPUS_4_1.supports.tools\n [CLAUDE_OPUS_4_7.id]: typeof CLAUDE_OPUS_4_7.supports.tools\n [CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.tools\n [CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.tools\n [CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.tools\n [CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.tools\n [CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.tools\n}\n\n/**\n * Type-only map from chat model name to its supported input modalities.\n * All Anthropic Claude models support text, image, and document (PDF) input.\n * Used by the core AI types to constrain ContentPart types based on the selected model.\n * Note: These must be inlined as readonly arrays (not typeof) because the model\n * constants are not exported and typeof references don't work in .d.ts files\n * when consumed by external packages.\n *\n * @see https://docs.anthropic.com/claude/docs/vision\n * @see https://docs.anthropic.com/claude/docs/pdf-support\n */\nexport type AnthropicModelInputModalitiesByName = {\n [CLAUDE_OPUS_4_6.id]: typeof CLAUDE_OPUS_4_6.supports.input\n [CLAUDE_OPUS_4_5.id]: typeof CLAUDE_OPUS_4_5.supports.input\n [CLAUDE_SONNET_4_6.id]: typeof CLAUDE_SONNET_4_6.supports.input\n [CLAUDE_SONNET_4_5.id]: typeof CLAUDE_SONNET_4_5.supports.input\n [CLAUDE_HAIKU_4_5.id]: typeof CLAUDE_HAIKU_4_5.supports.input\n [CLAUDE_OPUS_4_1.id]: typeof CLAUDE_OPUS_4_1.supports.input\n [CLAUDE_OPUS_4_7.id]: typeof CLAUDE_OPUS_4_7.supports.input\n [CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.input\n [CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.input\n [CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.input\n [CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.input\n [CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.input\n}\n"],"mappings":"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"}
|
|
@@ -31,6 +31,21 @@ export interface AnthropicSystemPromptMetadata {
|
|
|
31
31
|
*/
|
|
32
32
|
cache_control?: CacheControlEphemeral;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Top-level prompt-caching control.
|
|
36
|
+
*
|
|
37
|
+
* Anthropic's Messages API accepts `cache_control` as a request-level
|
|
38
|
+
* parameter: it auto-places the breakpoint on the last cacheable block of the
|
|
39
|
+
* rendered prompt (`tools` → `system` → `messages`). Use this when you don't
|
|
40
|
+
* need per-block placement; for a breakpoint on a specific system prompt, use
|
|
41
|
+
* the structured `systemPrompts` form with
|
|
42
|
+
* {@link AnthropicSystemPromptMetadata} instead.
|
|
43
|
+
*
|
|
44
|
+
* @see https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
|
|
45
|
+
*/
|
|
46
|
+
export interface AnthropicCacheControlOptions {
|
|
47
|
+
cache_control?: CacheControlEphemeral;
|
|
48
|
+
}
|
|
34
49
|
export interface AnthropicContainerOptions {
|
|
35
50
|
/**
|
|
36
51
|
* Container identifier for reuse across requests.
|
|
@@ -256,7 +271,7 @@ export interface AnthropicSamplingOptions {
|
|
|
256
271
|
*/
|
|
257
272
|
max_tokens?: number;
|
|
258
273
|
}
|
|
259
|
-
export type ExternalTextProviderOptions = AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions & Partial<AnthropicAdaptiveThinkingOptions> & Partial<AnthropicEffortOptions> & Partial<AnthropicOutputConfigOptions>;
|
|
274
|
+
export type ExternalTextProviderOptions = AnthropicCacheControlOptions & AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions & Partial<AnthropicAdaptiveThinkingOptions> & Partial<AnthropicEffortOptions> & Partial<AnthropicOutputConfigOptions>;
|
|
260
275
|
export interface InternalTextProviderOptions extends ExternalTextProviderOptions {
|
|
261
276
|
model: string;
|
|
262
277
|
messages: Array<MessageParam>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-provider-options.js","names":[],"sources":["../../../src/text/text-provider-options.ts"],"sourcesContent":["import type {\n BetaContextManagementConfig,\n BetaToolChoiceAny,\n BetaToolChoiceAuto,\n BetaToolChoiceTool,\n} from '@anthropic-ai/sdk/resources/beta/messages/messages'\nimport type { CacheControlEphemeral } from '@anthropic-ai/sdk/resources'\nimport type { AnthropicContainerSkill, AnthropicTool } from '../tools/index'\nimport type {\n MessageParam,\n TextBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\n\n/**\n * Per-prompt metadata Anthropic understands on `systemPrompts` entries.\n *\n * Used via the structured form of `systemPrompts`:\n *\n * @example\n * import type { AnthropicSystemPromptMetadata } from '@tanstack/ai-anthropic'\n *\n * chat({\n * adapter: anthropicText(),\n * model: 'claude-sonnet-4-6',\n * systemPrompts: [\n * {\n * content: 'Stable instructions — cache me.',\n * metadata: { cache_control: { type: 'ephemeral' } } satisfies AnthropicSystemPromptMetadata,\n * },\n * 'Volatile per-request instruction.',\n * ],\n * })\n */\nexport interface AnthropicSystemPromptMetadata {\n /**\n * Anthropic prompt-caching control applied to this system prompt's\n * `TextBlockParam`.\n *\n * @see https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching\n */\n cache_control?: CacheControlEphemeral\n}\n\nexport interface AnthropicContainerOptions {\n /**\n * Container identifier for reuse across requests.\n * Container parameters with skills to be loaded.\n */\n container?: {\n id: string | null\n /**\n * List of skills to load into the container.\n *\n * @deprecated Configure skills on the `code_execution` tool instead:\n * `codeExecutionTool(config, { skills })`. The adapter lifts those into\n * `container.skills` and attaches the required beta headers. Setting\n * skills here bypasses the beta-header wiring and may stop working.\n */\n skills: Array<AnthropicContainerSkill> | null\n } | null\n}\n\nexport interface AnthropicContextManagementOptions {\n /**\n * Context management configuration.\n\nThis allows you to control how Claude manages context across multiple requests, such as whether to clear function results or not.\n */\n context_management?: BetaContextManagementConfig | null\n}\n\nexport interface AnthropicMCPOptions {\n /**\n * MCP servers to be utilized in this request\n * Maximum of 20 servers\n */\n mcp_servers?: Array<MCPServer>\n}\n\nexport interface AnthropicServiceTierOptions {\n /**\n * Determines whether to use priority capacity (if available) or standard capacity for this request.\n */\n service_tier?: 'auto' | 'standard_only'\n}\n\nexport interface AnthropicStopSequencesOptions {\n /**\n * Custom text sequences that will cause the model to stop generating.\n\nAnthropic models will normally stop when they have naturally completed their turn, which will result in a response stop_reason of \"end_turn\".\n\nIf you want the model to stop generating when it encounters custom strings of text, you can use the stop_sequences parameter. If the model encounters one of the custom sequences, the response stop_reason value will be \"stop_sequence\" and the response stop_sequence value will contain the matched stop sequence.\n */\n stop_sequences?: Array<string>\n}\n\nexport interface AnthropicThinkingOptions {\n /**\n * Configuration for enabling Claude's extended thinking.\n\nWhen enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit.\n */\n thinking?:\n | {\n /**\n* Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality.\n\nMust be ≥1024 and less than max_tokens\n*/\n budget_tokens: number\n\n type: 'enabled'\n }\n | {\n type: 'disabled'\n }\n}\n\nexport interface AnthropicAdaptiveThinkingOptions {\n /**\n * Configuration for Claude's adaptive thinking (Opus 4.6+).\n *\n * In adaptive mode, Claude dynamically decides when and how much to think.\n * Use the effort parameter to control thinking depth.\n * `thinking: {type: \"enabled\"}` with `budget_tokens` is deprecated on Opus 4.6.\n */\n thinking?:\n | {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n *\n * - `'summarized'`: stream summarized thinking via `thinking_delta`\n * events (the user-visible reasoning text).\n * - `'omitted'`: stream the thinking block's `signature_delta` only\n * (no reasoning text reaches the client).\n *\n * On Claude Opus 4.6 the default is `'summarized'`. On\n * Claude Opus 4.7 the default flipped to `'omitted'` — callers\n * must set `'summarized'` explicitly to get the reasoning text.\n */\n display?: 'summarized' | 'omitted'\n }\n | {\n /**\n * @deprecated Use `type: 'adaptive'` with the effort parameter on Opus 4.6+.\n */\n budget_tokens: number\n type: 'enabled'\n }\n | {\n type: 'disabled'\n }\n}\n\n/**\n * Thinking configuration for models where thinking is always on\n * (e.g. Claude Fable 5).\n *\n * On these models the only accepted explicit configuration is\n * `{type: 'adaptive'}` — both `{type: 'disabled'}` and\n * `{type: 'enabled', budget_tokens}` are rejected with a 400. Omitting the\n * `thinking` field entirely also runs adaptive thinking.\n */\nexport interface AnthropicAdaptiveOnlyThinkingOptions {\n thinking?: {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n *\n * - `'summarized'`: stream summarized thinking via `thinking_delta`\n * events (the user-visible reasoning text).\n * - `'omitted'` (default): stream the thinking block's\n * `signature_delta` only (no reasoning text reaches the client).\n */\n display?: 'summarized' | 'omitted'\n }\n}\n\n/**\n * Thinking configuration for models that accept adaptive thinking or an\n * explicit opt-out, but no manual token budget (e.g. Claude Sonnet 5,\n * Claude Opus 4.7/4.8).\n *\n * `{type: 'enabled', budget_tokens}` is rejected with a 400 on these\n * models. On Claude Sonnet 5, omitting the `thinking` field runs adaptive\n * thinking by default; on Opus 4.7/4.8 it runs without thinking — set\n * `{type: 'adaptive'}` explicitly there.\n */\nexport interface AnthropicAdaptiveOrDisabledThinkingOptions {\n thinking?:\n | {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n * Defaults to `'omitted'` — set `'summarized'` to receive the\n * reasoning text.\n */\n display?: 'summarized' | 'omitted'\n }\n | {\n type: 'disabled'\n }\n}\n\n/**\n * `max_tokens` on its own, for models that reject the sampling parameters\n * (`temperature`, `top_p`, `top_k`) — e.g. Claude Fable 5 and Claude Opus\n * 4.7/4.8 reject them outright, and Claude Sonnet 5 returns a 400 when a\n * non-default sampling value is sent.\n */\nexport interface AnthropicMaxTokensOptions {\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. Required by the API; the adapter defaults to 1024 when omitted.\n * Range x >= 1.\n */\n max_tokens?: number\n}\n\nexport interface AnthropicEffortOptions {\n /**\n * Controls the thinking depth for adaptive thinking mode (Opus 4.6+).\n *\n * - `max`: Absolute highest capability\n * - `high`: Default - Claude will almost always think\n * - `medium`: Balanced cost-quality\n * - `low`: May skip thinking for simpler problems\n */\n effort?: 'max' | 'high' | 'medium' | 'low'\n}\n\nexport interface AnthropicOutputConfigOptions {\n /**\n * Output configuration for the model's response.\n *\n * On Claude 4.7+ the top-level `effort` field was relocated under\n * `output_config.effort`, and `thinking: { type: 'enabled', budget_tokens }`\n * was replaced by `thinking: { type: 'adaptive' }` paired with\n * `output_config.effort`. Earlier models continue to accept the legacy\n * top-level `effort` / `thinking.type: 'enabled'` shape.\n *\n * The engine also writes `output_config.format` here when the caller\n * passes `outputSchema` to a Claude 4.5+ adapter (issue #605 native\n * combined mode). Both fields coexist: user-supplied `effort` is\n * preserved when the engine adds `format`.\n */\n output_config?: {\n /**\n * `'xhigh'` is accepted on Claude Opus 4.7+, Claude Sonnet 5, and\n * Claude Fable 5; older models support `'low'`–`'max'` only.\n */\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null\n }\n}\n\nexport interface AnthropicToolChoiceOptions {\n tool_choice?: BetaToolChoiceAny | BetaToolChoiceTool | BetaToolChoiceAuto\n}\n\nexport interface AnthropicSamplingOptions {\n /**\n * Only sample from the top K options for each subsequent token.\n\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n\nRequired range: x >= 0\n */\n top_k?: number\n /**\n * Amount of randomness injected into the response.\n * Either use this or top_p, but not both.\n * Defaults to 1.0. Ranges from 0.0 to 1.0. Use temperature closer to 0.0 for analytical / multiple choice, and closer to 1.0 for creative and generative tasks.\n * @default 1.0\n */\n temperature?: number\n /**\n * Use nucleus sampling.\n *\n * In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it reaches a particular probability specified by top_p. You should either alter temperature or top_p, but not both.\n */\n top_p?: number\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. Required by the API; the adapter defaults to 1024 when omitted.\n * Range x >= 1.\n */\n max_tokens?: number\n}\n\nexport type ExternalTextProviderOptions = AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions &\n Partial<AnthropicAdaptiveThinkingOptions> &\n Partial<AnthropicEffortOptions> &\n Partial<AnthropicOutputConfigOptions>\n\nexport interface InternalTextProviderOptions extends ExternalTextProviderOptions {\n model: string\n\n messages: Array<MessageParam>\n\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate.\n * Range x >= 1.\n */\n max_tokens: number\n /**\n * Whether to incrementally stream the response using server-sent events.\n */\n stream?: boolean\n /**\n * System prompt — built by the adapter from the user-facing\n * `systemPrompts: Array<string>` on the chat call. This field is internal:\n * users should pass system prompts via `systemPrompts`, not via\n * `modelOptions`.\n *\n * A system prompt is a way of providing context and instructions to Claude,\n * such as specifying a particular goal or role.\n */\n system?: string | Array<TextBlockParam>\n\n tools?: Array<AnthropicTool>\n\n /**\n * Schema-constrained final answer in a single Messages request (issue\n * #605). Set by the engine when the adapter declared\n * `supportsCombinedToolsAndSchema` and a caller passed `outputSchema`\n * to `chat()`. The model emits tool calls during the agent loop and a\n * schema-matching JSON message on the natural final turn — no separate\n * finalization round-trip needed.\n *\n * The SDK type (`BetaOutputConfig`) currently exposes only `effort`;\n * `format` is accepted at runtime per the deprecation notice on the\n * older `output_format` field\n * (https://platform.claude.com/docs/en/build-with-claude/structured-outputs).\n * We type it explicitly here so the adapter call site doesn't need a\n * cast.\n */\n output_config?: {\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null\n format?: {\n type: 'json_schema'\n schema: Record<string, unknown>\n }\n }\n}\n\nconst validateTopPandTemperature = (options: InternalTextProviderOptions) => {\n if (options.top_p !== undefined && options.temperature !== undefined) {\n throw new Error('You should either set top_p or temperature, but not both.')\n }\n}\n\nexport interface CacheControl {\n type: 'ephemeral'\n ttl: '5m' | '1h'\n}\n\nconst validateThinking = (options: InternalTextProviderOptions) => {\n const thinking = options.thinking\n if (thinking && thinking.type === 'enabled') {\n if (thinking.budget_tokens < 1024) {\n throw new Error('thinking.budget_tokens must be at least 1024.')\n }\n if (thinking.budget_tokens >= options.max_tokens) {\n throw new Error('thinking.budget_tokens must be less than max_tokens.')\n }\n }\n}\n\ninterface MCPServer {\n name: string\n url: string\n type: 'url'\n authorization_token?: string | null\n tool_configuration: {\n allowed_tools?: Array<string> | null\n enabled?: boolean | null\n } | null\n}\n\nconst validateMaxTokens = (options: InternalTextProviderOptions) => {\n if (options.max_tokens < 1) {\n throw new Error('max_tokens must be at least 1.')\n }\n}\n\nexport const validateTextProviderOptions = (\n options: InternalTextProviderOptions,\n) => {\n validateTopPandTemperature(options)\n validateThinking(options)\n validateMaxTokens(options)\n}\n"],"mappings":";AAiWA,IAAM,8BAA8B,YAAyC;CAC3E,IAAI,QAAQ,UAAU,KAAA,KAAa,QAAQ,gBAAgB,KAAA,GACzD,MAAM,IAAI,MAAM,2DAA2D;AAE/E;AAOA,IAAM,oBAAoB,YAAyC;CACjE,MAAM,WAAW,QAAQ;CACzB,IAAI,YAAY,SAAS,SAAS,WAAW;EAC3C,IAAI,SAAS,gBAAgB,MAC3B,MAAM,IAAI,MAAM,+CAA+C;EAEjE,IAAI,SAAS,iBAAiB,QAAQ,YACpC,MAAM,IAAI,MAAM,sDAAsD;CAE1E;AACF;AAaA,IAAM,qBAAqB,YAAyC;CAClE,IAAI,QAAQ,aAAa,GACvB,MAAM,IAAI,MAAM,gCAAgC;AAEpD;AAEA,IAAa,+BACX,YACG;CACH,2BAA2B,OAAO;CAClC,iBAAiB,OAAO;CACxB,kBAAkB,OAAO;AAC3B"}
|
|
1
|
+
{"version":3,"file":"text-provider-options.js","names":[],"sources":["../../../src/text/text-provider-options.ts"],"sourcesContent":["import type {\n BetaContextManagementConfig,\n BetaToolChoiceAny,\n BetaToolChoiceAuto,\n BetaToolChoiceTool,\n} from '@anthropic-ai/sdk/resources/beta/messages/messages'\nimport type { CacheControlEphemeral } from '@anthropic-ai/sdk/resources'\nimport type { AnthropicContainerSkill, AnthropicTool } from '../tools/index'\nimport type {\n MessageParam,\n TextBlockParam,\n} from '@anthropic-ai/sdk/resources/messages'\n\n/**\n * Per-prompt metadata Anthropic understands on `systemPrompts` entries.\n *\n * Used via the structured form of `systemPrompts`:\n *\n * @example\n * import type { AnthropicSystemPromptMetadata } from '@tanstack/ai-anthropic'\n *\n * chat({\n * adapter: anthropicText(),\n * model: 'claude-sonnet-4-6',\n * systemPrompts: [\n * {\n * content: 'Stable instructions — cache me.',\n * metadata: { cache_control: { type: 'ephemeral' } } satisfies AnthropicSystemPromptMetadata,\n * },\n * 'Volatile per-request instruction.',\n * ],\n * })\n */\nexport interface AnthropicSystemPromptMetadata {\n /**\n * Anthropic prompt-caching control applied to this system prompt's\n * `TextBlockParam`.\n *\n * @see https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching\n */\n cache_control?: CacheControlEphemeral\n}\n\n/**\n * Top-level prompt-caching control.\n *\n * Anthropic's Messages API accepts `cache_control` as a request-level\n * parameter: it auto-places the breakpoint on the last cacheable block of the\n * rendered prompt (`tools` → `system` → `messages`). Use this when you don't\n * need per-block placement; for a breakpoint on a specific system prompt, use\n * the structured `systemPrompts` form with\n * {@link AnthropicSystemPromptMetadata} instead.\n *\n * @see https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching\n */\nexport interface AnthropicCacheControlOptions {\n cache_control?: CacheControlEphemeral\n}\n\nexport interface AnthropicContainerOptions {\n /**\n * Container identifier for reuse across requests.\n * Container parameters with skills to be loaded.\n */\n container?: {\n id: string | null\n /**\n * List of skills to load into the container.\n *\n * @deprecated Configure skills on the `code_execution` tool instead:\n * `codeExecutionTool(config, { skills })`. The adapter lifts those into\n * `container.skills` and attaches the required beta headers. Setting\n * skills here bypasses the beta-header wiring and may stop working.\n */\n skills: Array<AnthropicContainerSkill> | null\n } | null\n}\n\nexport interface AnthropicContextManagementOptions {\n /**\n * Context management configuration.\n\nThis allows you to control how Claude manages context across multiple requests, such as whether to clear function results or not.\n */\n context_management?: BetaContextManagementConfig | null\n}\n\nexport interface AnthropicMCPOptions {\n /**\n * MCP servers to be utilized in this request\n * Maximum of 20 servers\n */\n mcp_servers?: Array<MCPServer>\n}\n\nexport interface AnthropicServiceTierOptions {\n /**\n * Determines whether to use priority capacity (if available) or standard capacity for this request.\n */\n service_tier?: 'auto' | 'standard_only'\n}\n\nexport interface AnthropicStopSequencesOptions {\n /**\n * Custom text sequences that will cause the model to stop generating.\n\nAnthropic models will normally stop when they have naturally completed their turn, which will result in a response stop_reason of \"end_turn\".\n\nIf you want the model to stop generating when it encounters custom strings of text, you can use the stop_sequences parameter. If the model encounters one of the custom sequences, the response stop_reason value will be \"stop_sequence\" and the response stop_sequence value will contain the matched stop sequence.\n */\n stop_sequences?: Array<string>\n}\n\nexport interface AnthropicThinkingOptions {\n /**\n * Configuration for enabling Claude's extended thinking.\n\nWhen enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit.\n */\n thinking?:\n | {\n /**\n* Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality.\n\nMust be ≥1024 and less than max_tokens\n*/\n budget_tokens: number\n\n type: 'enabled'\n }\n | {\n type: 'disabled'\n }\n}\n\nexport interface AnthropicAdaptiveThinkingOptions {\n /**\n * Configuration for Claude's adaptive thinking (Opus 4.6+).\n *\n * In adaptive mode, Claude dynamically decides when and how much to think.\n * Use the effort parameter to control thinking depth.\n * `thinking: {type: \"enabled\"}` with `budget_tokens` is deprecated on Opus 4.6.\n */\n thinking?:\n | {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n *\n * - `'summarized'`: stream summarized thinking via `thinking_delta`\n * events (the user-visible reasoning text).\n * - `'omitted'`: stream the thinking block's `signature_delta` only\n * (no reasoning text reaches the client).\n *\n * On Claude Opus 4.6 the default is `'summarized'`. On\n * Claude Opus 4.7 the default flipped to `'omitted'` — callers\n * must set `'summarized'` explicitly to get the reasoning text.\n */\n display?: 'summarized' | 'omitted'\n }\n | {\n /**\n * @deprecated Use `type: 'adaptive'` with the effort parameter on Opus 4.6+.\n */\n budget_tokens: number\n type: 'enabled'\n }\n | {\n type: 'disabled'\n }\n}\n\n/**\n * Thinking configuration for models where thinking is always on\n * (e.g. Claude Fable 5).\n *\n * On these models the only accepted explicit configuration is\n * `{type: 'adaptive'}` — both `{type: 'disabled'}` and\n * `{type: 'enabled', budget_tokens}` are rejected with a 400. Omitting the\n * `thinking` field entirely also runs adaptive thinking.\n */\nexport interface AnthropicAdaptiveOnlyThinkingOptions {\n thinking?: {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n *\n * - `'summarized'`: stream summarized thinking via `thinking_delta`\n * events (the user-visible reasoning text).\n * - `'omitted'` (default): stream the thinking block's\n * `signature_delta` only (no reasoning text reaches the client).\n */\n display?: 'summarized' | 'omitted'\n }\n}\n\n/**\n * Thinking configuration for models that accept adaptive thinking or an\n * explicit opt-out, but no manual token budget (e.g. Claude Sonnet 5,\n * Claude Opus 4.7/4.8).\n *\n * `{type: 'enabled', budget_tokens}` is rejected with a 400 on these\n * models. On Claude Sonnet 5, omitting the `thinking` field runs adaptive\n * thinking by default; on Opus 4.7/4.8 it runs without thinking — set\n * `{type: 'adaptive'}` explicitly there.\n */\nexport interface AnthropicAdaptiveOrDisabledThinkingOptions {\n thinking?:\n | {\n type: 'adaptive'\n /**\n * Controls what (if any) thinking content is streamed back.\n * Defaults to `'omitted'` — set `'summarized'` to receive the\n * reasoning text.\n */\n display?: 'summarized' | 'omitted'\n }\n | {\n type: 'disabled'\n }\n}\n\n/**\n * `max_tokens` on its own, for models that reject the sampling parameters\n * (`temperature`, `top_p`, `top_k`) — e.g. Claude Fable 5 and Claude Opus\n * 4.7/4.8 reject them outright, and Claude Sonnet 5 returns a 400 when a\n * non-default sampling value is sent.\n */\nexport interface AnthropicMaxTokensOptions {\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. Required by the API; the adapter defaults to 1024 when omitted.\n * Range x >= 1.\n */\n max_tokens?: number\n}\n\nexport interface AnthropicEffortOptions {\n /**\n * Controls the thinking depth for adaptive thinking mode (Opus 4.6+).\n *\n * - `max`: Absolute highest capability\n * - `high`: Default - Claude will almost always think\n * - `medium`: Balanced cost-quality\n * - `low`: May skip thinking for simpler problems\n */\n effort?: 'max' | 'high' | 'medium' | 'low'\n}\n\nexport interface AnthropicOutputConfigOptions {\n /**\n * Output configuration for the model's response.\n *\n * On Claude 4.7+ the top-level `effort` field was relocated under\n * `output_config.effort`, and `thinking: { type: 'enabled', budget_tokens }`\n * was replaced by `thinking: { type: 'adaptive' }` paired with\n * `output_config.effort`. Earlier models continue to accept the legacy\n * top-level `effort` / `thinking.type: 'enabled'` shape.\n *\n * The engine also writes `output_config.format` here when the caller\n * passes `outputSchema` to a Claude 4.5+ adapter (issue #605 native\n * combined mode). Both fields coexist: user-supplied `effort` is\n * preserved when the engine adds `format`.\n */\n output_config?: {\n /**\n * `'xhigh'` is accepted on Claude Opus 4.7+, Claude Sonnet 5, and\n * Claude Fable 5; older models support `'low'`–`'max'` only.\n */\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null\n }\n}\n\nexport interface AnthropicToolChoiceOptions {\n tool_choice?: BetaToolChoiceAny | BetaToolChoiceTool | BetaToolChoiceAuto\n}\n\nexport interface AnthropicSamplingOptions {\n /**\n * Only sample from the top K options for each subsequent token.\n\nUsed to remove \"long tail\" low probability responses.\nRecommended for advanced use cases only. You usually only need to use temperature.\n\nRequired range: x >= 0\n */\n top_k?: number\n /**\n * Amount of randomness injected into the response.\n * Either use this or top_p, but not both.\n * Defaults to 1.0. Ranges from 0.0 to 1.0. Use temperature closer to 0.0 for analytical / multiple choice, and closer to 1.0 for creative and generative tasks.\n * @default 1.0\n */\n temperature?: number\n /**\n * Use nucleus sampling.\n *\n * In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it reaches a particular probability specified by top_p. You should either alter temperature or top_p, but not both.\n */\n top_p?: number\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. Required by the API; the adapter defaults to 1024 when omitted.\n * Range x >= 1.\n */\n max_tokens?: number\n}\n\nexport type ExternalTextProviderOptions = AnthropicCacheControlOptions &\n AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions &\n Partial<AnthropicAdaptiveThinkingOptions> &\n Partial<AnthropicEffortOptions> &\n Partial<AnthropicOutputConfigOptions>\n\nexport interface InternalTextProviderOptions extends ExternalTextProviderOptions {\n model: string\n\n messages: Array<MessageParam>\n\n /**\n * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate.\n * Range x >= 1.\n */\n max_tokens: number\n /**\n * Whether to incrementally stream the response using server-sent events.\n */\n stream?: boolean\n /**\n * System prompt — built by the adapter from the user-facing\n * `systemPrompts: Array<string>` on the chat call. This field is internal:\n * users should pass system prompts via `systemPrompts`, not via\n * `modelOptions`.\n *\n * A system prompt is a way of providing context and instructions to Claude,\n * such as specifying a particular goal or role.\n */\n system?: string | Array<TextBlockParam>\n\n tools?: Array<AnthropicTool>\n\n /**\n * Schema-constrained final answer in a single Messages request (issue\n * #605). Set by the engine when the adapter declared\n * `supportsCombinedToolsAndSchema` and a caller passed `outputSchema`\n * to `chat()`. The model emits tool calls during the agent loop and a\n * schema-matching JSON message on the natural final turn — no separate\n * finalization round-trip needed.\n *\n * The SDK type (`BetaOutputConfig`) currently exposes only `effort`;\n * `format` is accepted at runtime per the deprecation notice on the\n * older `output_format` field\n * (https://platform.claude.com/docs/en/build-with-claude/structured-outputs).\n * We type it explicitly here so the adapter call site doesn't need a\n * cast.\n */\n output_config?: {\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null\n format?: {\n type: 'json_schema'\n schema: Record<string, unknown>\n }\n }\n}\n\nconst validateTopPandTemperature = (options: InternalTextProviderOptions) => {\n if (options.top_p !== undefined && options.temperature !== undefined) {\n throw new Error('You should either set top_p or temperature, but not both.')\n }\n}\n\nexport interface CacheControl {\n type: 'ephemeral'\n ttl: '5m' | '1h'\n}\n\nconst validateThinking = (options: InternalTextProviderOptions) => {\n const thinking = options.thinking\n if (thinking && thinking.type === 'enabled') {\n if (thinking.budget_tokens < 1024) {\n throw new Error('thinking.budget_tokens must be at least 1024.')\n }\n if (thinking.budget_tokens >= options.max_tokens) {\n throw new Error('thinking.budget_tokens must be less than max_tokens.')\n }\n }\n}\n\ninterface MCPServer {\n name: string\n url: string\n type: 'url'\n authorization_token?: string | null\n tool_configuration: {\n allowed_tools?: Array<string> | null\n enabled?: boolean | null\n } | null\n}\n\nconst validateMaxTokens = (options: InternalTextProviderOptions) => {\n if (options.max_tokens < 1) {\n throw new Error('max_tokens must be at least 1.')\n }\n}\n\nexport const validateTextProviderOptions = (\n options: InternalTextProviderOptions,\n) => {\n validateTopPandTemperature(options)\n validateThinking(options)\n validateMaxTokens(options)\n}\n"],"mappings":";AAkXA,IAAM,8BAA8B,YAAyC;CAC3E,IAAI,QAAQ,UAAU,KAAA,KAAa,QAAQ,gBAAgB,KAAA,GACzD,MAAM,IAAI,MAAM,2DAA2D;AAE/E;AAOA,IAAM,oBAAoB,YAAyC;CACjE,MAAM,WAAW,QAAQ;CACzB,IAAI,YAAY,SAAS,SAAS,WAAW;EAC3C,IAAI,SAAS,gBAAgB,MAC3B,MAAM,IAAI,MAAM,+CAA+C;EAEjE,IAAI,SAAS,iBAAiB,QAAQ,YACpC,MAAM,IAAI,MAAM,sDAAsD;CAE1E;AACF;AAaA,IAAM,qBAAqB,YAAyC;CAClE,IAAI,QAAQ,aAAa,GACvB,MAAM,IAAI,MAAM,gCAAgC;AAEpD;AAEA,IAAa,+BACX,YACG;CACH,2BAA2B,OAAO;CAClC,iBAAiB,OAAO;CACxB,kBAAkB,OAAO;AAC3B"}
|
|
@@ -23,13 +23,14 @@ function codeExecutionTool(config, options = {}) {
|
|
|
23
23
|
if (skills.length > 8) throw new Error("code_execution supports at most 8 skills per request.");
|
|
24
24
|
for (const skill of skills) if (skill.skill_id.length < 1 || skill.skill_id.length > 64) throw new Error("skill_id must be between 1 and 64 characters.");
|
|
25
25
|
}
|
|
26
|
+
const metadata = {
|
|
27
|
+
config,
|
|
28
|
+
...skills && { skills }
|
|
29
|
+
};
|
|
26
30
|
return brandProviderTool({
|
|
27
31
|
name: "code_execution",
|
|
28
32
|
description: "",
|
|
29
|
-
metadata
|
|
30
|
-
config,
|
|
31
|
-
...skills && { skills }
|
|
32
|
-
}
|
|
33
|
+
metadata
|
|
33
34
|
});
|
|
34
35
|
}
|
|
35
36
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-execution-tool.js","names":[],"sources":["../../../src/tools/code-execution-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type {\n BetaCodeExecutionTool20250522,\n BetaCodeExecutionTool20250825,\n} from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type CodeExecutionToolConfig =\n | BetaCodeExecutionTool20250522\n | BetaCodeExecutionTool20250825\n\n/** @deprecated Renamed to `CodeExecutionToolConfig`. Will be removed in a future release. */\nexport type CodeExecutionTool = CodeExecutionToolConfig\n\n/**\n * A hosted/managed Anthropic Skill reference. Lifted by the text adapter into\n * the top-level `container.skills` request param (NOT serialized into the\n * `tools[]` entry). Requires the `code_execution` tool to be enabled.\n */\nexport interface AnthropicContainerSkill {\n /** 1–64 characters. */\n skill_id: string\n type: 'anthropic' | 'custom'\n /** Skill version, or `'latest'` (default) when omitted. */\n version?: string\n}\n\nexport interface CodeExecutionToolOptions {\n /** Hosted skills to load into the code-execution container (max 8). */\n skills?: Array<AnthropicContainerSkill>\n}\n\ninterface CodeExecutionToolMetadata {\n config: CodeExecutionToolConfig\n skills?: Array<AnthropicContainerSkill>\n}\n\nexport type AnthropicCodeExecutionTool = ProviderTool<\n 'anthropic',\n 'code_execution'\n>\n\nexport function convertCodeExecutionToolToAdapterFormat(\n tool: Tool,\n): CodeExecutionToolConfig {\n // The converter is only called for real `code_execution` tools, so a\n // non-undefined config is expected — but read via optional chaining so an\n // absent metadata object doesn't throw.\n return readCodeExecutionConfig(tool) as CodeExecutionToolConfig\n}\n\n/**\n * Reads the SDK tool config attached to a `code_execution` tool, if any.\n * Used by the text adapter to select the version-aware code-execution beta.\n */\nexport function readCodeExecutionConfig(\n tool: Tool,\n): CodeExecutionToolConfig | undefined {\n return (tool.metadata as CodeExecutionToolMetadata | undefined)?.config\n}\n\n/**\n * Reads the hosted skills attached to a `code_execution` tool, if any.\n * Used by the text adapter to build the top-level `container.skills` param.\n */\nexport function readCodeExecutionSkills(\n tool: Tool,\n): Array<AnthropicContainerSkill> | undefined {\n return (tool.metadata as CodeExecutionToolMetadata | undefined)?.skills\n}\n\nexport function codeExecutionTool(\n config: CodeExecutionToolConfig,\n options: CodeExecutionToolOptions = {},\n): AnthropicCodeExecutionTool {\n const { skills } = options\n if (skills) {\n if (skills.length > 8) {\n throw new Error('code_execution supports at most 8 skills per request.')\n }\n for (const skill of skills) {\n if (skill.skill_id.length < 1 || skill.skill_id.length > 64) {\n throw new Error('skill_id must be between 1 and 64 characters.')\n }\n }\n }\n const metadata: CodeExecutionToolMetadata = {\n config,\n ...(skills && { skills }),\n }\n return brandProviderTool<AnthropicCodeExecutionTool>({\n name: 'code_execution',\n description: '',\n metadata,\n })\n}\n"],"mappings":";;AA0CA,SAAgB,wCACd,MACyB;CAIzB,OAAO,wBAAwB,IAAI;AACrC;;;;;AAMA,SAAgB,wBACd,MACqC;CACrC,OAAQ,KAAK,UAAoD;AACnE;;;;;AAMA,SAAgB,wBACd,MAC4C;CAC5C,OAAQ,KAAK,UAAoD;AACnE;AAEA,SAAgB,kBACd,QACA,UAAoC,CAAC,GACT;CAC5B,MAAM,EAAE,WAAW;CACnB,IAAI,QAAQ;EACV,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,MAAM,uDAAuD;EAEzE,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,IACvD,MAAM,IAAI,MAAM,+CAA+C;CAGrE;
|
|
1
|
+
{"version":3,"file":"code-execution-tool.js","names":[],"sources":["../../../src/tools/code-execution-tool.ts"],"sourcesContent":["import { brandProviderTool } from '@tanstack/ai'\nimport type {\n BetaCodeExecutionTool20250522,\n BetaCodeExecutionTool20250825,\n} from '@anthropic-ai/sdk/resources/beta'\nimport type { ProviderTool, Tool } from '@tanstack/ai'\n\nexport type CodeExecutionToolConfig =\n | BetaCodeExecutionTool20250522\n | BetaCodeExecutionTool20250825\n\n/** @deprecated Renamed to `CodeExecutionToolConfig`. Will be removed in a future release. */\nexport type CodeExecutionTool = CodeExecutionToolConfig\n\n/**\n * A hosted/managed Anthropic Skill reference. Lifted by the text adapter into\n * the top-level `container.skills` request param (NOT serialized into the\n * `tools[]` entry). Requires the `code_execution` tool to be enabled.\n */\nexport interface AnthropicContainerSkill {\n /** 1–64 characters. */\n skill_id: string\n type: 'anthropic' | 'custom'\n /** Skill version, or `'latest'` (default) when omitted. */\n version?: string\n}\n\nexport interface CodeExecutionToolOptions {\n /** Hosted skills to load into the code-execution container (max 8). */\n skills?: Array<AnthropicContainerSkill>\n}\n\ninterface CodeExecutionToolMetadata {\n config: CodeExecutionToolConfig\n skills?: Array<AnthropicContainerSkill>\n}\n\nexport type AnthropicCodeExecutionTool = ProviderTool<\n 'anthropic',\n 'code_execution'\n>\n\nexport function convertCodeExecutionToolToAdapterFormat(\n tool: Tool,\n): CodeExecutionToolConfig {\n // The converter is only called for real `code_execution` tools, so a\n // non-undefined config is expected — but read via optional chaining so an\n // absent metadata object doesn't throw.\n return readCodeExecutionConfig(tool) as CodeExecutionToolConfig\n}\n\n/**\n * Reads the SDK tool config attached to a `code_execution` tool, if any.\n * Used by the text adapter to select the version-aware code-execution beta.\n */\nexport function readCodeExecutionConfig(\n tool: Tool,\n): CodeExecutionToolConfig | undefined {\n return (tool.metadata as CodeExecutionToolMetadata | undefined)?.config\n}\n\n/**\n * Reads the hosted skills attached to a `code_execution` tool, if any.\n * Used by the text adapter to build the top-level `container.skills` param.\n */\nexport function readCodeExecutionSkills(\n tool: Tool,\n): Array<AnthropicContainerSkill> | undefined {\n return (tool.metadata as CodeExecutionToolMetadata | undefined)?.skills\n}\n\nexport function codeExecutionTool(\n config: CodeExecutionToolConfig,\n options: CodeExecutionToolOptions = {},\n): AnthropicCodeExecutionTool {\n const { skills } = options\n if (skills) {\n if (skills.length > 8) {\n throw new Error('code_execution supports at most 8 skills per request.')\n }\n for (const skill of skills) {\n if (skill.skill_id.length < 1 || skill.skill_id.length > 64) {\n throw new Error('skill_id must be between 1 and 64 characters.')\n }\n }\n }\n const metadata: CodeExecutionToolMetadata = {\n config,\n ...(skills && { skills }),\n }\n return brandProviderTool<AnthropicCodeExecutionTool>({\n name: 'code_execution',\n description: '',\n metadata,\n })\n}\n"],"mappings":";;AA0CA,SAAgB,wCACd,MACyB;CAIzB,OAAO,wBAAwB,IAAI;AACrC;;;;;AAMA,SAAgB,wBACd,MACqC;CACrC,OAAQ,KAAK,UAAoD;AACnE;;;;;AAMA,SAAgB,wBACd,MAC4C;CAC5C,OAAQ,KAAK,UAAoD;AACnE;AAEA,SAAgB,kBACd,QACA,UAAoC,CAAC,GACT;CAC5B,MAAM,EAAE,WAAW;CACnB,IAAI,QAAQ;EACV,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,MAAM,uDAAuD;EAEzE,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,IACvD,MAAM,IAAI,MAAM,+CAA+C;CAGrE;CACA,MAAM,WAAsC;EAC1C;EACA,GAAI,UAAU,EAAE,OAAO;CACzB;CACA,OAAO,kBAA8C;EACnD,MAAM;EACN,aAAa;EACb;CACF,CAAC;AACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai-anthropic",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.6",
|
|
4
4
|
"description": "Anthropic Claude adapter for TanStack AI chat, tool calling, thinking, and structured outputs.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,16 +49,16 @@
|
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@anthropic-ai/sdk": "^0.97.1",
|
|
52
|
-
"@tanstack/ai-utils": "0.4.0"
|
|
52
|
+
"@tanstack/ai-utils": "^0.4.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"zod": "^4.0.0",
|
|
56
|
-
"@tanstack/ai": "^0.
|
|
56
|
+
"@tanstack/ai": "^0.45.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@vitest/coverage-v8": "4.
|
|
59
|
+
"@vitest/coverage-v8": "4.1.10",
|
|
60
60
|
"zod": "^4.2.0",
|
|
61
|
-
"@tanstack/ai": "0.
|
|
61
|
+
"@tanstack/ai": "0.45.0"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "vite build",
|
package/src/adapters/text.ts
CHANGED
|
@@ -455,6 +455,7 @@ export class AnthropicTextAdapter<
|
|
|
455
455
|
const validProviderOptions: Partial<InternalTextProviderOptions> = {}
|
|
456
456
|
if (modelOptions) {
|
|
457
457
|
const validKeys: Array<keyof AnthropicTextProviderOptions> = [
|
|
458
|
+
'cache_control',
|
|
458
459
|
'container',
|
|
459
460
|
'context_management',
|
|
460
461
|
'effort',
|
package/src/model-meta.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
AnthropicAdaptiveOnlyThinkingOptions,
|
|
3
3
|
AnthropicAdaptiveOrDisabledThinkingOptions,
|
|
4
4
|
AnthropicAdaptiveThinkingOptions,
|
|
5
|
+
AnthropicCacheControlOptions,
|
|
5
6
|
AnthropicContainerOptions,
|
|
6
7
|
AnthropicContextManagementOptions,
|
|
7
8
|
AnthropicMCPOptions,
|
|
@@ -94,7 +95,8 @@ const CLAUDE_OPUS_4_6 = {
|
|
|
94
95
|
],
|
|
95
96
|
},
|
|
96
97
|
} as const satisfies ModelMeta<
|
|
97
|
-
|
|
98
|
+
AnthropicCacheControlOptions &
|
|
99
|
+
AnthropicContainerOptions &
|
|
98
100
|
AnthropicContextManagementOptions &
|
|
99
101
|
AnthropicMCPOptions &
|
|
100
102
|
AnthropicServiceTierOptions &
|
|
@@ -133,7 +135,8 @@ const CLAUDE_OPUS_4_5 = {
|
|
|
133
135
|
],
|
|
134
136
|
},
|
|
135
137
|
} as const satisfies ModelMeta<
|
|
136
|
-
|
|
138
|
+
AnthropicCacheControlOptions &
|
|
139
|
+
AnthropicContainerOptions &
|
|
137
140
|
AnthropicContextManagementOptions &
|
|
138
141
|
AnthropicMCPOptions &
|
|
139
142
|
AnthropicServiceTierOptions &
|
|
@@ -175,7 +178,8 @@ const CLAUDE_SONNET_4_6 = {
|
|
|
175
178
|
],
|
|
176
179
|
},
|
|
177
180
|
} as const satisfies ModelMeta<
|
|
178
|
-
|
|
181
|
+
AnthropicCacheControlOptions &
|
|
182
|
+
AnthropicContainerOptions &
|
|
179
183
|
AnthropicContextManagementOptions &
|
|
180
184
|
AnthropicMCPOptions &
|
|
181
185
|
AnthropicServiceTierOptions &
|
|
@@ -214,7 +218,8 @@ const CLAUDE_SONNET_4_5 = {
|
|
|
214
218
|
],
|
|
215
219
|
},
|
|
216
220
|
} as const satisfies ModelMeta<
|
|
217
|
-
|
|
221
|
+
AnthropicCacheControlOptions &
|
|
222
|
+
AnthropicContainerOptions &
|
|
218
223
|
AnthropicContextManagementOptions &
|
|
219
224
|
AnthropicMCPOptions &
|
|
220
225
|
AnthropicServiceTierOptions &
|
|
@@ -253,7 +258,8 @@ const CLAUDE_HAIKU_4_5 = {
|
|
|
253
258
|
],
|
|
254
259
|
},
|
|
255
260
|
} as const satisfies ModelMeta<
|
|
256
|
-
|
|
261
|
+
AnthropicCacheControlOptions &
|
|
262
|
+
AnthropicContainerOptions &
|
|
257
263
|
AnthropicContextManagementOptions &
|
|
258
264
|
AnthropicMCPOptions &
|
|
259
265
|
AnthropicServiceTierOptions &
|
|
@@ -292,7 +298,8 @@ const CLAUDE_OPUS_4_1 = {
|
|
|
292
298
|
],
|
|
293
299
|
},
|
|
294
300
|
} as const satisfies ModelMeta<
|
|
295
|
-
|
|
301
|
+
AnthropicCacheControlOptions &
|
|
302
|
+
AnthropicContainerOptions &
|
|
296
303
|
AnthropicContextManagementOptions &
|
|
297
304
|
AnthropicMCPOptions &
|
|
298
305
|
AnthropicServiceTierOptions &
|
|
@@ -335,7 +342,8 @@ const CLAUDE_OPUS_4_7 = {
|
|
|
335
342
|
},
|
|
336
343
|
},
|
|
337
344
|
} as const satisfies ModelMeta<
|
|
338
|
-
|
|
345
|
+
AnthropicCacheControlOptions &
|
|
346
|
+
AnthropicContainerOptions &
|
|
339
347
|
AnthropicContextManagementOptions &
|
|
340
348
|
AnthropicMCPOptions &
|
|
341
349
|
AnthropicServiceTierOptions &
|
|
@@ -378,7 +386,8 @@ const CLAUDE_OPUS_4_8 = {
|
|
|
378
386
|
},
|
|
379
387
|
},
|
|
380
388
|
} as const satisfies ModelMeta<
|
|
381
|
-
|
|
389
|
+
AnthropicCacheControlOptions &
|
|
390
|
+
AnthropicContainerOptions &
|
|
382
391
|
AnthropicContextManagementOptions &
|
|
383
392
|
AnthropicMCPOptions &
|
|
384
393
|
AnthropicServiceTierOptions &
|
|
@@ -424,7 +433,8 @@ const CLAUDE_FABLE_5 = {
|
|
|
424
433
|
},
|
|
425
434
|
},
|
|
426
435
|
} as const satisfies ModelMeta<
|
|
427
|
-
|
|
436
|
+
AnthropicCacheControlOptions &
|
|
437
|
+
AnthropicContainerOptions &
|
|
428
438
|
AnthropicContextManagementOptions &
|
|
429
439
|
AnthropicMCPOptions &
|
|
430
440
|
AnthropicServiceTierOptions &
|
|
@@ -471,7 +481,8 @@ const CLAUDE_SONNET_5 = {
|
|
|
471
481
|
},
|
|
472
482
|
},
|
|
473
483
|
} as const satisfies ModelMeta<
|
|
474
|
-
|
|
484
|
+
AnthropicCacheControlOptions &
|
|
485
|
+
AnthropicContainerOptions &
|
|
475
486
|
AnthropicContextManagementOptions &
|
|
476
487
|
AnthropicMCPOptions &
|
|
477
488
|
AnthropicServiceTierOptions &
|
|
@@ -491,7 +502,67 @@ const CLAUDE_SONNET_5 = {
|
|
|
491
502
|
* via the `speed` parameter, not a model id) were removed after Anthropic
|
|
492
503
|
* turned them off.
|
|
493
504
|
*/
|
|
505
|
+
const CLAUDE_OPUS_5 = {
|
|
506
|
+
name: 'claude-opus-5',
|
|
507
|
+
id: 'claude-opus-5',
|
|
508
|
+
context_window: 1_000_000,
|
|
509
|
+
max_output_tokens: 128_000,
|
|
510
|
+
supports: {
|
|
511
|
+
input: ['text', 'image', 'document'],
|
|
512
|
+
tools: [],
|
|
513
|
+
},
|
|
514
|
+
pricing: {
|
|
515
|
+
input: {
|
|
516
|
+
normal: 5,
|
|
517
|
+
cached: 0.5,
|
|
518
|
+
},
|
|
519
|
+
output: {
|
|
520
|
+
normal: 25,
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
} as const satisfies ModelMeta<
|
|
524
|
+
AnthropicContainerOptions &
|
|
525
|
+
AnthropicContextManagementOptions &
|
|
526
|
+
AnthropicMCPOptions &
|
|
527
|
+
AnthropicServiceTierOptions &
|
|
528
|
+
AnthropicStopSequencesOptions &
|
|
529
|
+
AnthropicThinkingOptions &
|
|
530
|
+
AnthropicToolChoiceOptions &
|
|
531
|
+
AnthropicSamplingOptions
|
|
532
|
+
>
|
|
533
|
+
|
|
534
|
+
const CLAUDE_OPUS_5_FAST = {
|
|
535
|
+
name: 'claude-opus-5-fast',
|
|
536
|
+
id: 'claude-opus-5-fast',
|
|
537
|
+
context_window: 1_000_000,
|
|
538
|
+
max_output_tokens: 128_000,
|
|
539
|
+
supports: {
|
|
540
|
+
input: ['text', 'image', 'document'],
|
|
541
|
+
tools: [],
|
|
542
|
+
},
|
|
543
|
+
pricing: {
|
|
544
|
+
input: {
|
|
545
|
+
normal: 10,
|
|
546
|
+
cached: 1,
|
|
547
|
+
},
|
|
548
|
+
output: {
|
|
549
|
+
normal: 50,
|
|
550
|
+
},
|
|
551
|
+
},
|
|
552
|
+
} as const satisfies ModelMeta<
|
|
553
|
+
AnthropicContainerOptions &
|
|
554
|
+
AnthropicContextManagementOptions &
|
|
555
|
+
AnthropicMCPOptions &
|
|
556
|
+
AnthropicServiceTierOptions &
|
|
557
|
+
AnthropicStopSequencesOptions &
|
|
558
|
+
AnthropicThinkingOptions &
|
|
559
|
+
AnthropicToolChoiceOptions &
|
|
560
|
+
AnthropicSamplingOptions
|
|
561
|
+
>
|
|
562
|
+
|
|
494
563
|
export const ANTHROPIC_MODELS = [
|
|
564
|
+
CLAUDE_OPUS_5.id,
|
|
565
|
+
CLAUDE_OPUS_5_FAST.id,
|
|
495
566
|
CLAUDE_OPUS_4_6.id,
|
|
496
567
|
CLAUDE_OPUS_4_5.id,
|
|
497
568
|
CLAUDE_SONNET_4_6.id,
|
|
@@ -541,6 +612,8 @@ const ANTHROPIC_MODEL_MAX_OUTPUT_TOKENS: Record<string, number> = {
|
|
|
541
612
|
[CLAUDE_OPUS_4_8.id]: CLAUDE_OPUS_4_8.max_output_tokens,
|
|
542
613
|
[CLAUDE_FABLE_5.id]: CLAUDE_FABLE_5.max_output_tokens,
|
|
543
614
|
[CLAUDE_SONNET_5.id]: CLAUDE_SONNET_5.max_output_tokens,
|
|
615
|
+
[CLAUDE_OPUS_5.id]: CLAUDE_OPUS_5.max_output_tokens,
|
|
616
|
+
[CLAUDE_OPUS_5_FAST.id]: CLAUDE_OPUS_5_FAST.max_output_tokens,
|
|
544
617
|
}
|
|
545
618
|
|
|
546
619
|
/**
|
|
@@ -612,7 +685,8 @@ export type AnthropicChatModel = (typeof ANTHROPIC_MODELS)[number]
|
|
|
612
685
|
export type AnthropicChatModelProviderOptionsByName = {
|
|
613
686
|
// 4.6 generation: adaptive thinking plus the deprecated budget-based
|
|
614
687
|
// shape; sampling parameters still accepted.
|
|
615
|
-
[CLAUDE_OPUS_4_6.id]:
|
|
688
|
+
[CLAUDE_OPUS_4_6.id]: AnthropicCacheControlOptions &
|
|
689
|
+
AnthropicContainerOptions &
|
|
616
690
|
AnthropicContextManagementOptions &
|
|
617
691
|
AnthropicMCPOptions &
|
|
618
692
|
AnthropicServiceTierOptions &
|
|
@@ -620,7 +694,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
620
694
|
AnthropicAdaptiveThinkingOptions &
|
|
621
695
|
AnthropicToolChoiceOptions &
|
|
622
696
|
AnthropicSamplingOptions
|
|
623
|
-
[CLAUDE_SONNET_4_6.id]:
|
|
697
|
+
[CLAUDE_SONNET_4_6.id]: AnthropicCacheControlOptions &
|
|
698
|
+
AnthropicContainerOptions &
|
|
624
699
|
AnthropicContextManagementOptions &
|
|
625
700
|
AnthropicMCPOptions &
|
|
626
701
|
AnthropicServiceTierOptions &
|
|
@@ -630,7 +705,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
630
705
|
AnthropicSamplingOptions
|
|
631
706
|
|
|
632
707
|
// Pre-4.6 models: budget-based extended thinking and sampling parameters.
|
|
633
|
-
[CLAUDE_OPUS_4_5.id]:
|
|
708
|
+
[CLAUDE_OPUS_4_5.id]: AnthropicCacheControlOptions &
|
|
709
|
+
AnthropicContainerOptions &
|
|
634
710
|
AnthropicContextManagementOptions &
|
|
635
711
|
AnthropicMCPOptions &
|
|
636
712
|
AnthropicServiceTierOptions &
|
|
@@ -638,7 +714,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
638
714
|
AnthropicThinkingOptions &
|
|
639
715
|
AnthropicToolChoiceOptions &
|
|
640
716
|
AnthropicSamplingOptions
|
|
641
|
-
[CLAUDE_SONNET_4_5.id]:
|
|
717
|
+
[CLAUDE_SONNET_4_5.id]: AnthropicCacheControlOptions &
|
|
718
|
+
AnthropicContainerOptions &
|
|
642
719
|
AnthropicContextManagementOptions &
|
|
643
720
|
AnthropicMCPOptions &
|
|
644
721
|
AnthropicServiceTierOptions &
|
|
@@ -646,7 +723,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
646
723
|
AnthropicThinkingOptions &
|
|
647
724
|
AnthropicToolChoiceOptions &
|
|
648
725
|
AnthropicSamplingOptions
|
|
649
|
-
[CLAUDE_HAIKU_4_5.id]:
|
|
726
|
+
[CLAUDE_HAIKU_4_5.id]: AnthropicCacheControlOptions &
|
|
727
|
+
AnthropicContainerOptions &
|
|
650
728
|
AnthropicContextManagementOptions &
|
|
651
729
|
AnthropicMCPOptions &
|
|
652
730
|
AnthropicServiceTierOptions &
|
|
@@ -654,7 +732,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
654
732
|
AnthropicThinkingOptions &
|
|
655
733
|
AnthropicToolChoiceOptions &
|
|
656
734
|
AnthropicSamplingOptions
|
|
657
|
-
[CLAUDE_OPUS_4_1.id]:
|
|
735
|
+
[CLAUDE_OPUS_4_1.id]: AnthropicCacheControlOptions &
|
|
736
|
+
AnthropicContainerOptions &
|
|
658
737
|
AnthropicContextManagementOptions &
|
|
659
738
|
AnthropicMCPOptions &
|
|
660
739
|
AnthropicServiceTierOptions &
|
|
@@ -665,7 +744,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
665
744
|
|
|
666
745
|
// Opus 4.7/4.8: adaptive thinking (or explicit disable), no
|
|
667
746
|
// budget_tokens, no sampling parameters — see the constants above.
|
|
668
|
-
[CLAUDE_OPUS_4_7.id]:
|
|
747
|
+
[CLAUDE_OPUS_4_7.id]: AnthropicCacheControlOptions &
|
|
748
|
+
AnthropicContainerOptions &
|
|
669
749
|
AnthropicContextManagementOptions &
|
|
670
750
|
AnthropicMCPOptions &
|
|
671
751
|
AnthropicServiceTierOptions &
|
|
@@ -674,7 +754,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
674
754
|
AnthropicToolChoiceOptions &
|
|
675
755
|
AnthropicMaxTokensOptions &
|
|
676
756
|
AnthropicOutputConfigOptions
|
|
677
|
-
[CLAUDE_OPUS_4_8.id]:
|
|
757
|
+
[CLAUDE_OPUS_4_8.id]: AnthropicCacheControlOptions &
|
|
758
|
+
AnthropicContainerOptions &
|
|
678
759
|
AnthropicContextManagementOptions &
|
|
679
760
|
AnthropicMCPOptions &
|
|
680
761
|
AnthropicServiceTierOptions &
|
|
@@ -686,7 +767,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
686
767
|
|
|
687
768
|
// Claude Fable 5: thinking always on (adaptive-only config); sampling
|
|
688
769
|
// parameters removed — see the CLAUDE_FABLE_5 constant above.
|
|
689
|
-
[CLAUDE_FABLE_5.id]:
|
|
770
|
+
[CLAUDE_FABLE_5.id]: AnthropicCacheControlOptions &
|
|
771
|
+
AnthropicContainerOptions &
|
|
690
772
|
AnthropicContextManagementOptions &
|
|
691
773
|
AnthropicMCPOptions &
|
|
692
774
|
AnthropicServiceTierOptions &
|
|
@@ -698,7 +780,8 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
698
780
|
// Claude Sonnet 5: adaptive thinking by default, explicit disable
|
|
699
781
|
// allowed; no budget_tokens, no sampling parameters — see the
|
|
700
782
|
// CLAUDE_SONNET_5 constant above.
|
|
701
|
-
[CLAUDE_SONNET_5.id]:
|
|
783
|
+
[CLAUDE_SONNET_5.id]: AnthropicCacheControlOptions &
|
|
784
|
+
AnthropicContainerOptions &
|
|
702
785
|
AnthropicContextManagementOptions &
|
|
703
786
|
AnthropicMCPOptions &
|
|
704
787
|
AnthropicServiceTierOptions &
|
|
@@ -707,6 +790,22 @@ export type AnthropicChatModelProviderOptionsByName = {
|
|
|
707
790
|
AnthropicToolChoiceOptions &
|
|
708
791
|
AnthropicMaxTokensOptions &
|
|
709
792
|
AnthropicOutputConfigOptions
|
|
793
|
+
[CLAUDE_OPUS_5.id]: AnthropicContainerOptions &
|
|
794
|
+
AnthropicContextManagementOptions &
|
|
795
|
+
AnthropicMCPOptions &
|
|
796
|
+
AnthropicServiceTierOptions &
|
|
797
|
+
AnthropicStopSequencesOptions &
|
|
798
|
+
AnthropicThinkingOptions &
|
|
799
|
+
AnthropicToolChoiceOptions &
|
|
800
|
+
AnthropicSamplingOptions
|
|
801
|
+
[CLAUDE_OPUS_5_FAST.id]: AnthropicContainerOptions &
|
|
802
|
+
AnthropicContextManagementOptions &
|
|
803
|
+
AnthropicMCPOptions &
|
|
804
|
+
AnthropicServiceTierOptions &
|
|
805
|
+
AnthropicStopSequencesOptions &
|
|
806
|
+
AnthropicThinkingOptions &
|
|
807
|
+
AnthropicToolChoiceOptions &
|
|
808
|
+
AnthropicSamplingOptions
|
|
710
809
|
}
|
|
711
810
|
|
|
712
811
|
export type AnthropicChatModelToolCapabilitiesByName = {
|
|
@@ -720,6 +819,8 @@ export type AnthropicChatModelToolCapabilitiesByName = {
|
|
|
720
819
|
[CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.tools
|
|
721
820
|
[CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.tools
|
|
722
821
|
[CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.tools
|
|
822
|
+
[CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.tools
|
|
823
|
+
[CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.tools
|
|
723
824
|
}
|
|
724
825
|
|
|
725
826
|
/**
|
|
@@ -744,4 +845,6 @@ export type AnthropicModelInputModalitiesByName = {
|
|
|
744
845
|
[CLAUDE_OPUS_4_8.id]: typeof CLAUDE_OPUS_4_8.supports.input
|
|
745
846
|
[CLAUDE_FABLE_5.id]: typeof CLAUDE_FABLE_5.supports.input
|
|
746
847
|
[CLAUDE_SONNET_5.id]: typeof CLAUDE_SONNET_5.supports.input
|
|
848
|
+
[CLAUDE_OPUS_5.id]: typeof CLAUDE_OPUS_5.supports.input
|
|
849
|
+
[CLAUDE_OPUS_5_FAST.id]: typeof CLAUDE_OPUS_5_FAST.supports.input
|
|
747
850
|
}
|
|
@@ -41,6 +41,22 @@ export interface AnthropicSystemPromptMetadata {
|
|
|
41
41
|
cache_control?: CacheControlEphemeral
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Top-level prompt-caching control.
|
|
46
|
+
*
|
|
47
|
+
* Anthropic's Messages API accepts `cache_control` as a request-level
|
|
48
|
+
* parameter: it auto-places the breakpoint on the last cacheable block of the
|
|
49
|
+
* rendered prompt (`tools` → `system` → `messages`). Use this when you don't
|
|
50
|
+
* need per-block placement; for a breakpoint on a specific system prompt, use
|
|
51
|
+
* the structured `systemPrompts` form with
|
|
52
|
+
* {@link AnthropicSystemPromptMetadata} instead.
|
|
53
|
+
*
|
|
54
|
+
* @see https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
|
|
55
|
+
*/
|
|
56
|
+
export interface AnthropicCacheControlOptions {
|
|
57
|
+
cache_control?: CacheControlEphemeral
|
|
58
|
+
}
|
|
59
|
+
|
|
44
60
|
export interface AnthropicContainerOptions {
|
|
45
61
|
/**
|
|
46
62
|
* Container identifier for reuse across requests.
|
|
@@ -288,7 +304,8 @@ Required range: x >= 0
|
|
|
288
304
|
max_tokens?: number
|
|
289
305
|
}
|
|
290
306
|
|
|
291
|
-
export type ExternalTextProviderOptions =
|
|
307
|
+
export type ExternalTextProviderOptions = AnthropicCacheControlOptions &
|
|
308
|
+
AnthropicContainerOptions &
|
|
292
309
|
AnthropicContextManagementOptions &
|
|
293
310
|
AnthropicMCPOptions &
|
|
294
311
|
AnthropicServiceTierOptions &
|