@anvia/gemini 1.0.0-rc.2 → 1.0.0-rc.4
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 +51 -35
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -245,7 +245,14 @@ function userMessageToGeminiContent(message) {
|
|
|
245
245
|
function toolMessageToGeminiContent(message, toolNamesById) {
|
|
246
246
|
return {
|
|
247
247
|
role: "user",
|
|
248
|
-
parts: message.content.map((content) =>
|
|
248
|
+
parts: message.content.map((content) => {
|
|
249
|
+
if (content.type !== "tool-result") {
|
|
250
|
+
throw new TypeError(
|
|
251
|
+
"Anvia interaction responses must be resolved by Agent before provider calls."
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
return toolContentToGeminiPart(content, toolNamesById);
|
|
255
|
+
})
|
|
249
256
|
};
|
|
250
257
|
}
|
|
251
258
|
function assistantMessageToGeminiContent(message) {
|
|
@@ -482,25 +489,27 @@ function assistantContentFromGeminiResponse(response) {
|
|
|
482
489
|
});
|
|
483
490
|
} else {
|
|
484
491
|
const signature = thoughtSignatureFrom(part);
|
|
485
|
-
|
|
492
|
+
let text = {
|
|
486
493
|
type: "text",
|
|
487
|
-
text: part.text
|
|
488
|
-
|
|
489
|
-
}
|
|
494
|
+
text: part.text
|
|
495
|
+
};
|
|
496
|
+
if (signature !== void 0) text = { ...text, signature };
|
|
497
|
+
choice.push(text);
|
|
490
498
|
}
|
|
491
499
|
}
|
|
492
500
|
if (isPlainObject2(part.functionCall)) {
|
|
493
501
|
const call = functionCallFromGeminiPart(part.functionCall, part);
|
|
494
502
|
if (call !== void 0) {
|
|
495
503
|
const toolCallId = call.id ?? crypto.randomUUID();
|
|
496
|
-
|
|
504
|
+
let toolCall = {
|
|
497
505
|
type: "tool-call",
|
|
498
506
|
toolCallId,
|
|
499
|
-
...call.id === void 0 ? {} : { callId: call.id },
|
|
500
507
|
toolName: call.name,
|
|
501
|
-
input: call.args
|
|
502
|
-
|
|
503
|
-
}
|
|
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);
|
|
504
513
|
}
|
|
505
514
|
}
|
|
506
515
|
}
|
|
@@ -651,13 +660,14 @@ var GeminiEmbeddingModel = class {
|
|
|
651
660
|
if (texts.length === 0) {
|
|
652
661
|
return [];
|
|
653
662
|
}
|
|
663
|
+
const config = { ...this.embeddingConfig() };
|
|
664
|
+
if (options?.abortSignal !== void 0) {
|
|
665
|
+
Object.assign(config, { abortSignal: options.abortSignal });
|
|
666
|
+
}
|
|
654
667
|
const response = await this.client.models.embedContent({
|
|
655
668
|
model: this.modelId,
|
|
656
669
|
contents: texts,
|
|
657
|
-
config: disableGeminiNativeRetries(
|
|
658
|
-
...this.embeddingConfig(),
|
|
659
|
-
...options?.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal }
|
|
660
|
-
})
|
|
670
|
+
config: disableGeminiNativeRetries(config)
|
|
661
671
|
});
|
|
662
672
|
const rawEmbeddings = embeddingsFromResponse(response);
|
|
663
673
|
if (rawEmbeddings.length !== texts.length) {
|
|
@@ -719,19 +729,20 @@ var GeminiImageGenerationModel = class {
|
|
|
719
729
|
const { config: providerConfigValue, ...providerTopLevel } = providerOptions;
|
|
720
730
|
const providerConfig = isPlainObject3(providerConfigValue) ? providerConfigValue : {};
|
|
721
731
|
const providerImageConfig = isPlainObject3(providerConfig.imageConfig) ? providerConfig.imageConfig : {};
|
|
732
|
+
const config = {
|
|
733
|
+
...providerConfig,
|
|
734
|
+
responseModalities: ["TEXT", "IMAGE"],
|
|
735
|
+
imageConfig: {
|
|
736
|
+
...providerImageConfig,
|
|
737
|
+
aspectRatio: aspectRatio(request.width, request.height)
|
|
738
|
+
}
|
|
739
|
+
};
|
|
740
|
+
if (options?.abortSignal !== void 0) config.abortSignal = options.abortSignal;
|
|
722
741
|
const params = {
|
|
723
742
|
...providerTopLevel,
|
|
724
743
|
model: this.modelId,
|
|
725
744
|
contents: request.prompt,
|
|
726
|
-
config: disableGeminiNativeRetries(
|
|
727
|
-
...providerConfig,
|
|
728
|
-
responseModalities: ["TEXT", "IMAGE"],
|
|
729
|
-
imageConfig: {
|
|
730
|
-
...providerImageConfig,
|
|
731
|
-
aspectRatio: aspectRatio(request.width, request.height)
|
|
732
|
-
},
|
|
733
|
-
...options?.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal }
|
|
734
|
-
})
|
|
745
|
+
config: disableGeminiNativeRetries(config)
|
|
735
746
|
};
|
|
736
747
|
const response = await this.client.models.generateContent(params);
|
|
737
748
|
return nativeImageResponseFromGemini(response);
|
|
@@ -749,15 +760,16 @@ var GeminiImagenGenerationModel = class {
|
|
|
749
760
|
const providerOptions = isPlainObject3(request.providerOptions) ? request.providerOptions : {};
|
|
750
761
|
const { config: providerConfigValue, ...providerTopLevel } = providerOptions;
|
|
751
762
|
const providerConfig = isPlainObject3(providerConfigValue) ? providerConfigValue : {};
|
|
763
|
+
const config = {
|
|
764
|
+
...providerConfig,
|
|
765
|
+
aspectRatio: aspectRatio(request.width, request.height)
|
|
766
|
+
};
|
|
767
|
+
if (options?.abortSignal !== void 0) config.abortSignal = options.abortSignal;
|
|
752
768
|
const params = {
|
|
753
769
|
...providerTopLevel,
|
|
754
770
|
model: this.modelId,
|
|
755
771
|
prompt: request.prompt,
|
|
756
|
-
config: disableGeminiNativeRetries(
|
|
757
|
-
...providerConfig,
|
|
758
|
-
aspectRatio: aspectRatio(request.width, request.height),
|
|
759
|
-
...options?.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal }
|
|
760
|
-
})
|
|
772
|
+
config: disableGeminiNativeRetries(config)
|
|
761
773
|
};
|
|
762
774
|
const response = await this.client.models.generateImages(params);
|
|
763
775
|
return imagenResponseFromGemini(response);
|
|
@@ -1033,11 +1045,12 @@ var GeminiClient = class {
|
|
|
1033
1045
|
}
|
|
1034
1046
|
async listModels(options = {}) {
|
|
1035
1047
|
try {
|
|
1048
|
+
const config = { pageSize: 1e3 };
|
|
1049
|
+
if (options.abortSignal !== void 0) {
|
|
1050
|
+
Object.assign(config, { abortSignal: options.abortSignal });
|
|
1051
|
+
}
|
|
1036
1052
|
const response = await this.sdk.models.list({
|
|
1037
|
-
config: disableGeminiNativeRetries(
|
|
1038
|
-
pageSize: 1e3,
|
|
1039
|
-
...options.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal }
|
|
1040
|
-
})
|
|
1053
|
+
config: disableGeminiNativeRetries(config)
|
|
1041
1054
|
});
|
|
1042
1055
|
const data = (await collectModelsFromResponse(response)).map(toListedModel).filter(isListedModel);
|
|
1043
1056
|
return { data };
|
|
@@ -1057,12 +1070,15 @@ function toGoogleGenAIOptions(options) {
|
|
|
1057
1070
|
throw new TypeError("Injected Gemini clients do not have managed SDK options.");
|
|
1058
1071
|
}
|
|
1059
1072
|
if ("vertexAi" in options && options.vertexAi !== void 0) {
|
|
1060
|
-
|
|
1073
|
+
const sdkOptions = {
|
|
1061
1074
|
vertexai: true,
|
|
1062
1075
|
project: requireOption(options.vertexAi.projectId, "projectId", "Vertex Gemini"),
|
|
1063
|
-
location: requireOption(options.vertexAi.location, "location", "Vertex Gemini")
|
|
1064
|
-
...options.vertexAi.googleAuthOptions === void 0 ? {} : { googleAuthOptions: options.vertexAi.googleAuthOptions }
|
|
1076
|
+
location: requireOption(options.vertexAi.location, "location", "Vertex Gemini")
|
|
1065
1077
|
};
|
|
1078
|
+
if (options.vertexAi.googleAuthOptions !== void 0) {
|
|
1079
|
+
sdkOptions.googleAuthOptions = options.vertexAi.googleAuthOptions;
|
|
1080
|
+
}
|
|
1081
|
+
return sdkOptions;
|
|
1066
1082
|
}
|
|
1067
1083
|
return {
|
|
1068
1084
|
apiKey: requireOption(options.apiKey, "apiKey", "Gemini")
|
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 response = await this.sdk.models.list({\n config: disableGeminiNativeRetries({\n pageSize: 1000,\n ...(options.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n }),\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 return {\n vertexai: true,\n project: requireOption(options.vertexAi.projectId, \"projectId\", \"Vertex Gemini\"),\n location: requireOption(options.vertexAi.location, \"location\", \"Vertex Gemini\"),\n ...(options.vertexAi.googleAuthOptions === undefined\n ? {}\n : { googleAuthOptions: options.vertexAi.googleAuthOptions }),\n };\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) => toolContentToGeminiPart(content, toolNamesById)),\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 choice.push({\n type: \"text\",\n text: part.text,\n ...(signature === undefined ? {} : { signature }),\n });\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 choice.push({\n type: \"tool-call\",\n toolCallId,\n ...(call.id === undefined ? {} : { callId: call.id }),\n toolName: call.name,\n input: call.args,\n ...(call.signature === undefined ? {} : { signature: call.signature }),\n });\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 response = await this.client.models.embedContent({\n model: this.modelId,\n contents: texts,\n config: disableGeminiNativeRetries({\n ...this.embeddingConfig(),\n ...(options?.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n }),\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 params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n contents: request.prompt,\n config: disableGeminiNativeRetries({\n ...providerConfig,\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: {\n ...providerImageConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n },\n ...(options?.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n }),\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 params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n prompt: request.prompt,\n config: disableGeminiNativeRetries({\n ...providerConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n ...(options?.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n }),\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 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"]}
|
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.4",
|
|
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.4"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "1.0.0-rc.
|
|
39
|
+
"@anvia/core": "1.0.0-rc.4"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"prebuild": "test -f ../core/dist/index.d.ts || pnpm --filter @anvia/core build",
|