@ziro-agent/anthropic 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -251,29 +251,102 @@ function splitSystem(messages) {
251
251
  const text = sys.flatMap((m) => m.content).filter((p) => p.type === "text").map((p) => p.text).join("\n");
252
252
  return { system: text, messages: rest };
253
253
  }
254
+ function utf8FromInlineBase64(b64) {
255
+ if (typeof Buffer !== "undefined") return Buffer.from(b64, "base64").toString("utf8");
256
+ const bin = atob(b64);
257
+ const bytes = new Uint8Array(bin.length);
258
+ for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
259
+ return new TextDecoder("utf-8").decode(bytes);
260
+ }
261
+ function mapAnthropicUserBlock(p) {
262
+ if (p.type === "text") return { type: "text", text: p.text };
263
+ if (p.type === "image") {
264
+ if (typeof p.image === "string") {
265
+ if (p.image.startsWith("data:")) {
266
+ const resolved = core.resolveMediaInput(p.image);
267
+ if ("url" in resolved) {
268
+ throw new core.UnsupportedPartError({
269
+ partType: "image",
270
+ provider: "anthropic",
271
+ message: "Unexpected URL resolution for a data: image URL."
272
+ });
273
+ }
274
+ return {
275
+ type: "image",
276
+ source: {
277
+ type: "base64",
278
+ media_type: p.mimeType ?? resolved.mimeType ?? "image/png",
279
+ data: resolved.base64
280
+ }
281
+ };
282
+ }
283
+ return { type: "image", source: { type: "url", url: p.image } };
284
+ }
285
+ return {
286
+ type: "image",
287
+ source: {
288
+ type: "base64",
289
+ media_type: p.mimeType ?? "image/png",
290
+ data: uint8ToBase64(p.image)
291
+ }
292
+ };
293
+ }
294
+ if (p.type === "audio") {
295
+ throw new core.UnsupportedPartError({
296
+ partType: "audio",
297
+ provider: "anthropic",
298
+ message: "Claude Messages API does not yet ship a first-class audio input block. Transcribe to text, or use OpenAI / Gemini for native audio."
299
+ });
300
+ }
301
+ if (p.type === "file") {
302
+ const r = core.resolveMediaInput(p.file);
303
+ const mime = (p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "").toLowerCase();
304
+ if ("url" in r) {
305
+ if (mime.includes("pdf") || r.url.toLowerCase().split("?")[0]?.endsWith(".pdf")) {
306
+ return { type: "document", source: { type: "url", url: r.url } };
307
+ }
308
+ throw new core.UnsupportedPartError({
309
+ partType: "file",
310
+ provider: "anthropic",
311
+ message: "Anthropic URL document sources are limited to PDF (`application/pdf` or `.pdf` URL)."
312
+ });
313
+ }
314
+ const effMime = mime || r.mimeType?.toLowerCase() || "";
315
+ if (effMime.includes("pdf")) {
316
+ return {
317
+ type: "document",
318
+ source: { type: "base64", media_type: "application/pdf", data: r.base64 }
319
+ };
320
+ }
321
+ if (effMime.includes("plain")) {
322
+ return {
323
+ type: "document",
324
+ source: { type: "text", media_type: "text/plain", data: utf8FromInlineBase64(r.base64) }
325
+ };
326
+ }
327
+ throw new core.UnsupportedPartError({
328
+ partType: "file",
329
+ provider: "anthropic",
330
+ message: `Anthropic supports PDF (base64 or URL) or plain text (base64) document blocks; got "${p.mimeType ?? r.mimeType ?? "unknown"}".`
331
+ });
332
+ }
333
+ if (p.type === "video") {
334
+ throw new core.UnsupportedPartError({
335
+ partType: "video",
336
+ provider: "anthropic",
337
+ message: "Video `UserMessage` parts are reserved (RFC 0014) \u2014 the Claude Messages adapter does not map them yet."
338
+ });
339
+ }
340
+ throw new core.UnsupportedPartError({
341
+ partType: p.type ?? "unknown",
342
+ provider: "anthropic",
343
+ message: "Unexpected content part in user message."
344
+ });
345
+ }
254
346
  function toAnthropicMessage(m) {
255
347
  switch (m.role) {
256
348
  case "user": {
257
- const blocks = m.content.map((p) => {
258
- if (p.type === "text") return { type: "text", text: p.text };
259
- if (p.type === "image") {
260
- if (typeof p.image === "string" && p.image.startsWith("http")) {
261
- return { type: "image", source: { type: "url", url: p.image } };
262
- }
263
- if (typeof p.image === "string") {
264
- return { type: "image", source: { type: "url", url: p.image } };
265
- }
266
- return {
267
- type: "image",
268
- source: {
269
- type: "base64",
270
- media_type: p.mimeType ?? "image/png",
271
- data: uint8ToBase64(p.image)
272
- }
273
- };
274
- }
275
- return p;
276
- });
349
+ const blocks = m.content.map((p) => mapAnthropicUserBlock(p));
277
350
  return { role: "user", content: blocks };
278
351
  }
279
352
  case "assistant": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/sse.ts","../src/anthropic-messages-model.ts","../src/anthropic-provider.ts"],"names":["APICallError","estimateTokensFromMessages","pricing","getPricing"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Anthropic streams SSE with explicit `event:` lines (e.g. `content_block_delta`).\n * We surface both the event name and the data payload — the model logic decides\n * how to interpret them.\n */\nexport interface SSEEvent {\n event?: string;\n data: string;\n}\n\nexport async function* parseSSEWithEvent(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<SSEEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n const lines = block.split(/\\r?\\n/);\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0 && !event) return null;\n return { ...(event !== undefined ? { event } : {}), data: data.join('\\n') };\n}\n","import {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n type TokenUsage,\n type ToolCallPart,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n // Current flagships (verified against anthropic.com/pricing 2026-04-20).\n | 'claude-opus-4-7'\n | 'claude-sonnet-4-6'\n | 'claude-haiku-4-5'\n // Legacy still served on the API.\n | 'claude-opus-4-6'\n | 'claude-opus-4-5'\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface AnthropicMessagesModelConfig {\n modelId: AnthropicMessagesModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class AnthropicMessagesModel implements LanguageModel {\n readonly provider = 'anthropic';\n readonly modelId: string;\n private readonly config: AnthropicMessagesModelConfig;\n\n constructor(config: AnthropicMessagesModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options, false);\n const res = await this.fetch('/messages', body, options);\n const json = (await res.json()) as AnthropicMessageResponse;\n\n const text = (json.content ?? [])\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n\n const toolCalls: ToolCallPart[] = (json.content ?? [])\n .filter((b) => b.type === 'tool_use')\n .map((b) => {\n const tu = b as { id: string; name: string; input: unknown };\n return { type: 'tool-call', toolCallId: tu.id, toolName: tu.name, args: tu.input };\n });\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(json.stop_reason),\n usage: mapUsage(json.usage),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options, true);\n const res = await this.fetch('/messages', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'Anthropic streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const events = parseSSEWithEvent(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolBlocks = new Map<number, { id: string; name: string; argsBuffer: string }>();\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n\n try {\n for await (const evt of events) {\n const data = parseEvent(evt);\n if (!data) continue;\n\n switch (data.type) {\n case 'message_start': {\n const msg = data.message as { usage?: AnthropicUsage } | undefined;\n if (msg?.usage) usage = mergeUsage(usage, mapUsage(msg.usage));\n break;\n }\n case 'content_block_start': {\n const block = data.content_block as\n | { type: string; id?: string; name?: string }\n | undefined;\n if (block?.type === 'tool_use' && typeof data.index === 'number') {\n toolBlocks.set(data.index, {\n id: block.id ?? `tu_${data.index}`,\n name: block.name ?? '',\n argsBuffer: '',\n });\n }\n break;\n }\n case 'content_block_delta': {\n const delta = data.delta as\n | { type: string; text?: string; partial_json?: string }\n | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.text });\n } else if (\n delta?.type === 'input_json_delta' &&\n typeof data.index === 'number' &&\n delta.partial_json\n ) {\n const tb = toolBlocks.get(data.index);\n if (tb) {\n tb.argsBuffer += delta.partial_json;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: tb.id,\n toolName: tb.name,\n argsDelta: delta.partial_json,\n });\n }\n }\n break;\n }\n case 'message_delta': {\n const delta = data.delta as { stop_reason?: string } | undefined;\n if (delta?.stop_reason) finish = mapFinishReason(delta.stop_reason);\n if (data.usage) usage = mergeUsage(usage, mapUsage(data.usage as AnthropicUsage));\n break;\n }\n case 'message_stop': {\n break;\n }\n }\n }\n\n for (const tb of toolBlocks.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tb.id,\n toolName: tb.name,\n args: safeParseJSON(tb.argsBuffer),\n });\n }\n\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults\n * to 4096 in `buildBody`), so we use the same default for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the model.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 4096;\n const minOut = Math.min(16, maxOut);\n const pricing = getPricing(this.provider, this.modelId);\n if (!pricing) {\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd: 0,\n maxUsd: 0,\n pricingAvailable: false,\n };\n }\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (minOut * pricing.outputPer1M) / 1_000_000,\n maxUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (maxOut * pricing.outputPer1M) / 1_000_000,\n pricingAvailable: true,\n };\n }\n\n private buildBody(options: ModelCallOptions, stream: boolean): Record<string, unknown> {\n const { system, messages } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: messages.map(toAnthropicMessage),\n max_tokens: options.maxTokens ?? 4096,\n };\n if (system) body.system = system;\n if (stream) body.stream = true;\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n input_schema: t.parameters,\n }));\n }\n if (options.toolChoice !== undefined) {\n if (options.toolChoice === 'required') body.tool_choice = { type: 'any' };\n else if (options.toolChoice === 'auto') body.tool_choice = { type: 'auto' };\n else if (options.toolChoice === 'none') {\n // Anthropic has no explicit \"none\" — skip.\n } else if (typeof options.toolChoice === 'object') {\n body.tool_choice = { type: 'tool', name: options.toolChoice.toolName };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.topK !== undefined) body.top_k = options.topK;\n if (options.stopSequences !== undefined) body.stop_sequences = options.stopSequences;\n if (options.providerOptions) Object.assign(body, options.providerOptions);\n return body;\n }\n\n private async fetch(path: string, body: unknown, options: ModelCallOptions): Promise<Response> {\n const url = `${this.config.baseURL}${path}`;\n const headers = { ...this.config.headers, ...options.headers };\n const init: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n };\n if (options.abortSignal) init.signal = options.abortSignal;\n\n const res = await this.config.fetcher(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new APICallError({\n message: `Anthropic API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` to the public `ChatMessage[]` shape\n * `estimateTokensFromMessages` accepts. Estimator only inspects role/content,\n * so a structural cast is safe.\n */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n system?: string;\n messages: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const rest = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { messages: rest };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { system: text, messages: rest };\n}\n\nfunction toAnthropicMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string' && p.image.startsWith('http')) {\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n if (typeof p.image === 'string') {\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n return p;\n });\n return { role: 'user', content: blocks };\n }\n case 'assistant': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'tool-call') {\n return { type: 'tool_use', id: p.toolCallId, name: p.toolName, input: p.args };\n }\n return p;\n });\n return { role: 'assistant', content: blocks };\n }\n case 'tool': {\n return {\n role: 'user',\n content: m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n type: 'tool_result',\n tool_use_id: r.toolCallId,\n content: typeof r.result === 'string' ? r.result : JSON.stringify(r.result),\n ...(r.isError ? { is_error: true } : {}),\n })),\n };\n }\n case 'system':\n return { role: 'user', content: '' };\n }\n}\n\nfunction parseEvent(evt: SSEEvent): { type: string; [k: string]: unknown } | null {\n if (!evt.data) return null;\n try {\n return JSON.parse(evt.data) as { type: string };\n } catch {\n return null;\n }\n}\n\nfunction safeParseJSON(text: string): unknown {\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool-calls';\n case 'stop_sequence':\n return 'stop';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nfunction mapUsage(u: AnthropicUsage | undefined): TokenUsage {\n if (!u) return {};\n const promptTokens =\n (u.input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);\n const out: TokenUsage = {\n promptTokens: u.input_tokens !== undefined ? promptTokens : undefined,\n completionTokens: u.output_tokens,\n };\n if (out.promptTokens !== undefined && out.completionTokens !== undefined) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n if (u.cache_read_input_tokens !== undefined) out.cachedPromptTokens = u.cache_read_input_tokens;\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n const sum = (x?: number, y?: number) =>\n x === undefined && y === undefined ? undefined : (x ?? 0) + (y ?? 0);\n return {\n promptTokens: sum(a.promptTokens, b.promptTokens),\n completionTokens: sum(a.completionTokens, b.completionTokens),\n totalTokens: sum(a.totalTokens, b.totalTokens),\n cachedPromptTokens: sum(a.cachedPromptTokens, b.cachedPromptTokens),\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface AnthropicMessageResponse {\n content?: Array<\n { type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason?: string;\n usage?: AnthropicUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport {\n AnthropicMessagesModel,\n type AnthropicMessagesModelId,\n} from './anthropic-messages-model.js';\n\nexport interface AnthropicProviderOptions {\n /** Defaults to `process.env.ANTHROPIC_API_KEY`. */\n apiKey?: string;\n baseURL?: string;\n /** API version sent in `anthropic-version`. Defaults to `2023-06-01`. */\n version?: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface AnthropicProvider {\n (modelId: AnthropicMessagesModelId): LanguageModel;\n messages(modelId: AnthropicMessagesModelId): LanguageModel;\n}\n\nexport function createAnthropic(options: AnthropicProviderOptions = {}): AnthropicProvider {\n const apiKey = options.apiKey ?? loadEnv('ANTHROPIC_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.anthropic.com/v1';\n const version = options.version ?? '2023-06-01';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': version,\n ...options.headers,\n };\n if (apiKey) headers['x-api-key'] = apiKey;\n\n const make = (modelId: AnthropicMessagesModelId): LanguageModel =>\n new AnthropicMessagesModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: AnthropicMessagesModelId) => make(modelId)) as AnthropicProvider;\n provider.messages = make;\n return provider;\n}\n\nexport const anthropic: AnthropicProvider = createAnthropic();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"sources":["../src/util/sse.ts","../src/anthropic-messages-model.ts","../src/anthropic-provider.ts"],"names":["APICallError","estimateTokensFromMessages","pricing","getPricing","resolveMediaInput","UnsupportedPartError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Anthropic streams SSE with explicit `event:` lines (e.g. `content_block_delta`).\n * We surface both the event name and the data payload — the model logic decides\n * how to interpret them.\n */\nexport interface SSEEvent {\n event?: string;\n data: string;\n}\n\nexport async function* parseSSEWithEvent(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<SSEEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n const lines = block.split(/\\r?\\n/);\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0 && !event) return null;\n return { ...(event !== undefined ? { event } : {}), data: data.join('\\n') };\n}\n","import type { ContentPart } from '@ziro-agent/core';\nimport {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n resolveMediaInput,\n type TokenUsage,\n type ToolCallPart,\n UnsupportedPartError,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n // Current flagships (verified against anthropic.com/pricing 2026-04-20).\n | 'claude-opus-4-7'\n | 'claude-sonnet-4-6'\n | 'claude-haiku-4-5'\n // Legacy still served on the API.\n | 'claude-opus-4-6'\n | 'claude-opus-4-5'\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface AnthropicMessagesModelConfig {\n modelId: AnthropicMessagesModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class AnthropicMessagesModel implements LanguageModel {\n readonly provider = 'anthropic';\n readonly modelId: string;\n private readonly config: AnthropicMessagesModelConfig;\n\n constructor(config: AnthropicMessagesModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options, false);\n const res = await this.fetch('/messages', body, options);\n const json = (await res.json()) as AnthropicMessageResponse;\n\n const text = (json.content ?? [])\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n\n const toolCalls: ToolCallPart[] = (json.content ?? [])\n .filter((b) => b.type === 'tool_use')\n .map((b) => {\n const tu = b as { id: string; name: string; input: unknown };\n return { type: 'tool-call', toolCallId: tu.id, toolName: tu.name, args: tu.input };\n });\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(json.stop_reason),\n usage: mapUsage(json.usage),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options, true);\n const res = await this.fetch('/messages', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'Anthropic streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const events = parseSSEWithEvent(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolBlocks = new Map<number, { id: string; name: string; argsBuffer: string }>();\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n\n try {\n for await (const evt of events) {\n const data = parseEvent(evt);\n if (!data) continue;\n\n switch (data.type) {\n case 'message_start': {\n const msg = data.message as { usage?: AnthropicUsage } | undefined;\n if (msg?.usage) usage = mergeUsage(usage, mapUsage(msg.usage));\n break;\n }\n case 'content_block_start': {\n const block = data.content_block as\n | { type: string; id?: string; name?: string }\n | undefined;\n if (block?.type === 'tool_use' && typeof data.index === 'number') {\n toolBlocks.set(data.index, {\n id: block.id ?? `tu_${data.index}`,\n name: block.name ?? '',\n argsBuffer: '',\n });\n }\n break;\n }\n case 'content_block_delta': {\n const delta = data.delta as\n | { type: string; text?: string; partial_json?: string }\n | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.text });\n } else if (\n delta?.type === 'input_json_delta' &&\n typeof data.index === 'number' &&\n delta.partial_json\n ) {\n const tb = toolBlocks.get(data.index);\n if (tb) {\n tb.argsBuffer += delta.partial_json;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: tb.id,\n toolName: tb.name,\n argsDelta: delta.partial_json,\n });\n }\n }\n break;\n }\n case 'message_delta': {\n const delta = data.delta as { stop_reason?: string } | undefined;\n if (delta?.stop_reason) finish = mapFinishReason(delta.stop_reason);\n if (data.usage) usage = mergeUsage(usage, mapUsage(data.usage as AnthropicUsage));\n break;\n }\n case 'message_stop': {\n break;\n }\n }\n }\n\n for (const tb of toolBlocks.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tb.id,\n toolName: tb.name,\n args: safeParseJSON(tb.argsBuffer),\n });\n }\n\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults\n * to 4096 in `buildBody`), so we use the same default for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the model.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 4096;\n const minOut = Math.min(16, maxOut);\n const pricing = getPricing(this.provider, this.modelId);\n if (!pricing) {\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd: 0,\n maxUsd: 0,\n pricingAvailable: false,\n };\n }\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (minOut * pricing.outputPer1M) / 1_000_000,\n maxUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (maxOut * pricing.outputPer1M) / 1_000_000,\n pricingAvailable: true,\n };\n }\n\n private buildBody(options: ModelCallOptions, stream: boolean): Record<string, unknown> {\n const { system, messages } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: messages.map(toAnthropicMessage),\n max_tokens: options.maxTokens ?? 4096,\n };\n if (system) body.system = system;\n if (stream) body.stream = true;\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n input_schema: t.parameters,\n }));\n }\n if (options.toolChoice !== undefined) {\n if (options.toolChoice === 'required') body.tool_choice = { type: 'any' };\n else if (options.toolChoice === 'auto') body.tool_choice = { type: 'auto' };\n else if (options.toolChoice === 'none') {\n // Anthropic has no explicit \"none\" — skip.\n } else if (typeof options.toolChoice === 'object') {\n body.tool_choice = { type: 'tool', name: options.toolChoice.toolName };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.topK !== undefined) body.top_k = options.topK;\n if (options.stopSequences !== undefined) body.stop_sequences = options.stopSequences;\n if (options.providerOptions) Object.assign(body, options.providerOptions);\n return body;\n }\n\n private async fetch(path: string, body: unknown, options: ModelCallOptions): Promise<Response> {\n const url = `${this.config.baseURL}${path}`;\n const headers = { ...this.config.headers, ...options.headers };\n const init: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n };\n if (options.abortSignal) init.signal = options.abortSignal;\n\n const res = await this.config.fetcher(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new APICallError({\n message: `Anthropic API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` to the public `ChatMessage[]` shape\n * `estimateTokensFromMessages` accepts. Estimator only inspects role/content,\n * so a structural cast is safe.\n */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n system?: string;\n messages: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const rest = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { messages: rest };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { system: text, messages: rest };\n}\n\nfunction utf8FromInlineBase64(b64: string): string {\n if (typeof Buffer !== 'undefined') return Buffer.from(b64, 'base64').toString('utf8');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return new TextDecoder('utf-8').decode(bytes);\n}\n\nfunction mapAnthropicUserBlock(p: ContentPart): unknown {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n if (p.image.startsWith('data:')) {\n const resolved = resolveMediaInput(p.image);\n if ('url' in resolved) {\n throw new UnsupportedPartError({\n partType: 'image',\n provider: 'anthropic',\n message: 'Unexpected URL resolution for a data: image URL.',\n });\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? resolved.mimeType ?? 'image/png',\n data: resolved.base64,\n },\n };\n }\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n if (p.type === 'audio') {\n throw new UnsupportedPartError({\n partType: 'audio',\n provider: 'anthropic',\n message:\n 'Claude Messages API does not yet ship a first-class audio input block. Transcribe to text, or use OpenAI / Gemini for native audio.',\n });\n }\n if (p.type === 'file') {\n const r = resolveMediaInput(p.file);\n const mime = (p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? '').toLowerCase();\n if ('url' in r) {\n if (mime.includes('pdf') || r.url.toLowerCase().split('?')[0]?.endsWith('.pdf')) {\n return { type: 'document', source: { type: 'url', url: r.url } };\n }\n throw new UnsupportedPartError({\n partType: 'file',\n provider: 'anthropic',\n message:\n 'Anthropic URL document sources are limited to PDF (`application/pdf` or `.pdf` URL).',\n });\n }\n const effMime = mime || r.mimeType?.toLowerCase() || '';\n if (effMime.includes('pdf')) {\n return {\n type: 'document',\n source: { type: 'base64', media_type: 'application/pdf', data: r.base64 },\n };\n }\n if (effMime.includes('plain')) {\n return {\n type: 'document',\n source: { type: 'text', media_type: 'text/plain', data: utf8FromInlineBase64(r.base64) },\n };\n }\n throw new UnsupportedPartError({\n partType: 'file',\n provider: 'anthropic',\n message: `Anthropic supports PDF (base64 or URL) or plain text (base64) document blocks; got \"${p.mimeType ?? r.mimeType ?? 'unknown'}\".`,\n });\n }\n if (p.type === 'video') {\n throw new UnsupportedPartError({\n partType: 'video',\n provider: 'anthropic',\n message:\n 'Video `UserMessage` parts are reserved (RFC 0014) — the Claude Messages adapter does not map them yet.',\n });\n }\n throw new UnsupportedPartError({\n partType: (p as { type?: string }).type ?? 'unknown',\n provider: 'anthropic',\n message: 'Unexpected content part in user message.',\n });\n}\n\nfunction toAnthropicMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const blocks = m.content.map((p) => mapAnthropicUserBlock(p));\n return { role: 'user', content: blocks };\n }\n case 'assistant': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'tool-call') {\n return { type: 'tool_use', id: p.toolCallId, name: p.toolName, input: p.args };\n }\n return p;\n });\n return { role: 'assistant', content: blocks };\n }\n case 'tool': {\n return {\n role: 'user',\n content: m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n type: 'tool_result',\n tool_use_id: r.toolCallId,\n content: typeof r.result === 'string' ? r.result : JSON.stringify(r.result),\n ...(r.isError ? { is_error: true } : {}),\n })),\n };\n }\n case 'system':\n return { role: 'user', content: '' };\n }\n}\n\nfunction parseEvent(evt: SSEEvent): { type: string; [k: string]: unknown } | null {\n if (!evt.data) return null;\n try {\n return JSON.parse(evt.data) as { type: string };\n } catch {\n return null;\n }\n}\n\nfunction safeParseJSON(text: string): unknown {\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool-calls';\n case 'stop_sequence':\n return 'stop';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nfunction mapUsage(u: AnthropicUsage | undefined): TokenUsage {\n if (!u) return {};\n const promptTokens =\n (u.input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);\n const out: TokenUsage = {\n promptTokens: u.input_tokens !== undefined ? promptTokens : undefined,\n completionTokens: u.output_tokens,\n };\n if (out.promptTokens !== undefined && out.completionTokens !== undefined) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n if (u.cache_read_input_tokens !== undefined) out.cachedPromptTokens = u.cache_read_input_tokens;\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n const sum = (x?: number, y?: number) =>\n x === undefined && y === undefined ? undefined : (x ?? 0) + (y ?? 0);\n return {\n promptTokens: sum(a.promptTokens, b.promptTokens),\n completionTokens: sum(a.completionTokens, b.completionTokens),\n totalTokens: sum(a.totalTokens, b.totalTokens),\n cachedPromptTokens: sum(a.cachedPromptTokens, b.cachedPromptTokens),\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface AnthropicMessageResponse {\n content?: Array<\n { type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason?: string;\n usage?: AnthropicUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport {\n AnthropicMessagesModel,\n type AnthropicMessagesModelId,\n} from './anthropic-messages-model.js';\n\nexport interface AnthropicProviderOptions {\n /** Defaults to `process.env.ANTHROPIC_API_KEY`. */\n apiKey?: string;\n baseURL?: string;\n /** API version sent in `anthropic-version`. Defaults to `2023-06-01`. */\n version?: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface AnthropicProvider {\n (modelId: AnthropicMessagesModelId): LanguageModel;\n messages(modelId: AnthropicMessagesModelId): LanguageModel;\n}\n\nexport function createAnthropic(options: AnthropicProviderOptions = {}): AnthropicProvider {\n const apiKey = options.apiKey ?? loadEnv('ANTHROPIC_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.anthropic.com/v1';\n const version = options.version ?? '2023-06-01';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': version,\n ...options.headers,\n };\n if (apiKey) headers['x-api-key'] = apiKey;\n\n const make = (modelId: AnthropicMessagesModelId): LanguageModel =>\n new AnthropicMessagesModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: AnthropicMessagesModelId) => make(modelId)) as AnthropicProvider;\n provider.messages = make;\n return provider;\n}\n\nexport const anthropic: AnthropicProvider = createAnthropic();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { APICallError, estimateTokensFromMessages } from '@ziro-agent/core';
1
+ import { APICallError, estimateTokensFromMessages, resolveMediaInput, UnsupportedPartError } from '@ziro-agent/core';
2
2
  import { getPricing } from '@ziro-agent/core/pricing';
3
3
 
4
4
  // src/anthropic-messages-model.ts
@@ -249,29 +249,102 @@ function splitSystem(messages) {
249
249
  const text = sys.flatMap((m) => m.content).filter((p) => p.type === "text").map((p) => p.text).join("\n");
250
250
  return { system: text, messages: rest };
251
251
  }
252
+ function utf8FromInlineBase64(b64) {
253
+ if (typeof Buffer !== "undefined") return Buffer.from(b64, "base64").toString("utf8");
254
+ const bin = atob(b64);
255
+ const bytes = new Uint8Array(bin.length);
256
+ for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
257
+ return new TextDecoder("utf-8").decode(bytes);
258
+ }
259
+ function mapAnthropicUserBlock(p) {
260
+ if (p.type === "text") return { type: "text", text: p.text };
261
+ if (p.type === "image") {
262
+ if (typeof p.image === "string") {
263
+ if (p.image.startsWith("data:")) {
264
+ const resolved = resolveMediaInput(p.image);
265
+ if ("url" in resolved) {
266
+ throw new UnsupportedPartError({
267
+ partType: "image",
268
+ provider: "anthropic",
269
+ message: "Unexpected URL resolution for a data: image URL."
270
+ });
271
+ }
272
+ return {
273
+ type: "image",
274
+ source: {
275
+ type: "base64",
276
+ media_type: p.mimeType ?? resolved.mimeType ?? "image/png",
277
+ data: resolved.base64
278
+ }
279
+ };
280
+ }
281
+ return { type: "image", source: { type: "url", url: p.image } };
282
+ }
283
+ return {
284
+ type: "image",
285
+ source: {
286
+ type: "base64",
287
+ media_type: p.mimeType ?? "image/png",
288
+ data: uint8ToBase64(p.image)
289
+ }
290
+ };
291
+ }
292
+ if (p.type === "audio") {
293
+ throw new UnsupportedPartError({
294
+ partType: "audio",
295
+ provider: "anthropic",
296
+ message: "Claude Messages API does not yet ship a first-class audio input block. Transcribe to text, or use OpenAI / Gemini for native audio."
297
+ });
298
+ }
299
+ if (p.type === "file") {
300
+ const r = resolveMediaInput(p.file);
301
+ const mime = (p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "").toLowerCase();
302
+ if ("url" in r) {
303
+ if (mime.includes("pdf") || r.url.toLowerCase().split("?")[0]?.endsWith(".pdf")) {
304
+ return { type: "document", source: { type: "url", url: r.url } };
305
+ }
306
+ throw new UnsupportedPartError({
307
+ partType: "file",
308
+ provider: "anthropic",
309
+ message: "Anthropic URL document sources are limited to PDF (`application/pdf` or `.pdf` URL)."
310
+ });
311
+ }
312
+ const effMime = mime || r.mimeType?.toLowerCase() || "";
313
+ if (effMime.includes("pdf")) {
314
+ return {
315
+ type: "document",
316
+ source: { type: "base64", media_type: "application/pdf", data: r.base64 }
317
+ };
318
+ }
319
+ if (effMime.includes("plain")) {
320
+ return {
321
+ type: "document",
322
+ source: { type: "text", media_type: "text/plain", data: utf8FromInlineBase64(r.base64) }
323
+ };
324
+ }
325
+ throw new UnsupportedPartError({
326
+ partType: "file",
327
+ provider: "anthropic",
328
+ message: `Anthropic supports PDF (base64 or URL) or plain text (base64) document blocks; got "${p.mimeType ?? r.mimeType ?? "unknown"}".`
329
+ });
330
+ }
331
+ if (p.type === "video") {
332
+ throw new UnsupportedPartError({
333
+ partType: "video",
334
+ provider: "anthropic",
335
+ message: "Video `UserMessage` parts are reserved (RFC 0014) \u2014 the Claude Messages adapter does not map them yet."
336
+ });
337
+ }
338
+ throw new UnsupportedPartError({
339
+ partType: p.type ?? "unknown",
340
+ provider: "anthropic",
341
+ message: "Unexpected content part in user message."
342
+ });
343
+ }
252
344
  function toAnthropicMessage(m) {
253
345
  switch (m.role) {
254
346
  case "user": {
255
- const blocks = m.content.map((p) => {
256
- if (p.type === "text") return { type: "text", text: p.text };
257
- if (p.type === "image") {
258
- if (typeof p.image === "string" && p.image.startsWith("http")) {
259
- return { type: "image", source: { type: "url", url: p.image } };
260
- }
261
- if (typeof p.image === "string") {
262
- return { type: "image", source: { type: "url", url: p.image } };
263
- }
264
- return {
265
- type: "image",
266
- source: {
267
- type: "base64",
268
- media_type: p.mimeType ?? "image/png",
269
- data: uint8ToBase64(p.image)
270
- }
271
- };
272
- }
273
- return p;
274
- });
347
+ const blocks = m.content.map((p) => mapAnthropicUserBlock(p));
275
348
  return { role: "user", content: blocks };
276
349
  }
277
350
  case "assistant": {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/sse.ts","../src/anthropic-messages-model.ts","../src/anthropic-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Anthropic streams SSE with explicit `event:` lines (e.g. `content_block_delta`).\n * We surface both the event name and the data payload — the model logic decides\n * how to interpret them.\n */\nexport interface SSEEvent {\n event?: string;\n data: string;\n}\n\nexport async function* parseSSEWithEvent(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<SSEEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n const lines = block.split(/\\r?\\n/);\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0 && !event) return null;\n return { ...(event !== undefined ? { event } : {}), data: data.join('\\n') };\n}\n","import {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n type TokenUsage,\n type ToolCallPart,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n // Current flagships (verified against anthropic.com/pricing 2026-04-20).\n | 'claude-opus-4-7'\n | 'claude-sonnet-4-6'\n | 'claude-haiku-4-5'\n // Legacy still served on the API.\n | 'claude-opus-4-6'\n | 'claude-opus-4-5'\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface AnthropicMessagesModelConfig {\n modelId: AnthropicMessagesModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class AnthropicMessagesModel implements LanguageModel {\n readonly provider = 'anthropic';\n readonly modelId: string;\n private readonly config: AnthropicMessagesModelConfig;\n\n constructor(config: AnthropicMessagesModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options, false);\n const res = await this.fetch('/messages', body, options);\n const json = (await res.json()) as AnthropicMessageResponse;\n\n const text = (json.content ?? [])\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n\n const toolCalls: ToolCallPart[] = (json.content ?? [])\n .filter((b) => b.type === 'tool_use')\n .map((b) => {\n const tu = b as { id: string; name: string; input: unknown };\n return { type: 'tool-call', toolCallId: tu.id, toolName: tu.name, args: tu.input };\n });\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(json.stop_reason),\n usage: mapUsage(json.usage),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options, true);\n const res = await this.fetch('/messages', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'Anthropic streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const events = parseSSEWithEvent(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolBlocks = new Map<number, { id: string; name: string; argsBuffer: string }>();\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n\n try {\n for await (const evt of events) {\n const data = parseEvent(evt);\n if (!data) continue;\n\n switch (data.type) {\n case 'message_start': {\n const msg = data.message as { usage?: AnthropicUsage } | undefined;\n if (msg?.usage) usage = mergeUsage(usage, mapUsage(msg.usage));\n break;\n }\n case 'content_block_start': {\n const block = data.content_block as\n | { type: string; id?: string; name?: string }\n | undefined;\n if (block?.type === 'tool_use' && typeof data.index === 'number') {\n toolBlocks.set(data.index, {\n id: block.id ?? `tu_${data.index}`,\n name: block.name ?? '',\n argsBuffer: '',\n });\n }\n break;\n }\n case 'content_block_delta': {\n const delta = data.delta as\n | { type: string; text?: string; partial_json?: string }\n | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.text });\n } else if (\n delta?.type === 'input_json_delta' &&\n typeof data.index === 'number' &&\n delta.partial_json\n ) {\n const tb = toolBlocks.get(data.index);\n if (tb) {\n tb.argsBuffer += delta.partial_json;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: tb.id,\n toolName: tb.name,\n argsDelta: delta.partial_json,\n });\n }\n }\n break;\n }\n case 'message_delta': {\n const delta = data.delta as { stop_reason?: string } | undefined;\n if (delta?.stop_reason) finish = mapFinishReason(delta.stop_reason);\n if (data.usage) usage = mergeUsage(usage, mapUsage(data.usage as AnthropicUsage));\n break;\n }\n case 'message_stop': {\n break;\n }\n }\n }\n\n for (const tb of toolBlocks.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tb.id,\n toolName: tb.name,\n args: safeParseJSON(tb.argsBuffer),\n });\n }\n\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults\n * to 4096 in `buildBody`), so we use the same default for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the model.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 4096;\n const minOut = Math.min(16, maxOut);\n const pricing = getPricing(this.provider, this.modelId);\n if (!pricing) {\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd: 0,\n maxUsd: 0,\n pricingAvailable: false,\n };\n }\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (minOut * pricing.outputPer1M) / 1_000_000,\n maxUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (maxOut * pricing.outputPer1M) / 1_000_000,\n pricingAvailable: true,\n };\n }\n\n private buildBody(options: ModelCallOptions, stream: boolean): Record<string, unknown> {\n const { system, messages } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: messages.map(toAnthropicMessage),\n max_tokens: options.maxTokens ?? 4096,\n };\n if (system) body.system = system;\n if (stream) body.stream = true;\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n input_schema: t.parameters,\n }));\n }\n if (options.toolChoice !== undefined) {\n if (options.toolChoice === 'required') body.tool_choice = { type: 'any' };\n else if (options.toolChoice === 'auto') body.tool_choice = { type: 'auto' };\n else if (options.toolChoice === 'none') {\n // Anthropic has no explicit \"none\" — skip.\n } else if (typeof options.toolChoice === 'object') {\n body.tool_choice = { type: 'tool', name: options.toolChoice.toolName };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.topK !== undefined) body.top_k = options.topK;\n if (options.stopSequences !== undefined) body.stop_sequences = options.stopSequences;\n if (options.providerOptions) Object.assign(body, options.providerOptions);\n return body;\n }\n\n private async fetch(path: string, body: unknown, options: ModelCallOptions): Promise<Response> {\n const url = `${this.config.baseURL}${path}`;\n const headers = { ...this.config.headers, ...options.headers };\n const init: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n };\n if (options.abortSignal) init.signal = options.abortSignal;\n\n const res = await this.config.fetcher(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new APICallError({\n message: `Anthropic API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` to the public `ChatMessage[]` shape\n * `estimateTokensFromMessages` accepts. Estimator only inspects role/content,\n * so a structural cast is safe.\n */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n system?: string;\n messages: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const rest = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { messages: rest };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { system: text, messages: rest };\n}\n\nfunction toAnthropicMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string' && p.image.startsWith('http')) {\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n if (typeof p.image === 'string') {\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n return p;\n });\n return { role: 'user', content: blocks };\n }\n case 'assistant': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'tool-call') {\n return { type: 'tool_use', id: p.toolCallId, name: p.toolName, input: p.args };\n }\n return p;\n });\n return { role: 'assistant', content: blocks };\n }\n case 'tool': {\n return {\n role: 'user',\n content: m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n type: 'tool_result',\n tool_use_id: r.toolCallId,\n content: typeof r.result === 'string' ? r.result : JSON.stringify(r.result),\n ...(r.isError ? { is_error: true } : {}),\n })),\n };\n }\n case 'system':\n return { role: 'user', content: '' };\n }\n}\n\nfunction parseEvent(evt: SSEEvent): { type: string; [k: string]: unknown } | null {\n if (!evt.data) return null;\n try {\n return JSON.parse(evt.data) as { type: string };\n } catch {\n return null;\n }\n}\n\nfunction safeParseJSON(text: string): unknown {\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool-calls';\n case 'stop_sequence':\n return 'stop';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nfunction mapUsage(u: AnthropicUsage | undefined): TokenUsage {\n if (!u) return {};\n const promptTokens =\n (u.input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);\n const out: TokenUsage = {\n promptTokens: u.input_tokens !== undefined ? promptTokens : undefined,\n completionTokens: u.output_tokens,\n };\n if (out.promptTokens !== undefined && out.completionTokens !== undefined) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n if (u.cache_read_input_tokens !== undefined) out.cachedPromptTokens = u.cache_read_input_tokens;\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n const sum = (x?: number, y?: number) =>\n x === undefined && y === undefined ? undefined : (x ?? 0) + (y ?? 0);\n return {\n promptTokens: sum(a.promptTokens, b.promptTokens),\n completionTokens: sum(a.completionTokens, b.completionTokens),\n totalTokens: sum(a.totalTokens, b.totalTokens),\n cachedPromptTokens: sum(a.cachedPromptTokens, b.cachedPromptTokens),\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface AnthropicMessageResponse {\n content?: Array<\n { type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason?: string;\n usage?: AnthropicUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport {\n AnthropicMessagesModel,\n type AnthropicMessagesModelId,\n} from './anthropic-messages-model.js';\n\nexport interface AnthropicProviderOptions {\n /** Defaults to `process.env.ANTHROPIC_API_KEY`. */\n apiKey?: string;\n baseURL?: string;\n /** API version sent in `anthropic-version`. Defaults to `2023-06-01`. */\n version?: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface AnthropicProvider {\n (modelId: AnthropicMessagesModelId): LanguageModel;\n messages(modelId: AnthropicMessagesModelId): LanguageModel;\n}\n\nexport function createAnthropic(options: AnthropicProviderOptions = {}): AnthropicProvider {\n const apiKey = options.apiKey ?? loadEnv('ANTHROPIC_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.anthropic.com/v1';\n const version = options.version ?? '2023-06-01';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': version,\n ...options.headers,\n };\n if (apiKey) headers['x-api-key'] = apiKey;\n\n const make = (modelId: AnthropicMessagesModelId): LanguageModel =>\n new AnthropicMessagesModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: AnthropicMessagesModelId) => make(modelId)) as AnthropicProvider;\n provider.messages = make;\n return provider;\n}\n\nexport const anthropic: AnthropicProvider = createAnthropic();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"sources":["../src/util/sse.ts","../src/anthropic-messages-model.ts","../src/anthropic-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Anthropic streams SSE with explicit `event:` lines (e.g. `content_block_delta`).\n * We surface both the event name and the data payload — the model logic decides\n * how to interpret them.\n */\nexport interface SSEEvent {\n event?: string;\n data: string;\n}\n\nexport async function* parseSSEWithEvent(\n body: ReadableStream<Uint8Array>,\n): AsyncIterable<SSEEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n const lines = block.split(/\\r?\\n/);\n let event: string | undefined;\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0 && !event) return null;\n return { ...(event !== undefined ? { event } : {}), data: data.join('\\n') };\n}\n","import type { ContentPart } from '@ziro-agent/core';\nimport {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n resolveMediaInput,\n type TokenUsage,\n type ToolCallPart,\n UnsupportedPartError,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n // Current flagships (verified against anthropic.com/pricing 2026-04-20).\n | 'claude-opus-4-7'\n | 'claude-sonnet-4-6'\n | 'claude-haiku-4-5'\n // Legacy still served on the API.\n | 'claude-opus-4-6'\n | 'claude-opus-4-5'\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface AnthropicMessagesModelConfig {\n modelId: AnthropicMessagesModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class AnthropicMessagesModel implements LanguageModel {\n readonly provider = 'anthropic';\n readonly modelId: string;\n private readonly config: AnthropicMessagesModelConfig;\n\n constructor(config: AnthropicMessagesModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options, false);\n const res = await this.fetch('/messages', body, options);\n const json = (await res.json()) as AnthropicMessageResponse;\n\n const text = (json.content ?? [])\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n\n const toolCalls: ToolCallPart[] = (json.content ?? [])\n .filter((b) => b.type === 'tool_use')\n .map((b) => {\n const tu = b as { id: string; name: string; input: unknown };\n return { type: 'tool-call', toolCallId: tu.id, toolName: tu.name, args: tu.input };\n });\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(json.stop_reason),\n usage: mapUsage(json.usage),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options, true);\n const res = await this.fetch('/messages', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'Anthropic streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const events = parseSSEWithEvent(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolBlocks = new Map<number, { id: string; name: string; argsBuffer: string }>();\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n\n try {\n for await (const evt of events) {\n const data = parseEvent(evt);\n if (!data) continue;\n\n switch (data.type) {\n case 'message_start': {\n const msg = data.message as { usage?: AnthropicUsage } | undefined;\n if (msg?.usage) usage = mergeUsage(usage, mapUsage(msg.usage));\n break;\n }\n case 'content_block_start': {\n const block = data.content_block as\n | { type: string; id?: string; name?: string }\n | undefined;\n if (block?.type === 'tool_use' && typeof data.index === 'number') {\n toolBlocks.set(data.index, {\n id: block.id ?? `tu_${data.index}`,\n name: block.name ?? '',\n argsBuffer: '',\n });\n }\n break;\n }\n case 'content_block_delta': {\n const delta = data.delta as\n | { type: string; text?: string; partial_json?: string }\n | undefined;\n if (delta?.type === 'text_delta' && delta.text) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.text });\n } else if (\n delta?.type === 'input_json_delta' &&\n typeof data.index === 'number' &&\n delta.partial_json\n ) {\n const tb = toolBlocks.get(data.index);\n if (tb) {\n tb.argsBuffer += delta.partial_json;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: tb.id,\n toolName: tb.name,\n argsDelta: delta.partial_json,\n });\n }\n }\n break;\n }\n case 'message_delta': {\n const delta = data.delta as { stop_reason?: string } | undefined;\n if (delta?.stop_reason) finish = mapFinishReason(delta.stop_reason);\n if (data.usage) usage = mergeUsage(usage, mapUsage(data.usage as AnthropicUsage));\n break;\n }\n case 'message_stop': {\n break;\n }\n }\n }\n\n for (const tb of toolBlocks.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: tb.id,\n toolName: tb.name,\n args: safeParseJSON(tb.argsBuffer),\n });\n }\n\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults\n * to 4096 in `buildBody`), so we use the same default for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the model.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 4096;\n const minOut = Math.min(16, maxOut);\n const pricing = getPricing(this.provider, this.modelId);\n if (!pricing) {\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd: 0,\n maxUsd: 0,\n pricingAvailable: false,\n };\n }\n return {\n minTokens: inputTokens + minOut,\n maxTokens: inputTokens + maxOut,\n minUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (minOut * pricing.outputPer1M) / 1_000_000,\n maxUsd:\n (inputTokens * pricing.inputPer1M) / 1_000_000 + (maxOut * pricing.outputPer1M) / 1_000_000,\n pricingAvailable: true,\n };\n }\n\n private buildBody(options: ModelCallOptions, stream: boolean): Record<string, unknown> {\n const { system, messages } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n model: this.modelId,\n messages: messages.map(toAnthropicMessage),\n max_tokens: options.maxTokens ?? 4096,\n };\n if (system) body.system = system;\n if (stream) body.stream = true;\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n input_schema: t.parameters,\n }));\n }\n if (options.toolChoice !== undefined) {\n if (options.toolChoice === 'required') body.tool_choice = { type: 'any' };\n else if (options.toolChoice === 'auto') body.tool_choice = { type: 'auto' };\n else if (options.toolChoice === 'none') {\n // Anthropic has no explicit \"none\" — skip.\n } else if (typeof options.toolChoice === 'object') {\n body.tool_choice = { type: 'tool', name: options.toolChoice.toolName };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.topK !== undefined) body.top_k = options.topK;\n if (options.stopSequences !== undefined) body.stop_sequences = options.stopSequences;\n if (options.providerOptions) Object.assign(body, options.providerOptions);\n return body;\n }\n\n private async fetch(path: string, body: unknown, options: ModelCallOptions): Promise<Response> {\n const url = `${this.config.baseURL}${path}`;\n const headers = { ...this.config.headers, ...options.headers };\n const init: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n };\n if (options.abortSignal) init.signal = options.abortSignal;\n\n const res = await this.config.fetcher(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new APICallError({\n message: `Anthropic API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` to the public `ChatMessage[]` shape\n * `estimateTokensFromMessages` accepts. Estimator only inspects role/content,\n * so a structural cast is safe.\n */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n system?: string;\n messages: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const rest = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { messages: rest };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { system: text, messages: rest };\n}\n\nfunction utf8FromInlineBase64(b64: string): string {\n if (typeof Buffer !== 'undefined') return Buffer.from(b64, 'base64').toString('utf8');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return new TextDecoder('utf-8').decode(bytes);\n}\n\nfunction mapAnthropicUserBlock(p: ContentPart): unknown {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n if (p.image.startsWith('data:')) {\n const resolved = resolveMediaInput(p.image);\n if ('url' in resolved) {\n throw new UnsupportedPartError({\n partType: 'image',\n provider: 'anthropic',\n message: 'Unexpected URL resolution for a data: image URL.',\n });\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? resolved.mimeType ?? 'image/png',\n data: resolved.base64,\n },\n };\n }\n return { type: 'image', source: { type: 'url', url: p.image } };\n }\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n if (p.type === 'audio') {\n throw new UnsupportedPartError({\n partType: 'audio',\n provider: 'anthropic',\n message:\n 'Claude Messages API does not yet ship a first-class audio input block. Transcribe to text, or use OpenAI / Gemini for native audio.',\n });\n }\n if (p.type === 'file') {\n const r = resolveMediaInput(p.file);\n const mime = (p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? '').toLowerCase();\n if ('url' in r) {\n if (mime.includes('pdf') || r.url.toLowerCase().split('?')[0]?.endsWith('.pdf')) {\n return { type: 'document', source: { type: 'url', url: r.url } };\n }\n throw new UnsupportedPartError({\n partType: 'file',\n provider: 'anthropic',\n message:\n 'Anthropic URL document sources are limited to PDF (`application/pdf` or `.pdf` URL).',\n });\n }\n const effMime = mime || r.mimeType?.toLowerCase() || '';\n if (effMime.includes('pdf')) {\n return {\n type: 'document',\n source: { type: 'base64', media_type: 'application/pdf', data: r.base64 },\n };\n }\n if (effMime.includes('plain')) {\n return {\n type: 'document',\n source: { type: 'text', media_type: 'text/plain', data: utf8FromInlineBase64(r.base64) },\n };\n }\n throw new UnsupportedPartError({\n partType: 'file',\n provider: 'anthropic',\n message: `Anthropic supports PDF (base64 or URL) or plain text (base64) document blocks; got \"${p.mimeType ?? r.mimeType ?? 'unknown'}\".`,\n });\n }\n if (p.type === 'video') {\n throw new UnsupportedPartError({\n partType: 'video',\n provider: 'anthropic',\n message:\n 'Video `UserMessage` parts are reserved (RFC 0014) — the Claude Messages adapter does not map them yet.',\n });\n }\n throw new UnsupportedPartError({\n partType: (p as { type?: string }).type ?? 'unknown',\n provider: 'anthropic',\n message: 'Unexpected content part in user message.',\n });\n}\n\nfunction toAnthropicMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const blocks = m.content.map((p) => mapAnthropicUserBlock(p));\n return { role: 'user', content: blocks };\n }\n case 'assistant': {\n const blocks = m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'tool-call') {\n return { type: 'tool_use', id: p.toolCallId, name: p.toolName, input: p.args };\n }\n return p;\n });\n return { role: 'assistant', content: blocks };\n }\n case 'tool': {\n return {\n role: 'user',\n content: m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n type: 'tool_result',\n tool_use_id: r.toolCallId,\n content: typeof r.result === 'string' ? r.result : JSON.stringify(r.result),\n ...(r.isError ? { is_error: true } : {}),\n })),\n };\n }\n case 'system':\n return { role: 'user', content: '' };\n }\n}\n\nfunction parseEvent(evt: SSEEvent): { type: string; [k: string]: unknown } | null {\n if (!evt.data) return null;\n try {\n return JSON.parse(evt.data) as { type: string };\n } catch {\n return null;\n }\n}\n\nfunction safeParseJSON(text: string): unknown {\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'tool_use':\n return 'tool-calls';\n case 'stop_sequence':\n return 'stop';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nfunction mapUsage(u: AnthropicUsage | undefined): TokenUsage {\n if (!u) return {};\n const promptTokens =\n (u.input_tokens ?? 0) + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);\n const out: TokenUsage = {\n promptTokens: u.input_tokens !== undefined ? promptTokens : undefined,\n completionTokens: u.output_tokens,\n };\n if (out.promptTokens !== undefined && out.completionTokens !== undefined) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n if (u.cache_read_input_tokens !== undefined) out.cachedPromptTokens = u.cache_read_input_tokens;\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n const sum = (x?: number, y?: number) =>\n x === undefined && y === undefined ? undefined : (x ?? 0) + (y ?? 0);\n return {\n promptTokens: sum(a.promptTokens, b.promptTokens),\n completionTokens: sum(a.completionTokens, b.completionTokens),\n totalTokens: sum(a.totalTokens, b.totalTokens),\n cachedPromptTokens: sum(a.cachedPromptTokens, b.cachedPromptTokens),\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface AnthropicMessageResponse {\n content?: Array<\n { type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason?: string;\n usage?: AnthropicUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport {\n AnthropicMessagesModel,\n type AnthropicMessagesModelId,\n} from './anthropic-messages-model.js';\n\nexport interface AnthropicProviderOptions {\n /** Defaults to `process.env.ANTHROPIC_API_KEY`. */\n apiKey?: string;\n baseURL?: string;\n /** API version sent in `anthropic-version`. Defaults to `2023-06-01`. */\n version?: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface AnthropicProvider {\n (modelId: AnthropicMessagesModelId): LanguageModel;\n messages(modelId: AnthropicMessagesModelId): LanguageModel;\n}\n\nexport function createAnthropic(options: AnthropicProviderOptions = {}): AnthropicProvider {\n const apiKey = options.apiKey ?? loadEnv('ANTHROPIC_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.anthropic.com/v1';\n const version = options.version ?? '2023-06-01';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': version,\n ...options.headers,\n };\n if (apiKey) headers['x-api-key'] = apiKey;\n\n const make = (modelId: AnthropicMessagesModelId): LanguageModel =>\n new AnthropicMessagesModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: AnthropicMessagesModelId) => make(modelId)) as AnthropicProvider;\n provider.messages = make;\n return provider;\n}\n\nexport const anthropic: AnthropicProvider = createAnthropic();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ziro-agent/anthropic",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Anthropic (Claude) provider for ZiroAgent SDK.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://ziroagent.com",
@@ -43,7 +43,7 @@
43
43
  "LICENSE"
44
44
  ],
45
45
  "dependencies": {
46
- "@ziro-agent/core": "0.5.1"
46
+ "@ziro-agent/core": "0.7.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@arethetypeswrong/cli": "^0.18.2",