@simulacra-ai/anthropic 0.0.6 → 0.0.9
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/index.cjs +2 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -12
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/dist/index.cjs
CHANGED
|
@@ -50,14 +50,7 @@ var AnthropicProvider = class _AnthropicProvider {
|
|
|
50
50
|
* @returns A promise that resolves when the request completes.
|
|
51
51
|
*/
|
|
52
52
|
async execute_request(request, receiver, cancellation) {
|
|
53
|
-
const {
|
|
54
|
-
model,
|
|
55
|
-
max_tokens,
|
|
56
|
-
thinking,
|
|
57
|
-
prompt_caching,
|
|
58
|
-
request_options,
|
|
59
|
-
...api_extras
|
|
60
|
-
} = this.#config;
|
|
53
|
+
const { model, max_tokens, thinking, prompt_caching, request_options, ...api_extras } = this.#config;
|
|
61
54
|
const cache_system = prompt_caching?.system_prompt !== false;
|
|
62
55
|
const cache_tools = prompt_caching?.toolkit !== false;
|
|
63
56
|
const tools = request.tools.map((t) => to_anthropic_tool(t));
|
|
@@ -84,10 +77,7 @@ var AnthropicProvider = class _AnthropicProvider {
|
|
|
84
77
|
receiver.before_request({ params });
|
|
85
78
|
receiver.request_raw(params);
|
|
86
79
|
const resolved_options = typeof request_options === "function" ? await request_options() : request_options;
|
|
87
|
-
const response = await this.#sdk.messages.create(
|
|
88
|
-
params,
|
|
89
|
-
resolved_options
|
|
90
|
-
);
|
|
80
|
+
const response = await this.#sdk.messages.create(params, resolved_options);
|
|
91
81
|
this.#stream_response(response, receiver, cancellation);
|
|
92
82
|
}
|
|
93
83
|
/**
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/anthropic-provider.ts"],"sourcesContent":["export { AnthropicProvider, type AnthropicProviderConfig } from \"./anthropic-provider.ts\";\n","import Anthropic from \"@anthropic-ai/sdk\";\n\nimport type {\n AssistantContent,\n AssistantMessage,\n CancellationToken,\n Content,\n Message,\n ModelProvider,\n ModelRequest,\n ParameterType,\n ProviderContextTransformer,\n StreamReceiver,\n ToolDefinition,\n} from \"@simulacra-ai/core\";\n\n/**\n * Configuration options for the Anthropic provider.\n */\nexport interface AnthropicProviderConfig extends Record<string, unknown> {\n /** The model identifier to use. */\n model: string;\n /** The maximum number of tokens to generate in the response. */\n max_tokens?: number;\n /** Configuration for extended thinking mode. */\n thinking?: {\n /** Whether to enable extended thinking. */\n enable: boolean;\n /** The token budget allocated for thinking. */\n budget_tokens?: number;\n };\n /** Configuration for prompt caching. Enabled by default when omitted. Cache writes cost more per token than standard requests, but cache reads on subsequent turns cost less. */\n prompt_caching?: {\n /** Whether to cache the system prompt. */\n system_prompt?: boolean;\n /** Whether to cache the tool definitions. */\n toolkit?: boolean;\n };\n /** Custom request options passed to every SDK call. Accepts a static object or a function that returns (or resolves to) request options. Useful for injecting custom authentication headers or other per-request configuration. */\n request_options?: Anthropic.RequestOptions | (() => Anthropic.RequestOptions | Promise<Anthropic.RequestOptions>);\n}\n\n/**\n * Model provider implementation for Anthropic's Claude models.\n *\n * This provider wraps the Anthropic SDK to provide streaming completions with support\n * for tool use, extended thinking, and prompt caching. It handles message formatting,\n * content streaming, and usage tracking according to the ModelProvider interface.\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly #sdk: Anthropic;\n readonly #config: AnthropicProviderConfig;\n readonly context_transformers: ProviderContextTransformer[];\n\n /**\n * Creates a new Anthropic provider instance.\n *\n * @param sdk - The initialized Anthropic SDK client.\n * @param config - Configuration options for the provider.\n * @param context_transformers - Provider-level context transformers.\n */\n constructor(\n sdk: Anthropic,\n config: AnthropicProviderConfig,\n context_transformers: ProviderContextTransformer[] = [],\n ) {\n this.#sdk = sdk;\n this.#config = config;\n this.context_transformers = context_transformers;\n }\n\n /**\n * Executes a model request and streams the response through the provided receiver.\n *\n * @param request - The request containing messages, tools, and system prompt.\n * @param receiver - The receiver that handles streaming events.\n * @param cancellation - Token to signal cancellation of the request.\n * @returns A promise that resolves when the request completes.\n */\n async execute_request(\n request: ModelRequest,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ): Promise<void> {\n const {\n model,\n max_tokens,\n thinking,\n prompt_caching,\n request_options,\n ...api_extras\n } = this.#config;\n const cache_system = prompt_caching?.system_prompt !== false;\n const cache_tools = prompt_caching?.toolkit !== false;\n\n const tools = request.tools.map((t) => to_anthropic_tool(t));\n\n if (cache_tools && tools.length > 0) {\n const last = tools.length - 1;\n (tools[last] as Anthropic.Messages.Tool).cache_control = { type: \"ephemeral\" };\n }\n\n const system: Anthropic.MessageCreateParamsStreaming[\"system\"] =\n cache_system && request.system\n ? [{ type: \"text\", text: request.system, cache_control: { type: \"ephemeral\" } }]\n : request.system;\n\n const params: Anthropic.MessageCreateParamsStreaming = {\n ...api_extras,\n model,\n stream: true,\n system,\n max_tokens: max_tokens ?? 8_192,\n thinking:\n thinking?.enable && thinking?.budget_tokens\n ? {\n type: \"enabled\",\n budget_tokens: thinking.budget_tokens,\n }\n : {\n type: \"disabled\",\n },\n tools,\n messages: request.messages.map((m) => to_anthropic_message(m)),\n };\n receiver.before_request({ params });\n receiver.request_raw(params);\n\n const resolved_options = typeof request_options === \"function\"\n ? await request_options()\n : request_options;\n\n const response = await this.#sdk.messages.create(\n params,\n resolved_options,\n );\n\n // Intentionally not awaited. Streaming is event-driven through the receiver.\n // The policy wraps only connection establishment; chunk processing flows\n // asynchronously via StreamListener events back to the conversation.\n this.#stream_response(response, receiver, cancellation);\n }\n\n /**\n * Creates a clone of this provider with the same configuration.\n *\n * @returns A new provider instance with identical configuration.\n */\n clone(): ModelProvider {\n return new AnthropicProvider(this.#sdk, this.#config, this.context_transformers);\n }\n\n async #stream_response(\n stream: AsyncIterable<Anthropic.Messages.RawMessageStreamEvent>,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ) {\n try {\n let usage: Record<string, number> = {};\n let message: Partial<Anthropic.Message> & { content: Anthropic.ContentBlock[] } = {\n content: [],\n };\n const json: string[] = [];\n for await (const chunk of stream) {\n if (cancellation.is_cancellation_requested) {\n receiver.cancel();\n return;\n }\n receiver.stream_raw(chunk);\n switch (chunk.type) {\n case \"message_start\": {\n usage = Object.fromEntries(\n Object.entries(chunk.message.usage).filter(([, v]) => typeof v === \"number\"),\n ) as Record<string, number>;\n message = chunk.message;\n receiver.start_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_delta\": {\n usage = {\n ...usage,\n ...Object.fromEntries(\n Object.entries(chunk.usage).filter(([, v]) => typeof v === \"number\"),\n ),\n };\n message = { ...message, ...chunk.delta };\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_stop\": {\n const raw_stop = message.stop_reason ?? \"end_turn\";\n const stop_reason = (\n [\"tool_use\", \"stop_sequence\", \"end_turn\", \"max_tokens\", \"error\"].includes(raw_stop)\n ? raw_stop\n : \"other\"\n ) as \"tool_use\" | \"stop_sequence\" | \"end_turn\" | \"max_tokens\" | \"error\" | \"other\";\n receiver.complete_message({\n usage,\n stop_reason,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_start\": {\n message.content[chunk.index] = chunk.content_block;\n receiver.start_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(chunk.content_block) as Partial<AssistantContent>,\n });\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_delta\": {\n switch (chunk.delta.type) {\n case \"text_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.text += chunk.delta.text;\n break;\n }\n case \"citations_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.citations = [...(content.citations ?? []), chunk.delta.citation];\n break;\n }\n case \"thinking_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.thinking += chunk.delta.thinking;\n break;\n }\n case \"input_json_delta\": {\n if (!json[chunk.index]) {\n json[chunk.index] = \"\";\n }\n json[chunk.index] += chunk.delta.partial_json;\n break;\n }\n case \"signature_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.signature = (content.signature ?? \"\") + chunk.delta.signature;\n break;\n }\n }\n receiver.update_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(message.content[chunk.index]) as AssistantContent,\n });\n break;\n }\n case \"content_block_stop\": {\n const content_block = message.content[chunk.index];\n if (content_block.type === \"tool_use\" && json[chunk.index]) {\n content_block.input = {\n ...(content_block.input ?? {}),\n ...JSON.parse(json[chunk.index]),\n };\n }\n receiver.complete_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(content_block) as AssistantContent,\n });\n break;\n }\n }\n }\n receiver.response_raw(message);\n } catch (error) {\n receiver.error(error);\n }\n }\n}\n\nfunction parameter_to_json_schema(param: ParameterType): Record<string, unknown> {\n switch (param.type) {\n case \"object\": {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [key, child] of Object.entries(param.properties)) {\n properties[key] = parameter_to_json_schema(child);\n if (child.required) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n ...(param.description ? { description: param.description } : {}),\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n };\n }\n case \"array\":\n return {\n type: \"array\",\n ...(param.description ? { description: param.description } : {}),\n items: parameter_to_json_schema(param.items),\n };\n case \"number\":\n return {\n type: \"number\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"boolean\":\n return {\n type: \"boolean\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"string\":\n return \"enum\" in param && param.enum\n ? {\n type: \"string\",\n enum: param.enum,\n ...(param.description ? { description: param.description } : {}),\n }\n : { type: \"string\", ...(param.description ? { description: param.description } : {}) };\n }\n}\n\nfunction to_anthropic_tool(tool: ToolDefinition): Anthropic.Messages.ToolUnion {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const schema = parameter_to_json_schema(param);\n if (param.description) {\n schema.description = param.description;\n }\n properties[param.name] = schema;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\",\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n },\n };\n}\n\nfunction from_anthropic_message(message: Partial<Anthropic.MessageParam>) {\n if (typeof message.content === \"string\") {\n return {\n role: message.role,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ],\n } as Message;\n }\n return {\n role: message.role,\n content: (message.content ?? []).map((c) =>\n from_anthropic_content(c, Array.isArray(message.content) ? message.content : undefined),\n ),\n } as Message;\n}\n\nfunction from_anthropic_content(\n content: Partial<Anthropic.ContentBlockParam>,\n allContent?: Partial<Anthropic.ContentBlockParam>[],\n) {\n switch (content.type) {\n case \"text\": {\n const { type: _, text, ...extended } = content;\n return {\n type: \"text\",\n text,\n extended,\n };\n }\n case \"tool_use\": {\n const { type: _, id, name, input, ...extended } = content;\n return {\n type: \"tool\",\n tool_request_id: id,\n tool: name,\n params: input as Record<string, unknown>,\n extended,\n };\n }\n case \"tool_result\": {\n const { type: _, tool_use_id, content: tool_content, ...extended } = content;\n let tool_name = \"\";\n if (allContent) {\n const matching = allContent.find(\n (c): c is Partial<Anthropic.Messages.ToolUseBlockParam> =>\n c.type === \"tool_use\" && \"id\" in c && c.id === tool_use_id,\n );\n if (matching) {\n tool_name = matching.name ?? \"\";\n }\n }\n return {\n type: \"tool_result\",\n tool_request_id: tool_use_id,\n tool: tool_name,\n result:\n typeof tool_content === \"string\"\n ? (() => {\n try {\n return JSON.parse(tool_content as string);\n } catch {\n return { text: tool_content };\n }\n })()\n : tool_content,\n extended,\n };\n }\n case \"thinking\": {\n const { type: _, thinking, ...extended } = content;\n return {\n type: \"thinking\",\n thought: thinking,\n extended,\n };\n }\n case \"redacted_thinking\": {\n const { type: _, ...extended } = content;\n return {\n type: \"thinking\",\n thought: extended.data,\n extended,\n };\n }\n default:\n return {\n type: \"raw\",\n model_kind: \"anthropic\",\n data: JSON.stringify(content),\n };\n }\n}\n\nfunction to_anthropic_message(message: Readonly<Message>) {\n return {\n role: message.role,\n content:\n message.content.length === 1 && message.content[0].type === \"text\"\n ? message.content[0].text\n : message.content.map((c) => to_anthropic_content(c)),\n };\n}\n\nfunction to_anthropic_content(content: Readonly<Content>) {\n switch (content.type) {\n case \"text\":\n return {\n type: \"text\",\n text: content.text,\n citations: Array.isArray(content.extended?.citations) ? content.extended.citations : [],\n };\n case \"tool\":\n return {\n type: \"tool_use\",\n id: content.tool_request_id,\n name: content.tool,\n input: content.params,\n };\n case \"raw\":\n if (content.model_kind !== \"anthropic\") {\n return {\n type: \"text\",\n text: content.data,\n };\n }\n try {\n return {\n ...JSON.parse(content.data),\n };\n } catch {\n return {\n data: content.data,\n };\n }\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: content.tool_request_id,\n is_error: content.result.result === false ? true : undefined,\n content: JSON.stringify(content.result),\n };\n case \"thinking\":\n if (!content.extended?.signature) {\n return {\n type: \"text\",\n text: content.thought,\n };\n }\n return {\n type: \"thinking\",\n thinking: content.thought,\n signature: content.extended?.signature,\n };\n default:\n throw new Error(\"unexpected content type\");\n }\n}\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/anthropic-provider.ts"],"sourcesContent":["export { AnthropicProvider, type AnthropicProviderConfig } from \"./anthropic-provider.ts\";\n","import Anthropic from \"@anthropic-ai/sdk\";\n\nimport type {\n AssistantContent,\n AssistantMessage,\n CancellationToken,\n Content,\n Message,\n ModelProvider,\n ModelRequest,\n ParameterType,\n ProviderContextTransformer,\n StreamReceiver,\n ToolDefinition,\n} from \"@simulacra-ai/core\";\n\n/**\n * Configuration options for the Anthropic provider.\n */\nexport interface AnthropicProviderConfig extends Record<string, unknown> {\n /** The model identifier to use. */\n model: string;\n /** The maximum number of tokens to generate in the response. */\n max_tokens?: number;\n /** Configuration for extended thinking mode. */\n thinking?: {\n /** Whether to enable extended thinking. */\n enable: boolean;\n /** The token budget allocated for thinking. */\n budget_tokens?: number;\n };\n /** Configuration for prompt caching. Enabled by default when omitted. Cache writes cost more per token than standard requests, but cache reads on subsequent turns cost less. */\n prompt_caching?: {\n /** Whether to cache the system prompt. */\n system_prompt?: boolean;\n /** Whether to cache the tool definitions. */\n toolkit?: boolean;\n };\n /** Custom request options passed to every SDK call. Accepts a static object or a function that returns (or resolves to) request options. Useful for injecting custom authentication headers or other per-request configuration. */\n request_options?:\n | Anthropic.RequestOptions\n | (() => Anthropic.RequestOptions | Promise<Anthropic.RequestOptions>);\n}\n\n/**\n * Model provider implementation for Anthropic's Claude models.\n *\n * This provider wraps the Anthropic SDK to provide streaming completions with support\n * for tool use, extended thinking, and prompt caching. It handles message formatting,\n * content streaming, and usage tracking according to the ModelProvider interface.\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly #sdk: Anthropic;\n readonly #config: AnthropicProviderConfig;\n readonly context_transformers: ProviderContextTransformer[];\n\n /**\n * Creates a new Anthropic provider instance.\n *\n * @param sdk - The initialized Anthropic SDK client.\n * @param config - Configuration options for the provider.\n * @param context_transformers - Provider-level context transformers.\n */\n constructor(\n sdk: Anthropic,\n config: AnthropicProviderConfig,\n context_transformers: ProviderContextTransformer[] = [],\n ) {\n this.#sdk = sdk;\n this.#config = config;\n this.context_transformers = context_transformers;\n }\n\n /**\n * Executes a model request and streams the response through the provided receiver.\n *\n * @param request - The request containing messages, tools, and system prompt.\n * @param receiver - The receiver that handles streaming events.\n * @param cancellation - Token to signal cancellation of the request.\n * @returns A promise that resolves when the request completes.\n */\n async execute_request(\n request: ModelRequest,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ): Promise<void> {\n const { model, max_tokens, thinking, prompt_caching, request_options, ...api_extras } =\n this.#config;\n const cache_system = prompt_caching?.system_prompt !== false;\n const cache_tools = prompt_caching?.toolkit !== false;\n\n const tools = request.tools.map((t) => to_anthropic_tool(t));\n\n if (cache_tools && tools.length > 0) {\n const last = tools.length - 1;\n (tools[last] as Anthropic.Messages.Tool).cache_control = { type: \"ephemeral\" };\n }\n\n const system: Anthropic.MessageCreateParamsStreaming[\"system\"] =\n cache_system && request.system\n ? [{ type: \"text\", text: request.system, cache_control: { type: \"ephemeral\" } }]\n : request.system;\n\n const params: Anthropic.MessageCreateParamsStreaming = {\n ...api_extras,\n model,\n stream: true,\n system,\n max_tokens: max_tokens ?? 8_192,\n thinking:\n thinking?.enable && thinking?.budget_tokens\n ? {\n type: \"enabled\",\n budget_tokens: thinking.budget_tokens,\n }\n : {\n type: \"disabled\",\n },\n tools,\n messages: request.messages.map((m) => to_anthropic_message(m)),\n };\n receiver.before_request({ params });\n receiver.request_raw(params);\n\n const resolved_options =\n typeof request_options === \"function\" ? await request_options() : request_options;\n\n const response = await this.#sdk.messages.create(params, resolved_options);\n\n // Intentionally not awaited. Streaming is event-driven through the receiver.\n // The policy wraps only connection establishment; chunk processing flows\n // asynchronously via StreamListener events back to the conversation.\n this.#stream_response(response, receiver, cancellation);\n }\n\n /**\n * Creates a clone of this provider with the same configuration.\n *\n * @returns A new provider instance with identical configuration.\n */\n clone(): ModelProvider {\n return new AnthropicProvider(this.#sdk, this.#config, this.context_transformers);\n }\n\n async #stream_response(\n stream: AsyncIterable<Anthropic.Messages.RawMessageStreamEvent>,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ) {\n try {\n let usage: Record<string, number> = {};\n let message: Partial<Anthropic.Message> & { content: Anthropic.ContentBlock[] } = {\n content: [],\n };\n const json: string[] = [];\n for await (const chunk of stream) {\n if (cancellation.is_cancellation_requested) {\n receiver.cancel();\n return;\n }\n receiver.stream_raw(chunk);\n switch (chunk.type) {\n case \"message_start\": {\n usage = Object.fromEntries(\n Object.entries(chunk.message.usage).filter(([, v]) => typeof v === \"number\"),\n ) as Record<string, number>;\n message = chunk.message;\n receiver.start_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_delta\": {\n usage = {\n ...usage,\n ...Object.fromEntries(\n Object.entries(chunk.usage).filter(([, v]) => typeof v === \"number\"),\n ),\n };\n message = { ...message, ...chunk.delta };\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_stop\": {\n const raw_stop = message.stop_reason ?? \"end_turn\";\n const stop_reason = (\n [\"tool_use\", \"stop_sequence\", \"end_turn\", \"max_tokens\", \"error\"].includes(raw_stop)\n ? raw_stop\n : \"other\"\n ) as \"tool_use\" | \"stop_sequence\" | \"end_turn\" | \"max_tokens\" | \"error\" | \"other\";\n receiver.complete_message({\n usage,\n stop_reason,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_start\": {\n message.content[chunk.index] = chunk.content_block;\n receiver.start_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(chunk.content_block) as Partial<AssistantContent>,\n });\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_delta\": {\n switch (chunk.delta.type) {\n case \"text_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.text += chunk.delta.text;\n break;\n }\n case \"citations_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.citations = [...(content.citations ?? []), chunk.delta.citation];\n break;\n }\n case \"thinking_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.thinking += chunk.delta.thinking;\n break;\n }\n case \"input_json_delta\": {\n if (!json[chunk.index]) {\n json[chunk.index] = \"\";\n }\n json[chunk.index] += chunk.delta.partial_json;\n break;\n }\n case \"signature_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.signature = (content.signature ?? \"\") + chunk.delta.signature;\n break;\n }\n }\n receiver.update_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(message.content[chunk.index]) as AssistantContent,\n });\n break;\n }\n case \"content_block_stop\": {\n const content_block = message.content[chunk.index];\n if (content_block.type === \"tool_use\" && json[chunk.index]) {\n content_block.input = {\n ...(content_block.input ?? {}),\n ...JSON.parse(json[chunk.index]),\n };\n }\n receiver.complete_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(content_block) as AssistantContent,\n });\n break;\n }\n }\n }\n receiver.response_raw(message);\n } catch (error) {\n receiver.error(error);\n }\n }\n}\n\nfunction parameter_to_json_schema(param: ParameterType): Record<string, unknown> {\n switch (param.type) {\n case \"object\": {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [key, child] of Object.entries(param.properties)) {\n properties[key] = parameter_to_json_schema(child);\n if (child.required) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n ...(param.description ? { description: param.description } : {}),\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n };\n }\n case \"array\":\n return {\n type: \"array\",\n ...(param.description ? { description: param.description } : {}),\n items: parameter_to_json_schema(param.items),\n };\n case \"number\":\n return {\n type: \"number\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"boolean\":\n return {\n type: \"boolean\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"string\":\n return \"enum\" in param && param.enum\n ? {\n type: \"string\",\n enum: param.enum,\n ...(param.description ? { description: param.description } : {}),\n }\n : { type: \"string\", ...(param.description ? { description: param.description } : {}) };\n }\n}\n\nfunction to_anthropic_tool(tool: ToolDefinition): Anthropic.Messages.ToolUnion {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const schema = parameter_to_json_schema(param);\n if (param.description) {\n schema.description = param.description;\n }\n properties[param.name] = schema;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\",\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n },\n };\n}\n\nfunction from_anthropic_message(message: Partial<Anthropic.MessageParam>) {\n if (typeof message.content === \"string\") {\n return {\n role: message.role,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ],\n } as Message;\n }\n return {\n role: message.role,\n content: (message.content ?? []).map((c) =>\n from_anthropic_content(c, Array.isArray(message.content) ? message.content : undefined),\n ),\n } as Message;\n}\n\nfunction from_anthropic_content(\n content: Partial<Anthropic.ContentBlockParam>,\n allContent?: Partial<Anthropic.ContentBlockParam>[],\n) {\n switch (content.type) {\n case \"text\": {\n const { type: _, text, ...extended } = content;\n return {\n type: \"text\",\n text,\n extended,\n };\n }\n case \"tool_use\": {\n const { type: _, id, name, input, ...extended } = content;\n return {\n type: \"tool\",\n tool_request_id: id,\n tool: name,\n params: input as Record<string, unknown>,\n extended,\n };\n }\n case \"tool_result\": {\n const { type: _, tool_use_id, content: tool_content, ...extended } = content;\n let tool_name = \"\";\n if (allContent) {\n const matching = allContent.find(\n (c): c is Partial<Anthropic.Messages.ToolUseBlockParam> =>\n c.type === \"tool_use\" && \"id\" in c && c.id === tool_use_id,\n );\n if (matching) {\n tool_name = matching.name ?? \"\";\n }\n }\n return {\n type: \"tool_result\",\n tool_request_id: tool_use_id,\n tool: tool_name,\n result:\n typeof tool_content === \"string\"\n ? (() => {\n try {\n return JSON.parse(tool_content as string);\n } catch {\n return { text: tool_content };\n }\n })()\n : tool_content,\n extended,\n };\n }\n case \"thinking\": {\n const { type: _, thinking, ...extended } = content;\n return {\n type: \"thinking\",\n thought: thinking,\n extended,\n };\n }\n case \"redacted_thinking\": {\n const { type: _, ...extended } = content;\n return {\n type: \"thinking\",\n thought: extended.data,\n extended,\n };\n }\n default:\n return {\n type: \"raw\",\n model_kind: \"anthropic\",\n data: JSON.stringify(content),\n };\n }\n}\n\nfunction to_anthropic_message(message: Readonly<Message>) {\n return {\n role: message.role,\n content:\n message.content.length === 1 && message.content[0].type === \"text\"\n ? message.content[0].text\n : message.content.map((c) => to_anthropic_content(c)),\n };\n}\n\nfunction to_anthropic_content(content: Readonly<Content>) {\n switch (content.type) {\n case \"text\":\n return {\n type: \"text\",\n text: content.text,\n citations: Array.isArray(content.extended?.citations) ? content.extended.citations : [],\n };\n case \"tool\":\n return {\n type: \"tool_use\",\n id: content.tool_request_id,\n name: content.tool,\n input: content.params,\n };\n case \"raw\":\n if (content.model_kind !== \"anthropic\") {\n return {\n type: \"text\",\n text: content.data,\n };\n }\n try {\n return {\n ...JSON.parse(content.data),\n };\n } catch {\n return {\n data: content.data,\n };\n }\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: content.tool_request_id,\n is_error: content.result.result === false ? true : undefined,\n content: JSON.stringify(content.result),\n };\n case \"thinking\":\n if (!content.extended?.signature) {\n return {\n type: \"text\",\n text: content.thought,\n };\n }\n return {\n type: \"thinking\",\n thinking: content.thought,\n signature: content.extended?.signature,\n };\n default:\n throw new Error(\"unexpected content type\");\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -24,14 +24,7 @@ var AnthropicProvider = class _AnthropicProvider {
|
|
|
24
24
|
* @returns A promise that resolves when the request completes.
|
|
25
25
|
*/
|
|
26
26
|
async execute_request(request, receiver, cancellation) {
|
|
27
|
-
const {
|
|
28
|
-
model,
|
|
29
|
-
max_tokens,
|
|
30
|
-
thinking,
|
|
31
|
-
prompt_caching,
|
|
32
|
-
request_options,
|
|
33
|
-
...api_extras
|
|
34
|
-
} = this.#config;
|
|
27
|
+
const { model, max_tokens, thinking, prompt_caching, request_options, ...api_extras } = this.#config;
|
|
35
28
|
const cache_system = prompt_caching?.system_prompt !== false;
|
|
36
29
|
const cache_tools = prompt_caching?.toolkit !== false;
|
|
37
30
|
const tools = request.tools.map((t) => to_anthropic_tool(t));
|
|
@@ -58,10 +51,7 @@ var AnthropicProvider = class _AnthropicProvider {
|
|
|
58
51
|
receiver.before_request({ params });
|
|
59
52
|
receiver.request_raw(params);
|
|
60
53
|
const resolved_options = typeof request_options === "function" ? await request_options() : request_options;
|
|
61
|
-
const response = await this.#sdk.messages.create(
|
|
62
|
-
params,
|
|
63
|
-
resolved_options
|
|
64
|
-
);
|
|
54
|
+
const response = await this.#sdk.messages.create(params, resolved_options);
|
|
65
55
|
this.#stream_response(response, receiver, cancellation);
|
|
66
56
|
}
|
|
67
57
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/anthropic-provider.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nimport type {\n AssistantContent,\n AssistantMessage,\n CancellationToken,\n Content,\n Message,\n ModelProvider,\n ModelRequest,\n ParameterType,\n ProviderContextTransformer,\n StreamReceiver,\n ToolDefinition,\n} from \"@simulacra-ai/core\";\n\n/**\n * Configuration options for the Anthropic provider.\n */\nexport interface AnthropicProviderConfig extends Record<string, unknown> {\n /** The model identifier to use. */\n model: string;\n /** The maximum number of tokens to generate in the response. */\n max_tokens?: number;\n /** Configuration for extended thinking mode. */\n thinking?: {\n /** Whether to enable extended thinking. */\n enable: boolean;\n /** The token budget allocated for thinking. */\n budget_tokens?: number;\n };\n /** Configuration for prompt caching. Enabled by default when omitted. Cache writes cost more per token than standard requests, but cache reads on subsequent turns cost less. */\n prompt_caching?: {\n /** Whether to cache the system prompt. */\n system_prompt?: boolean;\n /** Whether to cache the tool definitions. */\n toolkit?: boolean;\n };\n /** Custom request options passed to every SDK call. Accepts a static object or a function that returns (or resolves to) request options. Useful for injecting custom authentication headers or other per-request configuration. */\n request_options?: Anthropic.RequestOptions | (() => Anthropic.RequestOptions | Promise<Anthropic.RequestOptions>);\n}\n\n/**\n * Model provider implementation for Anthropic's Claude models.\n *\n * This provider wraps the Anthropic SDK to provide streaming completions with support\n * for tool use, extended thinking, and prompt caching. It handles message formatting,\n * content streaming, and usage tracking according to the ModelProvider interface.\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly #sdk: Anthropic;\n readonly #config: AnthropicProviderConfig;\n readonly context_transformers: ProviderContextTransformer[];\n\n /**\n * Creates a new Anthropic provider instance.\n *\n * @param sdk - The initialized Anthropic SDK client.\n * @param config - Configuration options for the provider.\n * @param context_transformers - Provider-level context transformers.\n */\n constructor(\n sdk: Anthropic,\n config: AnthropicProviderConfig,\n context_transformers: ProviderContextTransformer[] = [],\n ) {\n this.#sdk = sdk;\n this.#config = config;\n this.context_transformers = context_transformers;\n }\n\n /**\n * Executes a model request and streams the response through the provided receiver.\n *\n * @param request - The request containing messages, tools, and system prompt.\n * @param receiver - The receiver that handles streaming events.\n * @param cancellation - Token to signal cancellation of the request.\n * @returns A promise that resolves when the request completes.\n */\n async execute_request(\n request: ModelRequest,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ): Promise<void> {\n const {\n model,\n max_tokens,\n thinking,\n prompt_caching,\n request_options,\n ...api_extras\n } = this.#config;\n const cache_system = prompt_caching?.system_prompt !== false;\n const cache_tools = prompt_caching?.toolkit !== false;\n\n const tools = request.tools.map((t) => to_anthropic_tool(t));\n\n if (cache_tools && tools.length > 0) {\n const last = tools.length - 1;\n (tools[last] as Anthropic.Messages.Tool).cache_control = { type: \"ephemeral\" };\n }\n\n const system: Anthropic.MessageCreateParamsStreaming[\"system\"] =\n cache_system && request.system\n ? [{ type: \"text\", text: request.system, cache_control: { type: \"ephemeral\" } }]\n : request.system;\n\n const params: Anthropic.MessageCreateParamsStreaming = {\n ...api_extras,\n model,\n stream: true,\n system,\n max_tokens: max_tokens ?? 8_192,\n thinking:\n thinking?.enable && thinking?.budget_tokens\n ? {\n type: \"enabled\",\n budget_tokens: thinking.budget_tokens,\n }\n : {\n type: \"disabled\",\n },\n tools,\n messages: request.messages.map((m) => to_anthropic_message(m)),\n };\n receiver.before_request({ params });\n receiver.request_raw(params);\n\n const resolved_options = typeof request_options === \"function\"\n ? await request_options()\n : request_options;\n\n const response = await this.#sdk.messages.create(\n params,\n resolved_options,\n );\n\n // Intentionally not awaited. Streaming is event-driven through the receiver.\n // The policy wraps only connection establishment; chunk processing flows\n // asynchronously via StreamListener events back to the conversation.\n this.#stream_response(response, receiver, cancellation);\n }\n\n /**\n * Creates a clone of this provider with the same configuration.\n *\n * @returns A new provider instance with identical configuration.\n */\n clone(): ModelProvider {\n return new AnthropicProvider(this.#sdk, this.#config, this.context_transformers);\n }\n\n async #stream_response(\n stream: AsyncIterable<Anthropic.Messages.RawMessageStreamEvent>,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ) {\n try {\n let usage: Record<string, number> = {};\n let message: Partial<Anthropic.Message> & { content: Anthropic.ContentBlock[] } = {\n content: [],\n };\n const json: string[] = [];\n for await (const chunk of stream) {\n if (cancellation.is_cancellation_requested) {\n receiver.cancel();\n return;\n }\n receiver.stream_raw(chunk);\n switch (chunk.type) {\n case \"message_start\": {\n usage = Object.fromEntries(\n Object.entries(chunk.message.usage).filter(([, v]) => typeof v === \"number\"),\n ) as Record<string, number>;\n message = chunk.message;\n receiver.start_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_delta\": {\n usage = {\n ...usage,\n ...Object.fromEntries(\n Object.entries(chunk.usage).filter(([, v]) => typeof v === \"number\"),\n ),\n };\n message = { ...message, ...chunk.delta };\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_stop\": {\n const raw_stop = message.stop_reason ?? \"end_turn\";\n const stop_reason = (\n [\"tool_use\", \"stop_sequence\", \"end_turn\", \"max_tokens\", \"error\"].includes(raw_stop)\n ? raw_stop\n : \"other\"\n ) as \"tool_use\" | \"stop_sequence\" | \"end_turn\" | \"max_tokens\" | \"error\" | \"other\";\n receiver.complete_message({\n usage,\n stop_reason,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_start\": {\n message.content[chunk.index] = chunk.content_block;\n receiver.start_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(chunk.content_block) as Partial<AssistantContent>,\n });\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_delta\": {\n switch (chunk.delta.type) {\n case \"text_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.text += chunk.delta.text;\n break;\n }\n case \"citations_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.citations = [...(content.citations ?? []), chunk.delta.citation];\n break;\n }\n case \"thinking_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.thinking += chunk.delta.thinking;\n break;\n }\n case \"input_json_delta\": {\n if (!json[chunk.index]) {\n json[chunk.index] = \"\";\n }\n json[chunk.index] += chunk.delta.partial_json;\n break;\n }\n case \"signature_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.signature = (content.signature ?? \"\") + chunk.delta.signature;\n break;\n }\n }\n receiver.update_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(message.content[chunk.index]) as AssistantContent,\n });\n break;\n }\n case \"content_block_stop\": {\n const content_block = message.content[chunk.index];\n if (content_block.type === \"tool_use\" && json[chunk.index]) {\n content_block.input = {\n ...(content_block.input ?? {}),\n ...JSON.parse(json[chunk.index]),\n };\n }\n receiver.complete_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(content_block) as AssistantContent,\n });\n break;\n }\n }\n }\n receiver.response_raw(message);\n } catch (error) {\n receiver.error(error);\n }\n }\n}\n\nfunction parameter_to_json_schema(param: ParameterType): Record<string, unknown> {\n switch (param.type) {\n case \"object\": {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [key, child] of Object.entries(param.properties)) {\n properties[key] = parameter_to_json_schema(child);\n if (child.required) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n ...(param.description ? { description: param.description } : {}),\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n };\n }\n case \"array\":\n return {\n type: \"array\",\n ...(param.description ? { description: param.description } : {}),\n items: parameter_to_json_schema(param.items),\n };\n case \"number\":\n return {\n type: \"number\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"boolean\":\n return {\n type: \"boolean\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"string\":\n return \"enum\" in param && param.enum\n ? {\n type: \"string\",\n enum: param.enum,\n ...(param.description ? { description: param.description } : {}),\n }\n : { type: \"string\", ...(param.description ? { description: param.description } : {}) };\n }\n}\n\nfunction to_anthropic_tool(tool: ToolDefinition): Anthropic.Messages.ToolUnion {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const schema = parameter_to_json_schema(param);\n if (param.description) {\n schema.description = param.description;\n }\n properties[param.name] = schema;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\",\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n },\n };\n}\n\nfunction from_anthropic_message(message: Partial<Anthropic.MessageParam>) {\n if (typeof message.content === \"string\") {\n return {\n role: message.role,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ],\n } as Message;\n }\n return {\n role: message.role,\n content: (message.content ?? []).map((c) =>\n from_anthropic_content(c, Array.isArray(message.content) ? message.content : undefined),\n ),\n } as Message;\n}\n\nfunction from_anthropic_content(\n content: Partial<Anthropic.ContentBlockParam>,\n allContent?: Partial<Anthropic.ContentBlockParam>[],\n) {\n switch (content.type) {\n case \"text\": {\n const { type: _, text, ...extended } = content;\n return {\n type: \"text\",\n text,\n extended,\n };\n }\n case \"tool_use\": {\n const { type: _, id, name, input, ...extended } = content;\n return {\n type: \"tool\",\n tool_request_id: id,\n tool: name,\n params: input as Record<string, unknown>,\n extended,\n };\n }\n case \"tool_result\": {\n const { type: _, tool_use_id, content: tool_content, ...extended } = content;\n let tool_name = \"\";\n if (allContent) {\n const matching = allContent.find(\n (c): c is Partial<Anthropic.Messages.ToolUseBlockParam> =>\n c.type === \"tool_use\" && \"id\" in c && c.id === tool_use_id,\n );\n if (matching) {\n tool_name = matching.name ?? \"\";\n }\n }\n return {\n type: \"tool_result\",\n tool_request_id: tool_use_id,\n tool: tool_name,\n result:\n typeof tool_content === \"string\"\n ? (() => {\n try {\n return JSON.parse(tool_content as string);\n } catch {\n return { text: tool_content };\n }\n })()\n : tool_content,\n extended,\n };\n }\n case \"thinking\": {\n const { type: _, thinking, ...extended } = content;\n return {\n type: \"thinking\",\n thought: thinking,\n extended,\n };\n }\n case \"redacted_thinking\": {\n const { type: _, ...extended } = content;\n return {\n type: \"thinking\",\n thought: extended.data,\n extended,\n };\n }\n default:\n return {\n type: \"raw\",\n model_kind: \"anthropic\",\n data: JSON.stringify(content),\n };\n }\n}\n\nfunction to_anthropic_message(message: Readonly<Message>) {\n return {\n role: message.role,\n content:\n message.content.length === 1 && message.content[0].type === \"text\"\n ? message.content[0].text\n : message.content.map((c) => to_anthropic_content(c)),\n };\n}\n\nfunction to_anthropic_content(content: Readonly<Content>) {\n switch (content.type) {\n case \"text\":\n return {\n type: \"text\",\n text: content.text,\n citations: Array.isArray(content.extended?.citations) ? content.extended.citations : [],\n };\n case \"tool\":\n return {\n type: \"tool_use\",\n id: content.tool_request_id,\n name: content.tool,\n input: content.params,\n };\n case \"raw\":\n if (content.model_kind !== \"anthropic\") {\n return {\n type: \"text\",\n text: content.data,\n };\n }\n try {\n return {\n ...JSON.parse(content.data),\n };\n } catch {\n return {\n data: content.data,\n };\n }\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: content.tool_request_id,\n is_error: content.result.result === false ? true : undefined,\n content: JSON.stringify(content.result),\n };\n case \"thinking\":\n if (!content.extended?.signature) {\n return {\n type: \"text\",\n text: content.thought,\n };\n }\n return {\n type: \"thinking\",\n thinking: content.thought,\n signature: content.extended?.signature,\n };\n default:\n throw new Error(\"unexpected content type\");\n }\n}\n\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/anthropic-provider.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nimport type {\n AssistantContent,\n AssistantMessage,\n CancellationToken,\n Content,\n Message,\n ModelProvider,\n ModelRequest,\n ParameterType,\n ProviderContextTransformer,\n StreamReceiver,\n ToolDefinition,\n} from \"@simulacra-ai/core\";\n\n/**\n * Configuration options for the Anthropic provider.\n */\nexport interface AnthropicProviderConfig extends Record<string, unknown> {\n /** The model identifier to use. */\n model: string;\n /** The maximum number of tokens to generate in the response. */\n max_tokens?: number;\n /** Configuration for extended thinking mode. */\n thinking?: {\n /** Whether to enable extended thinking. */\n enable: boolean;\n /** The token budget allocated for thinking. */\n budget_tokens?: number;\n };\n /** Configuration for prompt caching. Enabled by default when omitted. Cache writes cost more per token than standard requests, but cache reads on subsequent turns cost less. */\n prompt_caching?: {\n /** Whether to cache the system prompt. */\n system_prompt?: boolean;\n /** Whether to cache the tool definitions. */\n toolkit?: boolean;\n };\n /** Custom request options passed to every SDK call. Accepts a static object or a function that returns (or resolves to) request options. Useful for injecting custom authentication headers or other per-request configuration. */\n request_options?:\n | Anthropic.RequestOptions\n | (() => Anthropic.RequestOptions | Promise<Anthropic.RequestOptions>);\n}\n\n/**\n * Model provider implementation for Anthropic's Claude models.\n *\n * This provider wraps the Anthropic SDK to provide streaming completions with support\n * for tool use, extended thinking, and prompt caching. It handles message formatting,\n * content streaming, and usage tracking according to the ModelProvider interface.\n */\nexport class AnthropicProvider implements ModelProvider {\n readonly #sdk: Anthropic;\n readonly #config: AnthropicProviderConfig;\n readonly context_transformers: ProviderContextTransformer[];\n\n /**\n * Creates a new Anthropic provider instance.\n *\n * @param sdk - The initialized Anthropic SDK client.\n * @param config - Configuration options for the provider.\n * @param context_transformers - Provider-level context transformers.\n */\n constructor(\n sdk: Anthropic,\n config: AnthropicProviderConfig,\n context_transformers: ProviderContextTransformer[] = [],\n ) {\n this.#sdk = sdk;\n this.#config = config;\n this.context_transformers = context_transformers;\n }\n\n /**\n * Executes a model request and streams the response through the provided receiver.\n *\n * @param request - The request containing messages, tools, and system prompt.\n * @param receiver - The receiver that handles streaming events.\n * @param cancellation - Token to signal cancellation of the request.\n * @returns A promise that resolves when the request completes.\n */\n async execute_request(\n request: ModelRequest,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ): Promise<void> {\n const { model, max_tokens, thinking, prompt_caching, request_options, ...api_extras } =\n this.#config;\n const cache_system = prompt_caching?.system_prompt !== false;\n const cache_tools = prompt_caching?.toolkit !== false;\n\n const tools = request.tools.map((t) => to_anthropic_tool(t));\n\n if (cache_tools && tools.length > 0) {\n const last = tools.length - 1;\n (tools[last] as Anthropic.Messages.Tool).cache_control = { type: \"ephemeral\" };\n }\n\n const system: Anthropic.MessageCreateParamsStreaming[\"system\"] =\n cache_system && request.system\n ? [{ type: \"text\", text: request.system, cache_control: { type: \"ephemeral\" } }]\n : request.system;\n\n const params: Anthropic.MessageCreateParamsStreaming = {\n ...api_extras,\n model,\n stream: true,\n system,\n max_tokens: max_tokens ?? 8_192,\n thinking:\n thinking?.enable && thinking?.budget_tokens\n ? {\n type: \"enabled\",\n budget_tokens: thinking.budget_tokens,\n }\n : {\n type: \"disabled\",\n },\n tools,\n messages: request.messages.map((m) => to_anthropic_message(m)),\n };\n receiver.before_request({ params });\n receiver.request_raw(params);\n\n const resolved_options =\n typeof request_options === \"function\" ? await request_options() : request_options;\n\n const response = await this.#sdk.messages.create(params, resolved_options);\n\n // Intentionally not awaited. Streaming is event-driven through the receiver.\n // The policy wraps only connection establishment; chunk processing flows\n // asynchronously via StreamListener events back to the conversation.\n this.#stream_response(response, receiver, cancellation);\n }\n\n /**\n * Creates a clone of this provider with the same configuration.\n *\n * @returns A new provider instance with identical configuration.\n */\n clone(): ModelProvider {\n return new AnthropicProvider(this.#sdk, this.#config, this.context_transformers);\n }\n\n async #stream_response(\n stream: AsyncIterable<Anthropic.Messages.RawMessageStreamEvent>,\n receiver: StreamReceiver,\n cancellation: CancellationToken,\n ) {\n try {\n let usage: Record<string, number> = {};\n let message: Partial<Anthropic.Message> & { content: Anthropic.ContentBlock[] } = {\n content: [],\n };\n const json: string[] = [];\n for await (const chunk of stream) {\n if (cancellation.is_cancellation_requested) {\n receiver.cancel();\n return;\n }\n receiver.stream_raw(chunk);\n switch (chunk.type) {\n case \"message_start\": {\n usage = Object.fromEntries(\n Object.entries(chunk.message.usage).filter(([, v]) => typeof v === \"number\"),\n ) as Record<string, number>;\n message = chunk.message;\n receiver.start_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_delta\": {\n usage = {\n ...usage,\n ...Object.fromEntries(\n Object.entries(chunk.usage).filter(([, v]) => typeof v === \"number\"),\n ),\n };\n message = { ...message, ...chunk.delta };\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"message_stop\": {\n const raw_stop = message.stop_reason ?? \"end_turn\";\n const stop_reason = (\n [\"tool_use\", \"stop_sequence\", \"end_turn\", \"max_tokens\", \"error\"].includes(raw_stop)\n ? raw_stop\n : \"other\"\n ) as \"tool_use\" | \"stop_sequence\" | \"end_turn\" | \"max_tokens\" | \"error\" | \"other\";\n receiver.complete_message({\n usage,\n stop_reason,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_start\": {\n message.content[chunk.index] = chunk.content_block;\n receiver.start_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(chunk.content_block) as Partial<AssistantContent>,\n });\n receiver.update_message({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n });\n break;\n }\n case \"content_block_delta\": {\n switch (chunk.delta.type) {\n case \"text_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.text += chunk.delta.text;\n break;\n }\n case \"citations_delta\": {\n const content = message.content[chunk.index] as Anthropic.TextBlock;\n content.citations = [...(content.citations ?? []), chunk.delta.citation];\n break;\n }\n case \"thinking_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.thinking += chunk.delta.thinking;\n break;\n }\n case \"input_json_delta\": {\n if (!json[chunk.index]) {\n json[chunk.index] = \"\";\n }\n json[chunk.index] += chunk.delta.partial_json;\n break;\n }\n case \"signature_delta\": {\n const content = message.content[chunk.index] as Anthropic.ThinkingBlock;\n content.signature = (content.signature ?? \"\") + chunk.delta.signature;\n break;\n }\n }\n receiver.update_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(message.content[chunk.index]) as AssistantContent,\n });\n break;\n }\n case \"content_block_stop\": {\n const content_block = message.content[chunk.index];\n if (content_block.type === \"tool_use\" && json[chunk.index]) {\n content_block.input = {\n ...(content_block.input ?? {}),\n ...JSON.parse(json[chunk.index]),\n };\n }\n receiver.complete_content({\n usage,\n message: from_anthropic_message(message) as AssistantMessage,\n content: from_anthropic_content(content_block) as AssistantContent,\n });\n break;\n }\n }\n }\n receiver.response_raw(message);\n } catch (error) {\n receiver.error(error);\n }\n }\n}\n\nfunction parameter_to_json_schema(param: ParameterType): Record<string, unknown> {\n switch (param.type) {\n case \"object\": {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [key, child] of Object.entries(param.properties)) {\n properties[key] = parameter_to_json_schema(child);\n if (child.required) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n ...(param.description ? { description: param.description } : {}),\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n };\n }\n case \"array\":\n return {\n type: \"array\",\n ...(param.description ? { description: param.description } : {}),\n items: parameter_to_json_schema(param.items),\n };\n case \"number\":\n return {\n type: \"number\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"boolean\":\n return {\n type: \"boolean\",\n ...(param.description ? { description: param.description } : {}),\n };\n case \"string\":\n return \"enum\" in param && param.enum\n ? {\n type: \"string\",\n enum: param.enum,\n ...(param.description ? { description: param.description } : {}),\n }\n : { type: \"string\", ...(param.description ? { description: param.description } : {}) };\n }\n}\n\nfunction to_anthropic_tool(tool: ToolDefinition): Anthropic.Messages.ToolUnion {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const schema = parameter_to_json_schema(param);\n if (param.description) {\n schema.description = param.description;\n }\n properties[param.name] = schema;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n return {\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\",\n ...(Object.keys(properties).length ? { properties } : {}),\n ...(required.length ? { required } : {}),\n },\n };\n}\n\nfunction from_anthropic_message(message: Partial<Anthropic.MessageParam>) {\n if (typeof message.content === \"string\") {\n return {\n role: message.role,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ],\n } as Message;\n }\n return {\n role: message.role,\n content: (message.content ?? []).map((c) =>\n from_anthropic_content(c, Array.isArray(message.content) ? message.content : undefined),\n ),\n } as Message;\n}\n\nfunction from_anthropic_content(\n content: Partial<Anthropic.ContentBlockParam>,\n allContent?: Partial<Anthropic.ContentBlockParam>[],\n) {\n switch (content.type) {\n case \"text\": {\n const { type: _, text, ...extended } = content;\n return {\n type: \"text\",\n text,\n extended,\n };\n }\n case \"tool_use\": {\n const { type: _, id, name, input, ...extended } = content;\n return {\n type: \"tool\",\n tool_request_id: id,\n tool: name,\n params: input as Record<string, unknown>,\n extended,\n };\n }\n case \"tool_result\": {\n const { type: _, tool_use_id, content: tool_content, ...extended } = content;\n let tool_name = \"\";\n if (allContent) {\n const matching = allContent.find(\n (c): c is Partial<Anthropic.Messages.ToolUseBlockParam> =>\n c.type === \"tool_use\" && \"id\" in c && c.id === tool_use_id,\n );\n if (matching) {\n tool_name = matching.name ?? \"\";\n }\n }\n return {\n type: \"tool_result\",\n tool_request_id: tool_use_id,\n tool: tool_name,\n result:\n typeof tool_content === \"string\"\n ? (() => {\n try {\n return JSON.parse(tool_content as string);\n } catch {\n return { text: tool_content };\n }\n })()\n : tool_content,\n extended,\n };\n }\n case \"thinking\": {\n const { type: _, thinking, ...extended } = content;\n return {\n type: \"thinking\",\n thought: thinking,\n extended,\n };\n }\n case \"redacted_thinking\": {\n const { type: _, ...extended } = content;\n return {\n type: \"thinking\",\n thought: extended.data,\n extended,\n };\n }\n default:\n return {\n type: \"raw\",\n model_kind: \"anthropic\",\n data: JSON.stringify(content),\n };\n }\n}\n\nfunction to_anthropic_message(message: Readonly<Message>) {\n return {\n role: message.role,\n content:\n message.content.length === 1 && message.content[0].type === \"text\"\n ? message.content[0].text\n : message.content.map((c) => to_anthropic_content(c)),\n };\n}\n\nfunction to_anthropic_content(content: Readonly<Content>) {\n switch (content.type) {\n case \"text\":\n return {\n type: \"text\",\n text: content.text,\n citations: Array.isArray(content.extended?.citations) ? content.extended.citations : [],\n };\n case \"tool\":\n return {\n type: \"tool_use\",\n id: content.tool_request_id,\n name: content.tool,\n input: content.params,\n };\n case \"raw\":\n if (content.model_kind !== \"anthropic\") {\n return {\n type: \"text\",\n text: content.data,\n };\n }\n try {\n return {\n ...JSON.parse(content.data),\n };\n } catch {\n return {\n data: content.data,\n };\n }\n case \"tool_result\":\n return {\n type: \"tool_result\",\n tool_use_id: content.tool_request_id,\n is_error: content.result.result === false ? true : undefined,\n content: JSON.stringify(content.result),\n };\n case \"thinking\":\n if (!content.extended?.signature) {\n return {\n type: \"text\",\n text: content.thought,\n };\n }\n return {\n type: \"thinking\",\n thinking: content.thought,\n signature: content.extended?.signature,\n };\n default:\n throw new Error(\"unexpected content type\");\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simulacra-ai/anthropic",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Anthropic Claude provider for the Simulacra conversation engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -20,12 +20,17 @@
|
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "tsup",
|
|
23
|
-
"clean": "rm -rf dist *.tsbuildinfo"
|
|
23
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest"
|
|
24
26
|
},
|
|
25
27
|
"peerDependencies": {
|
|
26
|
-
"@simulacra-ai/core": "0.0.
|
|
28
|
+
"@simulacra-ai/core": "0.0.9",
|
|
27
29
|
"@anthropic-ai/sdk": ">=0.30.0 <1.0.0"
|
|
28
30
|
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"vitest": "^3.0.0"
|
|
33
|
+
},
|
|
29
34
|
"repository": {
|
|
30
35
|
"type": "git",
|
|
31
36
|
"url": "https://github.com/simulacra-ai/simulacra.git",
|