@anvia/gemini 1.0.0-rc.5 → 1.0.0-rc.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +563 -99
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -25,6 +25,8 @@ import { GoogleGenAI } from "@google/genai";
|
|
|
25
25
|
// src/gemini/completion.ts
|
|
26
26
|
import {
|
|
27
27
|
assertCompletionRequestSupported,
|
|
28
|
+
CompletionProviderOutputError,
|
|
29
|
+
isJsonValue,
|
|
28
30
|
Usage,
|
|
29
31
|
withContextUsage
|
|
30
32
|
} from "@anvia/core/completion";
|
|
@@ -102,21 +104,37 @@ var GeminiCompletionModel = class {
|
|
|
102
104
|
const params = toGeminiGenerateContentParams(this.modelId, request);
|
|
103
105
|
applyAbortSignal(params, options);
|
|
104
106
|
const stream = await this.client.models.generateContentStream(params);
|
|
107
|
+
const streamState = new GeminiCompletionStreamState();
|
|
105
108
|
for await (const chunk of stream) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
const mapping = mapGeminiGenerateContentStreamChunk(chunk);
|
|
110
|
+
streamState.accept(chunk, mapping);
|
|
111
|
+
for (const event of mapping.events) {
|
|
112
|
+
if (event.type !== "final") {
|
|
113
|
+
yield event;
|
|
114
|
+
}
|
|
111
115
|
}
|
|
112
116
|
}
|
|
117
|
+
streamState.assertComplete();
|
|
118
|
+
const finalEvent = streamState.finalEvent();
|
|
119
|
+
if (finalEvent !== void 0) {
|
|
120
|
+
yield {
|
|
121
|
+
...finalEvent,
|
|
122
|
+
response: withContextUsage(finalEvent.response, this.modelInfo())
|
|
123
|
+
};
|
|
124
|
+
}
|
|
113
125
|
}
|
|
114
126
|
};
|
|
115
127
|
function toGeminiGenerateContentParams(modelId, request) {
|
|
116
128
|
const messages = requestMessages(request);
|
|
117
|
-
|
|
129
|
+
if (request.providerOptions !== void 0 && (!isPlainObject2(request.providerOptions) || !isJsonValue(request.providerOptions))) {
|
|
130
|
+
throw new TypeError("Gemini providerOptions must be a JSON object.");
|
|
131
|
+
}
|
|
132
|
+
const providerOptions = request.providerOptions ?? {};
|
|
118
133
|
const { config: providerConfigValue, ...providerTopLevel } = providerOptions;
|
|
119
|
-
|
|
134
|
+
if (providerConfigValue !== void 0 && !isPlainObject2(providerConfigValue)) {
|
|
135
|
+
throw new TypeError("Gemini providerOptions.config must be a JSON object.");
|
|
136
|
+
}
|
|
137
|
+
const providerConfig = providerConfigValue === void 0 ? {} : { ...providerConfigValue };
|
|
120
138
|
delete providerConfig.tools;
|
|
121
139
|
const config = disableGeminiNativeRetries({
|
|
122
140
|
...providerConfig,
|
|
@@ -164,10 +182,10 @@ function toolChoiceSummary(toolChoice) {
|
|
|
164
182
|
function compactJsonObject(values) {
|
|
165
183
|
return Object.fromEntries(
|
|
166
184
|
Object.entries(values).flatMap(([key, value]) => {
|
|
167
|
-
if (value
|
|
185
|
+
if (!isJsonValue(value)) {
|
|
168
186
|
return [];
|
|
169
187
|
}
|
|
170
|
-
return [[key,
|
|
188
|
+
return [[key, value]];
|
|
171
189
|
})
|
|
172
190
|
);
|
|
173
191
|
}
|
|
@@ -416,29 +434,73 @@ function toolChoiceToGemini(toolChoice) {
|
|
|
416
434
|
};
|
|
417
435
|
}
|
|
418
436
|
function fromGeminiGenerateContentResponse(response) {
|
|
419
|
-
const raw = response;
|
|
420
|
-
const
|
|
437
|
+
const raw = isPlainObject2(response) ? response : {};
|
|
438
|
+
const usage = usageFromGemini(raw.usageMetadata);
|
|
439
|
+
const parts = candidateParts(raw, usage);
|
|
440
|
+
const providerFinishReason = providerFinishReasonFromGeminiResponse(raw);
|
|
441
|
+
const finishError = geminiToolFinishError(
|
|
442
|
+
providerFinishReason,
|
|
443
|
+
hasGeminiFunctionCallMarker(raw, parts),
|
|
444
|
+
usage
|
|
445
|
+
);
|
|
446
|
+
if (finishError !== void 0) throw finishError;
|
|
447
|
+
const choice = assistantContentFromGeminiResponse(raw, usage);
|
|
421
448
|
const result = {
|
|
422
449
|
choice,
|
|
423
|
-
usage
|
|
450
|
+
usage,
|
|
424
451
|
rawResponse: response
|
|
425
452
|
};
|
|
453
|
+
applyGeminiFinishReason(result, raw);
|
|
426
454
|
const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);
|
|
427
455
|
if (id !== void 0) {
|
|
428
456
|
result.messageId = id;
|
|
429
457
|
}
|
|
458
|
+
assertSafeGeminiCompletionResponse(result);
|
|
430
459
|
return result;
|
|
431
460
|
}
|
|
432
|
-
function
|
|
461
|
+
function applyGeminiFinishReason(response, raw, hasStreamedToolCalls = false) {
|
|
462
|
+
const value = providerFinishReasonFromGeminiResponse(raw);
|
|
463
|
+
if (value === void 0) return;
|
|
464
|
+
applyGeminiFinishReasonValue(response, value, hasStreamedToolCalls);
|
|
465
|
+
}
|
|
466
|
+
function applyGeminiFinishReasonValue(response, value, hasStreamedToolCalls) {
|
|
467
|
+
response.finishReason = geminiFinishReason(
|
|
468
|
+
value,
|
|
469
|
+
hasStreamedToolCalls || response.choice.some((part) => part.type === "tool-call")
|
|
470
|
+
);
|
|
471
|
+
response.providerFinishReason = value;
|
|
472
|
+
}
|
|
473
|
+
function geminiFinishReason(value, hasToolCalls) {
|
|
474
|
+
if (value === "MAX_TOKENS") return "length";
|
|
475
|
+
if (value === "SAFETY" || value === "RECITATION" || value === "BLOCKLIST" || value === "PROHIBITED_CONTENT" || value === "SPII" || value === "IMAGE_SAFETY" || value === "IMAGE_PROHIBITED_CONTENT") {
|
|
476
|
+
return "content-filter";
|
|
477
|
+
}
|
|
478
|
+
if (value === "STOP") {
|
|
479
|
+
return hasToolCalls ? "tool-calls" : "stop";
|
|
480
|
+
}
|
|
481
|
+
return "other";
|
|
482
|
+
}
|
|
483
|
+
function mapGeminiGenerateContentStreamChunk(chunk) {
|
|
433
484
|
if (!isPlainObject2(chunk)) {
|
|
434
|
-
return
|
|
485
|
+
return {
|
|
486
|
+
events: [],
|
|
487
|
+
toolCalls: [],
|
|
488
|
+
hasToolCallMarker: false,
|
|
489
|
+
hasSyntheticToolCalls: false
|
|
490
|
+
};
|
|
435
491
|
}
|
|
436
492
|
const events = [];
|
|
437
|
-
const
|
|
438
|
-
|
|
493
|
+
const usage = usageFromGemini(chunk.usageMetadata);
|
|
494
|
+
const parts = candidateParts(chunk, usage);
|
|
495
|
+
const providerFinishReason = providerFinishReasonFromGeminiResponse(chunk);
|
|
496
|
+
const hasToolCallMarker = hasGeminiFunctionCallMarker(chunk, parts);
|
|
497
|
+
const terminalError = providerFinishReason === void 0 ? void 0 : geminiToolFinishError(providerFinishReason, hasToolCallMarker, usage);
|
|
498
|
+
const calls = terminalError === void 0 ? functionCallsFromGeminiResponse(chunk, parts, usage) : [];
|
|
499
|
+
const directText = textFromGeminiResponse(chunk, parts);
|
|
500
|
+
if (terminalError === void 0 && directText.length > 0 && parts.length === 0) {
|
|
439
501
|
events.push({ type: "text_delta", delta: directText });
|
|
440
502
|
}
|
|
441
|
-
for (const part of
|
|
503
|
+
for (const { part } of terminalError === void 0 ? parts : []) {
|
|
442
504
|
if (typeof part.text === "string" && part.text.length > 0) {
|
|
443
505
|
if (part.thought === true) {
|
|
444
506
|
events.push({ type: "reasoning_delta", delta: part.text, contentType: "summary" });
|
|
@@ -447,18 +509,22 @@ function fromGeminiGenerateContentStreamChunk(chunk) {
|
|
|
447
509
|
}
|
|
448
510
|
}
|
|
449
511
|
}
|
|
450
|
-
for (const call of
|
|
512
|
+
for (const call of calls) {
|
|
451
513
|
events.push(
|
|
452
|
-
toolCallDelta(call.
|
|
453
|
-
callId: call.
|
|
514
|
+
toolCallDelta(call.toolCallId, {
|
|
515
|
+
callId: call.callId,
|
|
454
516
|
name: call.name,
|
|
455
517
|
signature: call.signature
|
|
456
518
|
})
|
|
457
519
|
);
|
|
520
|
+
const argumentsDelta = JSON.stringify(call.args);
|
|
521
|
+
if (argumentsDelta === void 0) {
|
|
522
|
+
throw invalidGeminiToolCallArguments(call.toolCallId, usage);
|
|
523
|
+
}
|
|
458
524
|
events.push(
|
|
459
|
-
toolCallDelta(call.
|
|
460
|
-
callId: call.
|
|
461
|
-
argumentsDelta
|
|
525
|
+
toolCallDelta(call.toolCallId, {
|
|
526
|
+
callId: call.callId,
|
|
527
|
+
argumentsDelta,
|
|
462
528
|
argumentsMode: "replace"
|
|
463
529
|
})
|
|
464
530
|
);
|
|
@@ -468,18 +534,171 @@ function fromGeminiGenerateContentStreamChunk(chunk) {
|
|
|
468
534
|
events.push({ type: "message_id", id });
|
|
469
535
|
}
|
|
470
536
|
if (isPlainObject2(chunk.usageMetadata)) {
|
|
471
|
-
|
|
537
|
+
if (terminalError === void 0) {
|
|
538
|
+
events.push({ type: "final", response: fromGeminiGenerateContentResponse(chunk) });
|
|
539
|
+
} else {
|
|
540
|
+
const response = { choice: [], usage, rawResponse: chunk };
|
|
541
|
+
if (providerFinishReason !== void 0) {
|
|
542
|
+
applyGeminiFinishReasonValue(response, providerFinishReason, true);
|
|
543
|
+
}
|
|
544
|
+
events.push({ type: "final", response });
|
|
545
|
+
}
|
|
472
546
|
}
|
|
473
|
-
return
|
|
547
|
+
return providerFinishReason === void 0 ? {
|
|
548
|
+
events,
|
|
549
|
+
toolCalls: calls.map(toolCallFromGeminiFunctionCall),
|
|
550
|
+
hasToolCallMarker,
|
|
551
|
+
hasSyntheticToolCalls: calls.some((call) => call.callId === void 0),
|
|
552
|
+
terminalError
|
|
553
|
+
} : {
|
|
554
|
+
events,
|
|
555
|
+
toolCalls: calls.map(toolCallFromGeminiFunctionCall),
|
|
556
|
+
hasToolCallMarker,
|
|
557
|
+
hasSyntheticToolCalls: calls.some((call) => call.callId === void 0),
|
|
558
|
+
providerFinishReason,
|
|
559
|
+
terminalError
|
|
560
|
+
};
|
|
474
561
|
}
|
|
475
|
-
|
|
476
|
-
|
|
562
|
+
var GeminiCompletionStreamState = class {
|
|
563
|
+
toolCalls = /* @__PURE__ */ new Map();
|
|
564
|
+
providerFinishReason;
|
|
565
|
+
terminalChunk;
|
|
566
|
+
finalResponse;
|
|
567
|
+
sawToolCallMarker = false;
|
|
568
|
+
sawSyntheticToolCallChunk = false;
|
|
569
|
+
terminalError;
|
|
570
|
+
accept(chunk, mapping) {
|
|
571
|
+
if (mapping.hasSyntheticToolCalls && this.sawSyntheticToolCallChunk) {
|
|
572
|
+
const toolCallId = mapping.toolCalls.find(
|
|
573
|
+
(toolCall) => toolCall.callId === void 0
|
|
574
|
+
)?.toolCallId;
|
|
575
|
+
throw toolCallId === void 0 ? new CompletionProviderOutputError({
|
|
576
|
+
kind: "invalid-tool-call",
|
|
577
|
+
usage: this.currentUsage()
|
|
578
|
+
}) : invalidGeminiToolCall(toolCallId, this.currentUsage());
|
|
579
|
+
}
|
|
580
|
+
if (this.providerFinishReason !== void 0 && (mapping.hasToolCallMarker || hasGeminiSemanticProgress(mapping.events))) {
|
|
581
|
+
throw new CompletionProviderOutputError({
|
|
582
|
+
kind: "invalid-tool-call",
|
|
583
|
+
finishReason: "other",
|
|
584
|
+
usage: this.currentUsage()
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
for (const toolCall of mapping.toolCalls) {
|
|
588
|
+
const existing = this.toolCalls.get(toolCall.toolCallId);
|
|
589
|
+
if (existing !== void 0) {
|
|
590
|
+
if (existing.callId === void 0 || toolCall.callId === void 0 || !sameGeminiToolCall(existing, toolCall)) {
|
|
591
|
+
throw invalidGeminiToolCall(toolCall.toolCallId, this.currentUsage());
|
|
592
|
+
}
|
|
593
|
+
continue;
|
|
594
|
+
}
|
|
595
|
+
this.toolCalls.set(toolCall.toolCallId, toolCall);
|
|
596
|
+
}
|
|
597
|
+
this.sawToolCallMarker ||= mapping.hasToolCallMarker;
|
|
598
|
+
this.sawSyntheticToolCallChunk ||= mapping.hasSyntheticToolCalls;
|
|
599
|
+
for (const event of mapping.events) {
|
|
600
|
+
if (event.type === "final") {
|
|
601
|
+
this.finalResponse = event.response;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
this.terminalError ??= mapping.terminalError;
|
|
605
|
+
if (mapping.providerFinishReason !== void 0) {
|
|
606
|
+
if (this.providerFinishReason !== void 0 && this.providerFinishReason !== mapping.providerFinishReason) {
|
|
607
|
+
throw new CompletionProviderOutputError({
|
|
608
|
+
kind: "invalid-tool-call",
|
|
609
|
+
finishReason: "other",
|
|
610
|
+
usage: this.currentUsage()
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
this.providerFinishReason = mapping.providerFinishReason;
|
|
614
|
+
this.terminalChunk = chunk;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
assertComplete() {
|
|
618
|
+
if (this.terminalError !== void 0) {
|
|
619
|
+
throw geminiProviderOutputErrorWithUsage(this.terminalError, this.currentUsage());
|
|
620
|
+
}
|
|
621
|
+
if (!this.sawToolCallMarker && this.toolCalls.size === 0) return;
|
|
622
|
+
if (this.providerFinishReason !== void 0) {
|
|
623
|
+
assertSafeGeminiToolFinishReason(this.providerFinishReason, this.currentUsage());
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const toolCallId = this.toolCalls.keys().next().value;
|
|
627
|
+
throw new CompletionProviderOutputError(
|
|
628
|
+
toolCallId === void 0 ? { kind: "incomplete-tool-call", usage: this.currentUsage() } : { kind: "incomplete-tool-call", toolCallId, usage: this.currentUsage() }
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
finalEvent() {
|
|
632
|
+
let response = this.finalResponse;
|
|
633
|
+
if (response === void 0) {
|
|
634
|
+
if (this.terminalChunk === void 0) {
|
|
635
|
+
return void 0;
|
|
636
|
+
}
|
|
637
|
+
const raw = isPlainObject2(this.terminalChunk) ? this.terminalChunk : {};
|
|
638
|
+
response = {
|
|
639
|
+
choice: [],
|
|
640
|
+
usage: usageFromGemini(raw.usageMetadata),
|
|
641
|
+
rawResponse: this.terminalChunk
|
|
642
|
+
};
|
|
643
|
+
const messageId = stringFrom(raw.responseId) ?? stringFrom(raw.id);
|
|
644
|
+
if (messageId !== void 0) response.messageId = messageId;
|
|
645
|
+
}
|
|
646
|
+
response = mergeGeminiStreamToolCalls(response, [...this.toolCalls.values()]);
|
|
647
|
+
if (this.providerFinishReason !== void 0) {
|
|
648
|
+
applyGeminiFinishReasonValue(response, this.providerFinishReason, this.toolCalls.size > 0);
|
|
649
|
+
}
|
|
650
|
+
assertSafeGeminiCompletionResponse(response);
|
|
651
|
+
return { type: "final", response };
|
|
652
|
+
}
|
|
653
|
+
currentUsage() {
|
|
654
|
+
if (this.finalResponse !== void 0) {
|
|
655
|
+
return this.finalResponse.usage;
|
|
656
|
+
}
|
|
657
|
+
const raw = isPlainObject2(this.terminalChunk) ? this.terminalChunk : {};
|
|
658
|
+
return usageFromGemini(raw.usageMetadata);
|
|
659
|
+
}
|
|
660
|
+
};
|
|
661
|
+
function hasGeminiSemanticProgress(events) {
|
|
662
|
+
return events.some(
|
|
663
|
+
(event) => event.type === "text_delta" || event.type === "reasoning_delta" || event.type === "tool_call_delta" || event.type === "tool_call" || event.type === "provider_tool_call"
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
function sameGeminiToolCall(left, right) {
|
|
667
|
+
return left.toolName === right.toolName && left.callId === right.callId && left.signature === right.signature && sameJsonValue(left.input, right.input);
|
|
668
|
+
}
|
|
669
|
+
function sameJsonValue(left, right) {
|
|
670
|
+
if (Object.is(left, right)) return true;
|
|
671
|
+
if (isJsonArray(left) || isJsonArray(right)) {
|
|
672
|
+
return isJsonArray(left) && isJsonArray(right) && left.length === right.length && left.every((value, index) => {
|
|
673
|
+
const rightValue = right[index];
|
|
674
|
+
return rightValue !== void 0 && sameJsonValue(value, rightValue);
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
if (left === null || right === null || typeof left !== "object" || typeof right !== "object") {
|
|
678
|
+
return false;
|
|
679
|
+
}
|
|
680
|
+
const leftKeys = Object.keys(left);
|
|
681
|
+
const rightKeys = Object.keys(right);
|
|
682
|
+
return leftKeys.length === rightKeys.length && leftKeys.every(
|
|
683
|
+
(key) => Object.hasOwn(right, key) && sameJsonValue(left[key], right[key])
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
function isJsonArray(value) {
|
|
687
|
+
return Array.isArray(value);
|
|
688
|
+
}
|
|
689
|
+
function assistantContentFromGeminiResponse(response, usage) {
|
|
690
|
+
const parts = candidateParts(response, usage);
|
|
691
|
+
const calls = functionCallsFromGeminiResponse(response, parts, usage);
|
|
477
692
|
if (parts.length === 0) {
|
|
478
|
-
const
|
|
479
|
-
|
|
693
|
+
const choice2 = [];
|
|
694
|
+
const text = textFromGeminiResponse(response, parts);
|
|
695
|
+
if (text.length > 0) choice2.push({ type: "text", text });
|
|
696
|
+
choice2.push(...calls.map(toolCallFromGeminiFunctionCall));
|
|
697
|
+
return choice2;
|
|
480
698
|
}
|
|
699
|
+
const callsByPartIndex = new Map(calls.map((call) => [call.partIndex, call]));
|
|
481
700
|
const choice = [];
|
|
482
|
-
for (const part of parts) {
|
|
701
|
+
for (const { index, part } of parts) {
|
|
483
702
|
if (typeof part.text === "string" && part.text.length > 0) {
|
|
484
703
|
if (part.thought === true) {
|
|
485
704
|
choice.push({
|
|
@@ -497,86 +716,337 @@ function assistantContentFromGeminiResponse(response) {
|
|
|
497
716
|
choice.push(text);
|
|
498
717
|
}
|
|
499
718
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
const toolCallId = call.id ?? crypto.randomUUID();
|
|
504
|
-
let toolCall = {
|
|
505
|
-
type: "tool-call",
|
|
506
|
-
toolCallId,
|
|
507
|
-
toolName: call.name,
|
|
508
|
-
input: call.args
|
|
509
|
-
};
|
|
510
|
-
if (call.id !== void 0) toolCall = { ...toolCall, callId: call.id };
|
|
511
|
-
if (call.signature !== void 0) toolCall = { ...toolCall, signature: call.signature };
|
|
512
|
-
choice.push(toolCall);
|
|
513
|
-
}
|
|
719
|
+
const call = callsByPartIndex.get(index);
|
|
720
|
+
if (call !== void 0) {
|
|
721
|
+
choice.push(toolCallFromGeminiFunctionCall(call));
|
|
514
722
|
}
|
|
515
723
|
}
|
|
516
724
|
return choice;
|
|
517
725
|
}
|
|
518
|
-
function textFromGeminiResponse(response) {
|
|
519
|
-
if (
|
|
520
|
-
return
|
|
726
|
+
function textFromGeminiResponse(response, parts = candidateParts(response)) {
|
|
727
|
+
if (parts.length > 0) {
|
|
728
|
+
return parts.flatMap(
|
|
729
|
+
({ part }) => part.thought !== true && typeof part.text === "string" ? [part.text] : []
|
|
730
|
+
).join("");
|
|
521
731
|
}
|
|
522
|
-
|
|
732
|
+
if (hasGeminiCandidatePayload(response)) {
|
|
733
|
+
return "";
|
|
734
|
+
}
|
|
735
|
+
const directText = ownDataProperty(response, "text");
|
|
736
|
+
return typeof directText === "string" ? directText : "";
|
|
523
737
|
}
|
|
524
|
-
function functionCallsFromGeminiResponse(response) {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
normalized.signature = signature;
|
|
738
|
+
function functionCallsFromGeminiResponse(response, parts, usage) {
|
|
739
|
+
if (parts.length > 0) {
|
|
740
|
+
const calls2 = parts.flatMap(({ index, part }) => {
|
|
741
|
+
if (part.functionCall === void 0) {
|
|
742
|
+
return [];
|
|
743
|
+
}
|
|
744
|
+
if (!isPlainObject2(part.functionCall)) {
|
|
745
|
+
throw invalidGeminiToolCall(deterministicGeminiToolCallId(index), usage);
|
|
746
|
+
}
|
|
747
|
+
return [functionCallFromGeminiPart(part.functionCall, part, index, usage)];
|
|
748
|
+
});
|
|
749
|
+
assertDistinctGeminiFunctionCalls(calls2, usage);
|
|
750
|
+
return calls2;
|
|
751
|
+
}
|
|
752
|
+
if (hasGeminiCandidatePayload(response)) {
|
|
753
|
+
return [];
|
|
754
|
+
}
|
|
755
|
+
const camelCaseCalls = ownDataProperty(response, "functionCalls");
|
|
756
|
+
const snakeCaseCalls = ownDataProperty(response, "function_calls");
|
|
757
|
+
const directCalls = Array.isArray(camelCaseCalls) ? camelCaseCalls : Array.isArray(snakeCaseCalls) ? snakeCaseCalls : [];
|
|
758
|
+
const calls = directCalls.map((call, index) => {
|
|
759
|
+
if (!isPlainObject2(call)) {
|
|
760
|
+
throw invalidGeminiToolCall(deterministicGeminiToolCallId(index), usage);
|
|
548
761
|
}
|
|
549
|
-
return
|
|
762
|
+
return functionCallFromGeminiPart(call, call, index, usage);
|
|
550
763
|
});
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
764
|
+
assertDistinctGeminiFunctionCalls(calls, usage);
|
|
765
|
+
return calls;
|
|
766
|
+
}
|
|
767
|
+
function functionCallFromGeminiPart(call, part, partIndex, usage) {
|
|
768
|
+
const fallbackId = deterministicGeminiToolCallId(partIndex);
|
|
769
|
+
const rawCallId = call.id;
|
|
770
|
+
const callId = isNonblankString(rawCallId) ? rawCallId : void 0;
|
|
771
|
+
const toolCallId = callId ?? fallbackId;
|
|
772
|
+
if (rawCallId !== void 0 && callId === void 0) {
|
|
773
|
+
throw invalidGeminiToolCall(toolCallId, usage);
|
|
774
|
+
}
|
|
775
|
+
if (call.partialArgs !== void 0 || call.partial_args !== void 0 || call.willContinue !== void 0 || call.will_continue !== void 0) {
|
|
776
|
+
throw new CompletionProviderOutputError({
|
|
777
|
+
kind: "incomplete-tool-call",
|
|
778
|
+
toolCallId,
|
|
779
|
+
usage
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
const name = call.name;
|
|
783
|
+
if (!isNonblankString(name)) {
|
|
784
|
+
throw invalidGeminiToolCall(toolCallId, usage);
|
|
785
|
+
}
|
|
786
|
+
const args = call.args;
|
|
787
|
+
if (!isPlainObject2(args) || !isJsonValue(args)) {
|
|
788
|
+
throw invalidGeminiToolCallArguments(toolCallId, usage);
|
|
556
789
|
}
|
|
557
790
|
const normalized = {
|
|
558
|
-
|
|
559
|
-
|
|
791
|
+
toolCallId,
|
|
792
|
+
name,
|
|
793
|
+
args,
|
|
794
|
+
partIndex
|
|
560
795
|
};
|
|
561
|
-
const id = stringFrom(call.id);
|
|
562
796
|
const signature = thoughtSignatureFrom(part) ?? thoughtSignatureFrom(call);
|
|
563
|
-
if (
|
|
564
|
-
normalized
|
|
797
|
+
if (callId !== void 0) {
|
|
798
|
+
return signature === void 0 ? { ...normalized, callId } : { ...normalized, callId, signature };
|
|
799
|
+
}
|
|
800
|
+
return signature === void 0 ? normalized : { ...normalized, signature };
|
|
801
|
+
}
|
|
802
|
+
function candidateParts(response, usage) {
|
|
803
|
+
const candidate = primaryGeminiCandidate(response);
|
|
804
|
+
if (candidate === void 0 || candidate.content === void 0) {
|
|
805
|
+
return [];
|
|
806
|
+
}
|
|
807
|
+
if (!isPlainObject2(candidate.content)) {
|
|
808
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call", usage });
|
|
565
809
|
}
|
|
566
|
-
if (
|
|
567
|
-
|
|
810
|
+
if (candidate.content.parts === void 0) return [];
|
|
811
|
+
if (!Array.isArray(candidate.content.parts)) {
|
|
812
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call", usage });
|
|
568
813
|
}
|
|
569
|
-
|
|
814
|
+
if (candidate.content.parts.some((part) => !isPlainObject2(part))) {
|
|
815
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call", usage });
|
|
816
|
+
}
|
|
817
|
+
return candidate.content.parts.map((part, index) => ({
|
|
818
|
+
index,
|
|
819
|
+
part
|
|
820
|
+
}));
|
|
570
821
|
}
|
|
571
|
-
function
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
822
|
+
function primaryGeminiCandidate(response) {
|
|
823
|
+
if (response.candidates === void 0) return void 0;
|
|
824
|
+
if (!Array.isArray(response.candidates)) {
|
|
825
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call" });
|
|
826
|
+
}
|
|
827
|
+
const candidates = response.candidates;
|
|
828
|
+
if (candidates.some(
|
|
829
|
+
(candidate2) => !isPlainObject2(candidate2) || candidate2.index !== void 0 && (!Number.isSafeInteger(candidate2.index) || candidate2.index < 0)
|
|
830
|
+
)) {
|
|
831
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call" });
|
|
832
|
+
}
|
|
833
|
+
const primaryCandidates = candidates.filter(
|
|
834
|
+
(candidate2) => isPlainObject2(candidate2) && candidate2.index === 0
|
|
835
|
+
);
|
|
836
|
+
if (primaryCandidates.length === 1) {
|
|
837
|
+
return primaryCandidates[0];
|
|
838
|
+
}
|
|
839
|
+
if (primaryCandidates.length > 1) {
|
|
840
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call" });
|
|
841
|
+
}
|
|
842
|
+
if (candidates.length === 0) return void 0;
|
|
843
|
+
if (candidates.length !== 1) {
|
|
844
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call" });
|
|
845
|
+
}
|
|
846
|
+
const candidate = candidates[0];
|
|
847
|
+
if (candidate.index !== void 0 && candidate.index !== 0) {
|
|
848
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call" });
|
|
849
|
+
}
|
|
850
|
+
return candidate;
|
|
851
|
+
}
|
|
852
|
+
function providerFinishReasonFromGeminiResponse(response) {
|
|
853
|
+
const candidateFinishReason = stringFrom(primaryGeminiCandidate(response)?.finishReason);
|
|
854
|
+
if (candidateFinishReason !== void 0) return candidateFinishReason;
|
|
855
|
+
const promptFeedback = response.promptFeedback ?? response.prompt_feedback;
|
|
856
|
+
if (promptFeedback === void 0) return void 0;
|
|
857
|
+
if (!isPlainObject2(promptFeedback)) {
|
|
858
|
+
throw new CompletionProviderOutputError({ kind: "invalid-response" });
|
|
859
|
+
}
|
|
860
|
+
const blockReason = promptFeedback.blockReason ?? promptFeedback.block_reason;
|
|
861
|
+
if (blockReason === void 0) return void 0;
|
|
862
|
+
if (typeof blockReason !== "string" || blockReason.length === 0) {
|
|
863
|
+
throw new CompletionProviderOutputError({ kind: "invalid-response" });
|
|
864
|
+
}
|
|
865
|
+
return blockReason;
|
|
866
|
+
}
|
|
867
|
+
function hasGeminiCandidatePayload(response) {
|
|
868
|
+
return Array.isArray(response.candidates) && response.candidates.length > 0;
|
|
869
|
+
}
|
|
870
|
+
function hasGeminiFunctionCallMarker(response, parts) {
|
|
871
|
+
if (parts.some(({ part }) => ownDataProperty(part, "functionCall") !== void 0)) {
|
|
872
|
+
return true;
|
|
873
|
+
}
|
|
874
|
+
if (hasGeminiCandidatePayload(response)) return false;
|
|
875
|
+
const camelCaseCalls = ownDataProperty(response, "functionCalls");
|
|
876
|
+
const snakeCaseCalls = ownDataProperty(response, "function_calls");
|
|
877
|
+
return Array.isArray(camelCaseCalls) && camelCaseCalls.length > 0 || Array.isArray(snakeCaseCalls) && snakeCaseCalls.length > 0;
|
|
878
|
+
}
|
|
879
|
+
function deterministicGeminiToolCallId(partIndex) {
|
|
880
|
+
return `gemini-tool-${partIndex.toString()}`;
|
|
881
|
+
}
|
|
882
|
+
function toolCallFromGeminiFunctionCall(call) {
|
|
883
|
+
let toolCall = {
|
|
884
|
+
type: "tool-call",
|
|
885
|
+
toolCallId: call.toolCallId,
|
|
886
|
+
toolName: call.name,
|
|
887
|
+
input: call.args
|
|
888
|
+
};
|
|
889
|
+
if (call.callId !== void 0) toolCall = { ...toolCall, callId: call.callId };
|
|
890
|
+
if (call.signature !== void 0) toolCall = { ...toolCall, signature: call.signature };
|
|
891
|
+
return toolCall;
|
|
892
|
+
}
|
|
893
|
+
function mergeGeminiStreamToolCalls(response, toolCalls) {
|
|
894
|
+
if (toolCalls.length === 0) return response;
|
|
895
|
+
const finalIds = new Set(
|
|
896
|
+
response.choice.flatMap((part) => part.type === "tool-call" ? [part.toolCallId] : [])
|
|
897
|
+
);
|
|
898
|
+
const missing = toolCalls.filter((toolCall) => !finalIds.has(toolCall.toolCallId));
|
|
899
|
+
return missing.length === 0 ? response : { ...response, choice: [...response.choice, ...missing] };
|
|
900
|
+
}
|
|
901
|
+
function assertSafeGeminiToolFinishReason(value, usage) {
|
|
902
|
+
const error = geminiToolFinishError(value, true, usage);
|
|
903
|
+
if (error !== void 0) throw error;
|
|
904
|
+
}
|
|
905
|
+
function geminiToolFinishError(value, hasToolCalls, usage) {
|
|
906
|
+
if (value === "MALFORMED_FUNCTION_CALL") {
|
|
907
|
+
return new CompletionProviderOutputError({ kind: "malformed-tool-arguments", usage });
|
|
908
|
+
}
|
|
909
|
+
if (value === "UNEXPECTED_TOOL_CALL" || value === "TOO_MANY_TOOL_CALLS") {
|
|
910
|
+
return new CompletionProviderOutputError({ kind: "invalid-tool-call", usage });
|
|
911
|
+
}
|
|
912
|
+
if (!hasToolCalls) return void 0;
|
|
913
|
+
if (value === void 0) {
|
|
914
|
+
return new CompletionProviderOutputError({ kind: "incomplete-tool-call", usage });
|
|
915
|
+
}
|
|
916
|
+
const finishReason = geminiFinishReason(value, true);
|
|
917
|
+
if (finishReason === "tool-calls") return void 0;
|
|
918
|
+
if (finishReason === "length") {
|
|
919
|
+
return new CompletionProviderOutputError({
|
|
920
|
+
kind: "truncated-tool-call",
|
|
921
|
+
finishReason,
|
|
922
|
+
usage
|
|
923
|
+
});
|
|
924
|
+
}
|
|
925
|
+
if (finishReason === "content-filter") {
|
|
926
|
+
return new CompletionProviderOutputError({
|
|
927
|
+
kind: "filtered-tool-call",
|
|
928
|
+
finishReason,
|
|
929
|
+
usage
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
return new CompletionProviderOutputError({ kind: "invalid-tool-call", finishReason, usage });
|
|
933
|
+
}
|
|
934
|
+
function assertSafeGeminiCompletionResponse(response) {
|
|
935
|
+
const toolCalls = response.choice.filter(
|
|
936
|
+
(part) => part.type === "tool-call"
|
|
937
|
+
);
|
|
938
|
+
if (toolCalls.length > 0) {
|
|
939
|
+
if (response.finishReason === void 0) {
|
|
940
|
+
throw new CompletionProviderOutputError({
|
|
941
|
+
kind: "incomplete-tool-call",
|
|
942
|
+
usage: response.usage
|
|
943
|
+
});
|
|
576
944
|
}
|
|
577
|
-
|
|
945
|
+
assertNormalizedGeminiToolFinishReason(response.finishReason, response.usage);
|
|
946
|
+
} else if (toolCalls.length === 0 && response.finishReason === "tool-calls") {
|
|
947
|
+
throw new CompletionProviderOutputError({
|
|
948
|
+
kind: "invalid-tool-call",
|
|
949
|
+
finishReason: response.finishReason,
|
|
950
|
+
usage: response.usage
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
const toolCallIds = /* @__PURE__ */ new Set();
|
|
954
|
+
const callIds = /* @__PURE__ */ new Set();
|
|
955
|
+
for (const toolCall of toolCalls) {
|
|
956
|
+
if (toolCallIds.has(toolCall.toolCallId)) {
|
|
957
|
+
throw invalidGeminiToolCall(toolCall.toolCallId, response.usage);
|
|
958
|
+
}
|
|
959
|
+
toolCallIds.add(toolCall.toolCallId);
|
|
960
|
+
if (toolCall.callId !== void 0) {
|
|
961
|
+
if (callIds.has(toolCall.callId)) {
|
|
962
|
+
throw invalidGeminiToolCall(toolCall.toolCallId, response.usage);
|
|
963
|
+
}
|
|
964
|
+
callIds.add(toolCall.callId);
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
function assertDistinctGeminiFunctionCalls(calls, usage) {
|
|
969
|
+
const toolCallIds = /* @__PURE__ */ new Set();
|
|
970
|
+
const callIds = /* @__PURE__ */ new Set();
|
|
971
|
+
for (const call of calls) {
|
|
972
|
+
if (toolCallIds.has(call.toolCallId)) {
|
|
973
|
+
throw invalidGeminiToolCall(call.toolCallId, usage);
|
|
974
|
+
}
|
|
975
|
+
toolCallIds.add(call.toolCallId);
|
|
976
|
+
if (call.callId !== void 0) {
|
|
977
|
+
if (callIds.has(call.callId)) {
|
|
978
|
+
throw invalidGeminiToolCall(call.toolCallId, usage);
|
|
979
|
+
}
|
|
980
|
+
callIds.add(call.callId);
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
function assertNormalizedGeminiToolFinishReason(finishReason, usage) {
|
|
985
|
+
if (finishReason === "stop" || finishReason === "tool-calls") return;
|
|
986
|
+
if (finishReason === "length") {
|
|
987
|
+
throw new CompletionProviderOutputError({
|
|
988
|
+
kind: "truncated-tool-call",
|
|
989
|
+
finishReason,
|
|
990
|
+
usage
|
|
991
|
+
});
|
|
992
|
+
}
|
|
993
|
+
if (finishReason === "content-filter") {
|
|
994
|
+
throw new CompletionProviderOutputError({
|
|
995
|
+
kind: "filtered-tool-call",
|
|
996
|
+
finishReason,
|
|
997
|
+
usage
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
throw new CompletionProviderOutputError({ kind: "invalid-tool-call", finishReason, usage });
|
|
1001
|
+
}
|
|
1002
|
+
function geminiProviderOutputErrorWithUsage(error, usage) {
|
|
1003
|
+
if (error.kind === "truncated-tool-call") {
|
|
1004
|
+
return new CompletionProviderOutputError({
|
|
1005
|
+
kind: error.kind,
|
|
1006
|
+
finishReason: "length",
|
|
1007
|
+
toolCallId: error.toolCallId,
|
|
1008
|
+
usage
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
if (error.kind === "filtered-tool-call") {
|
|
1012
|
+
return new CompletionProviderOutputError({
|
|
1013
|
+
kind: error.kind,
|
|
1014
|
+
finishReason: "content-filter",
|
|
1015
|
+
toolCallId: error.toolCallId,
|
|
1016
|
+
usage
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
if (error.finishReason === "length" || error.finishReason === "content-filter") {
|
|
1020
|
+
throw error;
|
|
1021
|
+
}
|
|
1022
|
+
return new CompletionProviderOutputError({
|
|
1023
|
+
kind: error.kind,
|
|
1024
|
+
finishReason: error.finishReason,
|
|
1025
|
+
toolCallId: error.toolCallId,
|
|
1026
|
+
usage
|
|
578
1027
|
});
|
|
579
1028
|
}
|
|
1029
|
+
function invalidGeminiToolCall(toolCallId, usage) {
|
|
1030
|
+
return new CompletionProviderOutputError({ kind: "invalid-tool-call", toolCallId, usage });
|
|
1031
|
+
}
|
|
1032
|
+
function invalidGeminiToolCallArguments(toolCallId, usage) {
|
|
1033
|
+
return new CompletionProviderOutputError({
|
|
1034
|
+
kind: "invalid-tool-arguments",
|
|
1035
|
+
toolCallId,
|
|
1036
|
+
usage
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
function ownDataProperty(value, key) {
|
|
1040
|
+
try {
|
|
1041
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
1042
|
+
return descriptor !== void 0 && "value" in descriptor ? descriptor.value : void 0;
|
|
1043
|
+
} catch {
|
|
1044
|
+
return void 0;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
function isNonblankString(value) {
|
|
1048
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
1049
|
+
}
|
|
580
1050
|
function usageFromGemini(usage) {
|
|
581
1051
|
const raw = isPlainObject2(usage) ? usage : {};
|
|
582
1052
|
const promptInputTokens = numberFrom(raw.promptTokenCount);
|
|
@@ -603,17 +1073,11 @@ function usageFromGemini(usage) {
|
|
|
603
1073
|
}
|
|
604
1074
|
};
|
|
605
1075
|
}
|
|
606
|
-
function toJsonValue(value) {
|
|
607
|
-
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean" || Array.isArray(value) || isPlainObject2(value)) {
|
|
608
|
-
return value;
|
|
609
|
-
}
|
|
610
|
-
return String(value);
|
|
611
|
-
}
|
|
612
1076
|
function isPlainObject2(value) {
|
|
613
1077
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
614
1078
|
}
|
|
615
1079
|
function numberFrom(value) {
|
|
616
|
-
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
1080
|
+
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
617
1081
|
}
|
|
618
1082
|
function stringFrom(value) {
|
|
619
1083
|
return typeof value === "string" ? value : void 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gemini/index.ts","../src/gemini/client.ts","../src/gemini/completion.ts","../src/request-messages.ts","../src/gemini/retry.ts","../src/gemini/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/models.ts","../src/gemini/transcription.ts"],"sourcesContent":["export {\n GeminiClient,\n type GeminiClientOptions,\n type GeminiCompletionModelHandle,\n type GeminiCompletionModelOptions,\n type GeminiEmbeddingModelHandle,\n type GeminiImageGenerationModelHandle,\n type GeminiImageGenerationModelOptions,\n type GeminiTranscriptionModelHandle,\n type GeminiTranscriptionModelOptions,\n} from \"./client\";\nexport type {\n GeminiEmbeddingModelOptions,\n GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport type {\n GeminiCompletionModelId,\n GeminiEmbeddingModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n KnownGeminiCompletionModelId,\n KnownGeminiEmbeddingModelId,\n KnownGeminiGenerateContentImageModelId,\n KnownGeminiGenerateImagesModelId,\n} from \"./models\";\n","import {\n type ModelContextLimits,\n resolveModelContextLimits,\n type StreamingCompletionModel,\n} from \"@anvia/core/completion\";\nimport type { EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { ImageGenerationModel } from \"@anvia/core/image-generation\";\nimport {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport type { TranscriptionModel } from \"@anvia/core/transcription\";\nimport { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport { GeminiImageGenerationModel, GeminiImagenGenerationModel } from \"./image-generation\";\nimport type {\n GeminiCompletionModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n} from \"./models\";\nimport { GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey: string;\n vertexAi?: never;\n client?: never;\n};\n\ntype VertexClientOptions = {\n vertexAi: {\n projectId: string;\n location: string;\n googleAuthOptions?: GoogleGenAIOptions[\"googleAuthOptions\"];\n };\n apiKey?: never;\n client?: never;\n};\n\ntype InjectedClientOptions = {\n client: GoogleGenAI;\n apiKey?: never;\n vertexAi?: never;\n};\n\nexport type GeminiClientOptions =\n | GeminiApiClientOptions\n | VertexClientOptions\n | InjectedClientOptions;\n\nexport type GeminiCompletionModelOptions = {\n modelId: GeminiCompletionModelId;\n contextLimits?: ModelContextLimits | undefined;\n};\n\nexport type GeminiImageGenerationModelOptions =\n | { api: \"generateContent\"; modelId: GeminiGenerateContentImageModelId }\n | { api: \"generateImages\"; modelId: GeminiGenerateImagesModelId };\n\nexport type GeminiTranscriptionModelOptions = { modelId: GeminiTranscriptionModelId };\n\nexport type GeminiCompletionModelHandle = StreamingCompletionModel<unknown>;\nexport type GeminiEmbeddingModelHandle = EmbeddingModel;\nexport type GeminiImageGenerationModelHandle = ImageGenerationModel<unknown>;\nexport type GeminiTranscriptionModelHandle = TranscriptionModel<unknown>;\n\nexport class GeminiClient implements ModelListingClient {\n private readonly sdk: GoogleGenAI;\n\n constructor(options: GeminiClientOptions) {\n if (options.client !== undefined) {\n rejectManagedOptionsWithInjectedClient(options, [\"apiKey\", \"vertexAi\"]);\n this.sdk = options.client;\n return;\n }\n this.sdk = new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(options: GeminiCompletionModelOptions): GeminiCompletionModelHandle {\n const modelId = requireModelId(options.modelId);\n return new GeminiCompletionModel(\n this.sdk,\n modelId,\n resolveModelContextLimits(\n modelId,\n GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS,\n options.contextLimits,\n ),\n );\n }\n\n embeddingModel(options: GeminiEmbeddingModelOptions): GeminiEmbeddingModelHandle {\n requireModelId(options.modelId);\n validateOptionalPositiveSafeInteger(options.dimensions, \"dimensions\");\n validateOptionalPositiveSafeInteger(options.maxBatchSize, \"maxBatchSize\");\n return new GeminiEmbeddingModel(this.sdk, options);\n }\n\n imageGenerationModel(\n options: GeminiImageGenerationModelOptions,\n ): GeminiImageGenerationModelHandle {\n const modelId = requireModelId(options.modelId);\n return options.api === \"generateContent\"\n ? new GeminiImageGenerationModel(this.sdk, modelId)\n : new GeminiImagenGenerationModel(this.sdk, modelId);\n }\n\n transcriptionModel(options: GeminiTranscriptionModelOptions): GeminiTranscriptionModelHandle {\n return new GeminiTranscriptionModel(this.sdk, requireModelId(options.modelId));\n }\n\n async listModels(options: { abortSignal?: AbortSignal | undefined } = {}): Promise<ModelList> {\n try {\n const config = { pageSize: 1000 };\n if (options.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.sdk.models.list({\n config: disableGeminiNativeRetries(config),\n });\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"Gemini\", error);\n }\n }\n}\n\nfunction rejectManagedOptionsWithInjectedClient(options: object, keys: readonly string[]): void {\n const conflict = keys.find((key) => key in options);\n if (conflict !== undefined) {\n throw new TypeError(`GeminiClient cannot combine client with ${conflict}.`);\n }\n}\n\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): GoogleGenAIOptions {\n if (\"client\" in options && options.client !== undefined) {\n throw new TypeError(\"Injected Gemini clients do not have managed SDK options.\");\n }\n if (\"vertexAi\" in options && options.vertexAi !== undefined) {\n const sdkOptions: GoogleGenAIOptions = {\n vertexai: true,\n project: requireOption(options.vertexAi.projectId, \"projectId\", \"Vertex Gemini\"),\n location: requireOption(options.vertexAi.location, \"location\", \"Vertex Gemini\"),\n };\n if (options.vertexAi.googleAuthOptions !== undefined) {\n sdkOptions.googleAuthOptions = options.vertexAi.googleAuthOptions;\n }\n return sdkOptions;\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.trim().length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\n}\n\nfunction requireModelId<ModelId extends string>(modelId: ModelId): ModelId {\n if (modelId.trim().length === 0) {\n throw new TypeError(\"modelId must be a non-empty string\");\n }\n return modelId;\n}\n\nfunction validateOptionalPositiveSafeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.models)) {\n return response.models;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model)) {\n return undefined;\n }\n\n const id =\n stringValue(model.baseModelId) ??\n stringValue(model.base_model_id) ??\n normalizeGeminiModelId(stringValue(model.name));\n\n if (id === undefined) {\n return undefined;\n }\n\n const listedModel: ModelList[\"data\"][number] = {\n id,\n };\n if (typeof model.displayName === \"string\") {\n listedModel.name = model.displayName;\n }\n if (typeof model.display_name === \"string\") {\n listedModel.name = model.display_name;\n }\n if (typeof model.description === \"string\") {\n listedModel.description = model.description;\n }\n if (typeof model.type === \"string\") {\n listedModel.type = model.type;\n }\n if (typeof model.inputTokenLimit === \"number\") {\n listedModel.contextLength = model.inputTokenLimit;\n }\n if (typeof model.input_token_limit === \"number\") {\n listedModel.contextLength = model.input_token_limit;\n }\n return listedModel;\n}\n\nfunction normalizeGeminiModelId(name: string | undefined): string | undefined {\n const trimmed = name?.trim().replace(/^models\\//, \"\");\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n statusCode,\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport {\n type AssistantContentPart,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionModelInfo,\n type CompletionModelStreamEvent,\n type CompletionRequest,\n type CompletionResponse,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type ModelCallOptions,\n type StreamingCompletionModel,\n type ToolCallArgumentsMode,\n type ToolChoice,\n type ToolDefinition,\n type ToolResultPart,\n Usage,\n type UserContentPart,\n withContextUsage,\n} from \"@anvia/core/completion\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport type { GeminiCompletionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\ntype GeminiGenerateParams = Record<string, unknown>;\ntype GeminiConfig = Record<string, unknown>;\ntype GeminiContent = {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n};\ntype GeminiPart = Record<string, unknown>;\n\nexport class GeminiCompletionModel implements StreamingCompletionModel<unknown> {\n readonly provider = \"gemini\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: true,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiCompletionModelId,\n readonly contextLimits?: ModelContextLimits,\n ) {}\n\n private modelInfo(): CompletionModelInfo | undefined {\n return this.contextLimits === undefined\n ? undefined\n : { modelId: this.modelId, context: this.contextLimits };\n }\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toGeminiGenerateContentParams(this.modelId, request);\n return providerRequestSummary(params, request, options);\n }\n\n async completion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const response = await this.client.models.generateContent(params as never);\n return withContextUsage(fromGeminiGenerateContentResponse(response), this.modelInfo());\n }\n\n async *streamCompletion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): AsyncIterable<CompletionModelStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const stream = await this.client.models.generateContentStream(params as never);\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n for (const event of fromGeminiGenerateContentStreamChunk(chunk)) {\n yield event.type === \"final\"\n ? {\n ...event,\n response: withContextUsage(event.response, this.modelInfo()),\n }\n : event;\n }\n }\n }\n}\n\nexport function toGeminiGenerateContentParams(\n modelId: GeminiCompletionModelId,\n request: CompletionRequest,\n): GeminiGenerateParams {\n const messages = requestMessages(request);\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? { ...providerConfigValue } : {};\n delete providerConfig.tools;\n const config = disableGeminiNativeRetries({\n ...providerConfig,\n ...geminiConfig(request, messages),\n });\n const params: GeminiGenerateParams = {\n ...providerTopLevel,\n model: modelId,\n contents: messagesToGeminiContents(messages),\n config,\n };\n\n return params;\n}\n\nfunction applyAbortSignal(\n params: GeminiGenerateParams,\n options: ModelCallOptions | undefined,\n): void {\n if (options?.abortSignal === undefined) return;\n const config = isPlainObject(params.config) ? params.config : {};\n params.config = { ...config, abortSignal: options.abortSignal };\n}\n\nfunction providerRequestSummary(\n params: GeminiGenerateParams,\n request: CompletionRequest,\n options: { stream?: boolean | undefined },\n): JsonObject {\n const config = isPlainObject(params.config) ? params.config : {};\n return compactJsonObject({\n provider: \"gemini\",\n api: options.stream === true ? \"models.generateContentStream\" : \"models.generateContent\",\n stream: options.stream === true,\n model: typeof params.model === \"string\" ? params.model : undefined,\n parameterKeys: Object.keys(params).sort(),\n contentCount: Array.isArray(params.contents) ? params.contents.length : undefined,\n configKeys: Object.keys(config).sort(),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n hasSystemInstruction: config.systemInstruction !== undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: toolChoiceSummary(request.toolChoice),\n providerOptionKeys: isPlainObject(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n });\n}\n\nfunction toolChoiceSummary(toolChoice: ToolChoice | undefined): JsonValue | undefined {\n if (toolChoice === undefined || typeof toolChoice === \"string\") {\n return toolChoice;\n }\n return { type: toolChoice.type, name: toolChoice.name };\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(values).flatMap(([key, value]) => {\n if (value === undefined) {\n return [];\n }\n return [[key, toJsonValue(value)]];\n }),\n ) as JsonObject;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request);\n}\n\nfunction geminiConfig(request: CompletionRequest, messages: MessageType[]): GeminiConfig {\n const config: GeminiConfig = {};\n const systemInstruction = systemInstructionFrom(request, messages);\n if (systemInstruction !== undefined) {\n config.systemInstruction = systemInstruction;\n }\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n config.maxOutputTokens = request.maxTokens;\n }\n if (request.tools.length > 0) {\n config.tools = [{ functionDeclarations: request.tools.map(toolDefinitionToGemini) }];\n }\n if (request.toolChoice !== undefined) {\n config.toolConfig = toolChoiceToGemini(request.toolChoice);\n }\n if (request.outputSchema !== undefined) {\n config.responseMimeType = \"application/json\";\n config.responseJsonSchema = request.outputSchema;\n }\n return config;\n}\n\nfunction systemInstructionFrom(\n request: CompletionRequest,\n messages: MessageType[],\n): string | undefined {\n const systemMessages = messages.flatMap((message) =>\n message.role === \"system\" ? [message.content] : [],\n );\n if (request.instructions !== undefined) {\n systemMessages.unshift(request.instructions);\n }\n return systemMessages.length === 0 ? undefined : systemMessages.join(\"\\n\\n\");\n}\n\nexport function messagesToGeminiContents(messages: MessageType[]): GeminiContent[] {\n const toolNamesById = new Map<string, string>();\n const contents: GeminiContent[] = [];\n\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n\n if (message.role === \"assistant\") {\n const content = assistantMessageToGeminiContent(message);\n for (const item of typeof message.content === \"string\" ? [] : message.content) {\n if (item.type === \"tool-call\") {\n toolNamesById.set(item.toolCallId, item.toolName);\n if (item.callId !== undefined) {\n toolNamesById.set(item.callId, item.toolName);\n }\n }\n }\n if (content.parts.length > 0) {\n contents.push(content);\n }\n continue;\n }\n\n const content =\n message.role === \"tool\"\n ? toolMessageToGeminiContent(message, toolNamesById)\n : userMessageToGeminiContent(message);\n if (content.parts.length > 0) {\n contents.push(content);\n }\n }\n\n return contents;\n}\n\nfunction userMessageToGeminiContent(\n message: Extract<MessageType, { role: \"user\" }>,\n): GeminiContent {\n return {\n role: \"user\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.map(userContentToGeminiPart),\n };\n}\n\nfunction toolMessageToGeminiContent(\n message: Extract<MessageType, { role: \"tool\" }>,\n toolNamesById: Map<string, string>,\n): GeminiContent {\n return {\n role: \"user\",\n parts: message.content.map((content) => {\n if (content.type !== \"tool-result\") {\n throw new TypeError(\n \"Anvia interaction responses must be resolved by Agent before provider calls.\",\n );\n }\n return toolContentToGeminiPart(content, toolNamesById);\n }),\n };\n}\n\nfunction assistantMessageToGeminiContent(\n message: Extract<MessageType, { role: \"assistant\" }>,\n): GeminiContent {\n return {\n role: \"model\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.flatMap((content): GeminiPart[] => {\n if (content.type === \"text\") {\n const part: GeminiPart = { text: content.text };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"tool-call\") {\n const functionCall: Record<string, unknown> = {\n name: content.toolName,\n args: content.input,\n };\n if (content.callId !== undefined) {\n functionCall.id = content.callId;\n }\n const part: GeminiPart = { functionCall };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"reasoning\" && content.details !== undefined) {\n return content.details.flatMap((reasoning): GeminiPart[] => {\n if (reasoning.type !== \"text\" && reasoning.type !== \"summary\") {\n return [];\n }\n const part: GeminiPart = { text: reasoning.text, thought: true };\n if (reasoning.type === \"text\" && reasoning.signature !== undefined) {\n part.thoughtSignature = reasoning.signature;\n }\n return [part];\n });\n }\n if (content.type === \"image\" || content.type === \"file\") {\n throw new Error(\n \"Gemini does not support image or file content in assistant history yet\",\n );\n }\n return [];\n }),\n };\n}\n\nfunction userContentToGeminiPart(content: UserContentPart): GeminiPart {\n if (content.type === \"text\") {\n return { text: content.text };\n }\n if (content.type === \"image\") {\n return imageContentToGeminiPart(content);\n }\n return documentContentToGeminiPart(content);\n}\n\nfunction imageContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"image\" }>,\n): GeminiPart {\n if (content.image.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType ?? \"image/png\",\n data: content.image.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.image.url,\n mimeType: content.mediaType ?? mimeTypeFromImageUrl(content.image.url),\n },\n };\n}\n\nfunction mimeTypeFromImageUrl(url: string): string {\n const pathname = safeUrlPathname(url).toLowerCase();\n if (pathname.endsWith(\".jpg\") || pathname.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (pathname.endsWith(\".webp\")) return \"image/webp\";\n if (pathname.endsWith(\".gif\")) return \"image/gif\";\n if (pathname.endsWith(\".bmp\")) return \"image/bmp\";\n if (pathname.endsWith(\".heic\")) return \"image/heic\";\n if (pathname.endsWith(\".heif\")) return \"image/heif\";\n return \"image/png\";\n}\n\nfunction safeUrlPathname(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n}\n\nfunction documentContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"file\" }>,\n): GeminiPart {\n if (content.data.type === \"text\") {\n return { text: content.data.text };\n }\n\n if (content.data.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType,\n data: content.data.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.data.url,\n mimeType: content.mediaType,\n },\n };\n}\n\nfunction toolContentToGeminiPart(\n content: ToolResultPart,\n toolNamesById: Map<string, string>,\n): GeminiPart {\n const id = content.callId ?? content.toolCallId;\n const functionResponse: Record<string, unknown> = {\n name: content.toolName || toolNamesById.get(id) || content.toolCallId,\n response: toolResultResponse(content),\n };\n if (content.callId !== undefined) {\n functionResponse.id = content.callId;\n }\n return { functionResponse };\n}\n\nfunction toolResultResponse(content: ToolResultPart): Record<string, unknown> {\n const output = content.output;\n if (output.type === \"json\") {\n return { result: output.value };\n }\n if (output.type === \"text\") {\n return { content: output.value };\n }\n if (output.type === \"error-json\" || output.type === \"error-text\") {\n return { error: output.value };\n }\n if (output.type === \"execution-denied\") {\n return { error: output.reason ?? \"Tool execution was denied.\" };\n }\n return {\n content: output.value\n .map((item) => (item.type === \"text\" ? item.text : `[file:${item.mediaType}]`))\n .join(\"\\n\"),\n };\n}\n\nfunction toolDefinitionToGemini(tool: ToolDefinition): GeminiPart {\n return {\n name: tool.name,\n description: tool.description,\n parametersJsonSchema: tool.parameters,\n };\n}\n\nfunction toolChoiceToGemini(toolChoice: ToolChoice): GeminiPart {\n if (toolChoice === \"auto\") {\n return { functionCallingConfig: { mode: \"AUTO\" } };\n }\n if (toolChoice === \"required\") {\n return { functionCallingConfig: { mode: \"ANY\" } };\n }\n if (toolChoice === \"none\") {\n return { functionCallingConfig: { mode: \"NONE\" } };\n }\n return {\n functionCallingConfig: {\n mode: \"ANY\",\n allowedFunctionNames: [toolChoice.name],\n },\n };\n}\n\nexport function fromGeminiGenerateContentResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const choice = assistantContentFromGeminiResponse(raw);\n\n const result: CompletionResponse = {\n choice,\n usage: usageFromGemini(raw.usageMetadata),\n rawResponse: response,\n };\n const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);\n if (id !== undefined) {\n result.messageId = id;\n }\n return result;\n}\n\nexport function fromGeminiGenerateContentStreamChunk(chunk: unknown): CompletionModelStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionModelStreamEvent[] = [];\n const directText = typeof chunk.text === \"string\" ? chunk.text : \"\";\n if (directText.length > 0 && candidateParts(chunk).length === 0) {\n events.push({ type: \"text_delta\", delta: directText });\n }\n for (const part of candidateParts(chunk)) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n events.push({ type: \"reasoning_delta\", delta: part.text, contentType: \"summary\" });\n } else {\n events.push({ type: \"text_delta\", delta: part.text });\n }\n }\n }\n for (const call of functionCallsFromGeminiResponse(chunk)) {\n events.push(\n toolCallDelta(call.id ?? call.name, {\n callId: call.id,\n name: call.name,\n signature: call.signature,\n }),\n );\n events.push(\n toolCallDelta(call.id ?? call.name, {\n callId: call.id,\n argumentsDelta: JSON.stringify(call.args ?? {}),\n argumentsMode: \"replace\",\n }),\n );\n }\n const id = stringFrom(chunk.responseId) ?? stringFrom(chunk.id);\n if (id !== undefined) {\n events.push({ type: \"message_id\", id });\n }\n if (isPlainObject(chunk.usageMetadata)) {\n events.push({ type: \"final\", response: fromGeminiGenerateContentResponse(chunk) });\n }\n return events;\n}\n\nfunction assistantContentFromGeminiResponse(\n response: Record<string, unknown>,\n): AssistantContentPart[] {\n const parts = candidateParts(response);\n if (parts.length === 0) {\n const text = textFromGeminiResponse(response);\n return text.length > 0 ? [{ type: \"text\", text }] : [];\n }\n\n const choice: AssistantContentPart[] = [];\n for (const part of parts) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n choice.push({\n type: \"reasoning\",\n text: part.text,\n details: [{ type: \"summary\", text: part.text }],\n });\n } else {\n const signature = thoughtSignatureFrom(part);\n let text: Extract<AssistantContentPart, { type: \"text\" }> = {\n type: \"text\",\n text: part.text,\n };\n if (signature !== undefined) text = { ...text, signature };\n choice.push(text);\n }\n }\n if (isPlainObject(part.functionCall)) {\n const call = functionCallFromGeminiPart(part.functionCall, part);\n if (call !== undefined) {\n const toolCallId = call.id ?? crypto.randomUUID();\n let toolCall: Extract<AssistantContentPart, { type: \"tool-call\" }> = {\n type: \"tool-call\",\n toolCallId,\n toolName: call.name,\n input: call.args,\n };\n if (call.id !== undefined) toolCall = { ...toolCall, callId: call.id };\n if (call.signature !== undefined) toolCall = { ...toolCall, signature: call.signature };\n choice.push(toolCall);\n }\n }\n }\n return choice;\n}\n\nfunction textFromGeminiResponse(response: Record<string, unknown>): string {\n if (typeof response.text === \"string\") {\n return response.text;\n }\n return candidateParts(response)\n .flatMap((part) => (part.thought !== true && typeof part.text === \"string\" ? [part.text] : []))\n .join(\"\");\n}\n\nfunction functionCallsFromGeminiResponse(\n response: Record<string, unknown>,\n): Array<{ id?: string | undefined; name: string; args: JsonValue; signature?: string }> {\n const directCalls = Array.isArray(response.functionCalls)\n ? response.functionCalls\n : Array.isArray(response.function_calls)\n ? response.function_calls\n : [];\n const partCalls = candidateParts(response).flatMap((part) => {\n if (!isPlainObject(part.functionCall)) {\n return [];\n }\n const call = functionCallFromGeminiPart(part.functionCall, part);\n return call === undefined ? [] : [call];\n });\n\n const normalizedDirectCalls = directCalls.flatMap((call) => {\n if (!isPlainObject(call) || typeof call.name !== \"string\") {\n return [];\n }\n const normalized: { id?: string; name: string; args: JsonValue; signature?: string } = {\n name: call.name,\n args: toJsonValue(call.args ?? {}),\n };\n const id = stringFrom(call.id);\n const signature = thoughtSignatureFrom(call);\n if (id !== undefined) {\n normalized.id = id;\n }\n if (signature !== undefined) {\n normalized.signature = signature;\n }\n return [normalized];\n });\n\n return [...normalizedDirectCalls, ...partCalls];\n}\n\nfunction functionCallFromGeminiPart(\n call: Record<string, unknown>,\n part: Record<string, unknown>,\n): { id?: string | undefined; name: string; args: JsonValue; signature?: string } | undefined {\n if (typeof call.name !== \"string\") {\n return undefined;\n }\n const normalized: { id?: string; name: string; args: JsonValue; signature?: string } = {\n name: call.name,\n args: toJsonValue(call.args ?? {}),\n };\n const id = stringFrom(call.id);\n const signature = thoughtSignatureFrom(part) ?? thoughtSignatureFrom(call);\n if (id !== undefined) {\n normalized.id = id;\n }\n if (signature !== undefined) {\n normalized.signature = signature;\n }\n return normalized;\n}\n\nfunction candidateParts(response: Record<string, unknown>): Array<Record<string, unknown>> {\n const candidates = Array.isArray(response.candidates) ? response.candidates : [];\n return candidates.flatMap((candidate) => {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n return [];\n }\n return Array.isArray(candidate.content.parts)\n ? candidate.content.parts.filter(isPlainObject)\n : [];\n });\n}\n\nfunction usageFromGemini(usage: unknown): Usage {\n const raw = isPlainObject(usage) ? usage : {};\n const promptInputTokens = numberFrom(raw.promptTokenCount);\n const toolInputTokens = numberFrom(raw.toolUsePromptTokenCount);\n const inputTokens = promptInputTokens + toolInputTokens;\n const candidateOutputTokens = numberFrom(raw.candidatesTokenCount);\n const reasoningOutputTokens = numberFrom(raw.thoughtsTokenCount);\n const outputTokens = candidateOutputTokens + reasoningOutputTokens;\n const cachedInputTokens = Math.min(promptInputTokens, numberFrom(raw.cachedContentTokenCount));\n const totalTokens = inputTokens + outputTokens;\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n details: {\n input: promptInputTokens - cachedInputTokens,\n input_cached_tokens: cachedInputTokens,\n input_tool_use_tokens: toolInputTokens,\n output: candidateOutputTokens,\n output_reasoning_tokens: reasoningOutputTokens,\n total: totalTokens,\n },\n };\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n Array.isArray(value) ||\n isPlainObject(value)\n ) {\n return value as JsonValue;\n }\n\n return String(value);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction thoughtSignatureFrom(value: Record<string, unknown>): string | undefined {\n return stringFrom(value.thoughtSignature) ?? stringFrom(value.thought_signature);\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n argumentsMode?: ToolCallArgumentsMode | undefined;\n signature?: string | undefined;\n },\n): CompletionModelStreamEvent {\n const event: CompletionModelStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n if (values.argumentsMode !== undefined) event.argumentsMode = values.argumentsMode;\n if (values.signature !== undefined) event.signature = values.signature;\n return event;\n}\n","import {\n type CompletionRequest,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport function orderedRequestMessages(request: CompletionRequest): MessageType[] {\n const messages: MessageType[] = [];\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","export function disableGeminiNativeRetries(\n config: Record<string, unknown>,\n): Record<string, unknown> {\n const httpOptions = isPlainObject(config.httpOptions) ? config.httpOptions : {};\n const retryOptions = isPlainObject(httpOptions.retryOptions) ? httpOptions.retryOptions : {};\n return {\n ...config,\n httpOptions: {\n ...httpOptions,\n retryOptions: {\n ...retryOptions,\n attempts: 1,\n },\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { Embedding, EmbeddingModel, ModelCallOptions } from \"@anvia/core/embeddings\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiEmbeddingModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport type GeminiEmbeddingTaskType =\n | \"TASK_TYPE_UNSPECIFIED\"\n | \"RETRIEVAL_QUERY\"\n | \"RETRIEVAL_DOCUMENT\"\n | \"SEMANTIC_SIMILARITY\"\n | \"CLASSIFICATION\"\n | \"CLUSTERING\"\n | \"QUESTION_ANSWERING\"\n | \"FACT_VERIFICATION\"\n | \"CODE_RETRIEVAL_QUERY\";\n\nexport type GeminiEmbeddingModelOptions = {\n modelId: GeminiEmbeddingModelId;\n dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n taskType?: GeminiEmbeddingTaskType | undefined;\n title?: string | undefined;\n};\n\nexport class GeminiEmbeddingModel implements EmbeddingModel {\n readonly provider = \"gemini\";\n readonly modelId: GeminiEmbeddingModelId;\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n private readonly taskType: GeminiEmbeddingTaskType | undefined;\n private readonly title: string | undefined;\n\n constructor(\n private readonly client: GoogleGenAI,\n options: GeminiEmbeddingModelOptions,\n ) {\n this.modelId = options.modelId;\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 100;\n this.taskType = options.taskType;\n this.title = options.title;\n }\n\n async embedTexts(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch, options)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const config = { ...this.embeddingConfig() };\n if (options?.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.client.models.embedContent({\n model: this.modelId,\n contents: texts,\n config: disableGeminiNativeRetries(config),\n } as never);\n const rawEmbeddings = embeddingsFromResponse(response);\n if (rawEmbeddings.length !== texts.length) {\n throw new Error(\n `Embedding response length ${rawEmbeddings.length} did not match input length ${texts.length}`,\n );\n }\n\n return rawEmbeddings.map((vector, index) => ({\n document: texts[index] as string,\n vector,\n }));\n }\n\n private embeddingConfig(): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n if (this.dimensions !== undefined) config.outputDimensionality = this.dimensions;\n if (this.taskType !== undefined) config.taskType = this.taskType;\n if (this.title !== undefined) config.title = this.title;\n return config;\n }\n}\n\nfunction embeddingsFromResponse(response: unknown): number[][] {\n const raw = response as Record<string, unknown>;\n if (Array.isArray(raw.embeddings)) {\n return raw.embeddings.map((embedding, index) => vectorFromEmbedding(embedding, index));\n }\n if (raw.embedding !== undefined) {\n return [vectorFromEmbedding(raw.embedding, 0)];\n }\n return [];\n}\n\nfunction vectorFromEmbedding(embedding: unknown, position: number): number[] {\n if (!isObject(embedding) || !isNumberArray(embedding.values)) {\n throw new Error(`Invalid Gemini embedding response vector at position ${position}.`);\n }\n return embedding.values;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNumberArray(value: unknown): value is number[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"number\");\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResult,\n ModelCallOptions,\n} from \"@anvia/core/image-generation\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiGenerateContentImageModelId, GeminiGenerateImagesModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport const GEMINI_2_5_FLASH_IMAGE = \"gemini-2.5-flash-image\";\nexport const GEMINI_3_PRO_IMAGE_PREVIEW = \"gemini-3-pro-image-preview\";\nexport const IMAGEN_4_GENERATE = \"imagen-4.0-generate-001\";\n\nexport class GeminiImageGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateContentImageModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const providerImageConfig = isPlainObject(providerConfig.imageConfig)\n ? providerConfig.imageConfig\n : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: {\n ...providerImageConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n },\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n contents: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateContent(params as never);\n return nativeImageResponseFromGemini(response);\n }\n}\n\nexport class GeminiImagenGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateImagesModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n prompt: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateImages(params as never);\n return imagenResponseFromGemini(response);\n }\n}\n\nexport function nativeImageResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n const images = candidates.flatMap((candidate): GeneratedImage[] => {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n return [];\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n return parts.flatMap((part): GeneratedImage[] => {\n if (!isPlainObject(part) || !isPlainObject(part.inlineData)) {\n return [];\n }\n const data = part.inlineData.data;\n if (typeof data !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(data),\n mediaType:\n typeof part.inlineData.mimeType === \"string\" ? part.inlineData.mimeType : \"image/png\",\n },\n ];\n });\n });\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no inline image data.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function imagenResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const images = (Array.isArray(raw.generatedImages) ? raw.generatedImages : []).flatMap(\n (item): GeneratedImage[] => {\n if (!isPlainObject(item) || !isPlainObject(item.image)) {\n return [];\n }\n const imageBytes = item.image.imageBytes;\n if (typeof imageBytes !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(imageBytes),\n mediaType: typeof item.image.mimeType === \"string\" ? item.image.mimeType : \"image/png\",\n },\n ];\n },\n );\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no base64 images.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function aspectRatio(width: number, height: number): string {\n const normalizedWidth = Math.max(1, Math.trunc(width));\n const normalizedHeight = Math.max(1, Math.trunc(height));\n const divisor = gcd(normalizedWidth, normalizedHeight);\n return `${normalizedWidth / divisor}:${normalizedHeight / divisor}`;\n}\n\nfunction gcd(left: number, right: number): number {\n let a = left;\n let b = right;\n while (b !== 0) {\n const next = a % b;\n a = b;\n b = next;\n }\n return a;\n}\n\nfunction decodeBase64Image(value: string): Uint8Array {\n const normalized = value.replace(/\\s/g, \"\").replace(/=+$/, \"\");\n const bytes = Buffer.from(value, \"base64\");\n const roundTrip = bytes.toString(\"base64\").replace(/=+$/, \"\");\n if (normalized.length === 0 || bytes.length === 0 || roundTrip !== normalized) {\n throw new Error(\"Gemini image generation response contained invalid base64 image data.\");\n }\n return new Uint8Array(bytes);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport type { ModelId } from \"@anvia/core/model-listing\";\n\nexport type KnownGeminiCompletionModelId =\n | \"gemini-2.0-flash\"\n | \"gemini-2.0-flash-lite\"\n | \"gemini-2.5-flash\"\n | \"gemini-2.5-flash-image\"\n | \"gemini-2.5-flash-lite\"\n | \"gemini-2.5-flash-preview-tts\"\n | \"gemini-2.5-pro\"\n | \"gemini-2.5-pro-preview-tts\"\n | \"gemini-3-flash-preview\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3-pro-preview\"\n | \"gemini-3.1-flash-image-preview\"\n | \"gemini-3.1-flash-lite\"\n | \"gemini-3.1-flash-lite-preview\"\n | \"gemini-3.1-pro-preview\"\n | \"gemini-3.1-pro-preview-customtools\"\n | \"gemini-3.5-flash\"\n | \"gemini-flash-latest\"\n | \"gemini-flash-lite-latest\"\n | \"gemma-4-26b-a4b-it\"\n | \"gemma-4-31b-it\";\n\nexport type GeminiCompletionModelId = ModelId<KnownGeminiCompletionModelId>;\n\nconst CONTEXT_1M_64K = {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 65_536,\n};\n\nexport const GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS = {\n \"gemini-2.0-flash\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.0-flash-lite\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.5-flash\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-image\": {\n contextWindow: 32_768,\n maxInputTokens: 32_768,\n maxOutputTokens: 32_768,\n },\n \"gemini-2.5-flash-lite\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-2.5-pro\": CONTEXT_1M_64K,\n \"gemini-2.5-pro-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-3-flash-preview\": CONTEXT_1M_64K,\n \"gemini-3-pro-image-preview\": {\n contextWindow: 131_072,\n maxInputTokens: 131_072,\n maxOutputTokens: 32_768,\n },\n \"gemini-3-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-image-preview\": {\n contextWindow: 65_536,\n maxInputTokens: 65_536,\n maxOutputTokens: 65_536,\n },\n \"gemini-3.1-flash-lite\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-lite-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview-customtools\": CONTEXT_1M_64K,\n \"gemini-3.5-flash\": CONTEXT_1M_64K,\n \"gemini-flash-latest\": CONTEXT_1M_64K,\n \"gemini-flash-lite-latest\": CONTEXT_1M_64K,\n \"gemma-4-26b-a4b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n \"gemma-4-31b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n} satisfies Readonly<Record<KnownGeminiCompletionModelId, ModelContextLimits>>;\n\nexport type KnownGeminiEmbeddingModelId = \"gemini-embedding-001\";\n\nexport type GeminiEmbeddingModelId = ModelId<KnownGeminiEmbeddingModelId>;\n\nexport type KnownGeminiGenerateContentImageModelId =\n | \"gemini-2.5-flash-image\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3.1-flash-image-preview\";\n\nexport type KnownGeminiGenerateImagesModelId = \"imagen-4.0-generate-001\";\n\nexport type GeminiGenerateContentImageModelId = ModelId<KnownGeminiGenerateContentImageModelId>;\nexport type GeminiGenerateImagesModelId = ModelId<KnownGeminiGenerateImagesModelId>;\n\nexport type GeminiTranscriptionModelId = GeminiCompletionModelId;\n","import { Buffer } from \"node:buffer\";\nimport type {\n ModelCallOptions,\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResult,\n} from \"@anvia/core/transcription\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiTranscriptionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nconst TRANSCRIPTION_PREAMBLE =\n \"Transcribe the provided audio exactly. Do not add additional information.\";\n\nexport class GeminiTranscriptionModel implements TranscriptionModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiTranscriptionModelId,\n ) {}\n\n async transcription(\n request: TranscriptionRequest,\n options?: ModelCallOptions,\n ): Promise<TranscriptionResult<unknown>> {\n const config: Record<string, unknown> = isPlainObject(request.providerOptions)\n ? { ...request.providerOptions }\n : {};\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n\n const response = await this.client.models.generateContent({\n model: this.modelId,\n contents: [\n {\n role: \"user\",\n parts: [\n {\n inlineData: {\n mimeType: request.mediaType ?? mimeTypeFromFilename(request.filename),\n data: Buffer.from(request.data).toString(\"base64\"),\n },\n },\n ],\n },\n ],\n config: disableGeminiNativeRetries({\n ...config,\n systemInstruction:\n request.prompt === undefined\n ? TRANSCRIPTION_PREAMBLE\n : `${TRANSCRIPTION_PREAMBLE}\\n\\n${request.prompt}`,\n }),\n } as never);\n\n return {\n text: textFromGenerateContentResponse(response),\n rawResponse: response,\n };\n }\n}\n\nexport function textFromGenerateContentResponse(response: unknown): string {\n const raw = response as Record<string, unknown>;\n if (typeof raw.text === \"string\") {\n return raw.text;\n }\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n for (const candidate of candidates) {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n continue;\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n for (const part of parts) {\n if (isPlainObject(part) && typeof part.text === \"string\") {\n return part.text;\n }\n }\n }\n throw new Error(\"Gemini transcription response contained no text.\");\n}\n\nfunction mimeTypeFromFilename(filename: string): string {\n const lower = filename.toLowerCase();\n if (lower.endsWith(\".wav\")) return \"audio/wav\";\n if (lower.endsWith(\".aac\")) return \"audio/aac\";\n if (lower.endsWith(\".ogg\")) return \"audio/ogg\";\n if (lower.endsWith(\".flac\")) return \"audio/flac\";\n if (lower.endsWith(\".m4a\")) return \"audio/m4a\";\n if (lower.endsWith(\".opus\")) return \"audio/opus\";\n return \"audio/mpeg\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["isPlainObject","content","Buffer","isPlainObject","Buffer","Buffer","isPlainObject","Buffer","isObject"]}
|
|
1
|
+
{"version":3,"sources":["../src/gemini/index.ts","../src/gemini/client.ts","../src/gemini/completion.ts","../src/request-messages.ts","../src/gemini/retry.ts","../src/gemini/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/models.ts","../src/gemini/transcription.ts"],"sourcesContent":["export {\n GeminiClient,\n type GeminiClientOptions,\n type GeminiCompletionModelHandle,\n type GeminiCompletionModelOptions,\n type GeminiEmbeddingModelHandle,\n type GeminiImageGenerationModelHandle,\n type GeminiImageGenerationModelOptions,\n type GeminiTranscriptionModelHandle,\n type GeminiTranscriptionModelOptions,\n} from \"./client\";\nexport type {\n GeminiEmbeddingModelOptions,\n GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport type {\n GeminiCompletionModelId,\n GeminiEmbeddingModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n KnownGeminiCompletionModelId,\n KnownGeminiEmbeddingModelId,\n KnownGeminiGenerateContentImageModelId,\n KnownGeminiGenerateImagesModelId,\n} from \"./models\";\n","import {\n type ModelContextLimits,\n resolveModelContextLimits,\n type StreamingCompletionModel,\n} from \"@anvia/core/completion\";\nimport type { EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { ImageGenerationModel } from \"@anvia/core/image-generation\";\nimport {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport type { TranscriptionModel } from \"@anvia/core/transcription\";\nimport { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport { GeminiImageGenerationModel, GeminiImagenGenerationModel } from \"./image-generation\";\nimport type {\n GeminiCompletionModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n} from \"./models\";\nimport { GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey: string;\n vertexAi?: never;\n client?: never;\n};\n\ntype VertexClientOptions = {\n vertexAi: {\n projectId: string;\n location: string;\n googleAuthOptions?: GoogleGenAIOptions[\"googleAuthOptions\"];\n };\n apiKey?: never;\n client?: never;\n};\n\ntype InjectedClientOptions = {\n client: GoogleGenAI;\n apiKey?: never;\n vertexAi?: never;\n};\n\nexport type GeminiClientOptions =\n | GeminiApiClientOptions\n | VertexClientOptions\n | InjectedClientOptions;\n\nexport type GeminiCompletionModelOptions = {\n modelId: GeminiCompletionModelId;\n contextLimits?: ModelContextLimits | undefined;\n};\n\nexport type GeminiImageGenerationModelOptions =\n | { api: \"generateContent\"; modelId: GeminiGenerateContentImageModelId }\n | { api: \"generateImages\"; modelId: GeminiGenerateImagesModelId };\n\nexport type GeminiTranscriptionModelOptions = { modelId: GeminiTranscriptionModelId };\n\nexport type GeminiCompletionModelHandle = StreamingCompletionModel<unknown>;\nexport type GeminiEmbeddingModelHandle = EmbeddingModel;\nexport type GeminiImageGenerationModelHandle = ImageGenerationModel<unknown>;\nexport type GeminiTranscriptionModelHandle = TranscriptionModel<unknown>;\n\nexport class GeminiClient implements ModelListingClient {\n private readonly sdk: GoogleGenAI;\n\n constructor(options: GeminiClientOptions) {\n if (options.client !== undefined) {\n rejectManagedOptionsWithInjectedClient(options, [\"apiKey\", \"vertexAi\"]);\n this.sdk = options.client;\n return;\n }\n this.sdk = new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(options: GeminiCompletionModelOptions): GeminiCompletionModelHandle {\n const modelId = requireModelId(options.modelId);\n return new GeminiCompletionModel(\n this.sdk,\n modelId,\n resolveModelContextLimits(\n modelId,\n GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS,\n options.contextLimits,\n ),\n );\n }\n\n embeddingModel(options: GeminiEmbeddingModelOptions): GeminiEmbeddingModelHandle {\n requireModelId(options.modelId);\n validateOptionalPositiveSafeInteger(options.dimensions, \"dimensions\");\n validateOptionalPositiveSafeInteger(options.maxBatchSize, \"maxBatchSize\");\n return new GeminiEmbeddingModel(this.sdk, options);\n }\n\n imageGenerationModel(\n options: GeminiImageGenerationModelOptions,\n ): GeminiImageGenerationModelHandle {\n const modelId = requireModelId(options.modelId);\n return options.api === \"generateContent\"\n ? new GeminiImageGenerationModel(this.sdk, modelId)\n : new GeminiImagenGenerationModel(this.sdk, modelId);\n }\n\n transcriptionModel(options: GeminiTranscriptionModelOptions): GeminiTranscriptionModelHandle {\n return new GeminiTranscriptionModel(this.sdk, requireModelId(options.modelId));\n }\n\n async listModels(options: { abortSignal?: AbortSignal | undefined } = {}): Promise<ModelList> {\n try {\n const config = { pageSize: 1000 };\n if (options.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.sdk.models.list({\n config: disableGeminiNativeRetries(config),\n });\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"Gemini\", error);\n }\n }\n}\n\nfunction rejectManagedOptionsWithInjectedClient(options: object, keys: readonly string[]): void {\n const conflict = keys.find((key) => key in options);\n if (conflict !== undefined) {\n throw new TypeError(`GeminiClient cannot combine client with ${conflict}.`);\n }\n}\n\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): GoogleGenAIOptions {\n if (\"client\" in options && options.client !== undefined) {\n throw new TypeError(\"Injected Gemini clients do not have managed SDK options.\");\n }\n if (\"vertexAi\" in options && options.vertexAi !== undefined) {\n const sdkOptions: GoogleGenAIOptions = {\n vertexai: true,\n project: requireOption(options.vertexAi.projectId, \"projectId\", \"Vertex Gemini\"),\n location: requireOption(options.vertexAi.location, \"location\", \"Vertex Gemini\"),\n };\n if (options.vertexAi.googleAuthOptions !== undefined) {\n sdkOptions.googleAuthOptions = options.vertexAi.googleAuthOptions;\n }\n return sdkOptions;\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.trim().length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\n}\n\nfunction requireModelId<ModelId extends string>(modelId: ModelId): ModelId {\n if (modelId.trim().length === 0) {\n throw new TypeError(\"modelId must be a non-empty string\");\n }\n return modelId;\n}\n\nfunction validateOptionalPositiveSafeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.models)) {\n return response.models;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model)) {\n return undefined;\n }\n\n const id =\n stringValue(model.baseModelId) ??\n stringValue(model.base_model_id) ??\n normalizeGeminiModelId(stringValue(model.name));\n\n if (id === undefined) {\n return undefined;\n }\n\n const listedModel: ModelList[\"data\"][number] = {\n id,\n };\n if (typeof model.displayName === \"string\") {\n listedModel.name = model.displayName;\n }\n if (typeof model.display_name === \"string\") {\n listedModel.name = model.display_name;\n }\n if (typeof model.description === \"string\") {\n listedModel.description = model.description;\n }\n if (typeof model.type === \"string\") {\n listedModel.type = model.type;\n }\n if (typeof model.inputTokenLimit === \"number\") {\n listedModel.contextLength = model.inputTokenLimit;\n }\n if (typeof model.input_token_limit === \"number\") {\n listedModel.contextLength = model.input_token_limit;\n }\n return listedModel;\n}\n\nfunction normalizeGeminiModelId(name: string | undefined): string | undefined {\n const trimmed = name?.trim().replace(/^models\\//, \"\");\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n statusCode,\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport {\n type AssistantContentPart,\n assertCompletionRequestSupported,\n type CompletionFinishReason,\n type CompletionModelCapabilities,\n type CompletionModelInfo,\n type CompletionModelStreamEvent,\n CompletionProviderOutputError,\n type CompletionRequest,\n type CompletionResponse,\n isJsonValue,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type ModelCallOptions,\n type StreamingCompletionModel,\n type ToolCallArgumentsMode,\n type ToolChoice,\n type ToolDefinition,\n type ToolResultPart,\n Usage,\n type UserContentPart,\n withContextUsage,\n} from \"@anvia/core/completion\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport type { GeminiCompletionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\ntype GeminiGenerateParams = Record<string, unknown>;\ntype GeminiConfig = Record<string, unknown>;\ntype GeminiContent = {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n};\ntype GeminiPart = Record<string, unknown>;\ntype IndexedGeminiPart = Readonly<{\n index: number;\n part: GeminiPart;\n}>;\ntype GeminiFunctionCall = Readonly<{\n toolCallId: string;\n callId?: string | undefined;\n name: string;\n args: JsonObject;\n signature?: string | undefined;\n partIndex: number;\n}>;\ntype GeminiStreamChunkMapping = Readonly<{\n events: CompletionModelStreamEvent[];\n toolCalls: Extract<AssistantContentPart, { type: \"tool-call\" }>[];\n hasToolCallMarker: boolean;\n hasSyntheticToolCalls: boolean;\n providerFinishReason?: string | undefined;\n terminalError?: CompletionProviderOutputError | undefined;\n}>;\n\nexport class GeminiCompletionModel implements StreamingCompletionModel<unknown> {\n readonly provider = \"gemini\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: true,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiCompletionModelId,\n readonly contextLimits?: ModelContextLimits,\n ) {}\n\n private modelInfo(): CompletionModelInfo | undefined {\n return this.contextLimits === undefined\n ? undefined\n : { modelId: this.modelId, context: this.contextLimits };\n }\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toGeminiGenerateContentParams(this.modelId, request);\n return providerRequestSummary(params, request, options);\n }\n\n async completion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const response = await this.client.models.generateContent(params as never);\n return withContextUsage(fromGeminiGenerateContentResponse(response), this.modelInfo());\n }\n\n async *streamCompletion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): AsyncIterable<CompletionModelStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const stream = await this.client.models.generateContentStream(params as never);\n const streamState = new GeminiCompletionStreamState();\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n const mapping = mapGeminiGenerateContentStreamChunk(chunk);\n streamState.accept(chunk, mapping);\n for (const event of mapping.events) {\n if (event.type !== \"final\") {\n yield event;\n }\n }\n }\n streamState.assertComplete();\n const finalEvent = streamState.finalEvent();\n if (finalEvent !== undefined) {\n yield {\n ...finalEvent,\n response: withContextUsage(finalEvent.response, this.modelInfo()),\n };\n }\n }\n}\n\nexport function toGeminiGenerateContentParams(\n modelId: GeminiCompletionModelId,\n request: CompletionRequest,\n): GeminiGenerateParams {\n const messages = requestMessages(request);\n if (\n request.providerOptions !== undefined &&\n (!isPlainObject(request.providerOptions) || !isJsonValue(request.providerOptions))\n ) {\n throw new TypeError(\"Gemini providerOptions must be a JSON object.\");\n }\n const providerOptions = request.providerOptions ?? {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n if (providerConfigValue !== undefined && !isPlainObject(providerConfigValue)) {\n throw new TypeError(\"Gemini providerOptions.config must be a JSON object.\");\n }\n const providerConfig = providerConfigValue === undefined ? {} : { ...providerConfigValue };\n delete providerConfig.tools;\n const config = disableGeminiNativeRetries({\n ...providerConfig,\n ...geminiConfig(request, messages),\n });\n const params: GeminiGenerateParams = {\n ...providerTopLevel,\n model: modelId,\n contents: messagesToGeminiContents(messages),\n config,\n };\n\n return params;\n}\n\nfunction applyAbortSignal(\n params: GeminiGenerateParams,\n options: ModelCallOptions | undefined,\n): void {\n if (options?.abortSignal === undefined) return;\n const config = isPlainObject(params.config) ? params.config : {};\n params.config = { ...config, abortSignal: options.abortSignal };\n}\n\nfunction providerRequestSummary(\n params: GeminiGenerateParams,\n request: CompletionRequest,\n options: { stream?: boolean | undefined },\n): JsonObject {\n const config = isPlainObject(params.config) ? params.config : {};\n return compactJsonObject({\n provider: \"gemini\",\n api: options.stream === true ? \"models.generateContentStream\" : \"models.generateContent\",\n stream: options.stream === true,\n model: typeof params.model === \"string\" ? params.model : undefined,\n parameterKeys: Object.keys(params).sort(),\n contentCount: Array.isArray(params.contents) ? params.contents.length : undefined,\n configKeys: Object.keys(config).sort(),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n hasSystemInstruction: config.systemInstruction !== undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: toolChoiceSummary(request.toolChoice),\n providerOptionKeys: isPlainObject(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n });\n}\n\nfunction toolChoiceSummary(toolChoice: ToolChoice | undefined): JsonValue | undefined {\n if (toolChoice === undefined || typeof toolChoice === \"string\") {\n return toolChoice;\n }\n return { type: toolChoice.type, name: toolChoice.name };\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(values).flatMap(([key, value]) => {\n if (!isJsonValue(value)) {\n return [];\n }\n return [[key, value]];\n }),\n ) as JsonObject;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request);\n}\n\nfunction geminiConfig(request: CompletionRequest, messages: MessageType[]): GeminiConfig {\n const config: GeminiConfig = {};\n const systemInstruction = systemInstructionFrom(request, messages);\n if (systemInstruction !== undefined) {\n config.systemInstruction = systemInstruction;\n }\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n config.maxOutputTokens = request.maxTokens;\n }\n if (request.tools.length > 0) {\n config.tools = [{ functionDeclarations: request.tools.map(toolDefinitionToGemini) }];\n }\n if (request.toolChoice !== undefined) {\n config.toolConfig = toolChoiceToGemini(request.toolChoice);\n }\n if (request.outputSchema !== undefined) {\n config.responseMimeType = \"application/json\";\n config.responseJsonSchema = request.outputSchema;\n }\n return config;\n}\n\nfunction systemInstructionFrom(\n request: CompletionRequest,\n messages: MessageType[],\n): string | undefined {\n const systemMessages = messages.flatMap((message) =>\n message.role === \"system\" ? [message.content] : [],\n );\n if (request.instructions !== undefined) {\n systemMessages.unshift(request.instructions);\n }\n return systemMessages.length === 0 ? undefined : systemMessages.join(\"\\n\\n\");\n}\n\nexport function messagesToGeminiContents(messages: MessageType[]): GeminiContent[] {\n const toolNamesById = new Map<string, string>();\n const contents: GeminiContent[] = [];\n\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n\n if (message.role === \"assistant\") {\n const content = assistantMessageToGeminiContent(message);\n for (const item of typeof message.content === \"string\" ? [] : message.content) {\n if (item.type === \"tool-call\") {\n toolNamesById.set(item.toolCallId, item.toolName);\n if (item.callId !== undefined) {\n toolNamesById.set(item.callId, item.toolName);\n }\n }\n }\n if (content.parts.length > 0) {\n contents.push(content);\n }\n continue;\n }\n\n const content =\n message.role === \"tool\"\n ? toolMessageToGeminiContent(message, toolNamesById)\n : userMessageToGeminiContent(message);\n if (content.parts.length > 0) {\n contents.push(content);\n }\n }\n\n return contents;\n}\n\nfunction userMessageToGeminiContent(\n message: Extract<MessageType, { role: \"user\" }>,\n): GeminiContent {\n return {\n role: \"user\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.map(userContentToGeminiPart),\n };\n}\n\nfunction toolMessageToGeminiContent(\n message: Extract<MessageType, { role: \"tool\" }>,\n toolNamesById: Map<string, string>,\n): GeminiContent {\n return {\n role: \"user\",\n parts: message.content.map((content) => {\n if (content.type !== \"tool-result\") {\n throw new TypeError(\n \"Anvia interaction responses must be resolved by Agent before provider calls.\",\n );\n }\n return toolContentToGeminiPart(content, toolNamesById);\n }),\n };\n}\n\nfunction assistantMessageToGeminiContent(\n message: Extract<MessageType, { role: \"assistant\" }>,\n): GeminiContent {\n return {\n role: \"model\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.flatMap((content): GeminiPart[] => {\n if (content.type === \"text\") {\n const part: GeminiPart = { text: content.text };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"tool-call\") {\n const functionCall: Record<string, unknown> = {\n name: content.toolName,\n args: content.input,\n };\n if (content.callId !== undefined) {\n functionCall.id = content.callId;\n }\n const part: GeminiPart = { functionCall };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"reasoning\" && content.details !== undefined) {\n return content.details.flatMap((reasoning): GeminiPart[] => {\n if (reasoning.type !== \"text\" && reasoning.type !== \"summary\") {\n return [];\n }\n const part: GeminiPart = { text: reasoning.text, thought: true };\n if (reasoning.type === \"text\" && reasoning.signature !== undefined) {\n part.thoughtSignature = reasoning.signature;\n }\n return [part];\n });\n }\n if (content.type === \"image\" || content.type === \"file\") {\n throw new Error(\n \"Gemini does not support image or file content in assistant history yet\",\n );\n }\n return [];\n }),\n };\n}\n\nfunction userContentToGeminiPart(content: UserContentPart): GeminiPart {\n if (content.type === \"text\") {\n return { text: content.text };\n }\n if (content.type === \"image\") {\n return imageContentToGeminiPart(content);\n }\n return documentContentToGeminiPart(content);\n}\n\nfunction imageContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"image\" }>,\n): GeminiPart {\n if (content.image.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType ?? \"image/png\",\n data: content.image.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.image.url,\n mimeType: content.mediaType ?? mimeTypeFromImageUrl(content.image.url),\n },\n };\n}\n\nfunction mimeTypeFromImageUrl(url: string): string {\n const pathname = safeUrlPathname(url).toLowerCase();\n if (pathname.endsWith(\".jpg\") || pathname.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (pathname.endsWith(\".webp\")) return \"image/webp\";\n if (pathname.endsWith(\".gif\")) return \"image/gif\";\n if (pathname.endsWith(\".bmp\")) return \"image/bmp\";\n if (pathname.endsWith(\".heic\")) return \"image/heic\";\n if (pathname.endsWith(\".heif\")) return \"image/heif\";\n return \"image/png\";\n}\n\nfunction safeUrlPathname(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n}\n\nfunction documentContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"file\" }>,\n): GeminiPart {\n if (content.data.type === \"text\") {\n return { text: content.data.text };\n }\n\n if (content.data.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType,\n data: content.data.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.data.url,\n mimeType: content.mediaType,\n },\n };\n}\n\nfunction toolContentToGeminiPart(\n content: ToolResultPart,\n toolNamesById: Map<string, string>,\n): GeminiPart {\n const id = content.callId ?? content.toolCallId;\n const functionResponse: Record<string, unknown> = {\n name: content.toolName || toolNamesById.get(id) || content.toolCallId,\n response: toolResultResponse(content),\n };\n if (content.callId !== undefined) {\n functionResponse.id = content.callId;\n }\n return { functionResponse };\n}\n\nfunction toolResultResponse(content: ToolResultPart): Record<string, unknown> {\n const output = content.output;\n if (output.type === \"json\") {\n return { result: output.value };\n }\n if (output.type === \"text\") {\n return { content: output.value };\n }\n if (output.type === \"error-json\" || output.type === \"error-text\") {\n return { error: output.value };\n }\n if (output.type === \"execution-denied\") {\n return { error: output.reason ?? \"Tool execution was denied.\" };\n }\n return {\n content: output.value\n .map((item) => (item.type === \"text\" ? item.text : `[file:${item.mediaType}]`))\n .join(\"\\n\"),\n };\n}\n\nfunction toolDefinitionToGemini(tool: ToolDefinition): GeminiPart {\n return {\n name: tool.name,\n description: tool.description,\n parametersJsonSchema: tool.parameters,\n };\n}\n\nfunction toolChoiceToGemini(toolChoice: ToolChoice): GeminiPart {\n if (toolChoice === \"auto\") {\n return { functionCallingConfig: { mode: \"AUTO\" } };\n }\n if (toolChoice === \"required\") {\n return { functionCallingConfig: { mode: \"ANY\" } };\n }\n if (toolChoice === \"none\") {\n return { functionCallingConfig: { mode: \"NONE\" } };\n }\n return {\n functionCallingConfig: {\n mode: \"ANY\",\n allowedFunctionNames: [toolChoice.name],\n },\n };\n}\n\nexport function fromGeminiGenerateContentResponse(response: unknown): CompletionResponse {\n const raw = isPlainObject(response) ? response : {};\n const usage = usageFromGemini(raw.usageMetadata);\n const parts = candidateParts(raw, usage);\n const providerFinishReason = providerFinishReasonFromGeminiResponse(raw);\n const finishError = geminiToolFinishError(\n providerFinishReason,\n hasGeminiFunctionCallMarker(raw, parts),\n usage,\n );\n if (finishError !== undefined) throw finishError;\n const choice = assistantContentFromGeminiResponse(raw, usage);\n\n const result: CompletionResponse = {\n choice,\n usage,\n rawResponse: response,\n };\n applyGeminiFinishReason(result, raw);\n const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);\n if (id !== undefined) {\n result.messageId = id;\n }\n assertSafeGeminiCompletionResponse(result);\n return result;\n}\n\nfunction applyGeminiFinishReason(\n response: CompletionResponse,\n raw: Record<string, unknown>,\n hasStreamedToolCalls = false,\n): void {\n const value = providerFinishReasonFromGeminiResponse(raw);\n if (value === undefined) return;\n applyGeminiFinishReasonValue(response, value, hasStreamedToolCalls);\n}\n\nfunction applyGeminiFinishReasonValue(\n response: CompletionResponse,\n value: string,\n hasStreamedToolCalls: boolean,\n): void {\n response.finishReason = geminiFinishReason(\n value,\n hasStreamedToolCalls || response.choice.some((part) => part.type === \"tool-call\"),\n );\n response.providerFinishReason = value;\n}\n\nfunction geminiFinishReason(value: string, hasToolCalls: boolean): CompletionFinishReason {\n if (value === \"MAX_TOKENS\") return \"length\";\n if (\n value === \"SAFETY\" ||\n value === \"RECITATION\" ||\n value === \"BLOCKLIST\" ||\n value === \"PROHIBITED_CONTENT\" ||\n value === \"SPII\" ||\n value === \"IMAGE_SAFETY\" ||\n value === \"IMAGE_PROHIBITED_CONTENT\"\n ) {\n return \"content-filter\";\n }\n if (value === \"STOP\") {\n return hasToolCalls ? \"tool-calls\" : \"stop\";\n }\n return \"other\";\n}\n\nexport function fromGeminiGenerateContentStreamChunk(chunk: unknown): CompletionModelStreamEvent[] {\n const mapping = mapGeminiGenerateContentStreamChunk(chunk);\n if (mapping.terminalError !== undefined) throw mapping.terminalError;\n return mapping.events;\n}\n\nfunction mapGeminiGenerateContentStreamChunk(chunk: unknown): GeminiStreamChunkMapping {\n if (!isPlainObject(chunk)) {\n return {\n events: [],\n toolCalls: [],\n hasToolCallMarker: false,\n hasSyntheticToolCalls: false,\n };\n }\n\n const events: CompletionModelStreamEvent[] = [];\n const usage = usageFromGemini(chunk.usageMetadata);\n const parts = candidateParts(chunk, usage);\n const providerFinishReason = providerFinishReasonFromGeminiResponse(chunk);\n const hasToolCallMarker = hasGeminiFunctionCallMarker(chunk, parts);\n const terminalError =\n providerFinishReason === undefined\n ? undefined\n : geminiToolFinishError(providerFinishReason, hasToolCallMarker, usage);\n const calls =\n terminalError === undefined ? functionCallsFromGeminiResponse(chunk, parts, usage) : [];\n const directText = textFromGeminiResponse(chunk, parts);\n if (terminalError === undefined && directText.length > 0 && parts.length === 0) {\n events.push({ type: \"text_delta\", delta: directText });\n }\n for (const { part } of terminalError === undefined ? parts : []) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n events.push({ type: \"reasoning_delta\", delta: part.text, contentType: \"summary\" });\n } else {\n events.push({ type: \"text_delta\", delta: part.text });\n }\n }\n }\n for (const call of calls) {\n events.push(\n toolCallDelta(call.toolCallId, {\n callId: call.callId,\n name: call.name,\n signature: call.signature,\n }),\n );\n const argumentsDelta = JSON.stringify(call.args);\n if (argumentsDelta === undefined) {\n throw invalidGeminiToolCallArguments(call.toolCallId, usage);\n }\n events.push(\n toolCallDelta(call.toolCallId, {\n callId: call.callId,\n argumentsDelta,\n argumentsMode: \"replace\",\n }),\n );\n }\n const id = stringFrom(chunk.responseId) ?? stringFrom(chunk.id);\n if (id !== undefined) {\n events.push({ type: \"message_id\", id });\n }\n if (isPlainObject(chunk.usageMetadata)) {\n if (terminalError === undefined) {\n events.push({ type: \"final\", response: fromGeminiGenerateContentResponse(chunk) });\n } else {\n const response: CompletionResponse = { choice: [], usage, rawResponse: chunk };\n if (providerFinishReason !== undefined) {\n applyGeminiFinishReasonValue(response, providerFinishReason, true);\n }\n events.push({ type: \"final\", response });\n }\n }\n return providerFinishReason === undefined\n ? {\n events,\n toolCalls: calls.map(toolCallFromGeminiFunctionCall),\n hasToolCallMarker,\n hasSyntheticToolCalls: calls.some((call) => call.callId === undefined),\n terminalError,\n }\n : {\n events,\n toolCalls: calls.map(toolCallFromGeminiFunctionCall),\n hasToolCallMarker,\n hasSyntheticToolCalls: calls.some((call) => call.callId === undefined),\n providerFinishReason,\n terminalError,\n };\n}\n\nclass GeminiCompletionStreamState {\n private readonly toolCalls = new Map<\n string,\n Extract<AssistantContentPart, { type: \"tool-call\" }>\n >();\n private providerFinishReason: string | undefined;\n private terminalChunk: unknown;\n private finalResponse: CompletionResponse | undefined;\n private sawToolCallMarker = false;\n private sawSyntheticToolCallChunk = false;\n private terminalError: CompletionProviderOutputError | undefined;\n\n accept(chunk: unknown, mapping: GeminiStreamChunkMapping): void {\n if (mapping.hasSyntheticToolCalls && this.sawSyntheticToolCallChunk) {\n const toolCallId = mapping.toolCalls.find(\n (toolCall) => toolCall.callId === undefined,\n )?.toolCallId;\n throw toolCallId === undefined\n ? new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n usage: this.currentUsage(),\n })\n : invalidGeminiToolCall(toolCallId, this.currentUsage());\n }\n if (\n this.providerFinishReason !== undefined &&\n (mapping.hasToolCallMarker || hasGeminiSemanticProgress(mapping.events))\n ) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n finishReason: \"other\",\n usage: this.currentUsage(),\n });\n }\n for (const toolCall of mapping.toolCalls) {\n const existing = this.toolCalls.get(toolCall.toolCallId);\n if (existing !== undefined) {\n if (\n existing.callId === undefined ||\n toolCall.callId === undefined ||\n !sameGeminiToolCall(existing, toolCall)\n ) {\n throw invalidGeminiToolCall(toolCall.toolCallId, this.currentUsage());\n }\n continue;\n }\n this.toolCalls.set(toolCall.toolCallId, toolCall);\n }\n this.sawToolCallMarker ||= mapping.hasToolCallMarker;\n this.sawSyntheticToolCallChunk ||= mapping.hasSyntheticToolCalls;\n for (const event of mapping.events) {\n if (event.type === \"final\") {\n this.finalResponse = event.response;\n }\n }\n this.terminalError ??= mapping.terminalError;\n\n if (mapping.providerFinishReason !== undefined) {\n if (\n this.providerFinishReason !== undefined &&\n this.providerFinishReason !== mapping.providerFinishReason\n ) {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n finishReason: \"other\",\n usage: this.currentUsage(),\n });\n }\n this.providerFinishReason = mapping.providerFinishReason;\n this.terminalChunk = chunk;\n }\n }\n\n assertComplete(): void {\n if (this.terminalError !== undefined) {\n throw geminiProviderOutputErrorWithUsage(this.terminalError, this.currentUsage());\n }\n if (!this.sawToolCallMarker && this.toolCalls.size === 0) return;\n if (this.providerFinishReason !== undefined) {\n assertSafeGeminiToolFinishReason(this.providerFinishReason, this.currentUsage());\n return;\n }\n const toolCallId = this.toolCalls.keys().next().value as string | undefined;\n throw new CompletionProviderOutputError(\n toolCallId === undefined\n ? { kind: \"incomplete-tool-call\", usage: this.currentUsage() }\n : { kind: \"incomplete-tool-call\", toolCallId, usage: this.currentUsage() },\n );\n }\n\n finalEvent(): Extract<CompletionModelStreamEvent, { type: \"final\" }> | undefined {\n let response = this.finalResponse;\n if (response === undefined) {\n if (this.terminalChunk === undefined) {\n return undefined;\n }\n const raw = isPlainObject(this.terminalChunk) ? this.terminalChunk : {};\n response = {\n choice: [],\n usage: usageFromGemini(raw.usageMetadata),\n rawResponse: this.terminalChunk,\n };\n const messageId = stringFrom(raw.responseId) ?? stringFrom(raw.id);\n if (messageId !== undefined) response.messageId = messageId;\n }\n\n response = mergeGeminiStreamToolCalls(response, [...this.toolCalls.values()]);\n if (this.providerFinishReason !== undefined) {\n applyGeminiFinishReasonValue(response, this.providerFinishReason, this.toolCalls.size > 0);\n }\n assertSafeGeminiCompletionResponse(response);\n return { type: \"final\", response };\n }\n\n private currentUsage(): Usage {\n if (this.finalResponse !== undefined) {\n return this.finalResponse.usage;\n }\n const raw = isPlainObject(this.terminalChunk) ? this.terminalChunk : {};\n return usageFromGemini(raw.usageMetadata);\n }\n}\n\nfunction hasGeminiSemanticProgress(events: readonly CompletionModelStreamEvent[]): boolean {\n return events.some(\n (event) =>\n event.type === \"text_delta\" ||\n event.type === \"reasoning_delta\" ||\n event.type === \"tool_call_delta\" ||\n event.type === \"tool_call\" ||\n event.type === \"provider_tool_call\",\n );\n}\n\nfunction sameGeminiToolCall(\n left: Extract<AssistantContentPart, { type: \"tool-call\" }>,\n right: Extract<AssistantContentPart, { type: \"tool-call\" }>,\n): boolean {\n return (\n left.toolName === right.toolName &&\n left.callId === right.callId &&\n left.signature === right.signature &&\n sameJsonValue(left.input, right.input)\n );\n}\n\nfunction sameJsonValue(left: JsonValue, right: JsonValue): boolean {\n if (Object.is(left, right)) return true;\n if (isJsonArray(left) || isJsonArray(right)) {\n return (\n isJsonArray(left) &&\n isJsonArray(right) &&\n left.length === right.length &&\n left.every((value, index) => {\n const rightValue = right[index];\n return rightValue !== undefined && sameJsonValue(value, rightValue);\n })\n );\n }\n if (left === null || right === null || typeof left !== \"object\" || typeof right !== \"object\") {\n return false;\n }\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.hasOwn(right, key) && sameJsonValue(left[key] as JsonValue, right[key] as JsonValue),\n )\n );\n}\n\nfunction isJsonArray(value: JsonValue): value is readonly JsonValue[] {\n return Array.isArray(value);\n}\n\nfunction assistantContentFromGeminiResponse(\n response: Record<string, unknown>,\n usage: Usage,\n): AssistantContentPart[] {\n const parts = candidateParts(response, usage);\n const calls = functionCallsFromGeminiResponse(response, parts, usage);\n if (parts.length === 0) {\n const choice: AssistantContentPart[] = [];\n const text = textFromGeminiResponse(response, parts);\n if (text.length > 0) choice.push({ type: \"text\", text });\n choice.push(...calls.map(toolCallFromGeminiFunctionCall));\n return choice;\n }\n\n const callsByPartIndex = new Map(calls.map((call) => [call.partIndex, call]));\n const choice: AssistantContentPart[] = [];\n for (const { index, part } of parts) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n choice.push({\n type: \"reasoning\",\n text: part.text,\n details: [{ type: \"summary\", text: part.text }],\n });\n } else {\n const signature = thoughtSignatureFrom(part);\n let text: Extract<AssistantContentPart, { type: \"text\" }> = {\n type: \"text\",\n text: part.text,\n };\n if (signature !== undefined) text = { ...text, signature };\n choice.push(text);\n }\n }\n const call = callsByPartIndex.get(index);\n if (call !== undefined) {\n choice.push(toolCallFromGeminiFunctionCall(call));\n }\n }\n return choice;\n}\n\nfunction textFromGeminiResponse(\n response: Record<string, unknown>,\n parts = candidateParts(response),\n): string {\n if (parts.length > 0) {\n return parts\n .flatMap(({ part }) =>\n part.thought !== true && typeof part.text === \"string\" ? [part.text] : [],\n )\n .join(\"\");\n }\n if (hasGeminiCandidatePayload(response)) {\n return \"\";\n }\n const directText = ownDataProperty(response, \"text\");\n return typeof directText === \"string\" ? directText : \"\";\n}\n\nfunction functionCallsFromGeminiResponse(\n response: Record<string, unknown>,\n parts: IndexedGeminiPart[],\n usage: Usage,\n): GeminiFunctionCall[] {\n if (parts.length > 0) {\n const calls = parts.flatMap(({ index, part }) => {\n if (part.functionCall === undefined) {\n return [];\n }\n if (!isPlainObject(part.functionCall)) {\n throw invalidGeminiToolCall(deterministicGeminiToolCallId(index), usage);\n }\n return [functionCallFromGeminiPart(part.functionCall, part, index, usage)];\n });\n assertDistinctGeminiFunctionCalls(calls, usage);\n return calls;\n }\n if (hasGeminiCandidatePayload(response)) {\n return [];\n }\n\n const camelCaseCalls = ownDataProperty(response, \"functionCalls\");\n const snakeCaseCalls = ownDataProperty(response, \"function_calls\");\n const directCalls = Array.isArray(camelCaseCalls)\n ? camelCaseCalls\n : Array.isArray(snakeCaseCalls)\n ? snakeCaseCalls\n : [];\n const calls = directCalls.map((call, index) => {\n if (!isPlainObject(call)) {\n throw invalidGeminiToolCall(deterministicGeminiToolCallId(index), usage);\n }\n return functionCallFromGeminiPart(call, call, index, usage);\n });\n assertDistinctGeminiFunctionCalls(calls, usage);\n return calls;\n}\n\nfunction functionCallFromGeminiPart(\n call: Record<string, unknown>,\n part: Record<string, unknown>,\n partIndex: number,\n usage: Usage,\n): GeminiFunctionCall {\n const fallbackId = deterministicGeminiToolCallId(partIndex);\n const rawCallId = call.id;\n const callId = isNonblankString(rawCallId) ? rawCallId : undefined;\n const toolCallId = callId ?? fallbackId;\n if (rawCallId !== undefined && callId === undefined) {\n throw invalidGeminiToolCall(toolCallId, usage);\n }\n if (\n call.partialArgs !== undefined ||\n call.partial_args !== undefined ||\n call.willContinue !== undefined ||\n call.will_continue !== undefined\n ) {\n throw new CompletionProviderOutputError({\n kind: \"incomplete-tool-call\",\n toolCallId,\n usage,\n });\n }\n const name = call.name;\n if (!isNonblankString(name)) {\n throw invalidGeminiToolCall(toolCallId, usage);\n }\n const args = call.args;\n if (!isPlainObject(args) || !isJsonValue(args)) {\n throw invalidGeminiToolCallArguments(toolCallId, usage);\n }\n\n const normalized: GeminiFunctionCall = {\n toolCallId,\n name,\n args,\n partIndex,\n };\n const signature = thoughtSignatureFrom(part) ?? thoughtSignatureFrom(call);\n if (callId !== undefined) {\n return signature === undefined\n ? { ...normalized, callId }\n : { ...normalized, callId, signature };\n }\n return signature === undefined ? normalized : { ...normalized, signature };\n}\n\nfunction candidateParts(response: Record<string, unknown>, usage?: Usage): IndexedGeminiPart[] {\n const candidate = primaryGeminiCandidate(response);\n if (candidate === undefined || candidate.content === undefined) {\n return [];\n }\n if (!isPlainObject(candidate.content)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\", usage });\n }\n if (candidate.content.parts === undefined) return [];\n if (!Array.isArray(candidate.content.parts)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\", usage });\n }\n if (candidate.content.parts.some((part) => !isPlainObject(part))) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\", usage });\n }\n return candidate.content.parts.map((part, index) => ({\n index,\n part: part as Record<string, unknown>,\n }));\n}\n\nfunction primaryGeminiCandidate(\n response: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n if (response.candidates === undefined) return undefined;\n if (!Array.isArray(response.candidates)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n const candidates = response.candidates;\n if (\n candidates.some(\n (candidate) =>\n !isPlainObject(candidate) ||\n (candidate.index !== undefined &&\n (!Number.isSafeInteger(candidate.index) || (candidate.index as number) < 0)),\n )\n ) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n const primaryCandidates = candidates.filter(\n (candidate): candidate is Record<string, unknown> =>\n isPlainObject(candidate) && candidate.index === 0,\n );\n if (primaryCandidates.length === 1) {\n return primaryCandidates[0];\n }\n if (primaryCandidates.length > 1) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n if (candidates.length === 0) return undefined;\n if (candidates.length !== 1) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n const candidate = candidates[0] as Record<string, unknown>;\n if (candidate.index !== undefined && candidate.index !== 0) {\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\" });\n }\n return candidate;\n}\n\nfunction providerFinishReasonFromGeminiResponse(\n response: Record<string, unknown>,\n): string | undefined {\n const candidateFinishReason = stringFrom(primaryGeminiCandidate(response)?.finishReason);\n if (candidateFinishReason !== undefined) return candidateFinishReason;\n const promptFeedback = response.promptFeedback ?? response.prompt_feedback;\n if (promptFeedback === undefined) return undefined;\n if (!isPlainObject(promptFeedback)) {\n throw new CompletionProviderOutputError({ kind: \"invalid-response\" });\n }\n const blockReason = promptFeedback.blockReason ?? promptFeedback.block_reason;\n if (blockReason === undefined) return undefined;\n if (typeof blockReason !== \"string\" || blockReason.length === 0) {\n throw new CompletionProviderOutputError({ kind: \"invalid-response\" });\n }\n return blockReason;\n}\n\nfunction hasGeminiCandidatePayload(response: Record<string, unknown>): boolean {\n return Array.isArray(response.candidates) && response.candidates.length > 0;\n}\n\nfunction hasGeminiFunctionCallMarker(\n response: Record<string, unknown>,\n parts: readonly IndexedGeminiPart[],\n): boolean {\n if (parts.some(({ part }) => ownDataProperty(part, \"functionCall\") !== undefined)) {\n return true;\n }\n if (hasGeminiCandidatePayload(response)) return false;\n const camelCaseCalls = ownDataProperty(response, \"functionCalls\");\n const snakeCaseCalls = ownDataProperty(response, \"function_calls\");\n return (\n (Array.isArray(camelCaseCalls) && camelCaseCalls.length > 0) ||\n (Array.isArray(snakeCaseCalls) && snakeCaseCalls.length > 0)\n );\n}\n\nfunction deterministicGeminiToolCallId(partIndex: number): string {\n return `gemini-tool-${partIndex.toString()}`;\n}\n\nfunction toolCallFromGeminiFunctionCall(\n call: GeminiFunctionCall,\n): Extract<AssistantContentPart, { type: \"tool-call\" }> {\n let toolCall: Extract<AssistantContentPart, { type: \"tool-call\" }> = {\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.name,\n input: call.args,\n };\n if (call.callId !== undefined) toolCall = { ...toolCall, callId: call.callId };\n if (call.signature !== undefined) toolCall = { ...toolCall, signature: call.signature };\n return toolCall;\n}\n\nfunction mergeGeminiStreamToolCalls(\n response: CompletionResponse,\n toolCalls: readonly Extract<AssistantContentPart, { type: \"tool-call\" }>[],\n): CompletionResponse {\n if (toolCalls.length === 0) return response;\n const finalIds = new Set(\n response.choice.flatMap((part) => (part.type === \"tool-call\" ? [part.toolCallId] : [])),\n );\n const missing = toolCalls.filter((toolCall) => !finalIds.has(toolCall.toolCallId));\n return missing.length === 0\n ? response\n : { ...response, choice: [...response.choice, ...missing] };\n}\n\nfunction assertSafeGeminiToolFinishReason(value: string, usage: Usage): void {\n const error = geminiToolFinishError(value, true, usage);\n if (error !== undefined) throw error;\n}\n\nfunction geminiToolFinishError(\n value: string | undefined,\n hasToolCalls: boolean,\n usage: Usage,\n): CompletionProviderOutputError | undefined {\n if (value === \"MALFORMED_FUNCTION_CALL\") {\n return new CompletionProviderOutputError({ kind: \"malformed-tool-arguments\", usage });\n }\n if (value === \"UNEXPECTED_TOOL_CALL\" || value === \"TOO_MANY_TOOL_CALLS\") {\n return new CompletionProviderOutputError({ kind: \"invalid-tool-call\", usage });\n }\n if (!hasToolCalls) return undefined;\n if (value === undefined) {\n return new CompletionProviderOutputError({ kind: \"incomplete-tool-call\", usage });\n }\n const finishReason = geminiFinishReason(value, true);\n if (finishReason === \"tool-calls\") return undefined;\n if (finishReason === \"length\") {\n return new CompletionProviderOutputError({\n kind: \"truncated-tool-call\",\n finishReason,\n usage,\n });\n }\n if (finishReason === \"content-filter\") {\n return new CompletionProviderOutputError({\n kind: \"filtered-tool-call\",\n finishReason,\n usage,\n });\n }\n return new CompletionProviderOutputError({ kind: \"invalid-tool-call\", finishReason, usage });\n}\n\nfunction assertSafeGeminiCompletionResponse(response: CompletionResponse): void {\n const toolCalls = response.choice.filter(\n (part): part is Extract<AssistantContentPart, { type: \"tool-call\" }> =>\n part.type === \"tool-call\",\n );\n if (toolCalls.length > 0) {\n if (response.finishReason === undefined) {\n throw new CompletionProviderOutputError({\n kind: \"incomplete-tool-call\",\n usage: response.usage,\n });\n }\n assertNormalizedGeminiToolFinishReason(response.finishReason, response.usage);\n } else if (toolCalls.length === 0 && response.finishReason === \"tool-calls\") {\n throw new CompletionProviderOutputError({\n kind: \"invalid-tool-call\",\n finishReason: response.finishReason,\n usage: response.usage,\n });\n }\n\n const toolCallIds = new Set<string>();\n const callIds = new Set<string>();\n for (const toolCall of toolCalls) {\n if (toolCallIds.has(toolCall.toolCallId)) {\n throw invalidGeminiToolCall(toolCall.toolCallId, response.usage);\n }\n toolCallIds.add(toolCall.toolCallId);\n if (toolCall.callId !== undefined) {\n if (callIds.has(toolCall.callId)) {\n throw invalidGeminiToolCall(toolCall.toolCallId, response.usage);\n }\n callIds.add(toolCall.callId);\n }\n }\n}\n\nfunction assertDistinctGeminiFunctionCalls(\n calls: readonly GeminiFunctionCall[],\n usage: Usage,\n): void {\n const toolCallIds = new Set<string>();\n const callIds = new Set<string>();\n for (const call of calls) {\n if (toolCallIds.has(call.toolCallId)) {\n throw invalidGeminiToolCall(call.toolCallId, usage);\n }\n toolCallIds.add(call.toolCallId);\n if (call.callId !== undefined) {\n if (callIds.has(call.callId)) {\n throw invalidGeminiToolCall(call.toolCallId, usage);\n }\n callIds.add(call.callId);\n }\n }\n}\n\nfunction assertNormalizedGeminiToolFinishReason(\n finishReason: CompletionFinishReason,\n usage: Usage,\n): void {\n if (finishReason === \"stop\" || finishReason === \"tool-calls\") return;\n if (finishReason === \"length\") {\n throw new CompletionProviderOutputError({\n kind: \"truncated-tool-call\",\n finishReason,\n usage,\n });\n }\n if (finishReason === \"content-filter\") {\n throw new CompletionProviderOutputError({\n kind: \"filtered-tool-call\",\n finishReason,\n usage,\n });\n }\n throw new CompletionProviderOutputError({ kind: \"invalid-tool-call\", finishReason, usage });\n}\n\nfunction geminiProviderOutputErrorWithUsage(\n error: CompletionProviderOutputError,\n usage: Usage,\n): CompletionProviderOutputError {\n if (error.kind === \"truncated-tool-call\") {\n return new CompletionProviderOutputError({\n kind: error.kind,\n finishReason: \"length\",\n toolCallId: error.toolCallId,\n usage,\n });\n }\n if (error.kind === \"filtered-tool-call\") {\n return new CompletionProviderOutputError({\n kind: error.kind,\n finishReason: \"content-filter\",\n toolCallId: error.toolCallId,\n usage,\n });\n }\n if (error.finishReason === \"length\" || error.finishReason === \"content-filter\") {\n throw error;\n }\n return new CompletionProviderOutputError({\n kind: error.kind,\n finishReason: error.finishReason,\n toolCallId: error.toolCallId,\n usage,\n });\n}\n\nfunction invalidGeminiToolCall(toolCallId: string, usage: Usage): CompletionProviderOutputError {\n return new CompletionProviderOutputError({ kind: \"invalid-tool-call\", toolCallId, usage });\n}\n\nfunction invalidGeminiToolCallArguments(\n toolCallId: string,\n usage: Usage,\n): CompletionProviderOutputError {\n return new CompletionProviderOutputError({\n kind: \"invalid-tool-arguments\",\n toolCallId,\n usage,\n });\n}\n\nfunction ownDataProperty(value: Record<string, unknown>, key: string): unknown {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined && \"value\" in descriptor ? descriptor.value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isNonblankString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction usageFromGemini(usage: unknown): Usage {\n const raw = isPlainObject(usage) ? usage : {};\n const promptInputTokens = numberFrom(raw.promptTokenCount);\n const toolInputTokens = numberFrom(raw.toolUsePromptTokenCount);\n const inputTokens = promptInputTokens + toolInputTokens;\n const candidateOutputTokens = numberFrom(raw.candidatesTokenCount);\n const reasoningOutputTokens = numberFrom(raw.thoughtsTokenCount);\n const outputTokens = candidateOutputTokens + reasoningOutputTokens;\n const cachedInputTokens = Math.min(promptInputTokens, numberFrom(raw.cachedContentTokenCount));\n const totalTokens = inputTokens + outputTokens;\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n details: {\n input: promptInputTokens - cachedInputTokens,\n input_cached_tokens: cachedInputTokens,\n input_tool_use_tokens: toolInputTokens,\n output: candidateOutputTokens,\n output_reasoning_tokens: reasoningOutputTokens,\n total: totalTokens,\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n}\n\nfunction stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction thoughtSignatureFrom(value: Record<string, unknown>): string | undefined {\n return stringFrom(value.thoughtSignature) ?? stringFrom(value.thought_signature);\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n argumentsMode?: ToolCallArgumentsMode | undefined;\n signature?: string | undefined;\n },\n): CompletionModelStreamEvent {\n const event: CompletionModelStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n if (values.argumentsMode !== undefined) event.argumentsMode = values.argumentsMode;\n if (values.signature !== undefined) event.signature = values.signature;\n return event;\n}\n","import {\n type CompletionRequest,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport function orderedRequestMessages(request: CompletionRequest): MessageType[] {\n const messages: MessageType[] = [];\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","export function disableGeminiNativeRetries(\n config: Record<string, unknown>,\n): Record<string, unknown> {\n const httpOptions = isPlainObject(config.httpOptions) ? config.httpOptions : {};\n const retryOptions = isPlainObject(httpOptions.retryOptions) ? httpOptions.retryOptions : {};\n return {\n ...config,\n httpOptions: {\n ...httpOptions,\n retryOptions: {\n ...retryOptions,\n attempts: 1,\n },\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { Embedding, EmbeddingModel, ModelCallOptions } from \"@anvia/core/embeddings\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiEmbeddingModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport type GeminiEmbeddingTaskType =\n | \"TASK_TYPE_UNSPECIFIED\"\n | \"RETRIEVAL_QUERY\"\n | \"RETRIEVAL_DOCUMENT\"\n | \"SEMANTIC_SIMILARITY\"\n | \"CLASSIFICATION\"\n | \"CLUSTERING\"\n | \"QUESTION_ANSWERING\"\n | \"FACT_VERIFICATION\"\n | \"CODE_RETRIEVAL_QUERY\";\n\nexport type GeminiEmbeddingModelOptions = {\n modelId: GeminiEmbeddingModelId;\n dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n taskType?: GeminiEmbeddingTaskType | undefined;\n title?: string | undefined;\n};\n\nexport class GeminiEmbeddingModel implements EmbeddingModel {\n readonly provider = \"gemini\";\n readonly modelId: GeminiEmbeddingModelId;\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n private readonly taskType: GeminiEmbeddingTaskType | undefined;\n private readonly title: string | undefined;\n\n constructor(\n private readonly client: GoogleGenAI,\n options: GeminiEmbeddingModelOptions,\n ) {\n this.modelId = options.modelId;\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 100;\n this.taskType = options.taskType;\n this.title = options.title;\n }\n\n async embedTexts(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch, options)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const config = { ...this.embeddingConfig() };\n if (options?.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.client.models.embedContent({\n model: this.modelId,\n contents: texts,\n config: disableGeminiNativeRetries(config),\n } as never);\n const rawEmbeddings = embeddingsFromResponse(response);\n if (rawEmbeddings.length !== texts.length) {\n throw new Error(\n `Embedding response length ${rawEmbeddings.length} did not match input length ${texts.length}`,\n );\n }\n\n return rawEmbeddings.map((vector, index) => ({\n document: texts[index] as string,\n vector,\n }));\n }\n\n private embeddingConfig(): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n if (this.dimensions !== undefined) config.outputDimensionality = this.dimensions;\n if (this.taskType !== undefined) config.taskType = this.taskType;\n if (this.title !== undefined) config.title = this.title;\n return config;\n }\n}\n\nfunction embeddingsFromResponse(response: unknown): number[][] {\n const raw = response as Record<string, unknown>;\n if (Array.isArray(raw.embeddings)) {\n return raw.embeddings.map((embedding, index) => vectorFromEmbedding(embedding, index));\n }\n if (raw.embedding !== undefined) {\n return [vectorFromEmbedding(raw.embedding, 0)];\n }\n return [];\n}\n\nfunction vectorFromEmbedding(embedding: unknown, position: number): number[] {\n if (!isObject(embedding) || !isNumberArray(embedding.values)) {\n throw new Error(`Invalid Gemini embedding response vector at position ${position}.`);\n }\n return embedding.values;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNumberArray(value: unknown): value is number[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"number\");\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResult,\n ModelCallOptions,\n} from \"@anvia/core/image-generation\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiGenerateContentImageModelId, GeminiGenerateImagesModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport const GEMINI_2_5_FLASH_IMAGE = \"gemini-2.5-flash-image\";\nexport const GEMINI_3_PRO_IMAGE_PREVIEW = \"gemini-3-pro-image-preview\";\nexport const IMAGEN_4_GENERATE = \"imagen-4.0-generate-001\";\n\nexport class GeminiImageGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateContentImageModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const providerImageConfig = isPlainObject(providerConfig.imageConfig)\n ? providerConfig.imageConfig\n : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: {\n ...providerImageConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n },\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n contents: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateContent(params as never);\n return nativeImageResponseFromGemini(response);\n }\n}\n\nexport class GeminiImagenGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateImagesModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n prompt: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateImages(params as never);\n return imagenResponseFromGemini(response);\n }\n}\n\nexport function nativeImageResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n const images = candidates.flatMap((candidate): GeneratedImage[] => {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n return [];\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n return parts.flatMap((part): GeneratedImage[] => {\n if (!isPlainObject(part) || !isPlainObject(part.inlineData)) {\n return [];\n }\n const data = part.inlineData.data;\n if (typeof data !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(data),\n mediaType:\n typeof part.inlineData.mimeType === \"string\" ? part.inlineData.mimeType : \"image/png\",\n },\n ];\n });\n });\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no inline image data.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function imagenResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const images = (Array.isArray(raw.generatedImages) ? raw.generatedImages : []).flatMap(\n (item): GeneratedImage[] => {\n if (!isPlainObject(item) || !isPlainObject(item.image)) {\n return [];\n }\n const imageBytes = item.image.imageBytes;\n if (typeof imageBytes !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(imageBytes),\n mediaType: typeof item.image.mimeType === \"string\" ? item.image.mimeType : \"image/png\",\n },\n ];\n },\n );\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no base64 images.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function aspectRatio(width: number, height: number): string {\n const normalizedWidth = Math.max(1, Math.trunc(width));\n const normalizedHeight = Math.max(1, Math.trunc(height));\n const divisor = gcd(normalizedWidth, normalizedHeight);\n return `${normalizedWidth / divisor}:${normalizedHeight / divisor}`;\n}\n\nfunction gcd(left: number, right: number): number {\n let a = left;\n let b = right;\n while (b !== 0) {\n const next = a % b;\n a = b;\n b = next;\n }\n return a;\n}\n\nfunction decodeBase64Image(value: string): Uint8Array {\n const normalized = value.replace(/\\s/g, \"\").replace(/=+$/, \"\");\n const bytes = Buffer.from(value, \"base64\");\n const roundTrip = bytes.toString(\"base64\").replace(/=+$/, \"\");\n if (normalized.length === 0 || bytes.length === 0 || roundTrip !== normalized) {\n throw new Error(\"Gemini image generation response contained invalid base64 image data.\");\n }\n return new Uint8Array(bytes);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport type { ModelId } from \"@anvia/core/model-listing\";\n\nexport type KnownGeminiCompletionModelId =\n | \"gemini-2.0-flash\"\n | \"gemini-2.0-flash-lite\"\n | \"gemini-2.5-flash\"\n | \"gemini-2.5-flash-image\"\n | \"gemini-2.5-flash-lite\"\n | \"gemini-2.5-flash-preview-tts\"\n | \"gemini-2.5-pro\"\n | \"gemini-2.5-pro-preview-tts\"\n | \"gemini-3-flash-preview\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3-pro-preview\"\n | \"gemini-3.1-flash-image-preview\"\n | \"gemini-3.1-flash-lite\"\n | \"gemini-3.1-flash-lite-preview\"\n | \"gemini-3.1-pro-preview\"\n | \"gemini-3.1-pro-preview-customtools\"\n | \"gemini-3.5-flash\"\n | \"gemini-flash-latest\"\n | \"gemini-flash-lite-latest\"\n | \"gemma-4-26b-a4b-it\"\n | \"gemma-4-31b-it\";\n\nexport type GeminiCompletionModelId = ModelId<KnownGeminiCompletionModelId>;\n\nconst CONTEXT_1M_64K = {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 65_536,\n};\n\nexport const GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS = {\n \"gemini-2.0-flash\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.0-flash-lite\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.5-flash\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-image\": {\n contextWindow: 32_768,\n maxInputTokens: 32_768,\n maxOutputTokens: 32_768,\n },\n \"gemini-2.5-flash-lite\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-2.5-pro\": CONTEXT_1M_64K,\n \"gemini-2.5-pro-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-3-flash-preview\": CONTEXT_1M_64K,\n \"gemini-3-pro-image-preview\": {\n contextWindow: 131_072,\n maxInputTokens: 131_072,\n maxOutputTokens: 32_768,\n },\n \"gemini-3-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-image-preview\": {\n contextWindow: 65_536,\n maxInputTokens: 65_536,\n maxOutputTokens: 65_536,\n },\n \"gemini-3.1-flash-lite\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-lite-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview-customtools\": CONTEXT_1M_64K,\n \"gemini-3.5-flash\": CONTEXT_1M_64K,\n \"gemini-flash-latest\": CONTEXT_1M_64K,\n \"gemini-flash-lite-latest\": CONTEXT_1M_64K,\n \"gemma-4-26b-a4b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n \"gemma-4-31b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n} satisfies Readonly<Record<KnownGeminiCompletionModelId, ModelContextLimits>>;\n\nexport type KnownGeminiEmbeddingModelId = \"gemini-embedding-001\";\n\nexport type GeminiEmbeddingModelId = ModelId<KnownGeminiEmbeddingModelId>;\n\nexport type KnownGeminiGenerateContentImageModelId =\n | \"gemini-2.5-flash-image\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3.1-flash-image-preview\";\n\nexport type KnownGeminiGenerateImagesModelId = \"imagen-4.0-generate-001\";\n\nexport type GeminiGenerateContentImageModelId = ModelId<KnownGeminiGenerateContentImageModelId>;\nexport type GeminiGenerateImagesModelId = ModelId<KnownGeminiGenerateImagesModelId>;\n\nexport type GeminiTranscriptionModelId = GeminiCompletionModelId;\n","import { Buffer } from \"node:buffer\";\nimport type {\n ModelCallOptions,\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResult,\n} from \"@anvia/core/transcription\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiTranscriptionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nconst TRANSCRIPTION_PREAMBLE =\n \"Transcribe the provided audio exactly. Do not add additional information.\";\n\nexport class GeminiTranscriptionModel implements TranscriptionModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiTranscriptionModelId,\n ) {}\n\n async transcription(\n request: TranscriptionRequest,\n options?: ModelCallOptions,\n ): Promise<TranscriptionResult<unknown>> {\n const config: Record<string, unknown> = isPlainObject(request.providerOptions)\n ? { ...request.providerOptions }\n : {};\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n\n const response = await this.client.models.generateContent({\n model: this.modelId,\n contents: [\n {\n role: \"user\",\n parts: [\n {\n inlineData: {\n mimeType: request.mediaType ?? mimeTypeFromFilename(request.filename),\n data: Buffer.from(request.data).toString(\"base64\"),\n },\n },\n ],\n },\n ],\n config: disableGeminiNativeRetries({\n ...config,\n systemInstruction:\n request.prompt === undefined\n ? TRANSCRIPTION_PREAMBLE\n : `${TRANSCRIPTION_PREAMBLE}\\n\\n${request.prompt}`,\n }),\n } as never);\n\n return {\n text: textFromGenerateContentResponse(response),\n rawResponse: response,\n };\n }\n}\n\nexport function textFromGenerateContentResponse(response: unknown): string {\n const raw = response as Record<string, unknown>;\n if (typeof raw.text === \"string\") {\n return raw.text;\n }\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n for (const candidate of candidates) {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n continue;\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n for (const part of parts) {\n if (isPlainObject(part) && typeof part.text === \"string\") {\n return part.text;\n }\n }\n }\n throw new Error(\"Gemini transcription response contained no text.\");\n}\n\nfunction mimeTypeFromFilename(filename: string): string {\n const lower = filename.toLowerCase();\n if (lower.endsWith(\".wav\")) return \"audio/wav\";\n if (lower.endsWith(\".aac\")) return \"audio/aac\";\n if (lower.endsWith(\".ogg\")) return \"audio/ogg\";\n if (lower.endsWith(\".flac\")) return \"audio/flac\";\n if (lower.endsWith(\".m4a\")) return \"audio/m4a\";\n if (lower.endsWith(\".opus\")) return \"audio/opus\";\n return \"audio/mpeg\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["isPlainObject","content","isPlainObject","choice","calls","candidate","Buffer","isPlainObject","Buffer","Buffer","isPlainObject","Buffer","isObject"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/gemini",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.9",
|
|
4
4
|
"description": "Gemini provider adapter for Anvia.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"tsup": "^8.5.0",
|
|
34
34
|
"typescript": "^5.9.3",
|
|
35
35
|
"vitest": "^4.0.8",
|
|
36
|
-
"@anvia/core": "1.0.0-rc.
|
|
36
|
+
"@anvia/core": "1.0.0-rc.9"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "1.0.0-rc.
|
|
39
|
+
"@anvia/core": "1.0.0-rc.9"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"prebuild": "test -f ../core/dist/index.d.ts || pnpm --filter @anvia/core build",
|