@prompty/anthropic 2.0.0-alpha.3 → 2.0.0-alpha.5

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 CHANGED
@@ -59,12 +59,7 @@ function messageToWire(msg) {
59
59
  wire.content = msg.metadata.content;
60
60
  return wire;
61
61
  }
62
- const content = msg.toTextContent();
63
- if (typeof content === "string") {
64
- wire.content = content;
65
- } else {
66
- wire.content = msg.parts.map(partToWire);
67
- }
62
+ wire.content = msg.parts.map(partToWire);
68
63
  return wire;
69
64
  }
70
65
  function partToWire(part) {
@@ -72,7 +67,17 @@ function partToWire(part) {
72
67
  case "text":
73
68
  return { type: "text", text: part.value };
74
69
  case "image": {
75
- if (part.source.startsWith("data:") || part.source.startsWith("/")) {
70
+ if (part.mediaType) {
71
+ return {
72
+ type: "image",
73
+ source: {
74
+ type: "base64",
75
+ media_type: part.mediaType,
76
+ data: part.source
77
+ }
78
+ };
79
+ }
80
+ if (part.source.startsWith("data:")) {
76
81
  const [header, data] = part.source.split(",", 2);
77
82
  const mediaType = header?.match(/data:(.*?);/)?.[1] ?? "image/png";
78
83
  return {
@@ -95,7 +100,7 @@ function partToWire(part) {
95
100
  return { type: "text", text: `[audio: ${part.source}]` };
96
101
  }
97
102
  }
98
- var DEFAULT_MAX_TOKENS = 1024;
103
+ var DEFAULT_MAX_TOKENS = 4096;
99
104
  function buildChatArgs(agent, messages) {
100
105
  const model = agent.model?.id || "claude-sonnet-4-5-20250929";
101
106
  const systemParts = [];
@@ -205,8 +210,12 @@ function toolsToWire(agent) {
205
210
  if (t.kind !== "function") continue;
206
211
  const tool = { name: t.name };
207
212
  if (t.description) tool.description = t.description;
208
- const params = t.parameters;
213
+ const boundNames = new Set((t.bindings ?? []).map((b) => b.name));
214
+ let params = t.parameters;
209
215
  if (params && Array.isArray(params)) {
216
+ if (boundNames.size > 0) {
217
+ params = params.filter((p) => !boundNames.has(p.name));
218
+ }
210
219
  tool.input_schema = schemaToWire(params);
211
220
  } else {
212
221
  tool.input_schema = { type: "object", properties: {} };
@@ -310,6 +319,10 @@ var AnthropicExecutor = class {
310
319
  if (conn instanceof import_core.ApiKeyConnection) {
311
320
  if (conn.apiKey) kwargs.apiKey = conn.apiKey;
312
321
  if (conn.endpoint) kwargs.baseURL = conn.endpoint;
322
+ } else if (conn) {
323
+ throw new Error(
324
+ `Connection kind '${conn.kind}' is not supported by the Anthropic executor. Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`
325
+ );
313
326
  }
314
327
  return kwargs;
315
328
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/anthropic — Anthropic provider for Prompty.\n *\n * Importing this package auto-registers the \"anthropic\" executor and processor.\n *\n * @module @prompty/anthropic\n */\n\nexport { AnthropicExecutor } from \"./executor.js\";\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { AnthropicExecutor } from \"./executor.js\";\nimport { AnthropicProcessor } from \"./processor.js\";\n\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\n","/**\n * Anthropic executor — sends messages to Anthropic Messages API.\n *\n * Dispatches on `agent.model.apiType`: only `chat` is supported\n * (Anthropic has no embedding or image APIs).\n * The agent loop (tool-call iteration) is handled by the pipeline,\n * not the executor.\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs } from \"./wire.js\";\n\nexport class AnthropicExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = \"Anthropic\";\n\n // Trace client construction\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: Anthropic,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.messages.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n\n if (isStreaming) {\n const stream = client.messages.stream(\n args as unknown as Parameters<typeof client.messages.stream>[0],\n );\n return new PromptyStream(\n `${clientName}Executor`,\n stream as unknown as AsyncIterable<unknown>,\n );\n }\n\n const result = await client.messages.create(\n args as unknown as Parameters<typeof client.messages.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\n `Anthropic only supports \"chat\" (Messages API).`,\n );\n }\n }\n\n protected resolveClient(agent: Prompty): Anthropic {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as Anthropic;\n }\n\n const kwargs = this.clientKwargs(agent);\n\n // Lazy import — only needed when actually called\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\n return new AnthropicSDK(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → Anthropic Messages API JSON.\n *\n * Key differences from OpenAI:\n * - `system` is a separate top-level parameter (not in messages)\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\n * - `max_tokens` is required\n * - Structured output uses `output_config.format` with `json_schema`\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n// ---------------------------------------------------------------------------\n// Message conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an abstract Message to Anthropic wire format.\n * System messages are excluded — they go in a separate `system` parameter.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Batched tool results → single user message with all tool_result blocks\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\n wire.role = \"user\";\n wire.content = msg.metadata.tool_results;\n return wire;\n }\n\n // Legacy single tool result messages (backward compat)\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\n wire.role = \"user\";\n wire.content = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: msg.toTextContent(),\n },\n ];\n return wire;\n }\n\n // Assistant messages with raw content blocks (tool_use) — preserve them\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\n wire.content = msg.metadata.content;\n return wire;\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to Anthropic format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to Anthropic wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n // Anthropic uses base64 source blocks or URL\n if (part.source.startsWith(\"data:\") || part.source.startsWith(\"/\")) {\n // Base64 encoded\n const [header, data] = part.source.split(\",\", 2);\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: mediaType,\n data: data ?? part.source,\n },\n };\n }\n // URL\n return {\n type: \"image\",\n source: { type: \"url\", url: part.source },\n };\n }\n case \"file\":\n return { type: \"text\", text: `[file: ${part.source}]` };\n case \"audio\":\n return { type: \"text\", text: `[audio: ${part.source}]` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build API arguments\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_TOKENS = 1024;\n\n/**\n * Build Anthropic Messages API arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\n\n // Separate system messages from conversation messages\n const systemParts: string[] = [];\n const conversationMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemParts.push(msg.text);\n } else {\n conversationMessages.push(messageToWire(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n messages: conversationMessages,\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n ...buildOptions(agent),\n };\n\n // System prompt as separate parameter\n if (systemParts.length > 0) {\n args.system = systemParts.join(\"\\n\\n\");\n }\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const outputConfig = outputSchemaToWire(agent);\n if (outputConfig) {\n args.output_config = outputConfig;\n }\n\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.topK !== undefined) result.top_k = opts.topK;\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result) && k !== \"max_tokens\") {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{\n name?: string;\n kind?: string;\n description?: string;\n required?: boolean;\n enumValues?: unknown[];\n }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition. */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Convert agent tools to Anthropic tool format.\n *\n * Anthropic uses: { name, description, input_schema }\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\n */\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const tool: Record<string, unknown> = { name: t.name };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.input_schema = schemaToWire(params);\n } else {\n tool.input_schema = { type: \"object\", properties: {} };\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/**\n * Convert outputSchema to Anthropic structured output config.\n *\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\n */\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(\n prop as Parameters<typeof propertyToJsonSchema>[0],\n );\n required.push(prop.name);\n }\n\n return {\n format: {\n type: \"json_schema\",\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\n *\n * Handles:\n * - Text content from `content[]` blocks\n * - Tool use blocks → ToolCall objects\n * - Streaming responses (content_block_delta events)\n * - Structured output (JSON parse when outputSchema present)\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class AnthropicProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an Anthropic Messages API response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Anthropic Messages response — has `content` array and `role`\n if (Array.isArray(r.content) && r.role === \"assistant\") {\n return processMessages(agent, r);\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks from an Anthropic streaming response.\n *\n * Anthropic streaming events include:\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\n * - `input_json` deltas for tool arguments\n * - `message_stop` → end of stream\n *\n * Tool calls are accumulated and yielded at the end of the stream.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n for await (const event of response) {\n const e = event as Record<string, unknown>;\n const eventType = e.type as string | undefined;\n\n if (eventType === \"content_block_delta\") {\n const delta = e.delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n if (delta.type === \"text_delta\") {\n yield delta.text as string;\n } else if (delta.type === \"input_json_delta\") {\n // Accumulate partial JSON for tool arguments\n const idx = e.index as number;\n const acc = toolCallAcc.get(idx);\n if (acc) {\n acc.arguments += (delta.partial_json ?? \"\") as string;\n }\n }\n } else if (eventType === \"content_block_start\") {\n const block = e.content_block as Record<string, unknown> | undefined;\n if (block?.type === \"tool_use\") {\n const idx = e.index as number;\n toolCallAcc.set(idx, {\n id: (block.id ?? \"\") as string,\n name: (block.name ?? \"\") as string,\n arguments: \"\",\n });\n }\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process an Anthropic Messages API response.\n *\n * Response shape:\n * ```json\n * {\n * \"role\": \"assistant\",\n * \"content\": [\n * { \"type\": \"text\", \"text\": \"...\" },\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\n * ],\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\n * }\n * ```\n */\nfunction processMessages(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const content = response.content as Record<string, unknown>[];\n if (!content || content.length === 0) return null;\n\n // Check for tool_use blocks\n const toolCalls: ToolCall[] = [];\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id as string,\n name: block.name as string,\n arguments:\n typeof block.input === \"string\"\n ? (block.input as string)\n : JSON.stringify(block.input),\n });\n } else if (block.type === \"text\") {\n textParts.push(block.text as string);\n }\n }\n\n // If tool calls present, return them (pipeline handles the loop)\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n\n // Text content\n const text = textParts.join(\"\");\n if (!text) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n return text;\n}\n"],"mappings":"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","names":["import_core","import_core","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/anthropic — Anthropic provider for Prompty.\n *\n * Importing this package auto-registers the \"anthropic\" executor and processor.\n *\n * @module @prompty/anthropic\n */\n\nexport { AnthropicExecutor } from \"./executor.js\";\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { AnthropicExecutor } from \"./executor.js\";\nimport { AnthropicProcessor } from \"./processor.js\";\n\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\n","/**\n * Anthropic executor — sends messages to Anthropic Messages API.\n *\n * Dispatches on `agent.model.apiType`: only `chat` is supported\n * (Anthropic has no embedding or image APIs).\n * The agent loop (tool-call iteration) is handled by the pipeline,\n * not the executor.\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs } from \"./wire.js\";\n\nexport class AnthropicExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = \"Anthropic\";\n\n // Trace client construction\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: Anthropic,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.messages.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n\n if (isStreaming) {\n const stream = client.messages.stream(\n args as unknown as Parameters<typeof client.messages.stream>[0],\n );\n return new PromptyStream(\n `${clientName}Executor`,\n stream as unknown as AsyncIterable<unknown>,\n );\n }\n\n const result = await client.messages.create(\n args as unknown as Parameters<typeof client.messages.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\n `Anthropic only supports \"chat\" (Messages API).`,\n );\n }\n }\n\n protected resolveClient(agent: Prompty): Anthropic {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as Anthropic;\n }\n\n const kwargs = this.clientKwargs(agent);\n\n // Lazy import — only needed when actually called\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\n return new AnthropicSDK(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n } else if (conn) {\n throw new Error(\n `Connection kind '${conn.kind}' is not supported by the Anthropic executor. ` +\n `Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`,\n );\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → Anthropic Messages API JSON.\n *\n * Key differences from OpenAI:\n * - `system` is a separate top-level parameter (not in messages)\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\n * - `max_tokens` is required\n * - Structured output uses `output_config.format` with `json_schema`\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n// ---------------------------------------------------------------------------\n// Message conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an abstract Message to Anthropic wire format.\n * System messages are excluded — they go in a separate `system` parameter.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Batched tool results → single user message with all tool_result blocks\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\n wire.role = \"user\";\n wire.content = msg.metadata.tool_results;\n return wire;\n }\n\n // Legacy single tool result messages (backward compat)\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\n wire.role = \"user\";\n wire.content = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: msg.toTextContent(),\n },\n ];\n return wire;\n }\n\n // Assistant messages with raw content blocks (tool_use) — preserve them\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\n wire.content = msg.metadata.content;\n return wire;\n }\n\n // Always use content blocks array for Anthropic wire format\n wire.content = msg.parts.map(partToWire);\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to Anthropic wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n // Anthropic uses base64 source blocks or URL\n if (part.mediaType) {\n // mediaType present → treat source as base64 data\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mediaType,\n data: part.source,\n },\n };\n }\n if (part.source.startsWith(\"data:\")) {\n // Data URL — extract base64 payload and MIME type\n const [header, data] = part.source.split(\",\", 2);\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: mediaType,\n data: data ?? part.source,\n },\n };\n }\n // URL\n return {\n type: \"image\",\n source: { type: \"url\", url: part.source },\n };\n }\n case \"file\":\n return { type: \"text\", text: `[file: ${part.source}]` };\n case \"audio\":\n return { type: \"text\", text: `[audio: ${part.source}]` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build API arguments\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_TOKENS = 4096;\n\n/**\n * Build Anthropic Messages API arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\n\n // Separate system messages from conversation messages\n const systemParts: string[] = [];\n const conversationMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemParts.push(msg.text);\n } else {\n conversationMessages.push(messageToWire(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n messages: conversationMessages,\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n ...buildOptions(agent),\n };\n\n // System prompt as separate parameter\n if (systemParts.length > 0) {\n args.system = systemParts.join(\"\\n\\n\");\n }\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const outputConfig = outputSchemaToWire(agent);\n if (outputConfig) {\n args.output_config = outputConfig;\n }\n\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.topK !== undefined) result.top_k = opts.topK;\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result) && k !== \"max_tokens\") {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{\n name?: string;\n kind?: string;\n description?: string;\n required?: boolean;\n enumValues?: unknown[];\n }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition. */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Convert agent tools to Anthropic tool format.\n *\n * Anthropic uses: { name, description, input_schema }\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\n */\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const tool: Record<string, unknown> = { name: t.name };\n if (t.description) tool.description = t.description;\n\n // Collect bound parameter names to strip from wire format\n const boundNames = new Set((t.bindings ?? []).map((b) => b.name));\n\n let params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n tool.input_schema = schemaToWire(params);\n } else {\n tool.input_schema = { type: \"object\", properties: {} };\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/**\n * Convert outputSchema to Anthropic structured output config.\n *\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\n */\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(\n prop as Parameters<typeof propertyToJsonSchema>[0],\n );\n required.push(prop.name);\n }\n\n return {\n format: {\n type: \"json_schema\",\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\n *\n * Handles:\n * - Text content from `content[]` blocks\n * - Tool use blocks → ToolCall objects\n * - Streaming responses (content_block_delta events)\n * - Structured output (JSON parse when outputSchema present)\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class AnthropicProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an Anthropic Messages API response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Anthropic Messages response — has `content` array and `role`\n if (Array.isArray(r.content) && r.role === \"assistant\") {\n return processMessages(agent, r);\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks from an Anthropic streaming response.\n *\n * Anthropic streaming events include:\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\n * - `input_json` deltas for tool arguments\n * - `message_stop` → end of stream\n *\n * Tool calls are accumulated and yielded at the end of the stream.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n for await (const event of response) {\n const e = event as Record<string, unknown>;\n const eventType = e.type as string | undefined;\n\n if (eventType === \"content_block_delta\") {\n const delta = e.delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n if (delta.type === \"text_delta\") {\n yield delta.text as string;\n } else if (delta.type === \"input_json_delta\") {\n // Accumulate partial JSON for tool arguments\n const idx = e.index as number;\n const acc = toolCallAcc.get(idx);\n if (acc) {\n acc.arguments += (delta.partial_json ?? \"\") as string;\n }\n }\n } else if (eventType === \"content_block_start\") {\n const block = e.content_block as Record<string, unknown> | undefined;\n if (block?.type === \"tool_use\") {\n const idx = e.index as number;\n toolCallAcc.set(idx, {\n id: (block.id ?? \"\") as string,\n name: (block.name ?? \"\") as string,\n arguments: \"\",\n });\n }\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process an Anthropic Messages API response.\n *\n * Response shape:\n * ```json\n * {\n * \"role\": \"assistant\",\n * \"content\": [\n * { \"type\": \"text\", \"text\": \"...\" },\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\n * ],\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\n * }\n * ```\n */\nfunction processMessages(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const content = response.content as Record<string, unknown>[];\n if (!content || content.length === 0) return null;\n\n // Check for tool_use blocks\n const toolCalls: ToolCall[] = [];\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id as string,\n name: block.name as string,\n arguments:\n typeof block.input === \"string\"\n ? (block.input as string)\n : JSON.stringify(block.input),\n });\n } else if (block.type === \"text\") {\n textParts.push(block.text as string);\n }\n }\n\n // If tool calls present, return them (pipeline handles the loop)\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n\n // Text content\n const text = textParts.join(\"\");\n if (!text) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n return text;\n}\n"],"mappings":"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","names":["import_core","import_core","import_core"]}
package/dist/index.js CHANGED
@@ -34,12 +34,7 @@ function messageToWire(msg) {
34
34
  wire.content = msg.metadata.content;
35
35
  return wire;
36
36
  }
37
- const content = msg.toTextContent();
38
- if (typeof content === "string") {
39
- wire.content = content;
40
- } else {
41
- wire.content = msg.parts.map(partToWire);
42
- }
37
+ wire.content = msg.parts.map(partToWire);
43
38
  return wire;
44
39
  }
45
40
  function partToWire(part) {
@@ -47,7 +42,17 @@ function partToWire(part) {
47
42
  case "text":
48
43
  return { type: "text", text: part.value };
49
44
  case "image": {
50
- if (part.source.startsWith("data:") || part.source.startsWith("/")) {
45
+ if (part.mediaType) {
46
+ return {
47
+ type: "image",
48
+ source: {
49
+ type: "base64",
50
+ media_type: part.mediaType,
51
+ data: part.source
52
+ }
53
+ };
54
+ }
55
+ if (part.source.startsWith("data:")) {
51
56
  const [header, data] = part.source.split(",", 2);
52
57
  const mediaType = header?.match(/data:(.*?);/)?.[1] ?? "image/png";
53
58
  return {
@@ -70,7 +75,7 @@ function partToWire(part) {
70
75
  return { type: "text", text: `[audio: ${part.source}]` };
71
76
  }
72
77
  }
73
- var DEFAULT_MAX_TOKENS = 1024;
78
+ var DEFAULT_MAX_TOKENS = 4096;
74
79
  function buildChatArgs(agent, messages) {
75
80
  const model = agent.model?.id || "claude-sonnet-4-5-20250929";
76
81
  const systemParts = [];
@@ -180,8 +185,12 @@ function toolsToWire(agent) {
180
185
  if (t.kind !== "function") continue;
181
186
  const tool = { name: t.name };
182
187
  if (t.description) tool.description = t.description;
183
- const params = t.parameters;
188
+ const boundNames = new Set((t.bindings ?? []).map((b) => b.name));
189
+ let params = t.parameters;
184
190
  if (params && Array.isArray(params)) {
191
+ if (boundNames.size > 0) {
192
+ params = params.filter((p) => !boundNames.has(p.name));
193
+ }
185
194
  tool.input_schema = schemaToWire(params);
186
195
  } else {
187
196
  tool.input_schema = { type: "object", properties: {} };
@@ -285,6 +294,10 @@ var AnthropicExecutor = class {
285
294
  if (conn instanceof ApiKeyConnection) {
286
295
  if (conn.apiKey) kwargs.apiKey = conn.apiKey;
287
296
  if (conn.endpoint) kwargs.baseURL = conn.endpoint;
297
+ } else if (conn) {
298
+ throw new Error(
299
+ `Connection kind '${conn.kind}' is not supported by the Anthropic executor. Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`
300
+ );
288
301
  }
289
302
  return kwargs;
290
303
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/executor.ts","../src/wire.ts","../src/processor.ts","../src/index.ts"],"sourcesContent":["/**\n * Anthropic executor — sends messages to Anthropic Messages API.\n *\n * Dispatches on `agent.model.apiType`: only `chat` is supported\n * (Anthropic has no embedding or image APIs).\n * The agent loop (tool-call iteration) is handled by the pipeline,\n * not the executor.\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs } from \"./wire.js\";\n\nexport class AnthropicExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = \"Anthropic\";\n\n // Trace client construction\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: Anthropic,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.messages.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n\n if (isStreaming) {\n const stream = client.messages.stream(\n args as unknown as Parameters<typeof client.messages.stream>[0],\n );\n return new PromptyStream(\n `${clientName}Executor`,\n stream as unknown as AsyncIterable<unknown>,\n );\n }\n\n const result = await client.messages.create(\n args as unknown as Parameters<typeof client.messages.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\n `Anthropic only supports \"chat\" (Messages API).`,\n );\n }\n }\n\n protected resolveClient(agent: Prompty): Anthropic {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as Anthropic;\n }\n\n const kwargs = this.clientKwargs(agent);\n\n // Lazy import — only needed when actually called\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\n return new AnthropicSDK(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → Anthropic Messages API JSON.\n *\n * Key differences from OpenAI:\n * - `system` is a separate top-level parameter (not in messages)\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\n * - `max_tokens` is required\n * - Structured output uses `output_config.format` with `json_schema`\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n// ---------------------------------------------------------------------------\n// Message conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an abstract Message to Anthropic wire format.\n * System messages are excluded — they go in a separate `system` parameter.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Batched tool results → single user message with all tool_result blocks\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\n wire.role = \"user\";\n wire.content = msg.metadata.tool_results;\n return wire;\n }\n\n // Legacy single tool result messages (backward compat)\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\n wire.role = \"user\";\n wire.content = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: msg.toTextContent(),\n },\n ];\n return wire;\n }\n\n // Assistant messages with raw content blocks (tool_use) — preserve them\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\n wire.content = msg.metadata.content;\n return wire;\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to Anthropic format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to Anthropic wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n // Anthropic uses base64 source blocks or URL\n if (part.source.startsWith(\"data:\") || part.source.startsWith(\"/\")) {\n // Base64 encoded\n const [header, data] = part.source.split(\",\", 2);\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: mediaType,\n data: data ?? part.source,\n },\n };\n }\n // URL\n return {\n type: \"image\",\n source: { type: \"url\", url: part.source },\n };\n }\n case \"file\":\n return { type: \"text\", text: `[file: ${part.source}]` };\n case \"audio\":\n return { type: \"text\", text: `[audio: ${part.source}]` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build API arguments\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_TOKENS = 1024;\n\n/**\n * Build Anthropic Messages API arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\n\n // Separate system messages from conversation messages\n const systemParts: string[] = [];\n const conversationMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemParts.push(msg.text);\n } else {\n conversationMessages.push(messageToWire(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n messages: conversationMessages,\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n ...buildOptions(agent),\n };\n\n // System prompt as separate parameter\n if (systemParts.length > 0) {\n args.system = systemParts.join(\"\\n\\n\");\n }\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const outputConfig = outputSchemaToWire(agent);\n if (outputConfig) {\n args.output_config = outputConfig;\n }\n\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.topK !== undefined) result.top_k = opts.topK;\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result) && k !== \"max_tokens\") {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{\n name?: string;\n kind?: string;\n description?: string;\n required?: boolean;\n enumValues?: unknown[];\n }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition. */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Convert agent tools to Anthropic tool format.\n *\n * Anthropic uses: { name, description, input_schema }\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\n */\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const tool: Record<string, unknown> = { name: t.name };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.input_schema = schemaToWire(params);\n } else {\n tool.input_schema = { type: \"object\", properties: {} };\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/**\n * Convert outputSchema to Anthropic structured output config.\n *\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\n */\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(\n prop as Parameters<typeof propertyToJsonSchema>[0],\n );\n required.push(prop.name);\n }\n\n return {\n format: {\n type: \"json_schema\",\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\n *\n * Handles:\n * - Text content from `content[]` blocks\n * - Tool use blocks → ToolCall objects\n * - Streaming responses (content_block_delta events)\n * - Structured output (JSON parse when outputSchema present)\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class AnthropicProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an Anthropic Messages API response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Anthropic Messages response — has `content` array and `role`\n if (Array.isArray(r.content) && r.role === \"assistant\") {\n return processMessages(agent, r);\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks from an Anthropic streaming response.\n *\n * Anthropic streaming events include:\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\n * - `input_json` deltas for tool arguments\n * - `message_stop` → end of stream\n *\n * Tool calls are accumulated and yielded at the end of the stream.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n for await (const event of response) {\n const e = event as Record<string, unknown>;\n const eventType = e.type as string | undefined;\n\n if (eventType === \"content_block_delta\") {\n const delta = e.delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n if (delta.type === \"text_delta\") {\n yield delta.text as string;\n } else if (delta.type === \"input_json_delta\") {\n // Accumulate partial JSON for tool arguments\n const idx = e.index as number;\n const acc = toolCallAcc.get(idx);\n if (acc) {\n acc.arguments += (delta.partial_json ?? \"\") as string;\n }\n }\n } else if (eventType === \"content_block_start\") {\n const block = e.content_block as Record<string, unknown> | undefined;\n if (block?.type === \"tool_use\") {\n const idx = e.index as number;\n toolCallAcc.set(idx, {\n id: (block.id ?? \"\") as string,\n name: (block.name ?? \"\") as string,\n arguments: \"\",\n });\n }\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process an Anthropic Messages API response.\n *\n * Response shape:\n * ```json\n * {\n * \"role\": \"assistant\",\n * \"content\": [\n * { \"type\": \"text\", \"text\": \"...\" },\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\n * ],\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\n * }\n * ```\n */\nfunction processMessages(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const content = response.content as Record<string, unknown>[];\n if (!content || content.length === 0) return null;\n\n // Check for tool_use blocks\n const toolCalls: ToolCall[] = [];\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id as string,\n name: block.name as string,\n arguments:\n typeof block.input === \"string\"\n ? (block.input as string)\n : JSON.stringify(block.input),\n });\n } else if (block.type === \"text\") {\n textParts.push(block.text as string);\n }\n }\n\n // If tool calls present, return them (pipeline handles the loop)\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n\n // Text content\n const text = textParts.join(\"\");\n if (!text) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n return text;\n}\n","/**\n * @prompty/anthropic — Anthropic provider for Prompty.\n *\n * Importing this package auto-registers the \"anthropic\" executor and processor.\n *\n * @module @prompty/anthropic\n */\n\nexport { AnthropicExecutor } from \"./executor.js\";\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { AnthropicExecutor } from \"./executor.js\";\nimport { AnthropicProcessor } from \"./processor.js\";\n\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\n"],"mappings":"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","names":["traceSpan"]}
1
+ {"version":3,"sources":["../src/executor.ts","../src/wire.ts","../src/processor.ts","../src/index.ts"],"sourcesContent":["/**\n * Anthropic executor — sends messages to Anthropic Messages API.\n *\n * Dispatches on `agent.model.apiType`: only `chat` is supported\n * (Anthropic has no embedding or image APIs).\n * The agent loop (tool-call iteration) is handled by the pipeline,\n * not the executor.\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs } from \"./wire.js\";\n\nexport class AnthropicExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = \"Anthropic\";\n\n // Trace client construction\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: Anthropic,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.messages.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n\n if (isStreaming) {\n const stream = client.messages.stream(\n args as unknown as Parameters<typeof client.messages.stream>[0],\n );\n return new PromptyStream(\n `${clientName}Executor`,\n stream as unknown as AsyncIterable<unknown>,\n );\n }\n\n const result = await client.messages.create(\n args as unknown as Parameters<typeof client.messages.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\n `Anthropic only supports \"chat\" (Messages API).`,\n );\n }\n }\n\n protected resolveClient(agent: Prompty): Anthropic {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as Anthropic;\n }\n\n const kwargs = this.clientKwargs(agent);\n\n // Lazy import — only needed when actually called\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\n return new AnthropicSDK(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n } else if (conn) {\n throw new Error(\n `Connection kind '${conn.kind}' is not supported by the Anthropic executor. ` +\n `Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`,\n );\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → Anthropic Messages API JSON.\n *\n * Key differences from OpenAI:\n * - `system` is a separate top-level parameter (not in messages)\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\n * - `max_tokens` is required\n * - Structured output uses `output_config.format` with `json_schema`\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n// ---------------------------------------------------------------------------\n// Message conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an abstract Message to Anthropic wire format.\n * System messages are excluded — they go in a separate `system` parameter.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Batched tool results → single user message with all tool_result blocks\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\n wire.role = \"user\";\n wire.content = msg.metadata.tool_results;\n return wire;\n }\n\n // Legacy single tool result messages (backward compat)\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\n wire.role = \"user\";\n wire.content = [\n {\n type: \"tool_result\",\n tool_use_id: toolUseId,\n content: msg.toTextContent(),\n },\n ];\n return wire;\n }\n\n // Assistant messages with raw content blocks (tool_use) — preserve them\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\n wire.content = msg.metadata.content;\n return wire;\n }\n\n // Always use content blocks array for Anthropic wire format\n wire.content = msg.parts.map(partToWire);\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to Anthropic wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n // Anthropic uses base64 source blocks or URL\n if (part.mediaType) {\n // mediaType present → treat source as base64 data\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mediaType,\n data: part.source,\n },\n };\n }\n if (part.source.startsWith(\"data:\")) {\n // Data URL — extract base64 payload and MIME type\n const [header, data] = part.source.split(\",\", 2);\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: mediaType,\n data: data ?? part.source,\n },\n };\n }\n // URL\n return {\n type: \"image\",\n source: { type: \"url\", url: part.source },\n };\n }\n case \"file\":\n return { type: \"text\", text: `[file: ${part.source}]` };\n case \"audio\":\n return { type: \"text\", text: `[audio: ${part.source}]` };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build API arguments\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_TOKENS = 4096;\n\n/**\n * Build Anthropic Messages API arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\n\n // Separate system messages from conversation messages\n const systemParts: string[] = [];\n const conversationMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemParts.push(msg.text);\n } else {\n conversationMessages.push(messageToWire(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n messages: conversationMessages,\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n ...buildOptions(agent),\n };\n\n // System prompt as separate parameter\n if (systemParts.length > 0) {\n args.system = systemParts.join(\"\\n\\n\");\n }\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const outputConfig = outputSchemaToWire(agent);\n if (outputConfig) {\n args.output_config = outputConfig;\n }\n\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.topK !== undefined) result.top_k = opts.topK;\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result) && k !== \"max_tokens\") {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{\n name?: string;\n kind?: string;\n description?: string;\n required?: boolean;\n enumValues?: unknown[];\n }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition. */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\n/**\n * Convert agent tools to Anthropic tool format.\n *\n * Anthropic uses: { name, description, input_schema }\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\n */\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const tool: Record<string, unknown> = { name: t.name };\n if (t.description) tool.description = t.description;\n\n // Collect bound parameter names to strip from wire format\n const boundNames = new Set((t.bindings ?? []).map((b) => b.name));\n\n let params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n tool.input_schema = schemaToWire(params);\n } else {\n tool.input_schema = { type: \"object\", properties: {} };\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/**\n * Convert outputSchema to Anthropic structured output config.\n *\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\n */\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(\n prop as Parameters<typeof propertyToJsonSchema>[0],\n );\n required.push(prop.name);\n }\n\n return {\n format: {\n type: \"json_schema\",\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\n *\n * Handles:\n * - Text content from `content[]` blocks\n * - Tool use blocks → ToolCall objects\n * - Streaming responses (content_block_delta events)\n * - Structured output (JSON parse when outputSchema present)\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class AnthropicProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an Anthropic Messages API response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Anthropic Messages response — has `content` array and `role`\n if (Array.isArray(r.content) && r.role === \"assistant\") {\n return processMessages(agent, r);\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks from an Anthropic streaming response.\n *\n * Anthropic streaming events include:\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\n * - `input_json` deltas for tool arguments\n * - `message_stop` → end of stream\n *\n * Tool calls are accumulated and yielded at the end of the stream.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<\n number,\n { id: string; name: string; arguments: string }\n > = new Map();\n\n for await (const event of response) {\n const e = event as Record<string, unknown>;\n const eventType = e.type as string | undefined;\n\n if (eventType === \"content_block_delta\") {\n const delta = e.delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n if (delta.type === \"text_delta\") {\n yield delta.text as string;\n } else if (delta.type === \"input_json_delta\") {\n // Accumulate partial JSON for tool arguments\n const idx = e.index as number;\n const acc = toolCallAcc.get(idx);\n if (acc) {\n acc.arguments += (delta.partial_json ?? \"\") as string;\n }\n }\n } else if (eventType === \"content_block_start\") {\n const block = e.content_block as Record<string, unknown> | undefined;\n if (block?.type === \"tool_use\") {\n const idx = e.index as number;\n toolCallAcc.set(idx, {\n id: (block.id ?? \"\") as string,\n name: (block.name ?? \"\") as string,\n arguments: \"\",\n });\n }\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process an Anthropic Messages API response.\n *\n * Response shape:\n * ```json\n * {\n * \"role\": \"assistant\",\n * \"content\": [\n * { \"type\": \"text\", \"text\": \"...\" },\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\n * ],\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\n * }\n * ```\n */\nfunction processMessages(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const content = response.content as Record<string, unknown>[];\n if (!content || content.length === 0) return null;\n\n // Check for tool_use blocks\n const toolCalls: ToolCall[] = [];\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id as string,\n name: block.name as string,\n arguments:\n typeof block.input === \"string\"\n ? (block.input as string)\n : JSON.stringify(block.input),\n });\n } else if (block.type === \"text\") {\n textParts.push(block.text as string);\n }\n }\n\n // If tool calls present, return them (pipeline handles the loop)\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n\n // Text content\n const text = textParts.join(\"\");\n if (!text) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n\n return text;\n}\n","/**\n * @prompty/anthropic — Anthropic provider for Prompty.\n *\n * Importing this package auto-registers the \"anthropic\" executor and processor.\n *\n * @module @prompty/anthropic\n */\n\nexport { AnthropicExecutor } from \"./executor.js\";\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { AnthropicExecutor } from \"./executor.js\";\nimport { AnthropicProcessor } from \"./processor.js\";\n\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\n"],"mappings":"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","names":["traceSpan"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prompty/anthropic",
3
- "version": "2.0.0-alpha.3",
3
+ "version": "2.0.0-alpha.5",
4
4
  "description": "Anthropic provider for Prompty — executor and processor for Anthropic Messages API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -45,7 +45,7 @@
45
45
  "node": ">=18.0.0"
46
46
  },
47
47
  "peerDependencies": {
48
- "@prompty/core": "^2.0.0-alpha.3",
48
+ "@prompty/core": "^2.0.0-alpha.5",
49
49
  "@anthropic-ai/sdk": ">=0.39.0"
50
50
  },
51
51
  "peerDependenciesMeta": {
@@ -57,6 +57,7 @@
57
57
  "@prompty/core": "file:../core",
58
58
  "@anthropic-ai/sdk": "^0.39.0",
59
59
  "@types/node": "^20.11.0",
60
+ "dotenv": "^16.4.0",
60
61
  "tsup": "^8.4.0",
61
62
  "typescript": "^5.7.0",
62
63
  "vitest": "^3.0.0"