@tanstack/ai-anthropic 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/adapters/summarize.d.ts +54 -0
- package/dist/esm/adapters/summarize.js +117 -0
- package/dist/esm/adapters/summarize.js.map +1 -0
- package/dist/esm/adapters/text.d.ts +60 -0
- package/dist/esm/{anthropic-adapter.js → adapters/text.js} +109 -146
- package/dist/esm/adapters/text.js.map +1 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +8 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/text/text-provider-options.js.map +1 -1
- package/dist/esm/tools/custom-tool.d.ts +2 -3
- package/dist/esm/tools/custom-tool.js +6 -4
- package/dist/esm/tools/custom-tool.js.map +1 -1
- package/dist/esm/utils/client.d.ts +17 -0
- package/dist/esm/utils/client.js +25 -0
- package/dist/esm/utils/client.js.map +1 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/package.json +5 -6
- package/src/adapters/summarize.ts +200 -0
- package/src/{anthropic-adapter.ts → adapters/text.ts} +223 -262
- package/src/index.ts +25 -5
- package/src/text/text-provider-options.ts +1 -2
- package/src/tools/custom-tool.ts +10 -8
- package/src/utils/client.ts +45 -0
- package/src/utils/index.ts +6 -0
- package/dist/esm/anthropic-adapter.d.ts +0 -69
- package/dist/esm/anthropic-adapter.js.map +0 -1
- package/dist/esm/model-meta.js +0 -42
- package/dist/esm/model-meta.js.map +0 -1
package/src/index.ts
CHANGED
|
@@ -1,9 +1,29 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// New Tree-Shakeable Adapters (Recommended)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
// Text (Chat) adapter - for chat/text completion
|
|
6
|
+
export {
|
|
7
|
+
AnthropicTextAdapter,
|
|
8
|
+
anthropicText,
|
|
9
|
+
createAnthropicChat,
|
|
10
|
+
type AnthropicTextConfig,
|
|
11
|
+
type AnthropicTextProviderOptions,
|
|
12
|
+
} from './adapters/text'
|
|
13
|
+
|
|
14
|
+
// Summarize adapter - for text summarization
|
|
1
15
|
export {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
type
|
|
6
|
-
|
|
16
|
+
AnthropicSummarizeAdapter,
|
|
17
|
+
anthropicSummarize,
|
|
18
|
+
createAnthropicSummarize,
|
|
19
|
+
type AnthropicSummarizeConfig,
|
|
20
|
+
type AnthropicSummarizeProviderOptions,
|
|
21
|
+
} from './adapters/summarize'
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Type Exports
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
7
27
|
export type {
|
|
8
28
|
AnthropicChatModelProviderOptionsByName,
|
|
9
29
|
AnthropicModelInputModalitiesByName,
|
|
@@ -117,8 +117,7 @@ export type ExternalTextProviderOptions = AnthropicContainerOptions &
|
|
|
117
117
|
AnthropicToolChoiceOptions &
|
|
118
118
|
AnthropicSamplingOptions
|
|
119
119
|
|
|
120
|
-
export interface InternalTextProviderOptions
|
|
121
|
-
extends ExternalTextProviderOptions {
|
|
120
|
+
export interface InternalTextProviderOptions extends ExternalTextProviderOptions {
|
|
122
121
|
model: string
|
|
123
122
|
|
|
124
123
|
messages: Array<MessageParam>
|
package/src/tools/custom-tool.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { Tool } from '@tanstack/ai'
|
|
3
|
-
import type { z } from 'zod'
|
|
1
|
+
import type { JSONSchema, SchemaInput, Tool } from '@tanstack/ai'
|
|
4
2
|
import type { CacheControl } from '../text/text-provider-options'
|
|
5
3
|
|
|
6
4
|
export interface CustomTool {
|
|
@@ -29,13 +27,17 @@ export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool {
|
|
|
29
27
|
const metadata =
|
|
30
28
|
(tool.metadata as { cacheControl?: CacheControl | null } | undefined) || {}
|
|
31
29
|
|
|
32
|
-
//
|
|
33
|
-
const jsonSchema =
|
|
30
|
+
// Tool schemas are already converted to JSON Schema in the ai layer
|
|
31
|
+
const jsonSchema = (tool.inputSchema ?? {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {},
|
|
34
|
+
required: [],
|
|
35
|
+
}) as JSONSchema
|
|
34
36
|
|
|
35
37
|
const inputSchema = {
|
|
36
38
|
type: 'object' as const,
|
|
37
|
-
properties: jsonSchema
|
|
38
|
-
required: jsonSchema
|
|
39
|
+
properties: jsonSchema.properties || null,
|
|
40
|
+
required: jsonSchema.required || null,
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
return {
|
|
@@ -50,7 +52,7 @@ export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool {
|
|
|
50
52
|
export function customTool(
|
|
51
53
|
name: string,
|
|
52
54
|
description: string,
|
|
53
|
-
inputSchema:
|
|
55
|
+
inputSchema: SchemaInput,
|
|
54
56
|
cacheControl?: CacheControl | null,
|
|
55
57
|
): Tool {
|
|
56
58
|
return {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Anthropic_SDK from '@anthropic-ai/sdk'
|
|
2
|
+
|
|
3
|
+
export interface AnthropicClientConfig {
|
|
4
|
+
apiKey: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates an Anthropic SDK client instance
|
|
9
|
+
*/
|
|
10
|
+
export function createAnthropicClient(
|
|
11
|
+
config: AnthropicClientConfig,
|
|
12
|
+
): Anthropic_SDK {
|
|
13
|
+
return new Anthropic_SDK({
|
|
14
|
+
apiKey: config.apiKey,
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Gets Anthropic API key from environment variables
|
|
20
|
+
* @throws Error if ANTHROPIC_API_KEY is not found
|
|
21
|
+
*/
|
|
22
|
+
export function getAnthropicApiKeyFromEnv(): string {
|
|
23
|
+
const env =
|
|
24
|
+
typeof globalThis !== 'undefined' && (globalThis as any).window?.env
|
|
25
|
+
? (globalThis as any).window.env
|
|
26
|
+
: typeof process !== 'undefined'
|
|
27
|
+
? process.env
|
|
28
|
+
: undefined
|
|
29
|
+
const key = env?.ANTHROPIC_API_KEY
|
|
30
|
+
|
|
31
|
+
if (!key) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
'ANTHROPIC_API_KEY is required. Please set it in your environment variables or use the factory function with an explicit API key.',
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return key
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Generates a unique ID with a prefix
|
|
42
|
+
*/
|
|
43
|
+
export function generateId(prefix: string): string {
|
|
44
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(7)}`
|
|
45
|
+
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { BaseAdapter, ChatOptions, EmbeddingOptions, EmbeddingResult, StreamChunk, SummarizationOptions, SummarizationResult } from '@tanstack/ai';
|
|
2
|
-
import { ANTHROPIC_MODELS, AnthropicChatModelProviderOptionsByName, AnthropicModelInputModalitiesByName } from './model-meta.js';
|
|
3
|
-
import { AnthropicMessageMetadataByModality } from './message-types.js';
|
|
4
|
-
import { ExternalTextProviderOptions } from './text/text-provider-options.js';
|
|
5
|
-
export interface AnthropicConfig {
|
|
6
|
-
apiKey: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Anthropic-specific provider options
|
|
10
|
-
* @see https://ai-sdk.dev/providers/ai-sdk-providers/anthropic
|
|
11
|
-
*/
|
|
12
|
-
export type AnthropicProviderOptions = ExternalTextProviderOptions;
|
|
13
|
-
export declare class Anthropic extends BaseAdapter<typeof ANTHROPIC_MODELS, [
|
|
14
|
-
], AnthropicProviderOptions, Record<string, any>, AnthropicChatModelProviderOptionsByName, AnthropicModelInputModalitiesByName, AnthropicMessageMetadataByModality> {
|
|
15
|
-
name: "anthropic";
|
|
16
|
-
models: readonly ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-4-5", "claude-opus-4-1", "claude-sonnet-4", "claude-3-7-sonnet", "claude-opus-4", "claude-3-5-haiku", "claude-3-haiku"];
|
|
17
|
-
_modelProviderOptionsByName: AnthropicChatModelProviderOptionsByName;
|
|
18
|
-
_modelInputModalitiesByName: AnthropicModelInputModalitiesByName;
|
|
19
|
-
_messageMetadataByModality: AnthropicMessageMetadataByModality;
|
|
20
|
-
private client;
|
|
21
|
-
constructor(config: AnthropicConfig);
|
|
22
|
-
chatStream(options: ChatOptions<string, AnthropicProviderOptions>): AsyncIterable<StreamChunk>;
|
|
23
|
-
summarize(options: SummarizationOptions): Promise<SummarizationResult>;
|
|
24
|
-
createEmbeddings(_options: EmbeddingOptions): Promise<EmbeddingResult>;
|
|
25
|
-
private buildSummarizationPrompt;
|
|
26
|
-
/**
|
|
27
|
-
* Maps common options to Anthropic-specific format
|
|
28
|
-
* Handles translation of normalized options to Anthropic's API format
|
|
29
|
-
*/
|
|
30
|
-
private mapCommonOptionsToAnthropic;
|
|
31
|
-
private convertContentPartToAnthropic;
|
|
32
|
-
private formatMessages;
|
|
33
|
-
private processAnthropicStream;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Creates an Anthropic adapter with simplified configuration
|
|
37
|
-
* @param apiKey - Your Anthropic API key
|
|
38
|
-
* @returns A fully configured Anthropic adapter instance
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```typescript
|
|
42
|
-
* const anthropic = createAnthropic("sk-ant-...");
|
|
43
|
-
*
|
|
44
|
-
* const ai = new AI({
|
|
45
|
-
* adapters: {
|
|
46
|
-
* anthropic,
|
|
47
|
-
* }
|
|
48
|
-
* });
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export declare function createAnthropic(apiKey: string, config?: Omit<AnthropicConfig, 'apiKey'>): Anthropic;
|
|
52
|
-
/**
|
|
53
|
-
* Create an Anthropic adapter with automatic API key detection from environment variables.
|
|
54
|
-
*
|
|
55
|
-
* Looks for `ANTHROPIC_API_KEY` in:
|
|
56
|
-
* - `process.env` (Node.js)
|
|
57
|
-
* - `window.env` (Browser with injected env)
|
|
58
|
-
*
|
|
59
|
-
* @param config - Optional configuration (excluding apiKey which is auto-detected)
|
|
60
|
-
* @returns Configured Anthropic adapter instance
|
|
61
|
-
* @throws Error if ANTHROPIC_API_KEY is not found in environment
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```typescript
|
|
65
|
-
* // Automatically uses ANTHROPIC_API_KEY from environment
|
|
66
|
-
* const aiInstance = ai(anthropic());
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
export declare function anthropic(config?: Omit<AnthropicConfig, 'apiKey'>): Anthropic;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-adapter.js","sources":["../../src/anthropic-adapter.ts"],"sourcesContent":["import Anthropic_SDK from '@anthropic-ai/sdk'\nimport { BaseAdapter } from '@tanstack/ai'\nimport { ANTHROPIC_MODELS } from './model-meta'\nimport { convertToolsToProviderFormat } from './tools/tool-converter'\nimport { validateTextProviderOptions } from './text/text-provider-options'\nimport type {\n AnthropicDocumentMetadata,\n AnthropicImageMetadata,\n AnthropicMessageMetadataByModality,\n AnthropicTextMetadata,\n} from './message-types'\nimport type {\n ChatOptions,\n ContentPart,\n EmbeddingOptions,\n EmbeddingResult,\n ModelMessage,\n StreamChunk,\n SummarizationOptions,\n SummarizationResult,\n} from '@tanstack/ai'\nimport type {\n AnthropicChatModelProviderOptionsByName,\n AnthropicModelInputModalitiesByName,\n} from './model-meta'\nimport type {\n ExternalTextProviderOptions,\n InternalTextProviderOptions,\n} from './text/text-provider-options'\nimport type {\n Base64ImageSource,\n Base64PDFSource,\n DocumentBlockParam,\n ImageBlockParam,\n MessageParam,\n TextBlockParam,\n URLImageSource,\n URLPDFSource,\n} from '@anthropic-ai/sdk/resources/messages'\n\nexport interface AnthropicConfig {\n apiKey: string\n}\n\n/**\n * Anthropic-specific provider options\n * @see https://ai-sdk.dev/providers/ai-sdk-providers/anthropic\n */\nexport type AnthropicProviderOptions = ExternalTextProviderOptions\n\ntype AnthropicContentBlocks =\n Extract<MessageParam['content'], Array<unknown>> extends Array<infer Block>\n ? Array<Block>\n : never\ntype AnthropicContentBlock =\n AnthropicContentBlocks extends Array<infer Block> ? Block : never\n\nexport class Anthropic extends BaseAdapter<\n typeof ANTHROPIC_MODELS,\n [],\n AnthropicProviderOptions,\n Record<string, any>,\n AnthropicChatModelProviderOptionsByName,\n AnthropicModelInputModalitiesByName,\n AnthropicMessageMetadataByModality\n> {\n name = 'anthropic' as const\n models = ANTHROPIC_MODELS\n\n declare _modelProviderOptionsByName: AnthropicChatModelProviderOptionsByName\n declare _modelInputModalitiesByName: AnthropicModelInputModalitiesByName\n declare _messageMetadataByModality: AnthropicMessageMetadataByModality\n\n private client: Anthropic_SDK\n\n constructor(config: AnthropicConfig) {\n super({})\n this.client = new Anthropic_SDK({\n apiKey: config.apiKey,\n })\n }\n\n async *chatStream(\n options: ChatOptions<string, AnthropicProviderOptions>,\n ): AsyncIterable<StreamChunk> {\n try {\n // Map common options to Anthropic format using the centralized mapping function\n const requestParams = this.mapCommonOptionsToAnthropic(options)\n\n const stream = await this.client.beta.messages.create(\n { ...requestParams, stream: true },\n {\n signal: options.request?.signal,\n headers: options.request?.headers,\n },\n )\n\n yield* this.processAnthropicStream(stream, options.model, () =>\n this.generateId(),\n )\n } catch (error: any) {\n console.error('[Anthropic Adapter] Error in chatStream:', {\n message: error?.message,\n status: error?.status,\n statusText: error?.statusText,\n code: error?.code,\n type: error?.type,\n error: error,\n stack: error?.stack,\n })\n\n // Emit an error chunk\n yield {\n type: 'error',\n id: this.generateId(),\n model: options.model,\n timestamp: Date.now(),\n error: {\n message: error?.message || 'Unknown error occurred',\n code: error?.code || error?.status,\n },\n }\n }\n }\n\n async summarize(options: SummarizationOptions): Promise<SummarizationResult> {\n const systemPrompt = this.buildSummarizationPrompt(options)\n\n const response = await this.client.messages.create({\n model: options.model,\n messages: [{ role: 'user', content: options.text }],\n system: systemPrompt,\n max_tokens: options.maxLength || 500,\n temperature: 0.3,\n stream: false,\n })\n\n const content = response.content\n .map((c) => (c.type === 'text' ? c.text : ''))\n .join('')\n\n return {\n id: response.id,\n model: response.model,\n summary: content,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n }\n }\n\n createEmbeddings(_options: EmbeddingOptions): Promise<EmbeddingResult> {\n // Note: Anthropic doesn't have a native embeddings API\n // You would need to use a different service or implement a workaround\n throw new Error(\n 'Embeddings are not natively supported by Anthropic. Consider using OpenAI or another provider for embeddings.',\n )\n }\n\n private buildSummarizationPrompt(options: SummarizationOptions): string {\n let prompt = 'You are a professional summarizer. '\n\n switch (options.style) {\n case 'bullet-points':\n prompt += 'Provide a summary in bullet point format. '\n break\n case 'paragraph':\n prompt += 'Provide a summary in paragraph format. '\n break\n case 'concise':\n prompt += 'Provide a very concise summary in 1-2 sentences. '\n break\n default:\n prompt += 'Provide a clear and concise summary. '\n }\n\n if (options.focus && options.focus.length > 0) {\n prompt += `Focus on the following aspects: ${options.focus.join(', ')}. `\n }\n\n if (options.maxLength) {\n prompt += `Keep the summary under ${options.maxLength} tokens. `\n }\n\n return prompt\n }\n\n /**\n * Maps common options to Anthropic-specific format\n * Handles translation of normalized options to Anthropic's API format\n */\n private mapCommonOptionsToAnthropic(\n options: ChatOptions<string, AnthropicProviderOptions>,\n ) {\n const providerOptions = options.providerOptions as\n | InternalTextProviderOptions\n | undefined\n\n const formattedMessages = this.formatMessages(options.messages)\n const tools = options.tools\n ? convertToolsToProviderFormat(options.tools)\n : undefined\n\n // Filter out invalid fields from providerOptions (like 'store' which is OpenAI-specific)\n const validProviderOptions: Partial<InternalTextProviderOptions> = {}\n if (providerOptions) {\n const validKeys: Array<keyof InternalTextProviderOptions> = [\n 'container',\n 'context_management',\n 'mcp_servers',\n 'service_tier',\n 'stop_sequences',\n 'system',\n 'thinking',\n 'tool_choice',\n 'top_k',\n ]\n for (const key of validKeys) {\n if (key in providerOptions) {\n const value = providerOptions[key]\n // Anthropic expects tool_choice to be an object, not a string\n if (key === 'tool_choice' && typeof value === 'string') {\n ;(validProviderOptions as any)[key] = { type: value }\n } else {\n ;(validProviderOptions as any)[key] = value\n }\n }\n }\n }\n\n // Ensure max_tokens is greater than thinking.budget_tokens if thinking is enabled\n const thinkingBudget =\n validProviderOptions.thinking?.type === 'enabled'\n ? validProviderOptions.thinking.budget_tokens\n : undefined\n const defaultMaxTokens = options.options?.maxTokens || 1024\n const maxTokens =\n thinkingBudget && thinkingBudget >= defaultMaxTokens\n ? thinkingBudget + 1 // Ensure max_tokens is greater than budget_tokens\n : defaultMaxTokens\n\n const requestParams: InternalTextProviderOptions = {\n model: options.model,\n max_tokens: maxTokens,\n temperature: options.options?.temperature,\n top_p: options.options?.topP,\n messages: formattedMessages,\n system: options.systemPrompts?.join('\\n'),\n tools: tools,\n ...validProviderOptions,\n }\n validateTextProviderOptions(requestParams)\n return requestParams\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 any as\n | AnthropicTextMetadata\n | undefined\n return {\n type: 'text',\n text: part.content,\n ...metadata,\n }\n }\n\n case 'image': {\n const metadata = part.metadata as any as\n | AnthropicImageMetadata\n | undefined\n const imageSource: Base64ImageSource | URLImageSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: metadata?.mediaType ?? 'image/jpeg',\n }\n : {\n type: 'url',\n url: part.source.value,\n }\n // exclude the media type\n const { mediaType, ...meta } = metadata || {}\n return {\n type: 'image',\n source: imageSource,\n ...meta,\n }\n }\n case 'document': {\n const metadata = part.metadata as any as\n | AnthropicDocumentMetadata\n | undefined\n const docSource: Base64PDFSource | URLPDFSource =\n part.source.type === 'data'\n ? {\n type: 'base64',\n data: part.source.value,\n media_type: '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 // Anthropic doesn't support audio/video directly, treat as text with a note\n throw new Error(\n `Anthropic does not support ${part.type} content directly`,\n )\n default: {\n // Exhaustive check - this should never happen with known types\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 formattedMessages.push({\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content:\n typeof message.content === 'string' ? message.content : '',\n },\n ],\n })\n continue\n }\n\n if (role === 'assistant' && message.toolCalls?.length) {\n const contentBlocks: AnthropicContentBlocks = []\n\n if (message.content) {\n const content =\n typeof message.content === 'string' ? message.content : ''\n const textBlock: AnthropicContentBlock = {\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 parsedInput = toolCall.function.arguments\n ? JSON.parse(toolCall.function.arguments)\n : {}\n } catch {\n parsedInput = toolCall.function.arguments\n }\n\n const toolUseBlock: AnthropicContentBlock = {\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 // Handle user messages with multimodal content\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: role === 'assistant' ? 'assistant' : '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 return formattedMessages\n }\n\n private async *processAnthropicStream(\n stream: AsyncIterable<Anthropic_SDK.Beta.BetaRawMessageStreamEvent>,\n model: string,\n generateId: () => string,\n ): AsyncIterable<StreamChunk> {\n let accumulatedContent = ''\n let accumulatedThinking = ''\n const timestamp = Date.now()\n const toolCallsMap = new Map<\n number,\n { id: string; name: string; input: string }\n >()\n let currentToolIndex = -1\n\n try {\n for await (const event of stream) {\n if (event.type === 'content_block_start') {\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 })\n } else if (event.content_block.type === 'thinking') {\n // Reset thinking content when a new thinking block starts\n accumulatedThinking = ''\n }\n } else if (event.type === 'content_block_delta') {\n if (event.delta.type === 'text_delta') {\n const delta = event.delta.text\n accumulatedContent += delta\n yield {\n type: 'content',\n id: generateId(),\n model: model,\n timestamp,\n delta,\n content: accumulatedContent,\n role: 'assistant',\n }\n } else if (event.delta.type === 'thinking_delta') {\n // Handle thinking content\n const delta = event.delta.thinking\n accumulatedThinking += delta\n yield {\n type: 'thinking',\n id: generateId(),\n model: model,\n timestamp,\n delta,\n content: accumulatedThinking,\n }\n } else if (event.delta.type === 'input_json_delta') {\n // Tool input is being streamed\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing) {\n // Accumulate the input for final processing\n existing.input += event.delta.partial_json\n\n // Yield the DELTA (partial_json), not the full accumulated input\n // The stream processor will concatenate these deltas\n yield {\n type: 'tool_call',\n id: generateId(),\n model: model,\n timestamp,\n toolCall: {\n id: existing.id,\n type: 'function',\n function: {\n name: existing.name,\n arguments: event.delta.partial_json,\n },\n },\n index: currentToolIndex,\n }\n }\n }\n } else if (event.type === 'content_block_stop') {\n // If this is a tool call and we haven't received any input deltas,\n // emit a tool_call chunk with empty arguments\n const existing = toolCallsMap.get(currentToolIndex)\n if (existing && existing.input === '') {\n // No input_json_delta events received, emit empty arguments\n yield {\n type: 'tool_call',\n id: generateId(),\n model: model,\n timestamp,\n toolCall: {\n id: existing.id,\n type: 'function',\n function: {\n name: existing.name,\n arguments: '{}',\n },\n },\n index: currentToolIndex,\n }\n }\n } else if (event.type === 'message_stop') {\n yield {\n type: 'done',\n id: generateId(),\n model: model,\n timestamp,\n finishReason: 'stop',\n }\n } else if (event.type === 'message_delta') {\n if (event.delta.stop_reason) {\n switch (event.delta.stop_reason) {\n case 'tool_use': {\n yield {\n type: 'done',\n id: generateId(),\n model: model,\n timestamp,\n finishReason: 'tool_calls',\n\n usage: {\n promptTokens: event.usage.input_tokens || 0,\n completionTokens: event.usage.output_tokens || 0,\n totalTokens:\n (event.usage.input_tokens || 0) +\n (event.usage.output_tokens || 0),\n },\n }\n break\n }\n case 'max_tokens': {\n yield {\n type: 'error',\n id: generateId(),\n model: model,\n timestamp,\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 'model_context_window_exceeded': {\n yield {\n type: 'error',\n id: generateId(),\n model: model,\n timestamp,\n error: {\n message:\n \"The response was cut off because the model's context window was exceeded.\",\n code: 'context_window_exceeded',\n },\n }\n break\n }\n case 'refusal': {\n yield {\n type: 'error',\n id: generateId(),\n model: model,\n timestamp,\n error: {\n message: 'The model refused to complete the request.',\n code: 'refusal',\n },\n }\n break\n }\n default: {\n yield {\n type: 'done',\n id: generateId(),\n model: model,\n timestamp,\n finishReason: 'stop',\n usage: {\n promptTokens: event.usage.input_tokens || 0,\n completionTokens: event.usage.output_tokens || 0,\n totalTokens:\n (event.usage.input_tokens || 0) +\n (event.usage.output_tokens || 0),\n },\n }\n }\n }\n }\n }\n }\n } catch (error: any) {\n console.error('[Anthropic Adapter] Error in processAnthropicStream:', {\n message: error?.message,\n status: error?.status,\n statusText: error?.statusText,\n code: error?.code,\n type: error?.type,\n error: error,\n stack: error?.stack,\n })\n\n yield {\n type: 'error',\n id: generateId(),\n model: model,\n timestamp,\n error: {\n message: error?.message || 'Unknown error occurred',\n code: error?.code || error?.status,\n },\n }\n }\n }\n}\n/**\n * Creates an Anthropic adapter with simplified configuration\n * @param apiKey - Your Anthropic API key\n * @returns A fully configured Anthropic adapter instance\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic(\"sk-ant-...\");\n *\n * const ai = new AI({\n * adapters: {\n * anthropic,\n * }\n * });\n * ```\n */\nexport function createAnthropic(\n apiKey: string,\n config?: Omit<AnthropicConfig, 'apiKey'>,\n): Anthropic {\n return new Anthropic({ apiKey, ...config })\n}\n\n/**\n * Create an Anthropic adapter with automatic API key detection from environment variables.\n *\n * Looks for `ANTHROPIC_API_KEY` in:\n * - `process.env` (Node.js)\n * - `window.env` (Browser with injected env)\n *\n * @param config - Optional configuration (excluding apiKey which is auto-detected)\n * @returns Configured Anthropic adapter instance\n * @throws Error if ANTHROPIC_API_KEY is not found in environment\n *\n * @example\n * ```typescript\n * // Automatically uses ANTHROPIC_API_KEY from environment\n * const aiInstance = ai(anthropic());\n * ```\n */\nexport function anthropic(config?: Omit<AnthropicConfig, 'apiKey'>): Anthropic {\n const env =\n typeof globalThis !== 'undefined' && (globalThis as any).window?.env\n ? (globalThis as any).window.env\n : typeof process !== 'undefined'\n ? process.env\n : undefined\n const key = env?.ANTHROPIC_API_KEY\n\n if (!key) {\n throw new Error(\n 'ANTHROPIC_API_KEY is required. Please set it in your environment variables or use createAnthropic(apiKey, config) instead.',\n )\n }\n\n return createAnthropic(key, config)\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/model-meta.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const CLAUDE_SONNET_4_5 = {
|
|
2
|
-
id: "claude-sonnet-4-5"
|
|
3
|
-
};
|
|
4
|
-
const CLAUDE_HAIKU_4_5 = {
|
|
5
|
-
id: "claude-haiku-4-5"
|
|
6
|
-
};
|
|
7
|
-
const CLAUDE_OPUS_4_1 = {
|
|
8
|
-
id: "claude-opus-4-1"
|
|
9
|
-
};
|
|
10
|
-
const CLAUDE_OPUS_4_5 = {
|
|
11
|
-
id: "claude-opus-4-5"
|
|
12
|
-
};
|
|
13
|
-
const CLAUDE_SONNET_4 = {
|
|
14
|
-
id: "claude-sonnet-4"
|
|
15
|
-
};
|
|
16
|
-
const CLAUDE_SONNET_3_7 = {
|
|
17
|
-
id: "claude-3-7-sonnet"
|
|
18
|
-
};
|
|
19
|
-
const CLAUDE_OPUS_4 = {
|
|
20
|
-
id: "claude-opus-4"
|
|
21
|
-
};
|
|
22
|
-
const CLAUDE_HAIKU_3_5 = {
|
|
23
|
-
id: "claude-3-5-haiku"
|
|
24
|
-
};
|
|
25
|
-
const CLAUDE_HAIKU_3 = {
|
|
26
|
-
id: "claude-3-haiku"
|
|
27
|
-
};
|
|
28
|
-
const ANTHROPIC_MODELS = [
|
|
29
|
-
CLAUDE_OPUS_4_5.id,
|
|
30
|
-
CLAUDE_SONNET_4_5.id,
|
|
31
|
-
CLAUDE_HAIKU_4_5.id,
|
|
32
|
-
CLAUDE_OPUS_4_1.id,
|
|
33
|
-
CLAUDE_SONNET_4.id,
|
|
34
|
-
CLAUDE_SONNET_3_7.id,
|
|
35
|
-
CLAUDE_OPUS_4.id,
|
|
36
|
-
CLAUDE_HAIKU_3_5.id,
|
|
37
|
-
CLAUDE_HAIKU_3.id
|
|
38
|
-
];
|
|
39
|
-
export {
|
|
40
|
-
ANTHROPIC_MODELS
|
|
41
|
-
};
|
|
42
|
-
//# sourceMappingURL=model-meta.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-meta.js","sources":["../../src/model-meta.ts"],"sourcesContent":["import type {\n AnthropicContainerOptions,\n AnthropicContextManagementOptions,\n AnthropicMCPOptions,\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 priority_tier?: boolean\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}\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 },\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 },\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 },\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_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 },\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_SONNET_4 = {\n name: 'claude-sonnet-4',\n id: 'claude-sonnet-4',\n context_window: 200_000,\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-05-14',\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 },\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_SONNET_3_7 = {\n name: 'claude-sonnet-3-7',\n id: 'claude-3-7-sonnet',\n max_output_tokens: 64_000,\n knowledge_cutoff: '2025-05-14',\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 },\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 = {\n name: 'claude-opus-4',\n id: 'claude-opus-4',\n context_window: 200_000,\n max_output_tokens: 32_000,\n knowledge_cutoff: '2025-05-14',\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 },\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_3_5 = {\n name: 'claude-haiku-3-5',\n id: 'claude-3-5-haiku',\n context_window: 200_000,\n max_output_tokens: 8_000,\n knowledge_cutoff: '2025-10-22',\n pricing: {\n input: {\n normal: 0.8,\n },\n output: {\n normal: 4,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n priority_tier: true,\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_3 = {\n name: 'claude-haiku-3',\n id: 'claude-3-haiku',\n context_window: 200_000,\n max_output_tokens: 4_000,\n knowledge_cutoff: '2024-03-07',\n pricing: {\n input: {\n normal: 0.25,\n },\n output: {\n normal: 1.25,\n },\n },\n supports: {\n input: ['text', 'image', 'document'],\n extended_thinking: false,\n priority_tier: false,\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/* const ANTHROPIC_MODEL_META = {\n [CLAUDE_OPUS_4_5.name]: CLAUDE_OPUS_4_5,\n [CLAUDE_SONNET_4_5.name]: CLAUDE_SONNET_4_5,\n [CLAUDE_HAIKU_4_5.name]: CLAUDE_HAIKU_4_5,\n [CLAUDE_OPUS_4_1.name]: CLAUDE_OPUS_4_1,\n [CLAUDE_SONNET_4.name]: CLAUDE_SONNET_4,\n [CLAUDE_SONNET_3_7.name]: CLAUDE_SONNET_3_7,\n [CLAUDE_OPUS_4.name]: CLAUDE_OPUS_4,\n [CLAUDE_HAIKU_3_5.name]: CLAUDE_HAIKU_3_5,\n [CLAUDE_HAIKU_3.name]: CLAUDE_HAIKU_3,\n} as const */\n\n/* export type AnthropicModelProviderOptions<\n TModel extends keyof AnthropicModelMetaMap,\n> =\n AnthropicModelMetaMap[TModel] extends ModelMeta<\n infer TProviderOptions,\n any,\n any\n >\n ? TProviderOptions\n : unknown */\n\n/* export type AnthropicModelToolCapabilities<\n TModel extends keyof AnthropicModelMetaMap,\n> =\n AnthropicModelMetaMap[TModel] extends ModelMeta<\n any,\n infer TToolCapabilities,\n any\n >\n ? TToolCapabilities\n : unknown\n */\n/* export type AnthropicModelMessageCapabilities<\n TModel extends keyof AnthropicModelMetaMap,\n> =\n AnthropicModelMetaMap[TModel] extends ModelMeta<\n any,\n any,\n infer TMessageCapabilities\n >\n ? TMessageCapabilities\n : unknown */\n\nexport const ANTHROPIC_MODELS = [\n CLAUDE_OPUS_4_5.id,\n CLAUDE_SONNET_4_5.id,\n CLAUDE_HAIKU_4_5.id,\n CLAUDE_OPUS_4_1.id,\n CLAUDE_SONNET_4.id,\n CLAUDE_SONNET_3_7.id,\n CLAUDE_OPUS_4.id,\n CLAUDE_HAIKU_3_5.id,\n CLAUDE_HAIKU_3.id,\n] as const\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\n/* type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] */\n\n// Manual type map for per-model provider options\n// Models are differentiated by extended_thinking and priority_tier support\nexport type AnthropicChatModelProviderOptionsByName = {\n // Models with both extended_thinking and priority_tier\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 [CLAUDE_SONNET_4.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_SONNET_3_7.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n [CLAUDE_OPUS_4.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicThinkingOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Model with priority_tier but NO extended_thinking\n [CLAUDE_HAIKU_3_5.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicServiceTierOptions &\n AnthropicStopSequencesOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\n\n // Model with neither extended_thinking nor priority_tier\n [CLAUDE_HAIKU_3.id]: AnthropicContainerOptions &\n AnthropicContextManagementOptions &\n AnthropicMCPOptions &\n AnthropicStopSequencesOptions &\n AnthropicToolChoiceOptions &\n AnthropicSamplingOptions\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_5.id]: typeof CLAUDE_OPUS_4_5.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_SONNET_4.id]: typeof CLAUDE_SONNET_4.supports.input\n [CLAUDE_SONNET_3_7.id]: typeof CLAUDE_SONNET_3_7.supports.input\n [CLAUDE_OPUS_4.id]: typeof CLAUDE_OPUS_4.supports.input\n [CLAUDE_HAIKU_3_5.id]: typeof CLAUDE_HAIKU_3_5.supports.input\n [CLAUDE_HAIKU_3.id]: typeof CLAUDE_HAIKU_3.supports.input\n}\n"],"names":[],"mappings":"AAgDA,MAAM,oBAAoB;AAAA,EAExB,IAAI;AAiBN;AAWA,MAAM,mBAAmB;AAAA,EAEvB,IAAI;AAiBN;AAWA,MAAM,kBAAkB;AAAA,EAEtB,IAAI;AAiBN;AAWA,MAAM,kBAAkB;AAAA,EAEtB,IAAI;AAiBN;AAWA,MAAM,kBAAkB;AAAA,EAEtB,IAAI;AAiBN;AAWA,MAAM,oBAAoB;AAAA,EAExB,IAAI;AAgBN;AAWA,MAAM,gBAAgB;AAAA,EAEpB,IAAI;AAiBN;AAWA,MAAM,mBAAmB;AAAA,EAEvB,IAAI;AAiBN;AAWA,MAAM,iBAAiB;AAAA,EAErB,IAAI;AAiBN;AAwDO,MAAM,mBAAmB;AAAA,EAC9B,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,eAAe;AACjB;"}
|