llm-stream-assemble 1.5.0 → 1.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,19 +1,19 @@
1
1
  # llm-stream-assemble
2
2
 
3
- ![core](https://img.shields.io/badge/core-1.5.0-blue)
3
+ ![core](https://img.shields.io/badge/core-1.5.6-blue)
4
4
  ![node](https://img.shields.io/badge/node-%3E%3D18-339933)
5
5
  ![runtime deps](https://img.shields.io/badge/runtime_deps-0-brightgreen)
6
- ![tests](https://img.shields.io/badge/tests-1316_passing-brightgreen)
6
+ ![tests](https://img.shields.io/badge/tests-1555_passing-brightgreen)
7
7
  [![ci](https://github.com/01laky/llm-stream-assemble/actions/workflows/ci.yml/badge.svg)](https://github.com/01laky/llm-stream-assemble/actions/workflows/ci.yml)
8
- ![status](https://img.shields.io/badge/status-stable_1.5.0-brightgreen)
8
+ ![status](https://img.shields.io/badge/status-stable_1.5.6-brightgreen)
9
9
 
10
10
  **One typed event model for every LLM stream** — text, tool calls, reasoning, JSON, usage, refusals, errors, and non-streaming responses.
11
11
 
12
- > A zero-dependency TypeScript layer between raw LLM provider bytes and your app: seven built-in adapters, thirteen host presets, and a single StreamEvent model for text, tools, reasoning, JSON, and lifecycle — from Ollama to Azure to Bedrock to Cohere to Cloudflare Workers AI.
12
+ > A composable TypeScript layer between raw LLM provider bytes and your app: seven built-in adapters, thirteen host presets, and a single StreamEvent model for text, tools, reasoning, JSON, and lifecycle — from Ollama to Azure to Vertex AI to Bedrock to Cohere to Cloudflare Workers AI.
13
13
 
14
14
  Turn provider SSE fragments into typed events — **not another `+=` loop**.
15
15
 
16
- **Status:** Stable `1.5.0`. Seven built-in adapters, thirteen OpenAI-compatible host presets (including **Azure OpenAI** and **Cloudflare Workers AI**), transforms, replay helpers, and examples are production-ready. Pin semver ranges as usual and review [CHANGELOG.md](./CHANGELOG.md) before major upgrades.
16
+ **Status:** Stable `1.5.6`. Seven built-in adapters (Gemini covers **Google AI** and **Vertex AI** via `apiSurface`), thirteen OpenAI-compatible host presets (including **Azure OpenAI** and **Cloudflare Workers AI**), transforms, replay helpers, and examples are production-ready. Pin semver ranges as usual and review [CHANGELOG.md](./CHANGELOG.md) before major upgrades.
17
17
 
18
18
  ---
19
19
 
@@ -144,7 +144,7 @@ Diagram sources: [`docs/img/`](./docs/img/) (Mermaid `.mmd` + committed SVG). Re
144
144
  | `openaiCompatibleAdapter({ provider })` | Groq, DeepSeek, Mistral, Ollama, LM Studio, Together, Fireworks, OpenRouter, Perplexity, xAI, **Azure OpenAI**, **Cloudflare Workers AI**, generic | `llm-stream-assemble` |
145
145
  | `anthropicAdapter()` | Anthropic Messages | `llm-stream-assemble` |
146
146
  | `openaiResponsesAdapter()` | OpenAI Responses API | `llm-stream-assemble` |
147
- | `geminiAdapter()` | Google AI Gemini | `llm-stream-assemble` or `/adapters/gemini` |
147
+ | `geminiAdapter()` | Google AI Gemini + Vertex AI (`apiSurface`) | `llm-stream-assemble` or `/adapters/gemini` |
148
148
  | `bedrockAdapter()` | AWS Bedrock Converse / ConverseStream | `llm-stream-assemble` or `/adapters/bedrock` |
149
149
  | `cohereAdapter()` | Cohere Chat v2 (`api.cohere.com/v2/chat`) | `llm-stream-assemble` or `/adapters/cohere` |
150
150
 
@@ -561,7 +561,43 @@ Use `geminiAdapter({ jsonMode: true })` when structured JSON output should map t
561
561
 
562
562
  Subpath import: `import { geminiAdapter } from "llm-stream-assemble/adapters/gemini"`.
563
563
 
564
- Vertex AI and the Interactions API are out of scope for this adapter; see [compatibility matrix](./docs/compatibility.md).
564
+ #### Vertex AI Gemini
565
+
566
+ Vertex uses the same `geminiAdapter()` with **`apiSurface: "vertex"`**. The adapter strips Vertex / gateway envelopes (`response`, `result`, `predictions[0]`) via **`normalizeVertexChunk()`** before mapping `candidates` and tools. Vertex HTTP streams are often **JSONL or concatenated JSON objects**, not Google AI `data:` SSE — split complete JSON strings in your app, then pass each line to `assembleFromPayloads` (see [`examples/vertex/read-chunk-stream.ts`](./examples/vertex/read-chunk-stream.ts)).
567
+
568
+ ```ts
569
+ import { assembleFromPayloads, geminiAdapter } from "llm-stream-assemble";
570
+ import { buildVertexStreamUrl } from "./examples/vertex/build-vertex-url";
571
+ import { readVertexJsonlStrings } from "./examples/vertex/read-chunk-stream";
572
+
573
+ const projectId = process.env.GOOGLE_CLOUD_PROJECT!;
574
+ const location = process.env.VERTEX_LOCATION ?? "us-central1";
575
+ const model = process.env.VERTEX_MODEL ?? "gemini-2.5-flash";
576
+ const accessToken = process.env.VERTEX_ACCESS_TOKEN!; // ADC — not GOOGLE_API_KEY
577
+
578
+ const response = await fetch(buildVertexStreamUrl({ projectId, location, model }), {
579
+ method: "POST",
580
+ headers: {
581
+ Authorization: `Bearer ${accessToken}`,
582
+ "Content-Type": "application/json",
583
+ },
584
+ body: JSON.stringify({
585
+ contents: [{ role: "user", parts: [{ text: "Hello" }] }],
586
+ }),
587
+ });
588
+
589
+ async function* lines() {
590
+ for await (const line of readVertexJsonlStrings(response.body!)) yield line;
591
+ }
592
+
593
+ for await (const event of assembleFromPayloads(lines(), geminiAdapter({ apiSurface: "vertex" }))) {
594
+ if (event.type === "text.delta") process.stdout.write(event.text);
595
+ }
596
+ ```
597
+
598
+ Obtain a short-lived bearer token with Application Default Credentials, e.g. `gcloud auth application-default print-access-token`, and set `VERTEX_ACCESS_TOKEN` (or pass `accessToken` in your own wrapper). Full runnable example: [`examples/node-fetch/vertex-gemini.ts`](./examples/node-fetch/vertex-gemini.ts). Live smoke: `pnpm smoke:vertex` — see [live-smoke](./docs/live-smoke.md).
599
+
600
+ The Gemini **Interactions API** remains deferred; see [compatibility matrix](./docs/compatibility.md).
565
601
 
566
602
  ### Bedrock Usage
567
603
 
@@ -717,7 +753,8 @@ for await (const event of assembleFromFile(
717
753
  | [`examples/node-fetch/perplexity.ts`](./examples/node-fetch/perplexity.ts) | Perplexity streaming |
718
754
  | [`examples/node-fetch/xai.ts`](./examples/node-fetch/xai.ts) | xAI Grok streaming |
719
755
  | [`examples/node-fetch/anthropic.ts`](./examples/node-fetch/anthropic.ts) | Anthropic Messages |
720
- | [`examples/node-fetch/gemini.ts`](./examples/node-fetch/gemini.ts) | Google Gemini SSE |
756
+ | [`examples/node-fetch/gemini.ts`](./examples/node-fetch/gemini.ts) | Google AI Gemini SSE |
757
+ | [`examples/node-fetch/vertex-gemini.ts`](./examples/node-fetch/vertex-gemini.ts) | Vertex AI Gemini JSONL stream |
721
758
  | [`examples/node-fetch/bedrock.ts`](./examples/node-fetch/bedrock.ts) | AWS Bedrock ConverseStream (decoded JSON) |
722
759
  | [`examples/node-fetch/replay-fixture.ts`](./examples/node-fetch/replay-fixture.ts) | Local fixture replay |
723
760
  | [`examples/proxy-safety/`](./examples/proxy-safety/) | Proxy + browser client patterns |
@@ -156,8 +156,21 @@ var GeminiStreamParser = class {
156
156
  openToolByChoice = /* @__PURE__ */ new Map();
157
157
  toolCounter = 0;
158
158
  parseChunk(raw) {
159
- const payload = parseAdapterObjectPayload(raw, "geminiAdapter.parseChunk");
159
+ let payload = parseAdapterObjectPayload(raw, "geminiAdapter.parseChunk");
160
160
  if (!payload) return [];
161
+ if (this.options.apiSurface === "vertex") {
162
+ const normalized = normalizeVertexChunk(payload);
163
+ if (!normalized) {
164
+ if (Object.keys(payload).length === 0) return [];
165
+ return [
166
+ optionalRawChunk({
167
+ kind: "metadata",
168
+ raw: payload
169
+ })
170
+ ].filter((chunk) => chunk !== void 0);
171
+ }
172
+ payload = normalized;
173
+ }
161
174
  if (isRecord(payload.error)) {
162
175
  return providerErrorChunksFromPayload(
163
176
  payload.error,
@@ -358,22 +371,27 @@ function parseResponse(body, options) {
358
371
  if (!isRecord(body)) {
359
372
  throw libraryError("geminiAdapter.parseResponse expected a GenerateContentResponse object");
360
373
  }
374
+ let record = body;
375
+ if (options.apiSurface === "vertex") {
376
+ const normalized = normalizeVertexChunk(body);
377
+ if (normalized) record = normalized;
378
+ }
361
379
  const parser = new GeminiStreamParser(options);
362
380
  const chunks = [];
363
- if (isRecord(body.error)) {
381
+ if (isRecord(record.error)) {
364
382
  return providerErrorChunksFromPayload(
365
- body.error,
383
+ record.error,
366
384
  "geminiAdapter.parseResponse",
367
385
  false,
368
386
  "Gemini provider error"
369
387
  );
370
388
  }
371
- const feedback = isRecord(body.promptFeedback) ? body.promptFeedback : void 0;
389
+ const feedback = isRecord(record.promptFeedback) ? record.promptFeedback : void 0;
372
390
  const blockReason = feedback ? asString(feedback.blockReason) : void 0;
373
391
  if (blockReason) {
374
392
  return providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);
375
393
  }
376
- chunks.push(...parser.parseChunk(JSON.stringify(body)));
394
+ chunks.push(...parser.parseChunk(JSON.stringify(record)));
377
395
  const hasFinish = chunks.some((chunk) => chunk.kind === "finish");
378
396
  if (!hasFinish) {
379
397
  chunks.push({ kind: "finish", reason: "stop" });
@@ -410,7 +428,24 @@ function mapFinishReason(value) {
410
428
  return "error";
411
429
  }
412
430
  }
431
+ function normalizeVertexChunk(payload) {
432
+ if (isRecord(payload.response)) {
433
+ return payload.response;
434
+ }
435
+ if (isRecord(payload.result)) {
436
+ return payload.result;
437
+ }
438
+ if (Array.isArray(payload.predictions)) {
439
+ const first = payload.predictions[0];
440
+ if (isRecord(first)) return first;
441
+ }
442
+ if (payload.candidates !== void 0 || payload.usageMetadata !== void 0 || payload.promptFeedback !== void 0 || payload.responseId !== void 0 || isRecord(payload.error)) {
443
+ return payload;
444
+ }
445
+ return null;
446
+ }
413
447
 
414
448
  exports.geminiAdapter = geminiAdapter;
449
+ exports.normalizeVertexChunk = normalizeVertexChunk;
415
450
  //# sourceMappingURL=gemini.cjs.map
416
451
  //# sourceMappingURL=gemini.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/utils/object.ts","../../src/adapters/utils.ts","../../src/adapters/errors.ts","../../src/adapters/shared/incremental-json.ts","../../src/adapters/shared/parse-payload.ts","../../src/adapters/shared/text-delta.ts","../../src/adapters/shared/usage.ts","../../src/adapters/gemini.ts"],"names":[],"mappings":"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","file":"gemini.cjs","sourcesContent":["/** Strip undefined own properties; preserve explicit null. */\nexport function stripUndefined<T extends Record<string, unknown>>(obj: T): T {\n\treturn Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== undefined)) as T;\n}\n","/** Internal adapter utilities. Not part of the public API. */\nimport type { RawChunk, StreamAdapter } from \"../core/types\";\nimport { stripUndefined } from \"../core/utils/object\";\nimport { adapterScopedError } from \"./errors\";\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nexport function asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function optionalRawChunk(input: Record<string, unknown>): RawChunk {\n\treturn stripUndefined(input) as RawChunk;\n}\n\nexport function prefixedAdapterError(feature: string, message: string): Error {\n\treturn adapterScopedError(feature, message);\n}\n\nexport function createStreamAdapter<TOptions>(config: {\n\tparser: { parseChunk(raw: string): RawChunk[] };\n\tparseResponse: (body: unknown, options: TOptions) => RawChunk[];\n\toptions: TOptions;\n}): StreamAdapter {\n\treturn {\n\t\tparseChunk(raw) {\n\t\t\treturn config.parser.parseChunk(raw);\n\t\t},\n\t\tparseResponse(body) {\n\t\t\treturn config.parseResponse(body, config.options);\n\t\t},\n\t};\n}\n\nexport function parseAdapterJSON(raw: string, feature: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw) as unknown;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow prefixedAdapterError(feature, message);\n\t}\n}\n","/** Internal adapter error helpers. Not part of the public API. */\nimport type { RawChunk } from \"../core/types\";\nimport { asString } from \"./utils\";\n\nexport function libraryError(message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${message}`);\n}\n\nexport function adapterScopedError(scope: string, message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${scope}: ${message}`);\n}\n\nexport function providerErrorChunks(error: Error, recoverable = false): RawChunk[] {\n\treturn [\n\t\t{ kind: \"provider-error\", error, recoverable },\n\t\t{ kind: \"finish\", reason: \"error\" },\n\t];\n}\n\nexport function providerErrorChunksFromMessage(message: string, recoverable = false): RawChunk[] {\n\treturn providerErrorChunks(libraryError(message), recoverable);\n}\n\nexport function providerErrorChunksFromPayload(\n\terrorPayload: Record<string, unknown>,\n\tscope: string,\n\trecoverable: boolean,\n\tfallbackMessage: string,\n): RawChunk[] {\n\tconst message = asString(errorPayload.message) ?? fallbackMessage;\n\tconst error = adapterScopedError(scope, message);\n\tObject.defineProperty(error, \"raw\", {\n\t\tvalue: errorPayload,\n\t\tenumerable: false,\n\t});\n\treturn providerErrorChunks(error, recoverable);\n}\n","/** Tracks last serialized JSON for prefix-diff tool arg deltas. */\nexport interface IncrementalJsonState {\n\tlastArgsJson: string;\n}\n\n/** Emit only the new suffix when `nextInput` extends `prev`, else full replace. */\nexport function incrementalJsonStringDelta(\n\tstate: IncrementalJsonState,\n\tnextInput: string,\n): string | undefined {\n\tconst prev = state.lastArgsJson;\n\tif (nextInput === prev) return undefined;\n\tconst delta =\n\t\tprev.length > 0 && nextInput.startsWith(prev) ? nextInput.slice(prev.length) : nextInput;\n\tstate.lastArgsJson = nextInput;\n\treturn delta.length > 0 ? delta : undefined;\n}\n","import { adapterScopedError } from \"../errors\";\nimport { isRecord, parseAdapterJSON } from \"../utils\";\n\nexport interface ParseAdapterObjectOptions {\n\ttrim?: boolean;\n\tallowDone?: boolean;\n}\n\n/**\n * Parse a single adapter payload string into a JSON object.\n * Returns null for empty / [DONE] lines when configured.\n */\nexport function parseAdapterObjectPayload(\n\traw: string,\n\tscope: string,\n\toptions: ParseAdapterObjectOptions = {},\n): Record<string, unknown> | null {\n\tconst { trim = true, allowDone = true } = options;\n\tconst input = trim ? raw.trim() : raw;\n\tif (input.length === 0 || (allowDone && input === \"[DONE]\")) return null;\n\n\tconst payload = parseAdapterJSON(input, scope);\n\tif (!isRecord(payload)) {\n\t\tthrow adapterScopedError(scope, \"expected a JSON object\");\n\t}\n\treturn payload;\n}\n","import type { RawChunk } from \"../../core/types\";\n\nexport interface TextOrJsonDeltaOptions {\n\tjsonMode?: boolean | undefined;\n\tchoiceIndex?: number | undefined;\n}\n\nexport function textOrJsonDelta(\n\ttext: string,\n\toptions: TextOrJsonDeltaOptions,\n): RawChunk | undefined {\n\tif (text.length === 0) return undefined;\n\tif (options.jsonMode) return { kind: \"json-delta\", delta: text };\n\tif (options.choiceIndex !== undefined) {\n\t\treturn { kind: \"text-delta\", text, choiceIndex: options.choiceIndex };\n\t}\n\treturn { kind: \"text-delta\", text };\n}\n","import type { RawChunk } from \"../../core/types\";\nimport { asNumber, isRecord, optionalRawChunk } from \"../utils\";\n\nexport interface UsageFieldAliases {\n\tinput?: string[];\n\toutput?: string[];\n\treasoning?: string[];\n\ttotal?: string[];\n}\n\nconst DEFAULT_ALIASES: UsageFieldAliases = {\n\tinput: [\"inputTokens\", \"input_tokens\", \"promptTokens\", \"promptTokenCount\", \"inputTokenCount\"],\n\toutput: [\n\t\t\"outputTokens\",\n\t\t\"output_tokens\",\n\t\t\"completionTokens\",\n\t\t\"candidatesTokenCount\",\n\t\t\"outputTokenCount\",\n\t],\n\treasoning: [\"reasoningTokens\", \"reasoning_tokens\", \"thoughtsTokenCount\"],\n\ttotal: [\"totalTokens\", \"totalTokenCount\", \"total_tokens\"],\n};\n\nfunction firstNumber(\n\tvalue: Record<string, unknown>,\n\tfields: string[] | undefined,\n): number | undefined {\n\tif (!fields) return undefined;\n\tfor (const field of fields) {\n\t\tconst number = asNumber(value[field]);\n\t\tif (number !== undefined) return number;\n\t}\n\treturn undefined;\n}\n\nexport function buildUsageChunk(\n\tvalue: unknown,\n\taliases: UsageFieldAliases = DEFAULT_ALIASES,\n\toptions?: { mirrorTotalTokens?: boolean },\n): RawChunk | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst inputTokens = firstNumber(value, aliases.input);\n\tconst outputTokens = firstNumber(value, aliases.output);\n\tconst reasoningTokens = firstNumber(value, aliases.reasoning);\n\tconst totalTokens = firstNumber(value, aliases.total);\n\tif (\n\t\tinputTokens === undefined &&\n\t\toutputTokens === undefined &&\n\t\treasoningTokens === undefined &&\n\t\ttotalTokens === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\tconst raw =\n\t\toptions?.mirrorTotalTokens && totalTokens !== undefined ? { ...value, totalTokens } : value;\n\treturn optionalRawChunk({\n\t\tkind: \"usage\",\n\t\tinputTokens,\n\t\toutputTokens,\n\t\treasoningTokens,\n\t\traw,\n\t});\n}\n","import type { FinishReason, RawChunk, StreamAdapter } from \"../core/types\";\nimport {\n\tlibraryError,\n\tproviderErrorChunksFromMessage,\n\tproviderErrorChunksFromPayload,\n} from \"./errors\";\nimport { incrementalJsonStringDelta } from \"./shared/incremental-json\";\nimport { parseAdapterObjectPayload } from \"./shared/parse-payload\";\nimport { textOrJsonDelta } from \"./shared/text-delta\";\nimport { buildUsageChunk } from \"./shared/usage\";\nimport { asNumber, asString, createStreamAdapter, isRecord, optionalRawChunk } from \"./utils\";\n\nexport interface GeminiAdapterOptions {\n\t/** Map text parts to json-delta instead of text-delta. */\n\tjsonMode?: boolean;\n}\n\ninterface ToolState {\n\tid: string;\n\tname: string;\n\tindex: number;\n\tchoiceIndex: number;\n\tlastArgsJson: string;\n\topen: boolean;\n}\n\nexport function geminiAdapter(options: GeminiAdapterOptions = {}): StreamAdapter {\n\tconst parser = new GeminiStreamParser(options);\n\treturn createStreamAdapter({\n\t\tparser,\n\t\tparseResponse,\n\t\toptions,\n\t});\n}\n\nclass GeminiStreamParser {\n\tprivate metadataEmitted = false;\n\tprivate readonly tools = new Map<string, ToolState>();\n\tprivate readonly openToolByChoice = new Map<number, string>();\n\tprivate toolCounter = 0;\n\n\tconstructor(private readonly options: GeminiAdapterOptions) {}\n\n\tparseChunk(raw: string): RawChunk[] {\n\t\tconst payload = parseAdapterObjectPayload(raw, \"geminiAdapter.parseChunk\");\n\t\tif (!payload) return [];\n\n\t\tif (isRecord(payload.error)) {\n\t\t\treturn providerErrorChunksFromPayload(\n\t\t\t\tpayload.error,\n\t\t\t\t\"geminiAdapter.parseChunk\",\n\t\t\t\tfalse,\n\t\t\t\t\"Gemini provider error\",\n\t\t\t);\n\t\t}\n\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst feedback = isRecord(payload.promptFeedback) ? payload.promptFeedback : undefined;\n\t\tconst blockReason = feedback ? asString(feedback.blockReason) : undefined;\n\t\tif (blockReason) {\n\t\t\treturn providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);\n\t\t}\n\n\t\tchunks.push(...this.metadataChunks(payload));\n\n\t\tconst usage = buildUsageChunk(payload.usageMetadata);\n\t\tif (usage) chunks.push(usage);\n\n\t\tconst candidates = Array.isArray(payload.candidates) ? payload.candidates : [];\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!isRecord(candidate)) continue;\n\t\t\tchunks.push(...this.candidateChunks(candidate));\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate metadataChunks(payload: Record<string, unknown>): RawChunk[] {\n\t\tif (this.metadataEmitted) return [];\n\t\tconst responseId = asString(payload.responseId);\n\t\tconst model = asString(payload.modelVersion);\n\t\tif (!responseId && !model) return [];\n\n\t\tthis.metadataEmitted = true;\n\t\tconst chunks: RawChunk[] = [];\n\t\tif (responseId) chunks.push({ kind: \"message-start\", id: responseId });\n\t\tchunks.push(\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"metadata\",\n\t\t\t\tresponseId,\n\t\t\t\tmodel,\n\t\t\t\traw: { responseId, modelVersion: model },\n\t\t\t}),\n\t\t);\n\t\treturn chunks;\n\t}\n\n\tprivate candidateChunks(candidate: Record<string, unknown>): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst choiceIndex = asNumber(candidate.index) ?? 0;\n\n\t\tconst citation = candidate.citationMetadata;\n\t\tconst grounding = candidate.groundingMetadata;\n\t\tif (citation !== undefined || grounding !== undefined) {\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"metadata\",\n\t\t\t\t\traw: { citationMetadata: citation, groundingMetadata: grounding },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst content = isRecord(candidate.content) ? candidate.content : undefined;\n\t\tconst parts = content && Array.isArray(content.parts) ? content.parts : [];\n\t\tfor (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n\t\t\tconst part = parts[partIndex];\n\t\t\tif (!isRecord(part)) continue;\n\t\t\tchunks.push(...this.partChunks(part, partIndex, choiceIndex));\n\t\t}\n\n\t\tconst finishReason = asString(candidate.finishReason);\n\t\tif (finishReason) {\n\t\t\tconst mapped = mapFinishReason(finishReason);\n\t\t\tif (mapped === \"error\") {\n\t\t\t\tchunks.push(\n\t\t\t\t\t...providerErrorChunksFromMessage(`Gemini finishReason: ${finishReason}`, false),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchunks.push({ kind: \"finish\", reason: mapped, choiceIndex });\n\t\t\t}\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate partChunks(\n\t\tpart: Record<string, unknown>,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t): RawChunk[] {\n\t\tif (isRecord(part.functionResponse)) return [];\n\t\tif (part.inlineData !== undefined || part.fileData !== undefined) return [];\n\t\tif (part.executableCode !== undefined || part.codeExecutionResult !== undefined) return [];\n\n\t\tconst thought = part.thought === true;\n\t\tconst text = asString(part.text);\n\t\tif (thought && text) {\n\t\t\treturn [{ kind: \"reasoning-delta\", text, variant: \"detail\" }];\n\t\t}\n\t\tif (thought && !text) return [];\n\n\t\tif (text !== undefined) {\n\t\t\tconst chunk = textOrJsonDelta(text, {\n\t\t\t\tjsonMode: this.options.jsonMode,\n\t\t\t\tchoiceIndex,\n\t\t\t});\n\t\t\treturn chunk ? [chunk] : [];\n\t\t}\n\n\t\tconst functionCall = isRecord(part.functionCall) ? part.functionCall : undefined;\n\t\tif (functionCall) return this.functionCallChunks(functionCall, partIndex, choiceIndex);\n\n\t\tif (Object.keys(part).length === 0) return [];\n\t\treturn [];\n\t}\n\n\tprivate functionCallChunks(\n\t\tfunctionCall: Record<string, unknown>,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst explicitId = asString(functionCall.id);\n\t\tconst name = asString(functionCall.name);\n\t\tlet toolKey = this.resolveToolKey(explicitId, partIndex, choiceIndex, name);\n\n\t\tif (name && !this.tools.has(toolKey)) {\n\t\t\ttoolKey = explicitId ?? `${choiceIndex}:${partIndex}`;\n\t\t\tconst id = explicitId ?? `gemini:${choiceIndex}:${this.toolCounter++}`;\n\t\t\tthis.tools.set(toolKey, {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t\tindex: partIndex,\n\t\t\t\tchoiceIndex,\n\t\t\t\tlastArgsJson: \"\",\n\t\t\t\topen: true,\n\t\t\t});\n\t\t\tthis.openToolByChoice.set(choiceIndex, toolKey);\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"tool-start\",\n\t\t\t\t\tid,\n\t\t\t\t\tname,\n\t\t\t\t\tindex: partIndex,\n\t\t\t\t\tchoiceIndex,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst current = this.tools.get(toolKey);\n\t\tif (!current) return chunks;\n\n\t\tconst partialArgs = Array.isArray(functionCall.partialArgs) ? functionCall.partialArgs : [];\n\t\tfor (const item of partialArgs) {\n\t\t\tif (!isRecord(item)) continue;\n\t\t\tconst delta = partialArgDelta(item);\n\t\t\tif (delta) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (isRecord(functionCall.args)) {\n\t\t\tconst delta = incrementalJsonStringDelta(current, JSON.stringify(functionCall.args));\n\t\t\tif (delta) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst willContinue = functionCall.willContinue === true;\n\t\tconst hasPartialArgs = partialArgs.length > 0;\n\t\tconst hasArgs = isRecord(functionCall.args) && Object.keys(functionCall.args).length > 0;\n\n\t\tif (!willContinue && !hasPartialArgs && (hasArgs || (name && isRecord(functionCall.args)))) {\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"tool-done\",\n\t\t\t\t\tid: current.id,\n\t\t\t\t\tindex: current.index,\n\t\t\t\t\tchoiceIndex,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tcurrent.open = false;\n\t\t} else if (\n\t\t\t!willContinue &&\n\t\t\thasPartialArgs &&\n\t\t\tpartialArgs.every((item) => isRecord(item) && item.willContinue !== true)\n\t\t) {\n\t\t\tif (current.open) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-done\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tcurrent.open = false;\n\t\t\t}\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate resolveToolKey(\n\t\texplicitId: string | undefined,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t\tname: string | undefined,\n\t): string {\n\t\tif (explicitId) return explicitId;\n\t\tconst openKey = this.openToolByChoice.get(choiceIndex);\n\t\tif (openKey && this.tools.get(openKey)?.open) return openKey;\n\t\tif (name) {\n\t\t\tfor (const [key, state] of this.tools) {\n\t\t\t\tif (state.choiceIndex === choiceIndex && state.name === name && state.open) return key;\n\t\t\t}\n\t\t}\n\t\treturn `${choiceIndex}:${partIndex}`;\n\t}\n}\n\nfunction parseResponse(body: unknown, options: GeminiAdapterOptions): RawChunk[] {\n\tif (!isRecord(body)) {\n\t\tthrow libraryError(\"geminiAdapter.parseResponse expected a GenerateContentResponse object\");\n\t}\n\n\tconst parser = new GeminiStreamParser(options);\n\tconst chunks: RawChunk[] = [];\n\n\tif (isRecord(body.error)) {\n\t\treturn providerErrorChunksFromPayload(\n\t\t\tbody.error,\n\t\t\t\"geminiAdapter.parseResponse\",\n\t\t\tfalse,\n\t\t\t\"Gemini provider error\",\n\t\t);\n\t}\n\n\tconst feedback = isRecord(body.promptFeedback) ? body.promptFeedback : undefined;\n\tconst blockReason = feedback ? asString(feedback.blockReason) : undefined;\n\tif (blockReason) {\n\t\treturn providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);\n\t}\n\n\tchunks.push(...parser.parseChunk(JSON.stringify(body)));\n\n\tconst hasFinish = chunks.some((chunk) => chunk.kind === \"finish\");\n\tif (!hasFinish) {\n\t\tchunks.push({ kind: \"finish\", reason: \"stop\" });\n\t}\n\n\treturn chunks;\n}\n\nfunction partialArgDelta(arg: Record<string, unknown>): string | undefined {\n\tconst stringValue = asString(arg.stringValue);\n\tif (stringValue !== undefined) return stringValue;\n\n\tconst jsonPath = asString(arg.jsonPath) ?? \"$\";\n\tconst key = jsonPath.replace(/^\\$\\.?/, \"\").split(\".\")[0] ?? \"value\";\n\tif (arg.numberValue !== undefined) return JSON.stringify({ [key]: arg.numberValue });\n\tif (arg.boolValue !== undefined) return JSON.stringify({ [key]: arg.boolValue });\n\tif (arg.nullValue !== undefined) return JSON.stringify({ [key]: null });\n\treturn undefined;\n}\n\nfunction mapFinishReason(value: string): FinishReason {\n\tswitch (value) {\n\t\tcase \"STOP\":\n\t\tcase \"STOP_REASON_UNSPECIFIED\":\n\t\t\treturn \"stop\";\n\t\tcase \"MAX_TOKENS\":\n\t\t\treturn \"length\";\n\t\tcase \"SAFETY\":\n\t\tcase \"RECITATION\":\n\t\tcase \"BLOCKLIST\":\n\t\tcase \"PROHIBITED_CONTENT\":\n\t\tcase \"SPII\":\n\t\tcase \"LANGUAGE\":\n\t\t\treturn \"content_filter\";\n\t\tcase \"MALFORMED_FUNCTION_CALL\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\treturn \"error\";\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/utils/object.ts","../../src/adapters/utils.ts","../../src/adapters/errors.ts","../../src/adapters/shared/incremental-json.ts","../../src/adapters/shared/parse-payload.ts","../../src/adapters/shared/text-delta.ts","../../src/adapters/shared/usage.ts","../../src/adapters/gemini.ts"],"names":[],"mappings":"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","file":"gemini.cjs","sourcesContent":["/** Strip undefined own properties; preserve explicit null. */\nexport function stripUndefined<T extends Record<string, unknown>>(obj: T): T {\n\treturn Object.fromEntries(Object.entries(obj).filter(([, value]) => value !== undefined)) as T;\n}\n","/** Internal adapter utilities. Not part of the public API. */\nimport type { RawChunk, StreamAdapter } from \"../core/types\";\nimport { stripUndefined } from \"../core/utils/object\";\nimport { adapterScopedError } from \"./errors\";\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nexport function asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nexport function optionalRawChunk(input: Record<string, unknown>): RawChunk {\n\treturn stripUndefined(input) as RawChunk;\n}\n\nexport function prefixedAdapterError(feature: string, message: string): Error {\n\treturn adapterScopedError(feature, message);\n}\n\nexport function createStreamAdapter<TOptions>(config: {\n\tparser: { parseChunk(raw: string): RawChunk[] };\n\tparseResponse: (body: unknown, options: TOptions) => RawChunk[];\n\toptions: TOptions;\n}): StreamAdapter {\n\treturn {\n\t\tparseChunk(raw) {\n\t\t\treturn config.parser.parseChunk(raw);\n\t\t},\n\t\tparseResponse(body) {\n\t\t\treturn config.parseResponse(body, config.options);\n\t\t},\n\t};\n}\n\nexport function parseAdapterJSON(raw: string, feature: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw) as unknown;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow prefixedAdapterError(feature, message);\n\t}\n}\n","/** Internal adapter error helpers. Not part of the public API. */\nimport type { RawChunk } from \"../core/types\";\nimport { asString } from \"./utils\";\n\nexport function libraryError(message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${message}`);\n}\n\nexport function adapterScopedError(scope: string, message: string): Error {\n\treturn new Error(`llm-stream-assemble: ${scope}: ${message}`);\n}\n\nexport function providerErrorChunks(error: Error, recoverable = false): RawChunk[] {\n\treturn [\n\t\t{ kind: \"provider-error\", error, recoverable },\n\t\t{ kind: \"finish\", reason: \"error\" },\n\t];\n}\n\nexport function providerErrorChunksFromMessage(message: string, recoverable = false): RawChunk[] {\n\treturn providerErrorChunks(libraryError(message), recoverable);\n}\n\nexport function providerErrorChunksFromPayload(\n\terrorPayload: Record<string, unknown>,\n\tscope: string,\n\trecoverable: boolean,\n\tfallbackMessage: string,\n): RawChunk[] {\n\tconst message = asString(errorPayload.message) ?? fallbackMessage;\n\tconst error = adapterScopedError(scope, message);\n\tObject.defineProperty(error, \"raw\", {\n\t\tvalue: errorPayload,\n\t\tenumerable: false,\n\t});\n\treturn providerErrorChunks(error, recoverable);\n}\n","/** Tracks last serialized JSON for prefix-diff tool arg deltas. */\nexport interface IncrementalJsonState {\n\tlastArgsJson: string;\n}\n\n/** Emit only the new suffix when `nextInput` extends `prev`, else full replace. */\nexport function incrementalJsonStringDelta(\n\tstate: IncrementalJsonState,\n\tnextInput: string,\n): string | undefined {\n\tconst prev = state.lastArgsJson;\n\tif (nextInput === prev) return undefined;\n\tconst delta =\n\t\tprev.length > 0 && nextInput.startsWith(prev) ? nextInput.slice(prev.length) : nextInput;\n\tstate.lastArgsJson = nextInput;\n\treturn delta.length > 0 ? delta : undefined;\n}\n","import { adapterScopedError } from \"../errors\";\nimport { isRecord, parseAdapterJSON } from \"../utils\";\n\nexport interface ParseAdapterObjectOptions {\n\ttrim?: boolean;\n\tallowDone?: boolean;\n}\n\n/**\n * Parse a single adapter payload string into a JSON object.\n * Returns null for empty / [DONE] lines when configured.\n */\nexport function parseAdapterObjectPayload(\n\traw: string,\n\tscope: string,\n\toptions: ParseAdapterObjectOptions = {},\n): Record<string, unknown> | null {\n\tconst { trim = true, allowDone = true } = options;\n\tconst input = trim ? raw.trim() : raw;\n\tif (input.length === 0 || (allowDone && input === \"[DONE]\")) return null;\n\n\tconst payload = parseAdapterJSON(input, scope);\n\tif (!isRecord(payload)) {\n\t\tthrow adapterScopedError(scope, \"expected a JSON object\");\n\t}\n\treturn payload;\n}\n","import type { RawChunk } from \"../../core/types\";\n\nexport interface TextOrJsonDeltaOptions {\n\tjsonMode?: boolean | undefined;\n\tchoiceIndex?: number | undefined;\n}\n\nexport function textOrJsonDelta(\n\ttext: string,\n\toptions: TextOrJsonDeltaOptions,\n): RawChunk | undefined {\n\tif (text.length === 0) return undefined;\n\tif (options.jsonMode) return { kind: \"json-delta\", delta: text };\n\tif (options.choiceIndex !== undefined) {\n\t\treturn { kind: \"text-delta\", text, choiceIndex: options.choiceIndex };\n\t}\n\treturn { kind: \"text-delta\", text };\n}\n","import type { RawChunk } from \"../../core/types\";\nimport { asNumber, isRecord, optionalRawChunk } from \"../utils\";\n\nexport interface UsageFieldAliases {\n\tinput?: string[];\n\toutput?: string[];\n\treasoning?: string[];\n\ttotal?: string[];\n}\n\nconst DEFAULT_ALIASES: UsageFieldAliases = {\n\tinput: [\"inputTokens\", \"input_tokens\", \"promptTokens\", \"promptTokenCount\", \"inputTokenCount\"],\n\toutput: [\n\t\t\"outputTokens\",\n\t\t\"output_tokens\",\n\t\t\"completionTokens\",\n\t\t\"candidatesTokenCount\",\n\t\t\"outputTokenCount\",\n\t],\n\treasoning: [\"reasoningTokens\", \"reasoning_tokens\", \"thoughtsTokenCount\"],\n\ttotal: [\"totalTokens\", \"totalTokenCount\", \"total_tokens\"],\n};\n\nfunction firstNumber(\n\tvalue: Record<string, unknown>,\n\tfields: string[] | undefined,\n): number | undefined {\n\tif (!fields) return undefined;\n\tfor (const field of fields) {\n\t\tconst number = asNumber(value[field]);\n\t\tif (number !== undefined) return number;\n\t}\n\treturn undefined;\n}\n\nexport function buildUsageChunk(\n\tvalue: unknown,\n\taliases: UsageFieldAliases = DEFAULT_ALIASES,\n\toptions?: { mirrorTotalTokens?: boolean },\n): RawChunk | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst inputTokens = firstNumber(value, aliases.input);\n\tconst outputTokens = firstNumber(value, aliases.output);\n\tconst reasoningTokens = firstNumber(value, aliases.reasoning);\n\tconst totalTokens = firstNumber(value, aliases.total);\n\tif (\n\t\tinputTokens === undefined &&\n\t\toutputTokens === undefined &&\n\t\treasoningTokens === undefined &&\n\t\ttotalTokens === undefined\n\t) {\n\t\treturn undefined;\n\t}\n\tconst raw =\n\t\toptions?.mirrorTotalTokens && totalTokens !== undefined ? { ...value, totalTokens } : value;\n\treturn optionalRawChunk({\n\t\tkind: \"usage\",\n\t\tinputTokens,\n\t\toutputTokens,\n\t\treasoningTokens,\n\t\traw,\n\t});\n}\n","import type { FinishReason, RawChunk, StreamAdapter } from \"../core/types\";\nimport {\n\tlibraryError,\n\tproviderErrorChunksFromMessage,\n\tproviderErrorChunksFromPayload,\n} from \"./errors\";\nimport { incrementalJsonStringDelta } from \"./shared/incremental-json\";\nimport { parseAdapterObjectPayload } from \"./shared/parse-payload\";\nimport { textOrJsonDelta } from \"./shared/text-delta\";\nimport { buildUsageChunk } from \"./shared/usage\";\nimport { asNumber, asString, createStreamAdapter, isRecord, optionalRawChunk } from \"./utils\";\n\nexport type GeminiApiSurface = \"google-ai\" | \"vertex\";\n\nexport interface GeminiAdapterOptions {\n\t/** Map text parts to json-delta instead of text-delta. */\n\tjsonMode?: boolean;\n\t/**\n\t * Which Gemini HTTP API produced the chunk JSON.\n\t * @default \"google-ai\"\n\t */\n\tapiSurface?: GeminiApiSurface;\n}\n\ninterface ToolState {\n\tid: string;\n\tname: string;\n\tindex: number;\n\tchoiceIndex: number;\n\tlastArgsJson: string;\n\topen: boolean;\n}\n\nexport function geminiAdapter(options: GeminiAdapterOptions = {}): StreamAdapter {\n\tconst parser = new GeminiStreamParser(options);\n\treturn createStreamAdapter({\n\t\tparser,\n\t\tparseResponse,\n\t\toptions,\n\t});\n}\n\nclass GeminiStreamParser {\n\tprivate metadataEmitted = false;\n\tprivate readonly tools = new Map<string, ToolState>();\n\tprivate readonly openToolByChoice = new Map<number, string>();\n\tprivate toolCounter = 0;\n\n\tconstructor(private readonly options: GeminiAdapterOptions) {}\n\n\tparseChunk(raw: string): RawChunk[] {\n\t\tlet payload = parseAdapterObjectPayload(raw, \"geminiAdapter.parseChunk\");\n\t\tif (!payload) return [];\n\n\t\tif (this.options.apiSurface === \"vertex\") {\n\t\t\tconst normalized = normalizeVertexChunk(payload);\n\t\t\tif (!normalized) {\n\t\t\t\tif (Object.keys(payload).length === 0) return [];\n\t\t\t\treturn [\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"metadata\",\n\t\t\t\t\t\traw: payload,\n\t\t\t\t\t}),\n\t\t\t\t].filter((chunk): chunk is RawChunk => chunk !== undefined);\n\t\t\t}\n\t\t\tpayload = normalized;\n\t\t}\n\n\t\tif (isRecord(payload.error)) {\n\t\t\treturn providerErrorChunksFromPayload(\n\t\t\t\tpayload.error,\n\t\t\t\t\"geminiAdapter.parseChunk\",\n\t\t\t\tfalse,\n\t\t\t\t\"Gemini provider error\",\n\t\t\t);\n\t\t}\n\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst feedback = isRecord(payload.promptFeedback) ? payload.promptFeedback : undefined;\n\t\tconst blockReason = feedback ? asString(feedback.blockReason) : undefined;\n\t\tif (blockReason) {\n\t\t\treturn providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);\n\t\t}\n\n\t\tchunks.push(...this.metadataChunks(payload));\n\n\t\tconst usage = buildUsageChunk(payload.usageMetadata);\n\t\tif (usage) chunks.push(usage);\n\n\t\tconst candidates = Array.isArray(payload.candidates) ? payload.candidates : [];\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!isRecord(candidate)) continue;\n\t\t\tchunks.push(...this.candidateChunks(candidate));\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate metadataChunks(payload: Record<string, unknown>): RawChunk[] {\n\t\tif (this.metadataEmitted) return [];\n\t\tconst responseId = asString(payload.responseId);\n\t\tconst model = asString(payload.modelVersion);\n\t\tif (!responseId && !model) return [];\n\n\t\tthis.metadataEmitted = true;\n\t\tconst chunks: RawChunk[] = [];\n\t\tif (responseId) chunks.push({ kind: \"message-start\", id: responseId });\n\t\tchunks.push(\n\t\t\toptionalRawChunk({\n\t\t\t\tkind: \"metadata\",\n\t\t\t\tresponseId,\n\t\t\t\tmodel,\n\t\t\t\traw: { responseId, modelVersion: model },\n\t\t\t}),\n\t\t);\n\t\treturn chunks;\n\t}\n\n\tprivate candidateChunks(candidate: Record<string, unknown>): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst choiceIndex = asNumber(candidate.index) ?? 0;\n\n\t\tconst citation = candidate.citationMetadata;\n\t\tconst grounding = candidate.groundingMetadata;\n\t\tif (citation !== undefined || grounding !== undefined) {\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"metadata\",\n\t\t\t\t\traw: { citationMetadata: citation, groundingMetadata: grounding },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst content = isRecord(candidate.content) ? candidate.content : undefined;\n\t\tconst parts = content && Array.isArray(content.parts) ? content.parts : [];\n\t\tfor (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n\t\t\tconst part = parts[partIndex];\n\t\t\tif (!isRecord(part)) continue;\n\t\t\tchunks.push(...this.partChunks(part, partIndex, choiceIndex));\n\t\t}\n\n\t\tconst finishReason = asString(candidate.finishReason);\n\t\tif (finishReason) {\n\t\t\tconst mapped = mapFinishReason(finishReason);\n\t\t\tif (mapped === \"error\") {\n\t\t\t\tchunks.push(\n\t\t\t\t\t...providerErrorChunksFromMessage(`Gemini finishReason: ${finishReason}`, false),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchunks.push({ kind: \"finish\", reason: mapped, choiceIndex });\n\t\t\t}\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate partChunks(\n\t\tpart: Record<string, unknown>,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t): RawChunk[] {\n\t\tif (isRecord(part.functionResponse)) return [];\n\t\tif (part.inlineData !== undefined || part.fileData !== undefined) return [];\n\t\tif (part.executableCode !== undefined || part.codeExecutionResult !== undefined) return [];\n\n\t\tconst thought = part.thought === true;\n\t\tconst text = asString(part.text);\n\t\tif (thought && text) {\n\t\t\treturn [{ kind: \"reasoning-delta\", text, variant: \"detail\" }];\n\t\t}\n\t\tif (thought && !text) return [];\n\n\t\tif (text !== undefined) {\n\t\t\tconst chunk = textOrJsonDelta(text, {\n\t\t\t\tjsonMode: this.options.jsonMode,\n\t\t\t\tchoiceIndex,\n\t\t\t});\n\t\t\treturn chunk ? [chunk] : [];\n\t\t}\n\n\t\tconst functionCall = isRecord(part.functionCall) ? part.functionCall : undefined;\n\t\tif (functionCall) return this.functionCallChunks(functionCall, partIndex, choiceIndex);\n\n\t\tif (Object.keys(part).length === 0) return [];\n\t\treturn [];\n\t}\n\n\tprivate functionCallChunks(\n\t\tfunctionCall: Record<string, unknown>,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t): RawChunk[] {\n\t\tconst chunks: RawChunk[] = [];\n\t\tconst explicitId = asString(functionCall.id);\n\t\tconst name = asString(functionCall.name);\n\t\tlet toolKey = this.resolveToolKey(explicitId, partIndex, choiceIndex, name);\n\n\t\tif (name && !this.tools.has(toolKey)) {\n\t\t\ttoolKey = explicitId ?? `${choiceIndex}:${partIndex}`;\n\t\t\tconst id = explicitId ?? `gemini:${choiceIndex}:${this.toolCounter++}`;\n\t\t\tthis.tools.set(toolKey, {\n\t\t\t\tid,\n\t\t\t\tname,\n\t\t\t\tindex: partIndex,\n\t\t\t\tchoiceIndex,\n\t\t\t\tlastArgsJson: \"\",\n\t\t\t\topen: true,\n\t\t\t});\n\t\t\tthis.openToolByChoice.set(choiceIndex, toolKey);\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"tool-start\",\n\t\t\t\t\tid,\n\t\t\t\t\tname,\n\t\t\t\t\tindex: partIndex,\n\t\t\t\t\tchoiceIndex,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst current = this.tools.get(toolKey);\n\t\tif (!current) return chunks;\n\n\t\tconst partialArgs = Array.isArray(functionCall.partialArgs) ? functionCall.partialArgs : [];\n\t\tfor (const item of partialArgs) {\n\t\t\tif (!isRecord(item)) continue;\n\t\t\tconst delta = partialArgDelta(item);\n\t\t\tif (delta) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (isRecord(functionCall.args)) {\n\t\t\tconst delta = incrementalJsonStringDelta(current, JSON.stringify(functionCall.args));\n\t\t\tif (delta) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-args-delta\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tdelta,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst willContinue = functionCall.willContinue === true;\n\t\tconst hasPartialArgs = partialArgs.length > 0;\n\t\tconst hasArgs = isRecord(functionCall.args) && Object.keys(functionCall.args).length > 0;\n\n\t\tif (!willContinue && !hasPartialArgs && (hasArgs || (name && isRecord(functionCall.args)))) {\n\t\t\tchunks.push(\n\t\t\t\toptionalRawChunk({\n\t\t\t\t\tkind: \"tool-done\",\n\t\t\t\t\tid: current.id,\n\t\t\t\t\tindex: current.index,\n\t\t\t\t\tchoiceIndex,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tcurrent.open = false;\n\t\t} else if (\n\t\t\t!willContinue &&\n\t\t\thasPartialArgs &&\n\t\t\tpartialArgs.every((item) => isRecord(item) && item.willContinue !== true)\n\t\t) {\n\t\t\tif (current.open) {\n\t\t\t\tchunks.push(\n\t\t\t\t\toptionalRawChunk({\n\t\t\t\t\t\tkind: \"tool-done\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tindex: current.index,\n\t\t\t\t\t\tchoiceIndex,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tcurrent.open = false;\n\t\t\t}\n\t\t}\n\n\t\treturn chunks;\n\t}\n\n\tprivate resolveToolKey(\n\t\texplicitId: string | undefined,\n\t\tpartIndex: number,\n\t\tchoiceIndex: number,\n\t\tname: string | undefined,\n\t): string {\n\t\tif (explicitId) return explicitId;\n\t\tconst openKey = this.openToolByChoice.get(choiceIndex);\n\t\tif (openKey && this.tools.get(openKey)?.open) return openKey;\n\t\tif (name) {\n\t\t\tfor (const [key, state] of this.tools) {\n\t\t\t\tif (state.choiceIndex === choiceIndex && state.name === name && state.open) return key;\n\t\t\t}\n\t\t}\n\t\treturn `${choiceIndex}:${partIndex}`;\n\t}\n}\n\nfunction parseResponse(body: unknown, options: GeminiAdapterOptions): RawChunk[] {\n\tif (!isRecord(body)) {\n\t\tthrow libraryError(\"geminiAdapter.parseResponse expected a GenerateContentResponse object\");\n\t}\n\n\tlet record = body;\n\tif (options.apiSurface === \"vertex\") {\n\t\tconst normalized = normalizeVertexChunk(body);\n\t\tif (normalized) record = normalized;\n\t}\n\n\tconst parser = new GeminiStreamParser(options);\n\tconst chunks: RawChunk[] = [];\n\n\tif (isRecord(record.error)) {\n\t\treturn providerErrorChunksFromPayload(\n\t\t\trecord.error,\n\t\t\t\"geminiAdapter.parseResponse\",\n\t\t\tfalse,\n\t\t\t\"Gemini provider error\",\n\t\t);\n\t}\n\n\tconst feedback = isRecord(record.promptFeedback) ? record.promptFeedback : undefined;\n\tconst blockReason = feedback ? asString(feedback.blockReason) : undefined;\n\tif (blockReason) {\n\t\treturn providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);\n\t}\n\n\tchunks.push(...parser.parseChunk(JSON.stringify(record)));\n\n\tconst hasFinish = chunks.some((chunk) => chunk.kind === \"finish\");\n\tif (!hasFinish) {\n\t\tchunks.push({ kind: \"finish\", reason: \"stop\" });\n\t}\n\n\treturn chunks;\n}\n\nfunction partialArgDelta(arg: Record<string, unknown>): string | undefined {\n\tconst stringValue = asString(arg.stringValue);\n\tif (stringValue !== undefined) return stringValue;\n\n\tconst jsonPath = asString(arg.jsonPath) ?? \"$\";\n\tconst key = jsonPath.replace(/^\\$\\.?/, \"\").split(\".\")[0] ?? \"value\";\n\tif (arg.numberValue !== undefined) return JSON.stringify({ [key]: arg.numberValue });\n\tif (arg.boolValue !== undefined) return JSON.stringify({ [key]: arg.boolValue });\n\tif (arg.nullValue !== undefined) return JSON.stringify({ [key]: null });\n\treturn undefined;\n}\n\nfunction mapFinishReason(value: string): FinishReason {\n\tswitch (value) {\n\t\tcase \"STOP\":\n\t\tcase \"STOP_REASON_UNSPECIFIED\":\n\t\t\treturn \"stop\";\n\t\tcase \"MAX_TOKENS\":\n\t\t\treturn \"length\";\n\t\tcase \"SAFETY\":\n\t\tcase \"RECITATION\":\n\t\tcase \"BLOCKLIST\":\n\t\tcase \"PROHIBITED_CONTENT\":\n\t\tcase \"SPII\":\n\t\tcase \"LANGUAGE\":\n\t\t\treturn \"content_filter\";\n\t\tcase \"MALFORMED_FUNCTION_CALL\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\treturn \"error\";\n\t}\n}\n\n/** Strip Vertex / gateway wrappers before mapping GenerateContentResponse fields. */\nexport function normalizeVertexChunk(\n\tpayload: Record<string, unknown>,\n): Record<string, unknown> | null {\n\tif (isRecord(payload.response)) {\n\t\treturn payload.response;\n\t}\n\tif (isRecord(payload.result)) {\n\t\treturn payload.result;\n\t}\n\tif (Array.isArray(payload.predictions)) {\n\t\tconst first = payload.predictions[0];\n\t\tif (isRecord(first)) return first;\n\t}\n\tif (\n\t\tpayload.candidates !== undefined ||\n\t\tpayload.usageMetadata !== undefined ||\n\t\tpayload.promptFeedback !== undefined ||\n\t\tpayload.responseId !== undefined ||\n\t\tisRecord(payload.error)\n\t) {\n\t\treturn payload;\n\t}\n\treturn null;\n}\n"]}
@@ -1,9 +1,17 @@
1
1
  import { S as StreamAdapter } from '../types-CskRfrmD.cjs';
2
2
 
3
+ type GeminiApiSurface = "google-ai" | "vertex";
3
4
  interface GeminiAdapterOptions {
4
5
  /** Map text parts to json-delta instead of text-delta. */
5
6
  jsonMode?: boolean;
7
+ /**
8
+ * Which Gemini HTTP API produced the chunk JSON.
9
+ * @default "google-ai"
10
+ */
11
+ apiSurface?: GeminiApiSurface;
6
12
  }
7
13
  declare function geminiAdapter(options?: GeminiAdapterOptions): StreamAdapter;
14
+ /** Strip Vertex / gateway wrappers before mapping GenerateContentResponse fields. */
15
+ declare function normalizeVertexChunk(payload: Record<string, unknown>): Record<string, unknown> | null;
8
16
 
9
- export { type GeminiAdapterOptions, geminiAdapter };
17
+ export { type GeminiAdapterOptions, type GeminiApiSurface, geminiAdapter, normalizeVertexChunk };
@@ -1,9 +1,17 @@
1
1
  import { S as StreamAdapter } from '../types-CskRfrmD.js';
2
2
 
3
+ type GeminiApiSurface = "google-ai" | "vertex";
3
4
  interface GeminiAdapterOptions {
4
5
  /** Map text parts to json-delta instead of text-delta. */
5
6
  jsonMode?: boolean;
7
+ /**
8
+ * Which Gemini HTTP API produced the chunk JSON.
9
+ * @default "google-ai"
10
+ */
11
+ apiSurface?: GeminiApiSurface;
6
12
  }
7
13
  declare function geminiAdapter(options?: GeminiAdapterOptions): StreamAdapter;
14
+ /** Strip Vertex / gateway wrappers before mapping GenerateContentResponse fields. */
15
+ declare function normalizeVertexChunk(payload: Record<string, unknown>): Record<string, unknown> | null;
8
16
 
9
- export { type GeminiAdapterOptions, geminiAdapter };
17
+ export { type GeminiAdapterOptions, type GeminiApiSurface, geminiAdapter, normalizeVertexChunk };
@@ -154,8 +154,21 @@ var GeminiStreamParser = class {
154
154
  openToolByChoice = /* @__PURE__ */ new Map();
155
155
  toolCounter = 0;
156
156
  parseChunk(raw) {
157
- const payload = parseAdapterObjectPayload(raw, "geminiAdapter.parseChunk");
157
+ let payload = parseAdapterObjectPayload(raw, "geminiAdapter.parseChunk");
158
158
  if (!payload) return [];
159
+ if (this.options.apiSurface === "vertex") {
160
+ const normalized = normalizeVertexChunk(payload);
161
+ if (!normalized) {
162
+ if (Object.keys(payload).length === 0) return [];
163
+ return [
164
+ optionalRawChunk({
165
+ kind: "metadata",
166
+ raw: payload
167
+ })
168
+ ].filter((chunk) => chunk !== void 0);
169
+ }
170
+ payload = normalized;
171
+ }
159
172
  if (isRecord(payload.error)) {
160
173
  return providerErrorChunksFromPayload(
161
174
  payload.error,
@@ -356,22 +369,27 @@ function parseResponse(body, options) {
356
369
  if (!isRecord(body)) {
357
370
  throw libraryError("geminiAdapter.parseResponse expected a GenerateContentResponse object");
358
371
  }
372
+ let record = body;
373
+ if (options.apiSurface === "vertex") {
374
+ const normalized = normalizeVertexChunk(body);
375
+ if (normalized) record = normalized;
376
+ }
359
377
  const parser = new GeminiStreamParser(options);
360
378
  const chunks = [];
361
- if (isRecord(body.error)) {
379
+ if (isRecord(record.error)) {
362
380
  return providerErrorChunksFromPayload(
363
- body.error,
381
+ record.error,
364
382
  "geminiAdapter.parseResponse",
365
383
  false,
366
384
  "Gemini provider error"
367
385
  );
368
386
  }
369
- const feedback = isRecord(body.promptFeedback) ? body.promptFeedback : void 0;
387
+ const feedback = isRecord(record.promptFeedback) ? record.promptFeedback : void 0;
370
388
  const blockReason = feedback ? asString(feedback.blockReason) : void 0;
371
389
  if (blockReason) {
372
390
  return providerErrorChunksFromMessage(`Gemini prompt blocked: ${blockReason}`, false);
373
391
  }
374
- chunks.push(...parser.parseChunk(JSON.stringify(body)));
392
+ chunks.push(...parser.parseChunk(JSON.stringify(record)));
375
393
  const hasFinish = chunks.some((chunk) => chunk.kind === "finish");
376
394
  if (!hasFinish) {
377
395
  chunks.push({ kind: "finish", reason: "stop" });
@@ -408,7 +426,23 @@ function mapFinishReason(value) {
408
426
  return "error";
409
427
  }
410
428
  }
429
+ function normalizeVertexChunk(payload) {
430
+ if (isRecord(payload.response)) {
431
+ return payload.response;
432
+ }
433
+ if (isRecord(payload.result)) {
434
+ return payload.result;
435
+ }
436
+ if (Array.isArray(payload.predictions)) {
437
+ const first = payload.predictions[0];
438
+ if (isRecord(first)) return first;
439
+ }
440
+ if (payload.candidates !== void 0 || payload.usageMetadata !== void 0 || payload.promptFeedback !== void 0 || payload.responseId !== void 0 || isRecord(payload.error)) {
441
+ return payload;
442
+ }
443
+ return null;
444
+ }
411
445
 
412
- export { geminiAdapter };
446
+ export { geminiAdapter, normalizeVertexChunk };
413
447
  //# sourceMappingURL=gemini.js.map
414
448
  //# sourceMappingURL=gemini.js.map