@anvia/gemini 1.0.0-rc.5 → 1.0.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -423,12 +423,29 @@ function fromGeminiGenerateContentResponse(response) {
423
423
  usage: usageFromGemini(raw.usageMetadata),
424
424
  rawResponse: response
425
425
  };
426
+ applyGeminiFinishReason(result, raw);
426
427
  const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);
427
428
  if (id !== void 0) {
428
429
  result.messageId = id;
429
430
  }
430
431
  return result;
431
432
  }
433
+ function applyGeminiFinishReason(response, raw) {
434
+ const value = stringFrom(primaryGeminiCandidate(raw)?.finishReason);
435
+ if (value === void 0) return;
436
+ response.finishReason = geminiFinishReason(value, response.choice);
437
+ response.providerFinishReason = value;
438
+ }
439
+ function geminiFinishReason(value, choice) {
440
+ if (value === "MAX_TOKENS") return "length";
441
+ if (value === "SAFETY" || value === "RECITATION" || value === "BLOCKLIST" || value === "PROHIBITED_CONTENT" || value === "SPII" || value === "IMAGE_SAFETY" || value === "IMAGE_PROHIBITED_CONTENT") {
442
+ return "content-filter";
443
+ }
444
+ if (value === "STOP") {
445
+ return choice.some((part) => part.type === "tool-call") ? "tool-calls" : "stop";
446
+ }
447
+ return "other";
448
+ }
432
449
  function fromGeminiGenerateContentStreamChunk(chunk) {
433
450
  if (!isPlainObject2(chunk)) {
434
451
  return [];
@@ -577,6 +594,10 @@ function candidateParts(response) {
577
594
  return Array.isArray(candidate.content.parts) ? candidate.content.parts.filter(isPlainObject2) : [];
578
595
  });
579
596
  }
