@prompty/anthropic 2.0.0-alpha.1 → 2.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/dist/index.cjs +22 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +22 -9
- package/dist/index.js.map +1 -1
- package/package.json +65 -64
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @prompty/anthropic
|
|
2
|
+
|
|
3
|
+
Anthropic provider for Prompty — executor and processor for the Anthropic Messages API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @prompty/core @prompty/anthropic @anthropic-ai/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Import `@prompty/anthropic` to auto-register the `anthropic` provider, then use `@prompty/core` as normal:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import "@prompty/anthropic";
|
|
17
|
+
import { run } from "@prompty/core";
|
|
18
|
+
|
|
19
|
+
const result = await run("./chat.prompty", {
|
|
20
|
+
question: "What is quantum computing?",
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## `.prompty` Configuration
|
|
25
|
+
|
|
26
|
+
Set `provider: anthropic` in your `.prompty` file:
|
|
27
|
+
|
|
28
|
+
```prompty
|
|
29
|
+
---
|
|
30
|
+
name: my-prompt
|
|
31
|
+
model:
|
|
32
|
+
id: claude-sonnet-4-20250514
|
|
33
|
+
provider: anthropic
|
|
34
|
+
apiType: chat
|
|
35
|
+
connection:
|
|
36
|
+
kind: key
|
|
37
|
+
apiKey: ${env:ANTHROPIC_API_KEY}
|
|
38
|
+
options:
|
|
39
|
+
temperature: 0.7
|
|
40
|
+
maxOutputTokens: 1000
|
|
41
|
+
---
|
|
42
|
+
system:
|
|
43
|
+
You are a helpful assistant.
|
|
44
|
+
|
|
45
|
+
user:
|
|
46
|
+
{{question}}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Supported API Types
|
|
50
|
+
|
|
51
|
+
| `apiType` | Description |
|
|
52
|
+
|-----------|-------------|
|
|
53
|
+
| `chat` (default) | Messages via `client.messages.create()` |
|
|
54
|
+
|
|
55
|
+
## Streaming
|
|
56
|
+
|
|
57
|
+
Enable streaming via `additionalProperties`:
|
|
58
|
+
|
|
59
|
+
```prompty
|
|
60
|
+
model:
|
|
61
|
+
options:
|
|
62
|
+
additionalProperties:
|
|
63
|
+
stream: true
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Returns a `PromptyStream` that can be iterated asynchronously.
|
|
67
|
+
|
|
68
|
+
## Structured Output
|
|
69
|
+
|
|
70
|
+
Anthropic supports structured output via `outputs` in the `.prompty` frontmatter. The executor converts this to a JSON tool-use pattern, and the processor automatically parses the result.
|
|
71
|
+
|
|
72
|
+
## Exports
|
|
73
|
+
|
|
74
|
+
| Export | Description |
|
|
75
|
+
|--------|-------------|
|
|
76
|
+
| `AnthropicExecutor` | Executor implementation for Anthropic |
|
|
77
|
+
| `AnthropicProcessor` | Processor for Anthropic responses |
|
|
78
|
+
| `processResponse` | Shared response processing helper |
|
|
79
|
+
| `messageToWire` | Convert `Message` → Anthropic wire format |
|
|
80
|
+
| `buildChatArgs` | Build messages API arguments |
|
|
81
|
+
| `toolsToWire` | Convert tools → Anthropic tool format |
|
|
82
|
+
| `outputSchemaToWire` | Convert output schema → Anthropic tool format |
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
MIT
|
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
|
-
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\r\n * @prompty/anthropic — Anthropic provider for Prompty.\r\n *\r\n * Importing this package auto-registers the \"anthropic\" executor and processor.\r\n *\r\n * @module @prompty/anthropic\r\n */\r\n\r\nexport { AnthropicExecutor } from \"./executor.js\";\r\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\r\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\r\n\r\n// Auto-register on import\r\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\r\nimport { AnthropicExecutor } from \"./executor.js\";\r\nimport { AnthropicProcessor } from \"./processor.js\";\r\n\r\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\r\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\r\n","/**\r\n * Anthropic executor — sends messages to Anthropic Messages API.\r\n *\r\n * Dispatches on `agent.model.apiType`: only `chat` is supported\r\n * (Anthropic has no embedding or image APIs).\r\n * The agent loop (tool-call iteration) is handled by the pipeline,\r\n * not the executor.\r\n *\r\n * @module\r\n */\r\n\r\nimport type Anthropic from \"@anthropic-ai/sdk\";\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\r\nimport type { Executor } from \"@prompty/core\";\r\nimport type { Message } from \"@prompty/core\";\r\nimport { getConnection } from \"@prompty/core\";\r\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\r\nimport { buildChatArgs } from \"./wire.js\";\r\n\r\nexport class AnthropicExecutor implements Executor {\r\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\r\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\r\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\r\n emit(\"inputs\", { data: messages });\r\n\r\n const client = this.resolveClient(agent);\r\n const clientName = \"Anthropic\";\r\n\r\n // Trace client construction\r\n await traceSpan(clientName, async (ctorEmit) => {\r\n ctorEmit(\"signature\", `${clientName}.ctor`);\r\n const conn = agent.model?.connection;\r\n if (conn instanceof ReferenceConnection) {\r\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\r\n } else {\r\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\r\n }\r\n ctorEmit(\"result\", clientName);\r\n });\r\n\r\n const apiType = agent.model?.apiType ?? \"chat\";\r\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\r\n emit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n\r\n /** Dispatch to the appropriate API and trace the call. */\r\n private async executeApiCall(\r\n client: Anthropic,\r\n clientName: string,\r\n agent: Prompty,\r\n messages: Message[],\r\n apiType: string,\r\n ): Promise<unknown> {\r\n switch (apiType) {\r\n case \"chat\": {\r\n const args = buildChatArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.messages.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n\r\n if (isStreaming) {\r\n const stream = client.messages.stream(\r\n args as unknown as Parameters<typeof client.messages.stream>[0],\r\n );\r\n return new PromptyStream(\r\n `${clientName}Executor`,\r\n stream as unknown as AsyncIterable<unknown>,\r\n );\r\n }\r\n\r\n const result = await client.messages.create(\r\n args as unknown as Parameters<typeof client.messages.create>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n default:\r\n throw new Error(\r\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\r\n `Anthropic only supports \"chat\" (Messages API).`,\r\n );\r\n }\r\n }\r\n\r\n protected resolveClient(agent: Prompty): Anthropic {\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ReferenceConnection) {\r\n return getConnection(conn.name) as Anthropic;\r\n }\r\n\r\n const kwargs = this.clientKwargs(agent);\r\n\r\n // Lazy import — only needed when actually called\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\r\n return new AnthropicSDK(kwargs);\r\n }\r\n\r\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\r\n const kwargs: Record<string, unknown> = {};\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ApiKeyConnection) {\r\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\r\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\r\n }\r\n\r\n return kwargs;\r\n }\r\n}\r\n","/**\r\n * Wire format conversion: Message → Anthropic Messages API JSON.\r\n *\r\n * Key differences from OpenAI:\r\n * - `system` is a separate top-level parameter (not in messages)\r\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\r\n * - `max_tokens` is required\r\n * - Structured output uses `output_config.format` with `json_schema`\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { ContentPart, Message } from \"@prompty/core\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Message conversion\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Convert an abstract Message to Anthropic wire format.\r\n * System messages are excluded — they go in a separate `system` parameter.\r\n */\r\nexport function messageToWire(msg: Message): Record<string, unknown> {\r\n const wire: Record<string, unknown> = { role: msg.role };\r\n\r\n // Batched tool results → single user message with all tool_result blocks\r\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\r\n wire.role = \"user\";\r\n wire.content = msg.metadata.tool_results;\r\n return wire;\r\n }\r\n\r\n // Legacy single tool result messages (backward compat)\r\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\r\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\r\n wire.role = \"user\";\r\n wire.content = [\r\n {\r\n type: \"tool_result\",\r\n tool_use_id: toolUseId,\r\n content: msg.toTextContent(),\r\n },\r\n ];\r\n return wire;\r\n }\r\n\r\n // Assistant messages with raw content blocks (tool_use) — preserve them\r\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\r\n wire.content = msg.metadata.content;\r\n return wire;\r\n }\r\n\r\n const content = msg.toTextContent();\r\n if (typeof content === \"string\") {\r\n wire.content = content;\r\n } else {\r\n // Multimodal — convert parts to Anthropic format\r\n wire.content = msg.parts.map(partToWire);\r\n }\r\n\r\n return wire;\r\n}\r\n\r\n/**\r\n * Convert a ContentPart to Anthropic wire format.\r\n */\r\nfunction partToWire(part: ContentPart): Record<string, unknown> {\r\n switch (part.kind) {\r\n case \"text\":\r\n return { type: \"text\", text: part.value };\r\n case \"image\": {\r\n // Anthropic uses base64 source blocks or URL\r\n if (part.source.startsWith(\"data:\") || part.source.startsWith(\"/\")) {\r\n // Base64 encoded\r\n const [header, data] = part.source.split(\",\", 2);\r\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\r\n return {\r\n type: \"image\",\r\n source: {\r\n type: \"base64\",\r\n media_type: mediaType,\r\n data: data ?? part.source,\r\n },\r\n };\r\n }\r\n // URL\r\n return {\r\n type: \"image\",\r\n source: { type: \"url\", url: part.source },\r\n };\r\n }\r\n case \"file\":\r\n return { type: \"text\", text: `[file: ${part.source}]` };\r\n case \"audio\":\r\n return { type: \"text\", text: `[audio: ${part.source}]` };\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Build API arguments\r\n// ---------------------------------------------------------------------------\r\n\r\nconst DEFAULT_MAX_TOKENS = 1024;\r\n\r\n/**\r\n * Build Anthropic Messages API arguments from agent config and messages.\r\n */\r\nexport function buildChatArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\r\n\r\n // Separate system messages from conversation messages\r\n const systemParts: string[] = [];\r\n const conversationMessages: Record<string, unknown>[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"system\") {\r\n systemParts.push(msg.text);\r\n } else {\r\n conversationMessages.push(messageToWire(msg));\r\n }\r\n }\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n messages: conversationMessages,\r\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\r\n ...buildOptions(agent),\r\n };\r\n\r\n // System prompt as separate parameter\r\n if (systemParts.length > 0) {\r\n args.system = systemParts.join(\"\\n\\n\");\r\n }\r\n\r\n // Tools\r\n const tools = toolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output\r\n const outputConfig = outputSchemaToWire(agent);\r\n if (outputConfig) {\r\n args.output_config = outputConfig;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Map AgentSchema kind strings to JSON Schema type strings. */\r\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\r\n string: \"string\",\r\n integer: \"integer\",\r\n float: \"number\",\r\n number: \"number\",\r\n boolean: \"boolean\",\r\n array: \"array\",\r\n object: \"object\",\r\n};\r\n\r\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n if (opts.topK !== undefined) result.top_k = opts.topK;\r\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result) && k !== \"max_tokens\") {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\r\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const p of properties as Array<{\r\n name?: string;\r\n kind?: string;\r\n description?: string;\r\n required?: boolean;\r\n enumValues?: unknown[];\r\n }>) {\r\n if (!p.name) continue;\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\r\n };\r\n if (p.description) schema.description = p.description;\r\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\r\n props[p.name] = schema;\r\n if (p.required) required.push(p.name);\r\n }\r\n\r\n const result: Record<string, unknown> = { type: \"object\", properties: props };\r\n if (required.length > 0) result.required = required;\r\n return result;\r\n}\r\n\r\n/** Convert a single Property to a JSON Schema definition. */\r\nfunction propertyToJsonSchema(prop: {\r\n kind?: string;\r\n description?: string;\r\n enumValues?: unknown[];\r\n items?: unknown;\r\n properties?: unknown[];\r\n}): Record<string, unknown> {\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\r\n };\r\n\r\n if (prop.description) schema.description = prop.description;\r\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\r\n\r\n if (prop.kind === \"array\") {\r\n schema.items = prop.items\r\n ? propertyToJsonSchema(prop.items as typeof prop)\r\n : { type: \"string\" };\r\n }\r\n\r\n if (prop.kind === \"object\") {\r\n if (prop.properties) {\r\n const nested: Record<string, unknown> = {};\r\n const req: string[] = [];\r\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\r\n if (!p.name) continue;\r\n nested[p.name] = propertyToJsonSchema(p);\r\n req.push(p.name);\r\n }\r\n schema.properties = nested;\r\n schema.required = req;\r\n } else {\r\n schema.properties = {};\r\n schema.required = [];\r\n }\r\n schema.additionalProperties = false;\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Convert agent tools to Anthropic tool format.\r\n *\r\n * Anthropic uses: { name, description, input_schema }\r\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\r\n */\r\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n const tool: Record<string, unknown> = { name: t.name };\r\n if (t.description) tool.description = t.description;\r\n\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n tool.input_schema = schemaToWire(params);\r\n } else {\r\n tool.input_schema = { type: \"object\", properties: {} };\r\n }\r\n\r\n result.push(tool);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert outputSchema to Anthropic structured output config.\r\n *\r\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\r\n */\r\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(\r\n prop as Parameters<typeof propertyToJsonSchema>[0],\r\n );\r\n required.push(prop.name);\r\n }\r\n\r\n return {\r\n format: {\r\n type: \"json_schema\",\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n","/**\r\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\r\n *\r\n * Handles:\r\n * - Text content from `content[]` blocks\r\n * - Tool use blocks → ToolCall objects\r\n * - Streaming responses (content_block_delta events)\r\n * - Structured output (JSON parse when outputSchema present)\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { Processor } from \"@prompty/core\";\r\nimport type { ToolCall } from \"@prompty/core\";\r\nimport { traceSpan } from \"@prompty/core\";\r\n\r\nexport class AnthropicProcessor implements Processor {\r\n async process(agent: Prompty, response: unknown): Promise<unknown> {\r\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\r\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\r\n emit(\"inputs\", { data: response });\r\n const result = processResponse(agent, response);\r\n // Don't emit result for streaming — it's a generator, not a value\r\n if (!isAsyncIterable(response)) {\r\n emit(\"result\", result);\r\n }\r\n return result;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Extract clean content from an Anthropic Messages API response.\r\n */\r\nexport function processResponse(agent: Prompty, response: unknown): unknown {\r\n if (typeof response !== \"object\" || response === null) return response;\r\n\r\n // Streaming response — return content-extracting async generator\r\n if (isAsyncIterable(response)) {\r\n return streamGenerator(response);\r\n }\r\n\r\n const r = response as Record<string, unknown>;\r\n\r\n // Anthropic Messages response — has `content` array and `role`\r\n if (Array.isArray(r.content) && r.role === \"assistant\") {\r\n return processMessages(agent, r);\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\r\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\n/**\r\n * Yield content chunks from an Anthropic streaming response.\r\n *\r\n * Anthropic streaming events include:\r\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\r\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\r\n * - `input_json` deltas for tool arguments\r\n * - `message_stop` → end of stream\r\n *\r\n * Tool calls are accumulated and yielded at the end of the stream.\r\n */\r\nasync function* streamGenerator(\r\n response: AsyncIterable<unknown>,\r\n): AsyncGenerator<string | ToolCall> {\r\n const toolCallAcc: Map<\r\n number,\r\n { id: string; name: string; arguments: string }\r\n > = new Map();\r\n\r\n for await (const event of response) {\r\n const e = event as Record<string, unknown>;\r\n const eventType = e.type as string | undefined;\r\n\r\n if (eventType === \"content_block_delta\") {\r\n const delta = e.delta as Record<string, unknown> | undefined;\r\n if (!delta) continue;\r\n\r\n if (delta.type === \"text_delta\") {\r\n yield delta.text as string;\r\n } else if (delta.type === \"input_json_delta\") {\r\n // Accumulate partial JSON for tool arguments\r\n const idx = e.index as number;\r\n const acc = toolCallAcc.get(idx);\r\n if (acc) {\r\n acc.arguments += (delta.partial_json ?? \"\") as string;\r\n }\r\n }\r\n } else if (eventType === \"content_block_start\") {\r\n const block = e.content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") {\r\n const idx = e.index as number;\r\n toolCallAcc.set(idx, {\r\n id: (block.id ?? \"\") as string,\r\n name: (block.name ?? \"\") as string,\r\n arguments: \"\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Yield accumulated tool calls at the end of the stream\r\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\r\n for (const idx of sortedIndices) {\r\n const tc = toolCallAcc.get(idx)!;\r\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Non-streaming response processing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Process an Anthropic Messages API response.\r\n *\r\n * Response shape:\r\n * ```json\r\n * {\r\n * \"role\": \"assistant\",\r\n * \"content\": [\r\n * { \"type\": \"text\", \"text\": \"...\" },\r\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\r\n * ],\r\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\r\n * }\r\n * ```\r\n */\r\nfunction processMessages(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const content = response.content as Record<string, unknown>[];\r\n if (!content || content.length === 0) return null;\r\n\r\n // Check for tool_use blocks\r\n const toolCalls: ToolCall[] = [];\r\n const textParts: string[] = [];\r\n\r\n for (const block of content) {\r\n if (block.type === \"tool_use\") {\r\n toolCalls.push({\r\n id: block.id as string,\r\n name: block.name as string,\r\n arguments:\r\n typeof block.input === \"string\"\r\n ? (block.input as string)\r\n : JSON.stringify(block.input),\r\n });\r\n } else if (block.type === \"text\") {\r\n textParts.push(block.text as string);\r\n }\r\n }\r\n\r\n // If tool calls present, return them (pipeline handles the loop)\r\n if (toolCalls.length > 0) {\r\n return toolCalls;\r\n }\r\n\r\n // Text content\r\n const text = textParts.join(\"\");\r\n if (!text) return null;\r\n\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n\r\n return text;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACaA,kBAAqE;AAGrE,IAAAA,eAA8B;AAC9B,IAAAA,eAAyC;;;ACMlC,SAAS,cAAc,KAAuC;AACnE,QAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AAGvD,MAAI,IAAI,SAAS,gBAAgB,MAAM,QAAQ,IAAI,SAAS,YAAY,GAAG;AACzE,SAAK,OAAO;AACZ,SAAK,UAAU,IAAI,SAAS;AAC5B,WAAO;AAAA,EACT;AAGA,MAAI,IAAI,SAAS,eAAe,IAAI,SAAS,cAAc;AACzD,UAAM,YAAa,IAAI,SAAS,eAAe,IAAI,SAAS;AAC5D,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,MACb;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,IAAI,cAAc;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,MAAI,IAAI,SAAS,eAAe,IAAI,SAAS,WAAW,MAAM,QAAQ,IAAI,SAAS,OAAO,GAAG;AAC3F,SAAK,UAAU,IAAI,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,cAAc;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,UAAU;AAAA,EACjB,OAAO;AAEL,SAAK,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,EACzC;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAA4C;AAC9D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,IAC1C,KAAK,SAAS;AAEZ,UAAI,KAAK,OAAO,WAAW,OAAO,KAAK,KAAK,OAAO,WAAW,GAAG,GAAG;AAElE,cAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC;AAC/C,cAAM,YAAY,QAAQ,MAAM,aAAa,IAAI,CAAC,KAAK;AACvD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,MAAM,QAAQ,KAAK;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,OAAO,KAAK,KAAK,OAAO;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,IAAI;AAAA,IACxD,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,WAAW,KAAK,MAAM,IAAI;AAAA,EAC3D;AACF;AAMA,IAAM,qBAAqB;AAKpB,SAAS,cACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,uBAAkD,CAAC;AAEzD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,kBAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,2BAAqB,KAAK,cAAc,GAAG,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,YAAY,MAAM,OAAO,SAAS,mBAAmB;AAAA,IACrD,GAAG,aAAa,KAAK;AAAA,EACvB;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAK,SAAS,YAAY,KAAK,MAAM;AAAA,EACvC;AAGA,QAAM,QAAQ,YAAY,KAAK;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,eAAe,mBAAmB,KAAK;AAC7C,MAAI,cAAc;AAChB,SAAK,gBAAgB;AAAA,EACvB;AAEA,SAAO;AACT;AAOA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,aAAa,OAAyC;AAC7D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,kBAAkB,OAAW,QAAO,iBAAiB,KAAK;AAGnE,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,WAAW,MAAM,cAAc;AACxC,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,YAAgD;AACpE,QAAM,QAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,YAMZ;AACF,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,SAAkC;AAAA,MACtC,MAAM,kBAAkB,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,cAAc,EAAE,WAAW,SAAS,EAAG,QAAO,OAAO,EAAE;AAC7D,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,EAAE,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACtC;AAEA,QAAM,SAAkC,EAAE,MAAM,UAAU,YAAY,MAAM;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,SAAO;AACT;AAGA,SAAS,qBAAqB,MAMF;AAC1B,QAAM,SAAkC;AAAA,IACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACpD;AAEA,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,OAAO,KAAK;AAEtE,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,QAAQ,KAAK,QAChB,qBAAqB,KAAK,KAAoB,IAC9C,EAAE,MAAM,SAAS;AAAA,EACvB;AAEA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAY;AACnB,YAAM,SAAkC,CAAC;AACzC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,KAAK,YAAsD;AACzE,YAAI,CAAC,EAAE,KAAM;AACb,eAAO,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACvC,YAAI,KAAK,EAAE,IAAI;AAAA,MACjB;AACA,aAAO,aAAa;AACpB,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,CAAC;AACrB,aAAO,WAAW,CAAC;AAAA,IACrB;AACA,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAQO,SAAS,YAAY,OAA2C;AACrE,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAE3B,UAAM,OAAgC,EAAE,MAAM,EAAE,KAAK;AACrD,QAAI,EAAE,YAAa,MAAK,cAAc,EAAE;AAExC,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,WAAK,eAAe,aAAa,MAAM;AAAA,IACzC,OAAO;AACL,WAAK,eAAe,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IACvD;AAEA,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAOO,SAAS,mBAAmB,OAAgD;AACjF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI;AAAA,MACtB;AAAA,IACF;AACA,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AD9SO,IAAM,oBAAN,MAA4C;AAAA,EACjD,MAAM,QAAQ,OAAgB,UAAuC;AACnE,eAAO,wBAAU,qBAAqB,OAAO,SAAS;AACpD,WAAK,aAAa,qDAAqD;AACvE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAM,SAAS,KAAK,cAAc,KAAK;AACvC,YAAM,aAAa;AAGnB,gBAAM,wBAAU,YAAY,OAAO,aAAa;AAC9C,iBAAS,aAAa,GAAG,UAAU,OAAO;AAC1C,cAAM,OAAO,MAAM,OAAO;AAC1B,YAAI,gBAAgB,iCAAqB;AACvC,mBAAS,UAAU,EAAE,QAAQ,aAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QAC7D,OAAO;AACL,mBAAS,cAAU,4BAAc,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,QACpE;AACA,iBAAS,UAAU,UAAU;AAAA,MAC/B,CAAC;AAED,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AACrF,WAAK,UAAU,MAAM;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,eACZ,QACA,YACA,OACA,UACA,SACkB;AAClB,YAAQ,SAAS;AAAA,MACf,KAAK,QAAQ;AACX,cAAM,OAAO,cAAc,OAAO,QAAQ;AAC1C,cAAM,cAAc,CAAC,CAAC,KAAK;AAE3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,kBAAkB;AACrD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAEhD,cAAI,aAAa;AACf,kBAAM,SAAS,OAAO,SAAS;AAAA,cAC7B;AAAA,YACF;AACA,mBAAO,IAAI;AAAA,cACT,GAAG,UAAU;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,SAAS,MAAM,OAAO,SAAS;AAAA,YACnC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AACE,cAAM,IAAI;AAAA,UACR,wBAAwB,OAAO;AAAA,QAEjC;AAAA,IACJ;AAAA,EACF;AAAA,EAEU,cAAc,OAA2B;AACjD,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,iCAAqB;AACvC,iBAAO,4BAAc,KAAK,IAAI;AAAA,IAChC;AAEA,UAAM,SAAS,KAAK,aAAa,KAAK;AAItC,UAAM,eAAe,QAAQ,mBAAmB,EAAE;AAClD,WAAO,IAAI,aAAa,MAAM;AAAA,EAChC;AAAA,EAEU,aAAa,OAAyC;AAC9D,UAAM,SAAkC,CAAC;AACzC,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,8BAAkB;AACpC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,SAAU,QAAO,UAAU,KAAK;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AACF;;;AErGA,IAAAC,eAA0B;AAEnB,IAAM,qBAAN,MAA8C;AAAA,EACnD,MAAM,QAAQ,OAAgB,UAAqC;AACjE,eAAO,wBAAU,sBAAsB,OAAO,SAAS;AACrD,WAAK,aAAa,uDAAuD;AACzE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjC,YAAM,SAAS,gBAAgB,OAAO,QAAQ;AAE9C,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,OAAgB,UAA4B;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAG9D,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,QAAM,IAAI;AAGV,MAAI,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,SAAS,aAAa;AACtD,WAAO,gBAAgB,OAAO,CAAC;AAAA,EACjC;AAEA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAiD;AACxE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB;AAE5B;AAaA,gBAAgB,gBACd,UACmC;AACnC,QAAM,cAGF,oBAAI,IAAI;AAEZ,mBAAiB,SAAS,UAAU;AAClC,UAAM,IAAI;AACV,UAAM,YAAY,EAAE;AAEpB,QAAI,cAAc,uBAAuB;AACvC,YAAM,QAAQ,EAAE;AAChB,UAAI,CAAC,MAAO;AAEZ,UAAI,MAAM,SAAS,cAAc;AAC/B,cAAM,MAAM;AAAA,MACd,WAAW,MAAM,SAAS,oBAAoB;AAE5C,cAAM,MAAM,EAAE;AACd,cAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,YAAI,KAAK;AACP,cAAI,aAAc,MAAM,gBAAgB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,WAAW,cAAc,uBAAuB;AAC9C,YAAM,QAAQ,EAAE;AAChB,UAAI,OAAO,SAAS,YAAY;AAC9B,cAAM,MAAM,EAAE;AACd,oBAAY,IAAI,KAAK;AAAA,UACnB,IAAK,MAAM,MAAM;AAAA,UACjB,MAAO,MAAM,QAAQ;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,UAAM,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAAA,EAC5D;AACF;AAqBA,SAAS,gBACP,OACA,UACS;AACT,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAG7C,QAAM,YAAwB,CAAC;AAC/B,QAAM,YAAsB,CAAC;AAE7B,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,YAAY;AAC7B,gBAAU,KAAK;AAAA,QACb,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,WACE,OAAO,MAAM,UAAU,WAClB,MAAM,QACP,KAAK,UAAU,MAAM,KAAK;AAAA,MAClC,CAAC;AAAA,IACH,WAAW,MAAM,SAAS,QAAQ;AAChC,gBAAU,KAAK,MAAM,IAAc;AAAA,IACrC;AAAA,EACF;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,UAAU,KAAK,EAAE;AAC9B,MAAI,CAAC,KAAM,QAAO;AAGlB,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AH/KA,IAAAC,eAAoD;IAIpD,+BAAiB,aAAa,IAAI,kBAAkB,CAAC;AAAA,IACrD,gCAAkB,aAAa,IAAI,mBAAmB,CAAC;","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
|
-
|
|
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.
|
|
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 =
|
|
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
|
|
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":["/**\r\n * Anthropic executor — sends messages to Anthropic Messages API.\r\n *\r\n * Dispatches on `agent.model.apiType`: only `chat` is supported\r\n * (Anthropic has no embedding or image APIs).\r\n * The agent loop (tool-call iteration) is handled by the pipeline,\r\n * not the executor.\r\n *\r\n * @module\r\n */\r\n\r\nimport type Anthropic from \"@anthropic-ai/sdk\";\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\r\nimport type { Executor } from \"@prompty/core\";\r\nimport type { Message } from \"@prompty/core\";\r\nimport { getConnection } from \"@prompty/core\";\r\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\r\nimport { buildChatArgs } from \"./wire.js\";\r\n\r\nexport class AnthropicExecutor implements Executor {\r\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\r\n return traceSpan(\"AnthropicExecutor\", async (emit) => {\r\n emit(\"signature\", \"prompty.anthropic.executor.AnthropicExecutor.invoke\");\r\n emit(\"inputs\", { data: messages });\r\n\r\n const client = this.resolveClient(agent);\r\n const clientName = \"Anthropic\";\r\n\r\n // Trace client construction\r\n await traceSpan(clientName, async (ctorEmit) => {\r\n ctorEmit(\"signature\", `${clientName}.ctor`);\r\n const conn = agent.model?.connection;\r\n if (conn instanceof ReferenceConnection) {\r\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\r\n } else {\r\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\r\n }\r\n ctorEmit(\"result\", clientName);\r\n });\r\n\r\n const apiType = agent.model?.apiType ?? \"chat\";\r\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\r\n emit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n\r\n /** Dispatch to the appropriate API and trace the call. */\r\n private async executeApiCall(\r\n client: Anthropic,\r\n clientName: string,\r\n agent: Prompty,\r\n messages: Message[],\r\n apiType: string,\r\n ): Promise<unknown> {\r\n switch (apiType) {\r\n case \"chat\": {\r\n const args = buildChatArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.messages.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n\r\n if (isStreaming) {\r\n const stream = client.messages.stream(\r\n args as unknown as Parameters<typeof client.messages.stream>[0],\r\n );\r\n return new PromptyStream(\r\n `${clientName}Executor`,\r\n stream as unknown as AsyncIterable<unknown>,\r\n );\r\n }\r\n\r\n const result = await client.messages.create(\r\n args as unknown as Parameters<typeof client.messages.create>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n default:\r\n throw new Error(\r\n `Unsupported apiType \"${apiType}\" for Anthropic. ` +\r\n `Anthropic only supports \"chat\" (Messages API).`,\r\n );\r\n }\r\n }\r\n\r\n protected resolveClient(agent: Prompty): Anthropic {\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ReferenceConnection) {\r\n return getConnection(conn.name) as Anthropic;\r\n }\r\n\r\n const kwargs = this.clientKwargs(agent);\r\n\r\n // Lazy import — only needed when actually called\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const AnthropicSDK = require(\"@anthropic-ai/sdk\").default;\r\n return new AnthropicSDK(kwargs);\r\n }\r\n\r\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\r\n const kwargs: Record<string, unknown> = {};\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ApiKeyConnection) {\r\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\r\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\r\n }\r\n\r\n return kwargs;\r\n }\r\n}\r\n","/**\r\n * Wire format conversion: Message → Anthropic Messages API JSON.\r\n *\r\n * Key differences from OpenAI:\r\n * - `system` is a separate top-level parameter (not in messages)\r\n * - Tools use `input_schema` (not nested `{type: \"function\", function: {...}}`)\r\n * - `max_tokens` is required\r\n * - Structured output uses `output_config.format` with `json_schema`\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { ContentPart, Message } from \"@prompty/core\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Message conversion\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Convert an abstract Message to Anthropic wire format.\r\n * System messages are excluded — they go in a separate `system` parameter.\r\n */\r\nexport function messageToWire(msg: Message): Record<string, unknown> {\r\n const wire: Record<string, unknown> = { role: msg.role };\r\n\r\n // Batched tool results → single user message with all tool_result blocks\r\n if (msg.metadata.tool_results && Array.isArray(msg.metadata.tool_results)) {\r\n wire.role = \"user\";\r\n wire.content = msg.metadata.tool_results;\r\n return wire;\r\n }\r\n\r\n // Legacy single tool result messages (backward compat)\r\n if (msg.metadata.tool_use_id || msg.metadata.tool_call_id) {\r\n const toolUseId = (msg.metadata.tool_use_id ?? msg.metadata.tool_call_id) as string;\r\n wire.role = \"user\";\r\n wire.content = [\r\n {\r\n type: \"tool_result\",\r\n tool_use_id: toolUseId,\r\n content: msg.toTextContent(),\r\n },\r\n ];\r\n return wire;\r\n }\r\n\r\n // Assistant messages with raw content blocks (tool_use) — preserve them\r\n if (msg.role === \"assistant\" && msg.metadata.content && Array.isArray(msg.metadata.content)) {\r\n wire.content = msg.metadata.content;\r\n return wire;\r\n }\r\n\r\n const content = msg.toTextContent();\r\n if (typeof content === \"string\") {\r\n wire.content = content;\r\n } else {\r\n // Multimodal — convert parts to Anthropic format\r\n wire.content = msg.parts.map(partToWire);\r\n }\r\n\r\n return wire;\r\n}\r\n\r\n/**\r\n * Convert a ContentPart to Anthropic wire format.\r\n */\r\nfunction partToWire(part: ContentPart): Record<string, unknown> {\r\n switch (part.kind) {\r\n case \"text\":\r\n return { type: \"text\", text: part.value };\r\n case \"image\": {\r\n // Anthropic uses base64 source blocks or URL\r\n if (part.source.startsWith(\"data:\") || part.source.startsWith(\"/\")) {\r\n // Base64 encoded\r\n const [header, data] = part.source.split(\",\", 2);\r\n const mediaType = header?.match(/data:(.*?);/)?.[1] ?? \"image/png\";\r\n return {\r\n type: \"image\",\r\n source: {\r\n type: \"base64\",\r\n media_type: mediaType,\r\n data: data ?? part.source,\r\n },\r\n };\r\n }\r\n // URL\r\n return {\r\n type: \"image\",\r\n source: { type: \"url\", url: part.source },\r\n };\r\n }\r\n case \"file\":\r\n return { type: \"text\", text: `[file: ${part.source}]` };\r\n case \"audio\":\r\n return { type: \"text\", text: `[audio: ${part.source}]` };\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Build API arguments\r\n// ---------------------------------------------------------------------------\r\n\r\nconst DEFAULT_MAX_TOKENS = 1024;\r\n\r\n/**\r\n * Build Anthropic Messages API arguments from agent config and messages.\r\n */\r\nexport function buildChatArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"claude-sonnet-4-5-20250929\";\r\n\r\n // Separate system messages from conversation messages\r\n const systemParts: string[] = [];\r\n const conversationMessages: Record<string, unknown>[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"system\") {\r\n systemParts.push(msg.text);\r\n } else {\r\n conversationMessages.push(messageToWire(msg));\r\n }\r\n }\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n messages: conversationMessages,\r\n max_tokens: agent.model?.options?.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\r\n ...buildOptions(agent),\r\n };\r\n\r\n // System prompt as separate parameter\r\n if (systemParts.length > 0) {\r\n args.system = systemParts.join(\"\\n\\n\");\r\n }\r\n\r\n // Tools\r\n const tools = toolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output\r\n const outputConfig = outputSchemaToWire(agent);\r\n if (outputConfig) {\r\n args.output_config = outputConfig;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Map AgentSchema kind strings to JSON Schema type strings. */\r\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\r\n string: \"string\",\r\n integer: \"integer\",\r\n float: \"number\",\r\n number: \"number\",\r\n boolean: \"boolean\",\r\n array: \"array\",\r\n object: \"object\",\r\n};\r\n\r\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n if (opts.topK !== undefined) result.top_k = opts.topK;\r\n if (opts.stopSequences !== undefined) result.stop_sequences = opts.stopSequences;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result) && k !== \"max_tokens\") {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\r\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const p of properties as Array<{\r\n name?: string;\r\n kind?: string;\r\n description?: string;\r\n required?: boolean;\r\n enumValues?: unknown[];\r\n }>) {\r\n if (!p.name) continue;\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\r\n };\r\n if (p.description) schema.description = p.description;\r\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\r\n props[p.name] = schema;\r\n if (p.required) required.push(p.name);\r\n }\r\n\r\n const result: Record<string, unknown> = { type: \"object\", properties: props };\r\n if (required.length > 0) result.required = required;\r\n return result;\r\n}\r\n\r\n/** Convert a single Property to a JSON Schema definition. */\r\nfunction propertyToJsonSchema(prop: {\r\n kind?: string;\r\n description?: string;\r\n enumValues?: unknown[];\r\n items?: unknown;\r\n properties?: unknown[];\r\n}): Record<string, unknown> {\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\r\n };\r\n\r\n if (prop.description) schema.description = prop.description;\r\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\r\n\r\n if (prop.kind === \"array\") {\r\n schema.items = prop.items\r\n ? propertyToJsonSchema(prop.items as typeof prop)\r\n : { type: \"string\" };\r\n }\r\n\r\n if (prop.kind === \"object\") {\r\n if (prop.properties) {\r\n const nested: Record<string, unknown> = {};\r\n const req: string[] = [];\r\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\r\n if (!p.name) continue;\r\n nested[p.name] = propertyToJsonSchema(p);\r\n req.push(p.name);\r\n }\r\n schema.properties = nested;\r\n schema.required = req;\r\n } else {\r\n schema.properties = {};\r\n schema.required = [];\r\n }\r\n schema.additionalProperties = false;\r\n }\r\n\r\n return schema;\r\n}\r\n\r\n/**\r\n * Convert agent tools to Anthropic tool format.\r\n *\r\n * Anthropic uses: { name, description, input_schema }\r\n * (no `{type: \"function\", function: {...}}` wrapper like OpenAI)\r\n */\r\nexport function toolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n const tool: Record<string, unknown> = { name: t.name };\r\n if (t.description) tool.description = t.description;\r\n\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n tool.input_schema = schemaToWire(params);\r\n } else {\r\n tool.input_schema = { type: \"object\", properties: {} };\r\n }\r\n\r\n result.push(tool);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert outputSchema to Anthropic structured output config.\r\n *\r\n * Anthropic uses: output_config: { format: { type: \"json_schema\", schema: {...} } }\r\n */\r\nexport function outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(\r\n prop as Parameters<typeof propertyToJsonSchema>[0],\r\n );\r\n required.push(prop.name);\r\n }\r\n\r\n return {\r\n format: {\r\n type: \"json_schema\",\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n","/**\r\n * Anthropic processor — extracts clean results from Anthropic Messages API responses.\r\n *\r\n * Handles:\r\n * - Text content from `content[]` blocks\r\n * - Tool use blocks → ToolCall objects\r\n * - Streaming responses (content_block_delta events)\r\n * - Structured output (JSON parse when outputSchema present)\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { Processor } from \"@prompty/core\";\r\nimport type { ToolCall } from \"@prompty/core\";\r\nimport { traceSpan } from \"@prompty/core\";\r\n\r\nexport class AnthropicProcessor implements Processor {\r\n async process(agent: Prompty, response: unknown): Promise<unknown> {\r\n return traceSpan(\"AnthropicProcessor\", async (emit) => {\r\n emit(\"signature\", \"prompty.anthropic.processor.AnthropicProcessor.invoke\");\r\n emit(\"inputs\", { data: response });\r\n const result = processResponse(agent, response);\r\n // Don't emit result for streaming — it's a generator, not a value\r\n if (!isAsyncIterable(response)) {\r\n emit(\"result\", result);\r\n }\r\n return result;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Extract clean content from an Anthropic Messages API response.\r\n */\r\nexport function processResponse(agent: Prompty, response: unknown): unknown {\r\n if (typeof response !== \"object\" || response === null) return response;\r\n\r\n // Streaming response — return content-extracting async generator\r\n if (isAsyncIterable(response)) {\r\n return streamGenerator(response);\r\n }\r\n\r\n const r = response as Record<string, unknown>;\r\n\r\n // Anthropic Messages response — has `content` array and `role`\r\n if (Array.isArray(r.content) && r.role === \"assistant\") {\r\n return processMessages(agent, r);\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\r\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\n/**\r\n * Yield content chunks from an Anthropic streaming response.\r\n *\r\n * Anthropic streaming events include:\r\n * - `content_block_delta` with `delta.type === \"text_delta\"` → yield text\r\n * - `content_block_start` with `content_block.type === \"tool_use\"` → accumulate tool call\r\n * - `input_json` deltas for tool arguments\r\n * - `message_stop` → end of stream\r\n *\r\n * Tool calls are accumulated and yielded at the end of the stream.\r\n */\r\nasync function* streamGenerator(\r\n response: AsyncIterable<unknown>,\r\n): AsyncGenerator<string | ToolCall> {\r\n const toolCallAcc: Map<\r\n number,\r\n { id: string; name: string; arguments: string }\r\n > = new Map();\r\n\r\n for await (const event of response) {\r\n const e = event as Record<string, unknown>;\r\n const eventType = e.type as string | undefined;\r\n\r\n if (eventType === \"content_block_delta\") {\r\n const delta = e.delta as Record<string, unknown> | undefined;\r\n if (!delta) continue;\r\n\r\n if (delta.type === \"text_delta\") {\r\n yield delta.text as string;\r\n } else if (delta.type === \"input_json_delta\") {\r\n // Accumulate partial JSON for tool arguments\r\n const idx = e.index as number;\r\n const acc = toolCallAcc.get(idx);\r\n if (acc) {\r\n acc.arguments += (delta.partial_json ?? \"\") as string;\r\n }\r\n }\r\n } else if (eventType === \"content_block_start\") {\r\n const block = e.content_block as Record<string, unknown> | undefined;\r\n if (block?.type === \"tool_use\") {\r\n const idx = e.index as number;\r\n toolCallAcc.set(idx, {\r\n id: (block.id ?? \"\") as string,\r\n name: (block.name ?? \"\") as string,\r\n arguments: \"\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Yield accumulated tool calls at the end of the stream\r\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\r\n for (const idx of sortedIndices) {\r\n const tc = toolCallAcc.get(idx)!;\r\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Non-streaming response processing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Process an Anthropic Messages API response.\r\n *\r\n * Response shape:\r\n * ```json\r\n * {\r\n * \"role\": \"assistant\",\r\n * \"content\": [\r\n * { \"type\": \"text\", \"text\": \"...\" },\r\n * { \"type\": \"tool_use\", \"id\": \"...\", \"name\": \"...\", \"input\": {...} }\r\n * ],\r\n * \"stop_reason\": \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\"\r\n * }\r\n * ```\r\n */\r\nfunction processMessages(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const content = response.content as Record<string, unknown>[];\r\n if (!content || content.length === 0) return null;\r\n\r\n // Check for tool_use blocks\r\n const toolCalls: ToolCall[] = [];\r\n const textParts: string[] = [];\r\n\r\n for (const block of content) {\r\n if (block.type === \"tool_use\") {\r\n toolCalls.push({\r\n id: block.id as string,\r\n name: block.name as string,\r\n arguments:\r\n typeof block.input === \"string\"\r\n ? (block.input as string)\r\n : JSON.stringify(block.input),\r\n });\r\n } else if (block.type === \"text\") {\r\n textParts.push(block.text as string);\r\n }\r\n }\r\n\r\n // If tool calls present, return them (pipeline handles the loop)\r\n if (toolCalls.length > 0) {\r\n return toolCalls;\r\n }\r\n\r\n // Text content\r\n const text = textParts.join(\"\");\r\n if (!text) return null;\r\n\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n\r\n return text;\r\n}\r\n","/**\r\n * @prompty/anthropic — Anthropic provider for Prompty.\r\n *\r\n * Importing this package auto-registers the \"anthropic\" executor and processor.\r\n *\r\n * @module @prompty/anthropic\r\n */\r\n\r\nexport { AnthropicExecutor } from \"./executor.js\";\r\nexport { AnthropicProcessor, processResponse } from \"./processor.js\";\r\nexport { buildChatArgs, messageToWire, toolsToWire, outputSchemaToWire } from \"./wire.js\";\r\n\r\n// Auto-register on import\r\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\r\nimport { AnthropicExecutor } from \"./executor.js\";\r\nimport { AnthropicProcessor } from \"./processor.js\";\r\n\r\nregisterExecutor(\"anthropic\", new AnthropicExecutor());\r\nregisterProcessor(\"anthropic\", new AnthropicProcessor());\r\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,64 +1,65 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@prompty/anthropic",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
4
|
-
"description": "Anthropic provider for Prompty — executor and processor for Anthropic Messages API",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.cjs",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js",
|
|
13
|
-
"require": "./dist/index.cjs"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"files": [
|
|
17
|
-
"dist"
|
|
18
|
-
],
|
|
19
|
-
"scripts": {
|
|
20
|
-
"build": "tsup",
|
|
21
|
-
"dev": "tsup --watch",
|
|
22
|
-
"test": "vitest run --passWithNoTests",
|
|
23
|
-
"test:watch": "vitest",
|
|
24
|
-
"lint": "tsc --noEmit",
|
|
25
|
-
"clean": "rimraf dist"
|
|
26
|
-
},
|
|
27
|
-
"keywords": [
|
|
28
|
-
"prompty",
|
|
29
|
-
"anthropic",
|
|
30
|
-
"claude",
|
|
31
|
-
"llm",
|
|
32
|
-
"ai"
|
|
33
|
-
],
|
|
34
|
-
"author": "Microsoft",
|
|
35
|
-
"license": "MIT",
|
|
36
|
-
"publishConfig": {
|
|
37
|
-
"access": "public"
|
|
38
|
-
},
|
|
39
|
-
"repository": {
|
|
40
|
-
"type": "git",
|
|
41
|
-
"url": "git+https://github.com/microsoft/prompty.git",
|
|
42
|
-
"directory": "runtime/typescript/packages/anthropic"
|
|
43
|
-
},
|
|
44
|
-
"engines": {
|
|
45
|
-
"node": ">=18.0.0"
|
|
46
|
-
},
|
|
47
|
-
"peerDependencies": {
|
|
48
|
-
"@prompty/core": "^2.0.0-alpha.
|
|
49
|
-
"@anthropic-ai/sdk": ">=0.39.0"
|
|
50
|
-
},
|
|
51
|
-
"peerDependenciesMeta": {
|
|
52
|
-
"@anthropic-ai/sdk": {
|
|
53
|
-
"optional": false
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@prompty/core": "file:../core",
|
|
58
|
-
"@anthropic-ai/sdk": "^0.39.0",
|
|
59
|
-
"@types/node": "^20.11.0",
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@prompty/anthropic",
|
|
3
|
+
"version": "2.0.0-alpha.4",
|
|
4
|
+
"description": "Anthropic provider for Prompty — executor and processor for Anthropic Messages API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"dev": "tsup --watch",
|
|
22
|
+
"test": "vitest run --passWithNoTests",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"lint": "tsc --noEmit",
|
|
25
|
+
"clean": "rimraf dist"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"prompty",
|
|
29
|
+
"anthropic",
|
|
30
|
+
"claude",
|
|
31
|
+
"llm",
|
|
32
|
+
"ai"
|
|
33
|
+
],
|
|
34
|
+
"author": "Microsoft",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/microsoft/prompty.git",
|
|
42
|
+
"directory": "runtime/typescript/packages/anthropic"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@prompty/core": "^2.0.0-alpha.4",
|
|
49
|
+
"@anthropic-ai/sdk": ">=0.39.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependenciesMeta": {
|
|
52
|
+
"@anthropic-ai/sdk": {
|
|
53
|
+
"optional": false
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@prompty/core": "file:../core",
|
|
58
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
59
|
+
"@types/node": "^20.11.0",
|
|
60
|
+
"dotenv": "^16.4.0",
|
|
61
|
+
"tsup": "^8.4.0",
|
|
62
|
+
"typescript": "^5.7.0",
|
|
63
|
+
"vitest": "^3.0.0"
|
|
64
|
+
}
|
|
65
|
+
}
|