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 +45 -8
- package/dist/adapters/gemini.cjs +40 -5
- package/dist/adapters/gemini.cjs.map +1 -1
- package/dist/adapters/gemini.d.cts +9 -1
- package/dist/adapters/gemini.d.ts +9 -1
- package/dist/adapters/gemini.js +40 -6
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/index.cjs +39 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +39 -5
- package/dist/index.js.map +1 -1
- package/package.json +37 -6
package/README.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
# llm-stream-assemble
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|

|
|
5
5
|

|
|
6
|
-

|
|
7
7
|
[](https://github.com/01laky/llm-stream-assemble/actions/workflows/ci.yml)
|
|
8
|
-

|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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 |
|
package/dist/adapters/gemini.cjs
CHANGED
|
@@ -156,8 +156,21 @@ var GeminiStreamParser = class {
|
|
|
156
156
|
openToolByChoice = /* @__PURE__ */ new Map();
|
|
157
157
|
toolCounter = 0;
|
|
158
158
|
parseChunk(raw) {
|
|
159
|
-
|
|
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(
|
|
381
|
+
if (isRecord(record.error)) {
|
|
364
382
|
return providerErrorChunksFromPayload(
|
|
365
|
-
|
|
383
|
+
record.error,
|
|
366
384
|
"geminiAdapter.parseResponse",
|
|
367
385
|
false,
|
|
368
386
|
"Gemini provider error"
|
|
369
387
|
);
|
|
370
388
|
}
|
|
371
|
-
const feedback = isRecord(
|
|
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(
|
|
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 };
|
package/dist/adapters/gemini.js
CHANGED
|
@@ -154,8 +154,21 @@ var GeminiStreamParser = class {
|
|
|
154
154
|
openToolByChoice = /* @__PURE__ */ new Map();
|
|
155
155
|
toolCounter = 0;
|
|
156
156
|
parseChunk(raw) {
|
|
157
|
-
|
|
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(
|
|
379
|
+
if (isRecord(record.error)) {
|
|
362
380
|
return providerErrorChunksFromPayload(
|
|
363
|
-
|
|
381
|
+
record.error,
|
|
364
382
|
"geminiAdapter.parseResponse",
|
|
365
383
|
false,
|
|
366
384
|
"Gemini provider error"
|
|
367
385
|
);
|
|
368
386
|
}
|
|
369
|
-
const feedback = isRecord(
|
|
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(
|
|
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
|