@nymbalhq/ai-anthropic 1.6.0 → 1.7.0
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.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/anthropic-adapter.ts","../src/chat.ts","../src/sse.ts"],"sourcesContent":["import {\n ConfigError,\n type AdapterContext,\n type AdapterSetting,\n type AiAdapter,\n} from '@nymbalhq/types'\nimport { createAnthropicAiAdapter, type AnthropicAiAdapterConfig } from './anthropic-adapter.js'\nimport { timeoutOf } from './chat.js'\n\n/** What this package serves: the kernel refuses it on any other slot or provider. */\nexport const slot = 'ai'\nexport const provider = 'anthropic'\n\nexport { createAnthropicAiAdapter, type AnthropicAiAdapterConfig }\n\n/** The fields the admin's Settings may fill when the config (and, for the key, ANTHROPIC_API_KEY) leaves them unset. */\nexport const settings: AdapterSetting[] = [\n { path: 'apiKey', label: 'API key', secret: true, env: 'ANTHROPIC_API_KEY' },\n { path: 'baseUrl', label: 'API base URL', secret: false },\n]\n\n/**\n * The kernel's entry: `ai: { provider: 'anthropic', config: { apiKey?, model?, baseUrl?, timeoutMs? } }`, the key\n * falling back to ANTHROPIC_API_KEY.\n */\nexport function createAdapter(ctx: AdapterContext): AiAdapter {\n if (ctx.slot !== 'ai') {\n throw new ConfigError(`@nymbalhq/ai-anthropic serves ai, not ${ctx.slot}`, {\n code: 'adapter.wrong_slot',\n context: { slot: ctx.slot },\n })\n }\n const apiKey = ctx.config['apiKey']\n const model = ctx.config['model']\n const baseUrl = ctx.config['baseUrl']\n return createAnthropicAiAdapter({\n apiKey:\n typeof apiKey === 'string' && apiKey !== '' ? apiKey : (ctx.env['ANTHROPIC_API_KEY'] ?? ''),\n ...(typeof model === 'string' && { model }),\n ...(typeof baseUrl === 'string' && baseUrl !== '' && { baseUrl }),\n timeoutMs: timeoutOf(ctx.config['timeoutMs']),\n logger: ctx.logger,\n })\n}\n","import type {\n AiAdapter,\n ChatMessage,\n ChatOptions,\n ChatResult,\n ChatStopReason,\n ChatStreamEvent,\n ChatToolCall,\n Logger,\n} from '@nymbalhq/types'\nimport { AdapterError } from '@nymbalhq/types'\nimport {\n bodyText,\n brokenOff,\n callOf,\n checkChat,\n DEFAULT_TIMEOUT_MS,\n isRecord,\n jsonOf,\n lifetime,\n post,\n recOf,\n unreadable,\n type Lifetime,\n} from './chat.js'\nimport { sseEvents, type SseEvent } from './sse.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.anthropic.com'\nconst API_VERSION = '2023-06-01'\n\nexport interface AnthropicAiAdapterConfig {\n apiKey: string\n model?: string\n /** Where the Messages API is; Anthropic's own when omitted (a stand-in for tests). */\n baseUrl?: string\n /** How long one chat() waits for its answer, or one chatStream() for its end; 60 000 when omitted. */\n timeoutMs?: number\n logger: Logger\n}\n\nconst PROVIDER = 'anthropic'\n\nfunction stopReasonOf(wire: unknown): ChatStopReason {\n if (wire === 'end_turn' || wire === 'stop_sequence') return 'end'\n if (wire === 'max_tokens') return 'max_tokens'\n if (wire === 'tool_use') return 'tool_use'\n return 'other'\n}\n\nconst count = (value: unknown): number => (typeof value === 'number' ? value : 0)\n\n/** The conversation as Anthropic's turns: calls as `tool_use` blocks, each run of tool turns as one user turn. */\nfunction wireMessages(messages: readonly ChatMessage[]): unknown[] {\n const out: unknown[] = []\n let results: unknown[] | undefined\n for (const m of messages) {\n if (m.role === 'tool') {\n const result = {\n type: 'tool_result',\n tool_use_id: m.toolCallId,\n content: m.content,\n ...(m.isError === true && { is_error: true }),\n }\n if (results === undefined) {\n results = [result]\n out.push({ role: 'user', content: results })\n } else results.push(result)\n continue\n }\n results = undefined\n const calls = m.role === 'assistant' ? (m.toolCalls ?? []) : []\n out.push(\n calls.length === 0\n ? { role: m.role, content: m.content }\n : {\n role: m.role,\n content: [\n ...(m.content === '' ? [] : [{ type: 'text', text: m.content }]),\n ...calls.map((c) => ({ type: 'tool_use', id: c.id, name: c.name, input: c.args })),\n ],\n },\n )\n }\n return out\n}\n\nexport function createAnthropicAiAdapter(config: AnthropicAiAdapterConfig): AiAdapter {\n const model = config.model ?? 'claude-sonnet-4-6'\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const base = config.baseUrl ?? DEFAULT_BASE_URL\n const url = `${base.endsWith('/') ? base.slice(0, -1) : base}/v1/messages`\n const headers = { 'x-api-key': config.apiKey, 'anthropic-version': API_VERSION }\n\n function requestOf(\n messages: readonly ChatMessage[],\n opts: ChatOptions | undefined,\n stream: boolean,\n ): string {\n const maxTokens = checkChat(PROVIDER, messages, opts)\n const system = opts?.system\n const tools = opts?.tools ?? []\n return JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: wireMessages(messages),\n ...(system !== undefined && system !== '' && { system }),\n ...(tools.length > 0 && {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n })),\n }),\n ...(stream && { stream: true }),\n })\n }\n\n function resultOf(\n status: number,\n text: string,\n toolCalls: ChatToolCall[],\n stop: unknown,\n usage: { inputTokens: number; outputTokens: number },\n reported: unknown,\n ): ChatResult {\n if (text === '' && toolCalls.length === 0) throw unreadable(PROVIDER, status, 'with no text')\n return {\n text,\n stopReason: stopReasonOf(stop),\n usage,\n model: typeof reported === 'string' && reported !== '' ? reported : model,\n toolCalls,\n }\n }\n\n async function* streamed(\n status: number,\n body: ReadableStream<Uint8Array>,\n life: Lifetime,\n ): AsyncGenerator<ChatStreamEvent> {\n const events = sseEvents(body)\n let reported: unknown\n let inputTokens = 0\n let outputTokens = 0\n let stop: unknown\n let text = ''\n const toolCalls: ChatToolCall[] = []\n const building = new Map<unknown, { id: unknown; name: unknown; json: string }>()\n try {\n for (;;) {\n let next: IteratorResult<SseEvent>\n try {\n next = await events.next()\n } catch {\n throw life.ended() ?? brokenOff(PROVIDER)\n }\n // Ended before message_stop: the answer is not complete.\n if (next.done === true) throw life.ended() ?? brokenOff(PROVIDER)\n if (next.value.event === 'error') throw brokenOff(PROVIDER)\n const e = jsonOf(next.value.data)\n if (!isRecord(e)) throw unreadable(PROVIDER, status, 'with an event that is not JSON')\n if (e['type'] === 'message_start') {\n const message = recOf(e['message'])\n reported = message['model']\n inputTokens = count(recOf(message['usage'])['input_tokens'])\n } else if (e['type'] === 'content_block_start') {\n const block = recOf(e['content_block'])\n if (block['type'] === 'tool_use') {\n building.set(e['index'], { id: block['id'], name: block['name'], json: '' })\n }\n } else if (e['type'] === 'content_block_delta') {\n const delta = recOf(e['delta'])\n const piece = delta['partial_json']\n if (delta['type'] === 'text_delta' && typeof delta['text'] === 'string') {\n if (delta['text'] !== '') {\n text += delta['text']\n yield { type: 'text', delta: delta['text'] }\n }\n } else if (delta['type'] === 'input_json_delta' && typeof piece === 'string') {\n const call = building.get(e['index'])\n if (call !== undefined) call.json += piece\n }\n } else if (e['type'] === 'content_block_stop') {\n const built = building.get(e['index'])\n if (built !== undefined) {\n building.delete(e['index'])\n const call = callOf(built.id, built.name, built.json === '' ? {} : jsonOf(built.json))\n if (call === undefined) {\n throw unreadable(PROVIDER, status, 'with a tool call whose input is not an object')\n }\n toolCalls.push(call)\n yield { type: 'tool_call', call }\n }\n } else if (e['type'] === 'message_delta') {\n stop = recOf(e['delta'])['stop_reason']\n const out = recOf(e['usage'])['output_tokens']\n if (typeof out === 'number') outputTokens = out\n } else if (e['type'] === 'message_stop') {\n yield {\n type: 'done',\n result: resultOf(\n status,\n text,\n toolCalls,\n stop,\n { inputTokens, outputTokens },\n reported,\n ),\n }\n return\n }\n }\n } finally {\n await events.return(undefined)\n }\n }\n\n const adapter: AiAdapter = {\n kind: 'ai',\n providerName: PROVIDER,\n capabilities: () => ['complete', 'chat', 'tools', 'stream'],\n producesEvents: [],\n consumesEvents: [],\n async initialize() {\n // no-op: each chat() is one request\n },\n async healthCheck() {\n return { status: 'healthy', detail: `Anthropic AI adapter using model ${model}` }\n },\n\n async embed() {\n throw new AdapterError(\n 'not_configured',\n 'Embedding not yet supported by the Anthropic adapter',\n )\n },\n\n async complete(prompt, opts) {\n const maxTokens = opts?.maxTokens\n const result = await adapter.chat(\n [{ role: 'user', content: prompt }],\n maxTokens === undefined ? {} : { maxTokens },\n )\n return result.text\n },\n\n async chat(messages, opts): Promise<ChatResult> {\n const request = requestOf(messages, opts, false)\n const life = lifetime(PROVIDER, timeoutMs, opts?.signal)\n let status: number\n let text: string\n try {\n const response = await post(PROVIDER, url, headers, request, life)\n status = response.status\n text = await bodyText(PROVIDER, response, life)\n } finally {\n life.close()\n }\n const body = jsonOf(text)\n if (!isRecord(body)) throw unreadable(PROVIDER, status, 'with a body that is not JSON')\n const blocks = Array.isArray(body['content']) ? (body['content'] as unknown[]).map(recOf) : []\n const toolCalls: ChatToolCall[] = []\n for (const block of blocks.filter((b) => b['type'] === 'tool_use')) {\n const call = callOf(block['id'], block['name'], block['input'])\n if (call === undefined) {\n throw unreadable(PROVIDER, status, 'with a tool call whose input is not an object')\n }\n toolCalls.push(call)\n }\n const answer = blocks\n .map((b) => (b['type'] === 'text' && typeof b['text'] === 'string' ? b['text'] : ''))\n .join('')\n const usage = recOf(body['usage'])\n return resultOf(\n status,\n answer,\n toolCalls,\n body['stop_reason'],\n {\n inputTokens: count(usage['input_tokens']),\n outputTokens: count(usage['output_tokens']),\n },\n body['model'],\n )\n },\n\n async *chatStream(messages, opts) {\n const request = requestOf(messages, opts, true)\n const life = lifetime(PROVIDER, timeoutMs, opts?.signal)\n try {\n const response = await post(PROVIDER, url, headers, request, life)\n if (response.body === null) throw unreadable(PROVIDER, response.status, 'with no body')\n yield* streamed(response.status, response.body, life)\n } finally {\n life.close()\n }\n },\n }\n return adapter\n}\n","import {\n AdapterError,\n ConfigError,\n type ChatMessage,\n type ChatOptions,\n type ChatToolCall,\n} from '@nymbalhq/types'\n\n// What every ai provider's chat() does alike: the input it refuses before a request, the time it waits, and the\n// errors it throws. An error carries the provider and the HTTP status and nothing else: no cause, no headers, no\n// request and no provider message, which may echo the key or the conversation.\n\nexport const DEFAULT_MAX_TOKENS = 1024\nexport const DEFAULT_TIMEOUT_MS = 60_000\nconst TOOL_NAME = /^[A-Za-z0-9_-]{1,64}$/\n\n/** The block's `timeoutMs`, or the default when it is unset. */\nexport function timeoutOf(value: unknown): number {\n if (value === undefined) return DEFAULT_TIMEOUT_MS\n if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {\n throw new ConfigError('commerce.ai.config.timeoutMs is not a positive number of milliseconds', {\n context: { slot: 'ai' },\n })\n }\n return value\n}\n\ntype Rec = Record<string, unknown>\n\nexport const isRecord = (value: unknown): value is Rec =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const recOf = (value: unknown): Rec => (isRecord(value) ? value : {})\n\n/** The maxTokens to send, once the input is one the provider would take. */\nexport function checkChat(\n provider: string,\n messages: readonly ChatMessage[],\n opts: ChatOptions | undefined,\n): number {\n const refuse = (why: string) =>\n new AdapterError('invalid_request', `${provider} chat refused: ${why}`, {\n context: { provider },\n })\n if (!Array.isArray(messages) || messages.length === 0) throw refuse('no messages')\n // The calls of the nearest assistant turn that no tool turn has answered yet.\n let open: string[] = []\n for (const [at, message] of messages.entries()) {\n const turn = recOf(message)\n const role = turn['role']\n if (role !== 'user' && role !== 'assistant' && role !== 'tool') {\n throw refuse(`messages[${at}].role is not user, assistant or tool`)\n }\n if (at === 0 && role !== 'user') throw refuse('the first message is not the user’s')\n const content = turn['content']\n if (typeof content !== 'string') throw refuse(`messages[${at}].content is not text`)\n if (role === 'tool') {\n const id = turn['toolCallId']\n if (typeof id !== 'string' || !open.includes(id)) {\n throw refuse(`messages[${at}] answers no open call of the assistant turn before it`)\n }\n if (content === '') throw refuse(`messages[${at}].content is empty`)\n open = open.filter((o) => o !== id)\n continue\n }\n if (open.length > 0) throw refuse(`messages[${at}] starts with a call left unanswered`)\n const calls = role === 'assistant' ? callIdsOf(turn['toolCalls'], at, refuse) : []\n if (content === '' && calls.length === 0) throw refuse(`messages[${at}].content is empty`)\n open = calls\n }\n checkTools(opts?.tools, refuse)\n const maxTokens = opts?.maxTokens ?? DEFAULT_MAX_TOKENS\n if (!Number.isInteger(maxTokens) || maxTokens <= 0) {\n throw refuse('maxTokens is not a positive integer')\n }\n return maxTokens\n}\n\n/** An assistant turn's call ids, once each call is a well-formed one. */\nfunction callIdsOf(value: unknown, at: number, refuse: (why: string) => AdapterError): string[] {\n if (value === undefined) return []\n if (!Array.isArray(value)) throw refuse(`messages[${at}].toolCalls is not a list`)\n const ids: string[] = []\n for (const [n, call] of (value as unknown[]).entries()) {\n const c = recOf(call)\n const id = c['id']\n if (typeof id !== 'string' || id === '' || ids.includes(id)) {\n throw refuse(`messages[${at}].toolCalls[${n}].id is empty or repeated`)\n }\n if (typeof c['name'] !== 'string' || !TOOL_NAME.test(c['name'])) {\n throw refuse(`messages[${at}].toolCalls[${n}].name is outside ${TOOL_NAME.source}`)\n }\n if (!isRecord(c['args'])) throw refuse(`messages[${at}].toolCalls[${n}].args is not an object`)\n ids.push(id)\n }\n return ids\n}\n\nfunction checkTools(value: unknown, refuse: (why: string) => AdapterError): void {\n if (value === undefined) return\n if (!Array.isArray(value)) throw refuse('tools is not a list')\n const names = new Set<string>()\n for (const [at, tool] of (value as unknown[]).entries()) {\n const t = recOf(tool)\n const name = t['name']\n if (typeof name !== 'string' || !TOOL_NAME.test(name)) {\n throw refuse(`tools[${at}].name is outside ${TOOL_NAME.source}`)\n }\n if (names.has(name)) throw refuse(`tools[${at}].name is taken by an earlier tool`)\n names.add(name)\n if (typeof t['description'] !== 'string') throw refuse(`tools[${at}].description is not text`)\n if (!isRecord(t['inputSchema'])) throw refuse(`tools[${at}].inputSchema is not an object`)\n }\n}\n\n/** A call the provider made, or undefined when its id or name is missing or its arguments are not a JSON object. */\nexport function callOf(id: unknown, name: unknown, args: unknown): ChatToolCall | undefined {\n if (typeof id !== 'string' || id === '' || typeof name !== 'string' || name === '')\n return undefined\n return isRecord(args) ? { id, name, args } : undefined\n}\n\nexport const timedOut = (provider: string, timeoutMs: number): AdapterError =>\n new AdapterError('timeout', `${provider} gave no answer within ${timeoutMs} ms`, {\n context: { provider },\n })\n\nexport const cancelled = (provider: string): AdapterError =>\n new AdapterError('cancelled', `${provider} request cancelled by the caller`, {\n context: { provider },\n })\n\nexport const unreachable = (provider: string): AdapterError =>\n new AdapterError('unavailable', `${provider} could not be reached`, { context: { provider } })\n\n/** A stream that ended, or reported an error, before its answer was complete. */\nexport const brokenOff = (provider: string): AdapterError =>\n new AdapterError('unavailable', `${provider} broke off its answer`, { context: { provider } })\n\n/** A 2xx the adapter cannot read an answer from. */\nexport const unreadable = (provider: string, status: number, what: string): AdapterError =>\n new AdapterError('unexpected_response', `${provider} answered ${status} ${what}`, {\n context: { provider, status },\n })\n\nfunction codeOf(status: number): string {\n if (status === 401 || status === 403) return 'auth_failed'\n if (status === 429) return 'rate_limited'\n if (status >= 400 && status < 500) return 'invalid_request'\n return 'unavailable'\n}\n\n/** A non-2xx answer, classified by its status. */\nexport const answered = (provider: string, status: number): AdapterError =>\n new AdapterError(codeOf(status), `${provider} answered ${status}`, {\n context: { provider, status },\n })\n\n/** A JSON body, or undefined when the text is not JSON. */\nexport function jsonOf(text: string): unknown {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n}\n\n/** One request from its send to its last byte: the signal it is sent with, and why it was ended early. */\nexport interface Lifetime {\n signal: AbortSignal\n /** The timeout or the caller's abort, once either has ended the request. */\n ended(): AdapterError | undefined\n /** Clears the timer and closes the connection if it is still open. */\n close(): void\n}\n\n/** Bounds a request by `timeoutMs` (`adapter.timeout`) and by the caller's `signal` (`adapter.cancelled`). */\nexport function lifetime(provider: string, timeoutMs: number, caller?: AbortSignal): Lifetime {\n const controller = new AbortController()\n let reason: AdapterError | undefined\n // The reason is set before the abort, so the request's own abort error is read as it.\n const end = (error: AdapterError) => {\n if (reason !== undefined) return\n reason = error\n controller.abort()\n }\n const timer = setTimeout(() => end(timedOut(provider, timeoutMs)), timeoutMs)\n const onAbort = () => end(cancelled(provider))\n if (caller?.aborted === true) onAbort()\n else caller?.addEventListener('abort', onAbort, { once: true })\n return {\n signal: controller.signal,\n ended: () => reason,\n close: () => {\n clearTimeout(timer)\n caller?.removeEventListener('abort', onAbort)\n controller.abort()\n },\n }\n}\n\n/** POSTs `body` as JSON: the 2xx response, or the error a failure or a non-2xx answer is. */\nexport async function post(\n provider: string,\n url: string,\n headers: Record<string, string>,\n body: string,\n life: Lifetime,\n): Promise<Response> {\n let response: Response\n try {\n response = await globalThis.fetch(url, {\n method: 'POST',\n headers: { ...headers, 'content-type': 'application/json' },\n body,\n signal: life.signal,\n })\n } catch {\n // fetch's own error may quote the request's headers, the key among them: none of it goes on.\n throw life.ended() ?? unreachable(provider)\n }\n // The body is left unread (it may echo the key or the conversation); close() drops the connection.\n if (response.status < 200 || response.status > 299) throw answered(provider, response.status)\n return response\n}\n\n/** The whole body as text, or the error a body cut short is. */\nexport async function bodyText(\n provider: string,\n response: Response,\n life: Lifetime,\n): Promise<string> {\n try {\n return await response.text()\n } catch {\n throw life.ended() ?? brokenOff(provider)\n }\n}\n","// A server-sent events reader for a provider's streamed answer, the same in every ai provider package. It yields each\n// event once its blank line has arrived; a read that fails (a broken connection, an abort) rejects as it is, for the\n// adapter to classify.\n\n/** One event: its `event` field (`message` when it has none) and its `data` lines joined by a newline. */\nexport interface SseEvent {\n event: string\n data: string\n}\n\nexport async function* sseEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<SseEvent> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let event = ''\n let data: string[] = []\n try {\n for (;;) {\n const { done, value } = await reader.read()\n let text = buffer + (done ? decoder.decode() : decoder.decode(value, { stream: true }))\n // A CR at the end is held back, as the LF that may make it one line end can be in the next chunk.\n const held = !done && text.endsWith('\\r') ? '\\r' : ''\n if (held !== '') text = text.slice(0, -1)\n const lines = text.split(/\\r\\n|\\r|\\n/)\n // The last piece is a line not yet ended.\n buffer = (lines.pop() ?? '') + held\n for (const line of lines) {\n if (line === '') {\n if (data.length > 0)\n yield { event: event === '' ? 'message' : event, data: data.join('\\n') }\n event = ''\n data = []\n continue\n }\n if (line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon === -1 ? line : line.slice(0, colon)\n const raw = colon === -1 ? '' : line.slice(colon + 1)\n const value = raw.startsWith(' ') ? raw.slice(1) : raw\n if (field === 'event') event = value\n else if (field === 'data') data.push(value)\n }\n // An event whose blank line never came is incomplete, as the standard has it, and is dropped.\n if (done) return\n }\n } finally {\n reader.releaseLock()\n }\n}\n"],"mappings":"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","names":["ConfigError","AdapterError","provider","value","AdapterError","ConfigError"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/anthropic-adapter.ts","../src/chat.ts","../src/sse.ts"],"sourcesContent":["import {\n ConfigError,\n type AdapterContext,\n type AdapterSetting,\n type AiAdapter,\n} from '@nymbalhq/types'\nimport { createAnthropicAiAdapter, type AnthropicAiAdapterConfig } from './anthropic-adapter.js'\nimport { timeoutOf } from './chat.js'\n\n/** What this package serves: the kernel refuses it on any other slot or provider. */\nexport const slot = 'ai'\nexport const provider = 'anthropic'\n\nexport { createAnthropicAiAdapter, type AnthropicAiAdapterConfig }\n\n/** The fields the admin's Settings may fill when the config (and, for the key, ANTHROPIC_API_KEY) leaves them unset. */\nexport const settings: AdapterSetting[] = [\n { path: 'apiKey', label: 'API key', secret: true, env: 'ANTHROPIC_API_KEY' },\n { path: 'baseUrl', label: 'API base URL', secret: false },\n]\n\n/**\n * The kernel's entry: `ai: { provider: 'anthropic', config: { apiKey?, model?, baseUrl?, timeoutMs? } }`, the key\n * falling back to ANTHROPIC_API_KEY.\n */\nexport function createAdapter(ctx: AdapterContext): AiAdapter {\n if (ctx.slot !== 'ai') {\n throw new ConfigError(`@nymbalhq/ai-anthropic serves ai, not ${ctx.slot}`, {\n code: 'adapter.wrong_slot',\n context: { slot: ctx.slot },\n })\n }\n const apiKey = ctx.config['apiKey']\n const model = ctx.config['model']\n const baseUrl = ctx.config['baseUrl']\n return createAnthropicAiAdapter({\n apiKey:\n typeof apiKey === 'string' && apiKey !== '' ? apiKey : (ctx.env['ANTHROPIC_API_KEY'] ?? ''),\n ...(typeof model === 'string' && { model }),\n ...(typeof baseUrl === 'string' && baseUrl !== '' && { baseUrl }),\n timeoutMs: timeoutOf(ctx.config['timeoutMs']),\n logger: ctx.logger,\n })\n}\n","import type {\n AiAdapter,\n ChatMessage,\n ChatOptions,\n ChatResult,\n ChatStopReason,\n ChatStreamEvent,\n ChatToolCall,\n Logger,\n} from '@nymbalhq/types'\nimport { AdapterError } from '@nymbalhq/types'\nimport {\n bodyText,\n brokenOff,\n callOf,\n checkChat,\n DEFAULT_TIMEOUT_MS,\n isRecord,\n jsonOf,\n lifetime,\n post,\n recOf,\n unreadable,\n type Lifetime,\n} from './chat.js'\nimport { sseEvents, type SseEvent } from './sse.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.anthropic.com'\nconst API_VERSION = '2023-06-01'\n\nexport interface AnthropicAiAdapterConfig {\n apiKey: string\n model?: string\n /** Where the Messages API is; Anthropic's own when omitted (a stand-in for tests). */\n baseUrl?: string\n /** How long one chat() waits for its answer, or one chatStream() for its end; 60 000 when omitted. */\n timeoutMs?: number\n logger: Logger\n}\n\nconst PROVIDER = 'anthropic'\n\nfunction stopReasonOf(wire: unknown): ChatStopReason {\n if (wire === 'end_turn' || wire === 'stop_sequence') return 'end'\n if (wire === 'max_tokens') return 'max_tokens'\n if (wire === 'tool_use') return 'tool_use'\n return 'other'\n}\n\nconst count = (value: unknown): number => (typeof value === 'number' ? value : 0)\n\n/** The conversation as Anthropic's turns: calls as `tool_use` blocks, each run of tool turns as one user turn. */\nfunction wireMessages(messages: readonly ChatMessage[]): unknown[] {\n const out: unknown[] = []\n let results: unknown[] | undefined\n for (const m of messages) {\n if (m.role === 'tool') {\n const result = {\n type: 'tool_result',\n tool_use_id: m.toolCallId,\n content: m.content,\n ...(m.isError === true && { is_error: true }),\n }\n if (results === undefined) {\n results = [result]\n out.push({ role: 'user', content: results })\n } else results.push(result)\n continue\n }\n results = undefined\n const calls = m.role === 'assistant' ? (m.toolCalls ?? []) : []\n out.push(\n calls.length === 0\n ? { role: m.role, content: m.content }\n : {\n role: m.role,\n content: [\n ...(m.content === '' ? [] : [{ type: 'text', text: m.content }]),\n ...calls.map((c) => ({ type: 'tool_use', id: c.id, name: c.name, input: c.args })),\n ],\n },\n )\n }\n return out\n}\n\nexport function createAnthropicAiAdapter(config: AnthropicAiAdapterConfig): AiAdapter {\n const model = config.model ?? 'claude-sonnet-4-6'\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const base = config.baseUrl ?? DEFAULT_BASE_URL\n const url = `${base.endsWith('/') ? base.slice(0, -1) : base}/v1/messages`\n const headers = { 'x-api-key': config.apiKey, 'anthropic-version': API_VERSION }\n\n function requestOf(\n messages: readonly ChatMessage[],\n opts: ChatOptions | undefined,\n stream: boolean,\n ): string {\n const maxTokens = checkChat(PROVIDER, messages, opts)\n const system = opts?.system\n const tools = opts?.tools ?? []\n return JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: wireMessages(messages),\n ...(system !== undefined && system !== '' && { system }),\n ...(tools.length > 0 && {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n })),\n }),\n ...(stream && { stream: true }),\n })\n }\n\n function resultOf(\n status: number,\n text: string,\n toolCalls: ChatToolCall[],\n stop: unknown,\n usage: { inputTokens: number; outputTokens: number },\n reported: unknown,\n ): ChatResult {\n if (text === '' && toolCalls.length === 0) throw unreadable(PROVIDER, status, 'with no text')\n return {\n text,\n stopReason: stopReasonOf(stop),\n usage,\n model: typeof reported === 'string' && reported !== '' ? reported : model,\n toolCalls,\n }\n }\n\n async function* streamed(\n status: number,\n body: ReadableStream<Uint8Array>,\n life: Lifetime,\n ): AsyncGenerator<ChatStreamEvent> {\n const events = sseEvents(body)\n let reported: unknown\n let inputTokens = 0\n let outputTokens = 0\n let stop: unknown\n let text = ''\n const toolCalls: ChatToolCall[] = []\n const building = new Map<unknown, { id: unknown; name: unknown; json: string }>()\n try {\n for (;;) {\n let next: IteratorResult<SseEvent>\n try {\n next = await events.next()\n } catch {\n throw life.ended() ?? brokenOff(PROVIDER)\n }\n // Ended before message_stop: the answer is not complete.\n if (next.done === true) throw life.ended() ?? brokenOff(PROVIDER)\n if (next.value.event === 'error') throw brokenOff(PROVIDER)\n const e = jsonOf(next.value.data)\n if (!isRecord(e)) throw unreadable(PROVIDER, status, 'with an event that is not JSON')\n if (e['type'] === 'message_start') {\n const message = recOf(e['message'])\n reported = message['model']\n inputTokens = count(recOf(message['usage'])['input_tokens'])\n } else if (e['type'] === 'content_block_start') {\n const block = recOf(e['content_block'])\n if (block['type'] === 'tool_use') {\n building.set(e['index'], { id: block['id'], name: block['name'], json: '' })\n }\n } else if (e['type'] === 'content_block_delta') {\n const delta = recOf(e['delta'])\n const piece = delta['partial_json']\n if (delta['type'] === 'text_delta' && typeof delta['text'] === 'string') {\n if (delta['text'] !== '') {\n text += delta['text']\n yield { type: 'text', delta: delta['text'] }\n }\n } else if (delta['type'] === 'input_json_delta' && typeof piece === 'string') {\n const call = building.get(e['index'])\n if (call !== undefined) call.json += piece\n }\n } else if (e['type'] === 'content_block_stop') {\n const built = building.get(e['index'])\n if (built !== undefined) {\n building.delete(e['index'])\n const call = callOf(built.id, built.name, built.json === '' ? {} : jsonOf(built.json))\n if (call === undefined) {\n throw unreadable(PROVIDER, status, 'with a tool call whose input is not an object')\n }\n toolCalls.push(call)\n yield { type: 'tool_call', call }\n }\n } else if (e['type'] === 'message_delta') {\n stop = recOf(e['delta'])['stop_reason']\n const out = recOf(e['usage'])['output_tokens']\n if (typeof out === 'number') outputTokens = out\n } else if (e['type'] === 'message_stop') {\n yield {\n type: 'done',\n result: resultOf(\n status,\n text,\n toolCalls,\n stop,\n { inputTokens, outputTokens },\n reported,\n ),\n }\n return\n }\n }\n } finally {\n await events.return(undefined)\n }\n }\n\n const adapter: AiAdapter = {\n kind: 'ai',\n providerName: PROVIDER,\n endpoint: base,\n capabilities: () => ['complete', 'chat', 'tools', 'stream'],\n producesEvents: [],\n consumesEvents: [],\n async initialize() {\n // no-op: each chat() is one request\n },\n async healthCheck() {\n return { status: 'healthy', detail: `Anthropic AI adapter using model ${model}` }\n },\n\n async embed() {\n throw new AdapterError(\n 'not_configured',\n 'Embedding not yet supported by the Anthropic adapter',\n )\n },\n\n async complete(prompt, opts) {\n const maxTokens = opts?.maxTokens\n const result = await adapter.chat(\n [{ role: 'user', content: prompt }],\n maxTokens === undefined ? {} : { maxTokens },\n )\n return result.text\n },\n\n async chat(messages, opts): Promise<ChatResult> {\n const request = requestOf(messages, opts, false)\n const life = lifetime(PROVIDER, timeoutMs, opts?.signal)\n let status: number\n let text: string\n try {\n const response = await post(PROVIDER, url, headers, request, life)\n status = response.status\n text = await bodyText(PROVIDER, response, life)\n } finally {\n life.close()\n }\n const body = jsonOf(text)\n if (!isRecord(body)) throw unreadable(PROVIDER, status, 'with a body that is not JSON')\n const blocks = Array.isArray(body['content']) ? (body['content'] as unknown[]).map(recOf) : []\n const toolCalls: ChatToolCall[] = []\n for (const block of blocks.filter((b) => b['type'] === 'tool_use')) {\n const call = callOf(block['id'], block['name'], block['input'])\n if (call === undefined) {\n throw unreadable(PROVIDER, status, 'with a tool call whose input is not an object')\n }\n toolCalls.push(call)\n }\n const answer = blocks\n .map((b) => (b['type'] === 'text' && typeof b['text'] === 'string' ? b['text'] : ''))\n .join('')\n const usage = recOf(body['usage'])\n return resultOf(\n status,\n answer,\n toolCalls,\n body['stop_reason'],\n {\n inputTokens: count(usage['input_tokens']),\n outputTokens: count(usage['output_tokens']),\n },\n body['model'],\n )\n },\n\n async *chatStream(messages, opts) {\n const request = requestOf(messages, opts, true)\n const life = lifetime(PROVIDER, timeoutMs, opts?.signal)\n try {\n const response = await post(PROVIDER, url, headers, request, life)\n if (response.body === null) throw unreadable(PROVIDER, response.status, 'with no body')\n yield* streamed(response.status, response.body, life)\n } finally {\n life.close()\n }\n },\n }\n return adapter\n}\n","import {\n AdapterError,\n ConfigError,\n type ChatMessage,\n type ChatOptions,\n type ChatToolCall,\n} from '@nymbalhq/types'\n\n// What every ai provider's chat() does alike: the input it refuses before a request, the time it waits, and the\n// errors it throws. An error carries the provider and the HTTP status and nothing else: no cause, no headers, no\n// request and no provider message, which may echo the key or the conversation.\n\nexport const DEFAULT_MAX_TOKENS = 1024\nexport const DEFAULT_TIMEOUT_MS = 60_000\nconst TOOL_NAME = /^[A-Za-z0-9_-]{1,64}$/\n\n/** The block's `timeoutMs`, or the default when it is unset. */\nexport function timeoutOf(value: unknown): number {\n if (value === undefined) return DEFAULT_TIMEOUT_MS\n if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {\n throw new ConfigError('commerce.ai.config.timeoutMs is not a positive number of milliseconds', {\n context: { slot: 'ai' },\n })\n }\n return value\n}\n\ntype Rec = Record<string, unknown>\n\nexport const isRecord = (value: unknown): value is Rec =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const recOf = (value: unknown): Rec => (isRecord(value) ? value : {})\n\n/** The maxTokens to send, once the input is one the provider would take. */\nexport function checkChat(\n provider: string,\n messages: readonly ChatMessage[],\n opts: ChatOptions | undefined,\n): number {\n const refuse = (why: string) =>\n new AdapterError('invalid_request', `${provider} chat refused: ${why}`, {\n context: { provider },\n })\n if (!Array.isArray(messages) || messages.length === 0) throw refuse('no messages')\n // The calls of the nearest assistant turn that no tool turn has answered yet.\n let open: string[] = []\n for (const [at, message] of messages.entries()) {\n const turn = recOf(message)\n const role = turn['role']\n if (role !== 'user' && role !== 'assistant' && role !== 'tool') {\n throw refuse(`messages[${at}].role is not user, assistant or tool`)\n }\n if (at === 0 && role !== 'user') throw refuse('the first message is not the user’s')\n const content = turn['content']\n if (typeof content !== 'string') throw refuse(`messages[${at}].content is not text`)\n if (role === 'tool') {\n const id = turn['toolCallId']\n if (typeof id !== 'string' || !open.includes(id)) {\n throw refuse(`messages[${at}] answers no open call of the assistant turn before it`)\n }\n if (content === '') throw refuse(`messages[${at}].content is empty`)\n open = open.filter((o) => o !== id)\n continue\n }\n if (open.length > 0) throw refuse(`messages[${at}] starts with a call left unanswered`)\n const calls = role === 'assistant' ? callIdsOf(turn['toolCalls'], at, refuse) : []\n if (content === '' && calls.length === 0) throw refuse(`messages[${at}].content is empty`)\n open = calls\n }\n checkTools(opts?.tools, refuse)\n const maxTokens = opts?.maxTokens ?? DEFAULT_MAX_TOKENS\n if (!Number.isInteger(maxTokens) || maxTokens <= 0) {\n throw refuse('maxTokens is not a positive integer')\n }\n return maxTokens\n}\n\n/** An assistant turn's call ids, once each call is a well-formed one. */\nfunction callIdsOf(value: unknown, at: number, refuse: (why: string) => AdapterError): string[] {\n if (value === undefined) return []\n if (!Array.isArray(value)) throw refuse(`messages[${at}].toolCalls is not a list`)\n const ids: string[] = []\n for (const [n, call] of (value as unknown[]).entries()) {\n const c = recOf(call)\n const id = c['id']\n if (typeof id !== 'string' || id === '' || ids.includes(id)) {\n throw refuse(`messages[${at}].toolCalls[${n}].id is empty or repeated`)\n }\n if (typeof c['name'] !== 'string' || !TOOL_NAME.test(c['name'])) {\n throw refuse(`messages[${at}].toolCalls[${n}].name is outside ${TOOL_NAME.source}`)\n }\n if (!isRecord(c['args'])) throw refuse(`messages[${at}].toolCalls[${n}].args is not an object`)\n ids.push(id)\n }\n return ids\n}\n\nfunction checkTools(value: unknown, refuse: (why: string) => AdapterError): void {\n if (value === undefined) return\n if (!Array.isArray(value)) throw refuse('tools is not a list')\n const names = new Set<string>()\n for (const [at, tool] of (value as unknown[]).entries()) {\n const t = recOf(tool)\n const name = t['name']\n if (typeof name !== 'string' || !TOOL_NAME.test(name)) {\n throw refuse(`tools[${at}].name is outside ${TOOL_NAME.source}`)\n }\n if (names.has(name)) throw refuse(`tools[${at}].name is taken by an earlier tool`)\n names.add(name)\n if (typeof t['description'] !== 'string') throw refuse(`tools[${at}].description is not text`)\n if (!isRecord(t['inputSchema'])) throw refuse(`tools[${at}].inputSchema is not an object`)\n }\n}\n\n/** A call the provider made, or undefined when its id or name is missing or its arguments are not a JSON object. */\nexport function callOf(id: unknown, name: unknown, args: unknown): ChatToolCall | undefined {\n if (typeof id !== 'string' || id === '' || typeof name !== 'string' || name === '')\n return undefined\n return isRecord(args) ? { id, name, args } : undefined\n}\n\nexport const timedOut = (provider: string, timeoutMs: number): AdapterError =>\n new AdapterError('timeout', `${provider} gave no answer within ${timeoutMs} ms`, {\n context: { provider },\n })\n\nexport const cancelled = (provider: string): AdapterError =>\n new AdapterError('cancelled', `${provider} request cancelled by the caller`, {\n context: { provider },\n })\n\nexport const unreachable = (provider: string): AdapterError =>\n new AdapterError('unavailable', `${provider} could not be reached`, { context: { provider } })\n\n/** A stream that ended, or reported an error, before its answer was complete. */\nexport const brokenOff = (provider: string): AdapterError =>\n new AdapterError('unavailable', `${provider} broke off its answer`, { context: { provider } })\n\n/** A 2xx the adapter cannot read an answer from. */\nexport const unreadable = (provider: string, status: number, what: string): AdapterError =>\n new AdapterError('unexpected_response', `${provider} answered ${status} ${what}`, {\n context: { provider, status },\n })\n\nfunction codeOf(status: number): string {\n if (status === 401 || status === 403) return 'auth_failed'\n if (status === 429) return 'rate_limited'\n if (status >= 400 && status < 500) return 'invalid_request'\n return 'unavailable'\n}\n\n/** A non-2xx answer, classified by its status. */\nexport const answered = (provider: string, status: number): AdapterError =>\n new AdapterError(codeOf(status), `${provider} answered ${status}`, {\n context: { provider, status },\n })\n\n/** A JSON body, or undefined when the text is not JSON. */\nexport function jsonOf(text: string): unknown {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n}\n\n/** One request from its send to its last byte: the signal it is sent with, and why it was ended early. */\nexport interface Lifetime {\n signal: AbortSignal\n /** The timeout or the caller's abort, once either has ended the request. */\n ended(): AdapterError | undefined\n /** Clears the timer and closes the connection if it is still open. */\n close(): void\n}\n\n/** Bounds a request by `timeoutMs` (`adapter.timeout`) and by the caller's `signal` (`adapter.cancelled`). */\nexport function lifetime(provider: string, timeoutMs: number, caller?: AbortSignal): Lifetime {\n const controller = new AbortController()\n let reason: AdapterError | undefined\n // The reason is set before the abort, so the request's own abort error is read as it.\n const end = (error: AdapterError) => {\n if (reason !== undefined) return\n reason = error\n controller.abort()\n }\n const timer = setTimeout(() => end(timedOut(provider, timeoutMs)), timeoutMs)\n const onAbort = () => end(cancelled(provider))\n if (caller?.aborted === true) onAbort()\n else caller?.addEventListener('abort', onAbort, { once: true })\n return {\n signal: controller.signal,\n ended: () => reason,\n close: () => {\n clearTimeout(timer)\n caller?.removeEventListener('abort', onAbort)\n controller.abort()\n },\n }\n}\n\n/** POSTs `body` as JSON: the 2xx response, or the error a failure or a non-2xx answer is. */\nexport async function post(\n provider: string,\n url: string,\n headers: Record<string, string>,\n body: string,\n life: Lifetime,\n): Promise<Response> {\n let response: Response\n try {\n response = await globalThis.fetch(url, {\n method: 'POST',\n headers: { ...headers, 'content-type': 'application/json' },\n body,\n signal: life.signal,\n })\n } catch {\n // fetch's own error may quote the request's headers, the key among them: none of it goes on.\n throw life.ended() ?? unreachable(provider)\n }\n // The body is left unread (it may echo the key or the conversation); close() drops the connection.\n if (response.status < 200 || response.status > 299) throw answered(provider, response.status)\n return response\n}\n\n/** The whole body as text, or the error a body cut short is. */\nexport async function bodyText(\n provider: string,\n response: Response,\n life: Lifetime,\n): Promise<string> {\n try {\n return await response.text()\n } catch {\n throw life.ended() ?? brokenOff(provider)\n }\n}\n","// A server-sent events reader for a provider's streamed answer, the same in every ai provider package. It yields each\n// event once its blank line has arrived; a read that fails (a broken connection, an abort) rejects as it is, for the\n// adapter to classify.\n\n/** One event: its `event` field (`message` when it has none) and its `data` lines joined by a newline. */\nexport interface SseEvent {\n event: string\n data: string\n}\n\nexport async function* sseEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<SseEvent> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let event = ''\n let data: string[] = []\n try {\n for (;;) {\n const { done, value } = await reader.read()\n let text = buffer + (done ? decoder.decode() : decoder.decode(value, { stream: true }))\n // A CR at the end is held back, as the LF that may make it one line end can be in the next chunk.\n const held = !done && text.endsWith('\\r') ? '\\r' : ''\n if (held !== '') text = text.slice(0, -1)\n const lines = text.split(/\\r\\n|\\r|\\n/)\n // The last piece is a line not yet ended.\n buffer = (lines.pop() ?? '') + held\n for (const line of lines) {\n if (line === '') {\n if (data.length > 0)\n yield { event: event === '' ? 'message' : event, data: data.join('\\n') }\n event = ''\n data = []\n continue\n }\n if (line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon === -1 ? line : line.slice(0, colon)\n const raw = colon === -1 ? '' : line.slice(colon + 1)\n const value = raw.startsWith(' ') ? raw.slice(1) : raw\n if (field === 'event') event = value\n else if (field === 'data') data.push(value)\n }\n // An event whose blank line never came is incomplete, as the standard has it, and is dropped.\n if (done) return\n }\n } finally {\n reader.releaseLock()\n }\n}\n"],"mappings":"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","names":["ConfigError","AdapterError","provider","value","AdapterError","ConfigError"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nymbalhq/ai-anthropic",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Anthropic AI for Nymbal: the `anthropic` ai provider",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@anthropic-ai/sdk": "^0.39.0",
|
|
35
|
-
"@nymbalhq/types": "1.
|
|
35
|
+
"@nymbalhq/types": "1.7.0",
|
|
36
36
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
37
37
|
"tsup": "^9.0.0",
|
|
38
38
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|