@ziro-agent/google 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -253,29 +253,58 @@ function splitSystem(messages) {
253
253
  const text = sys.flatMap((m) => m.content).filter((p) => p.type === "text").map((p) => p.text).join("\n");
254
254
  return { systemText: text, others };
255
255
  }
256
+ function mapGeminiUserPart(p) {
257
+ if (p.type === "text") return { text: p.text };
258
+ if (p.type === "image") {
259
+ if (typeof p.image === "string") {
260
+ if (p.image.startsWith("data:")) {
261
+ const [meta, data] = p.image.split(",");
262
+ const mime = meta?.replace(/^data:/, "").replace(/;base64$/, "") ?? p.mimeType ?? "image/png";
263
+ return { inlineData: { mimeType: mime, data: data ?? "" } };
264
+ }
265
+ return { fileData: { mimeType: p.mimeType ?? "image/png", fileUri: p.image } };
266
+ }
267
+ return {
268
+ inlineData: {
269
+ mimeType: p.mimeType ?? "image/png",
270
+ data: uint8ToBase64(p.image)
271
+ }
272
+ };
273
+ }
274
+ if (p.type === "audio") {
275
+ const r = core.resolveMediaInput(p.audio);
276
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "audio/wav";
277
+ if ("url" in r) {
278
+ return { fileData: { mimeType: mime, fileUri: r.url } };
279
+ }
280
+ return { inlineData: { mimeType: mime, data: r.base64 } };
281
+ }
282
+ if (p.type === "file") {
283
+ const r = core.resolveMediaInput(p.file);
284
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "application/octet-stream";
285
+ if ("url" in r) {
286
+ return { fileData: { mimeType: mime, fileUri: r.url } };
287
+ }
288
+ return { inlineData: { mimeType: mime, data: r.base64 } };
289
+ }
290
+ if (p.type === "video") {
291
+ const r = core.resolveMediaInput(p.video);
292
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "video/mp4";
293
+ if ("url" in r) {
294
+ return { fileData: { mimeType: mime, fileUri: r.url } };
295
+ }
296
+ return { inlineData: { mimeType: mime, data: r.base64 } };
297
+ }
298
+ throw new core.UnsupportedPartError({
299
+ partType: p.type ?? "unknown",
300
+ provider: "google",
301
+ message: "Unexpected content part in user message."
302
+ });
303
+ }
256
304
  function toGeminiContent(m) {
257
305
  switch (m.role) {
258
306
  case "user": {
259
- const parts = m.content.map((p) => {
260
- if (p.type === "text") return { text: p.text };
261
- if (p.type === "image") {
262
- if (typeof p.image === "string") {
263
- if (p.image.startsWith("data:")) {
264
- const [meta, data] = p.image.split(",");
265
- const mime = meta?.replace(/^data:/, "").replace(/;base64$/, "") ?? p.mimeType ?? "image/png";
266
- return { inlineData: { mimeType: mime, data: data ?? "" } };
267
- }
268
- return { fileData: { mimeType: p.mimeType ?? "image/png", fileUri: p.image } };
269
- }
270
- return {
271
- inlineData: {
272
- mimeType: p.mimeType ?? "image/png",
273
- data: uint8ToBase64(p.image)
274
- }
275
- };
276
- }
277
- return p;
278
- });
307
+ const parts = m.content.map((p) => mapGeminiUserPart(p));
279
308
  return { role: "user", parts };
280
309
  }
281
310
  case "assistant": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/sse.ts","../src/google-generative-model.ts","../src/google-provider.ts"],"names":["APICallError","estimateTokensFromMessages","pricing","getPricing"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Gemini streams SSE chunks where each `data:` line is a JSON-encoded\n * `GenerateContentResponse`. Unlike Anthropic, Gemini does not use\n * `event:` framing — each block is one JSON delta. We yield raw `data`\n * strings; the model layer JSON-parses them.\n *\n * Vendored locally (instead of importing from the Anthropic provider)\n * to keep these provider packages mutually independent.\n */\nexport interface SSEDataEvent {\n data: string;\n}\n\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<SSEDataEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEDataEvent | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0) return null;\n return { data: data.join('\\n') };\n}\n","import {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n type TokenUsage,\n type ToolCallPart,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSE } from './util/sse.js';\n\nexport type GoogleGenerativeModelId =\n // Current 2026 lineup (verified against ai.google.dev/pricing 2026-04-22).\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-lite'\n // Stable 2.0-series.\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-lite'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface GoogleGenerativeModelConfig {\n modelId: GoogleGenerativeModelId;\n baseURL: string;\n apiKey: string | undefined;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\n/**\n * Adapter for Google's Generative Language API (`generativelanguage.googleapis.com`).\n *\n * Notes about Gemini's wire format that drove these design choices:\n * - The system prompt lives at the top level as `systemInstruction`,\n * NOT in `contents`. We hoist out any `system` messages from the\n * normalized message list before serialising.\n * - Roles are `user` and `model` (not `assistant`). Tool results come\n * back as `user` messages with `functionResponse` parts.\n * - Tool calls do NOT carry an id from the API. We synthesize one from\n * `name+index` so downstream tool-result correlation still works.\n * - Streaming is `:streamGenerateContent?alt=sse`, not WebSocket.\n *\n * For Vertex AI auth (OAuth instead of API key) build a custom config\n * by replacing `headers` and `baseURL`; the adapter contract is the same.\n */\nexport class GoogleGenerativeModel implements LanguageModel {\n readonly provider = 'google';\n readonly modelId: string;\n private readonly config: GoogleGenerativeModelConfig;\n\n constructor(config: GoogleGenerativeModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options);\n const res = await this.fetch(`/models/${this.modelId}:generateContent`, body, options);\n const json = (await res.json()) as GeminiGenerateContentResponse;\n\n const candidate = json.candidates?.[0];\n const parts = candidate?.content?.parts ?? [];\n\n const text = parts\n .filter((p): p is { text: string } => typeof (p as { text?: unknown }).text === 'string')\n .map((p) => p.text)\n .join('');\n\n const toolCalls: ToolCallPart[] = [];\n let toolIdx = 0;\n for (const part of parts) {\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n toolCalls.push({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx++),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n }\n }\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage: mapUsage(json.usageMetadata),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options);\n const res = await this.fetch(\n `/models/${this.modelId}:streamGenerateContent?alt=sse`,\n body,\n options,\n );\n if (!res.body) {\n throw new APICallError({\n message: 'Gemini streaming response has no body.',\n statusCode: res.status,\n });\n }\n const events = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n // Gemini streams complete tool calls inside `functionCall` parts;\n // it does not emit incremental `argsDelta`. We track which calls\n // we've already flushed by name+ordinal so we don't double-emit\n // when the model includes the same functionCall in a later\n // SSE chunk's full snapshot (rare but possible).\n let toolIdx = 0;\n const seen = new Set<string>();\n\n try {\n for await (const evt of events) {\n const data = parseChunk(evt.data);\n if (!data) continue;\n\n const cand = data.candidates?.[0];\n const parts = cand?.content?.parts ?? [];\n for (const part of parts) {\n if (typeof (part as { text?: unknown }).text === 'string') {\n const t = (part as { text: string }).text;\n if (t.length > 0) controller.enqueue({ type: 'text-delta', textDelta: t });\n }\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n const key = `${fc.name}#${toolIdx}`;\n if (!seen.has(key)) {\n seen.add(key);\n controller.enqueue({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n toolIdx++;\n }\n }\n }\n if (cand?.finishReason) finish = mapFinishReason(cand.finishReason);\n if (data.usageMetadata) usage = mergeUsage(usage, mapUsage(data.usageMetadata));\n }\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Mirror the Anthropic adapter — assume\n * `maxTokens` (or 8192 default) is consumed for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the\n * model (note: Gemini rate cards are marked `unverified` until\n * cross-checked, so the default branch still kicks in for the 2.5-series).\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 8192;\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): Record<string, unknown> {\n const { systemText, others } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n contents: others.map(toGeminiContent),\n };\n if (systemText) {\n body.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools?.length) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n })),\n },\n ];\n }\n\n if (options.toolChoice !== undefined) {\n // Gemini's tool config is wrapped in `toolConfig.functionCallingConfig`.\n const cfg: Record<string, unknown> = {};\n if (options.toolChoice === 'auto') cfg.mode = 'AUTO';\n else if (options.toolChoice === 'none') cfg.mode = 'NONE';\n else if (options.toolChoice === 'required') cfg.mode = 'ANY';\n else if (typeof options.toolChoice === 'object') {\n cfg.mode = 'ANY';\n cfg.allowedFunctionNames = [options.toolChoice.toolName];\n }\n body.toolConfig = { functionCallingConfig: cfg };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options.temperature !== undefined) generationConfig.temperature = options.temperature;\n if (options.topP !== undefined) generationConfig.topP = options.topP;\n if (options.topK !== undefined) generationConfig.topK = options.topK;\n if (options.maxTokens !== undefined) generationConfig.maxOutputTokens = options.maxTokens;\n if (options.stopSequences !== undefined) generationConfig.stopSequences = options.stopSequences;\n if (options.seed !== undefined) generationConfig.seed = options.seed;\n if (Object.keys(generationConfig).length > 0) body.generationConfig = generationConfig;\n\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 let url = `${this.config.baseURL}${path}`;\n // Prefer header auth when the consumer passed a custom Bearer header\n // (Vertex AI / OAuth path). Otherwise fall back to the documented\n // `?key=...` query parameter for the public Generative Language API.\n const usingHeaderAuth =\n this.config.headers.Authorization !== undefined ||\n this.config.headers.authorization !== undefined;\n if (this.config.apiKey && !usingHeaderAuth) {\n url += url.includes('?') ? `&key=${this.config.apiKey}` : `?key=${this.config.apiKey}`;\n }\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: `Google Gemini API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/** See AnthropicMessagesModel for the rationale of this structural cast. */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n systemText?: string;\n others: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const others = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { others };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { systemText: text, others };\n}\n\nfunction toGeminiContent(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n // Heuristic: data URL → inlineData; else → fileData.\n if (p.image.startsWith('data:')) {\n const [meta, data] = p.image.split(',');\n const mime =\n meta?.replace(/^data:/, '').replace(/;base64$/, '') ?? p.mimeType ?? 'image/png';\n return { inlineData: { mimeType: mime, data: data ?? '' } };\n }\n return { fileData: { mimeType: p.mimeType ?? 'image/png', fileUri: p.image } };\n }\n return {\n inlineData: {\n mimeType: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n return p;\n });\n return { role: 'user', parts };\n }\n case 'assistant': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'tool-call') {\n return { functionCall: { name: p.toolName, args: p.args ?? {} } };\n }\n return p;\n });\n return { role: 'model', parts };\n }\n case 'tool': {\n // Gemini wraps tool results inside a `user` content with\n // `functionResponse` parts. The response content must be JSON-y;\n // we wrap raw strings in `{ result: \"...\" }` to comply.\n const parts = m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n functionResponse: {\n name: r.toolName,\n response:\n typeof r.result === 'object' && r.result !== null\n ? r.result\n : { result: r.result, ...(r.isError ? { error: true } : {}) },\n },\n }));\n return { role: 'user', parts };\n }\n case 'system':\n // System is hoisted in `splitSystem`; this branch should be unreachable.\n return { role: 'user', parts: [{ text: '' }] };\n }\n}\n\n/**\n * Gemini's API never returns a stable per-call id for tool calls. We\n * synthesize one from `<name>_<idx>` so downstream tool-result lookup\n * still has something to correlate on. The `gemini_` prefix makes it\n * obvious these are SDK-generated, not provider-supplied.\n */\nfunction synthesizeToolCallId(name: string, idx: number): string {\n return `gemini_${name}_${idx}`;\n}\n\nfunction parseChunk(raw: string): GeminiGenerateContentResponse | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as GeminiGenerateContentResponse;\n } catch {\n return null;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n case 'PROHIBITED_CONTENT':\n case 'BLOCKLIST':\n case 'SPII':\n return 'content-filter';\n case 'TOOL_CALL':\n return 'tool-calls';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n}\n\nfunction mapUsage(u: GeminiUsageMetadata | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {\n promptTokens: u.promptTokenCount,\n completionTokens: u.candidatesTokenCount,\n totalTokens: u.totalTokenCount,\n };\n if (u.cachedContentTokenCount !== undefined) out.cachedPromptTokens = u.cachedContentTokenCount;\n if (\n out.totalTokens === undefined &&\n out.promptTokens !== undefined &&\n out.completionTokens !== undefined\n ) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n // Gemini emits the cumulative usage at the END of the stream, so on\n // each chunk we just keep the latest non-undefined values rather than\n // summing — summing would double-count. Match `b` over `a` field-wise.\n return {\n promptTokens: b.promptTokens ?? a.promptTokens,\n completionTokens: b.completionTokens ?? a.completionTokens,\n totalTokens: b.totalTokens ?? a.totalTokens,\n cachedPromptTokens: b.cachedPromptTokens ?? a.cachedPromptTokens,\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface GeminiGenerateContentResponse {\n candidates?: Array<{\n content?: {\n role?: string;\n parts?: Array<{ text: string } | { functionCall: { name: string; args?: unknown } }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: GeminiUsageMetadata;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { GoogleGenerativeModel, type GoogleGenerativeModelId } from './google-generative-model.js';\n\nexport interface GoogleProviderOptions {\n /** Defaults to `process.env.GOOGLE_GENERATIVE_AI_API_KEY` (or `GEMINI_API_KEY`). */\n apiKey?: string;\n /** Defaults to `https://generativelanguage.googleapis.com/v1beta`. */\n baseURL?: string;\n /** Extra headers (e.g. for Vertex OAuth bearer auth). */\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface GoogleProvider {\n (modelId: GoogleGenerativeModelId): LanguageModel;\n generative(modelId: GoogleGenerativeModelId): LanguageModel;\n}\n\nexport function createGoogle(options: GoogleProviderOptions = {}): GoogleProvider {\n const apiKey =\n options.apiKey ?? loadEnv('GOOGLE_GENERATIVE_AI_API_KEY') ?? loadEnv('GEMINI_API_KEY');\n const baseURL = options.baseURL ?? 'https://generativelanguage.googleapis.com/v1beta';\n const fetcher = options.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const make = (modelId: GoogleGenerativeModelId): LanguageModel =>\n new GoogleGenerativeModel({\n modelId,\n baseURL,\n apiKey,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: GoogleGenerativeModelId) => make(modelId)) as GoogleProvider;\n provider.generative = make;\n return provider;\n}\n\nexport const google: GoogleProvider = createGoogle();\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/google-generative-model.ts","../src/google-provider.ts"],"names":["APICallError","estimateTokensFromMessages","pricing","getPricing","resolveMediaInput","UnsupportedPartError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Gemini streams SSE chunks where each `data:` line is a JSON-encoded\n * `GenerateContentResponse`. Unlike Anthropic, Gemini does not use\n * `event:` framing — each block is one JSON delta. We yield raw `data`\n * strings; the model layer JSON-parses them.\n *\n * Vendored locally (instead of importing from the Anthropic provider)\n * to keep these provider packages mutually independent.\n */\nexport interface SSEDataEvent {\n data: string;\n}\n\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<SSEDataEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEDataEvent | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0) return null;\n return { data: data.join('\\n') };\n}\n","import type { ContentPart } from '@ziro-agent/core';\nimport {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n resolveMediaInput,\n type TokenUsage,\n type ToolCallPart,\n UnsupportedPartError,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSE } from './util/sse.js';\n\nexport type GoogleGenerativeModelId =\n // Current 2026 lineup (verified against ai.google.dev/pricing 2026-04-22).\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-lite'\n // Stable 2.0-series.\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-lite'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface GoogleGenerativeModelConfig {\n modelId: GoogleGenerativeModelId;\n baseURL: string;\n apiKey: string | undefined;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\n/**\n * Adapter for Google's Generative Language API (`generativelanguage.googleapis.com`).\n *\n * Notes about Gemini's wire format that drove these design choices:\n * - The system prompt lives at the top level as `systemInstruction`,\n * NOT in `contents`. We hoist out any `system` messages from the\n * normalized message list before serialising.\n * - Roles are `user` and `model` (not `assistant`). Tool results come\n * back as `user` messages with `functionResponse` parts.\n * - Tool calls do NOT carry an id from the API. We synthesize one from\n * `name+index` so downstream tool-result correlation still works.\n * - Streaming is `:streamGenerateContent?alt=sse`, not WebSocket.\n *\n * For Vertex AI auth (OAuth instead of API key) build a custom config\n * by replacing `headers` and `baseURL`; the adapter contract is the same.\n */\nexport class GoogleGenerativeModel implements LanguageModel {\n readonly provider = 'google';\n readonly modelId: string;\n private readonly config: GoogleGenerativeModelConfig;\n\n constructor(config: GoogleGenerativeModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options);\n const res = await this.fetch(`/models/${this.modelId}:generateContent`, body, options);\n const json = (await res.json()) as GeminiGenerateContentResponse;\n\n const candidate = json.candidates?.[0];\n const parts = candidate?.content?.parts ?? [];\n\n const text = parts\n .filter((p): p is { text: string } => typeof (p as { text?: unknown }).text === 'string')\n .map((p) => p.text)\n .join('');\n\n const toolCalls: ToolCallPart[] = [];\n let toolIdx = 0;\n for (const part of parts) {\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n toolCalls.push({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx++),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n }\n }\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage: mapUsage(json.usageMetadata),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options);\n const res = await this.fetch(\n `/models/${this.modelId}:streamGenerateContent?alt=sse`,\n body,\n options,\n );\n if (!res.body) {\n throw new APICallError({\n message: 'Gemini streaming response has no body.',\n statusCode: res.status,\n });\n }\n const events = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n // Gemini streams complete tool calls inside `functionCall` parts;\n // it does not emit incremental `argsDelta`. We track which calls\n // we've already flushed by name+ordinal so we don't double-emit\n // when the model includes the same functionCall in a later\n // SSE chunk's full snapshot (rare but possible).\n let toolIdx = 0;\n const seen = new Set<string>();\n\n try {\n for await (const evt of events) {\n const data = parseChunk(evt.data);\n if (!data) continue;\n\n const cand = data.candidates?.[0];\n const parts = cand?.content?.parts ?? [];\n for (const part of parts) {\n if (typeof (part as { text?: unknown }).text === 'string') {\n const t = (part as { text: string }).text;\n if (t.length > 0) controller.enqueue({ type: 'text-delta', textDelta: t });\n }\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n const key = `${fc.name}#${toolIdx}`;\n if (!seen.has(key)) {\n seen.add(key);\n controller.enqueue({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n toolIdx++;\n }\n }\n }\n if (cand?.finishReason) finish = mapFinishReason(cand.finishReason);\n if (data.usageMetadata) usage = mergeUsage(usage, mapUsage(data.usageMetadata));\n }\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Mirror the Anthropic adapter — assume\n * `maxTokens` (or 8192 default) is consumed for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the\n * model (note: Gemini rate cards are marked `unverified` until\n * cross-checked, so the default branch still kicks in for the 2.5-series).\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 8192;\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): Record<string, unknown> {\n const { systemText, others } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n contents: others.map(toGeminiContent),\n };\n if (systemText) {\n body.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools?.length) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n })),\n },\n ];\n }\n\n if (options.toolChoice !== undefined) {\n // Gemini's tool config is wrapped in `toolConfig.functionCallingConfig`.\n const cfg: Record<string, unknown> = {};\n if (options.toolChoice === 'auto') cfg.mode = 'AUTO';\n else if (options.toolChoice === 'none') cfg.mode = 'NONE';\n else if (options.toolChoice === 'required') cfg.mode = 'ANY';\n else if (typeof options.toolChoice === 'object') {\n cfg.mode = 'ANY';\n cfg.allowedFunctionNames = [options.toolChoice.toolName];\n }\n body.toolConfig = { functionCallingConfig: cfg };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options.temperature !== undefined) generationConfig.temperature = options.temperature;\n if (options.topP !== undefined) generationConfig.topP = options.topP;\n if (options.topK !== undefined) generationConfig.topK = options.topK;\n if (options.maxTokens !== undefined) generationConfig.maxOutputTokens = options.maxTokens;\n if (options.stopSequences !== undefined) generationConfig.stopSequences = options.stopSequences;\n if (options.seed !== undefined) generationConfig.seed = options.seed;\n if (Object.keys(generationConfig).length > 0) body.generationConfig = generationConfig;\n\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 let url = `${this.config.baseURL}${path}`;\n // Prefer header auth when the consumer passed a custom Bearer header\n // (Vertex AI / OAuth path). Otherwise fall back to the documented\n // `?key=...` query parameter for the public Generative Language API.\n const usingHeaderAuth =\n this.config.headers.Authorization !== undefined ||\n this.config.headers.authorization !== undefined;\n if (this.config.apiKey && !usingHeaderAuth) {\n url += url.includes('?') ? `&key=${this.config.apiKey}` : `?key=${this.config.apiKey}`;\n }\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: `Google Gemini API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/** See AnthropicMessagesModel for the rationale of this structural cast. */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n systemText?: string;\n others: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const others = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { others };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { systemText: text, others };\n}\n\nfunction mapGeminiUserPart(p: ContentPart): unknown {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n if (p.image.startsWith('data:')) {\n const [meta, data] = p.image.split(',');\n const mime =\n meta?.replace(/^data:/, '').replace(/;base64$/, '') ?? p.mimeType ?? 'image/png';\n return { inlineData: { mimeType: mime, data: data ?? '' } };\n }\n return { fileData: { mimeType: p.mimeType ?? 'image/png', fileUri: p.image } };\n }\n return {\n inlineData: {\n mimeType: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n if (p.type === 'audio') {\n const r = resolveMediaInput(p.audio);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'audio/wav';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n if (p.type === 'file') {\n const r = resolveMediaInput(p.file);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'application/octet-stream';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n if (p.type === 'video') {\n const r = resolveMediaInput(p.video);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'video/mp4';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n throw new UnsupportedPartError({\n partType: (p as { type?: string }).type ?? 'unknown',\n provider: 'google',\n message: 'Unexpected content part in user message.',\n });\n}\n\nfunction toGeminiContent(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const parts = m.content.map((p) => mapGeminiUserPart(p));\n return { role: 'user', parts };\n }\n case 'assistant': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'tool-call') {\n return { functionCall: { name: p.toolName, args: p.args ?? {} } };\n }\n return p;\n });\n return { role: 'model', parts };\n }\n case 'tool': {\n // Gemini wraps tool results inside a `user` content with\n // `functionResponse` parts. The response content must be JSON-y;\n // we wrap raw strings in `{ result: \"...\" }` to comply.\n const parts = m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n functionResponse: {\n name: r.toolName,\n response:\n typeof r.result === 'object' && r.result !== null\n ? r.result\n : { result: r.result, ...(r.isError ? { error: true } : {}) },\n },\n }));\n return { role: 'user', parts };\n }\n case 'system':\n // System is hoisted in `splitSystem`; this branch should be unreachable.\n return { role: 'user', parts: [{ text: '' }] };\n }\n}\n\n/**\n * Gemini's API never returns a stable per-call id for tool calls. We\n * synthesize one from `<name>_<idx>` so downstream tool-result lookup\n * still has something to correlate on. The `gemini_` prefix makes it\n * obvious these are SDK-generated, not provider-supplied.\n */\nfunction synthesizeToolCallId(name: string, idx: number): string {\n return `gemini_${name}_${idx}`;\n}\n\nfunction parseChunk(raw: string): GeminiGenerateContentResponse | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as GeminiGenerateContentResponse;\n } catch {\n return null;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n case 'PROHIBITED_CONTENT':\n case 'BLOCKLIST':\n case 'SPII':\n return 'content-filter';\n case 'TOOL_CALL':\n return 'tool-calls';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n}\n\nfunction mapUsage(u: GeminiUsageMetadata | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {\n promptTokens: u.promptTokenCount,\n completionTokens: u.candidatesTokenCount,\n totalTokens: u.totalTokenCount,\n };\n if (u.cachedContentTokenCount !== undefined) out.cachedPromptTokens = u.cachedContentTokenCount;\n if (\n out.totalTokens === undefined &&\n out.promptTokens !== undefined &&\n out.completionTokens !== undefined\n ) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n // Gemini emits the cumulative usage at the END of the stream, so on\n // each chunk we just keep the latest non-undefined values rather than\n // summing — summing would double-count. Match `b` over `a` field-wise.\n return {\n promptTokens: b.promptTokens ?? a.promptTokens,\n completionTokens: b.completionTokens ?? a.completionTokens,\n totalTokens: b.totalTokens ?? a.totalTokens,\n cachedPromptTokens: b.cachedPromptTokens ?? a.cachedPromptTokens,\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface GeminiGenerateContentResponse {\n candidates?: Array<{\n content?: {\n role?: string;\n parts?: Array<{ text: string } | { functionCall: { name: string; args?: unknown } }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: GeminiUsageMetadata;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { GoogleGenerativeModel, type GoogleGenerativeModelId } from './google-generative-model.js';\n\nexport interface GoogleProviderOptions {\n /** Defaults to `process.env.GOOGLE_GENERATIVE_AI_API_KEY` (or `GEMINI_API_KEY`). */\n apiKey?: string;\n /** Defaults to `https://generativelanguage.googleapis.com/v1beta`. */\n baseURL?: string;\n /** Extra headers (e.g. for Vertex OAuth bearer auth). */\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface GoogleProvider {\n (modelId: GoogleGenerativeModelId): LanguageModel;\n generative(modelId: GoogleGenerativeModelId): LanguageModel;\n}\n\nexport function createGoogle(options: GoogleProviderOptions = {}): GoogleProvider {\n const apiKey =\n options.apiKey ?? loadEnv('GOOGLE_GENERATIVE_AI_API_KEY') ?? loadEnv('GEMINI_API_KEY');\n const baseURL = options.baseURL ?? 'https://generativelanguage.googleapis.com/v1beta';\n const fetcher = options.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const make = (modelId: GoogleGenerativeModelId): LanguageModel =>\n new GoogleGenerativeModel({\n modelId,\n baseURL,\n apiKey,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: GoogleGenerativeModelId) => make(modelId)) as GoogleProvider;\n provider.generative = make;\n return provider;\n}\n\nexport const google: GoogleProvider = createGoogle();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { APICallError, estimateTokensFromMessages } from '@ziro-agent/core';
1
+ import { APICallError, estimateTokensFromMessages, resolveMediaInput, UnsupportedPartError } from '@ziro-agent/core';
2
2
  import { getPricing } from '@ziro-agent/core/pricing';
3
3
 
4
4
  // src/google-generative-model.ts
@@ -251,29 +251,58 @@ function splitSystem(messages) {
251
251
  const text = sys.flatMap((m) => m.content).filter((p) => p.type === "text").map((p) => p.text).join("\n");
252
252
  return { systemText: text, others };
253
253
  }
254
+ function mapGeminiUserPart(p) {
255
+ if (p.type === "text") return { text: p.text };
256
+ if (p.type === "image") {
257
+ if (typeof p.image === "string") {
258
+ if (p.image.startsWith("data:")) {
259
+ const [meta, data] = p.image.split(",");
260
+ const mime = meta?.replace(/^data:/, "").replace(/;base64$/, "") ?? p.mimeType ?? "image/png";
261
+ return { inlineData: { mimeType: mime, data: data ?? "" } };
262
+ }
263
+ return { fileData: { mimeType: p.mimeType ?? "image/png", fileUri: p.image } };
264
+ }
265
+ return {
266
+ inlineData: {
267
+ mimeType: p.mimeType ?? "image/png",
268
+ data: uint8ToBase64(p.image)
269
+ }
270
+ };
271
+ }
272
+ if (p.type === "audio") {
273
+ const r = resolveMediaInput(p.audio);
274
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "audio/wav";
275
+ if ("url" in r) {
276
+ return { fileData: { mimeType: mime, fileUri: r.url } };
277
+ }
278
+ return { inlineData: { mimeType: mime, data: r.base64 } };
279
+ }
280
+ if (p.type === "file") {
281
+ const r = resolveMediaInput(p.file);
282
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "application/octet-stream";
283
+ if ("url" in r) {
284
+ return { fileData: { mimeType: mime, fileUri: r.url } };
285
+ }
286
+ return { inlineData: { mimeType: mime, data: r.base64 } };
287
+ }
288
+ if (p.type === "video") {
289
+ const r = resolveMediaInput(p.video);
290
+ const mime = p.mimeType ?? ("url" in r ? void 0 : r.mimeType) ?? "video/mp4";
291
+ if ("url" in r) {
292
+ return { fileData: { mimeType: mime, fileUri: r.url } };
293
+ }
294
+ return { inlineData: { mimeType: mime, data: r.base64 } };
295
+ }
296
+ throw new UnsupportedPartError({
297
+ partType: p.type ?? "unknown",
298
+ provider: "google",
299
+ message: "Unexpected content part in user message."
300
+ });
301
+ }
254
302
  function toGeminiContent(m) {
255
303
  switch (m.role) {
256
304
  case "user": {
257
- const parts = m.content.map((p) => {
258
- if (p.type === "text") return { text: p.text };
259
- if (p.type === "image") {
260
- if (typeof p.image === "string") {
261
- if (p.image.startsWith("data:")) {
262
- const [meta, data] = p.image.split(",");
263
- const mime = meta?.replace(/^data:/, "").replace(/;base64$/, "") ?? p.mimeType ?? "image/png";
264
- return { inlineData: { mimeType: mime, data: data ?? "" } };
265
- }
266
- return { fileData: { mimeType: p.mimeType ?? "image/png", fileUri: p.image } };
267
- }
268
- return {
269
- inlineData: {
270
- mimeType: p.mimeType ?? "image/png",
271
- data: uint8ToBase64(p.image)
272
- }
273
- };
274
- }
275
- return p;
276
- });
305
+ const parts = m.content.map((p) => mapGeminiUserPart(p));
277
306
  return { role: "user", parts };
278
307
  }
279
308
  case "assistant": {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/sse.ts","../src/google-generative-model.ts","../src/google-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Gemini streams SSE chunks where each `data:` line is a JSON-encoded\n * `GenerateContentResponse`. Unlike Anthropic, Gemini does not use\n * `event:` framing — each block is one JSON delta. We yield raw `data`\n * strings; the model layer JSON-parses them.\n *\n * Vendored locally (instead of importing from the Anthropic provider)\n * to keep these provider packages mutually independent.\n */\nexport interface SSEDataEvent {\n data: string;\n}\n\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<SSEDataEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEDataEvent | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0) return null;\n return { data: data.join('\\n') };\n}\n","import {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n type TokenUsage,\n type ToolCallPart,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSE } from './util/sse.js';\n\nexport type GoogleGenerativeModelId =\n // Current 2026 lineup (verified against ai.google.dev/pricing 2026-04-22).\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-lite'\n // Stable 2.0-series.\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-lite'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface GoogleGenerativeModelConfig {\n modelId: GoogleGenerativeModelId;\n baseURL: string;\n apiKey: string | undefined;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\n/**\n * Adapter for Google's Generative Language API (`generativelanguage.googleapis.com`).\n *\n * Notes about Gemini's wire format that drove these design choices:\n * - The system prompt lives at the top level as `systemInstruction`,\n * NOT in `contents`. We hoist out any `system` messages from the\n * normalized message list before serialising.\n * - Roles are `user` and `model` (not `assistant`). Tool results come\n * back as `user` messages with `functionResponse` parts.\n * - Tool calls do NOT carry an id from the API. We synthesize one from\n * `name+index` so downstream tool-result correlation still works.\n * - Streaming is `:streamGenerateContent?alt=sse`, not WebSocket.\n *\n * For Vertex AI auth (OAuth instead of API key) build a custom config\n * by replacing `headers` and `baseURL`; the adapter contract is the same.\n */\nexport class GoogleGenerativeModel implements LanguageModel {\n readonly provider = 'google';\n readonly modelId: string;\n private readonly config: GoogleGenerativeModelConfig;\n\n constructor(config: GoogleGenerativeModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options);\n const res = await this.fetch(`/models/${this.modelId}:generateContent`, body, options);\n const json = (await res.json()) as GeminiGenerateContentResponse;\n\n const candidate = json.candidates?.[0];\n const parts = candidate?.content?.parts ?? [];\n\n const text = parts\n .filter((p): p is { text: string } => typeof (p as { text?: unknown }).text === 'string')\n .map((p) => p.text)\n .join('');\n\n const toolCalls: ToolCallPart[] = [];\n let toolIdx = 0;\n for (const part of parts) {\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n toolCalls.push({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx++),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n }\n }\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage: mapUsage(json.usageMetadata),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options);\n const res = await this.fetch(\n `/models/${this.modelId}:streamGenerateContent?alt=sse`,\n body,\n options,\n );\n if (!res.body) {\n throw new APICallError({\n message: 'Gemini streaming response has no body.',\n statusCode: res.status,\n });\n }\n const events = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n // Gemini streams complete tool calls inside `functionCall` parts;\n // it does not emit incremental `argsDelta`. We track which calls\n // we've already flushed by name+ordinal so we don't double-emit\n // when the model includes the same functionCall in a later\n // SSE chunk's full snapshot (rare but possible).\n let toolIdx = 0;\n const seen = new Set<string>();\n\n try {\n for await (const evt of events) {\n const data = parseChunk(evt.data);\n if (!data) continue;\n\n const cand = data.candidates?.[0];\n const parts = cand?.content?.parts ?? [];\n for (const part of parts) {\n if (typeof (part as { text?: unknown }).text === 'string') {\n const t = (part as { text: string }).text;\n if (t.length > 0) controller.enqueue({ type: 'text-delta', textDelta: t });\n }\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n const key = `${fc.name}#${toolIdx}`;\n if (!seen.has(key)) {\n seen.add(key);\n controller.enqueue({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n toolIdx++;\n }\n }\n }\n if (cand?.finishReason) finish = mapFinishReason(cand.finishReason);\n if (data.usageMetadata) usage = mergeUsage(usage, mapUsage(data.usageMetadata));\n }\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Mirror the Anthropic adapter — assume\n * `maxTokens` (or 8192 default) is consumed for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the\n * model (note: Gemini rate cards are marked `unverified` until\n * cross-checked, so the default branch still kicks in for the 2.5-series).\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 8192;\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): Record<string, unknown> {\n const { systemText, others } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n contents: others.map(toGeminiContent),\n };\n if (systemText) {\n body.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools?.length) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n })),\n },\n ];\n }\n\n if (options.toolChoice !== undefined) {\n // Gemini's tool config is wrapped in `toolConfig.functionCallingConfig`.\n const cfg: Record<string, unknown> = {};\n if (options.toolChoice === 'auto') cfg.mode = 'AUTO';\n else if (options.toolChoice === 'none') cfg.mode = 'NONE';\n else if (options.toolChoice === 'required') cfg.mode = 'ANY';\n else if (typeof options.toolChoice === 'object') {\n cfg.mode = 'ANY';\n cfg.allowedFunctionNames = [options.toolChoice.toolName];\n }\n body.toolConfig = { functionCallingConfig: cfg };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options.temperature !== undefined) generationConfig.temperature = options.temperature;\n if (options.topP !== undefined) generationConfig.topP = options.topP;\n if (options.topK !== undefined) generationConfig.topK = options.topK;\n if (options.maxTokens !== undefined) generationConfig.maxOutputTokens = options.maxTokens;\n if (options.stopSequences !== undefined) generationConfig.stopSequences = options.stopSequences;\n if (options.seed !== undefined) generationConfig.seed = options.seed;\n if (Object.keys(generationConfig).length > 0) body.generationConfig = generationConfig;\n\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 let url = `${this.config.baseURL}${path}`;\n // Prefer header auth when the consumer passed a custom Bearer header\n // (Vertex AI / OAuth path). Otherwise fall back to the documented\n // `?key=...` query parameter for the public Generative Language API.\n const usingHeaderAuth =\n this.config.headers.Authorization !== undefined ||\n this.config.headers.authorization !== undefined;\n if (this.config.apiKey && !usingHeaderAuth) {\n url += url.includes('?') ? `&key=${this.config.apiKey}` : `?key=${this.config.apiKey}`;\n }\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: `Google Gemini API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/** See AnthropicMessagesModel for the rationale of this structural cast. */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n systemText?: string;\n others: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const others = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { others };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { systemText: text, others };\n}\n\nfunction toGeminiContent(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n // Heuristic: data URL → inlineData; else → fileData.\n if (p.image.startsWith('data:')) {\n const [meta, data] = p.image.split(',');\n const mime =\n meta?.replace(/^data:/, '').replace(/;base64$/, '') ?? p.mimeType ?? 'image/png';\n return { inlineData: { mimeType: mime, data: data ?? '' } };\n }\n return { fileData: { mimeType: p.mimeType ?? 'image/png', fileUri: p.image } };\n }\n return {\n inlineData: {\n mimeType: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n return p;\n });\n return { role: 'user', parts };\n }\n case 'assistant': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'tool-call') {\n return { functionCall: { name: p.toolName, args: p.args ?? {} } };\n }\n return p;\n });\n return { role: 'model', parts };\n }\n case 'tool': {\n // Gemini wraps tool results inside a `user` content with\n // `functionResponse` parts. The response content must be JSON-y;\n // we wrap raw strings in `{ result: \"...\" }` to comply.\n const parts = m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n functionResponse: {\n name: r.toolName,\n response:\n typeof r.result === 'object' && r.result !== null\n ? r.result\n : { result: r.result, ...(r.isError ? { error: true } : {}) },\n },\n }));\n return { role: 'user', parts };\n }\n case 'system':\n // System is hoisted in `splitSystem`; this branch should be unreachable.\n return { role: 'user', parts: [{ text: '' }] };\n }\n}\n\n/**\n * Gemini's API never returns a stable per-call id for tool calls. We\n * synthesize one from `<name>_<idx>` so downstream tool-result lookup\n * still has something to correlate on. The `gemini_` prefix makes it\n * obvious these are SDK-generated, not provider-supplied.\n */\nfunction synthesizeToolCallId(name: string, idx: number): string {\n return `gemini_${name}_${idx}`;\n}\n\nfunction parseChunk(raw: string): GeminiGenerateContentResponse | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as GeminiGenerateContentResponse;\n } catch {\n return null;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n case 'PROHIBITED_CONTENT':\n case 'BLOCKLIST':\n case 'SPII':\n return 'content-filter';\n case 'TOOL_CALL':\n return 'tool-calls';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n}\n\nfunction mapUsage(u: GeminiUsageMetadata | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {\n promptTokens: u.promptTokenCount,\n completionTokens: u.candidatesTokenCount,\n totalTokens: u.totalTokenCount,\n };\n if (u.cachedContentTokenCount !== undefined) out.cachedPromptTokens = u.cachedContentTokenCount;\n if (\n out.totalTokens === undefined &&\n out.promptTokens !== undefined &&\n out.completionTokens !== undefined\n ) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n // Gemini emits the cumulative usage at the END of the stream, so on\n // each chunk we just keep the latest non-undefined values rather than\n // summing — summing would double-count. Match `b` over `a` field-wise.\n return {\n promptTokens: b.promptTokens ?? a.promptTokens,\n completionTokens: b.completionTokens ?? a.completionTokens,\n totalTokens: b.totalTokens ?? a.totalTokens,\n cachedPromptTokens: b.cachedPromptTokens ?? a.cachedPromptTokens,\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface GeminiGenerateContentResponse {\n candidates?: Array<{\n content?: {\n role?: string;\n parts?: Array<{ text: string } | { functionCall: { name: string; args?: unknown } }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: GeminiUsageMetadata;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { GoogleGenerativeModel, type GoogleGenerativeModelId } from './google-generative-model.js';\n\nexport interface GoogleProviderOptions {\n /** Defaults to `process.env.GOOGLE_GENERATIVE_AI_API_KEY` (or `GEMINI_API_KEY`). */\n apiKey?: string;\n /** Defaults to `https://generativelanguage.googleapis.com/v1beta`. */\n baseURL?: string;\n /** Extra headers (e.g. for Vertex OAuth bearer auth). */\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface GoogleProvider {\n (modelId: GoogleGenerativeModelId): LanguageModel;\n generative(modelId: GoogleGenerativeModelId): LanguageModel;\n}\n\nexport function createGoogle(options: GoogleProviderOptions = {}): GoogleProvider {\n const apiKey =\n options.apiKey ?? loadEnv('GOOGLE_GENERATIVE_AI_API_KEY') ?? loadEnv('GEMINI_API_KEY');\n const baseURL = options.baseURL ?? 'https://generativelanguage.googleapis.com/v1beta';\n const fetcher = options.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const make = (modelId: GoogleGenerativeModelId): LanguageModel =>\n new GoogleGenerativeModel({\n modelId,\n baseURL,\n apiKey,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: GoogleGenerativeModelId) => make(modelId)) as GoogleProvider;\n provider.generative = make;\n return provider;\n}\n\nexport const google: GoogleProvider = createGoogle();\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/google-generative-model.ts","../src/google-provider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Gemini streams SSE chunks where each `data:` line is a JSON-encoded\n * `GenerateContentResponse`. Unlike Anthropic, Gemini does not use\n * `event:` framing — each block is one JSON delta. We yield raw `data`\n * strings; the model layer JSON-parses them.\n *\n * Vendored locally (instead of importing from the Anthropic provider)\n * to keep these provider packages mutually independent.\n */\nexport interface SSEDataEvent {\n data: string;\n}\n\nexport async function* parseSSE(body: ReadableStream<Uint8Array>): AsyncIterable<SSEDataEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n if (buffer.trim().length > 0) {\n const evt = parseBlock(buffer);\n if (evt) yield evt;\n }\n return;\n }\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = findEventBoundary(buffer);\n if (idx === -1) break;\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx).replace(/^(\\r?\\n){2}/, '');\n const evt = parseBlock(block);\n if (evt) yield evt;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction findEventBoundary(s: string): number {\n const i1 = s.indexOf('\\n\\n');\n const i2 = s.indexOf('\\r\\n\\r\\n');\n if (i1 === -1) return i2;\n if (i2 === -1) return i1;\n return Math.min(i1, i2);\n}\n\nfunction parseBlock(block: string): SSEDataEvent | null {\n const lines = block.split(/\\r?\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n }\n if (data.length === 0) return null;\n return { data: data.join('\\n') };\n}\n","import type { ContentPart } from '@ziro-agent/core';\nimport {\n APICallError,\n type CostEstimate,\n estimateTokensFromMessages,\n type FinishReason,\n type LanguageModel,\n type ModelCallOptions,\n type ModelGenerateResult,\n type ModelStreamPart,\n type NormalizedMessage,\n resolveMediaInput,\n type TokenUsage,\n type ToolCallPart,\n UnsupportedPartError,\n} from '@ziro-agent/core';\nimport { getPricing } from '@ziro-agent/core/pricing';\nimport { parseSSE } from './util/sse.js';\n\nexport type GoogleGenerativeModelId =\n // Current 2026 lineup (verified against ai.google.dev/pricing 2026-04-22).\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-lite'\n // Stable 2.0-series.\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-lite'\n // Open string for any model id we haven't enumerated.\n | (string & {});\n\ninterface GoogleGenerativeModelConfig {\n modelId: GoogleGenerativeModelId;\n baseURL: string;\n apiKey: string | undefined;\n headers: Record<string, string>;\n fetcher: typeof fetch;\n}\n\n/**\n * Adapter for Google's Generative Language API (`generativelanguage.googleapis.com`).\n *\n * Notes about Gemini's wire format that drove these design choices:\n * - The system prompt lives at the top level as `systemInstruction`,\n * NOT in `contents`. We hoist out any `system` messages from the\n * normalized message list before serialising.\n * - Roles are `user` and `model` (not `assistant`). Tool results come\n * back as `user` messages with `functionResponse` parts.\n * - Tool calls do NOT carry an id from the API. We synthesize one from\n * `name+index` so downstream tool-result correlation still works.\n * - Streaming is `:streamGenerateContent?alt=sse`, not WebSocket.\n *\n * For Vertex AI auth (OAuth instead of API key) build a custom config\n * by replacing `headers` and `baseURL`; the adapter contract is the same.\n */\nexport class GoogleGenerativeModel implements LanguageModel {\n readonly provider = 'google';\n readonly modelId: string;\n private readonly config: GoogleGenerativeModelConfig;\n\n constructor(config: GoogleGenerativeModelConfig) {\n this.modelId = config.modelId;\n this.config = config;\n }\n\n async generate(options: ModelCallOptions): Promise<ModelGenerateResult> {\n const body = this.buildBody(options);\n const res = await this.fetch(`/models/${this.modelId}:generateContent`, body, options);\n const json = (await res.json()) as GeminiGenerateContentResponse;\n\n const candidate = json.candidates?.[0];\n const parts = candidate?.content?.parts ?? [];\n\n const text = parts\n .filter((p): p is { text: string } => typeof (p as { text?: unknown }).text === 'string')\n .map((p) => p.text)\n .join('');\n\n const toolCalls: ToolCallPart[] = [];\n let toolIdx = 0;\n for (const part of parts) {\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n toolCalls.push({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx++),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n }\n }\n\n return {\n text,\n content: [...(text.length > 0 ? [{ type: 'text' as const, text }] : []), ...toolCalls],\n toolCalls,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage: mapUsage(json.usageMetadata),\n rawResponse: json,\n };\n }\n\n async stream(options: ModelCallOptions): Promise<ReadableStream<ModelStreamPart>> {\n const body = this.buildBody(options);\n const res = await this.fetch(\n `/models/${this.modelId}:streamGenerateContent?alt=sse`,\n body,\n options,\n );\n if (!res.body) {\n throw new APICallError({\n message: 'Gemini streaming response has no body.',\n statusCode: res.status,\n });\n }\n const events = parseSSE(res.body);\n\n return new ReadableStream<ModelStreamPart>({\n async start(controller) {\n let finish: FinishReason = 'unknown';\n let usage: TokenUsage = {};\n // Gemini streams complete tool calls inside `functionCall` parts;\n // it does not emit incremental `argsDelta`. We track which calls\n // we've already flushed by name+ordinal so we don't double-emit\n // when the model includes the same functionCall in a later\n // SSE chunk's full snapshot (rare but possible).\n let toolIdx = 0;\n const seen = new Set<string>();\n\n try {\n for await (const evt of events) {\n const data = parseChunk(evt.data);\n if (!data) continue;\n\n const cand = data.candidates?.[0];\n const parts = cand?.content?.parts ?? [];\n for (const part of parts) {\n if (typeof (part as { text?: unknown }).text === 'string') {\n const t = (part as { text: string }).text;\n if (t.length > 0) controller.enqueue({ type: 'text-delta', textDelta: t });\n }\n const fc = (part as { functionCall?: { name: string; args?: unknown } }).functionCall;\n if (fc) {\n const key = `${fc.name}#${toolIdx}`;\n if (!seen.has(key)) {\n seen.add(key);\n controller.enqueue({\n type: 'tool-call',\n toolCallId: synthesizeToolCallId(fc.name, toolIdx),\n toolName: fc.name,\n args: fc.args ?? {},\n });\n toolIdx++;\n }\n }\n }\n if (cand?.finishReason) finish = mapFinishReason(cand.finishReason);\n if (data.usageMetadata) usage = mergeUsage(usage, mapUsage(data.usageMetadata));\n }\n controller.enqueue({ type: 'finish', finishReason: finish, usage });\n controller.close();\n } catch (err) {\n controller.enqueue({ type: 'error', error: err });\n controller.close();\n }\n },\n });\n }\n\n /**\n * Pre-flight cost estimate. Mirror the Anthropic adapter — assume\n * `maxTokens` (or 8192 default) is consumed for the upper bound.\n * Returns `pricingAvailable: false` when the SDK has no row for the\n * model (note: Gemini rate cards are marked `unverified` until\n * cross-checked, so the default branch still kicks in for the 2.5-series).\n */\n estimateCost(options: ModelCallOptions): CostEstimate {\n const inputTokens = estimateTokensFromMessages(asChatMessages(options.messages));\n const maxOut = options.maxTokens ?? 8192;\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): Record<string, unknown> {\n const { systemText, others } = splitSystem(options.messages);\n\n const body: Record<string, unknown> = {\n contents: others.map(toGeminiContent),\n };\n if (systemText) {\n body.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools?.length) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => ({\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n parameters: t.parameters,\n })),\n },\n ];\n }\n\n if (options.toolChoice !== undefined) {\n // Gemini's tool config is wrapped in `toolConfig.functionCallingConfig`.\n const cfg: Record<string, unknown> = {};\n if (options.toolChoice === 'auto') cfg.mode = 'AUTO';\n else if (options.toolChoice === 'none') cfg.mode = 'NONE';\n else if (options.toolChoice === 'required') cfg.mode = 'ANY';\n else if (typeof options.toolChoice === 'object') {\n cfg.mode = 'ANY';\n cfg.allowedFunctionNames = [options.toolChoice.toolName];\n }\n body.toolConfig = { functionCallingConfig: cfg };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options.temperature !== undefined) generationConfig.temperature = options.temperature;\n if (options.topP !== undefined) generationConfig.topP = options.topP;\n if (options.topK !== undefined) generationConfig.topK = options.topK;\n if (options.maxTokens !== undefined) generationConfig.maxOutputTokens = options.maxTokens;\n if (options.stopSequences !== undefined) generationConfig.stopSequences = options.stopSequences;\n if (options.seed !== undefined) generationConfig.seed = options.seed;\n if (Object.keys(generationConfig).length > 0) body.generationConfig = generationConfig;\n\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 let url = `${this.config.baseURL}${path}`;\n // Prefer header auth when the consumer passed a custom Bearer header\n // (Vertex AI / OAuth path). Otherwise fall back to the documented\n // `?key=...` query parameter for the public Generative Language API.\n const usingHeaderAuth =\n this.config.headers.Authorization !== undefined ||\n this.config.headers.authorization !== undefined;\n if (this.config.apiKey && !usingHeaderAuth) {\n url += url.includes('?') ? `&key=${this.config.apiKey}` : `?key=${this.config.apiKey}`;\n }\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: `Google Gemini API error: ${res.status} ${res.statusText}`,\n url,\n statusCode: res.status,\n responseBody: text,\n });\n }\n return res;\n }\n}\n\n/** See AnthropicMessagesModel for the rationale of this structural cast. */\nfunction asChatMessages(\n messages: NormalizedMessage[],\n): Parameters<typeof estimateTokensFromMessages>[0] {\n return messages as unknown as Parameters<typeof estimateTokensFromMessages>[0];\n}\n\nfunction splitSystem(messages: NormalizedMessage[]): {\n systemText?: string;\n others: NormalizedMessage[];\n} {\n const sys = messages.filter((m) => m.role === 'system');\n const others = messages.filter((m) => m.role !== 'system');\n if (sys.length === 0) return { others };\n const text = sys\n .flatMap((m) => m.content)\n .filter((p) => p.type === 'text')\n .map((p) => (p as { text: string }).text)\n .join('\\n');\n return { systemText: text, others };\n}\n\nfunction mapGeminiUserPart(p: ContentPart): unknown {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'image') {\n if (typeof p.image === 'string') {\n if (p.image.startsWith('data:')) {\n const [meta, data] = p.image.split(',');\n const mime =\n meta?.replace(/^data:/, '').replace(/;base64$/, '') ?? p.mimeType ?? 'image/png';\n return { inlineData: { mimeType: mime, data: data ?? '' } };\n }\n return { fileData: { mimeType: p.mimeType ?? 'image/png', fileUri: p.image } };\n }\n return {\n inlineData: {\n mimeType: p.mimeType ?? 'image/png',\n data: uint8ToBase64(p.image as Uint8Array),\n },\n };\n }\n if (p.type === 'audio') {\n const r = resolveMediaInput(p.audio);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'audio/wav';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n if (p.type === 'file') {\n const r = resolveMediaInput(p.file);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'application/octet-stream';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n if (p.type === 'video') {\n const r = resolveMediaInput(p.video);\n const mime = p.mimeType ?? ('url' in r ? undefined : r.mimeType) ?? 'video/mp4';\n if ('url' in r) {\n return { fileData: { mimeType: mime, fileUri: r.url } };\n }\n return { inlineData: { mimeType: mime, data: r.base64 } };\n }\n throw new UnsupportedPartError({\n partType: (p as { type?: string }).type ?? 'unknown',\n provider: 'google',\n message: 'Unexpected content part in user message.',\n });\n}\n\nfunction toGeminiContent(m: NormalizedMessage): unknown {\n switch (m.role) {\n case 'user': {\n const parts = m.content.map((p) => mapGeminiUserPart(p));\n return { role: 'user', parts };\n }\n case 'assistant': {\n const parts = m.content.map((p) => {\n if (p.type === 'text') return { text: p.text };\n if (p.type === 'tool-call') {\n return { functionCall: { name: p.toolName, args: p.args ?? {} } };\n }\n return p;\n });\n return { role: 'model', parts };\n }\n case 'tool': {\n // Gemini wraps tool results inside a `user` content with\n // `functionResponse` parts. The response content must be JSON-y;\n // we wrap raw strings in `{ result: \"...\" }` to comply.\n const parts = m.content\n .filter((r): r is Extract<typeof r, { type: 'tool-result' }> => r.type === 'tool-result')\n .map((r) => ({\n functionResponse: {\n name: r.toolName,\n response:\n typeof r.result === 'object' && r.result !== null\n ? r.result\n : { result: r.result, ...(r.isError ? { error: true } : {}) },\n },\n }));\n return { role: 'user', parts };\n }\n case 'system':\n // System is hoisted in `splitSystem`; this branch should be unreachable.\n return { role: 'user', parts: [{ text: '' }] };\n }\n}\n\n/**\n * Gemini's API never returns a stable per-call id for tool calls. We\n * synthesize one from `<name>_<idx>` so downstream tool-result lookup\n * still has something to correlate on. The `gemini_` prefix makes it\n * obvious these are SDK-generated, not provider-supplied.\n */\nfunction synthesizeToolCallId(name: string, idx: number): string {\n return `gemini_${name}_${idx}`;\n}\n\nfunction parseChunk(raw: string): GeminiGenerateContentResponse | null {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as GeminiGenerateContentResponse;\n } catch {\n return null;\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): FinishReason {\n switch (reason) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n case 'PROHIBITED_CONTENT':\n case 'BLOCKLIST':\n case 'SPII':\n return 'content-filter';\n case 'TOOL_CALL':\n return 'tool-calls';\n case null:\n case undefined:\n return 'unknown';\n default:\n return 'other';\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n}\n\nfunction mapUsage(u: GeminiUsageMetadata | undefined): TokenUsage {\n if (!u) return {};\n const out: TokenUsage = {\n promptTokens: u.promptTokenCount,\n completionTokens: u.candidatesTokenCount,\n totalTokens: u.totalTokenCount,\n };\n if (u.cachedContentTokenCount !== undefined) out.cachedPromptTokens = u.cachedContentTokenCount;\n if (\n out.totalTokens === undefined &&\n out.promptTokens !== undefined &&\n out.completionTokens !== undefined\n ) {\n out.totalTokens = out.promptTokens + out.completionTokens;\n }\n return out;\n}\n\nfunction mergeUsage(a: TokenUsage, b: TokenUsage): TokenUsage {\n // Gemini emits the cumulative usage at the END of the stream, so on\n // each chunk we just keep the latest non-undefined values rather than\n // summing — summing would double-count. Match `b` over `a` field-wise.\n return {\n promptTokens: b.promptTokens ?? a.promptTokens,\n completionTokens: b.completionTokens ?? a.completionTokens,\n totalTokens: b.totalTokens ?? a.totalTokens,\n cachedPromptTokens: b.cachedPromptTokens ?? a.cachedPromptTokens,\n };\n}\n\nfunction uint8ToBase64(arr: Uint8Array): string {\n let s = '';\n for (let i = 0; i < arr.byteLength; i++) s += String.fromCharCode(arr[i] as number);\n return typeof btoa !== 'undefined' ? btoa(s) : Buffer.from(s, 'binary').toString('base64');\n}\n\ninterface GeminiGenerateContentResponse {\n candidates?: Array<{\n content?: {\n role?: string;\n parts?: Array<{ text: string } | { functionCall: { name: string; args?: unknown } }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: GeminiUsageMetadata;\n}\n","import type { LanguageModel } from '@ziro-agent/core';\nimport { GoogleGenerativeModel, type GoogleGenerativeModelId } from './google-generative-model.js';\n\nexport interface GoogleProviderOptions {\n /** Defaults to `process.env.GOOGLE_GENERATIVE_AI_API_KEY` (or `GEMINI_API_KEY`). */\n apiKey?: string;\n /** Defaults to `https://generativelanguage.googleapis.com/v1beta`. */\n baseURL?: string;\n /** Extra headers (e.g. for Vertex OAuth bearer auth). */\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport interface GoogleProvider {\n (modelId: GoogleGenerativeModelId): LanguageModel;\n generative(modelId: GoogleGenerativeModelId): LanguageModel;\n}\n\nexport function createGoogle(options: GoogleProviderOptions = {}): GoogleProvider {\n const apiKey =\n options.apiKey ?? loadEnv('GOOGLE_GENERATIVE_AI_API_KEY') ?? loadEnv('GEMINI_API_KEY');\n const baseURL = options.baseURL ?? 'https://generativelanguage.googleapis.com/v1beta';\n const fetcher = options.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const make = (modelId: GoogleGenerativeModelId): LanguageModel =>\n new GoogleGenerativeModel({\n modelId,\n baseURL,\n apiKey,\n headers,\n fetcher,\n });\n\n const provider = ((modelId: GoogleGenerativeModelId) => make(modelId)) as GoogleProvider;\n provider.generative = make;\n return provider;\n}\n\nexport const google: GoogleProvider = createGoogle();\n\nfunction loadEnv(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ziro-agent/google",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Google Gemini provider for ZiroAgent SDK.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://ziroagent.com",
@@ -43,7 +43,7 @@
43
43
  "LICENSE"
44
44
  ],
45
45
  "dependencies": {
46
- "@ziro-agent/core": "0.5.1"
46
+ "@ziro-agent/core": "0.7.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@arethetypeswrong/cli": "^0.18.2",