@anvia/gemini 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -94,3 +94,5 @@ pnpm --filter @anvia/gemini typecheck
94
94
  pnpm --filter @anvia/gemini test
95
95
  pnpm --filter @anvia/gemini build
96
96
  ```
97
+
98
+ Package-local `typecheck` and `build` scripts build `@anvia/core` first so core subpath types are available in a fresh worktree.
package/dist/index.js CHANGED
@@ -612,16 +612,24 @@ var GeminiEmbeddingModel = class {
612
612
  function embeddingsFromResponse(response) {
613
613
  const raw = response;
614
614
  if (Array.isArray(raw.embeddings)) {
615
- return raw.embeddings.map(vectorFromEmbedding);
615
+ return raw.embeddings.map((embedding, index) => vectorFromEmbedding(embedding, index));
616
616
  }
617
617
  if (raw.embedding !== void 0) {
618
- return [vectorFromEmbedding(raw.embedding)];
618
+ return [vectorFromEmbedding(raw.embedding, 0)];
619
619
  }
620
620
  return [];
621
621
  }
622
- function vectorFromEmbedding(embedding) {
623
- const raw = embedding;
624
- return Array.isArray(raw.values) ? raw.values.filter((value) => typeof value === "number") : [];
622
+ function vectorFromEmbedding(embedding, position) {
623
+ if (!isObject(embedding) || !isNumberArray(embedding.values)) {
624
+ throw new Error(`Invalid Gemini embedding response vector at position ${position}.`);
625
+ }
626
+ return embedding.values;
627
+ }
628
+ function isObject(value) {
629
+ return typeof value === "object" && value !== null && !Array.isArray(value);
630
+ }
631
+ function isNumberArray(value) {
632
+ return Array.isArray(value) && value.every((item) => typeof item === "number");
625
633
  }
626
634
 
627
635
  // src/gemini/image-generation.ts
@@ -700,7 +708,7 @@ function nativeImageResponseFromGemini(response) {
700
708
  }
701
709
  return [
702
710
  {
703
- data: new Uint8Array(Buffer2.from(data, "base64")),
711
+ data: decodeBase64Image(data),
704
712
  mediaType: typeof part.inlineData.mimeType === "string" ? part.inlineData.mimeType : "image/png"
705
713
  }
706
714
  ];
@@ -730,7 +738,7 @@ function imagenResponseFromGemini(response) {
730
738
  }
731
739
  return [
732
740
  {
733
- data: new Uint8Array(Buffer2.from(imageBytes, "base64")),
741
+ data: decodeBase64Image(imageBytes),
734
742
  mediaType: typeof item.image.mimeType === "string" ? item.image.mimeType : "image/png"
735
743
  }
736
744
  ];
@@ -763,13 +771,22 @@ function gcd(left, right) {
763
771
  }
764
772
  return a;
765
773
  }
774
+ function decodeBase64Image(value) {
775
+ const normalized = value.replace(/\s/g, "").replace(/=+$/, "");
776
+ const bytes = Buffer2.from(value, "base64");
777
+ const roundTrip = bytes.toString("base64").replace(/=+$/, "");
778
+ if (normalized.length === 0 || bytes.length === 0 || roundTrip !== normalized) {
779
+ throw new Error("Gemini image generation response contained invalid base64 image data.");
780
+ }
781
+ return new Uint8Array(bytes);
782
+ }
766
783
  function isPlainObject2(value) {
767
784
  return typeof value === "object" && value !== null && !Array.isArray(value);
768
785
  }
769
786
 
770
787
  // src/gemini/transcription.ts
771
788
  import { Buffer as Buffer3 } from "buffer";
772
- var TRANSCRIPTION_PREAMBLE = "Translate the provided audio exactly. Do not add additional information.";
789
+ var TRANSCRIPTION_PREAMBLE = "Transcribe the provided audio exactly. Do not add additional information.";
773
790
  var GeminiTranscriptionModel = class {
774
791
  constructor(client, defaultModel = "gemini-2.5-flash") {
775
792
  this.client = client;
@@ -907,16 +924,16 @@ async function collectModelsFromResponse(response) {
907
924
  if (Array.isArray(response)) {
908
925
  return response;
909
926
  }
910
- if (isObject(response) && Array.isArray(response.models)) {
927
+ if (isObject2(response) && Array.isArray(response.models)) {
911
928
  return response.models;
912
929
  }
913
- if (isObject(response) && Array.isArray(response.data)) {
930
+ if (isObject2(response) && Array.isArray(response.data)) {
914
931
  return response.data;
915
932
  }
916
933
  return [];
917
934
  }
918
935
  function toListedModel(model) {
919
- if (!isObject(model)) {
936
+ if (!isObject2(model)) {
920
937
  return void 0;
921
938
  }
922
939
  const id = stringValue(model.baseModelId) ?? stringValue(model.base_model_id) ?? normalizeGeminiModelId(stringValue(model.name));
@@ -959,7 +976,7 @@ function toModelListingError(provider, error) {
959
976
  });
960
977
  }
961
978
  function getStatusCode(error) {
962
- if (!isObject(error)) {
979
+ if (!isObject2(error)) {
963
980
  return void 0;
964
981
  }
965
982
  if (typeof error.status === "number") {
@@ -973,11 +990,11 @@ function getStatusCode(error) {
973
990
  function getErrorMessage(error) {
974
991
  return error instanceof Error ? error.message : String(error);
975
992
  }
976
- function isObject(value) {
993
+ function isObject2(value) {
977
994
  return typeof value === "object" && value !== null;
978
995
  }
979
996
  function isAsyncIterable(value) {
980
- return isObject(value) && Symbol.asyncIterator in value;
997
+ return isObject2(value) && Symbol.asyncIterator in value;
981
998
  }
982
999
  export {
983
1000
  GEMINI_2_5_FLASH_IMAGE,
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/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/transcription.ts"],"sourcesContent":["export { GeminiClient, type GeminiClientOptions } from \"./client\";\nexport { GeminiCompletionModel } from \"./completion\";\nexport {\n GeminiEmbeddingModel,\n type GeminiEmbeddingModelOptions,\n type GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n GeminiImageGenerationModel,\n GeminiImagenGenerationModel,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport { GeminiTranscriptionModel } from \"./transcription\";\n","import {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport { GoogleGenAI } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport {\n GEMINI_2_5_FLASH_IMAGE,\n GeminiImageGenerationModel,\n GeminiImagenGenerationModel,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey?: string | undefined;\n vertexai?: false | undefined;\n project?: never;\n location?: never;\n};\n\ntype VertexClientOptions = {\n vertexai: true;\n project?: string | undefined;\n location?: string | undefined;\n apiKey?: never;\n};\n\nexport type GeminiClientOptions = (GeminiApiClientOptions | VertexClientOptions) & {\n client?: GoogleGenAI | undefined;\n};\n\nexport class GeminiClient implements ModelListingClient {\n readonly client: GoogleGenAI;\n\n constructor(options: GeminiClientOptions = {}) {\n this.client = options.client ?? new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(model = \"gemini-2.5-flash\"): GeminiCompletionModel {\n return new GeminiCompletionModel(this.client, model);\n }\n\n embeddingModel(\n model = \"gemini-embedding-001\",\n options: GeminiEmbeddingModelOptions = {},\n ): GeminiEmbeddingModel {\n return new GeminiEmbeddingModel(this.client, model, options);\n }\n\n imageGenerationModel(model = GEMINI_2_5_FLASH_IMAGE): GeminiImageGenerationModel {\n return new GeminiImageGenerationModel(this.client, model);\n }\n\n imagenGenerationModel(model = IMAGEN_4_GENERATE): GeminiImagenGenerationModel {\n return new GeminiImagenGenerationModel(this.client, model);\n }\n\n transcriptionModel(model = \"gemini-2.5-flash\"): GeminiTranscriptionModel {\n return new GeminiTranscriptionModel(this.client, model);\n }\n\n async listModels(): Promise<ModelList> {\n try {\n const response = await this.client.models.list({ config: { pageSize: 1000 } });\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\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): Record<string, unknown> {\n if (options.vertexai === true) {\n return {\n vertexai: true,\n project: requireOption(options.project, \"project\", \"Vertex Gemini\"),\n location: requireOption(options.location, \"location\", \"Vertex Gemini\"),\n };\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\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 return {\n id,\n ...(typeof model.displayName === \"string\" ? { name: model.displayName } : {}),\n ...(typeof model.display_name === \"string\" ? { name: model.display_name } : {}),\n ...(typeof model.description === \"string\" ? { description: model.description } : {}),\n ...(typeof model.type === \"string\" ? { type: model.type } : {}),\n ...(typeof model.inputTokenLimit === \"number\" ? { contextLength: model.inputTokenLimit } : {}),\n ...(typeof model.input_token_limit === \"number\"\n ? { contextLength: model.input_token_limit }\n : {}),\n };\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 === undefined ? {} : { 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 {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport { orderedRequestMessages } from \"../request-messages\";\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 {\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 defaultModel = \"gemini-2.5-flash\",\n ) {}\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\n return providerRequestSummary(params, request, options);\n }\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\n const response = await this.client.models.generateContent(params as never);\n return fromGeminiGenerateContentResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\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;\n }\n }\n }\n}\n\nexport function toGeminiGenerateContentParams(\n defaultModel: string,\n request: CompletionRequest,\n): GeminiGenerateParams {\n const messages = requestMessages(request);\n const config = geminiConfig(request, messages);\n const params: GeminiGenerateParams = {\n model: request.model ?? defaultModel,\n contents: messagesToGeminiContents(messages),\n config,\n };\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n const { config: additionalConfig, ...additionalTopLevel } = request.additionalParams;\n Object.assign(params, additionalTopLevel);\n if (isPlainObject(additionalConfig)) {\n params.config = { ...config, ...additionalConfig };\n }\n }\n\n return params;\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 additionalParamKeys: isPlainObject(request.additionalParams)\n ? Object.keys(request.additionalParams).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 message.content) {\n if (item.type === \"tool_call\") {\n toolNamesById.set(item.id, item.function.name);\n if (item.callId !== undefined) {\n toolNamesById.set(item.callId, item.function.name);\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: message.content.map(userContentToGeminiPart),\n };\n}\n\nfunction toolMessageToGeminiContent(\n message: Extract<MessageType, { role: \"tool\" }>,\n toolNamesById: Map<string, string>,\n): GeminiContent {\n return {\n role: \"user\",\n parts: message.content.map((content) => toolContentToGeminiPart(content, toolNamesById)),\n };\n}\n\nfunction assistantMessageToGeminiContent(\n message: Extract<MessageType, { role: \"assistant\" }>,\n): GeminiContent {\n return {\n role: \"model\",\n parts: 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.function.name,\n args: content.function.arguments ?? {},\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.content !== undefined) {\n return content.content.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\") {\n throw new Error(\"Gemini does not support image content in assistant history yet\");\n }\n return [];\n }),\n };\n}\n\nfunction userContentToGeminiPart(content: UserContent): 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(content: Extract<UserContent, { type: \"image\" }>): GeminiPart {\n if (content.source.type === \"base64\") {\n return {\n inlineData: {\n mimeType: content.source.mediaType,\n data: content.source.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.source.url,\n mimeType: mimeTypeFromImageUrl(content.source.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<UserContent, { type: \"document\" }>,\n): GeminiPart {\n if (content.source.type === \"text\") {\n return { text: content.source.text };\n }\n\n if (content.source.type === \"base64\") {\n return {\n inlineData: {\n mimeType: content.source.mediaType,\n data: content.source.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.source.url,\n mimeType: content.source.mediaType,\n },\n };\n}\n\nfunction toolContentToGeminiPart(\n content: ToolContent,\n toolNamesById: Map<string, string>,\n): GeminiPart {\n const id = content.callId ?? content.id;\n const functionResponse: Record<string, unknown> = {\n name: toolNamesById.get(id) ?? content.id,\n response: toolResultResponse(content.content),\n };\n if (content.callId !== undefined) {\n functionResponse.id = content.callId;\n }\n return { functionResponse };\n}\n\nfunction toolResultResponse(\n content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; data: string; mediaType?: string }\n >,\n): Record<string, unknown> {\n return {\n content: content\n .map((item) =>\n item.type === \"text\" ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\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): CompletionStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionStreamEvent[] = [];\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 }),\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): AssistantContentType[] {\n const parts = candidateParts(response);\n if (parts.length === 0) {\n const text = textFromGeminiResponse(response);\n return text.length > 0 ? [AssistantContent.text(text)] : [];\n }\n\n const choice: AssistantContentType[] = [];\n for (const part of parts) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n choice.push(AssistantContent.reasoningSummary(part.text));\n } else {\n const text = AssistantContent.text(part.text);\n const signature = thoughtSignatureFrom(part);\n if (signature !== undefined) {\n text.signature = signature;\n }\n choice.push(text);\n }\n }\n if (isPlainObject(part.functionCall)) {\n const call = functionCallFromGeminiPart(part.functionCall, part);\n if (call !== undefined) {\n const toolCall = AssistantContent.toolCall(\n call.id ?? crypto.randomUUID(),\n call.name,\n call.args,\n call.id,\n );\n if (call.signature !== undefined) {\n toolCall.signature = call.signature;\n }\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 inputTokens = numberFrom(raw.promptTokenCount);\n const outputTokens = numberFrom(raw.candidatesTokenCount);\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens: numberFrom(raw.totalTokenCount) || inputTokens + outputTokens,\n cachedInputTokens: numberFrom(raw.cachedContentTokenCount),\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 signature?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { 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.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","import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { GoogleGenAI } from \"@google/genai\";\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 dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n taskType?: GeminiEmbeddingTaskType | undefined;\n title?: string | undefined;\n};\n\nexport class GeminiEmbeddingModel implements EmbeddingModel {\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 private readonly model: string,\n options: GeminiEmbeddingModelOptions = {},\n ) {\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[]): 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)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const response = await this.client.models.embedContent({\n model: this.model,\n contents: texts,\n config: this.embeddingConfig(),\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(vectorFromEmbedding);\n }\n if (raw.embedding !== undefined) {\n return [vectorFromEmbedding(raw.embedding)];\n }\n return [];\n}\n\nfunction vectorFromEmbedding(embedding: unknown): number[] {\n const raw = embedding as Record<string, unknown>;\n return Array.isArray(raw.values)\n ? raw.values.filter((value): value is number => typeof value === \"number\")\n : [];\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResponse,\n} from \"@anvia/core/image-generation\";\nimport type { GoogleGenAI } from \"@google/genai\";\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 {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = GEMINI_2_5_FLASH_IMAGE,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n contents: request.prompt,\n config: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: { aspectRatio: aspectRatio(request.width, request.height) },\n },\n };\n\n if (isPlainObject(request.additionalParams)) {\n const { config, ...topLevel } = request.additionalParams;\n Object.assign(params, topLevel);\n if (isPlainObject(config)) {\n params.config = { ...(params.config as Record<string, unknown>), ...config };\n }\n }\n\n const response = await this.client.models.generateContent(params as never);\n return nativeImageResponseFromGemini(response);\n }\n}\n\nexport class GeminiImagenGenerationModel implements ImageGenerationModel {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = IMAGEN_4_GENERATE,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n prompt: request.prompt,\n config: { aspectRatio: aspectRatio(request.width, request.height) },\n };\n\n if (isPlainObject(request.additionalParams)) {\n const { config, ...topLevel } = request.additionalParams;\n Object.assign(params, topLevel);\n if (isPlainObject(config)) {\n params.config = { ...(params.config as Record<string, unknown>), ...config };\n }\n }\n\n const response = await this.client.models.generateImages(params as never);\n return imagenResponseFromGemini(response);\n }\n}\n\nexport function nativeImageResponseFromGemini(response: unknown): ImageGenerationResponse<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: new Uint8Array(Buffer.from(data, \"base64\")),\n mediaType:\n typeof part.inlineData.mimeType === \"string\" ? part.inlineData.mimeType : \"image/png\",\n },\n ];\n });\n });\n\n const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"Gemini image generation response contained no inline image data.\");\n }\n\n return {\n image,\n images,\n mediaType: images[0]?.mediaType,\n rawResponse: response,\n };\n}\n\nexport function imagenResponseFromGemini(response: unknown): ImageGenerationResponse<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: new Uint8Array(Buffer.from(imageBytes, \"base64\")),\n mediaType: typeof item.image.mimeType === \"string\" ? item.image.mimeType : \"image/png\",\n },\n ];\n },\n );\n\n const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"Gemini image generation response contained no base64 images.\");\n }\n\n return {\n image,\n images,\n mediaType: images[0]?.mediaType,\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 isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResponse,\n} from \"@anvia/core/transcription\";\nimport type { GoogleGenAI } from \"@google/genai\";\n\nconst TRANSCRIPTION_PREAMBLE =\n \"Translate the provided audio exactly. Do not add additional information.\";\n\nexport class GeminiTranscriptionModel implements TranscriptionModel {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = \"gemini-2.5-flash\",\n ) {}\n\n async transcription(request: TranscriptionRequest): Promise<TranscriptionResponse<unknown>> {\n const config: Record<string, unknown> = {};\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (isPlainObject(request.additionalParams)) {\n Object.assign(config, request.additionalParams);\n }\n\n const response = await this.client.models.generateContent({\n model: this.defaultModel,\n contents: [\n {\n role: \"user\",\n parts: [\n {\n inlineData: {\n mimeType: mimeTypeFromFilename(request.filename),\n data: Buffer.from(request.data).toString(\"base64\"),\n },\n },\n ],\n },\n ],\n config: {\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":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA,EAGE;AAAA,OACK;AACP,SAAS,mBAAmB;;;ACL5B;AAAA,EACE;AAAA,EAEA;AAAA,EAYA;AAAA,OAEK;;;ACjBP;AAAA,EAGE;AAAA,OACK;AAEA,SAAS,uBAAuB,SAA2C;AAChF,QAAM,WAA0B,CAAC;AACjC,WAAS,KAAK,GAAG,QAAQ,YAAY,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,CAAC;AACnF,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,MAAI,cAAc,QAAW;AAC3B,aAAS,KAAK,SAAS;AAAA,EACzB;AACA,WAAS,KAAK,GAAG,QAAQ,YAAY,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,CAAC;AACnF,SAAO;AACT;;;ADcO,IAAM,wBAAN,MAAgE;AAAA,EAYrE,YACmB,QACR,eAAe,oBACxB;AAFiB;AACR;AAAA,EACR;AAAA,EAFgB;AAAA,EACR;AAAA,EAbF,WAAW;AAAA,EACX,eAA4C;AAAA,IACnD,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EAOA,aACE,SACA,UAA4C,CAAC,GACjC;AACZ,UAAM,SAAS,8BAA8B,KAAK,cAAc,OAAO;AACvE,WAAO,uBAAuB,QAAQ,SAAS,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,WAAW,SAAyD;AACxE,qCAAiC,MAAM,OAAO;AAC9C,UAAM,SAAS,8BAA8B,KAAK,cAAc,OAAO;AACvE,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,gBAAgB,MAAe;AACzE,WAAO,kCAAkC,QAAQ;AAAA,EACnD;AAAA,EAEA,OAAO,iBAAiB,SAAkE;AACxF,qCAAiC,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACnE,UAAM,SAAS,8BAA8B,KAAK,cAAc,OAAO;AACvE,UAAM,SAAS,MAAM,KAAK,OAAO,OAAO,sBAAsB,MAAe;AAC7E,qBAAiB,SAAS,QAA6C;AACrE,iBAAW,SAAS,qCAAqC,KAAK,GAAG;AAC/D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,8BACd,cACA,SACsB;AACtB,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,SAAS,aAAa,SAAS,QAAQ;AAC7C,QAAM,SAA+B;AAAA,IACnC,OAAO,QAAQ,SAAS;AAAA,IACxB,UAAU,yBAAyB,QAAQ;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,QAAQ,qBAAqB,UAAa,cAAc,QAAQ,gBAAgB,GAAG;AACrF,UAAM,EAAE,QAAQ,kBAAkB,GAAG,mBAAmB,IAAI,QAAQ;AACpE,WAAO,OAAO,QAAQ,kBAAkB;AACxC,QAAI,cAAc,gBAAgB,GAAG;AACnC,aAAO,SAAS,EAAE,GAAG,QAAQ,GAAG,iBAAiB;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,QACA,SACA,SACY;AACZ,QAAM,SAAS,cAAc,OAAO,MAAM,IAAI,OAAO,SAAS,CAAC;AAC/D,SAAO,kBAAkB;AAAA,IACvB,UAAU;AAAA,IACV,KAAK,QAAQ,WAAW,OAAO,iCAAiC;AAAA,IAChE,QAAQ,QAAQ,WAAW;AAAA,IAC3B,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,IACzD,eAAe,OAAO,KAAK,MAAM,EAAE,KAAK;AAAA,IACxC,cAAc,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,SAAS,SAAS;AAAA,IACxE,YAAY,OAAO,KAAK,MAAM,EAAE,KAAK;AAAA,IACrC,WAAW,QAAQ,MAAM;AAAA,IACzB,WAAW,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IAChD,sBAAsB,OAAO,sBAAsB;AAAA,IACnD,iBAAiB,QAAQ,iBAAiB;AAAA,IAC1C,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,YAAY,kBAAkB,QAAQ,UAAU;AAAA,IAChD,qBAAqB,cAAc,QAAQ,gBAAgB,IACvD,OAAO,KAAK,QAAQ,gBAAgB,EAAE,KAAK,IAC3C;AAAA,EACN,CAAC;AACH;AAEA,SAAS,kBAAkB,YAA2D;AACpF,MAAI,eAAe,UAAa,OAAO,eAAe,UAAU;AAC9D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,WAAW,MAAM,MAAM,WAAW,KAAK;AACxD;AAEA,SAAS,kBAAkB,QAA6C;AACtE,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,UAAI,UAAU,QAAW;AACvB,eAAO,CAAC;AAAA,MACV;AACA,aAAO,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,SAA2C;AAClE,SAAO,uBAAuB,OAAO;AACvC;AAEA,SAAS,aAAa,SAA4B,UAAuC;AACvF,QAAM,SAAuB,CAAC;AAC9B,QAAM,oBAAoB,sBAAsB,SAAS,QAAQ;AACjE,MAAI,sBAAsB,QAAW;AACnC,WAAO,oBAAoB;AAAA,EAC7B;AACA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO,cAAc,QAAQ;AAAA,EAC/B;AACA,MAAI,QAAQ,cAAc,QAAW;AACnC,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,QAAQ,CAAC,EAAE,sBAAsB,QAAQ,MAAM,IAAI,sBAAsB,EAAE,CAAC;AAAA,EACrF;AACA,MAAI,QAAQ,eAAe,QAAW;AACpC,WAAO,aAAa,mBAAmB,QAAQ,UAAU;AAAA,EAC3D;AACA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,WAAO,mBAAmB;AAC1B,WAAO,qBAAqB,QAAQ;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,sBACP,SACA,UACoB;AACpB,QAAM,iBAAiB,SAAS;AAAA,IAAQ,CAAC,YACvC,QAAQ,SAAS,WAAW,CAAC,QAAQ,OAAO,IAAI,CAAC;AAAA,EACnD;AACA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,mBAAe,QAAQ,QAAQ,YAAY;AAAA,EAC7C;AACA,SAAO,eAAe,WAAW,IAAI,SAAY,eAAe,KAAK,MAAM;AAC7E;AAEO,SAAS,yBAAyB,UAA0C;AACjF,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,QAAM,WAA4B,CAAC;AAEnC,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,UAAU;AAC7B;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,aAAa;AAChC,YAAMA,WAAU,gCAAgC,OAAO;AACvD,iBAAW,QAAQ,QAAQ,SAAS;AAClC,YAAI,KAAK,SAAS,aAAa;AAC7B,wBAAc,IAAI,KAAK,IAAI,KAAK,SAAS,IAAI;AAC7C,cAAI,KAAK,WAAW,QAAW;AAC7B,0BAAc,IAAI,KAAK,QAAQ,KAAK,SAAS,IAAI;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AACA,UAAIA,SAAQ,MAAM,SAAS,GAAG;AAC5B,iBAAS,KAAKA,QAAO;AAAA,MACvB;AACA;AAAA,IACF;AAEA,UAAM,UACJ,QAAQ,SAAS,SACb,2BAA2B,SAAS,aAAa,IACjD,2BAA2B,OAAO;AACxC,QAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,eAAS,KAAK,OAAO;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,SACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,QAAQ,IAAI,uBAAuB;AAAA,EACpD;AACF;AAEA,SAAS,2BACP,SACA,eACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,QAAQ,IAAI,CAAC,YAAY,wBAAwB,SAAS,aAAa,CAAC;AAAA,EACzF;AACF;AAEA,SAAS,gCACP,SACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,QAAQ,QAAQ,CAAC,YAA0B;AACxD,UAAI,QAAQ,SAAS,QAAQ;AAC3B,cAAM,OAAmB,EAAE,MAAM,QAAQ,KAAK;AAC9C,YAAI,QAAQ,cAAc,QAAW;AACnC,eAAK,mBAAmB,QAAQ;AAAA,QAClC;AACA,eAAO,CAAC,IAAI;AAAA,MACd;AACA,UAAI,QAAQ,SAAS,aAAa;AAChC,cAAM,eAAwC;AAAA,UAC5C,MAAM,QAAQ,SAAS;AAAA,UACvB,MAAM,QAAQ,SAAS,aAAa,CAAC;AAAA,QACvC;AACA,YAAI,QAAQ,WAAW,QAAW;AAChC,uBAAa,KAAK,QAAQ;AAAA,QAC5B;AACA,cAAM,OAAmB,EAAE,aAAa;AACxC,YAAI,QAAQ,cAAc,QAAW;AACnC,eAAK,mBAAmB,QAAQ;AAAA,QAClC;AACA,eAAO,CAAC,IAAI;AAAA,MACd;AACA,UAAI,QAAQ,SAAS,eAAe,QAAQ,YAAY,QAAW;AACjE,eAAO,QAAQ,QAAQ,QAAQ,CAAC,cAA4B;AAC1D,cAAI,UAAU,SAAS,UAAU,UAAU,SAAS,WAAW;AAC7D,mBAAO,CAAC;AAAA,UACV;AACA,gBAAM,OAAmB,EAAE,MAAM,UAAU,MAAM,SAAS,KAAK;AAC/D,cAAI,UAAU,SAAS,UAAU,UAAU,cAAc,QAAW;AAClE,iBAAK,mBAAmB,UAAU;AAAA,UACpC;AACA,iBAAO,CAAC,IAAI;AAAA,QACd,CAAC;AAAA,MACH;AACA,UAAI,QAAQ,SAAS,SAAS;AAC5B,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBAAwB,SAAkC;AACjE,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,EAAE,MAAM,QAAQ,KAAK;AAAA,EAC9B;AACA,MAAI,QAAQ,SAAS,SAAS;AAC5B,WAAO,yBAAyB,OAAO;AAAA,EACzC;AACA,SAAO,4BAA4B,OAAO;AAC5C;AAEA,SAAS,yBAAyB,SAA8D;AAC9F,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,WAAO;AAAA,MACL,YAAY;AAAA,QACV,UAAU,QAAQ,OAAO;AAAA,QACzB,MAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS,QAAQ,OAAO;AAAA,MACxB,UAAU,qBAAqB,QAAQ,OAAO,GAAG;AAAA,IACnD;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,KAAqB;AACjD,QAAM,WAAW,gBAAgB,GAAG,EAAE,YAAY;AAClD,MAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AACpE,MAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,MAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,MAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,MAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,4BACP,SACY;AACZ,MAAI,QAAQ,OAAO,SAAS,QAAQ;AAClC,WAAO,EAAE,MAAM,QAAQ,OAAO,KAAK;AAAA,EACrC;AAEA,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,WAAO;AAAA,MACL,YAAY;AAAA,QACV,UAAU,QAAQ,OAAO;AAAA,QACzB,MAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS,QAAQ,OAAO;AAAA,MACxB,UAAU,QAAQ,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,wBACP,SACA,eACY;AACZ,QAAM,KAAK,QAAQ,UAAU,QAAQ;AACrC,QAAM,mBAA4C;AAAA,IAChD,MAAM,cAAc,IAAI,EAAE,KAAK,QAAQ;AAAA,IACvC,UAAU,mBAAmB,QAAQ,OAAO;AAAA,EAC9C;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,qBAAiB,KAAK,QAAQ;AAAA,EAChC;AACA,SAAO,EAAE,iBAAiB;AAC5B;AAEA,SAAS,mBACP,SAGyB;AACzB,SAAO;AAAA,IACL,SAAS,QACN;AAAA,MAAI,CAAC,SACJ,KAAK,SAAS,SAAS,KAAK,OAAO,UAAU,KAAK,aAAa,WAAW;AAAA,IAC5E,EACC,KAAK,IAAI;AAAA,EACd;AACF;AAEA,SAAS,uBAAuB,MAAkC;AAChE,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,sBAAsB,KAAK;AAAA,EAC7B;AACF;AAEA,SAAS,mBAAmB,YAAoC;AAC9D,MAAI,eAAe,QAAQ;AACzB,WAAO,EAAE,uBAAuB,EAAE,MAAM,OAAO,EAAE;AAAA,EACnD;AACA,MAAI,eAAe,YAAY;AAC7B,WAAO,EAAE,uBAAuB,EAAE,MAAM,MAAM,EAAE;AAAA,EAClD;AACA,MAAI,eAAe,QAAQ;AACzB,WAAO,EAAE,uBAAuB,EAAE,MAAM,OAAO,EAAE;AAAA,EACnD;AACA,SAAO;AAAA,IACL,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,sBAAsB,CAAC,WAAW,IAAI;AAAA,IACxC;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC,UAAuC;AACvF,QAAM,MAAM;AACZ,QAAM,SAAS,mCAAmC,GAAG;AAErD,QAAM,SAA6B;AAAA,IACjC;AAAA,IACA,OAAO,gBAAgB,IAAI,aAAa;AAAA,IACxC,aAAa;AAAA,EACf;AACA,QAAM,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW,IAAI,EAAE;AAC1D,MAAI,OAAO,QAAW;AACpB,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,qCAAqC,OAAyC;AAC5F,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAkC,CAAC;AACzC,QAAM,aAAa,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AACjE,MAAI,WAAW,SAAS,KAAK,eAAe,KAAK,EAAE,WAAW,GAAG;AAC/D,WAAO,KAAK,EAAE,MAAM,cAAc,OAAO,WAAW,CAAC;AAAA,EACvD;AACA,aAAW,QAAQ,eAAe,KAAK,GAAG;AACxC,QAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,GAAG;AACzD,UAAI,KAAK,YAAY,MAAM;AACzB,eAAO,KAAK,EAAE,MAAM,mBAAmB,OAAO,KAAK,MAAM,aAAa,UAAU,CAAC;AAAA,MACnF,OAAO;AACL,eAAO,KAAK,EAAE,MAAM,cAAc,OAAO,KAAK,KAAK,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACA,aAAW,QAAQ,gCAAgC,KAAK,GAAG;AACzD,WAAO;AAAA,MACL,cAAc,KAAK,MAAM,KAAK,MAAM;AAAA,QAClC,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,cAAc,KAAK,MAAM,KAAK,MAAM;AAAA,QAClC,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,KAAK,WAAW,MAAM,UAAU,KAAK,WAAW,MAAM,EAAE;AAC9D,MAAI,OAAO,QAAW;AACpB,WAAO,KAAK,EAAE,MAAM,cAAc,GAAG,CAAC;AAAA,EACxC;AACA,MAAI,cAAc,MAAM,aAAa,GAAG;AACtC,WAAO,KAAK,EAAE,MAAM,SAAS,UAAU,kCAAkC,KAAK,EAAE,CAAC;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,mCACP,UACwB;AACxB,QAAM,QAAQ,eAAe,QAAQ;AACrC,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,OAAO,uBAAuB,QAAQ;AAC5C,WAAO,KAAK,SAAS,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,IAAI,CAAC;AAAA,EAC5D;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,GAAG;AACzD,UAAI,KAAK,YAAY,MAAM;AACzB,eAAO,KAAK,iBAAiB,iBAAiB,KAAK,IAAI,CAAC;AAAA,MAC1D,OAAO;AACL,cAAM,OAAO,iBAAiB,KAAK,KAAK,IAAI;AAC5C,cAAM,YAAY,qBAAqB,IAAI;AAC3C,YAAI,cAAc,QAAW;AAC3B,eAAK,YAAY;AAAA,QACnB;AACA,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AACA,QAAI,cAAc,KAAK,YAAY,GAAG;AACpC,YAAM,OAAO,2BAA2B,KAAK,cAAc,IAAI;AAC/D,UAAI,SAAS,QAAW;AACtB,cAAM,WAAW,iBAAiB;AAAA,UAChC,KAAK,MAAM,OAAO,WAAW;AAAA,UAC7B,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,YAAI,KAAK,cAAc,QAAW;AAChC,mBAAS,YAAY,KAAK;AAAA,QAC5B;AACA,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA2C;AACzE,MAAI,OAAO,SAAS,SAAS,UAAU;AACrC,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,eAAe,QAAQ,EAC3B,QAAQ,CAAC,SAAU,KAAK,YAAY,QAAQ,OAAO,KAAK,SAAS,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE,EAC7F,KAAK,EAAE;AACZ;AAEA,SAAS,gCACP,UACuF;AACvF,QAAM,cAAc,MAAM,QAAQ,SAAS,aAAa,IACpD,SAAS,gBACT,MAAM,QAAQ,SAAS,cAAc,IACnC,SAAS,iBACT,CAAC;AACP,QAAM,YAAY,eAAe,QAAQ,EAAE,QAAQ,CAAC,SAAS;AAC3D,QAAI,CAAC,cAAc,KAAK,YAAY,GAAG;AACrC,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO,2BAA2B,KAAK,cAAc,IAAI;AAC/D,WAAO,SAAS,SAAY,CAAC,IAAI,CAAC,IAAI;AAAA,EACxC,CAAC;AAED,QAAM,wBAAwB,YAAY,QAAQ,CAAC,SAAS;AAC1D,QAAI,CAAC,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,UAAU;AACzD,aAAO,CAAC;AAAA,IACV;AACA,UAAM,aAAiF;AAAA,MACrF,MAAM,KAAK;AAAA,MACX,MAAM,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,IACnC;AACA,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,UAAM,YAAY,qBAAqB,IAAI;AAC3C,QAAI,OAAO,QAAW;AACpB,iBAAW,KAAK;AAAA,IAClB;AACA,QAAI,cAAc,QAAW;AAC3B,iBAAW,YAAY;AAAA,IACzB;AACA,WAAO,CAAC,UAAU;AAAA,EACpB,CAAC;AAED,SAAO,CAAC,GAAG,uBAAuB,GAAG,SAAS;AAChD;AAEA,SAAS,2BACP,MACA,MAC4F;AAC5F,MAAI,OAAO,KAAK,SAAS,UAAU;AACjC,WAAO;AAAA,EACT;AACA,QAAM,aAAiF;AAAA,IACrF,MAAM,KAAK;AAAA,IACX,MAAM,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,EACnC;AACA,QAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAM,YAAY,qBAAqB,IAAI,KAAK,qBAAqB,IAAI;AACzE,MAAI,OAAO,QAAW;AACpB,eAAW,KAAK;AAAA,EAClB;AACA,MAAI,cAAc,QAAW;AAC3B,eAAW,YAAY;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAmE;AACzF,QAAM,aAAa,MAAM,QAAQ,SAAS,UAAU,IAAI,SAAS,aAAa,CAAC;AAC/E,SAAO,WAAW,QAAQ,CAAC,cAAc;AACvC,QAAI,CAAC,cAAc,SAAS,KAAK,CAAC,cAAc,UAAU,OAAO,GAAG;AAClE,aAAO,CAAC;AAAA,IACV;AACA,WAAO,MAAM,QAAQ,UAAU,QAAQ,KAAK,IACxC,UAAU,QAAQ,MAAM,OAAO,aAAa,IAC5C,CAAC;AAAA,EACP,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,MAAM,cAAc,KAAK,IAAI,QAAQ,CAAC;AAC5C,QAAM,cAAc,WAAW,IAAI,gBAAgB;AACnD,QAAM,eAAe,WAAW,IAAI,oBAAoB;AACxD,SAAO;AAAA,IACL,GAAG,MAAM,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA,aAAa,WAAW,IAAI,eAAe,KAAK,cAAc;AAAA,IAC9D,mBAAmB,WAAW,IAAI,uBAAuB;AAAA,EAC3D;AACF;AAEA,SAAS,YAAY,OAA2B;AAC9C,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,MAAM,QAAQ,KAAK,KACnB,cAAc,KAAK,GACnB;AACA,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,OAAwB;AAC1C,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,qBAAqB,OAAoD;AAChF,SAAO,WAAW,MAAM,gBAAgB,KAAK,WAAW,MAAM,iBAAiB;AACjF;AAEA,SAAS,cACP,IACA,QAMuB;AACvB,QAAM,QAA+B,EAAE,MAAM,mBAAmB,GAAG;AACnE,MAAI,OAAO,WAAW,OAAW,OAAM,SAAS,OAAO;AACvD,MAAI,OAAO,SAAS,OAAW,OAAM,OAAO,OAAO;AACnD,MAAI,OAAO,mBAAmB,OAAW,OAAM,iBAAiB,OAAO;AACvE,MAAI,OAAO,cAAc,OAAW,OAAM,YAAY,OAAO;AAC7D,SAAO;AACT;;;AEznBO,IAAM,uBAAN,MAAqD;AAAA,EAM1D,YACmB,QACA,OACjB,UAAuC,CAAC,GACxC;AAHiB;AACA;AAGjB,SAAK,aAAa,QAAQ;AAC1B,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,WAAW,QAAQ;AACxB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EARmB;AAAA,EACA;AAAA,EAPV;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EAajB,MAAM,WAAW,OAAuC;AACtD,UAAM,aAA0B,CAAC;AACjC,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,KAAK,cAAc;AACpE,YAAM,QAAQ,MAAM,MAAM,OAAO,QAAQ,KAAK,YAAY;AAC1D,iBAAW,KAAK,GAAI,MAAM,KAAK,WAAW,KAAK,CAAE;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,OAAuC;AAC9D,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,aAAa;AAAA,MACrD,OAAO,KAAK;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ,KAAK,gBAAgB;AAAA,IAC/B,CAAU;AACV,UAAM,gBAAgB,uBAAuB,QAAQ;AACrD,QAAI,cAAc,WAAW,MAAM,QAAQ;AACzC,YAAM,IAAI;AAAA,QACR,6BAA6B,cAAc,MAAM,+BAA+B,MAAM,MAAM;AAAA,MAC9F;AAAA,IACF;AAEA,WAAO,cAAc,IAAI,CAAC,QAAQ,WAAW;AAAA,MAC3C,UAAU,MAAM,KAAK;AAAA,MACrB;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEQ,kBAA2C;AACjD,UAAM,SAAkC,CAAC;AACzC,QAAI,KAAK,eAAe,OAAW,QAAO,uBAAuB,KAAK;AACtE,QAAI,KAAK,aAAa,OAAW,QAAO,WAAW,KAAK;AACxD,QAAI,KAAK,UAAU,OAAW,QAAO,QAAQ,KAAK;AAClD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,UAA+B;AAC7D,QAAM,MAAM;AACZ,MAAI,MAAM,QAAQ,IAAI,UAAU,GAAG;AACjC,WAAO,IAAI,WAAW,IAAI,mBAAmB;AAAA,EAC/C;AACA,MAAI,IAAI,cAAc,QAAW;AAC/B,WAAO,CAAC,oBAAoB,IAAI,SAAS,CAAC;AAAA,EAC5C;AACA,SAAO,CAAC;AACV;AAEA,SAAS,oBAAoB,WAA8B;AACzD,QAAM,MAAM;AACZ,SAAO,MAAM,QAAQ,IAAI,MAAM,IAC3B,IAAI,OAAO,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACvE,CAAC;AACP;;;AC/FA,SAAS,UAAAC,eAAc;AAShB,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AACnC,IAAM,oBAAoB;AAE1B,IAAM,6BAAN,MAAiE;AAAA,EAGtE,YACmB,QACR,eAAe,wBACxB;AAFiB;AACR;AAAA,EACR;AAAA,EAFgB;AAAA,EACR;AAAA,EAJF,WAAW;AAAA,EAOpB,MAAM,gBACJ,SAC2C;AAC3C,UAAM,SAAkC;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,UAAU,QAAQ;AAAA,MAClB,QAAQ;AAAA,QACN,oBAAoB,CAAC,QAAQ,OAAO;AAAA,QACpC,aAAa,EAAE,aAAa,YAAY,QAAQ,OAAO,QAAQ,MAAM,EAAE;AAAA,MACzE;AAAA,IACF;AAEA,QAAIC,eAAc,QAAQ,gBAAgB,GAAG;AAC3C,YAAM,EAAE,QAAQ,GAAG,SAAS,IAAI,QAAQ;AACxC,aAAO,OAAO,QAAQ,QAAQ;AAC9B,UAAIA,eAAc,MAAM,GAAG;AACzB,eAAO,SAAS,EAAE,GAAI,OAAO,QAAoC,GAAG,OAAO;AAAA,MAC7E;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,gBAAgB,MAAe;AACzE,WAAO,8BAA8B,QAAQ;AAAA,EAC/C;AACF;AAEO,IAAM,8BAAN,MAAkE;AAAA,EAGvE,YACmB,QACR,eAAe,mBACxB;AAFiB;AACR;AAAA,EACR;AAAA,EAFgB;AAAA,EACR;AAAA,EAJF,WAAW;AAAA,EAOpB,MAAM,gBACJ,SAC2C;AAC3C,UAAM,SAAkC;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,QAAQ,EAAE,aAAa,YAAY,QAAQ,OAAO,QAAQ,MAAM,EAAE;AAAA,IACpE;AAEA,QAAIA,eAAc,QAAQ,gBAAgB,GAAG;AAC3C,YAAM,EAAE,QAAQ,GAAG,SAAS,IAAI,QAAQ;AACxC,aAAO,OAAO,QAAQ,QAAQ;AAC9B,UAAIA,eAAc,MAAM,GAAG;AACzB,eAAO,SAAS,EAAE,GAAI,OAAO,QAAoC,GAAG,OAAO;AAAA,MAC7E;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,eAAe,MAAe;AACxE,WAAO,yBAAyB,QAAQ;AAAA,EAC1C;AACF;AAEO,SAAS,8BAA8B,UAAqD;AACjG,QAAM,MAAM;AACZ,QAAM,aAAa,MAAM,QAAQ,IAAI,UAAU,IAAI,IAAI,aAAa,CAAC;AACrE,QAAM,SAAS,WAAW,QAAQ,CAAC,cAAgC;AACjE,QAAI,CAACA,eAAc,SAAS,KAAK,CAACA,eAAc,UAAU,OAAO,GAAG;AAClE,aAAO,CAAC;AAAA,IACV;AACA,UAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,QAAQ,CAAC;AAClF,WAAO,MAAM,QAAQ,CAAC,SAA2B;AAC/C,UAAI,CAACA,eAAc,IAAI,KAAK,CAACA,eAAc,KAAK,UAAU,GAAG;AAC3D,eAAO,CAAC;AAAA,MACV;AACA,YAAM,OAAO,KAAK,WAAW;AAC7B,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO,CAAC;AAAA,MACV;AACA,aAAO;AAAA,QACL;AAAA,UACE,MAAM,IAAI,WAAWD,QAAO,KAAK,MAAM,QAAQ,CAAC;AAAA,UAChD,WACE,OAAO,KAAK,WAAW,aAAa,WAAW,KAAK,WAAW,WAAW;AAAA,QAC9E;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,QAAQ,OAAO,CAAC,GAAG;AACzB,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,OAAO,CAAC,GAAG;AAAA,IACtB,aAAa;AAAA,EACf;AACF;AAEO,SAAS,yBAAyB,UAAqD;AAC5F,QAAM,MAAM;AACZ,QAAM,UAAU,MAAM,QAAQ,IAAI,eAAe,IAAI,IAAI,kBAAkB,CAAC,GAAG;AAAA,IAC7E,CAAC,SAA2B;AAC1B,UAAI,CAACC,eAAc,IAAI,KAAK,CAACA,eAAc,KAAK,KAAK,GAAG;AACtD,eAAO,CAAC;AAAA,MACV;AACA,YAAM,aAAa,KAAK,MAAM;AAC9B,UAAI,OAAO,eAAe,UAAU;AAClC,eAAO,CAAC;AAAA,MACV;AACA,aAAO;AAAA,QACL;AAAA,UACE,MAAM,IAAI,WAAWD,QAAO,KAAK,YAAY,QAAQ,CAAC;AAAA,UACtD,WAAW,OAAO,KAAK,MAAM,aAAa,WAAW,KAAK,MAAM,WAAW;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,CAAC,GAAG;AACzB,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,OAAO,CAAC,GAAG;AAAA,IACtB,aAAa;AAAA,EACf;AACF;AAEO,SAAS,YAAY,OAAe,QAAwB;AACjE,QAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACrD,QAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACvD,QAAM,UAAU,IAAI,iBAAiB,gBAAgB;AACrD,SAAO,GAAG,kBAAkB,OAAO,IAAI,mBAAmB,OAAO;AACnE;AAEA,SAAS,IAAI,MAAc,OAAuB;AAChD,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,MAAM,GAAG;AACd,UAAM,OAAO,IAAI;AACjB,QAAI;AACJ,QAAI;AAAA,EACN;AACA,SAAO;AACT;AAEA,SAASC,eAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACxKA,SAAS,UAAAC,eAAc;AAQvB,IAAM,yBACJ;AAEK,IAAM,2BAAN,MAA6D;AAAA,EAGlE,YACmB,QACR,eAAe,oBACxB;AAFiB;AACR;AAAA,EACR;AAAA,EAFgB;AAAA,EACR;AAAA,EAJF,WAAW;AAAA,EAOpB,MAAM,cAAc,SAAwE;AAC1F,UAAM,SAAkC,CAAC;AACzC,QAAI,QAAQ,gBAAgB,QAAW;AACrC,aAAO,cAAc,QAAQ;AAAA,IAC/B;AACA,QAAIC,eAAc,QAAQ,gBAAgB,GAAG;AAC3C,aAAO,OAAO,QAAQ,QAAQ,gBAAgB;AAAA,IAChD;AAEA,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,gBAAgB;AAAA,MACxD,OAAO,KAAK;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,cACE,YAAY;AAAA,gBACV,UAAU,qBAAqB,QAAQ,QAAQ;AAAA,gBAC/C,MAAMD,QAAO,KAAK,QAAQ,IAAI,EAAE,SAAS,QAAQ;AAAA,cACnD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,mBACE,QAAQ,WAAW,SACf,yBACA,GAAG,sBAAsB;AAAA;AAAA,EAAO,QAAQ,MAAM;AAAA,MACtD;AAAA,IACF,CAAU;AAEV,WAAO;AAAA,MACL,MAAM,gCAAgC,QAAQ;AAAA,MAC9C,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,gCAAgC,UAA2B;AACzE,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,SAAS,UAAU;AAChC,WAAO,IAAI;AAAA,EACb;AACA,QAAM,aAAa,MAAM,QAAQ,IAAI,UAAU,IAAI,IAAI,aAAa,CAAC;AACrE,aAAW,aAAa,YAAY;AAClC,QAAI,CAACC,eAAc,SAAS,KAAK,CAACA,eAAc,UAAU,OAAO,GAAG;AAClE;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,QAAQ,CAAC;AAClF,eAAW,QAAQ,OAAO;AACxB,UAAIA,eAAc,IAAI,KAAK,OAAO,KAAK,SAAS,UAAU;AACxD,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI,MAAM,kDAAkD;AACpE;AAEA,SAAS,qBAAqB,UAA0B;AACtD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AACpC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AACpC,SAAO;AACT;AAEA,SAASA,eAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AL1DO,IAAM,eAAN,MAAiD;AAAA,EAC7C;AAAA,EAET,YAAY,UAA+B,CAAC,GAAG;AAC7C,SAAK,SAAS,QAAQ,UAAU,IAAI,YAAY,qBAAqB,OAAO,CAAC;AAAA,EAC/E;AAAA,EAEA,gBAAgB,QAAQ,oBAA2C;AACjE,WAAO,IAAI,sBAAsB,KAAK,QAAQ,KAAK;AAAA,EACrD;AAAA,EAEA,eACE,QAAQ,wBACR,UAAuC,CAAC,GAClB;AACtB,WAAO,IAAI,qBAAqB,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC7D;AAAA,EAEA,qBAAqB,QAAQ,wBAAoD;AAC/E,WAAO,IAAI,2BAA2B,KAAK,QAAQ,KAAK;AAAA,EAC1D;AAAA,EAEA,sBAAsB,QAAQ,mBAAgD;AAC5E,WAAO,IAAI,4BAA4B,KAAK,QAAQ,KAAK;AAAA,EAC3D;AAAA,EAEA,mBAAmB,QAAQ,oBAA8C;AACvE,WAAO,IAAI,yBAAyB,KAAK,QAAQ,KAAK;AAAA,EACxD;AAAA,EAEA,MAAM,aAAiC;AACrC,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,IAAK,EAAE,CAAC;AAC7E,YAAM,QAAQ,MAAM,0BAA0B,QAAQ,GACnD,IAAI,aAAa,EACjB,OAAO,aAAa;AACvB,aAAO,EAAE,KAAK;AAAA,IAChB,SAAS,OAAO;AACd,YAAM,oBAAoB,UAAU,KAAK;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,SAAuD;AAC1F,MAAI,QAAQ,aAAa,MAAM;AAC7B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,cAAc,QAAQ,SAAS,WAAW,eAAe;AAAA,MAClE,UAAU,cAAc,QAAQ,UAAU,YAAY,eAAe;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,cAAc,QAAQ,QAAQ,UAAU,QAAQ;AAAA,EAC1D;AACF;AAEA,SAAS,cAAc,OAA2B,MAAc,OAAuB;AACrF,MAAI,UAAU,UAAa,MAAM,WAAW,GAAG;AAC7C,UAAM,IAAI,MAAM,WAAW,KAAK,IAAI,IAAI,UAAU,IAAI,kCAAkC;AAAA,EAC1F;AAEA,SAAO;AACT;AAEA,eAAe,0BAA0B,UAAuC;AAC9E,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,UAAM,SAAoB,CAAC;AAC3B,qBAAiB,SAAS,UAAU;AAClC,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,KAAK,MAAM,QAAQ,SAAS,MAAM,GAAG;AACxD,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,SAAS,QAAQ,KAAK,MAAM,QAAQ,SAAS,IAAI,GAAG;AACtD,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,cAAc,OAAuD;AAC5E,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,KACJ,YAAY,MAAM,WAAW,KAC7B,YAAY,MAAM,aAAa,KAC/B,uBAAuB,YAAY,MAAM,IAAI,CAAC;AAEhD,MAAI,OAAO,QAAW;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,GAAI,OAAO,MAAM,gBAAgB,WAAW,EAAE,MAAM,MAAM,YAAY,IAAI,CAAC;AAAA,IAC3E,GAAI,OAAO,MAAM,iBAAiB,WAAW,EAAE,MAAM,MAAM,aAAa,IAAI,CAAC;AAAA,IAC7E,GAAI,OAAO,MAAM,gBAAgB,WAAW,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IAClF,GAAI,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IAC7D,GAAI,OAAO,MAAM,oBAAoB,WAAW,EAAE,eAAe,MAAM,gBAAgB,IAAI,CAAC;AAAA,IAC5F,GAAI,OAAO,MAAM,sBAAsB,WACnC,EAAE,eAAe,MAAM,kBAAkB,IACzC,CAAC;AAAA,EACP;AACF;AAEA,SAAS,uBAAuB,MAA8C;AAC5E,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,aAAa,EAAE;AACpD,SAAO,YAAY,UAAa,QAAQ,WAAW,IAAI,SAAY;AACrE;AAEA,SAAS,YAAY,OAAoC;AACvD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,WAAW,IAAI,SAAY;AAC5C;AAEA,SAAS,cACP,OACoC;AACpC,SAAO,UAAU;AACnB;AAEA,SAAS,oBAAoB,UAAkB,OAAmC;AAChF,MAAI,iBAAiB,mBAAmB;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,cAAc,KAAK;AACtC,SAAO,IAAI,kBAAkB,GAAG,QAAQ,0BAA0B,gBAAgB,KAAK,CAAC,IAAI;AAAA,IAC1F;AAAA,IACA,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,IACjD,OAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,WAAW,UAAU;AACpC,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,OAAO,MAAM,eAAe,UAAU;AACxC,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,gBAAgB,OAAiD;AACxE,SAAO,SAAS,KAAK,KAAK,OAAO,iBAAiB;AACpD;","names":["content","Buffer","isPlainObject","Buffer","isPlainObject"]}
1
+ {"version":3,"sources":["../src/gemini/index.ts","../src/gemini/client.ts","../src/gemini/completion.ts","../src/request-messages.ts","../src/gemini/embedding.ts","../src/gemini/image-generation.ts","../src/gemini/transcription.ts"],"sourcesContent":["export { GeminiClient, type GeminiClientOptions } from \"./client\";\nexport { GeminiCompletionModel } from \"./completion\";\nexport {\n GeminiEmbeddingModel,\n type GeminiEmbeddingModelOptions,\n type GeminiEmbeddingTaskType,\n} from \"./embedding\";\nexport {\n GEMINI_2_5_FLASH_IMAGE,\n GEMINI_3_PRO_IMAGE_PREVIEW,\n GeminiImageGenerationModel,\n GeminiImagenGenerationModel,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nexport { GeminiTranscriptionModel } from \"./transcription\";\n","import {\n type ModelList,\n type ModelListingClient,\n ModelListingError,\n} from \"@anvia/core/model-listing\";\nimport { GoogleGenAI } from \"@google/genai\";\nimport { GeminiCompletionModel } from \"./completion\";\nimport { GeminiEmbeddingModel, type GeminiEmbeddingModelOptions } from \"./embedding\";\nimport {\n GEMINI_2_5_FLASH_IMAGE,\n GeminiImageGenerationModel,\n GeminiImagenGenerationModel,\n IMAGEN_4_GENERATE,\n} from \"./image-generation\";\nimport { GeminiTranscriptionModel } from \"./transcription\";\n\ntype GeminiApiClientOptions = {\n apiKey?: string | undefined;\n vertexai?: false | undefined;\n project?: never;\n location?: never;\n};\n\ntype VertexClientOptions = {\n vertexai: true;\n project?: string | undefined;\n location?: string | undefined;\n apiKey?: never;\n};\n\nexport type GeminiClientOptions = (GeminiApiClientOptions | VertexClientOptions) & {\n client?: GoogleGenAI | undefined;\n};\n\nexport class GeminiClient implements ModelListingClient {\n readonly client: GoogleGenAI;\n\n constructor(options: GeminiClientOptions = {}) {\n this.client = options.client ?? new GoogleGenAI(toGoogleGenAIOptions(options));\n }\n\n completionModel(model = \"gemini-2.5-flash\"): GeminiCompletionModel {\n return new GeminiCompletionModel(this.client, model);\n }\n\n embeddingModel(\n model = \"gemini-embedding-001\",\n options: GeminiEmbeddingModelOptions = {},\n ): GeminiEmbeddingModel {\n return new GeminiEmbeddingModel(this.client, model, options);\n }\n\n imageGenerationModel(model = GEMINI_2_5_FLASH_IMAGE): GeminiImageGenerationModel {\n return new GeminiImageGenerationModel(this.client, model);\n }\n\n imagenGenerationModel(model = IMAGEN_4_GENERATE): GeminiImagenGenerationModel {\n return new GeminiImagenGenerationModel(this.client, model);\n }\n\n transcriptionModel(model = \"gemini-2.5-flash\"): GeminiTranscriptionModel {\n return new GeminiTranscriptionModel(this.client, model);\n }\n\n async listModels(): Promise<ModelList> {\n try {\n const response = await this.client.models.list({ config: { pageSize: 1000 } });\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\nexport function toGoogleGenAIOptions(options: GeminiClientOptions): Record<string, unknown> {\n if (options.vertexai === true) {\n return {\n vertexai: true,\n project: requireOption(options.project, \"project\", \"Vertex Gemini\"),\n location: requireOption(options.location, \"location\", \"Vertex Gemini\"),\n };\n }\n\n return {\n apiKey: requireOption(options.apiKey, \"apiKey\", \"Gemini\"),\n };\n}\n\nfunction requireOption(value: string | undefined, name: string, label: string): string {\n if (value === undefined || value.length === 0) {\n throw new Error(`Missing ${label} ${name}. Pass ${name} when constructing GeminiClient.`);\n }\n\n return value;\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 return {\n id,\n ...(typeof model.displayName === \"string\" ? { name: model.displayName } : {}),\n ...(typeof model.display_name === \"string\" ? { name: model.display_name } : {}),\n ...(typeof model.description === \"string\" ? { description: model.description } : {}),\n ...(typeof model.type === \"string\" ? { type: model.type } : {}),\n ...(typeof model.inputTokenLimit === \"number\" ? { contextLength: model.inputTokenLimit } : {}),\n ...(typeof model.input_token_limit === \"number\"\n ? { contextLength: model.input_token_limit }\n : {}),\n };\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 === undefined ? {} : { 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 {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { GoogleGenAI } from \"@google/genai\";\nimport { orderedRequestMessages } from \"../request-messages\";\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 {\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 defaultModel = \"gemini-2.5-flash\",\n ) {}\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\n return providerRequestSummary(params, request, options);\n }\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\n const response = await this.client.models.generateContent(params as never);\n return fromGeminiGenerateContentResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toGeminiGenerateContentParams(this.defaultModel, request);\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;\n }\n }\n }\n}\n\nexport function toGeminiGenerateContentParams(\n defaultModel: string,\n request: CompletionRequest,\n): GeminiGenerateParams {\n const messages = requestMessages(request);\n const config = geminiConfig(request, messages);\n const params: GeminiGenerateParams = {\n model: request.model ?? defaultModel,\n contents: messagesToGeminiContents(messages),\n config,\n };\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n const { config: additionalConfig, ...additionalTopLevel } = request.additionalParams;\n Object.assign(params, additionalTopLevel);\n if (isPlainObject(additionalConfig)) {\n params.config = { ...config, ...additionalConfig };\n }\n }\n\n return params;\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 additionalParamKeys: isPlainObject(request.additionalParams)\n ? Object.keys(request.additionalParams).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 message.content) {\n if (item.type === \"tool_call\") {\n toolNamesById.set(item.id, item.function.name);\n if (item.callId !== undefined) {\n toolNamesById.set(item.callId, item.function.name);\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: message.content.map(userContentToGeminiPart),\n };\n}\n\nfunction toolMessageToGeminiContent(\n message: Extract<MessageType, { role: \"tool\" }>,\n toolNamesById: Map<string, string>,\n): GeminiContent {\n return {\n role: \"user\",\n parts: message.content.map((content) => toolContentToGeminiPart(content, toolNamesById)),\n };\n}\n\nfunction assistantMessageToGeminiContent(\n message: Extract<MessageType, { role: \"assistant\" }>,\n): GeminiContent {\n return {\n role: \"model\",\n parts: 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.function.name,\n args: content.function.arguments ?? {},\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.content !== undefined) {\n return content.content.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\") {\n throw new Error(\"Gemini does not support image content in assistant history yet\");\n }\n return [];\n }),\n };\n}\n\nfunction userContentToGeminiPart(content: UserContent): 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(content: Extract<UserContent, { type: \"image\" }>): GeminiPart {\n if (content.source.type === \"base64\") {\n return {\n inlineData: {\n mimeType: content.source.mediaType,\n data: content.source.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.source.url,\n mimeType: mimeTypeFromImageUrl(content.source.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<UserContent, { type: \"document\" }>,\n): GeminiPart {\n if (content.source.type === \"text\") {\n return { text: content.source.text };\n }\n\n if (content.source.type === \"base64\") {\n return {\n inlineData: {\n mimeType: content.source.mediaType,\n data: content.source.data,\n },\n };\n }\n\n return {\n fileData: {\n fileUri: content.source.url,\n mimeType: content.source.mediaType,\n },\n };\n}\n\nfunction toolContentToGeminiPart(\n content: ToolContent,\n toolNamesById: Map<string, string>,\n): GeminiPart {\n const id = content.callId ?? content.id;\n const functionResponse: Record<string, unknown> = {\n name: toolNamesById.get(id) ?? content.id,\n response: toolResultResponse(content.content),\n };\n if (content.callId !== undefined) {\n functionResponse.id = content.callId;\n }\n return { functionResponse };\n}\n\nfunction toolResultResponse(\n content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; data: string; mediaType?: string }\n >,\n): Record<string, unknown> {\n return {\n content: content\n .map((item) =>\n item.type === \"text\" ? item.text : `[image:${item.mediaType ?? \"image/png\"}]`,\n )\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): CompletionStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionStreamEvent[] = [];\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 }),\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): AssistantContentType[] {\n const parts = candidateParts(response);\n if (parts.length === 0) {\n const text = textFromGeminiResponse(response);\n return text.length > 0 ? [AssistantContent.text(text)] : [];\n }\n\n const choice: AssistantContentType[] = [];\n for (const part of parts) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought === true) {\n choice.push(AssistantContent.reasoningSummary(part.text));\n } else {\n const text = AssistantContent.text(part.text);\n const signature = thoughtSignatureFrom(part);\n if (signature !== undefined) {\n text.signature = signature;\n }\n choice.push(text);\n }\n }\n if (isPlainObject(part.functionCall)) {\n const call = functionCallFromGeminiPart(part.functionCall, part);\n if (call !== undefined) {\n const toolCall = AssistantContent.toolCall(\n call.id ?? crypto.randomUUID(),\n call.name,\n call.args,\n call.id,\n );\n if (call.signature !== undefined) {\n toolCall.signature = call.signature;\n }\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 inputTokens = numberFrom(raw.promptTokenCount);\n const outputTokens = numberFrom(raw.candidatesTokenCount);\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens: numberFrom(raw.totalTokenCount) || inputTokens + outputTokens,\n cachedInputTokens: numberFrom(raw.cachedContentTokenCount),\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 signature?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { 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.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","import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { GoogleGenAI } from \"@google/genai\";\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 dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n taskType?: GeminiEmbeddingTaskType | undefined;\n title?: string | undefined;\n};\n\nexport class GeminiEmbeddingModel implements EmbeddingModel {\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 private readonly model: string,\n options: GeminiEmbeddingModelOptions = {},\n ) {\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[]): 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)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const response = await this.client.models.embedContent({\n model: this.model,\n contents: texts,\n config: this.embeddingConfig(),\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 ImageGenerationResponse,\n} from \"@anvia/core/image-generation\";\nimport type { GoogleGenAI } from \"@google/genai\";\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 {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = GEMINI_2_5_FLASH_IMAGE,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n contents: request.prompt,\n config: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n imageConfig: { aspectRatio: aspectRatio(request.width, request.height) },\n },\n };\n\n if (isPlainObject(request.additionalParams)) {\n const { config, ...topLevel } = request.additionalParams;\n Object.assign(params, topLevel);\n if (isPlainObject(config)) {\n params.config = { ...(params.config as Record<string, unknown>), ...config };\n }\n }\n\n const response = await this.client.models.generateContent(params as never);\n return nativeImageResponseFromGemini(response);\n }\n}\n\nexport class GeminiImagenGenerationModel implements ImageGenerationModel {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = IMAGEN_4_GENERATE,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n prompt: request.prompt,\n config: { aspectRatio: aspectRatio(request.width, request.height) },\n };\n\n if (isPlainObject(request.additionalParams)) {\n const { config, ...topLevel } = request.additionalParams;\n Object.assign(params, topLevel);\n if (isPlainObject(config)) {\n params.config = { ...(params.config as Record<string, unknown>), ...config };\n }\n }\n\n const response = await this.client.models.generateImages(params as never);\n return imagenResponseFromGemini(response);\n }\n}\n\nexport function nativeImageResponseFromGemini(response: unknown): ImageGenerationResponse<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 const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"Gemini image generation response contained no inline image data.\");\n }\n\n return {\n image,\n images,\n mediaType: images[0]?.mediaType,\n rawResponse: response,\n };\n}\n\nexport function imagenResponseFromGemini(response: unknown): ImageGenerationResponse<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 const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"Gemini image generation response contained no base64 images.\");\n }\n\n return {\n image,\n images,\n mediaType: images[0]?.mediaType,\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 { Buffer } from \"node:buffer\";\nimport type {\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResponse,\n} from \"@anvia/core/transcription\";\nimport type { GoogleGenAI } from \"@google/genai\";\n\nconst TRANSCRIPTION_PREAMBLE =\n \"Transcribe the provided audio exactly. Do not add additional information.\";\n\nexport class GeminiTranscriptionModel implements TranscriptionModel {\n readonly provider = \"gemini\";\n\n constructor(\n private readonly client: GoogleGenAI,\n readonly defaultModel = \"gemini-2.5-flash\",\n ) {}\n\n async transcription(request: TranscriptionRequest): Promise<TranscriptionResponse<unknown>> {\n const config: Record<string, unknown> = {};\n if (request.temperature !== undefined) {\n config.temperature = request.temperature;\n }\n if (isPlainObject(request.additionalParams)) {\n Object.assign(config, request.additionalParams);\n }\n\n const response = await this.client.models.generateContent({\n model: this.defaultModel,\n contents: [\n {\n role: \"user\",\n parts: [\n {\n inlineData: {\n mimeType: mimeTypeFromFilename(request.filename),\n data: Buffer.from(request.data).toString(\"base64\"),\n },\n },\n ],\n },\n ],\n config: {\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":["content","Buffer","isPlainObject","Buffer","isPlainObject","isObject"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/gemini",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Gemini provider adapter for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@anvia/core": "^0.4.0",
29
+ "@anvia/core": "^0.5.0",
30
30
  "@google/genai": "^2.8.0"
31
31
  },
32
32
  "devDependencies": {
@@ -36,8 +36,10 @@
36
36
  "vitest": "^4.0.8"
37
37
  },
38
38
  "scripts": {
39
+ "prebuild": "pnpm --filter @anvia/core build",
39
40
  "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
40
41
  "test": "vitest run",
42
+ "pretypecheck": "pnpm --filter @anvia/core build",
41
43
  "typecheck": "tsc --noEmit"
42
44
  }
43
45
  }