@ziro-agent/openai 0.1.3 → 0.2.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.cjs +37 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +38 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
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/openai-chat-model.ts
|
|
6
7
|
|
|
@@ -169,6 +170,34 @@ var OpenAIChatModel = class {
|
|
|
169
170
|
}
|
|
170
171
|
});
|
|
171
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Pre-flight cost estimate. Conservative bounds: assumes the model fills
|
|
175
|
+
* `maxTokens` for the upper bound, and emits ~16 tokens for the lower
|
|
176
|
+
* bound. Returns `pricingAvailable: false` when the SDK has no row for
|
|
177
|
+
* this model id — Budget Guard will then skip USD pre-flight enforcement.
|
|
178
|
+
*/
|
|
179
|
+
estimateCost(options) {
|
|
180
|
+
const inputTokens = core.estimateTokensFromMessages(asChatMessages(options.messages));
|
|
181
|
+
const maxOut = options.maxTokens ?? defaultOutputCap(this.modelId);
|
|
182
|
+
const minOut = Math.min(16, maxOut);
|
|
183
|
+
const pricing$1 = pricing.getPricing(this.provider, this.modelId);
|
|
184
|
+
if (!pricing$1) {
|
|
185
|
+
return {
|
|
186
|
+
minTokens: inputTokens + minOut,
|
|
187
|
+
maxTokens: inputTokens + maxOut,
|
|
188
|
+
minUsd: 0,
|
|
189
|
+
maxUsd: 0,
|
|
190
|
+
pricingAvailable: false
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
minTokens: inputTokens + minOut,
|
|
195
|
+
maxTokens: inputTokens + maxOut,
|
|
196
|
+
minUsd: inputTokens * pricing$1.inputPer1M / 1e6 + minOut * pricing$1.outputPer1M / 1e6,
|
|
197
|
+
maxUsd: inputTokens * pricing$1.inputPer1M / 1e6 + maxOut * pricing$1.outputPer1M / 1e6,
|
|
198
|
+
pricingAvailable: true
|
|
199
|
+
};
|
|
200
|
+
}
|
|
172
201
|
buildBody(options, stream) {
|
|
173
202
|
const body = {
|
|
174
203
|
model: this.modelId,
|
|
@@ -283,6 +312,14 @@ function toOpenAIMessage(m) {
|
|
|
283
312
|
}
|
|
284
313
|
}
|
|
285
314
|
}
|
|
315
|
+
function asChatMessages(messages) {
|
|
316
|
+
return messages;
|
|
317
|
+
}
|
|
318
|
+
function defaultOutputCap(modelId) {
|
|
319
|
+
if (modelId.startsWith("o1") || modelId.startsWith("o3")) return 1e5;
|
|
320
|
+
if (modelId.startsWith("gpt-5")) return 32768;
|
|
321
|
+
return 16384;
|
|
322
|
+
}
|
|
286
323
|
function uint8ToBase64(arr) {
|
|
287
324
|
let s = "";
|
|
288
325
|
for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i]);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/sse.ts","../src/openai-chat-model.ts","../src/openai-provider.ts"],"names":["APICallError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Parse a Server-Sent Events stream into a sequence of `data:` payloads\n * (the bit between `data: ` and the blank line). Comment lines, retries, and\n * other SSE features we don't need are ignored.\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<string> {\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.length > 0) {\n const event = extractEvent(buffer);\n if (event !== null) yield event;\n }\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const sepIdx = findEventBoundary(buffer);\n if (sepIdx === -1) break;\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx).replace(/^(\\r?\\n){2}/, '');\n const event = extractEvent(block);\n if (event !== null) yield event;\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 extractEvent(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (data.length === 0) return null;\n return 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 { parseSSE } from './util/sse.js';\n\n/**\n * The set of OpenAI chat model ids we explicitly know about. Other strings are\n * still allowed via the `(string & {})` trick — we don't want to lock users out\n * when OpenAI ships a new model before we update the SDK.\n */\nexport type OpenAIChatModelId =\n | 'gpt-4o'\n | 'gpt-4o-mini'\n | 'gpt-4.1'\n | 'gpt-4.1-mini'\n | 'gpt-4.1-nano'\n | 'gpt-4-turbo'\n | 'gpt-3.5-turbo'\n | 'o1'\n | 'o1-mini'\n | 'o3'\n | 'o3-mini'\n | (string & {});\n\ninterface OpenAIChatModelConfig {\n modelId: OpenAIChatModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class OpenAIChatModel implements LanguageModel {\n readonly provider = 'openai';\n readonly modelId: string;\n private readonly config: OpenAIChatModelConfig;\n\n constructor(config: OpenAIChatModelConfig) {\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('/chat/completions', body, options);\n const json = (await res.json()) as OpenAIChatCompletion;\n\n const choice = json.choices?.[0];\n if (!choice) {\n throw new APICallError({\n message: 'OpenAI response contained no choices.',\n url: `${this.config.baseURL}/chat/completions`,\n statusCode: res.status,\n responseBody: JSON.stringify(json),\n });\n }\n\n const text = choice.message?.content ?? '';\n const toolCalls: ToolCallPart[] =\n choice.message?.tool_calls?.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: safeParseJSON(tc.function.arguments),\n })) ?? [];\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(choice.finish_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('/chat/completions', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'OpenAI streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const sse = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolCallsByIndex = new Map<\n number,\n { id: string; name: string; argsBuffer: string }\n >();\n let usage: TokenUsage | undefined;\n let finish: FinishReason = 'unknown';\n\n try {\n for await (const event of sse) {\n if (event === '[DONE]') break;\n const chunk = JSON.parse(event) as OpenAIChatChunk;\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n if (chunk.usage) usage = mapUsage(chunk.usage);\n continue;\n }\n\n const delta = choice.delta;\n if (delta?.content) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.content });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let entry = toolCallsByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id ?? `call_${idx}`,\n name: tc.function?.name ?? '',\n argsBuffer: '',\n };\n toolCallsByIndex.set(idx, entry);\n }\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) {\n entry.argsBuffer += tc.function.arguments;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: entry.id,\n toolName: entry.name,\n argsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n finish = mapFinishReason(choice.finish_reason);\n }\n if (chunk.usage) usage = mapUsage(chunk.usage);\n }\n\n for (const entry of toolCallsByIndex.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: entry.id,\n toolName: entry.name,\n args: safeParseJSON(entry.argsBuffer),\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: finish,\n usage: usage ?? {},\n });\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 body: Record<string, unknown> = {\n model: this.modelId,\n messages: options.messages.map(toOpenAIMessage),\n };\n if (stream) {\n body.stream = true;\n body.stream_options = { include_usage: true };\n }\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n },\n }));\n }\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'string') {\n body.tool_choice = options.toolChoice;\n } else {\n body.tool_choice = {\n type: 'function',\n function: { name: options.toolChoice.toolName },\n };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\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: `OpenAI API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\nfunction toOpenAIMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'system': {\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n return { role: 'system', content: text };\n }\n case 'user': {\n const allText = m.content.every((p) => p.type === 'text');\n if (allText) {\n return {\n role: 'user',\n content: m.content.map((p) => (p as { text: string }).text).join(''),\n };\n }\n return {\n role: 'user',\n content: m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n const url =\n typeof p.image === 'string'\n ? p.image\n : p.image instanceof URL\n ? p.image.toString()\n : `data:${p.mimeType ?? 'image/png'};base64,${uint8ToBase64(p.image)}`;\n return { type: 'image_url', image_url: { url } };\n }\n return p;\n }),\n };\n }\n case 'assistant': {\n const toolCalls = m.content.filter((p) => p.type === 'tool-call');\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n const out: Record<string, unknown> = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map((tc) => ({\n id: (tc as ToolCallPart).toolCallId,\n type: 'function',\n function: {\n name: (tc as ToolCallPart).toolName,\n arguments: JSON.stringify((tc as ToolCallPart).args ?? {}),\n },\n }));\n }\n return out;\n }\n case 'tool': {\n // OpenAI requires one tool message per result.\n // The caller will need to flatten before passing. We pick the first.\n const first = m.content[0];\n if (!first || first.type !== 'tool-result') {\n return { role: 'tool', content: '', tool_call_id: '' };\n }\n return {\n role: 'tool',\n content: typeof first.result === 'string' ? first.result : JSON.stringify(first.result),\n tool_call_id: first.toolCallId,\n };\n }\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\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 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n case 'content_filter':\n return 'content-filter';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nfunction mapUsage(u: OpenAIUsage | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {};\n if (u.prompt_tokens !== undefined) out.promptTokens = u.prompt_tokens;\n if (u.completion_tokens !== undefined) out.completionTokens = u.completion_tokens;\n if (u.total_tokens !== undefined) out.totalTokens = u.total_tokens;\n if (u.prompt_tokens_details?.cached_tokens !== undefined) {\n out.cachedPromptTokens = u.prompt_tokens_details.cached_tokens;\n }\n if (u.completion_tokens_details?.reasoning_tokens !== undefined) {\n out.reasoningTokens = u.completion_tokens_details.reasoning_tokens;\n }\n return out;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n}\n\ninterface OpenAIChatCompletion {\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIChatChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { OpenAIChatModel, type OpenAIChatModelId } from './openai-chat-model.js';\n\nexport interface OpenAIProviderOptions {\n /** Defaults to `process.env.OPENAI_API_KEY`. */\n apiKey?: string;\n /** Override the base URL (useful for proxies / Azure / OpenRouter). */\n baseURL?: string;\n /** Optional organization id (`OpenAI-Organization` header). */\n organization?: string;\n /** Optional project id (`OpenAI-Project` header). */\n project?: string;\n /** Extra default headers attached to every request. */\n headers?: Record<string, string>;\n /** Custom `fetch`. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\nexport interface OpenAIProvider {\n (modelId: OpenAIChatModelId): LanguageModel;\n chat(modelId: OpenAIChatModelId): LanguageModel;\n}\n\nexport function createOpenAI(options: OpenAIProviderOptions = {}): OpenAIProvider {\n const apiKey = options.apiKey ?? loadEnv('OPENAI_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.openai.com/v1';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n if (options.organization) headers['OpenAI-Organization'] = options.organization;\n if (options.project) headers['OpenAI-Project'] = options.project;\n\n const make = (modelId: OpenAIChatModelId): LanguageModel =>\n new OpenAIChatModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: OpenAIChatModelId) => make(modelId)) as OpenAIProvider;\n provider.chat = make;\n return provider;\n}\n\n/** Default singleton provider — reads `OPENAI_API_KEY` from env. */\nexport const openai: OpenAIProvider = createOpenAI();\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/openai-chat-model.ts","../src/openai-provider.ts"],"names":["APICallError","estimateTokensFromMessages","pricing","getPricing"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Parse a Server-Sent Events stream into a sequence of `data:` payloads\n * (the bit between `data: ` and the blank line). Comment lines, retries, and\n * other SSE features we don't need are ignored.\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<string> {\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.length > 0) {\n const event = extractEvent(buffer);\n if (event !== null) yield event;\n }\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const sepIdx = findEventBoundary(buffer);\n if (sepIdx === -1) break;\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx).replace(/^(\\r?\\n){2}/, '');\n const event = extractEvent(block);\n if (event !== null) yield event;\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 extractEvent(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (data.length === 0) return null;\n return 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 { parseSSE } from './util/sse.js';\n\n/**\n * The set of OpenAI chat model ids we explicitly know about. Other strings are\n * still allowed via the `(string & {})` trick — we don't want to lock users out\n * when OpenAI ships a new model before we update the SDK.\n */\nexport type OpenAIChatModelId =\n // Current flagships (verified against openai.com/api/pricing 2026-04-20).\n | 'gpt-5.4'\n | 'gpt-5.4-mini'\n | 'gpt-5.4-nano'\n // Legacy still served on the API.\n | 'gpt-4o'\n | 'gpt-4o-mini'\n // Open string for any model id we haven't enumerated — Budget Guard\n // pre-flight will return `pricingAvailable: false` for unknown ids and\n // fall back to post-call enforcement only.\n | (string & {});\n\ninterface OpenAIChatModelConfig {\n modelId: OpenAIChatModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class OpenAIChatModel implements LanguageModel {\n readonly provider = 'openai';\n readonly modelId: string;\n private readonly config: OpenAIChatModelConfig;\n\n constructor(config: OpenAIChatModelConfig) {\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('/chat/completions', body, options);\n const json = (await res.json()) as OpenAIChatCompletion;\n\n const choice = json.choices?.[0];\n if (!choice) {\n throw new APICallError({\n message: 'OpenAI response contained no choices.',\n url: `${this.config.baseURL}/chat/completions`,\n statusCode: res.status,\n responseBody: JSON.stringify(json),\n });\n }\n\n const text = choice.message?.content ?? '';\n const toolCalls: ToolCallPart[] =\n choice.message?.tool_calls?.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: safeParseJSON(tc.function.arguments),\n })) ?? [];\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(choice.finish_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('/chat/completions', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'OpenAI streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const sse = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolCallsByIndex = new Map<\n number,\n { id: string; name: string; argsBuffer: string }\n >();\n let usage: TokenUsage | undefined;\n let finish: FinishReason = 'unknown';\n\n try {\n for await (const event of sse) {\n if (event === '[DONE]') break;\n const chunk = JSON.parse(event) as OpenAIChatChunk;\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n if (chunk.usage) usage = mapUsage(chunk.usage);\n continue;\n }\n\n const delta = choice.delta;\n if (delta?.content) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.content });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let entry = toolCallsByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id ?? `call_${idx}`,\n name: tc.function?.name ?? '',\n argsBuffer: '',\n };\n toolCallsByIndex.set(idx, entry);\n }\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) {\n entry.argsBuffer += tc.function.arguments;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: entry.id,\n toolName: entry.name,\n argsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n finish = mapFinishReason(choice.finish_reason);\n }\n if (chunk.usage) usage = mapUsage(chunk.usage);\n }\n\n for (const entry of toolCallsByIndex.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: entry.id,\n toolName: entry.name,\n args: safeParseJSON(entry.argsBuffer),\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: finish,\n usage: usage ?? {},\n });\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. Conservative bounds: assumes the model fills\n * `maxTokens` for the upper bound, and emits ~16 tokens for the lower\n * bound. Returns `pricingAvailable: false` when the SDK has no row for\n * this model id — Budget Guard will then skip USD pre-flight enforcement.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? defaultOutputCap(this.modelId);\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 body: Record<string, unknown> = {\n model: this.modelId,\n messages: options.messages.map(toOpenAIMessage),\n };\n if (stream) {\n body.stream = true;\n body.stream_options = { include_usage: true };\n }\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n },\n }));\n }\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'string') {\n body.tool_choice = options.toolChoice;\n } else {\n body.tool_choice = {\n type: 'function',\n function: { name: options.toolChoice.toolName },\n };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\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: `OpenAI API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\nfunction toOpenAIMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'system': {\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n return { role: 'system', content: text };\n }\n case 'user': {\n const allText = m.content.every((p) => p.type === 'text');\n if (allText) {\n return {\n role: 'user',\n content: m.content.map((p) => (p as { text: string }).text).join(''),\n };\n }\n return {\n role: 'user',\n content: m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n const url =\n typeof p.image === 'string'\n ? p.image\n : p.image instanceof URL\n ? p.image.toString()\n : `data:${p.mimeType ?? 'image/png'};base64,${uint8ToBase64(p.image)}`;\n return { type: 'image_url', image_url: { url } };\n }\n return p;\n }),\n };\n }\n case 'assistant': {\n const toolCalls = m.content.filter((p) => p.type === 'tool-call');\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n const out: Record<string, unknown> = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map((tc) => ({\n id: (tc as ToolCallPart).toolCallId,\n type: 'function',\n function: {\n name: (tc as ToolCallPart).toolName,\n arguments: JSON.stringify((tc as ToolCallPart).args ?? {}),\n },\n }));\n }\n return out;\n }\n case 'tool': {\n // OpenAI requires one tool message per result.\n // The caller will need to flatten before passing. We pick the first.\n const first = m.content[0];\n if (!first || first.type !== 'tool-result') {\n return { role: 'tool', content: '', tool_call_id: '' };\n }\n return {\n role: 'tool',\n content: typeof first.result === 'string' ? first.result : JSON.stringify(first.result),\n tool_call_id: first.toolCallId,\n };\n }\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` (always `ContentPart[]`) to the public\n * `ChatMessage[]` shape `estimateTokensFromMessages` accepts. The estimator\n * only inspects `role` + `content`, so the 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\n/**\n * Default output token cap when the caller didn't pass `maxTokens`. Mirrors\n * OpenAI's typical model defaults; intentionally generous so pre-flight\n * over- rather than underestimates.\n */\nfunction defaultOutputCap(modelId: string): number {\n if (modelId.startsWith('o1') || modelId.startsWith('o3')) return 100_000;\n if (modelId.startsWith('gpt-5')) return 32_768;\n return 16_384;\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\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 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n case 'content_filter':\n return 'content-filter';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nfunction mapUsage(u: OpenAIUsage | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {};\n if (u.prompt_tokens !== undefined) out.promptTokens = u.prompt_tokens;\n if (u.completion_tokens !== undefined) out.completionTokens = u.completion_tokens;\n if (u.total_tokens !== undefined) out.totalTokens = u.total_tokens;\n if (u.prompt_tokens_details?.cached_tokens !== undefined) {\n out.cachedPromptTokens = u.prompt_tokens_details.cached_tokens;\n }\n if (u.completion_tokens_details?.reasoning_tokens !== undefined) {\n out.reasoningTokens = u.completion_tokens_details.reasoning_tokens;\n }\n return out;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n}\n\ninterface OpenAIChatCompletion {\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIChatChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { OpenAIChatModel, type OpenAIChatModelId } from './openai-chat-model.js';\n\nexport interface OpenAIProviderOptions {\n /** Defaults to `process.env.OPENAI_API_KEY`. */\n apiKey?: string;\n /** Override the base URL (useful for proxies / Azure / OpenRouter). */\n baseURL?: string;\n /** Optional organization id (`OpenAI-Organization` header). */\n organization?: string;\n /** Optional project id (`OpenAI-Project` header). */\n project?: string;\n /** Extra default headers attached to every request. */\n headers?: Record<string, string>;\n /** Custom `fetch`. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\nexport interface OpenAIProvider {\n (modelId: OpenAIChatModelId): LanguageModel;\n chat(modelId: OpenAIChatModelId): LanguageModel;\n}\n\nexport function createOpenAI(options: OpenAIProviderOptions = {}): OpenAIProvider {\n const apiKey = options.apiKey ?? loadEnv('OPENAI_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.openai.com/v1';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n if (options.organization) headers['OpenAI-Organization'] = options.organization;\n if (options.project) headers['OpenAI-Project'] = options.project;\n\n const make = (modelId: OpenAIChatModelId): LanguageModel =>\n new OpenAIChatModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: OpenAIChatModelId) => make(modelId)) as OpenAIProvider;\n provider.chat = make;\n return provider;\n}\n\n/** Default singleton provider — reads `OPENAI_API_KEY` from env. */\nexport const openai: OpenAIProvider = createOpenAI();\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
|
@@ -5,7 +5,7 @@ import { LanguageModel } from '@ziro-agent/core';
|
|
|
5
5
|
* still allowed via the `(string & {})` trick — we don't want to lock users out
|
|
6
6
|
* when OpenAI ships a new model before we update the SDK.
|
|
7
7
|
*/
|
|
8
|
-
type OpenAIChatModelId = 'gpt-
|
|
8
|
+
type OpenAIChatModelId = 'gpt-5.4' | 'gpt-5.4-mini' | 'gpt-5.4-nano' | 'gpt-4o' | 'gpt-4o-mini' | (string & {});
|
|
9
9
|
|
|
10
10
|
interface OpenAIProviderOptions {
|
|
11
11
|
/** Defaults to `process.env.OPENAI_API_KEY`. */
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { LanguageModel } from '@ziro-agent/core';
|
|
|
5
5
|
* still allowed via the `(string & {})` trick — we don't want to lock users out
|
|
6
6
|
* when OpenAI ships a new model before we update the SDK.
|
|
7
7
|
*/
|
|
8
|
-
type OpenAIChatModelId = 'gpt-
|
|
8
|
+
type OpenAIChatModelId = 'gpt-5.4' | 'gpt-5.4-mini' | 'gpt-5.4-nano' | 'gpt-4o' | 'gpt-4o-mini' | (string & {});
|
|
9
9
|
|
|
10
10
|
interface OpenAIProviderOptions {
|
|
11
11
|
/** Defaults to `process.env.OPENAI_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/openai-chat-model.ts
|
|
4
5
|
|
|
@@ -167,6 +168,34 @@ var OpenAIChatModel = class {
|
|
|
167
168
|
}
|
|
168
169
|
});
|
|
169
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Pre-flight cost estimate. Conservative bounds: assumes the model fills
|
|
173
|
+
* `maxTokens` for the upper bound, and emits ~16 tokens for the lower
|
|
174
|
+
* bound. Returns `pricingAvailable: false` when the SDK has no row for
|
|
175
|
+
* this model id — Budget Guard will then skip USD pre-flight enforcement.
|
|
176
|
+
*/
|
|
177
|
+
estimateCost(options) {
|
|
178
|
+
const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));
|
|
179
|
+
const maxOut = options.maxTokens ?? defaultOutputCap(this.modelId);
|
|
180
|
+
const minOut = Math.min(16, maxOut);
|
|
181
|
+
const pricing = getPricing(this.provider, this.modelId);
|
|
182
|
+
if (!pricing) {
|
|
183
|
+
return {
|
|
184
|
+
minTokens: inputTokens + minOut,
|
|
185
|
+
maxTokens: inputTokens + maxOut,
|
|
186
|
+
minUsd: 0,
|
|
187
|
+
maxUsd: 0,
|
|
188
|
+
pricingAvailable: false
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
minTokens: inputTokens + minOut,
|
|
193
|
+
maxTokens: inputTokens + maxOut,
|
|
194
|
+
minUsd: inputTokens * pricing.inputPer1M / 1e6 + minOut * pricing.outputPer1M / 1e6,
|
|
195
|
+
maxUsd: inputTokens * pricing.inputPer1M / 1e6 + maxOut * pricing.outputPer1M / 1e6,
|
|
196
|
+
pricingAvailable: true
|
|
197
|
+
};
|
|
198
|
+
}
|
|
170
199
|
buildBody(options, stream) {
|
|
171
200
|
const body = {
|
|
172
201
|
model: this.modelId,
|
|
@@ -281,6 +310,14 @@ function toOpenAIMessage(m) {
|
|
|
281
310
|
}
|
|
282
311
|
}
|
|
283
312
|
}
|
|
313
|
+
function asChatMessages(messages) {
|
|
314
|
+
return messages;
|
|
315
|
+
}
|
|
316
|
+
function defaultOutputCap(modelId) {
|
|
317
|
+
if (modelId.startsWith("o1") || modelId.startsWith("o3")) return 1e5;
|
|
318
|
+
if (modelId.startsWith("gpt-5")) return 32768;
|
|
319
|
+
return 16384;
|
|
320
|
+
}
|
|
284
321
|
function uint8ToBase64(arr) {
|
|
285
322
|
let s = "";
|
|
286
323
|
for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i]);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/sse.ts","../src/openai-chat-model.ts","../src/openai-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Parse a Server-Sent Events stream into a sequence of `data:` payloads\n * (the bit between `data: ` and the blank line). Comment lines, retries, and\n * other SSE features we don't need are ignored.\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<string> {\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.length > 0) {\n const event = extractEvent(buffer);\n if (event !== null) yield event;\n }\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const sepIdx = findEventBoundary(buffer);\n if (sepIdx === -1) break;\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx).replace(/^(\\r?\\n){2}/, '');\n const event = extractEvent(block);\n if (event !== null) yield event;\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 extractEvent(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (data.length === 0) return null;\n return 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 { parseSSE } from './util/sse.js';\n\n/**\n * The set of OpenAI chat model ids we explicitly know about. Other strings are\n * still allowed via the `(string & {})` trick — we don't want to lock users out\n * when OpenAI ships a new model before we update the SDK.\n */\nexport type OpenAIChatModelId =\n | 'gpt-4o'\n | 'gpt-4o-mini'\n | 'gpt-4.1'\n | 'gpt-4.1-mini'\n | 'gpt-4.1-nano'\n | 'gpt-4-turbo'\n | 'gpt-3.5-turbo'\n | 'o1'\n | 'o1-mini'\n | 'o3'\n | 'o3-mini'\n | (string & {});\n\ninterface OpenAIChatModelConfig {\n modelId: OpenAIChatModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class OpenAIChatModel implements LanguageModel {\n readonly provider = 'openai';\n readonly modelId: string;\n private readonly config: OpenAIChatModelConfig;\n\n constructor(config: OpenAIChatModelConfig) {\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('/chat/completions', body, options);\n const json = (await res.json()) as OpenAIChatCompletion;\n\n const choice = json.choices?.[0];\n if (!choice) {\n throw new APICallError({\n message: 'OpenAI response contained no choices.',\n url: `${this.config.baseURL}/chat/completions`,\n statusCode: res.status,\n responseBody: JSON.stringify(json),\n });\n }\n\n const text = choice.message?.content ?? '';\n const toolCalls: ToolCallPart[] =\n choice.message?.tool_calls?.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: safeParseJSON(tc.function.arguments),\n })) ?? [];\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(choice.finish_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('/chat/completions', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'OpenAI streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const sse = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolCallsByIndex = new Map<\n number,\n { id: string; name: string; argsBuffer: string }\n >();\n let usage: TokenUsage | undefined;\n let finish: FinishReason = 'unknown';\n\n try {\n for await (const event of sse) {\n if (event === '[DONE]') break;\n const chunk = JSON.parse(event) as OpenAIChatChunk;\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n if (chunk.usage) usage = mapUsage(chunk.usage);\n continue;\n }\n\n const delta = choice.delta;\n if (delta?.content) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.content });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let entry = toolCallsByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id ?? `call_${idx}`,\n name: tc.function?.name ?? '',\n argsBuffer: '',\n };\n toolCallsByIndex.set(idx, entry);\n }\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) {\n entry.argsBuffer += tc.function.arguments;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: entry.id,\n toolName: entry.name,\n argsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n finish = mapFinishReason(choice.finish_reason);\n }\n if (chunk.usage) usage = mapUsage(chunk.usage);\n }\n\n for (const entry of toolCallsByIndex.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: entry.id,\n toolName: entry.name,\n args: safeParseJSON(entry.argsBuffer),\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: finish,\n usage: usage ?? {},\n });\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 body: Record<string, unknown> = {\n model: this.modelId,\n messages: options.messages.map(toOpenAIMessage),\n };\n if (stream) {\n body.stream = true;\n body.stream_options = { include_usage: true };\n }\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n },\n }));\n }\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'string') {\n body.tool_choice = options.toolChoice;\n } else {\n body.tool_choice = {\n type: 'function',\n function: { name: options.toolChoice.toolName },\n };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\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: `OpenAI API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\nfunction toOpenAIMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'system': {\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n return { role: 'system', content: text };\n }\n case 'user': {\n const allText = m.content.every((p) => p.type === 'text');\n if (allText) {\n return {\n role: 'user',\n content: m.content.map((p) => (p as { text: string }).text).join(''),\n };\n }\n return {\n role: 'user',\n content: m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n const url =\n typeof p.image === 'string'\n ? p.image\n : p.image instanceof URL\n ? p.image.toString()\n : `data:${p.mimeType ?? 'image/png'};base64,${uint8ToBase64(p.image)}`;\n return { type: 'image_url', image_url: { url } };\n }\n return p;\n }),\n };\n }\n case 'assistant': {\n const toolCalls = m.content.filter((p) => p.type === 'tool-call');\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n const out: Record<string, unknown> = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map((tc) => ({\n id: (tc as ToolCallPart).toolCallId,\n type: 'function',\n function: {\n name: (tc as ToolCallPart).toolName,\n arguments: JSON.stringify((tc as ToolCallPart).args ?? {}),\n },\n }));\n }\n return out;\n }\n case 'tool': {\n // OpenAI requires one tool message per result.\n // The caller will need to flatten before passing. We pick the first.\n const first = m.content[0];\n if (!first || first.type !== 'tool-result') {\n return { role: 'tool', content: '', tool_call_id: '' };\n }\n return {\n role: 'tool',\n content: typeof first.result === 'string' ? first.result : JSON.stringify(first.result),\n tool_call_id: first.toolCallId,\n };\n }\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\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 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n case 'content_filter':\n return 'content-filter';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nfunction mapUsage(u: OpenAIUsage | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {};\n if (u.prompt_tokens !== undefined) out.promptTokens = u.prompt_tokens;\n if (u.completion_tokens !== undefined) out.completionTokens = u.completion_tokens;\n if (u.total_tokens !== undefined) out.totalTokens = u.total_tokens;\n if (u.prompt_tokens_details?.cached_tokens !== undefined) {\n out.cachedPromptTokens = u.prompt_tokens_details.cached_tokens;\n }\n if (u.completion_tokens_details?.reasoning_tokens !== undefined) {\n out.reasoningTokens = u.completion_tokens_details.reasoning_tokens;\n }\n return out;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n}\n\ninterface OpenAIChatCompletion {\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIChatChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { OpenAIChatModel, type OpenAIChatModelId } from './openai-chat-model.js';\n\nexport interface OpenAIProviderOptions {\n /** Defaults to `process.env.OPENAI_API_KEY`. */\n apiKey?: string;\n /** Override the base URL (useful for proxies / Azure / OpenRouter). */\n baseURL?: string;\n /** Optional organization id (`OpenAI-Organization` header). */\n organization?: string;\n /** Optional project id (`OpenAI-Project` header). */\n project?: string;\n /** Extra default headers attached to every request. */\n headers?: Record<string, string>;\n /** Custom `fetch`. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\nexport interface OpenAIProvider {\n (modelId: OpenAIChatModelId): LanguageModel;\n chat(modelId: OpenAIChatModelId): LanguageModel;\n}\n\nexport function createOpenAI(options: OpenAIProviderOptions = {}): OpenAIProvider {\n const apiKey = options.apiKey ?? loadEnv('OPENAI_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.openai.com/v1';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n if (options.organization) headers['OpenAI-Organization'] = options.organization;\n if (options.project) headers['OpenAI-Project'] = options.project;\n\n const make = (modelId: OpenAIChatModelId): LanguageModel =>\n new OpenAIChatModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: OpenAIChatModelId) => make(modelId)) as OpenAIProvider;\n provider.chat = make;\n return provider;\n}\n\n/** Default singleton provider — reads `OPENAI_API_KEY` from env. */\nexport const openai: OpenAIProvider = createOpenAI();\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/openai-chat-model.ts","../src/openai-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Parse a Server-Sent Events stream into a sequence of `data:` payloads\n * (the bit between `data: ` and the blank line). Comment lines, retries, and\n * other SSE features we don't need are ignored.\n */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<string> {\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.length > 0) {\n const event = extractEvent(buffer);\n if (event !== null) yield event;\n }\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const sepIdx = findEventBoundary(buffer);\n if (sepIdx === -1) break;\n const block = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx).replace(/^(\\r?\\n){2}/, '');\n const event = extractEvent(block);\n if (event !== null) yield event;\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 extractEvent(block: string): string | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data.push(line.slice(5).replace(/^ /, ''));\n }\n }\n if (data.length === 0) return null;\n return 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 { parseSSE } from './util/sse.js';\n\n/**\n * The set of OpenAI chat model ids we explicitly know about. Other strings are\n * still allowed via the `(string & {})` trick — we don't want to lock users out\n * when OpenAI ships a new model before we update the SDK.\n */\nexport type OpenAIChatModelId =\n // Current flagships (verified against openai.com/api/pricing 2026-04-20).\n | 'gpt-5.4'\n | 'gpt-5.4-mini'\n | 'gpt-5.4-nano'\n // Legacy still served on the API.\n | 'gpt-4o'\n | 'gpt-4o-mini'\n // Open string for any model id we haven't enumerated — Budget Guard\n // pre-flight will return `pricingAvailable: false` for unknown ids and\n // fall back to post-call enforcement only.\n | (string & {});\n\ninterface OpenAIChatModelConfig {\n modelId: OpenAIChatModelId;\n baseURL: string;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\nexport class OpenAIChatModel implements LanguageModel {\n readonly provider = 'openai';\n readonly modelId: string;\n private readonly config: OpenAIChatModelConfig;\n\n constructor(config: OpenAIChatModelConfig) {\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('/chat/completions', body, options);\n const json = (await res.json()) as OpenAIChatCompletion;\n\n const choice = json.choices?.[0];\n if (!choice) {\n throw new APICallError({\n message: 'OpenAI response contained no choices.',\n url: `${this.config.baseURL}/chat/completions`,\n statusCode: res.status,\n responseBody: JSON.stringify(json),\n });\n }\n\n const text = choice.message?.content ?? '';\n const toolCalls: ToolCallPart[] =\n choice.message?.tool_calls?.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: safeParseJSON(tc.function.arguments),\n })) ?? [];\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(choice.finish_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('/chat/completions', body, options);\n if (!res.body) {\n throw new APICallError({\n message: 'OpenAI streaming response has no body.',\n statusCode: res.status,\n });\n }\n\n const sse = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n const toolCallsByIndex = new Map<\n number,\n { id: string; name: string; argsBuffer: string }\n >();\n let usage: TokenUsage | undefined;\n let finish: FinishReason = 'unknown';\n\n try {\n for await (const event of sse) {\n if (event === '[DONE]') break;\n const chunk = JSON.parse(event) as OpenAIChatChunk;\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n if (chunk.usage) usage = mapUsage(chunk.usage);\n continue;\n }\n\n const delta = choice.delta;\n if (delta?.content) {\n controller.enqueue({ type: 'text-delta', textDelta: delta.content });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let entry = toolCallsByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id ?? `call_${idx}`,\n name: tc.function?.name ?? '',\n argsBuffer: '',\n };\n toolCallsByIndex.set(idx, entry);\n }\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) {\n entry.argsBuffer += tc.function.arguments;\n controller.enqueue({\n type: 'tool-call-delta',\n toolCallId: entry.id,\n toolName: entry.name,\n argsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n finish = mapFinishReason(choice.finish_reason);\n }\n if (chunk.usage) usage = mapUsage(chunk.usage);\n }\n\n for (const entry of toolCallsByIndex.values()) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: entry.id,\n toolName: entry.name,\n args: safeParseJSON(entry.argsBuffer),\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason: finish,\n usage: usage ?? {},\n });\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. Conservative bounds: assumes the model fills\n * `maxTokens` for the upper bound, and emits ~16 tokens for the lower\n * bound. Returns `pricingAvailable: false` when the SDK has no row for\n * this model id — Budget Guard will then skip USD pre-flight enforcement.\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? defaultOutputCap(this.modelId);\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 body: Record<string, unknown> = {\n model: this.modelId,\n messages: options.messages.map(toOpenAIMessage),\n };\n if (stream) {\n body.stream = true;\n body.stream_options = { include_usage: true };\n }\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n },\n }));\n }\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'string') {\n body.tool_choice = options.toolChoice;\n } else {\n body.tool_choice = {\n type: 'function',\n function: { name: options.toolChoice.toolName },\n };\n }\n }\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.topP !== undefined) body.top_p = options.topP;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.stopSequences !== undefined) body.stop = options.stopSequences;\n if (options.seed !== undefined) body.seed = options.seed;\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: `OpenAI API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\nfunction toOpenAIMessage(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'system': {\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n return { role: 'system', content: text };\n }\n case 'user': {\n const allText = m.content.every((p) => p.type === 'text');\n if (allText) {\n return {\n role: 'user',\n content: m.content.map((p) => (p as { text: string }).text).join(''),\n };\n }\n return {\n role: 'user',\n content: m.content.map((p) => {\n if (p.type === 'text') return { type: 'text', text: p.text };\n if (p.type === 'image') {\n const url =\n typeof p.image === 'string'\n ? p.image\n : p.image instanceof URL\n ? p.image.toString()\n : `data:${p.mimeType ?? 'image/png'};base64,${uint8ToBase64(p.image)}`;\n return { type: 'image_url', image_url: { url } };\n }\n return p;\n }),\n };\n }\n case 'assistant': {\n const toolCalls = m.content.filter((p) => p.type === 'tool-call');\n const text = m.content\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('');\n const out: Record<string, unknown> = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map((tc) => ({\n id: (tc as ToolCallPart).toolCallId,\n type: 'function',\n function: {\n name: (tc as ToolCallPart).toolName,\n arguments: JSON.stringify((tc as ToolCallPart).args ?? {}),\n },\n }));\n }\n return out;\n }\n case 'tool': {\n // OpenAI requires one tool message per result.\n // The caller will need to flatten before passing. We pick the first.\n const first = m.content[0];\n if (!first || first.type !== 'tool-result') {\n return { role: 'tool', content: '', tool_call_id: '' };\n }\n return {\n role: 'tool',\n content: typeof first.result === 'string' ? first.result : JSON.stringify(first.result),\n tool_call_id: first.toolCallId,\n };\n }\n }\n}\n\n/**\n * Bridge `NormalizedMessage[]` (always `ContentPart[]`) to the public\n * `ChatMessage[]` shape `estimateTokensFromMessages` accepts. The estimator\n * only inspects `role` + `content`, so the 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\n/**\n * Default output token cap when the caller didn't pass `maxTokens`. Mirrors\n * OpenAI's typical model defaults; intentionally generous so pre-flight\n * over- rather than underestimates.\n */\nfunction defaultOutputCap(modelId: string): number {\n if (modelId.startsWith('o1') || modelId.startsWith('o3')) return 100_000;\n if (modelId.startsWith('gpt-5')) return 32_768;\n return 16_384;\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\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 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n case 'content_filter':\n return 'content-filter';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\nfunction mapUsage(u: OpenAIUsage | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {};\n if (u.prompt_tokens !== undefined) out.promptTokens = u.prompt_tokens;\n if (u.completion_tokens !== undefined) out.completionTokens = u.completion_tokens;\n if (u.total_tokens !== undefined) out.totalTokens = u.total_tokens;\n if (u.prompt_tokens_details?.cached_tokens !== undefined) {\n out.cachedPromptTokens = u.prompt_tokens_details.cached_tokens;\n }\n if (u.completion_tokens_details?.reasoning_tokens !== undefined) {\n out.reasoningTokens = u.completion_tokens_details.reasoning_tokens;\n }\n return out;\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n}\n\ninterface OpenAIChatCompletion {\n choices?: Array<{\n message?: {\n content?: string;\n tool_calls?: Array<{\n id: string;\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIChatChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: OpenAIUsage;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { OpenAIChatModel, type OpenAIChatModelId } from './openai-chat-model.js';\n\nexport interface OpenAIProviderOptions {\n /** Defaults to `process.env.OPENAI_API_KEY`. */\n apiKey?: string;\n /** Override the base URL (useful for proxies / Azure / OpenRouter). */\n baseURL?: string;\n /** Optional organization id (`OpenAI-Organization` header). */\n organization?: string;\n /** Optional project id (`OpenAI-Project` header). */\n project?: string;\n /** Extra default headers attached to every request. */\n headers?: Record<string, string>;\n /** Custom `fetch`. Defaults to `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\nexport interface OpenAIProvider {\n (modelId: OpenAIChatModelId): LanguageModel;\n chat(modelId: OpenAIChatModelId): LanguageModel;\n}\n\nexport function createOpenAI(options: OpenAIProviderOptions = {}): OpenAIProvider {\n const apiKey = options.apiKey ?? loadEnv('OPENAI_API_KEY');\n const baseURL = options.baseURL ?? 'https://api.openai.com/v1';\n const fetcher = options.fetch ?? globalThis.fetch;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n if (options.organization) headers['OpenAI-Organization'] = options.organization;\n if (options.project) headers['OpenAI-Project'] = options.project;\n\n const make = (modelId: OpenAIChatModelId): LanguageModel =>\n new OpenAIChatModel({\n modelId,\n baseURL,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: OpenAIChatModelId) => make(modelId)) as OpenAIProvider;\n provider.chat = make;\n return provider;\n}\n\n/** Default singleton provider — reads `OPENAI_API_KEY` from env. */\nexport const openai: OpenAIProvider = createOpenAI();\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/openai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "OpenAI provider for ZiroAgent SDK.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
|
-
"homepage": "https://
|
|
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.
|
|
46
|
+
"@ziro-agent/core": "0.2.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",
|