597
+ function primaryGeminiCandidate(response) {
598
+ const candidates = Array.isArray(response.candidates) ? response.candidates.filter(isPlainObject2) : [];
599
+ return candidates.find((candidate) => candidate.index === 0) ?? candidates[0];
600
+ }
580
601
  function usageFromGemini(usage) {
581
602
  const raw = isPlainObject2(usage) ? usage : {};
582
603
  const promptInputTokens = numberFrom(raw.promptTokenCount);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gemini/index.ts","../src/gemini/client.ts","../src/gemini/completion.ts","../src/request-messages.ts","../src/gemini/retry.ts","../src/gemini/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/models.ts","../src/gemini/transcription.ts"],"sourcesContent":["export {\n GeminiClient,\n type GeminiClientOptions,\n type GeminiCompletionModelHandle,\n type GeminiCompletionModelOptions,\n type GeminiEmbeddingModelHandle,\n type GeminiImageGenerationModelHandle,\n type GeminiImageGenerationModelOptions,\n type GeminiTranscriptionModelHandle,\n type GeminiTranscriptionModelOptions,\n} from \"./client\";\nexport type {\n GeminiEmbeddingModelOptions,\n GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport type {\n GeminiCompletionModelId,\n GeminiEmbeddingModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n KnownGeminiCompletionModelId,\n KnownGeminiEmbeddingModelId,\n KnownGeminiGenerateContentImageModelId,\n KnownGeminiGenerateImagesModelId,\n} from \"./models\";\n","import {\n type ModelContextLimits,\n resolveModelContextLimits,\n type StreamingCompletionModel,\n} from \"@anvia/core/completion\";\nimport type { EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { ImageGenerationModel } from \"@anvia/core/image-generation\";\nimport {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport type { TranscriptionModel } from \"@anvia/core/transcription\";\nimport { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport { GeminiImageGenerationModel, GeminiImagenGenerationModel } from \"./image-generation\";\nimport type {\n GeminiCompletionModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n} from \"./models\";\nimport { GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey: string;\n vertexAi?: never;\n client?: never;\n};\n\ntype VertexClientOptions = {\n vertexAi: {\n projectId: string;\n location: string;\n googleAuthOptions?: GoogleGenAIOptions[\"googleAuthOptions\"];\n };\n apiKey?: never;\n client?: never;\n};\n\ntype InjectedClientOptions = {\n client: GoogleGenAI;\n apiKey?: never;\n vertexAi?: never;\n};\n\nexport type GeminiClientOptions =\n | GeminiApiClientOptions\n | VertexClientOptions\n | InjectedClientOptions;\n\nexport type GeminiCompletionModelOptions = {\n modelId: GeminiCompletionModelId;\n contextLimits?: ModelContextLimits | undefined;\n};\n\nexport type GeminiImageGenerationModelOptions =\n | { api: \"generateContent\"; modelId: GeminiGenerateContentImageModelId }\n | { api: \"generateImages\"; modelId: GeminiGenerateImagesModelId };\n\nexport type GeminiTranscriptionModelOptions = { modelId: GeminiTranscriptionModelId };\n\nexport type GeminiCompletionModelHandle = StreamingCompletionModel<unknown>;\nexport type GeminiEmbeddingModelHandle = EmbeddingModel;\nexport type GeminiImageGenerationModelHandle = ImageGenerationModel<unknown>;\nexport type GeminiTranscriptionModelHandle = TranscriptionModel<unknown>;\n\nexport class GeminiClient implements ModelListingClient {\n private readonly sdk: GoogleGenAI;\n\n constructor(options: GeminiClientOptions) {\n if (options.client !== undefined) {\n rejectManagedOptionsWithInjectedClient(options, [\"apiKey\", \"vertexAi\"]);\n this.sdk = options.client;\n return;\n }\n this.sdk = new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(options: GeminiCompletionModelOptions): GeminiCompletionModelHandle {\n const modelId = requireModelId(options.modelId);\n return new GeminiCompletionModel(\n this.sdk,\n modelId,\n resolveModelContextLimits(\n modelId,\n GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS,\n options.contextLimits,\n ),\n );\n }\n\n embeddingModel(options: GeminiEmbeddingModelOptions): GeminiEmbeddingModelHandle {\n requireModelId(options.modelId);\n validateOptionalPositiveSafeInteger(options.dimensions, \"dimensions\");\n validateOptionalPositiveSafeInteger(options.maxBatchSize, \"maxBatchSize\");\n return new GeminiEmbeddingModel(this.sdk, options);\n }\n\n imageGenerationModel(\n options: GeminiImageGenerationModelOptions,\n ): GeminiImageGenerationModelHandle {\n const modelId = requireModelId(options.modelId);\n return options.api === \"generateContent\"\n ? new GeminiImageGenerationModel(this.sdk, modelId)\n : new GeminiImagenGenerationModel(this.sdk, modelId);\n }\n\n transcriptionModel(options: GeminiTranscriptionModelOptions): GeminiTranscriptionModelHandle {\n return new GeminiTranscriptionModel(this.sdk, requireModelId(options.modelId));\n }\n\n async listModels(options: { abortSignal?: AbortSignal | undefined } = {}): Promise<ModelList> {\n try {\n const config = { pageSize: 1000 };\n if (options.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.sdk.models.list({\n config: disableGeminiNativeRetries(config),\n });\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"Gemini\", error);\n }\n }\n}\n\nfunction rejectManagedOptionsWithInjectedClient(options: object, keys: readonly string[]): void {\n const conflict = keys.find((key) => key in options);\n if (conflict !== undefined) {\n throw new TypeError(`GeminiClient cannot combine client with ${conflict}.`);\n }\n}\n\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): GoogleGenAIOptions {\n if (\"client\" in options && options.client !== undefined) {\n throw new TypeError(\"Injected Gemini clients do not have managed SDK options.\");\n }\n if (\"vertexAi\" in options && options.vertexAi !== undefined) {\n const sdkOptions: GoogleGenAIOptions = {\n vertexai: true,\n project: requireOption(options.vertexAi.projectId, \"projectId\", \"Vertex Gemini\"),\n location: requireOption(options.vertexAi.location, \"location\", \"Vertex Gemini\"),\n };\n if (options.vertexAi.googleAuthOptions !== undefined) {\n sdkOptions.googleAuthOptions = options.vertexAi.googleAuthOptions;\n }\n return sdkOptions;\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.trim().length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\n}\n\nfunction requireModelId<ModelId extends string>(modelId: ModelId): ModelId {\n if (modelId.trim().length === 0) {\n throw new TypeError(\"modelId must be a non-empty string\");\n }\n return modelId;\n}\n\nfunction validateOptionalPositiveSafeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.models)) {\n return response.models;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model)) {\n return undefined;\n }\n\n const id =\n stringValue(model.baseModelId) ??\n stringValue(model.base_model_id) ??\n normalizeGeminiModelId(stringValue(model.name));\n\n if (id === undefined) {\n return undefined;\n }\n\n const listedModel: ModelList[\"data\"][number] = {\n id,\n };\n if (typeof model.displayName === \"string\") {\n listedModel.name = model.displayName;\n }\n if (typeof model.display_name === \"string\") {\n listedModel.name = model.display_name;\n }\n if (typeof model.description === \"string\") {\n listedModel.description = model.description;\n }\n if (typeof model.type === \"string\") {\n listedModel.type = model.type;\n }\n if (typeof model.inputTokenLimit === \"number\") {\n listedModel.contextLength = model.inputTokenLimit;\n }\n if (typeof model.input_token_limit === \"number\") {\n listedModel.contextLength = model.input_token_limit;\n }\n return listedModel;\n}\n\nfunction normalizeGeminiModelId(name: string | undefined): string | undefined {\n const trimmed = name?.trim().replace(/^models\\//, \"\");\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n statusCode,\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport {\n type AssistantContentPart,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionModelInfo,\n type CompletionModelStreamEvent,\n type CompletionRequest,\n type CompletionResponse,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type ModelCallOptions,\n type StreamingCompletionModel,\n type ToolCallArgumentsMode,\n type ToolChoice,\n type ToolDefinition,\n type ToolResultPart,\n Usage,\n type UserContentPart,\n withContextUsage,\n} from \"@anvia/core/completion\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport type { GeminiCompletionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\ntype GeminiGenerateParams = Record<string, unknown>;\ntype GeminiConfig = Record<string, unknown>;\ntype GeminiContent = {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n};\ntype GeminiPart = Record<string, unknown>;\n\nexport class GeminiCompletionModel implements StreamingCompletionModel<unknown> {\n readonly provider = \"gemini\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: true,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiCompletionModelId,\n readonly contextLimits?: ModelContextLimits,\n ) {}\n\n private modelInfo(): CompletionModelInfo | undefined {\n return this.contextLimits === undefined\n ? undefined\n : { modelId: this.modelId, context: this.contextLimits };\n }\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toGeminiGenerateContentParams(this.modelId, request);\n return providerRequestSummary(params, request, options);\n }\n\n async completion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const response = await this.client.models.generateContent(params as never);\n return withContextUsage(fromGeminiGenerateContentResponse(response), this.modelInfo());\n }\n\n async *streamCompletion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): AsyncIterable<CompletionModelStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toGeminiGenerateContentParams(this.modelId, request);\n applyAbortSignal(params, options);\n const stream = await this.client.models.generateContentStream(params as never);\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n for (const event of fromGeminiGenerateContentStreamChunk(chunk)) {\n yield event.type === \"final\"\n ? {\n ...event,\n response: withContextUsage(event.response, this.modelInfo()),\n }\n : event;\n }\n }\n }\n}\n\nexport function toGeminiGenerateContentParams(\n modelId: GeminiCompletionModelId,\n request: CompletionRequest,\n): GeminiGenerateParams {\n const messages = requestMessages(request);\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? { ...providerConfigValue } : {};\n delete providerConfig.tools;\n const config = disableGeminiNativeRetries({\n ...providerConfig,\n ...geminiConfig(request, messages),\n });\n const params: GeminiGenerateParams = {\n ...providerTopLevel,\n model: modelId,\n contents: messagesToGeminiContents(messages),\n config,\n };\n\n return params;\n}\n\nfunction applyAbortSignal(\n params: GeminiGenerateParams,\n options: ModelCallOptions | undefined,\n): void {\n if (options?.abortSignal === undefined) return;\n const config = isPlainObject(params.config) ? params.config : {};\n params.config = { ...config, abortSignal: options.abortSignal };\n}\n\nfunction providerRequestSummary(\n params: GeminiGenerateParams,\n request: CompletionRequest,\n options: { stream?: boolean | undefined },\n): JsonObject {\n const config = isPlainObject(params.config) ? params.config : {};\n return compactJsonObject({\n provider: \"gemini\",\n api: options.stream === true ? \"models.generateContentStream\" : \"models.generateContent\",\n stream: options.stream === true,\n model: typeof params.model === \"string\" ? params.model : undefined,\n parameterKeys: Object.keys(params).sort(),\n contentCount: Array.isArray(params.contents) ? params.contents.length : undefined,\n configKeys: Object.keys(config).sort(),\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n hasSystemInstruction: config.systemInstruction !== undefined,\n hasOutputSchema: request.outputSchema !== undefined,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: toolChoiceSummary(request.toolChoice),\n providerOptionKeys: isPlainObject(request.providerOptions)\n ? Object.keys(request.providerOptions).sort()\n : undefined,\n });\n}\n\nfunction toolChoiceSummary(toolChoice: ToolChoice | undefined): JsonValue | undefined {\n if (toolChoice === undefined || typeof toolChoice === \"string\") {\n return toolChoice;\n }\n return { type: toolChoice.type, name: toolChoice.name };\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(values).flatMap(([key, value]) => {\n if (value === undefined) {\n return [];\n }\n return [[key, toJsonValue(value)]];\n }),\n ) as JsonObject;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request);\n}\n\nfunction geminiConfig(request: CompletionRequest, messages: MessageType[]): GeminiConfig {\n const config: GeminiConfig = {};\n const systemInstruction = systemInstructionFrom(request, messages);\n if (systemInstruction !== undefined) {\n config.systemInstruction = systemInstruction;\n }\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n config.maxOutputTokens = request.maxTokens;\n }\n if (request.tools.length > 0) {\n config.tools = [{ functionDeclarations: request.tools.map(toolDefinitionToGemini) }];\n }\n if (request.toolChoice !== undefined) {\n config.toolConfig = toolChoiceToGemini(request.toolChoice);\n }\n if (request.outputSchema !== undefined) {\n config.responseMimeType = \"application/json\";\n config.responseJsonSchema = request.outputSchema;\n }\n return config;\n}\n\nfunction systemInstructionFrom(\n request: CompletionRequest,\n messages: MessageType[],\n): string | undefined {\n const systemMessages = messages.flatMap((message) =>\n message.role === \"system\" ? [message.content] : [],\n );\n if (request.instructions !== undefined) {\n systemMessages.unshift(request.instructions);\n }\n return systemMessages.length === 0 ? undefined : systemMessages.join(\"\\n\\n\");\n}\n\nexport function messagesToGeminiContents(messages: MessageType[]): GeminiContent[] {\n const toolNamesById = new Map<string, string>();\n const contents: GeminiContent[] = [];\n\n for (const message of messages) {\n if (message.role === \"system\") {\n continue;\n }\n\n if (message.role === \"assistant\") {\n const content = assistantMessageToGeminiContent(message);\n for (const item of typeof message.content === \"string\" ? [] : message.content) {\n if (item.type === \"tool-call\") {\n toolNamesById.set(item.toolCallId, item.toolName);\n if (item.callId !== undefined) {\n toolNamesById.set(item.callId, item.toolName);\n }\n }\n }\n if (content.parts.length > 0) {\n contents.push(content);\n }\n continue;\n }\n\n const content =\n message.role === \"tool\"\n ? toolMessageToGeminiContent(message, toolNamesById)\n : userMessageToGeminiContent(message);\n if (content.parts.length > 0) {\n contents.push(content);\n }\n }\n\n return contents;\n}\n\nfunction userMessageToGeminiContent(\n message: Extract<MessageType, { role: \"user\" }>,\n): GeminiContent {\n return {\n role: \"user\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.map(userContentToGeminiPart),\n };\n}\n\nfunction toolMessageToGeminiContent(\n message: Extract<MessageType, { role: \"tool\" }>,\n toolNamesById: Map<string, string>,\n): GeminiContent {\n return {\n role: \"user\",\n parts: message.content.map((content) => {\n if (content.type !== \"tool-result\") {\n throw new TypeError(\n \"Anvia interaction responses must be resolved by Agent before provider calls.\",\n );\n }\n return toolContentToGeminiPart(content, toolNamesById);\n }),\n };\n}\n\nfunction assistantMessageToGeminiContent(\n message: Extract<MessageType, { role: \"assistant\" }>,\n): GeminiContent {\n return {\n role: \"model\",\n parts:\n typeof message.content === \"string\"\n ? [{ text: message.content }]\n : message.content.flatMap((content): GeminiPart[] => {\n if (content.type === \"text\") {\n const part: GeminiPart = { text: content.text };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"tool-call\") {\n const functionCall: Record<string, unknown> = {\n name: content.toolName,\n args: content.input,\n };\n if (content.callId !== undefined) {\n functionCall.id = content.callId;\n }\n const part: GeminiPart = { functionCall };\n if (content.signature !== undefined) {\n part.thoughtSignature = content.signature;\n }\n return [part];\n }\n if (content.type === \"reasoning\" && content.details !== undefined) {\n return content.details.flatMap((reasoning): GeminiPart[] => {\n if (reasoning.type !== \"text\" && reasoning.type !== \"summary\") {\n return [];\n }\n const part: GeminiPart = { text: reasoning.text, thought: true };\n if (reasoning.type === \"text\" && reasoning.signature !== undefined) {\n part.thoughtSignature = reasoning.signature;\n }\n return [part];\n });\n }\n if (content.type === \"image\" || content.type === \"file\") {\n throw new Error(\n \"Gemini does not support image or file content in assistant history yet\",\n );\n }\n return [];\n }),\n };\n}\n\nfunction userContentToGeminiPart(content: UserContentPart): GeminiPart {\n if (content.type === \"text\") {\n return { text: content.text };\n }\n if (content.type === \"image\") {\n return imageContentToGeminiPart(content);\n }\n return documentContentToGeminiPart(content);\n}\n\nfunction imageContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"image\" }>,\n): GeminiPart {\n if (content.image.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType ?? \"image/png\",\n data: content.image.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.image.url,\n mimeType: content.mediaType ?? mimeTypeFromImageUrl(content.image.url),\n },\n };\n}\n\nfunction mimeTypeFromImageUrl(url: string): string {\n const pathname = safeUrlPathname(url).toLowerCase();\n if (pathname.endsWith(\".jpg\") || pathname.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (pathname.endsWith(\".webp\")) return \"image/webp\";\n if (pathname.endsWith(\".gif\")) return \"image/gif\";\n if (pathname.endsWith(\".bmp\")) return \"image/bmp\";\n if (pathname.endsWith(\".heic\")) return \"image/heic\";\n if (pathname.endsWith(\".heif\")) return \"image/heif\";\n return \"image/png\";\n}\n\nfunction safeUrlPathname(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n}\n\nfunction documentContentToGeminiPart(\n content: Extract<UserContentPart, { type: \"file\" }>,\n): GeminiPart {\n if (content.data.type === \"text\") {\n return { text: content.data.text };\n }\n\n if (content.data.type === \"data\") {\n return {\n inlineData: {\n mimeType: content.mediaType,\n data: content.data.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.data.url,\n mimeType: content.mediaType,\n },\n };\n}\n\nfunction toolContentToGeminiPart(\n content: ToolResultPart,\n toolNamesById: Map<string, string>,\n): GeminiPart {\n const id = content.callId ?? content.toolCallId;\n const functionResponse: Record<string, unknown> = {\n name: content.toolName || toolNamesById.get(id) || content.toolCallId,\n response: toolResultResponse(content),\n };\n if (content.callId !== undefined) {\n functionResponse.id = content.callId;\n }\n return { functionResponse };\n}\n\nfunction toolResultResponse(content: ToolResultPart): Record<string, unknown> {\n const output = content.output;\n if (output.type === \"json\") {\n return { result: output.value };\n }\n if (output.type === \"text\") {\n return { content: output.value };\n }\n if (output.type === \"error-json\" || output.type === \"error-text\") {\n return { error: output.value };\n }\n if (output.type === \"execution-denied\") {\n return { error: output.reason ?? \"Tool execution was denied.\" };\n }\n return {\n content: output.value\n .map((item) => (item.type === \"text\" ? item.text : `[file:${item.mediaType}]`))\n .join(\"\\n\"),\n };\n}\n\nfunction toolDefinitionToGemini(tool: ToolDefinition): GeminiPart {\n return {\n name: tool.name,\n description: tool.description,\n parametersJsonSchema: tool.parameters,\n };\n}\n\nfunction toolChoiceToGemini(toolChoice: ToolChoice): GeminiPart {\n if (toolChoice === \"auto\") {\n return { functionCallingConfig: { mode: \"AUTO\" } };\n }\n if (toolChoice === \"required\") {\n return { functionCallingConfig: { mode: \"ANY\" } };\n }\n if (toolChoice === \"none\") {\n return { functionCallingConfig: { mode: \"NONE\" } };\n }\n return {\n functionCallingConfig: {\n mode: \"ANY\",\n allowedFunctionNames: [toolChoice.name],\n },\n };\n}\n\nexport function fromGeminiGenerateContentResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const choice = assistantContentFromGeminiResponse(raw);\n\n const result: CompletionResponse = {\n choice,\n usage: usageFromGemini(raw.usageMetadata),\n rawResponse: response,\n };\n const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);\n if (id !== undefined) {\n result.messageId = id;\n }\n return result;\n}\n\nexport function fromGeminiGenerateContentStreamChunk(chunk: unknown): CompletionModelStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionModelStreamEvent[] = [];\n const directText = typeof chunk.text === \"string\" ? chunk.text : \"\";\n if (directText.length > 0 && candidateParts(chunk).length === 0) {\n events.push({ type: \"text_delta\", delta: directText });\n }\n for (const part of candidateParts(chunk)) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n events.push({ type: \"reasoning_delta\", delta: part.text, contentType: \"summary\" });\n } else {\n events.push({ type: \"text_delta\", delta: part.text });\n }\n }\n }\n for (const call of functionCallsFromGeminiResponse(chunk)) {\n events.push(\n toolCallDelta(call.id ?? call.name, {\n callId: call.id,\n name: call.name,\n signature: call.signature,\n }),\n );\n events.push(\n toolCallDelta(call.id ?? call.name, {\n callId: call.id,\n argumentsDelta: JSON.stringify(call.args ?? {}),\n argumentsMode: \"replace\",\n }),\n );\n }\n const id = stringFrom(chunk.responseId) ?? stringFrom(chunk.id);\n if (id !== undefined) {\n events.push({ type: \"message_id\", id });\n }\n if (isPlainObject(chunk.usageMetadata)) {\n events.push({ type: \"final\", response: fromGeminiGenerateContentResponse(chunk) });\n }\n return events;\n}\n\nfunction assistantContentFromGeminiResponse(\n response: Record<string, unknown>,\n): AssistantContentPart[] {\n const parts = candidateParts(response);\n if (parts.length === 0) {\n const text = textFromGeminiResponse(response);\n return text.length > 0 ? [{ type: \"text\", text }] : [];\n }\n\n const choice: AssistantContentPart[] = [];\n for (const part of parts) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n choice.push({\n type: \"reasoning\",\n text: part.text,\n details: [{ type: \"summary\", text: part.text }],\n });\n } else {\n const signature = thoughtSignatureFrom(part);\n let text: Extract<AssistantContentPart, { type: \"text\" }> = {\n type: \"text\",\n text: part.text,\n };\n if (signature !== undefined) text = { ...text, signature };\n choice.push(text);\n }\n }\n if (isPlainObject(part.functionCall)) {\n const call = functionCallFromGeminiPart(part.functionCall, part);\n if (call !== undefined) {\n const toolCallId = call.id ?? crypto.randomUUID();\n let toolCall: Extract<AssistantContentPart, { type: \"tool-call\" }> = {\n type: \"tool-call\",\n toolCallId,\n toolName: call.name,\n input: call.args,\n };\n if (call.id !== undefined) toolCall = { ...toolCall, callId: call.id };\n if (call.signature !== undefined) toolCall = { ...toolCall, signature: call.signature };\n choice.push(toolCall);\n }\n }\n }\n return choice;\n}\n\nfunction textFromGeminiResponse(response: Record<string, unknown>): string {\n if (typeof response.text === \"string\") {\n return response.text;\n }\n return candidateParts(response)\n .flatMap((part) => (part.thought !== true && typeof part.text === \"string\" ? [part.text] : []))\n .join(\"\");\n}\n\nfunction functionCallsFromGeminiResponse(\n response: Record<string, unknown>,\n): Array<{ id?: string | undefined; name: string; args: JsonValue; signature?: string }> {\n const directCalls = Array.isArray(response.functionCalls)\n ? response.functionCalls\n : Array.isArray(response.function_calls)\n ? response.function_calls\n : [];\n const partCalls = candidateParts(response).flatMap((part) => {\n if (!isPlainObject(part.functionCall)) {\n return [];\n }\n const call = functionCallFromGeminiPart(part.functionCall, part);\n return call === undefined ? [] : [call];\n });\n\n const normalizedDirectCalls = directCalls.flatMap((call) => {\n if (!isPlainObject(call) || typeof call.name !== \"string\") {\n return [];\n }\n const normalized: { id?: string; name: string; args: JsonValue; signature?: string } = {\n name: call.name,\n args: toJsonValue(call.args ?? {}),\n };\n const id = stringFrom(call.id);\n const signature = thoughtSignatureFrom(call);\n if (id !== undefined) {\n normalized.id = id;\n }\n if (signature !== undefined) {\n normalized.signature = signature;\n }\n return [normalized];\n });\n\n return [...normalizedDirectCalls, ...partCalls];\n}\n\nfunction functionCallFromGeminiPart(\n call: Record<string, unknown>,\n part: Record<string, unknown>,\n): { id?: string | undefined; name: string; args: JsonValue; signature?: string } | undefined {\n if (typeof call.name !== \"string\") {\n return undefined;\n }\n const normalized: { id?: string; name: string; args: JsonValue; signature?: string } = {\n name: call.name,\n args: toJsonValue(call.args ?? {}),\n };\n const id = stringFrom(call.id);\n const signature = thoughtSignatureFrom(part) ?? thoughtSignatureFrom(call);\n if (id !== undefined) {\n normalized.id = id;\n }\n if (signature !== undefined) {\n normalized.signature = signature;\n }\n return normalized;\n}\n\nfunction candidateParts(response: Record<string, unknown>): Array<Record<string, unknown>> {\n const candidates = Array.isArray(response.candidates) ? response.candidates : [];\n return candidates.flatMap((candidate) => {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n return [];\n }\n return Array.isArray(candidate.content.parts)\n ? candidate.content.parts.filter(isPlainObject)\n : [];\n });\n}\n\nfunction usageFromGemini(usage: unknown): Usage {\n const raw = isPlainObject(usage) ? usage : {};\n const promptInputTokens = numberFrom(raw.promptTokenCount);\n const toolInputTokens = numberFrom(raw.toolUsePromptTokenCount);\n const inputTokens = promptInputTokens + toolInputTokens;\n const candidateOutputTokens = numberFrom(raw.candidatesTokenCount);\n const reasoningOutputTokens = numberFrom(raw.thoughtsTokenCount);\n const outputTokens = candidateOutputTokens + reasoningOutputTokens;\n const cachedInputTokens = Math.min(promptInputTokens, numberFrom(raw.cachedContentTokenCount));\n const totalTokens = inputTokens + outputTokens;\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n details: {\n input: promptInputTokens - cachedInputTokens,\n input_cached_tokens: cachedInputTokens,\n input_tool_use_tokens: toolInputTokens,\n output: candidateOutputTokens,\n output_reasoning_tokens: reasoningOutputTokens,\n total: totalTokens,\n },\n };\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n Array.isArray(value) ||\n isPlainObject(value)\n ) {\n return value as JsonValue;\n }\n\n return String(value);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction thoughtSignatureFrom(value: Record<string, unknown>): string | undefined {\n return stringFrom(value.thoughtSignature) ?? stringFrom(value.thought_signature);\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n argumentsMode?: ToolCallArgumentsMode | undefined;\n signature?: string | undefined;\n },\n): CompletionModelStreamEvent {\n const event: CompletionModelStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n if (values.argumentsMode !== undefined) event.argumentsMode = values.argumentsMode;\n if (values.signature !== undefined) event.signature = values.signature;\n return event;\n}\n","import {\n type CompletionRequest,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport function orderedRequestMessages(request: CompletionRequest): MessageType[] {\n const messages: MessageType[] = [];\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","export function disableGeminiNativeRetries(\n config: Record<string, unknown>,\n): Record<string, unknown> {\n const httpOptions = isPlainObject(config.httpOptions) ? config.httpOptions : {};\n const retryOptions = isPlainObject(httpOptions.retryOptions) ? httpOptions.retryOptions : {};\n return {\n ...config,\n httpOptions: {\n ...httpOptions,\n retryOptions: {\n ...retryOptions,\n attempts: 1,\n },\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { Embedding, EmbeddingModel, ModelCallOptions } from \"@anvia/core/embeddings\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiEmbeddingModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport type GeminiEmbeddingTaskType =\n | \"TASK_TYPE_UNSPECIFIED\"\n | \"RETRIEVAL_QUERY\"\n | \"RETRIEVAL_DOCUMENT\"\n | \"SEMANTIC_SIMILARITY\"\n | \"CLASSIFICATION\"\n | \"CLUSTERING\"\n | \"QUESTION_ANSWERING\"\n | \"FACT_VERIFICATION\"\n | \"CODE_RETRIEVAL_QUERY\";\n\nexport type GeminiEmbeddingModelOptions = {\n modelId: GeminiEmbeddingModelId;\n dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n taskType?: GeminiEmbeddingTaskType | undefined;\n title?: string | undefined;\n};\n\nexport class GeminiEmbeddingModel implements EmbeddingModel {\n readonly provider = \"gemini\";\n readonly modelId: GeminiEmbeddingModelId;\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n private readonly taskType: GeminiEmbeddingTaskType | undefined;\n private readonly title: string | undefined;\n\n constructor(\n private readonly client: GoogleGenAI,\n options: GeminiEmbeddingModelOptions,\n ) {\n this.modelId = options.modelId;\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 100;\n this.taskType = options.taskType;\n this.title = options.title;\n }\n\n async embedTexts(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch, options)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const config = { ...this.embeddingConfig() };\n if (options?.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.client.models.embedContent({\n model: this.modelId,\n contents: texts,\n config: disableGeminiNativeRetries(config),\n } as never);\n const rawEmbeddings = embeddingsFromResponse(response);\n if (rawEmbeddings.length !== texts.length) {\n throw new Error(\n `Embedding response length ${rawEmbeddings.length} did not match input length ${texts.length}`,\n );\n }\n\n return rawEmbeddings.map((vector, index) => ({\n document: texts[index] as string,\n vector,\n }));\n }\n\n private embeddingConfig(): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n if (this.dimensions !== undefined) config.outputDimensionality = this.dimensions;\n if (this.taskType !== undefined) config.taskType = this.taskType;\n if (this.title !== undefined) config.title = this.title;\n return config;\n }\n}\n\nfunction embeddingsFromResponse(response: unknown): number[][] {\n const raw = response as Record<string, unknown>;\n if (Array.isArray(raw.embeddings)) {\n return raw.embeddings.map((embedding, index) => vectorFromEmbedding(embedding, index));\n }\n if (raw.embedding !== undefined) {\n return [vectorFromEmbedding(raw.embedding, 0)];\n }\n return [];\n}\n\nfunction vectorFromEmbedding(embedding: unknown, position: number): number[] {\n if (!isObject(embedding) || !isNumberArray(embedding.values)) {\n throw new Error(`Invalid Gemini embedding response vector at position ${position}.`);\n }\n return embedding.values;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNumberArray(value: unknown): value is number[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"number\");\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResult,\n ModelCallOptions,\n} from \"@anvia/core/image-generation\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiGenerateContentImageModelId, GeminiGenerateImagesModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nexport const GEMINI_2_5_FLASH_IMAGE = \"gemini-2.5-flash-image\";\nexport const GEMINI_3_PRO_IMAGE_PREVIEW = \"gemini-3-pro-image-preview\";\nexport const IMAGEN_4_GENERATE = \"imagen-4.0-generate-001\";\n\nexport class GeminiImageGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateContentImageModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const providerImageConfig = isPlainObject(providerConfig.imageConfig)\n ? providerConfig.imageConfig\n : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: {\n ...providerImageConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n },\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n contents: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateContent(params as never);\n return nativeImageResponseFromGemini(response);\n }\n}\n\nexport class GeminiImagenGenerationModel implements ImageGenerationModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiGenerateImagesModelId,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n options?: ModelCallOptions,\n ): Promise<ImageGenerationResult<unknown>> {\n const providerOptions = isPlainObject(request.providerOptions) ? request.providerOptions : {};\n const { config: providerConfigValue, ...providerTopLevel } = providerOptions;\n const providerConfig = isPlainObject(providerConfigValue) ? providerConfigValue : {};\n const config: Record<string, unknown> = {\n ...providerConfig,\n aspectRatio: aspectRatio(request.width, request.height),\n };\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n const params: Record<string, unknown> = {\n ...providerTopLevel,\n model: this.modelId,\n prompt: request.prompt,\n config: disableGeminiNativeRetries(config),\n };\n\n const response = await this.client.models.generateImages(params as never);\n return imagenResponseFromGemini(response);\n }\n}\n\nexport function nativeImageResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n const images = candidates.flatMap((candidate): GeneratedImage[] => {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n return [];\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n return parts.flatMap((part): GeneratedImage[] => {\n if (!isPlainObject(part) || !isPlainObject(part.inlineData)) {\n return [];\n }\n const data = part.inlineData.data;\n if (typeof data !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(data),\n mediaType:\n typeof part.inlineData.mimeType === \"string\" ? part.inlineData.mimeType : \"image/png\",\n },\n ];\n });\n });\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no inline image data.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function imagenResponseFromGemini(response: unknown): ImageGenerationResult<unknown> {\n const raw = response as Record<string, unknown>;\n const images = (Array.isArray(raw.generatedImages) ? raw.generatedImages : []).flatMap(\n (item): GeneratedImage[] => {\n if (!isPlainObject(item) || !isPlainObject(item.image)) {\n return [];\n }\n const imageBytes = item.image.imageBytes;\n if (typeof imageBytes !== \"string\") {\n return [];\n }\n return [\n {\n data: decodeBase64Image(imageBytes),\n mediaType: typeof item.image.mimeType === \"string\" ? item.image.mimeType : \"image/png\",\n },\n ];\n },\n );\n\n if (images.length === 0) {\n throw new Error(\"Gemini image generation response contained no base64 images.\");\n }\n\n return {\n images: images as [GeneratedImage, ...GeneratedImage[]],\n rawResponse: response,\n };\n}\n\nexport function aspectRatio(width: number, height: number): string {\n const normalizedWidth = Math.max(1, Math.trunc(width));\n const normalizedHeight = Math.max(1, Math.trunc(height));\n const divisor = gcd(normalizedWidth, normalizedHeight);\n return `${normalizedWidth / divisor}:${normalizedHeight / divisor}`;\n}\n\nfunction gcd(left: number, right: number): number {\n let a = left;\n let b = right;\n while (b !== 0) {\n const next = a % b;\n a = b;\n b = next;\n }\n return a;\n}\n\nfunction decodeBase64Image(value: string): Uint8Array {\n const normalized = value.replace(/\\s/g, \"\").replace(/=+$/, \"\");\n const bytes = Buffer.from(value, \"base64\");\n const roundTrip = bytes.toString(\"base64\").replace(/=+$/, \"\");\n if (normalized.length === 0 || bytes.length === 0 || roundTrip !== normalized) {\n throw new Error(\"Gemini image generation response contained invalid base64 image data.\");\n }\n return new Uint8Array(bytes);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport type { ModelId } from \"@anvia/core/model-listing\";\n\nexport type KnownGeminiCompletionModelId =\n | \"gemini-2.0-flash\"\n | \"gemini-2.0-flash-lite\"\n | \"gemini-2.5-flash\"\n | \"gemini-2.5-flash-image\"\n | \"gemini-2.5-flash-lite\"\n | \"gemini-2.5-flash-preview-tts\"\n | \"gemini-2.5-pro\"\n | \"gemini-2.5-pro-preview-tts\"\n | \"gemini-3-flash-preview\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3-pro-preview\"\n | \"gemini-3.1-flash-image-preview\"\n | \"gemini-3.1-flash-lite\"\n | \"gemini-3.1-flash-lite-preview\"\n | \"gemini-3.1-pro-preview\"\n | \"gemini-3.1-pro-preview-customtools\"\n | \"gemini-3.5-flash\"\n | \"gemini-flash-latest\"\n | \"gemini-flash-lite-latest\"\n | \"gemma-4-26b-a4b-it\"\n | \"gemma-4-31b-it\";\n\nexport type GeminiCompletionModelId = ModelId<KnownGeminiCompletionModelId>;\n\nconst CONTEXT_1M_64K = {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 65_536,\n};\n\nexport const GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS = {\n \"gemini-2.0-flash\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.0-flash-lite\": {\n contextWindow: 1_048_576,\n maxInputTokens: 1_048_576,\n maxOutputTokens: 8_192,\n },\n \"gemini-2.5-flash\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-image\": {\n contextWindow: 32_768,\n maxInputTokens: 32_768,\n maxOutputTokens: 32_768,\n },\n \"gemini-2.5-flash-lite\": CONTEXT_1M_64K,\n \"gemini-2.5-flash-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-2.5-pro\": CONTEXT_1M_64K,\n \"gemini-2.5-pro-preview-tts\": {\n contextWindow: 8_192,\n maxInputTokens: 8_192,\n maxOutputTokens: 16_384,\n },\n \"gemini-3-flash-preview\": CONTEXT_1M_64K,\n \"gemini-3-pro-image-preview\": {\n contextWindow: 131_072,\n maxInputTokens: 131_072,\n maxOutputTokens: 32_768,\n },\n \"gemini-3-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-image-preview\": {\n contextWindow: 65_536,\n maxInputTokens: 65_536,\n maxOutputTokens: 65_536,\n },\n \"gemini-3.1-flash-lite\": CONTEXT_1M_64K,\n \"gemini-3.1-flash-lite-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview\": CONTEXT_1M_64K,\n \"gemini-3.1-pro-preview-customtools\": CONTEXT_1M_64K,\n \"gemini-3.5-flash\": CONTEXT_1M_64K,\n \"gemini-flash-latest\": CONTEXT_1M_64K,\n \"gemini-flash-lite-latest\": CONTEXT_1M_64K,\n \"gemma-4-26b-a4b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n \"gemma-4-31b-it\": {\n contextWindow: 262_144,\n maxInputTokens: 262_144,\n maxOutputTokens: 32_768,\n },\n} satisfies Readonly<Record<KnownGeminiCompletionModelId, ModelContextLimits>>;\n\nexport type KnownGeminiEmbeddingModelId = \"gemini-embedding-001\";\n\nexport type GeminiEmbeddingModelId = ModelId<KnownGeminiEmbeddingModelId>;\n\nexport type KnownGeminiGenerateContentImageModelId =\n | \"gemini-2.5-flash-image\"\n | \"gemini-3-pro-image-preview\"\n | \"gemini-3.1-flash-image-preview\";\n\nexport type KnownGeminiGenerateImagesModelId = \"imagen-4.0-generate-001\";\n\nexport type GeminiGenerateContentImageModelId = ModelId<KnownGeminiGenerateContentImageModelId>;\nexport type GeminiGenerateImagesModelId = ModelId<KnownGeminiGenerateImagesModelId>;\n\nexport type GeminiTranscriptionModelId = GeminiCompletionModelId;\n","import { Buffer } from \"node:buffer\";\nimport type {\n ModelCallOptions,\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResult,\n} from \"@anvia/core/transcription\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport type { GeminiTranscriptionModelId } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\n\nconst TRANSCRIPTION_PREAMBLE =\n \"Transcribe the provided audio exactly. Do not add additional information.\";\n\nexport class GeminiTranscriptionModel implements TranscriptionModel<unknown> {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly modelId: GeminiTranscriptionModelId,\n ) {}\n\n async transcription(\n request: TranscriptionRequest,\n options?: ModelCallOptions,\n ): Promise<TranscriptionResult<unknown>> {\n const config: Record<string, unknown> = isPlainObject(request.providerOptions)\n ? { ...request.providerOptions }\n : {};\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (options?.abortSignal !== undefined) config.abortSignal = options.abortSignal;\n\n const response = await this.client.models.generateContent({\n model: this.modelId,\n contents: [\n {\n role: \"user\",\n parts: [\n {\n inlineData: {\n mimeType: request.mediaType ?? mimeTypeFromFilename(request.filename),\n data: Buffer.from(request.data).toString(\"base64\"),\n },\n },\n ],\n },\n ],\n config: disableGeminiNativeRetries({\n ...config,\n systemInstruction:\n request.prompt === undefined\n ? TRANSCRIPTION_PREAMBLE\n : `${TRANSCRIPTION_PREAMBLE}\\n\\n${request.prompt}`,\n }),\n } as never);\n\n return {\n text: textFromGenerateContentResponse(response),\n rawResponse: response,\n };\n }\n}\n\nexport function textFromGenerateContentResponse(response: unknown): string {\n const raw = response as Record<string, unknown>;\n if (typeof raw.text === \"string\") {\n return raw.text;\n }\n const candidates = Array.isArray(raw.candidates) ? raw.candidates : [];\n for (const candidate of candidates) {\n if (!isPlainObject(candidate) || !isPlainObject(candidate.content)) {\n continue;\n }\n const parts = Array.isArray(candidate.content.parts) ? candidate.content.parts : [];\n for (const part of parts) {\n if (isPlainObject(part) && typeof part.text === \"string\") {\n return part.text;\n }\n }\n }\n throw new Error(\"Gemini transcription response contained no text.\");\n}\n\nfunction mimeTypeFromFilename(filename: string): string {\n const lower = filename.toLowerCase();\n if (lower.endsWith(\".wav\")) return \"audio/wav\";\n if (lower.endsWith(\".aac\")) return \"audio/aac\";\n if (lower.endsWith(\".ogg\")) return \"audio/ogg\";\n if (lower.endsWith(\".flac\")) return \"audio/flac\";\n if (lower.endsWith(\".m4a\")) return \"audio/m4a\";\n if (lower.endsWith(\".opus\")) return \"audio/opus\";\n return \"audio/mpeg\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["isPlainObject","content","Buffer","isPlainObject","Buffer","Buffer","isPlainObject","Buffer","isObject"]}
1
+ {"version":3,"sources":["../src/gemini/index.ts","../src/gemini/client.ts","../src/gemini/completion.ts","../src/request-messages.ts","../src/gemini/retry.ts","../src/gemini/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/models.ts","../src/gemini/transcription.ts"],"sourcesContent":["export {\n GeminiClient,\n type GeminiClientOptions,\n type GeminiCompletionModelHandle,\n type GeminiCompletionModelOptions,\n type GeminiEmbeddingModelHandle,\n type GeminiImageGenerationModelHandle,\n type GeminiImageGenerationModelOptions,\n type GeminiTranscriptionModelHandle,\n type GeminiTranscriptionModelOptions,\n} from \"./client\";\nexport type {\n GeminiEmbeddingModelOptions,\n GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport type {\n GeminiCompletionModelId,\n GeminiEmbeddingModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n KnownGeminiCompletionModelId,\n KnownGeminiEmbeddingModelId,\n KnownGeminiGenerateContentImageModelId,\n KnownGeminiGenerateImagesModelId,\n} from \"./models\";\n","import {\n type ModelContextLimits,\n resolveModelContextLimits,\n type StreamingCompletionModel,\n} from \"@anvia/core/completion\";\nimport type { EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { ImageGenerationModel } from \"@anvia/core/image-generation\";\nimport {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport type { TranscriptionModel } from \"@anvia/core/transcription\";\nimport { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport { GeminiImageGenerationModel, GeminiImagenGenerationModel } from \"./image-generation\";\nimport type {\n GeminiCompletionModelId,\n GeminiGenerateContentImageModelId,\n GeminiGenerateImagesModelId,\n GeminiTranscriptionModelId,\n} from \"./models\";\nimport { GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS } from \"./models\";\nimport { disableGeminiNativeRetries } from \"./retry\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey: string;\n vertexAi?: never;\n client?: never;\n};\n\ntype VertexClientOptions = {\n vertexAi: {\n projectId: string;\n location: string;\n googleAuthOptions?: GoogleGenAIOptions[\"googleAuthOptions\"];\n };\n apiKey?: never;\n client?: never;\n};\n\ntype InjectedClientOptions = {\n client: GoogleGenAI;\n apiKey?: never;\n vertexAi?: never;\n};\n\nexport type GeminiClientOptions =\n | GeminiApiClientOptions\n | VertexClientOptions\n | InjectedClientOptions;\n\nexport type GeminiCompletionModelOptions = {\n modelId: GeminiCompletionModelId;\n contextLimits?: ModelContextLimits | undefined;\n};\n\nexport type GeminiImageGenerationModelOptions =\n | { api: \"generateContent\"; modelId: GeminiGenerateContentImageModelId }\n | { api: \"generateImages\"; modelId: GeminiGenerateImagesModelId };\n\nexport type GeminiTranscriptionModelOptions = { modelId: GeminiTranscriptionModelId };\n\nexport type GeminiCompletionModelHandle = StreamingCompletionModel<unknown>;\nexport type GeminiEmbeddingModelHandle = EmbeddingModel;\nexport type GeminiImageGenerationModelHandle = ImageGenerationModel<unknown>;\nexport type GeminiTranscriptionModelHandle = TranscriptionModel<unknown>;\n\nexport class GeminiClient implements ModelListingClient {\n private readonly sdk: GoogleGenAI;\n\n constructor(options: GeminiClientOptions) {\n if (options.client !== undefined) {\n rejectManagedOptionsWithInjectedClient(options, [\"apiKey\", \"vertexAi\"]);\n this.sdk = options.client;\n return;\n }\n this.sdk = new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(options: GeminiCompletionModelOptions): GeminiCompletionModelHandle {\n const modelId = requireModelId(options.modelId);\n return new GeminiCompletionModel(\n this.sdk,\n modelId,\n resolveModelContextLimits(\n modelId,\n GEMINI_COMPLETION_MODEL_CONTEXT_LIMITS,\n options.contextLimits,\n ),\n );\n }\n\n embeddingModel(options: GeminiEmbeddingModelOptions): GeminiEmbeddingModelHandle {\n requireModelId(options.modelId);\n validateOptionalPositiveSafeInteger(options.dimensions, \"dimensions\");\n validateOptionalPositiveSafeInteger(options.maxBatchSize, \"maxBatchSize\");\n return new GeminiEmbeddingModel(this.sdk, options);\n }\n\n imageGenerationModel(\n options: GeminiImageGenerationModelOptions,\n ): GeminiImageGenerationModelHandle {\n const modelId = requireModelId(options.modelId);\n return options.api === \"generateContent\"\n ? new GeminiImageGenerationModel(this.sdk, modelId)\n : new GeminiImagenGenerationModel(this.sdk, modelId);\n }\n\n transcriptionModel(options: GeminiTranscriptionModelOptions): GeminiTranscriptionModelHandle {\n return new GeminiTranscriptionModel(this.sdk, requireModelId(options.modelId));\n }\n\n async listModels(options: { abortSignal?: AbortSignal | undefined } = {}): Promise<ModelList> {\n try {\n const config = { pageSize: 1000 };\n if (options.abortSignal !== undefined) {\n Object.assign(config, { abortSignal: options.abortSignal });\n }\n const response = await this.sdk.models.list({\n config: disableGeminiNativeRetries(config),\n });\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"Gemini\", error);\n }\n }\n}\n\nfunction rejectManagedOptionsWithInjectedClient(options: object, keys: readonly string[]): void {\n const conflict = keys.find((key) => key in options);\n if (conflict !== undefined) {\n throw new TypeError(`GeminiClient cannot combine client with ${conflict}.`);\n }\n}\n\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): GoogleGenAIOptions {\n if (\"client\" in options && options.client !== undefined) {\n throw new TypeError(\"Injected Gemini clients do not have managed SDK options.\");\n }\n if (\"vertexAi\" in options && options.vertexAi !== undefined) {\n const sdkOptions: GoogleGenAIOptions = {\n vertexai: true,\n project: requireOption(options.vertexAi.projectId, \"projectId\", \"Vertex Gemini\"),\n location: requireOption(options.vertexAi.location, \"location\", \"Vertex Gemini\"),\n };\n if (options.vertexAi.googleAuthOptions !== undefined) {\n sdkOptions.googleAuthOptions = options.vertexAi.googleAuthOptions;\n }\n return sdkOptions;\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.trim().length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\n}\n\nfunction requireModelId<ModelId extends string>(modelId: ModelId): ModelId {\n if (modelId.trim().length === 0) {\n throw new TypeError(\"modelId must be a non-empty string\");\n }\n return modelId;\n}\n\nfunction validateOptionalPositiveSafeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.models)) {\n return response.models;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model)) {\n return undefined;\n }\n\n const id =\n stringValue(model.baseModelId) ??\n stringValue(model.base_model_id) ??\n normalizeGeminiModelId(stringValue(model.name));\n\n if (id === undefined) {\n return undefined;\n }\n\n const listedModel: ModelList[\"data\"][number] = {\n id,\n };\n if (typeof model.displayName === \"string\") {\n listedModel.name = model.displayName;\n }\n if (typeof model.display_name === \"string\") {\n listedModel.name = model.display_name;\n }\n if (typeof model.description === \"string\") {\n listedModel.description = model.description;\n }\n if (typeof model.type === \"string\") {\n listedModel.type = model.type;\n }\n if (typeof model.inputTokenLimit === \"number\") {\n listedModel.contextLength = model.inputTokenLimit;\n }\n if (typeof model.input_token_limit === \"number\") {\n listedModel.contextLength = model.input_token_limit;\n }\n return listedModel;\n}\n\nfunction normalizeGeminiModelId(name: string | undefined): string | undefined {\n const trimmed = name?.trim().replace(/^models\\//, \"\");\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n statusCode,\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { ModelContextLimits } from \"@anvia/core/completion\";\nimport {\n type AssistantContentPart,\n assertCompletionRequestSupported,\n type CompletionFinishReason,\n type CompletionModelCapabilities,\n type CompletionModelInfo,\n type CompletionModelStreamEvent,\n 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 applyGeminiFinishReason(result, raw);\n const id = stringFrom(raw.responseId) ?? stringFrom(raw.id);\n if (id !== undefined) {\n result.messageId = id;\n }\n return result;\n}\n\nfunction applyGeminiFinishReason(response: CompletionResponse, raw: Record<string, unknown>): void {\n const value = stringFrom(primaryGeminiCandidate(raw)?.finishReason);\n if (value === undefined) return;\n response.finishReason = geminiFinishReason(value, response.choice);\n response.providerFinishReason = value;\n}\n\nfunction geminiFinishReason(\n value: string,\n choice: readonly AssistantContentPart[],\n): CompletionFinishReason {\n if (value === \"MAX_TOKENS\") return \"length\";\n if (\n value === \"SAFETY\" ||\n value === \"RECITATION\" ||\n value === \"BLOCKLIST\" ||\n value === \"PROHIBITED_CONTENT\" ||\n value === \"SPII\" ||\n value === \"IMAGE_SAFETY\" ||\n value === \"IMAGE_PROHIBITED_CONTENT\"\n ) {\n return \"content-filter\";\n }\n if (value === \"STOP\") {\n return choice.some((part) => part.type === \"tool-call\") ? \"tool-calls\" : \"stop\";\n }\n return \"other\";\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 primaryGeminiCandidate(\n response: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const candidates = Array.isArray(response.candidates)\n ? response.candidates.filter(isPlainObject)\n : [];\n return candidates.find((candidate) => candidate.index === 0) ?? candidates[0];\n}\n\nfunction usageFromGemini(usage: unknown): Usage {\n const raw = isPlainObject(usage) ? usage : {};\n const promptInputTokens = numberFrom(raw.promptTokenCount);\n const toolInputTokens = numberFrom(raw.toolUsePromptTokenCount);\n const inputTokens = promptInputTokens + toolInputTokens;\n const candidateOutputTokens = numberFrom(raw.candidatesTokenCount);\n const reasoningOutputTokens = numberFrom(raw.thoughtsTokenCount);\n const outputTokens = candidateOutputTokens + reasoningOutputTokens;\n const cachedInputTokens = Math.min(promptInputTokens, numberFrom(raw.cachedContentTokenCount));\n const totalTokens = inputTokens + outputTokens;\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n details: {\n input: promptInputTokens - cachedInputTokens,\n input_cached_tokens: cachedInputTokens,\n input_tool_use_tokens: toolInputTokens,\n output: candidateOutputTokens,\n output_reasoning_tokens: reasoningOutputTokens,\n total: totalTokens,\n },\n };\n}\n\nfunction 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.5",
3
+ "version": "1.0.0-rc.6",
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.5"
36
+ "@anvia/core": "1.0.0-rc.6"
37
37
  },
38
38
  "peerDependencies": {
39
- "@anvia/core": "1.0.0-rc.5"
39
+ "@anvia/core": "1.0.0-rc.6"
40
40
  },
41
41
  "scripts": {
42
42
  "prebuild": "test -f ../core/dist/index.d.ts || pnpm --filter @anvia/core build",