@ziro-agent/anthropic 0.1.3 → 0.2.1

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
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@ziro-agent/core');
4
+ var pricing = require('@ziro-agent/core/pricing');
4
5
 
5
6
  // src/anthropic-messages-model.ts
6
7
 
@@ -161,6 +162,33 @@ var AnthropicMessagesModel = class {
161
162
  }
162
163
  });
163
164
  }
165
+ /**
166
+ * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults
167
+ * to 4096 in `buildBody`), so we use the same default for the upper bound.
168
+ * Returns `pricingAvailable: false` when the SDK has no row for the model.
169
+ */
170
+ estimateCost(options) {
171
+ const inputTokens = core.estimateTokensFromMessages(asChatMessages(options.messages));
172
+ const maxOut = options.maxTokens ?? 4096;
173
+ const minOut = Math.min(16, maxOut);
174
+ const pricing$1 = pricing.getPricing(this.provider, this.modelId);
175
+ if (!pricing$1) {
176
+ return {
177
+ minTokens: inputTokens + minOut,
178
+ maxTokens: inputTokens + maxOut,
179
+ minUsd: 0,
180
+ maxUsd: 0,
181
+ pricingAvailable: false
182
+ };
183
+ }
184
+ return {
185
+ minTokens: inputTokens + minOut,
186
+ maxTokens: inputTokens + maxOut,
187
+ minUsd: inputTokens * pricing$1.inputPer1M / 1e6 + minOut * pricing$1.outputPer1M / 1e6,
188
+ maxUsd: inputTokens * pricing$1.inputPer1M / 1e6 + maxOut * pricing$1.outputPer1M / 1e6,
189
+ pricingAvailable: true
190
+ };
191
+ }
164
192
  buildBody(options, stream) {
165
193
  const { system, messages } = splitSystem(options.messages);
166
194
  const body = {
@@ -213,6 +241,9 @@ var AnthropicMessagesModel = class {
213
241
  return res;
214
242
  }
215
243
  };
244
+ function asChatMessages(messages) {
245
+ return messages;
246
+ }
216
247
  function splitSystem(messages) {
217
248
  const sys = messages.filter((m) => m.role === "system");
218
249
  const rest = messages.filter((m) => m.role !== "system");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/sse.ts","../src/anthropic-messages-model.ts","../src/anthropic-provider.ts"],"names":["APICallError"],"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 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 { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n | 'claude-3-7-sonnet-latest'\n | 'claude-3-5-sonnet-latest'\n | 'claude-3-5-haiku-latest'\n | 'claude-3-haiku-20240307'\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 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\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"],"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"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LanguageModel } from '@ziro-agent/core';
2
2
 
3
- type AnthropicMessagesModelId = 'claude-opus-4-1' | 'claude-opus-4' | 'claude-sonnet-4-5' | 'claude-sonnet-4' | 'claude-3-7-sonnet-latest' | 'claude-3-5-sonnet-latest' | 'claude-3-5-haiku-latest' | 'claude-3-haiku-20240307' | (string & {});
3
+ type AnthropicMessagesModelId = 'claude-opus-4-7' | 'claude-sonnet-4-6' | 'claude-haiku-4-5' | 'claude-opus-4-6' | 'claude-opus-4-5' | 'claude-opus-4-1' | 'claude-opus-4' | 'claude-sonnet-4-5' | 'claude-sonnet-4' | (string & {});
4
4
 
5
5
  interface AnthropicProviderOptions {
6
6
  /** Defaults to `process.env.ANTHROPIC_API_KEY`. */
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LanguageModel } from '@ziro-agent/core';
2
2
 
3
- type AnthropicMessagesModelId = 'claude-opus-4-1' | 'claude-opus-4' | 'claude-sonnet-4-5' | 'claude-sonnet-4' | 'claude-3-7-sonnet-latest' | 'claude-3-5-sonnet-latest' | 'claude-3-5-haiku-latest' | 'claude-3-haiku-20240307' | (string & {});
3
+ type AnthropicMessagesModelId = 'claude-opus-4-7' | 'claude-sonnet-4-6' | 'claude-haiku-4-5' | 'claude-opus-4-6' | 'claude-opus-4-5' | 'claude-opus-4-1' | 'claude-opus-4' | 'claude-sonnet-4-5' | 'claude-sonnet-4' | (string & {});
4
4
 
5
5
  interface AnthropicProviderOptions {
6
6
  /** Defaults to `process.env.ANTHROPIC_API_KEY`. */
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import { APICallError } from '@ziro-agent/core';
1
+ import { APICallError, estimateTokensFromMessages } from '@ziro-agent/core';
2
+ import { getPricing } from '@ziro-agent/core/pricing';
2
3
 
3
4
  // src/anthropic-messages-model.ts
4
5
 
@@ -159,6 +160,33 @@ var AnthropicMessagesModel = class {
159
160
  }
160
161
  });
161
162
  }
163
+ /**
164
+ * Pre-flight cost estimate. Anthropic's `max_tokens` is required (defaults
165
+ * to 4096 in `buildBody`), so we use the same default for the upper bound.
166
+ * Returns `pricingAvailable: false` when the SDK has no row for the model.
167
+ */
168
+ estimateCost(options) {
169
+ const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));
170
+ const maxOut = options.maxTokens ?? 4096;
171
+ const minOut = Math.min(16, maxOut);
172
+ const pricing = getPricing(this.provider, this.modelId);
173
+ if (!pricing) {
174
+ return {
175
+ minTokens: inputTokens + minOut,
176
+ maxTokens: inputTokens + maxOut,
177
+ minUsd: 0,
178
+ maxUsd: 0,
179
+ pricingAvailable: false
180
+ };
181
+ }
182
+ return {
183
+ minTokens: inputTokens + minOut,
184
+ maxTokens: inputTokens + maxOut,
185
+ minUsd: inputTokens * pricing.inputPer1M / 1e6 + minOut * pricing.outputPer1M / 1e6,
186
+ maxUsd: inputTokens * pricing.inputPer1M / 1e6 + maxOut * pricing.outputPer1M / 1e6,
187
+ pricingAvailable: true
188
+ };
189
+ }
162
190
  buildBody(options, stream) {
163
191
  const { system, messages } = splitSystem(options.messages);
164
192
  const body = {
@@ -211,6 +239,9 @@ var AnthropicMessagesModel = class {
211
239
  return res;
212
240
  }
213
241
  };
242
+ function asChatMessages(messages) {
243
+ return messages;
244
+ }
214
245
  function splitSystem(messages) {
215
246
  const sys = messages.filter((m) => m.role === "system");
216
247
  const rest = messages.filter((m) => m.role !== "system");
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 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 { parseSSEWithEvent, type SSEEvent } from './util/sse.js';\n\nexport type AnthropicMessagesModelId =\n | 'claude-opus-4-1'\n | 'claude-opus-4'\n | 'claude-sonnet-4-5'\n | 'claude-sonnet-4'\n | 'claude-3-7-sonnet-latest'\n | 'claude-3-5-sonnet-latest'\n | 'claude-3-5-haiku-latest'\n | 'claude-3-haiku-20240307'\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 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\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 {\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"]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@ziro-agent/anthropic",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "Anthropic (Claude) provider for ZiroAgent SDK.",
5
5
  "license": "Apache-2.0",
6
- "homepage": "https://github.com/ziroagent/sdk-typescript/tree/main/packages/providers-anthropic",
6
+ "homepage": "https://ziroagent.com",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/ziroagent/sdk-typescript.git",
@@ -43,7 +43,7 @@
43
43
  "LICENSE"
44
44
  ],
45
45
  "dependencies": {
46
- "@ziro-agent/core": "0.1.3"
46
+ "@ziro-agent/core": "0.3.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@arethetypeswrong/cli": "^0.18.2",
@@ -59,6 +59,7 @@
59
59
  "publishConfig": {
60
60
  "access": "public"
61
61
  },
62
+ "author": "ZiroAgent <hello@ziroagent.com> (https://ziroagent.com)",
62
63
  "scripts": {
63
64
  "build": "tsup",
64
65
  "dev": "tsup --watch",