@standardagents/google 0.14.1 → 0.15.1

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
@@ -123,6 +123,11 @@ const result = await provider.generate({
123
123
 
124
124
  For multimodal Gemini requests, pass Standard Agents image parts or image attachments and the provider will translate them to Google inline parts. For Imagen requests, the provider will route through the image generation path automatically when the target model is an Imagen model.
125
125
 
126
+ For tool results with image attachments, the provider keeps the internal Standard Agents message shape unchanged and applies a Google-only request transform at send time:
127
+
128
+ - Gemini 3 series models keep image data nested inside `functionResponse.parts`
129
+ - Older Google chat models receive a text-only `functionResponse`, with image attachments lifted into sibling inline image parts so the request remains accepted by those models
130
+
126
131
  ## Debugging
127
132
 
128
133
  Use `inspectRequest()` to view the transformed Google-native request body:
@@ -140,3 +145,4 @@ console.log(inspected?.body);
140
145
 
141
146
  - Model IDs are normalized so variants like `google/...`, `models/...`, and `publishers/google/models/...` resolve to the same pricing and capability entries where possible.
142
147
  - Cost is computed from Google usage metadata and pricing tables when available; Google does not currently return a direct monetary cost field for Gemini requests.
148
+ - Gemini thought signatures attached to tool-call parts are preserved through Standard Agents history so multi-step Google tool calling can continue across turns.
package/dist/index.js CHANGED
@@ -451,6 +451,13 @@ var STATIC_MODELS = [
451
451
  function normalizeModelId(modelId) {
452
452
  return modelId.trim().replace(/^google\//, "").replace(/^models\//, "").replace(/^publishers\/google\/models\//, "");
453
453
  }
454
+ function supportsGoogleMultimodalFunctionResponses(modelId) {
455
+ return normalizeModelId(modelId).startsWith("gemini-3");
456
+ }
457
+ function supportsGoogleVisionInput(modelId) {
458
+ const normalizedId = normalizeModelId(modelId);
459
+ return normalizedId.startsWith("gemini-") || normalizedId.startsWith("gemma-3") || normalizedId.startsWith("gemma-4");
460
+ }
454
461
  function isImagenModel(modelId) {
455
462
  return normalizeModelId(modelId).startsWith("imagen-");
456
463
  }
@@ -603,23 +610,30 @@ function buildAssistantParts(message) {
603
610
  if (message.content) {
604
611
  parts.push({ text: message.content });
605
612
  }
606
- if (message.reasoning) {
607
- parts.push({ text: message.reasoning, thought: true });
613
+ const reasoningParts = buildGoogleReasoningParts(message.reasoning, message.reasoningDetails);
614
+ if (reasoningParts.length) {
615
+ parts.push(...reasoningParts);
608
616
  }
609
617
  if (message.toolCalls?.length) {
610
618
  for (const toolCall of message.toolCalls) {
619
+ const thoughtSignature = getGoogleThoughtSignature(
620
+ toolCall.extraContent,
621
+ message.reasoningDetails,
622
+ toolCall.id
623
+ );
611
624
  parts.push({
612
625
  functionCall: {
613
626
  id: toolCall.id,
614
627
  name: toolCall.name,
615
628
  args: toolCall.arguments
616
- }
629
+ },
630
+ ...thoughtSignature ? { thoughtSignature } : {}
617
631
  });
618
632
  }
619
633
  }
620
634
  return parts;
621
635
  }
622
- function buildToolParts(message) {
636
+ function buildToolParts(message, modelId) {
623
637
  const response = {};
624
638
  if (typeof message.content === "string") {
625
639
  response.output = message.content;
@@ -630,26 +644,33 @@ function buildToolParts(message) {
630
644
  } else {
631
645
  response.output = message.content;
632
646
  }
633
- const imageParts = message.attachments?.filter((attachment) => attachment.type === "image" && attachment.data).map((attachment, index) => {
647
+ const imageParts = message.attachments?.filter((attachment) => attachment.type === "image" && attachment.data).map((attachment) => {
634
648
  const normalized = normalizeInlineBytes(attachment.data, attachment.mediaType);
635
- return {
636
- inlineData: {
637
- mimeType: normalized.mediaType,
638
- data: normalized.data
639
- },
640
- partMetadata: { attachmentIndex: index }
641
- };
649
+ return createPartFromBase64(normalized.data, normalized.mediaType || "image/png");
642
650
  }) || [];
643
- return [
651
+ if (supportsGoogleMultimodalFunctionResponses(modelId)) {
652
+ return [
653
+ createPartFromFunctionResponse(
654
+ message.toolCallId,
655
+ message.toolName,
656
+ response,
657
+ imageParts.length ? imageParts : void 0
658
+ )
659
+ ];
660
+ }
661
+ const parts = [
644
662
  createPartFromFunctionResponse(
645
663
  message.toolCallId,
646
664
  message.toolName,
647
- response,
648
- imageParts.length ? imageParts.map((part) => ({ inlineData: part.inlineData })) : void 0
665
+ response
649
666
  )
650
667
  ];
668
+ if (supportsGoogleVisionInput(modelId) && imageParts.length) {
669
+ parts.push(...imageParts);
670
+ }
671
+ return parts;
651
672
  }
652
- function buildContents(messages) {
673
+ function buildContents(messages, modelId) {
653
674
  const contents = [];
654
675
  const systemMessages = messages.filter((message) => message.role === "system").map((message) => message.content);
655
676
  const systemInstruction = systemMessages.length ? { role: "user", parts: [{ text: systemMessages.join("\n\n") }] } : void 0;
@@ -663,7 +684,7 @@ function buildContents(messages) {
663
684
  contents.push({ role: "model", parts: buildAssistantParts(message) });
664
685
  continue;
665
686
  }
666
- contents.push({ role: "user", parts: buildToolParts(message) });
687
+ contents.push({ role: "user", parts: buildToolParts(message, modelId) });
667
688
  }
668
689
  return { systemInstruction, contents };
669
690
  }
@@ -672,6 +693,28 @@ function extractReasoningFromParts(parts) {
672
693
  const text = parts.filter((part) => part.thought && typeof part.text === "string").map((part) => part.text).join("");
673
694
  return text || null;
674
695
  }
696
+ function extractGoogleReasoningDetails(parts) {
697
+ if (!parts?.length) return void 0;
698
+ const reasoningDetails = [];
699
+ for (const part of parts) {
700
+ if (!part.thought) continue;
701
+ if (typeof part.text === "string" && part.text.length > 0) {
702
+ reasoningDetails.push({
703
+ type: "text",
704
+ text: part.text,
705
+ format: "google-gemini-v1"
706
+ });
707
+ }
708
+ if (typeof part.thoughtSignature === "string" && part.thoughtSignature.length > 0) {
709
+ reasoningDetails.push({
710
+ type: "encrypted",
711
+ data: part.thoughtSignature,
712
+ format: "google-gemini-thought-signature-v1"
713
+ });
714
+ }
715
+ }
716
+ return reasoningDetails.length ? reasoningDetails : void 0;
717
+ }
675
718
  function extractImagesFromParts(parts) {
676
719
  if (!parts?.length) return void 0;
677
720
  const images = parts.filter((part) => part.inlineData?.mimeType?.startsWith("image/")).map((part, index) => ({
@@ -686,10 +729,61 @@ function extractToolCalls(parts) {
686
729
  const toolCalls = parts.filter((part) => part.functionCall?.name).map((part) => ({
687
730
  id: part.functionCall?.id || crypto.randomUUID(),
688
731
  name: part.functionCall?.name || "tool",
689
- arguments: part.functionCall?.args || {}
732
+ arguments: part.functionCall?.args || {},
733
+ extraContent: getGoogleToolCallExtraContent(part)
690
734
  }));
691
735
  return toolCalls.length ? toolCalls : void 0;
692
736
  }
737
+ function getGoogleThoughtSignature(extraContent, reasoningDetails, toolCallId) {
738
+ if (extraContent && typeof extraContent === "object") {
739
+ const google2 = extraContent.google;
740
+ if (google2 && typeof google2 === "object") {
741
+ const thoughtSignature = google2.thought_signature;
742
+ if (typeof thoughtSignature === "string" && thoughtSignature.length > 0) {
743
+ return thoughtSignature;
744
+ }
745
+ }
746
+ }
747
+ if (!toolCallId || !reasoningDetails?.length) return void 0;
748
+ const detail = reasoningDetails.find((candidate) => candidate?.type === "encrypted" && candidate?.id === toolCallId && typeof candidate?.data === "string" && candidate.data.length > 0 && (candidate.format === "google-gemini-v1" || candidate.format === "google-gemini-thought-signature-v1" || !candidate.format));
749
+ return detail?.data;
750
+ }
751
+ function getGoogleToolCallExtraContent(part) {
752
+ const thoughtSignature = typeof part.thoughtSignature === "string" && part.thoughtSignature.length > 0 ? part.thoughtSignature : void 0;
753
+ if (!thoughtSignature) return void 0;
754
+ return {
755
+ google: {
756
+ thought_signature: thoughtSignature
757
+ }
758
+ };
759
+ }
760
+ function buildGoogleReasoningParts(reasoning, reasoningDetails) {
761
+ const googleReasoningDetails = reasoningDetails?.filter(
762
+ (detail) => detail?.format === "google-gemini-v1" || detail?.format === "google-gemini-thought-signature-v1"
763
+ ) || [];
764
+ if (googleReasoningDetails.length === 0) {
765
+ return reasoning ? [{ text: reasoning, thought: true }] : [];
766
+ }
767
+ const parts = [];
768
+ for (const detail of googleReasoningDetails) {
769
+ if (detail.format === "google-gemini-v1" && typeof detail.text === "string") {
770
+ parts.push({ text: detail.text, thought: true });
771
+ continue;
772
+ }
773
+ if (detail.format === "google-gemini-thought-signature-v1" && typeof detail.data === "string") {
774
+ const lastThoughtPart = parts.length > 0 ? parts[parts.length - 1] : void 0;
775
+ if (lastThoughtPart?.thought && !lastThoughtPart.thoughtSignature) {
776
+ lastThoughtPart.thoughtSignature = detail.data;
777
+ } else {
778
+ parts.push({ thought: true, thoughtSignature: detail.data });
779
+ }
780
+ }
781
+ }
782
+ if (parts.length === 0 && reasoning) {
783
+ parts.push({ text: reasoning, thought: true });
784
+ }
785
+ return parts;
786
+ }
693
787
  function transformUsage(modelId, usage, imageCount = 0) {
694
788
  const mapped = {
695
789
  promptTokens: usage?.promptTokenCount || 0,
@@ -848,7 +942,7 @@ var GoogleProvider = class _GoogleProvider {
848
942
  }
849
943
  buildGenerateContentParams(request) {
850
944
  const providerOptions = request.providerOptions || {};
851
- const { systemInstruction, contents } = buildContents(request.messages);
945
+ const { systemInstruction, contents } = buildContents(request.messages, request.model);
852
946
  const config = {
853
947
  ...this.getHttpOptions() ? { httpOptions: this.getHttpOptions() } : {},
854
948
  ...systemInstruction ? { systemInstruction } : {},
@@ -961,7 +1055,7 @@ var GoogleProvider = class _GoogleProvider {
961
1055
  return {
962
1056
  content: response.text || null,
963
1057
  reasoning: extractReasoningFromParts(parts),
964
- reasoningDetails: extractReasoningFromParts(parts) ? [{ type: "text", text: extractReasoningFromParts(parts) || void 0, format: "google-gemini-v1" }] : void 0,
1058
+ reasoningDetails: extractGoogleReasoningDetails(parts),
965
1059
  toolCalls: extractToolCalls(parts),
966
1060
  images,
967
1061
  finishReason: mapFinishReason(candidate?.finishReason),
@@ -1029,6 +1123,7 @@ var GoogleProvider = class _GoogleProvider {
1029
1123
  async *[Symbol.asyncIterator]() {
1030
1124
  let sawContent = false;
1031
1125
  let sawReasoning = false;
1126
+ const reasoningDetails = [];
1032
1127
  let finishReason = "stop";
1033
1128
  let finalUsage = {
1034
1129
  promptTokens: 0,
@@ -1041,6 +1136,10 @@ var GoogleProvider = class _GoogleProvider {
1041
1136
  for await (const chunk of stream) {
1042
1137
  const candidate = chunk.candidates?.[0];
1043
1138
  const parts = candidate?.content?.parts || [];
1139
+ const chunkReasoningDetails = extractGoogleReasoningDetails(parts);
1140
+ if (chunkReasoningDetails?.length) {
1141
+ reasoningDetails.push(...chunkReasoningDetails);
1142
+ }
1044
1143
  for (const part of parts) {
1045
1144
  if (part.text && !part.thought) {
1046
1145
  sawContent = true;
@@ -1050,8 +1149,14 @@ var GoogleProvider = class _GoogleProvider {
1050
1149
  yield { type: "reasoning-delta", delta: part.text };
1051
1150
  } else if (part.functionCall?.name) {
1052
1151
  const id = part.functionCall.id || crypto.randomUUID();
1053
- yield { type: "tool-call-start", id, name: part.functionCall.name };
1054
- yield { type: "tool-call-done", id, arguments: part.functionCall.args || {} };
1152
+ const extraContent = getGoogleToolCallExtraContent(part);
1153
+ yield { type: "tool-call-start", id, name: part.functionCall.name, extraContent };
1154
+ yield {
1155
+ type: "tool-call-done",
1156
+ id,
1157
+ arguments: part.functionCall.args || {},
1158
+ extraContent
1159
+ };
1055
1160
  } else if (part.inlineData?.mimeType?.startsWith("image/")) {
1056
1161
  const image = {
1057
1162
  id: `image_${imageIndex}`,
@@ -1071,7 +1176,12 @@ var GoogleProvider = class _GoogleProvider {
1071
1176
  }
1072
1177
  if (sawContent) yield { type: "content-done" };
1073
1178
  if (sawReasoning) yield { type: "reasoning-done" };
1074
- yield { type: "finish", finishReason, usage: finalUsage };
1179
+ yield {
1180
+ type: "finish",
1181
+ finishReason,
1182
+ usage: finalUsage,
1183
+ reasoningDetails: reasoningDetails.length ? reasoningDetails : void 0
1184
+ };
1075
1185
  } catch (error) {
1076
1186
  yield { type: "error", error: self.toProviderError(error).message };
1077
1187
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/GoogleProvider.ts","../src/icons.ts","../src/pricing.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import {\n GoogleGenAI,\n FunctionCallingConfigMode,\n createPartFromBase64,\n createPartFromFunctionResponse,\n RawReferenceImage,\n} from '@google/genai/web';\nimport type { Model as GoogleModel, Part } from '@google/genai/web';\nimport type {\n InspectedRequest,\n LLMProviderInterface as Provider,\n ModelCapabilities,\n ProviderFactoryConfig,\n ProviderFinishReason,\n ProviderGeneratedImage,\n ProviderMessage,\n ProviderModelInfo,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderTool,\n ProviderToolCallPart,\n ProviderUsage,\n} from '@standardagents/spec';\nimport { ProviderError } from '@standardagents/spec';\nimport { getGoogleIconDataUri } from './icons';\nimport { calculateGoogleUsageCost } from './pricing';\n\ninterface GoogleStaticModelEntry {\n id: string;\n name: string;\n description: string;\n capabilities: ModelCapabilities;\n}\n\nconst STATIC_MODELS: GoogleStaticModelEntry[] = [\n {\n id: 'gemma-4-31b-it',\n name: 'Gemma 4 31B IT',\n description: 'Hosted Gemma 4 instruction-tuned model with image input and optional thinking.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 262144,\n reasoningLevels: { 0: null, 100: 'high' },\n },\n },\n {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n description: 'State-of-the-art Gemini model for coding and reasoning.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n reasoningLevels: { 0: null, 50: 'medium', 100: 'high' },\n },\n },\n {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n description: 'Fast multimodal Gemini model for general-purpose tasks.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-2.5-flash-lite',\n name: 'Gemini 2.5 Flash-Lite',\n description: 'Low-cost Gemini model for high-volume workloads.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-2.5-flash-image',\n name: 'Gemini 2.5 Flash Image',\n description: 'Gemini image generation model with native image output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-3-pro-image-preview',\n name: 'Gemini 3 Pro Image Preview',\n description: 'High-end Gemini image-preview model with image generation output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-3.1-flash-image-preview',\n name: 'Gemini 3.1 Flash Image Preview',\n description: 'Fast Gemini image-preview model with image output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'imagen-4.0-generate-001',\n name: 'Imagen 4 Generate',\n description: 'Google Imagen model for image generation.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: false,\n supportsJsonMode: false,\n maxContextTokens: 0,\n },\n },\n {\n id: 'imagen-3.0-capability-001',\n name: 'Imagen 3 Capability',\n description: 'Google Imagen model for image editing.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: false,\n supportsJsonMode: false,\n maxContextTokens: 0,\n },\n },\n];\n\nfunction normalizeModelId(modelId: string): string {\n return modelId\n .trim()\n .replace(/^google\\//, '')\n .replace(/^models\\//, '')\n .replace(/^publishers\\/google\\/models\\//, '');\n}\n\nfunction isImagenModel(modelId: string): boolean {\n return normalizeModelId(modelId).startsWith('imagen-');\n}\n\nfunction supportsGoogleVision(model: GoogleModel, normalizedId: string): boolean {\n const description = (model.description || '').toLowerCase();\n\n if (isImagenModel(normalizedId)) {\n return true;\n }\n\n if (normalizedId.startsWith('gemini-')) {\n return true;\n }\n\n if (normalizedId.startsWith('gemma-3') || normalizedId.startsWith('gemma-4')) {\n return true;\n }\n\n return ['multimodal', 'image', 'vision', 'video', 'audio'].some((term) => description.includes(term));\n}\n\nfunction supportsGoogleToolCalls(normalizedId: string): boolean {\n return normalizedId.startsWith('gemini-') || normalizedId.startsWith('functiongemma');\n}\n\nfunction inferGoogleReasoningLevels(model: GoogleModel, normalizedId: string): Record<number, string | null> | undefined {\n if (!model.thinking) return undefined;\n\n if (normalizedId.startsWith('gemma-')) {\n return { 0: null, 100: 'high' };\n }\n\n return { 0: null, 50: 'medium', 100: 'high' };\n}\n\nfunction mapDynamicCapabilities(model: GoogleModel): ModelCapabilities {\n const normalizedId = normalizeModelId(model.name || model.displayName || '');\n const supportedActions = new Set(model.supportedActions || []);\n const supportsContentGeneration = supportedActions.has('generateContent') || normalizedId.startsWith('gemini-') || normalizedId.startsWith('gemma-');\n const supportsTools = supportsGoogleToolCalls(normalizedId);\n\n return {\n supportsImages: supportsGoogleVision(model, normalizedId),\n supportsToolCalls: supportsTools,\n supportsStreaming: supportsContentGeneration && !isImagenModel(normalizedId),\n supportsJsonMode: supportsTools,\n maxContextTokens: model.inputTokenLimit,\n maxOutputTokens: model.outputTokenLimit,\n reasoningLevels: inferGoogleReasoningLevels(model, normalizedId),\n };\n}\n\nfunction toProviderModelInfo(model: GoogleModel): ProviderModelInfo {\n const id = normalizeModelId(model.name || model.displayName || '');\n return {\n id,\n name: model.displayName || id,\n description: model.description,\n contextLength: model.inputTokenLimit,\n iconId: getGoogleIconDataUri(),\n slug: id,\n };\n}\n\nfunction mapFinishReason(value: string | undefined): ProviderFinishReason {\n switch (value) {\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'IMAGE_SAFETY':\n case 'PROHIBITED_CONTENT':\n case 'IMAGE_PROHIBITED_CONTENT':\n return 'content_filter';\n case 'MALFORMED_FUNCTION_CALL':\n case 'UNEXPECTED_TOOL_CALL':\n return 'error';\n case 'STOP':\n default:\n return 'stop';\n }\n}\n\nfunction toolChoiceToGoogle(choice: ProviderRequest['toolChoice']): { mode: FunctionCallingConfigMode; allowedFunctionNames?: string[] } | undefined {\n if (choice === 'auto') {\n return { mode: FunctionCallingConfigMode.AUTO };\n }\n if (choice === 'none') {\n return { mode: FunctionCallingConfigMode.NONE };\n }\n if (choice === 'required') {\n return { mode: FunctionCallingConfigMode.ANY };\n }\n if (choice && typeof choice === 'object' && 'name' in choice) {\n return {\n mode: FunctionCallingConfigMode.ANY,\n allowedFunctionNames: [choice.name],\n };\n }\n return undefined;\n}\n\nfunction transformTools(tools: ProviderTool[] | undefined): any[] | undefined {\n if (!tools?.length) return undefined;\n\n return [{\n functionDeclarations: tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters || {\n type: 'object',\n properties: {},\n required: [],\n },\n })),\n }];\n}\n\nfunction normalizeInlineBytes(\n data: string | undefined,\n mediaType: string | undefined,\n): { data: string; mediaType?: string } {\n const value = data || '';\n const match = value.match(/^data:([^;]+);base64,(.*)$/);\n if (!match) {\n return { data: value, mediaType };\n }\n\n return {\n data: match[2],\n mediaType: match[1] || mediaType,\n };\n}\n\nfunction buildUserParts(message: Extract<ProviderMessage, { role: 'user' }>): Part[] {\n if (typeof message.content === 'string') {\n return [{ text: message.content }];\n }\n\n return message.content.map((part: any) => {\n if (part.type === 'text') {\n return { text: part.text };\n }\n\n if (part.type === 'image') {\n const normalized = normalizeInlineBytes(part.data, part.mediaType || 'image/png');\n return createPartFromBase64(normalized.data, normalized.mediaType || 'image/png');\n }\n\n if (part.type === 'image_url') {\n const url = part.image_url?.url || '';\n if (url.startsWith('data:')) {\n const match = url.match(/^data:([^;]+);base64,(.*)$/);\n if (match) {\n return createPartFromBase64(match[2], match[1]);\n }\n }\n return {\n fileData: {\n mimeType: 'image/*',\n fileUri: url,\n },\n };\n }\n\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: part.data,\n },\n };\n });\n}\n\nfunction buildAssistantParts(message: Extract<ProviderMessage, { role: 'assistant' }>): Part[] {\n const parts: Part[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n if (message.reasoning) {\n parts.push({ text: message.reasoning, thought: true });\n }\n\n if (message.toolCalls?.length) {\n for (const toolCall of message.toolCalls) {\n parts.push({\n functionCall: {\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.arguments,\n },\n });\n }\n }\n\n return parts;\n}\n\nfunction buildToolParts(message: Extract<ProviderMessage, { role: 'tool' }>): Part[] {\n const response: Record<string, unknown> = {};\n\n if (typeof message.content === 'string') {\n response.output = message.content;\n } else if ('type' in message.content) {\n if (message.content.type === 'text') response.output = message.content.text;\n else if (message.content.type === 'error') response.error = message.content.error;\n else response.output = message.content;\n } else {\n response.output = message.content;\n }\n\n const imageParts = message.attachments\n ?.filter((attachment: any) => attachment.type === 'image' && attachment.data)\n .map((attachment: any, index: number) => {\n const normalized = normalizeInlineBytes(attachment.data, attachment.mediaType);\n return {\n inlineData: {\n mimeType: normalized.mediaType,\n data: normalized.data,\n },\n partMetadata: { attachmentIndex: index },\n };\n }) || [];\n\n return [\n createPartFromFunctionResponse(\n message.toolCallId,\n message.toolName,\n response,\n imageParts.length ? imageParts.map((part: any) => ({ inlineData: part.inlineData })) : undefined\n ),\n ];\n}\n\nfunction buildContents(messages: ProviderMessage[]): { systemInstruction?: any; contents: any[] } {\n const contents: any[] = [];\n const systemMessages = messages.filter((message) => message.role === 'system').map((message) => message.content);\n const systemInstruction = systemMessages.length\n ? { role: 'user', parts: [{ text: systemMessages.join('\\n\\n') }] }\n : undefined;\n\n for (const message of messages) {\n if (message.role === 'system') continue;\n if (message.role === 'user') {\n contents.push({ role: 'user', parts: buildUserParts(message) });\n continue;\n }\n if (message.role === 'assistant') {\n contents.push({ role: 'model', parts: buildAssistantParts(message) });\n continue;\n }\n contents.push({ role: 'user', parts: buildToolParts(message) });\n }\n\n return { systemInstruction, contents };\n}\n\nfunction extractReasoningFromParts(parts: Part[] | undefined): string | null {\n if (!parts?.length) return null;\n const text = parts\n .filter((part: any) => part.thought && typeof part.text === 'string')\n .map((part: any) => part.text)\n .join('');\n return text || null;\n}\n\nfunction extractImagesFromParts(parts: Part[] | undefined): ProviderGeneratedImage[] | undefined {\n if (!parts?.length) return undefined;\n const images = parts\n .filter((part: any) => part.inlineData?.mimeType?.startsWith('image/'))\n .map((part: any, index: number) => ({\n id: `image_${index}`,\n data: part.inlineData?.data || '',\n mediaType: part.inlineData?.mimeType || 'image/png',\n }));\n return images.length ? images : undefined;\n}\n\nfunction extractToolCalls(parts: Part[] | undefined): ProviderToolCallPart[] | undefined {\n if (!parts?.length) return undefined;\n const toolCalls = parts\n .filter((part: any) => part.functionCall?.name)\n .map((part: any) => ({\n id: part.functionCall?.id || crypto.randomUUID(),\n name: part.functionCall?.name || 'tool',\n arguments: (part.functionCall?.args || {}) as Record<string, unknown>,\n }));\n\n return toolCalls.length ? toolCalls : undefined;\n}\n\nfunction transformUsage(modelId: string, usage: any, imageCount = 0): ProviderUsage {\n const mapped: ProviderUsage = {\n promptTokens: usage?.promptTokenCount || 0,\n completionTokens: usage?.candidatesTokenCount || 0,\n totalTokens: usage?.totalTokenCount || 0,\n reasoningTokens: usage?.thoughtsTokenCount,\n cachedTokens: usage?.cachedContentTokenCount,\n provider: 'google',\n };\n\n mapped.cost = calculateGoogleUsageCost(\n modelId,\n {\n ...mapped,\n promptTokenDetails: usage?.promptTokensDetails,\n completionTokenDetails: usage?.candidatesTokensDetails || usage?.responseTokensDetails,\n cachedTokenDetails: usage?.cacheTokensDetails,\n },\n imageCount\n );\n return mapped;\n}\n\nexport class GoogleProvider implements Provider {\n readonly name = 'google';\n readonly specificationVersion = '1' as const;\n\n private readonly config: ProviderFactoryConfig;\n private client: GoogleGenAI | null = null;\n\n private static readonly cacheTtl = 5 * 60 * 1000;\n private static modelsCache: ProviderModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static modelMetadataCache = new Map<string, GoogleModel>();\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private getClient(): GoogleGenAI {\n if (!this.client) {\n this.client = new GoogleGenAI({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return modelId.startsWith('gemini-')\n || modelId.startsWith('gemma-')\n || modelId.startsWith('imagen-')\n || modelId.startsWith('models/');\n }\n\n getIcon(_modelId?: string): string {\n return getGoogleIconDataUri();\n }\n\n private getHttpOptions(): Record<string, unknown> | undefined {\n if (!this.config.baseUrl && !this.config.timeout) return undefined;\n\n return {\n ...(this.config.baseUrl ? { baseUrl: this.config.baseUrl } : {}),\n ...(this.config.timeout ? { timeout: this.config.timeout } : {}),\n };\n }\n\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n const now = Date.now();\n if (GoogleProvider.modelsCache && now - GoogleProvider.modelsCacheTime < GoogleProvider.cacheTtl) {\n return this.filterModels(GoogleProvider.modelsCache, filter);\n }\n\n try {\n const models: ProviderModelInfo[] = [];\n const client = this.getClient();\n const pager = await client.models.list({\n config: {\n httpOptions: this.getHttpOptions() as any,\n },\n } as any);\n\n for await (const model of pager as AsyncIterable<GoogleModel>) {\n const id = normalizeModelId(model.name || '');\n if (!id) continue;\n const supportsGeneration = model.supportedActions?.some((action: string) =>\n ['generateContent', 'generateImages', 'editImage', 'predict'].includes(action)\n );\n if (!supportsGeneration) continue;\n GoogleProvider.modelMetadataCache.set(id, model);\n models.push(toProviderModelInfo(model));\n }\n\n for (const staticModel of STATIC_MODELS) {\n if (!models.some((model) => model.id === staticModel.id)) {\n models.push({\n id: staticModel.id,\n name: staticModel.name,\n description: staticModel.description,\n iconId: this.getIcon(staticModel.id),\n slug: staticModel.id,\n });\n }\n }\n\n GoogleProvider.modelsCache = models.sort((a, b) => a.name.localeCompare(b.name));\n GoogleProvider.modelsCacheTime = now;\n return this.filterModels(GoogleProvider.modelsCache, filter);\n } catch (error) {\n console.error('Failed to list Google models:', error);\n return this.filterModels(\n STATIC_MODELS.map((model) => ({\n id: model.id,\n name: model.name,\n description: model.description,\n iconId: this.getIcon(model.id),\n slug: model.id,\n })),\n filter\n );\n }\n }\n\n private filterModels(models: ProviderModelInfo[], filter?: string): ProviderModelInfo[] {\n if (!filter) return models;\n const query = filter.toLowerCase();\n return models.filter((model) =>\n model.id.toLowerCase().includes(query) ||\n model.name.toLowerCase().includes(query) ||\n (model.description?.toLowerCase().includes(query) ?? false)\n );\n }\n\n private async getModelMetadata(modelId: string): Promise<GoogleModel | null> {\n const normalized = normalizeModelId(modelId);\n const cached = GoogleProvider.modelMetadataCache.get(normalized);\n if (cached) {\n return cached;\n }\n\n try {\n const model = await this.getClient().models.get({\n model: normalized,\n config: {\n httpOptions: this.getHttpOptions() as any,\n },\n } as any);\n GoogleProvider.modelMetadataCache.set(normalized, model);\n return model;\n } catch {\n return null;\n }\n }\n\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n const normalized = normalizeModelId(modelId);\n const staticModel = STATIC_MODELS.find((model) => model.id === normalized);\n if (staticModel) {\n return { ...staticModel.capabilities };\n }\n\n try {\n const metadata = await this.getModelMetadata(normalized);\n if (metadata) {\n return mapDynamicCapabilities(metadata);\n }\n\n const models = await this.getModels();\n const found = models.find((model) => model.id === normalized);\n if (!found) return null;\n\n return {\n supportsImages: normalized.startsWith('gemini-') || normalized.startsWith('gemma-') || normalized.includes('image'),\n supportsToolCalls: supportsGoogleToolCalls(normalized),\n supportsStreaming: !isImagenModel(normalized),\n supportsJsonMode: supportsGoogleToolCalls(normalized),\n maxContextTokens: found.contextLength,\n };\n } catch {\n return null;\n }\n }\n\n private buildGenerateContentParams(request: ProviderRequest): Record<string, unknown> {\n const providerOptions = (request.providerOptions || {}) as Record<string, unknown>;\n const { systemInstruction, contents } = buildContents(request.messages);\n\n const config: Record<string, unknown> = {\n ...(this.getHttpOptions() ? { httpOptions: this.getHttpOptions() } : {}),\n ...(systemInstruction ? { systemInstruction } : {}),\n ...(typeof request.temperature === 'number' ? { temperature: request.temperature } : {}),\n ...(typeof request.topP === 'number' ? { topP: request.topP } : {}),\n ...(typeof request.topK === 'number' ? { topK: request.topK } : {}),\n ...(typeof request.maxOutputTokens === 'number' ? { maxOutputTokens: request.maxOutputTokens } : {}),\n ...(request.stopSequences?.length ? { stopSequences: request.stopSequences } : {}),\n ...(request.responseFormat?.type === 'json'\n ? {\n responseMimeType: 'application/json',\n ...(request.responseFormat.schema ? { responseJsonSchema: request.responseFormat.schema } : {}),\n }\n : {}),\n ...(request.tools?.length ? { tools: transformTools(request.tools) } : {}),\n ...(request.tools?.length && toolChoiceToGoogle(request.toolChoice)\n ? { toolConfig: { functionCallingConfig: toolChoiceToGoogle(request.toolChoice) } }\n : {}),\n ...(typeof providerOptions.candidateCount === 'number' ? { candidateCount: providerOptions.candidateCount } : {}),\n ...(Array.isArray(providerOptions.responseModalities) ? { responseModalities: providerOptions.responseModalities } : {}),\n ...(typeof providerOptions.mediaResolution === 'string' ? { mediaResolution: providerOptions.mediaResolution } : {}),\n ...(typeof providerOptions.cachedContent === 'string' ? { cachedContent: providerOptions.cachedContent } : {}),\n ...(typeof providerOptions.enableEnhancedCivicAnswers === 'boolean'\n ? { enableEnhancedCivicAnswers: providerOptions.enableEnhancedCivicAnswers }\n : {}),\n ...(providerOptions.labels ? { labels: providerOptions.labels } : {}),\n ...(providerOptions.safetySettings ? { safetySettings: providerOptions.safetySettings } : {}),\n ...(providerOptions.thinkingConfig ? { thinkingConfig: providerOptions.thinkingConfig } : {}),\n ...(providerOptions.imageConfig ? { imageConfig: providerOptions.imageConfig } : {}),\n ...(typeof request.reasoning?.maxTokens === 'number'\n ? { thinkingConfig: { ...(providerOptions.thinkingConfig as Record<string, unknown> || {}), thinkingBudget: request.reasoning.maxTokens } }\n : {}),\n };\n\n return {\n model: normalizeModelId(request.model),\n contents,\n config,\n };\n }\n\n private extractImagenRequest(request: ProviderRequest): {\n prompt: string;\n referenceImages?: RawReferenceImage[];\n body: Record<string, unknown>;\n } {\n const providerOptions = (request.providerOptions || {}) as Record<string, unknown>;\n const latestUser = [...request.messages].reverse().find((message) => message.role === 'user');\n const prompt = latestUser ? (typeof latestUser.content === 'string'\n ? latestUser.content\n : latestUser.content.filter((part: any) => part.type === 'text').map((part: any) => part.text).join('\\n')) : '';\n\n const referenceImages = latestUser && typeof latestUser.content !== 'string'\n ? latestUser.content\n .filter((part: any) => part.type === 'image')\n .map((part: any, index: number) => {\n const normalized = normalizeInlineBytes(part.data, part.mediaType);\n const image = new RawReferenceImage();\n image.referenceId = index + 1;\n image.referenceImage = {\n imageBytes: normalized.data,\n mimeType: normalized.mediaType,\n };\n return image;\n })\n : [];\n\n const body: Record<string, unknown> = {\n model: normalizeModelId(request.model),\n prompt,\n ...(referenceImages.length ? { referenceImages: '[binary images omitted]' } : {}),\n config: {\n ...(this.getHttpOptions() ? { httpOptions: this.getHttpOptions() } : {}),\n ...(typeof providerOptions.numberOfImages === 'number' ? { numberOfImages: providerOptions.numberOfImages } : {}),\n ...(typeof providerOptions.negativePrompt === 'string' ? { negativePrompt: providerOptions.negativePrompt } : {}),\n ...(typeof providerOptions.aspectRatio === 'string' ? { aspectRatio: providerOptions.aspectRatio } : {}),\n ...(typeof providerOptions.guidanceScale === 'number' ? { guidanceScale: providerOptions.guidanceScale } : {}),\n ...(typeof providerOptions.seed === 'number' ? { seed: providerOptions.seed } : {}),\n ...(typeof providerOptions.safetyFilterLevel === 'string' ? { safetyFilterLevel: providerOptions.safetyFilterLevel } : {}),\n ...(typeof providerOptions.personGeneration === 'string' ? { personGeneration: providerOptions.personGeneration } : {}),\n ...(typeof providerOptions.includeSafetyAttributes === 'boolean' ? { includeSafetyAttributes: providerOptions.includeSafetyAttributes } : {}),\n ...(typeof providerOptions.includeRaiReason === 'boolean' ? { includeRaiReason: providerOptions.includeRaiReason } : {}),\n ...(typeof providerOptions.language === 'string' ? { language: providerOptions.language } : {}),\n ...(typeof providerOptions.outputMimeType === 'string' ? { outputMimeType: providerOptions.outputMimeType } : {}),\n ...(typeof providerOptions.outputCompressionQuality === 'number' ? { outputCompressionQuality: providerOptions.outputCompressionQuality } : {}),\n ...(typeof providerOptions.addWatermark === 'boolean' ? { addWatermark: providerOptions.addWatermark } : {}),\n ...(providerOptions.labels ? { labels: providerOptions.labels } : {}),\n ...(typeof providerOptions.imageSize === 'string' ? { imageSize: providerOptions.imageSize } : {}),\n ...(typeof providerOptions.enhancePrompt === 'boolean' ? { enhancePrompt: providerOptions.enhancePrompt } : {}),\n ...(typeof providerOptions.editMode === 'string' ? { editMode: providerOptions.editMode } : {}),\n ...(typeof providerOptions.baseSteps === 'number' ? { baseSteps: providerOptions.baseSteps } : {}),\n },\n };\n\n return {\n prompt,\n referenceImages: referenceImages.length ? referenceImages : undefined,\n body,\n };\n }\n\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n if (isImagenModel(request.model)) {\n const imagen = this.extractImagenRequest(request);\n return {\n body: imagen.body,\n messagesPath: 'prompt',\n metadata: {\n endpoint: imagen.referenceImages?.length\n ? `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/editImage`\n : `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/generateImages`,\n headers: { 'Content-Type': 'application/json' },\n },\n };\n }\n\n return {\n body: this.buildGenerateContentParams(request),\n messagesPath: 'contents',\n metadata: {\n endpoint: `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/generateContent`,\n headers: { 'Content-Type': 'application/json' },\n },\n };\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n if (isImagenModel(request.model)) {\n return this.generateImagen(request);\n }\n\n try {\n const client = this.getClient();\n const response = await client.models.generateContent(this.buildGenerateContentParams(request) as any);\n const candidate = response.candidates?.[0];\n const parts = candidate?.content?.parts;\n const images = extractImagesFromParts(parts);\n const usage = transformUsage(normalizeModelId(request.model), response.usageMetadata, images?.length || 0);\n\n return {\n content: response.text || null,\n reasoning: extractReasoningFromParts(parts),\n reasoningDetails: extractReasoningFromParts(parts)\n ? [{ type: 'text', text: extractReasoningFromParts(parts) || undefined, format: 'google-gemini-v1' }]\n : undefined,\n toolCalls: extractToolCalls(parts),\n images,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage,\n metadata: {\n provider: 'google',\n responseId: response.responseId,\n modelVersion: response.modelVersion,\n promptFeedback: response.promptFeedback,\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private async generateImagen(request: ProviderRequest): Promise<ProviderResponse> {\n try {\n const client = this.getClient();\n const imagen = this.extractImagenRequest(request);\n const model = normalizeModelId(request.model);\n\n const response = imagen.referenceImages?.length\n ? await client.models.editImage({\n model,\n prompt: imagen.prompt,\n referenceImages: imagen.referenceImages,\n config: imagen.body.config as any,\n })\n : await client.models.generateImages({\n model,\n prompt: imagen.prompt,\n config: imagen.body.config as any,\n });\n\n const images: ProviderGeneratedImage[] = (response.generatedImages || [])\n .filter((image: any) => image.image?.imageBytes)\n .map((image: any, index: number) => ({\n id: `image_${index}`,\n data: image.image?.imageBytes || '',\n mediaType: image.image?.mimeType || 'image/png',\n revisedPrompt: image.enhancedPrompt,\n }));\n\n return {\n content: null,\n images,\n finishReason: 'stop',\n usage: {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: calculateGoogleUsageCost(model, { promptTokens: 0, completionTokens: 0, cachedTokens: 0 }, images.length),\n provider: 'google',\n },\n metadata: {\n provider: 'google',\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n if (isImagenModel(request.model)) {\n throw new ProviderError('Imagen models do not support streaming in Standard Agents.', 'invalid_request');\n }\n\n const self = this;\n\n try {\n const client = this.getClient();\n const stream = await client.models.generateContentStream(this.buildGenerateContentParams(request) as any);\n\n return {\n async *[Symbol.asyncIterator]() {\n let sawContent = false;\n let sawReasoning = false;\n let finishReason: ProviderFinishReason = 'stop';\n let finalUsage: ProviderUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n provider: 'google',\n };\n let imageIndex = 0;\n\n try {\n for await (const chunk of stream) {\n const candidate = chunk.candidates?.[0];\n const parts = candidate?.content?.parts || [];\n\n for (const part of parts) {\n if (part.text && !part.thought) {\n sawContent = true;\n yield { type: 'content-delta', delta: part.text };\n } else if (part.text && part.thought) {\n sawReasoning = true;\n yield { type: 'reasoning-delta', delta: part.text };\n } else if (part.functionCall?.name) {\n const id = part.functionCall.id || crypto.randomUUID();\n yield { type: 'tool-call-start', id, name: part.functionCall.name };\n yield { type: 'tool-call-done', id, arguments: (part.functionCall.args || {}) as Record<string, unknown> };\n } else if (part.inlineData?.mimeType?.startsWith('image/')) {\n const image: ProviderGeneratedImage = {\n id: `image_${imageIndex}`,\n data: part.inlineData.data || '',\n mediaType: part.inlineData.mimeType || 'image/png',\n };\n yield { type: 'image-done', index: imageIndex, image };\n imageIndex += 1;\n }\n }\n\n if (chunk.usageMetadata) {\n finalUsage = transformUsage(normalizeModelId(request.model), chunk.usageMetadata, imageIndex);\n }\n\n if (candidate?.finishReason) {\n finishReason = mapFinishReason(candidate.finishReason);\n }\n }\n\n if (sawContent) yield { type: 'content-done' };\n if (sawReasoning) yield { type: 'reasoning-done' };\n yield { type: 'finish', finishReason, usage: finalUsage };\n } catch (error) {\n yield { type: 'error', error: self.toProviderError(error).message };\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) return error;\n\n if (error instanceof Error) {\n const candidate = error as Error & { status?: number; statusCode?: number };\n const status = candidate.status || candidate.statusCode;\n if (status === 429) return new ProviderError(error.message, 'rate_limit', status);\n if (status === 401 || status === 403) return new ProviderError(error.message, 'auth_error', status);\n if (status === 400) return new ProviderError(error.message, 'invalid_request', status);\n if (status && status >= 500) return new ProviderError(error.message, 'server_error', status);\n if (error.name === 'AbortError') return new ProviderError(error.message, 'timeout');\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n}\n","const GOOGLE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" fill=\"none\"><rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#fff\"/><path d=\"M54 32.73c0-1.58-.14-3.1-.4-4.55H32v8.61h12.33c-.53 2.85-2.14 5.27-4.56 6.9v5.73h7.38C51.47 45.44 54 39.61 54 32.73Z\" fill=\"#4285F4\"/><path d=\"M32 55c6.2 0 11.4-2.05 15.2-5.58l-7.38-5.73c-2.05 1.37-4.67 2.18-7.82 2.18-6 0-11.08-4.05-12.9-9.49h-7.62v5.96A22.98 22.98 0 0 0 32 55Z\" fill=\"#34A853\"/><path d=\"M19.1 36.38A13.8 13.8 0 0 1 18.38 32c0-1.52.26-3 .72-4.38v-5.96h-7.62A22.98 22.98 0 0 0 9 32c0 3.67.88 7.13 2.48 10.34l7.62-5.96Z\" fill=\"#FBBC05\"/><path d=\"M32 18.9c3.37 0 6.4 1.16 8.79 3.45l6.59-6.59C43.39 12.05 38.19 9 32 9A22.98 22.98 0 0 0 11.48 21.66l7.62 5.96C20.92 22.95 26 18.9 32 18.9Z\" fill=\"#EA4335\"/></svg>`;\n\nexport function svgToDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function getGoogleIconDataUri(): string {\n return svgToDataUri(GOOGLE_ICON);\n}\n","import type { ProviderUsage } from '@standardagents/spec';\n\ntype GooglePricingModality = 'text' | 'image' | 'video' | 'audio' | 'document' | 'unspecified';\n\ninterface GoogleModalityTokenCount {\n modality?: string;\n tokenCount?: number;\n}\n\nexport interface GoogleModelPricing {\n inputPerMillion: number;\n longInputPerMillion?: number;\n outputPerMillion?: number;\n longOutputPerMillion?: number;\n cachedInputPerMillion?: number;\n longCachedInputPerMillion?: number;\n outputImagePerImage?: number;\n inputByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n outputByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n cachedByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n longContextThreshold?: number;\n}\n\nconst MODEL_PRICING: Record<string, GoogleModelPricing> = {\n 'gemini-3-pro-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n cachedInputPerMillion: 0.2,\n },\n 'gemini-3.1-pro-preview': {\n inputPerMillion: 2,\n longInputPerMillion: 4,\n outputPerMillion: 12,\n longOutputPerMillion: 18,\n cachedInputPerMillion: 0.2,\n longCachedInputPerMillion: 0.4,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-pro': {\n inputPerMillion: 1.25,\n longInputPerMillion: 2.5,\n outputPerMillion: 10,\n longOutputPerMillion: 15,\n cachedInputPerMillion: 0.125,\n longCachedInputPerMillion: 0.25,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-flash': {\n inputPerMillion: 0.3,\n outputPerMillion: 2.5,\n cachedInputPerMillion: 0.03,\n },\n 'gemini-2.5-flash-lite': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.01,\n },\n 'gemini-3-flash-preview': {\n inputPerMillion: 0.5,\n outputPerMillion: 3,\n cachedInputPerMillion: 0.05,\n inputByModalityPerMillion: {\n text: 0.5,\n image: 0.5,\n video: 0.5,\n audio: 1,\n },\n cachedByModalityPerMillion: {\n text: 0.05,\n image: 0.05,\n video: 0.05,\n audio: 0.1,\n },\n },\n 'gemini-3.1-flash-lite-preview': {\n inputPerMillion: 0.25,\n outputPerMillion: 1.5,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.25,\n image: 0.25,\n video: 0.25,\n audio: 0.5,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.05,\n },\n },\n 'deep-research-pro-preview-12-2025': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n cachedInputPerMillion: 0.2,\n },\n 'gemini-2.0-flash': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.1,\n image: 0.1,\n video: 0.1,\n audio: 0.7,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.175,\n },\n },\n 'gemini-2.0-flash-001': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.1,\n image: 0.1,\n video: 0.1,\n audio: 0.7,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.175,\n },\n },\n 'gemini-2.0-flash-lite': {\n inputPerMillion: 0.075,\n outputPerMillion: 0.3,\n },\n 'gemini-2.0-flash-lite-001': {\n inputPerMillion: 0.075,\n outputPerMillion: 0.3,\n },\n 'gemini-2.5-computer-use-preview-10-2025': {\n inputPerMillion: 1.25,\n longInputPerMillion: 2.5,\n outputPerMillion: 10,\n longOutputPerMillion: 15,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-flash-preview-tts': {\n inputPerMillion: 0.5,\n outputPerMillion: 10,\n outputByModalityPerMillion: {\n audio: 10,\n },\n },\n 'gemini-2.5-pro-preview-tts': {\n inputPerMillion: 1,\n outputPerMillion: 20,\n outputByModalityPerMillion: {\n audio: 20,\n },\n },\n 'gemini-robotics-er-1.5-preview': {\n inputPerMillion: 0.3,\n outputPerMillion: 2.5,\n inputByModalityPerMillion: {\n text: 0.3,\n image: 0.3,\n video: 0.3,\n audio: 1,\n },\n },\n 'gemini-2.5-flash-image': {\n inputPerMillion: 0.3,\n outputImagePerImage: 0.039,\n },\n 'gemini-3.1-flash-image-preview': {\n inputPerMillion: 0.5,\n outputPerMillion: 3,\n outputImagePerImage: 0.045,\n },\n 'gemini-3-pro-image-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n outputImagePerImage: 0.134,\n },\n 'nano-banana-pro-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n outputImagePerImage: 0.134,\n },\n 'imagen-4.0-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.04,\n },\n 'imagen-4.0-fast-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.02,\n },\n 'imagen-4.0-ultra-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.06,\n },\n 'imagen-3.0-capability-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.04,\n },\n 'gemma-4-31b-it': {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n};\n\nconst MODEL_PRICING_PREFIXES: Array<{ prefix: string; pricing: GoogleModelPricing }> = [\n {\n prefix: 'gemini-3.1-pro-preview',\n pricing: MODEL_PRICING['gemini-3.1-pro-preview'],\n },\n {\n prefix: 'gemini-3-pro-preview',\n pricing: MODEL_PRICING['gemini-3-pro-preview'],\n },\n {\n prefix: 'gemini-3-flash-preview',\n pricing: MODEL_PRICING['gemini-3-flash-preview'],\n },\n {\n prefix: 'gemini-3.1-flash-lite-preview',\n pricing: MODEL_PRICING['gemini-3.1-flash-lite-preview'],\n },\n {\n prefix: 'gemini-2.5-flash-lite-preview-',\n pricing: MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-flash-latest',\n pricing: MODEL_PRICING['gemini-2.5-flash'],\n },\n {\n prefix: 'gemini-flash-lite-latest',\n pricing: MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-pro-latest',\n pricing: MODEL_PRICING['gemini-2.5-pro'],\n },\n {\n prefix: 'gemma-4-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n {\n prefix: 'gemma-3-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n {\n prefix: 'gemma-3n-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n];\n\nfunction normalizeGoogleModelId(modelId: string): string {\n return modelId\n .trim()\n .toLowerCase()\n .replace(/^google\\//, '')\n .replace(/^models\\//, '')\n .replace(/^publishers\\/google\\/models\\//, '');\n}\n\nfunction normalizeModality(modality: string | undefined): GooglePricingModality {\n const normalized = (modality || '').trim().toLowerCase();\n\n if (normalized === 'text') return 'text';\n if (normalized === 'image') return 'image';\n if (normalized === 'video') return 'video';\n if (normalized === 'audio') return 'audio';\n if (normalized === 'document') return 'document';\n return 'unspecified';\n}\n\nfunction toModalityCounts(\n details: GoogleModalityTokenCount[] | undefined\n): Partial<Record<GooglePricingModality, number>> {\n const counts: Partial<Record<GooglePricingModality, number>> = {};\n\n for (const detail of details || []) {\n const modality = normalizeModality(detail.modality);\n const tokenCount = Math.max(detail.tokenCount ?? 0, 0);\n counts[modality] = (counts[modality] ?? 0) + tokenCount;\n }\n\n return counts;\n}\n\nfunction sumModalityCosts(\n counts: Partial<Record<GooglePricingModality, number>>,\n modalityRates: Partial<Record<GooglePricingModality, number>> | undefined,\n defaultRate: number\n): number {\n let total = 0;\n\n for (const [modality, tokenCount] of Object.entries(counts)) {\n if (!tokenCount) continue;\n const rate = modalityRates?.[modality as GooglePricingModality] ?? defaultRate;\n total += (tokenCount / 1_000_000) * rate;\n }\n\n return total;\n}\n\nexport function getGoogleModelPricing(modelId: string): GoogleModelPricing | undefined {\n const normalizedModelId = normalizeGoogleModelId(modelId);\n const exact = MODEL_PRICING[normalizedModelId];\n if (exact) return exact;\n\n return MODEL_PRICING_PREFIXES.find((entry) => normalizedModelId.startsWith(entry.prefix))?.pricing;\n}\n\nexport function calculateGoogleUsageCost(\n modelId: string,\n usage: Pick<ProviderUsage, 'promptTokens' | 'completionTokens' | 'reasoningTokens' | 'cachedTokens'> & {\n promptTokenDetails?: GoogleModalityTokenCount[];\n completionTokenDetails?: GoogleModalityTokenCount[];\n cachedTokenDetails?: GoogleModalityTokenCount[];\n },\n imageCount = 0\n): number | undefined {\n const pricing = getGoogleModelPricing(modelId);\n if (!pricing) return undefined;\n\n const cachedTokens = usage.cachedTokens ?? 0;\n const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);\n const useLongContext = pricing.longContextThreshold != null && usage.promptTokens > pricing.longContextThreshold;\n\n const inputRate = useLongContext ? (pricing.longInputPerMillion ?? pricing.inputPerMillion) : pricing.inputPerMillion;\n const outputRate = useLongContext\n ? (pricing.longOutputPerMillion ?? pricing.outputPerMillion ?? 0)\n : (pricing.outputPerMillion ?? 0);\n const cachedRate = useLongContext\n ? (pricing.longCachedInputPerMillion ?? pricing.cachedInputPerMillion ?? 0)\n : (pricing.cachedInputPerMillion ?? 0);\n const billableOutputTokens = usage.completionTokens + (usage.reasoningTokens ?? 0);\n const promptModalityCounts = toModalityCounts(usage.promptTokenDetails);\n const cachedModalityCounts = toModalityCounts(usage.cachedTokenDetails);\n const uncachedPromptModalityCounts: Partial<Record<GooglePricingModality, number>> = {};\n\n for (const modality of new Set<GooglePricingModality>([\n ...Object.keys(promptModalityCounts) as GooglePricingModality[],\n ...Object.keys(cachedModalityCounts) as GooglePricingModality[],\n ])) {\n uncachedPromptModalityCounts[modality] = Math.max(\n (promptModalityCounts[modality] ?? 0) - (cachedModalityCounts[modality] ?? 0),\n 0\n );\n }\n\n const completionModalityCounts = toModalityCounts(usage.completionTokenDetails);\n if (usage.reasoningTokens) {\n completionModalityCounts.text = (completionModalityCounts.text ?? 0) + usage.reasoningTokens;\n }\n\n const hasPromptModalityPricing = Object.keys(uncachedPromptModalityCounts).length > 0 && pricing.inputByModalityPerMillion;\n const hasCachedModalityPricing = Object.keys(cachedModalityCounts).length > 0 && pricing.cachedByModalityPerMillion;\n const hasOutputModalityPricing = Object.keys(completionModalityCounts).length > 0 && pricing.outputByModalityPerMillion;\n\n const inputCost = hasPromptModalityPricing\n ? sumModalityCosts(uncachedPromptModalityCounts, pricing.inputByModalityPerMillion, inputRate)\n : (uncachedPromptTokens / 1_000_000) * inputRate;\n const cachedCost = hasCachedModalityPricing\n ? sumModalityCosts(cachedModalityCounts, pricing.cachedByModalityPerMillion, cachedRate)\n : (cachedTokens / 1_000_000) * cachedRate;\n const outputCost = hasOutputModalityPricing\n ? sumModalityCosts(completionModalityCounts, pricing.outputByModalityPerMillion, outputRate)\n : (billableOutputTokens / 1_000_000) * outputRate;\n const imageCost = imageCount * (pricing.outputImagePerImage ?? 0);\n\n return Number((inputCost + cachedCost + outputCost + imageCost).toFixed(12));\n}\n","import { z } from 'zod';\n\nexport const googleProviderOptions = z.object({\n candidateCount: z.number().int().min(1).max(8).optional(),\n responseModalities: z.array(z.enum(['TEXT', 'IMAGE', 'AUDIO'])).optional(),\n mediaResolution: z.string().optional(),\n cachedContent: z.string().optional(),\n enableEnhancedCivicAnswers: z.boolean().optional(),\n labels: z.record(z.string(), z.string()).optional(),\n safetySettings: z.array(z.record(z.string(), z.unknown())).optional(),\n thinkingConfig: z.record(z.string(), z.unknown()).optional(),\n imageConfig: z.record(z.string(), z.unknown()).optional(),\n\n numberOfImages: z.number().int().min(1).max(4).optional(),\n negativePrompt: z.string().optional(),\n aspectRatio: z.string().optional(),\n guidanceScale: z.number().optional(),\n safetyFilterLevel: z.string().optional(),\n personGeneration: z.string().optional(),\n includeSafetyAttributes: z.boolean().optional(),\n includeRaiReason: z.boolean().optional(),\n language: z.string().optional(),\n outputMimeType: z.string().optional(),\n outputCompressionQuality: z.number().int().optional(),\n addWatermark: z.boolean().optional(),\n imageSize: z.string().optional(),\n enhancePrompt: z.boolean().optional(),\n editMode: z.string().optional(),\n baseSteps: z.number().int().optional(),\n}).passthrough();\n\nexport type GoogleProviderOptions = z.infer<typeof googleProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions } from '@standardagents/spec';\nimport { GoogleProvider } from './GoogleProvider';\nimport { googleProviderOptions } from './providerOptions';\n\n/**\n * Google Gemini / Imagen provider factory for Standard Agents.\n */\nexport const google: ProviderFactoryWithOptions<typeof googleProviderOptions> = Object.assign(\n (config: ProviderFactoryConfig) => new GoogleProvider(config),\n { providerOptions: googleProviderOptions }\n);\n\nexport { googleProviderOptions, type GoogleProviderOptions } from './providerOptions';\nexport { GoogleProvider } from './GoogleProvider';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBP,SAAS,qBAAqB;;;ACxB9B,IAAM,cAAc;AAEb,SAAS,aAAa,KAAqB;AAChD,SAAO,oCAAoC,mBAAmB,GAAG,CAAC;AACpE;AAEO,SAAS,uBAA+B;AAC7C,SAAO,aAAa,WAAW;AACjC;;;ACeA,IAAM,gBAAoD;AAAA,EACxD,wBAAwB;AAAA,IACtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB;AAAA,EACA,0BAA0B;AAAA,IACxB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B,sBAAsB;AAAA,EACxB;AAAA,EACA,kBAAkB;AAAA,IAChB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B,sBAAsB;AAAA,EACxB;AAAA,EACA,oBAAoB;AAAA,IAClB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB;AAAA,EACA,yBAAyB;AAAA,IACvB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB;AAAA,EACA,0BAA0B;AAAA,IACxB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iCAAiC;AAAA,IAC/B,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,qCAAqC;AAAA,IACnC,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB;AAAA,EACA,oBAAoB;AAAA,IAClB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,wBAAwB;AAAA,IACtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,yBAAyB;AAAA,IACvB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,6BAA6B;AAAA,IAC3B,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAAA,EACA,2CAA2C;AAAA,IACzC,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,EACxB;AAAA,EACA,gCAAgC;AAAA,IAC9B,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,4BAA4B;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,4BAA4B;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,kCAAkC;AAAA,IAChC,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,2BAA2B;AAAA,MACzB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB;AAAA,EACA,kCAAkC;AAAA,IAChC,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,EACvB;AAAA,EACA,8BAA8B;AAAA,IAC5B,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,EACvB;AAAA,EACA,2BAA2B;AAAA,IACzB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,EACvB;AAAA,EACA,2BAA2B;AAAA,IACzB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB;AAAA,EACA,gCAAgC;AAAA,IAC9B,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB;AAAA,EACA,iCAAiC;AAAA,IAC/B,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB;AAAA,EACA,6BAA6B;AAAA,IAC3B,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB;AAAA,EACA,kBAAkB;AAAA,IAChB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB;AACF;AAEA,IAAM,yBAAiF;AAAA,EACrF;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,wBAAwB;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,sBAAsB;AAAA,EAC/C;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,wBAAwB;AAAA,EACjD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,+BAA+B;AAAA,EACxD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,uBAAuB;AAAA,EAChD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,kBAAkB;AAAA,EAC3C;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,uBAAuB;AAAA,EAChD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS,cAAc,gBAAgB;AAAA,EACzC;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IACzB;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IACzB;AAAA,EACF;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,SAAyB;AACvD,SAAO,QACJ,KAAK,EACL,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,aAAa,EAAE,EACvB,QAAQ,iCAAiC,EAAE;AAChD;AAEA,SAAS,kBAAkB,UAAqD;AAC9E,QAAM,cAAc,YAAY,IAAI,KAAK,EAAE,YAAY;AAEvD,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,eAAe,QAAS,QAAO;AACnC,MAAI,eAAe,QAAS,QAAO;AACnC,MAAI,eAAe,QAAS,QAAO;AACnC,MAAI,eAAe,WAAY,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,iBACP,SACgD;AAChD,QAAM,SAAyD,CAAC;AAEhE,aAAW,UAAU,WAAW,CAAC,GAAG;AAClC,UAAM,WAAW,kBAAkB,OAAO,QAAQ;AAClD,UAAM,aAAa,KAAK,IAAI,OAAO,cAAc,GAAG,CAAC;AACrD,WAAO,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,QACA,eACA,aACQ;AACR,MAAI,QAAQ;AAEZ,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3D,QAAI,CAAC,WAAY;AACjB,UAAM,OAAO,gBAAgB,QAAiC,KAAK;AACnE,aAAU,aAAa,MAAa;AAAA,EACtC;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,SAAiD;AACrF,QAAM,oBAAoB,uBAAuB,OAAO;AACxD,QAAM,QAAQ,cAAc,iBAAiB;AAC7C,MAAI,MAAO,QAAO;AAElB,SAAO,uBAAuB,KAAK,CAAC,UAAU,kBAAkB,WAAW,MAAM,MAAM,CAAC,GAAG;AAC7F;AAEO,SAAS,yBACd,SACA,OAKA,aAAa,GACO;AACpB,QAAM,UAAU,sBAAsB,OAAO;AAC7C,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,uBAAuB,KAAK,IAAI,GAAG,MAAM,eAAe,YAAY;AAC1E,QAAM,iBAAiB,QAAQ,wBAAwB,QAAQ,MAAM,eAAe,QAAQ;AAE5F,QAAM,YAAY,iBAAkB,QAAQ,uBAAuB,QAAQ,kBAAmB,QAAQ;AACtG,QAAM,aAAa,iBACd,QAAQ,wBAAwB,QAAQ,oBAAoB,IAC5D,QAAQ,oBAAoB;AACjC,QAAM,aAAa,iBACd,QAAQ,6BAA6B,QAAQ,yBAAyB,IACtE,QAAQ,yBAAyB;AACtC,QAAM,uBAAuB,MAAM,oBAAoB,MAAM,mBAAmB;AAChF,QAAM,uBAAuB,iBAAiB,MAAM,kBAAkB;AACtE,QAAM,uBAAuB,iBAAiB,MAAM,kBAAkB;AACtE,QAAM,+BAA+E,CAAC;AAEtF,aAAW,YAAY,oBAAI,IAA2B;AAAA,IACpD,GAAG,OAAO,KAAK,oBAAoB;AAAA,IACnC,GAAG,OAAO,KAAK,oBAAoB;AAAA,EACrC,CAAC,GAAG;AACF,iCAA6B,QAAQ,IAAI,KAAK;AAAA,OAC3C,qBAAqB,QAAQ,KAAK,MAAM,qBAAqB,QAAQ,KAAK;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAA2B,iBAAiB,MAAM,sBAAsB;AAC9E,MAAI,MAAM,iBAAiB;AACzB,6BAAyB,QAAQ,yBAAyB,QAAQ,KAAK,MAAM;AAAA,EAC/E;AAEA,QAAM,2BAA2B,OAAO,KAAK,4BAA4B,EAAE,SAAS,KAAK,QAAQ;AACjG,QAAM,2BAA2B,OAAO,KAAK,oBAAoB,EAAE,SAAS,KAAK,QAAQ;AACzF,QAAM,2BAA2B,OAAO,KAAK,wBAAwB,EAAE,SAAS,KAAK,QAAQ;AAE7F,QAAM,YAAY,2BACd,iBAAiB,8BAA8B,QAAQ,2BAA2B,SAAS,IAC1F,uBAAuB,MAAa;AACzC,QAAM,aAAa,2BACf,iBAAiB,sBAAsB,QAAQ,4BAA4B,UAAU,IACpF,eAAe,MAAa;AACjC,QAAM,aAAa,2BACf,iBAAiB,0BAA0B,QAAQ,4BAA4B,UAAU,IACxF,uBAAuB,MAAa;AACzC,QAAM,YAAY,cAAc,QAAQ,uBAAuB;AAE/D,SAAO,QAAQ,YAAY,aAAa,aAAa,WAAW,QAAQ,EAAE,CAAC;AAC7E;;;AFhWA,IAAM,gBAA0C;AAAA,EAC9C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB,EAAE,GAAG,MAAM,KAAK,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB,EAAE,GAAG,MAAM,IAAI,UAAU,KAAK,OAAO;AAAA,IACxD;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,QACJ,KAAK,EACL,QAAQ,aAAa,EAAE,EACvB,QAAQ,aAAa,EAAE,EACvB,QAAQ,iCAAiC,EAAE;AAChD;AAEA,SAAS,cAAc,SAA0B;AAC/C,SAAO,iBAAiB,OAAO,EAAE,WAAW,SAAS;AACvD;AAEA,SAAS,qBAAqB,OAAoB,cAA+B;AAC/E,QAAM,eAAe,MAAM,eAAe,IAAI,YAAY;AAE1D,MAAI,cAAc,YAAY,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,SAAS,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,SAAS,KAAK,aAAa,WAAW,SAAS,GAAG;AAC5E,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,cAAc,SAAS,UAAU,SAAS,OAAO,EAAE,KAAK,CAAC,SAAS,YAAY,SAAS,IAAI,CAAC;AACtG;AAEA,SAAS,wBAAwB,cAA+B;AAC9D,SAAO,aAAa,WAAW,SAAS,KAAK,aAAa,WAAW,eAAe;AACtF;AAEA,SAAS,2BAA2B,OAAoB,cAAiE;AACvH,MAAI,CAAC,MAAM,SAAU,QAAO;AAE5B,MAAI,aAAa,WAAW,QAAQ,GAAG;AACrC,WAAO,EAAE,GAAG,MAAM,KAAK,OAAO;AAAA,EAChC;AAEA,SAAO,EAAE,GAAG,MAAM,IAAI,UAAU,KAAK,OAAO;AAC9C;AAEA,SAAS,uBAAuB,OAAuC;AACrE,QAAM,eAAe,iBAAiB,MAAM,QAAQ,MAAM,eAAe,EAAE;AAC3E,QAAM,mBAAmB,IAAI,IAAI,MAAM,oBAAoB,CAAC,CAAC;AAC7D,QAAM,4BAA4B,iBAAiB,IAAI,iBAAiB,KAAK,aAAa,WAAW,SAAS,KAAK,aAAa,WAAW,QAAQ;AACnJ,QAAM,gBAAgB,wBAAwB,YAAY;AAE1D,SAAO;AAAA,IACL,gBAAgB,qBAAqB,OAAO,YAAY;AAAA,IACxD,mBAAmB;AAAA,IACnB,mBAAmB,6BAA6B,CAAC,cAAc,YAAY;AAAA,IAC3E,kBAAkB;AAAA,IAClB,kBAAkB,MAAM;AAAA,IACxB,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,2BAA2B,OAAO,YAAY;AAAA,EACjE;AACF;AAEA,SAAS,oBAAoB,OAAuC;AAClE,QAAM,KAAK,iBAAiB,MAAM,QAAQ,MAAM,eAAe,EAAE;AACjE,SAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM,eAAe;AAAA,IAC3B,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,QAAQ,qBAAqB;AAAA,IAC7B,MAAM;AAAA,EACR;AACF;AAEA,SAAS,gBAAgB,OAAiD;AACxE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,QAAyH;AACnJ,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,MAAM,0BAA0B,KAAK;AAAA,EAChD;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,MAAM,0BAA0B,KAAK;AAAA,EAChD;AACA,MAAI,WAAW,YAAY;AACzB,WAAO,EAAE,MAAM,0BAA0B,IAAI;AAAA,EAC/C;AACA,MAAI,UAAU,OAAO,WAAW,YAAY,UAAU,QAAQ;AAC5D,WAAO;AAAA,MACL,MAAM,0BAA0B;AAAA,MAChC,sBAAsB,CAAC,OAAO,IAAI;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAsD;AAC5E,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,SAAO,CAAC;AAAA,IACN,sBAAsB,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,MAAM,KAAK,SAAS;AAAA,MACpB,aAAa,KAAK,SAAS;AAAA,MAC3B,YAAY,KAAK,SAAS,cAAc;AAAA,QACtC,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,MACb;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AACH;AAEA,SAAS,qBACP,MACA,WACsC;AACtC,QAAM,QAAQ,QAAQ;AACtB,QAAM,QAAQ,MAAM,MAAM,4BAA4B;AACtD,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,MAAM,OAAO,UAAU;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,CAAC;AAAA,IACb,WAAW,MAAM,CAAC,KAAK;AAAA,EACzB;AACF;AAEA,SAAS,eAAe,SAA6D;AACnF,MAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,WAAO,CAAC,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,EACnC;AAEA,SAAO,QAAQ,QAAQ,IAAI,CAAC,SAAc;AACxC,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,EAAE,MAAM,KAAK,KAAK;AAAA,IAC3B;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,aAAa,qBAAqB,KAAK,MAAM,KAAK,aAAa,WAAW;AAChF,aAAO,qBAAqB,WAAW,MAAM,WAAW,aAAa,WAAW;AAAA,IAClF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,MAAM,KAAK,WAAW,OAAO;AACnC,UAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,cAAM,QAAQ,IAAI,MAAM,4BAA4B;AACpD,YAAI,OAAO;AACT,iBAAO,qBAAqB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,QAChD;AAAA,MACF;AACA,aAAO;AAAA,QACL,UAAU;AAAA,UACR,UAAU;AAAA,UACV,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY;AAAA,QACV,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAkE;AAC7F,QAAM,QAAgB,CAAC;AAEvB,MAAI,QAAQ,SAAS;AACnB,UAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,EACtC;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,KAAK,EAAE,MAAM,QAAQ,WAAW,SAAS,KAAK,CAAC;AAAA,EACvD;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAC7B,eAAW,YAAY,QAAQ,WAAW;AACxC,YAAM,KAAK;AAAA,QACT,cAAc;AAAA,UACZ,IAAI,SAAS;AAAA,UACb,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAA6D;AACnF,QAAM,WAAoC,CAAC;AAE3C,MAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,aAAS,SAAS,QAAQ;AAAA,EAC5B,WAAW,UAAU,QAAQ,SAAS;AACpC,QAAI,QAAQ,QAAQ,SAAS,OAAQ,UAAS,SAAS,QAAQ,QAAQ;AAAA,aAC9D,QAAQ,QAAQ,SAAS,QAAS,UAAS,QAAQ,QAAQ,QAAQ;AAAA,QACvE,UAAS,SAAS,QAAQ;AAAA,EACjC,OAAO;AACL,aAAS,SAAS,QAAQ;AAAA,EAC5B;AAEA,QAAM,aAAa,QAAQ,aACvB,OAAO,CAAC,eAAoB,WAAW,SAAS,WAAW,WAAW,IAAI,EAC3E,IAAI,CAAC,YAAiB,UAAkB;AACvC,UAAM,aAAa,qBAAqB,WAAW,MAAM,WAAW,SAAS;AAC7E,WAAO;AAAA,MACL,YAAY;AAAA,QACV,UAAU,WAAW;AAAA,QACrB,MAAM,WAAW;AAAA,MACnB;AAAA,MACA,cAAc,EAAE,iBAAiB,MAAM;AAAA,IACzC;AAAA,EACF,CAAC,KAAK,CAAC;AAET,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,SAAS,WAAW,IAAI,CAAC,UAAe,EAAE,YAAY,KAAK,WAAW,EAAE,IAAI;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAA2E;AAChG,QAAM,WAAkB,CAAC;AACzB,QAAM,iBAAiB,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,EAAE,IAAI,CAAC,YAAY,QAAQ,OAAO;AAC/G,QAAM,oBAAoB,eAAe,SACrC,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,eAAe,KAAK,MAAM,EAAE,CAAC,EAAE,IAC/D;AAEJ,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,SAAU;AAC/B,QAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,eAAe,OAAO,EAAE,CAAC;AAC9D;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,aAAa;AAChC,eAAS,KAAK,EAAE,MAAM,SAAS,OAAO,oBAAoB,OAAO,EAAE,CAAC;AACpE;AAAA,IACF;AACA,aAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,eAAe,OAAO,EAAE,CAAC;AAAA,EAChE;AAEA,SAAO,EAAE,mBAAmB,SAAS;AACvC;AAEA,SAAS,0BAA0B,OAA0C;AAC3E,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,OAAO,MACV,OAAO,CAAC,SAAc,KAAK,WAAW,OAAO,KAAK,SAAS,QAAQ,EACnE,IAAI,CAAC,SAAc,KAAK,IAAI,EAC5B,KAAK,EAAE;AACV,SAAO,QAAQ;AACjB;AAEA,SAAS,uBAAuB,OAAiE;AAC/F,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,SAAS,MACZ,OAAO,CAAC,SAAc,KAAK,YAAY,UAAU,WAAW,QAAQ,CAAC,EACrE,IAAI,CAAC,MAAW,WAAmB;AAAA,IAClC,IAAI,SAAS,KAAK;AAAA,IAClB,MAAM,KAAK,YAAY,QAAQ;AAAA,IAC/B,WAAW,KAAK,YAAY,YAAY;AAAA,EAC1C,EAAE;AACJ,SAAO,OAAO,SAAS,SAAS;AAClC;AAEA,SAAS,iBAAiB,OAA+D;AACvF,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,YAAY,MACf,OAAO,CAAC,SAAc,KAAK,cAAc,IAAI,EAC7C,IAAI,CAAC,UAAe;AAAA,IACnB,IAAI,KAAK,cAAc,MAAM,OAAO,WAAW;AAAA,IAC/C,MAAM,KAAK,cAAc,QAAQ;AAAA,IACjC,WAAY,KAAK,cAAc,QAAQ,CAAC;AAAA,EAC1C,EAAE;AAEJ,SAAO,UAAU,SAAS,YAAY;AACxC;AAEA,SAAS,eAAe,SAAiB,OAAY,aAAa,GAAkB;AAClF,QAAM,SAAwB;AAAA,IAC5B,cAAc,OAAO,oBAAoB;AAAA,IACzC,kBAAkB,OAAO,wBAAwB;AAAA,IACjD,aAAa,OAAO,mBAAmB;AAAA,IACvC,iBAAiB,OAAO;AAAA,IACxB,cAAc,OAAO;AAAA,IACrB,UAAU;AAAA,EACZ;AAEA,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,oBAAoB,OAAO;AAAA,MAC3B,wBAAwB,OAAO,2BAA2B,OAAO;AAAA,MACjE,oBAAoB,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,iBAAN,MAAM,gBAAmC;AAAA,EACrC,OAAO;AAAA,EACP,uBAAuB;AAAA,EAEf;AAAA,EACT,SAA6B;AAAA,EAErC,OAAwB,WAAW,IAAI,KAAK;AAAA,EAC5C,OAAe,cAA0C;AAAA,EACzD,OAAe,kBAAkB;AAAA,EACjC,OAAe,qBAAqB,oBAAI,IAAyB;AAAA,EAEjE,YAAY,QAA+B;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,YAAyB;AAC/B,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,IAAI,YAAY;AAAA,QAC5B,QAAQ,KAAK,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,SAA0B;AACtC,WAAO,QAAQ,WAAW,SAAS,KAC9B,QAAQ,WAAW,QAAQ,KAC3B,QAAQ,WAAW,SAAS,KAC5B,QAAQ,WAAW,SAAS;AAAA,EACnC;AAAA,EAEA,QAAQ,UAA2B;AACjC,WAAO,qBAAqB;AAAA,EAC9B;AAAA,EAEQ,iBAAsD;AAC5D,QAAI,CAAC,KAAK,OAAO,WAAW,CAAC,KAAK,OAAO,QAAS,QAAO;AAEzD,WAAO;AAAA,MACL,GAAI,KAAK,OAAO,UAAU,EAAE,SAAS,KAAK,OAAO,QAAQ,IAAI,CAAC;AAAA,MAC9D,GAAI,KAAK,OAAO,UAAU,EAAE,SAAS,KAAK,OAAO,QAAQ,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAA+C;AAC7D,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,gBAAe,eAAe,MAAM,gBAAe,kBAAkB,gBAAe,UAAU;AAChG,aAAO,KAAK,aAAa,gBAAe,aAAa,MAAM;AAAA,IAC7D;AAEA,QAAI;AACF,YAAM,SAA8B,CAAC;AACrC,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,QAAQ,MAAM,OAAO,OAAO,KAAK;AAAA,QACrC,QAAQ;AAAA,UACN,aAAa,KAAK,eAAe;AAAA,QACnC;AAAA,MACF,CAAQ;AAER,uBAAiB,SAAS,OAAqC;AAC7D,cAAM,KAAK,iBAAiB,MAAM,QAAQ,EAAE;AAC5C,YAAI,CAAC,GAAI;AACT,cAAM,qBAAqB,MAAM,kBAAkB;AAAA,UAAK,CAAC,WACvD,CAAC,mBAAmB,kBAAkB,aAAa,SAAS,EAAE,SAAS,MAAM;AAAA,QAC/E;AACA,YAAI,CAAC,mBAAoB;AACzB,wBAAe,mBAAmB,IAAI,IAAI,KAAK;AAC/C,eAAO,KAAK,oBAAoB,KAAK,CAAC;AAAA,MACxC;AAEA,iBAAW,eAAe,eAAe;AACvC,YAAI,CAAC,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,YAAY,EAAE,GAAG;AACxD,iBAAO,KAAK;AAAA,YACV,IAAI,YAAY;AAAA,YAChB,MAAM,YAAY;AAAA,YAClB,aAAa,YAAY;AAAA,YACzB,QAAQ,KAAK,QAAQ,YAAY,EAAE;AAAA,YACnC,MAAM,YAAY;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,sBAAe,cAAc,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC/E,sBAAe,kBAAkB;AACjC,aAAO,KAAK,aAAa,gBAAe,aAAa,MAAM;AAAA,IAC7D,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,aAAO,KAAK;AAAA,QACV,cAAc,IAAI,CAAC,WAAW;AAAA,UAC5B,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,UAC7B,MAAM,MAAM;AAAA,QACd,EAAE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,QAA6B,QAAsC;AACtF,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,OAAO,YAAY;AACjC,WAAO,OAAO;AAAA,MAAO,CAAC,UACpB,MAAM,GAAG,YAAY,EAAE,SAAS,KAAK,KACrC,MAAM,KAAK,YAAY,EAAE,SAAS,KAAK,MACtC,MAAM,aAAa,YAAY,EAAE,SAAS,KAAK,KAAK;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,SAA8C;AAC3E,UAAM,aAAa,iBAAiB,OAAO;AAC3C,UAAM,SAAS,gBAAe,mBAAmB,IAAI,UAAU;AAC/D,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI;AAAA,QAC9C,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,aAAa,KAAK,eAAe;AAAA,QACnC;AAAA,MACF,CAAQ;AACR,sBAAe,mBAAmB,IAAI,YAAY,KAAK;AACvD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,SAAoD;AAC7E,UAAM,aAAa,iBAAiB,OAAO;AAC3C,UAAM,cAAc,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU;AACzE,QAAI,aAAa;AACf,aAAO,EAAE,GAAG,YAAY,aAAa;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,iBAAiB,UAAU;AACvD,UAAI,UAAU;AACZ,eAAO,uBAAuB,QAAQ;AAAA,MACxC;AAEA,YAAM,SAAS,MAAM,KAAK,UAAU;AACpC,YAAM,QAAQ,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU;AAC5D,UAAI,CAAC,MAAO,QAAO;AAEnB,aAAO;AAAA,QACL,gBAAgB,WAAW,WAAW,SAAS,KAAK,WAAW,WAAW,QAAQ,KAAK,WAAW,SAAS,OAAO;AAAA,QAClH,mBAAmB,wBAAwB,UAAU;AAAA,QACrD,mBAAmB,CAAC,cAAc,UAAU;AAAA,QAC5C,kBAAkB,wBAAwB,UAAU;AAAA,QACpD,kBAAkB,MAAM;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,2BAA2B,SAAmD;AACpF,UAAM,kBAAmB,QAAQ,mBAAmB,CAAC;AACrD,UAAM,EAAE,mBAAmB,SAAS,IAAI,cAAc,QAAQ,QAAQ;AAEtE,UAAM,SAAkC;AAAA,MACtC,GAAI,KAAK,eAAe,IAAI,EAAE,aAAa,KAAK,eAAe,EAAE,IAAI,CAAC;AAAA,MACtE,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,GAAI,OAAO,QAAQ,gBAAgB,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,MACtF,GAAI,OAAO,QAAQ,SAAS,WAAW,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MACjE,GAAI,OAAO,QAAQ,SAAS,WAAW,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MACjE,GAAI,OAAO,QAAQ,oBAAoB,WAAW,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,MAClG,GAAI,QAAQ,eAAe,SAAS,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC;AAAA,MAChF,GAAI,QAAQ,gBAAgB,SAAS,SACjC;AAAA,QACE,kBAAkB;AAAA,QAClB,GAAI,QAAQ,eAAe,SAAS,EAAE,oBAAoB,QAAQ,eAAe,OAAO,IAAI,CAAC;AAAA,MAC/F,IACA,CAAC;AAAA,MACL,GAAI,QAAQ,OAAO,SAAS,EAAE,OAAO,eAAe,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,MACxE,GAAI,QAAQ,OAAO,UAAU,mBAAmB,QAAQ,UAAU,IAC9D,EAAE,YAAY,EAAE,uBAAuB,mBAAmB,QAAQ,UAAU,EAAE,EAAE,IAChF,CAAC;AAAA,MACL,GAAI,OAAO,gBAAgB,mBAAmB,WAAW,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,MAC/G,GAAI,MAAM,QAAQ,gBAAgB,kBAAkB,IAAI,EAAE,oBAAoB,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,MACtH,GAAI,OAAO,gBAAgB,oBAAoB,WAAW,EAAE,iBAAiB,gBAAgB,gBAAgB,IAAI,CAAC;AAAA,MAClH,GAAI,OAAO,gBAAgB,kBAAkB,WAAW,EAAE,eAAe,gBAAgB,cAAc,IAAI,CAAC;AAAA,MAC5G,GAAI,OAAO,gBAAgB,+BAA+B,YACtD,EAAE,4BAA4B,gBAAgB,2BAA2B,IACzE,CAAC;AAAA,MACL,GAAI,gBAAgB,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,MACnE,GAAI,gBAAgB,iBAAiB,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,MAC3F,GAAI,gBAAgB,iBAAiB,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,MAC3F,GAAI,gBAAgB,cAAc,EAAE,aAAa,gBAAgB,YAAY,IAAI,CAAC;AAAA,MAClF,GAAI,OAAO,QAAQ,WAAW,cAAc,WACxC,EAAE,gBAAgB,EAAE,GAAI,gBAAgB,kBAA6C,CAAC,GAAI,gBAAgB,QAAQ,UAAU,UAAU,EAAE,IACxI,CAAC;AAAA,IACP;AAEA,WAAO;AAAA,MACL,OAAO,iBAAiB,QAAQ,KAAK;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAI3B;AACA,UAAM,kBAAmB,QAAQ,mBAAmB,CAAC;AACrD,UAAM,aAAa,CAAC,GAAG,QAAQ,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AAC5F,UAAM,SAAS,aAAc,OAAO,WAAW,YAAY,WACvD,WAAW,UACX,WAAW,QAAQ,OAAO,CAAC,SAAc,KAAK,SAAS,MAAM,EAAE,IAAI,CAAC,SAAc,KAAK,IAAI,EAAE,KAAK,IAAI,IAAK;AAE/G,UAAM,kBAAkB,cAAc,OAAO,WAAW,YAAY,WAChE,WAAW,QACR,OAAO,CAAC,SAAc,KAAK,SAAS,OAAO,EAC3C,IAAI,CAAC,MAAW,UAAkB;AACjC,YAAM,aAAa,qBAAqB,KAAK,MAAM,KAAK,SAAS;AACjE,YAAM,QAAQ,IAAI,kBAAkB;AACpC,YAAM,cAAc,QAAQ;AAC5B,YAAM,iBAAiB;AAAA,QACrB,YAAY,WAAW;AAAA,QACvB,UAAU,WAAW;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC,IACH,CAAC;AAEL,UAAM,OAAgC;AAAA,MACpC,OAAO,iBAAiB,QAAQ,KAAK;AAAA,MACrC;AAAA,MACA,GAAI,gBAAgB,SAAS,EAAE,iBAAiB,0BAA0B,IAAI,CAAC;AAAA,MAC/E,QAAQ;AAAA,QACN,GAAI,KAAK,eAAe,IAAI,EAAE,aAAa,KAAK,eAAe,EAAE,IAAI,CAAC;AAAA,QACtE,GAAI,OAAO,gBAAgB,mBAAmB,WAAW,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,QAC/G,GAAI,OAAO,gBAAgB,mBAAmB,WAAW,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,QAC/G,GAAI,OAAO,gBAAgB,gBAAgB,WAAW,EAAE,aAAa,gBAAgB,YAAY,IAAI,CAAC;AAAA,QACtG,GAAI,OAAO,gBAAgB,kBAAkB,WAAW,EAAE,eAAe,gBAAgB,cAAc,IAAI,CAAC;AAAA,QAC5G,GAAI,OAAO,gBAAgB,SAAS,WAAW,EAAE,MAAM,gBAAgB,KAAK,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,gBAAgB,sBAAsB,WAAW,EAAE,mBAAmB,gBAAgB,kBAAkB,IAAI,CAAC;AAAA,QACxH,GAAI,OAAO,gBAAgB,qBAAqB,WAAW,EAAE,kBAAkB,gBAAgB,iBAAiB,IAAI,CAAC;AAAA,QACrH,GAAI,OAAO,gBAAgB,4BAA4B,YAAY,EAAE,yBAAyB,gBAAgB,wBAAwB,IAAI,CAAC;AAAA,QAC3I,GAAI,OAAO,gBAAgB,qBAAqB,YAAY,EAAE,kBAAkB,gBAAgB,iBAAiB,IAAI,CAAC;AAAA,QACtH,GAAI,OAAO,gBAAgB,aAAa,WAAW,EAAE,UAAU,gBAAgB,SAAS,IAAI,CAAC;AAAA,QAC7F,GAAI,OAAO,gBAAgB,mBAAmB,WAAW,EAAE,gBAAgB,gBAAgB,eAAe,IAAI,CAAC;AAAA,QAC/G,GAAI,OAAO,gBAAgB,6BAA6B,WAAW,EAAE,0BAA0B,gBAAgB,yBAAyB,IAAI,CAAC;AAAA,QAC7I,GAAI,OAAO,gBAAgB,iBAAiB,YAAY,EAAE,cAAc,gBAAgB,aAAa,IAAI,CAAC;AAAA,QAC1G,GAAI,gBAAgB,SAAS,EAAE,QAAQ,gBAAgB,OAAO,IAAI,CAAC;AAAA,QACnE,GAAI,OAAO,gBAAgB,cAAc,WAAW,EAAE,WAAW,gBAAgB,UAAU,IAAI,CAAC;AAAA,QAChG,GAAI,OAAO,gBAAgB,kBAAkB,YAAY,EAAE,eAAe,gBAAgB,cAAc,IAAI,CAAC;AAAA,QAC7G,GAAI,OAAO,gBAAgB,aAAa,WAAW,EAAE,UAAU,gBAAgB,SAAS,IAAI,CAAC;AAAA,QAC7F,GAAI,OAAO,gBAAgB,cAAc,WAAW,EAAE,WAAW,gBAAgB,UAAU,IAAI,CAAC;AAAA,MAClG;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,iBAAiB,gBAAgB,SAAS,kBAAkB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAAqD;AACxE,QAAI,cAAc,QAAQ,KAAK,GAAG;AAChC,YAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,cAAc;AAAA,QACd,UAAU;AAAA,UACR,UAAU,OAAO,iBAAiB,SAC9B,GAAG,KAAK,OAAO,WAAW,2CAA2C,eACrE,GAAG,KAAK,OAAO,WAAW,2CAA2C;AAAA,UACzE,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,KAAK,2BAA2B,OAAO;AAAA,MAC7C,cAAc;AAAA,MACd,UAAU;AAAA,QACR,UAAU,GAAG,KAAK,OAAO,WAAW,2CAA2C;AAAA,QAC/E,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAqD;AAClE,QAAI,cAAc,QAAQ,KAAK,GAAG;AAChC,aAAO,KAAK,eAAe,OAAO;AAAA,IACpC;AAEA,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,WAAW,MAAM,OAAO,OAAO,gBAAgB,KAAK,2BAA2B,OAAO,CAAQ;AACpG,YAAM,YAAY,SAAS,aAAa,CAAC;AACzC,YAAM,QAAQ,WAAW,SAAS;AAClC,YAAM,SAAS,uBAAuB,KAAK;AAC3C,YAAM,QAAQ,eAAe,iBAAiB,QAAQ,KAAK,GAAG,SAAS,eAAe,QAAQ,UAAU,CAAC;AAEzG,aAAO;AAAA,QACL,SAAS,SAAS,QAAQ;AAAA,QAC1B,WAAW,0BAA0B,KAAK;AAAA,QAC1C,kBAAkB,0BAA0B,KAAK,IAC7C,CAAC,EAAE,MAAM,QAAQ,MAAM,0BAA0B,KAAK,KAAK,QAAW,QAAQ,mBAAmB,CAAC,IAClG;AAAA,QACJ,WAAW,iBAAiB,KAAK;AAAA,QACjC;AAAA,QACA,cAAc,gBAAgB,WAAW,YAAY;AAAA,QACrD;AAAA,QACA,UAAU;AAAA,UACR,UAAU;AAAA,UACV,YAAY,SAAS;AAAA,UACrB,cAAc,SAAS;AAAA,UACvB,gBAAgB,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAAqD;AAChF,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,YAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAE5C,YAAM,WAAW,OAAO,iBAAiB,SACrC,MAAM,OAAO,OAAO,UAAU;AAAA,QAC5B;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,iBAAiB,OAAO;AAAA,QACxB,QAAQ,OAAO,KAAK;AAAA,MACtB,CAAC,IACD,MAAM,OAAO,OAAO,eAAe;AAAA,QACjC;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO,KAAK;AAAA,MACtB,CAAC;AAEL,YAAM,UAAoC,SAAS,mBAAmB,CAAC,GACpE,OAAO,CAAC,UAAe,MAAM,OAAO,UAAU,EAC9C,IAAI,CAAC,OAAY,WAAmB;AAAA,QACnC,IAAI,SAAS,KAAK;AAAA,QAClB,MAAM,MAAM,OAAO,cAAc;AAAA,QACjC,WAAW,MAAM,OAAO,YAAY;AAAA,QACpC,eAAe,MAAM;AAAA,MACvB,EAAE;AAEJ,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd,OAAO;AAAA,UACL,cAAc;AAAA,UACd,kBAAkB;AAAA,UAClB,aAAa;AAAA,UACb,MAAM,yBAAyB,OAAO,EAAE,cAAc,GAAG,kBAAkB,GAAG,cAAc,EAAE,GAAG,OAAO,MAAM;AAAA,UAC9G,UAAU;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAuE;AAClF,QAAI,cAAc,QAAQ,KAAK,GAAG;AAChC,YAAM,IAAI,cAAc,8DAA8D,iBAAiB;AAAA,IACzG;AAEA,UAAM,OAAO;AAEb,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,SAAS,MAAM,OAAO,OAAO,sBAAsB,KAAK,2BAA2B,OAAO,CAAQ;AAExG,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,cAAI,aAAa;AACjB,cAAI,eAAe;AACnB,cAAI,eAAqC;AACzC,cAAI,aAA4B;AAAA,YAC9B,cAAc;AAAA,YACd,kBAAkB;AAAA,YAClB,aAAa;AAAA,YACb,UAAU;AAAA,UACZ;AACA,cAAI,aAAa;AAEjB,cAAI;AACF,6BAAiB,SAAS,QAAQ;AAChC,oBAAM,YAAY,MAAM,aAAa,CAAC;AACtC,oBAAM,QAAQ,WAAW,SAAS,SAAS,CAAC;AAE5C,yBAAW,QAAQ,OAAO;AACxB,oBAAI,KAAK,QAAQ,CAAC,KAAK,SAAS;AAC9B,+BAAa;AACb,wBAAM,EAAE,MAAM,iBAAiB,OAAO,KAAK,KAAK;AAAA,gBAClD,WAAW,KAAK,QAAQ,KAAK,SAAS;AACpC,iCAAe;AACf,wBAAM,EAAE,MAAM,mBAAmB,OAAO,KAAK,KAAK;AAAA,gBACpD,WAAW,KAAK,cAAc,MAAM;AAClC,wBAAM,KAAK,KAAK,aAAa,MAAM,OAAO,WAAW;AACrD,wBAAM,EAAE,MAAM,mBAAmB,IAAI,MAAM,KAAK,aAAa,KAAK;AAClE,wBAAM,EAAE,MAAM,kBAAkB,IAAI,WAAY,KAAK,aAAa,QAAQ,CAAC,EAA8B;AAAA,gBAC3G,WAAW,KAAK,YAAY,UAAU,WAAW,QAAQ,GAAG;AAC1D,wBAAM,QAAgC;AAAA,oBACpC,IAAI,SAAS,UAAU;AAAA,oBACvB,MAAM,KAAK,WAAW,QAAQ;AAAA,oBAC9B,WAAW,KAAK,WAAW,YAAY;AAAA,kBACzC;AACA,wBAAM,EAAE,MAAM,cAAc,OAAO,YAAY,MAAM;AACrD,gCAAc;AAAA,gBAChB;AAAA,cACF;AAEA,kBAAI,MAAM,eAAe;AACvB,6BAAa,eAAe,iBAAiB,QAAQ,KAAK,GAAG,MAAM,eAAe,UAAU;AAAA,cAC9F;AAEA,kBAAI,WAAW,cAAc;AAC3B,+BAAe,gBAAgB,UAAU,YAAY;AAAA,cACvD;AAAA,YACF;AAEA,gBAAI,WAAY,OAAM,EAAE,MAAM,eAAe;AAC7C,gBAAI,aAAc,OAAM,EAAE,MAAM,iBAAiB;AACjD,kBAAM,EAAE,MAAM,UAAU,cAAc,OAAO,WAAW;AAAA,UAC1D,SAAS,OAAO;AACd,kBAAM,EAAE,MAAM,SAAS,OAAO,KAAK,gBAAgB,KAAK,EAAE,QAAQ;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAA+B;AACrD,QAAI,iBAAiB,cAAe,QAAO;AAE3C,QAAI,iBAAiB,OAAO;AAC1B,YAAM,YAAY;AAClB,YAAM,SAAS,UAAU,UAAU,UAAU;AAC7C,UAAI,WAAW,IAAK,QAAO,IAAI,cAAc,MAAM,SAAS,cAAc,MAAM;AAChF,UAAI,WAAW,OAAO,WAAW,IAAK,QAAO,IAAI,cAAc,MAAM,SAAS,cAAc,MAAM;AAClG,UAAI,WAAW,IAAK,QAAO,IAAI,cAAc,MAAM,SAAS,mBAAmB,MAAM;AACrF,UAAI,UAAU,UAAU,IAAK,QAAO,IAAI,cAAc,MAAM,SAAS,gBAAgB,MAAM;AAC3F,UAAI,MAAM,SAAS,aAAc,QAAO,IAAI,cAAc,MAAM,SAAS,SAAS;AAClF,aAAO,IAAI,cAAc,MAAM,SAAS,WAAW,MAAM;AAAA,IAC3D;AAEA,WAAO,IAAI,cAAc,OAAO,KAAK,GAAG,SAAS;AAAA,EACnD;AACF;;;AGv6BA,SAAS,SAAS;AAEX,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxD,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,SAAS,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EACzE,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,4BAA4B,EAAE,QAAQ,EAAE,SAAS;AAAA,EACjD,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClD,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,EACpE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC3D,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAExD,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxD,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,yBAAyB,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9C,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpD,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACvC,CAAC,EAAE,YAAY;;;ACtBR,IAAM,SAAmE,OAAO;AAAA,EACrF,CAAC,WAAkC,IAAI,eAAe,MAAM;AAAA,EAC5D,EAAE,iBAAiB,sBAAsB;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../src/GoogleProvider.ts","../src/icons.ts","../src/pricing.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import {\n GoogleGenAI,\n FunctionCallingConfigMode,\n createPartFromBase64,\n createPartFromFunctionResponse,\n RawReferenceImage,\n} from '@google/genai/web';\nimport type { Model as GoogleModel, Part } from '@google/genai/web';\nimport type {\n InspectedRequest,\n LLMProviderInterface as Provider,\n ModelCapabilities,\n ProviderFactoryConfig,\n ProviderFinishReason,\n ProviderGeneratedImage,\n ProviderMessage,\n ProviderModelInfo,\n ProviderReasoningDetail,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderTool,\n ProviderToolCallPart,\n ProviderUsage,\n} from '@standardagents/spec';\nimport { ProviderError } from '@standardagents/spec';\nimport { getGoogleIconDataUri } from './icons';\nimport { calculateGoogleUsageCost } from './pricing';\n\ninterface GoogleStaticModelEntry {\n id: string;\n name: string;\n description: string;\n capabilities: ModelCapabilities;\n}\n\nconst STATIC_MODELS: GoogleStaticModelEntry[] = [\n {\n id: 'gemma-4-31b-it',\n name: 'Gemma 4 31B IT',\n description: 'Hosted Gemma 4 instruction-tuned model with image input and optional thinking.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 262144,\n reasoningLevels: { 0: null, 100: 'high' },\n },\n },\n {\n id: 'gemini-2.5-pro',\n name: 'Gemini 2.5 Pro',\n description: 'State-of-the-art Gemini model for coding and reasoning.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n reasoningLevels: { 0: null, 50: 'medium', 100: 'high' },\n },\n },\n {\n id: 'gemini-2.5-flash',\n name: 'Gemini 2.5 Flash',\n description: 'Fast multimodal Gemini model for general-purpose tasks.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-2.5-flash-lite',\n name: 'Gemini 2.5 Flash-Lite',\n description: 'Low-cost Gemini model for high-volume workloads.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-2.5-flash-image',\n name: 'Gemini 2.5 Flash Image',\n description: 'Gemini image generation model with native image output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-3-pro-image-preview',\n name: 'Gemini 3 Pro Image Preview',\n description: 'High-end Gemini image-preview model with image generation output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'gemini-3.1-flash-image-preview',\n name: 'Gemini 3.1 Flash Image Preview',\n description: 'Fast Gemini image-preview model with image output.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n maxContextTokens: 1048576,\n },\n },\n {\n id: 'imagen-4.0-generate-001',\n name: 'Imagen 4 Generate',\n description: 'Google Imagen model for image generation.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: false,\n supportsJsonMode: false,\n maxContextTokens: 0,\n },\n },\n {\n id: 'imagen-3.0-capability-001',\n name: 'Imagen 3 Capability',\n description: 'Google Imagen model for image editing.',\n capabilities: {\n supportsImages: true,\n supportsToolCalls: false,\n supportsStreaming: false,\n supportsJsonMode: false,\n maxContextTokens: 0,\n },\n },\n];\n\nfunction normalizeModelId(modelId: string): string {\n return modelId\n .trim()\n .replace(/^google\\//, '')\n .replace(/^models\\//, '')\n .replace(/^publishers\\/google\\/models\\//, '');\n}\n\nfunction supportsGoogleMultimodalFunctionResponses(modelId: string): boolean {\n return normalizeModelId(modelId).startsWith('gemini-3');\n}\n\nfunction supportsGoogleVisionInput(modelId: string): boolean {\n const normalizedId = normalizeModelId(modelId);\n return normalizedId.startsWith('gemini-')\n || normalizedId.startsWith('gemma-3')\n || normalizedId.startsWith('gemma-4');\n}\n\nfunction isImagenModel(modelId: string): boolean {\n return normalizeModelId(modelId).startsWith('imagen-');\n}\n\nfunction supportsGoogleVision(model: GoogleModel, normalizedId: string): boolean {\n const description = (model.description || '').toLowerCase();\n\n if (isImagenModel(normalizedId)) {\n return true;\n }\n\n if (normalizedId.startsWith('gemini-')) {\n return true;\n }\n\n if (normalizedId.startsWith('gemma-3') || normalizedId.startsWith('gemma-4')) {\n return true;\n }\n\n return ['multimodal', 'image', 'vision', 'video', 'audio'].some((term) => description.includes(term));\n}\n\nfunction supportsGoogleToolCalls(normalizedId: string): boolean {\n return normalizedId.startsWith('gemini-') || normalizedId.startsWith('functiongemma');\n}\n\nfunction inferGoogleReasoningLevels(model: GoogleModel, normalizedId: string): Record<number, string | null> | undefined {\n if (!model.thinking) return undefined;\n\n if (normalizedId.startsWith('gemma-')) {\n return { 0: null, 100: 'high' };\n }\n\n return { 0: null, 50: 'medium', 100: 'high' };\n}\n\nfunction mapDynamicCapabilities(model: GoogleModel): ModelCapabilities {\n const normalizedId = normalizeModelId(model.name || model.displayName || '');\n const supportedActions = new Set(model.supportedActions || []);\n const supportsContentGeneration = supportedActions.has('generateContent') || normalizedId.startsWith('gemini-') || normalizedId.startsWith('gemma-');\n const supportsTools = supportsGoogleToolCalls(normalizedId);\n\n return {\n supportsImages: supportsGoogleVision(model, normalizedId),\n supportsToolCalls: supportsTools,\n supportsStreaming: supportsContentGeneration && !isImagenModel(normalizedId),\n supportsJsonMode: supportsTools,\n maxContextTokens: model.inputTokenLimit,\n maxOutputTokens: model.outputTokenLimit,\n reasoningLevels: inferGoogleReasoningLevels(model, normalizedId),\n };\n}\n\nfunction toProviderModelInfo(model: GoogleModel): ProviderModelInfo {\n const id = normalizeModelId(model.name || model.displayName || '');\n return {\n id,\n name: model.displayName || id,\n description: model.description,\n contextLength: model.inputTokenLimit,\n iconId: getGoogleIconDataUri(),\n slug: id,\n };\n}\n\nfunction mapFinishReason(value: string | undefined): ProviderFinishReason {\n switch (value) {\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'IMAGE_SAFETY':\n case 'PROHIBITED_CONTENT':\n case 'IMAGE_PROHIBITED_CONTENT':\n return 'content_filter';\n case 'MALFORMED_FUNCTION_CALL':\n case 'UNEXPECTED_TOOL_CALL':\n return 'error';\n case 'STOP':\n default:\n return 'stop';\n }\n}\n\nfunction toolChoiceToGoogle(choice: ProviderRequest['toolChoice']): { mode: FunctionCallingConfigMode; allowedFunctionNames?: string[] } | undefined {\n if (choice === 'auto') {\n return { mode: FunctionCallingConfigMode.AUTO };\n }\n if (choice === 'none') {\n return { mode: FunctionCallingConfigMode.NONE };\n }\n if (choice === 'required') {\n return { mode: FunctionCallingConfigMode.ANY };\n }\n if (choice && typeof choice === 'object' && 'name' in choice) {\n return {\n mode: FunctionCallingConfigMode.ANY,\n allowedFunctionNames: [choice.name],\n };\n }\n return undefined;\n}\n\nfunction transformTools(tools: ProviderTool[] | undefined): any[] | undefined {\n if (!tools?.length) return undefined;\n\n return [{\n functionDeclarations: tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters || {\n type: 'object',\n properties: {},\n required: [],\n },\n })),\n }];\n}\n\nfunction normalizeInlineBytes(\n data: string | undefined,\n mediaType: string | undefined,\n): { data: string; mediaType?: string } {\n const value = data || '';\n const match = value.match(/^data:([^;]+);base64,(.*)$/);\n if (!match) {\n return { data: value, mediaType };\n }\n\n return {\n data: match[2],\n mediaType: match[1] || mediaType,\n };\n}\n\nfunction buildUserParts(message: Extract<ProviderMessage, { role: 'user' }>): Part[] {\n if (typeof message.content === 'string') {\n return [{ text: message.content }];\n }\n\n return message.content.map((part: any) => {\n if (part.type === 'text') {\n return { text: part.text };\n }\n\n if (part.type === 'image') {\n const normalized = normalizeInlineBytes(part.data, part.mediaType || 'image/png');\n return createPartFromBase64(normalized.data, normalized.mediaType || 'image/png');\n }\n\n if (part.type === 'image_url') {\n const url = part.image_url?.url || '';\n if (url.startsWith('data:')) {\n const match = url.match(/^data:([^;]+);base64,(.*)$/);\n if (match) {\n return createPartFromBase64(match[2], match[1]);\n }\n }\n return {\n fileData: {\n mimeType: 'image/*',\n fileUri: url,\n },\n };\n }\n\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: part.data,\n },\n };\n });\n}\n\nfunction buildAssistantParts(message: Extract<ProviderMessage, { role: 'assistant' }>): Part[] {\n const parts: Part[] = [];\n\n if (message.content) {\n parts.push({ text: message.content });\n }\n\n const reasoningParts = buildGoogleReasoningParts(message.reasoning, message.reasoningDetails);\n if (reasoningParts.length) {\n parts.push(...reasoningParts);\n }\n\n if (message.toolCalls?.length) {\n for (const toolCall of message.toolCalls) {\n const thoughtSignature = getGoogleThoughtSignature(\n toolCall.extraContent,\n message.reasoningDetails,\n toolCall.id\n );\n parts.push({\n functionCall: {\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.arguments,\n },\n ...(thoughtSignature ? { thoughtSignature } : {}),\n });\n }\n }\n\n return parts;\n}\n\nfunction buildToolParts(\n message: Extract<ProviderMessage, { role: 'tool' }>,\n modelId: string\n): Part[] {\n const response: Record<string, unknown> = {};\n\n if (typeof message.content === 'string') {\n response.output = message.content;\n } else if ('type' in message.content) {\n if (message.content.type === 'text') response.output = message.content.text;\n else if (message.content.type === 'error') response.error = message.content.error;\n else response.output = message.content;\n } else {\n response.output = message.content;\n }\n\n const imageParts = message.attachments\n ?.filter((attachment: any) => attachment.type === 'image' && attachment.data)\n .map((attachment: any) => {\n const normalized = normalizeInlineBytes(attachment.data, attachment.mediaType);\n return createPartFromBase64(normalized.data, normalized.mediaType || 'image/png');\n }) || [];\n\n if (supportsGoogleMultimodalFunctionResponses(modelId)) {\n return [\n createPartFromFunctionResponse(\n message.toolCallId,\n message.toolName,\n response,\n imageParts.length ? imageParts : undefined\n ),\n ];\n }\n\n const parts: Part[] = [\n createPartFromFunctionResponse(\n message.toolCallId,\n message.toolName,\n response\n ),\n ];\n\n if (supportsGoogleVisionInput(modelId) && imageParts.length) {\n parts.push(...imageParts);\n }\n\n return parts;\n}\n\nfunction buildContents(messages: ProviderMessage[], modelId: string): { systemInstruction?: any; contents: any[] } {\n const contents: any[] = [];\n const systemMessages = messages.filter((message) => message.role === 'system').map((message) => message.content);\n const systemInstruction = systemMessages.length\n ? { role: 'user', parts: [{ text: systemMessages.join('\\n\\n') }] }\n : undefined;\n\n for (const message of messages) {\n if (message.role === 'system') continue;\n if (message.role === 'user') {\n contents.push({ role: 'user', parts: buildUserParts(message) });\n continue;\n }\n if (message.role === 'assistant') {\n contents.push({ role: 'model', parts: buildAssistantParts(message) });\n continue;\n }\n contents.push({ role: 'user', parts: buildToolParts(message, modelId) });\n }\n\n return { systemInstruction, contents };\n}\n\nfunction extractReasoningFromParts(parts: Part[] | undefined): string | null {\n if (!parts?.length) return null;\n const text = parts\n .filter((part: any) => part.thought && typeof part.text === 'string')\n .map((part: any) => part.text)\n .join('');\n return text || null;\n}\n\nfunction extractGoogleReasoningDetails(parts: Part[] | undefined): ProviderReasoningDetail[] | undefined {\n if (!parts?.length) return undefined;\n\n const reasoningDetails: ProviderReasoningDetail[] = [];\n\n for (const part of parts) {\n if (!part.thought) continue;\n\n if (typeof part.text === 'string' && part.text.length > 0) {\n reasoningDetails.push({\n type: 'text',\n text: part.text,\n format: 'google-gemini-v1',\n });\n }\n\n if (typeof part.thoughtSignature === 'string' && part.thoughtSignature.length > 0) {\n reasoningDetails.push({\n type: 'encrypted',\n data: part.thoughtSignature,\n format: 'google-gemini-thought-signature-v1',\n });\n }\n }\n\n return reasoningDetails.length ? reasoningDetails : undefined;\n}\n\nfunction extractImagesFromParts(parts: Part[] | undefined): ProviderGeneratedImage[] | undefined {\n if (!parts?.length) return undefined;\n const images = parts\n .filter((part: any) => part.inlineData?.mimeType?.startsWith('image/'))\n .map((part: any, index: number) => ({\n id: `image_${index}`,\n data: part.inlineData?.data || '',\n mediaType: part.inlineData?.mimeType || 'image/png',\n }));\n return images.length ? images : undefined;\n}\n\nfunction extractToolCalls(parts: Part[] | undefined): ProviderToolCallPart[] | undefined {\n if (!parts?.length) return undefined;\n const toolCalls = parts\n .filter((part: any) => part.functionCall?.name)\n .map((part: any) => ({\n id: part.functionCall?.id || crypto.randomUUID(),\n name: part.functionCall?.name || 'tool',\n arguments: (part.functionCall?.args || {}) as Record<string, unknown>,\n extraContent: getGoogleToolCallExtraContent(part),\n }));\n\n return toolCalls.length ? toolCalls : undefined;\n}\n\nfunction getGoogleThoughtSignature(\n extraContent: unknown,\n reasoningDetails?: ProviderReasoningDetail[],\n toolCallId?: string\n): string | undefined {\n if (extraContent && typeof extraContent === 'object') {\n const google = (extraContent as Record<string, unknown>).google;\n if (google && typeof google === 'object') {\n const thoughtSignature = (google as Record<string, unknown>).thought_signature;\n if (typeof thoughtSignature === 'string' && thoughtSignature.length > 0) {\n return thoughtSignature;\n }\n }\n }\n\n if (!toolCallId || !reasoningDetails?.length) return undefined;\n\n const detail = reasoningDetails.find((candidate) => (\n candidate?.type === 'encrypted' &&\n candidate?.id === toolCallId &&\n typeof candidate?.data === 'string' &&\n candidate.data.length > 0 &&\n (\n candidate.format === 'google-gemini-v1' ||\n candidate.format === 'google-gemini-thought-signature-v1' ||\n !candidate.format\n )\n ));\n\n return detail?.data;\n}\n\nfunction getGoogleToolCallExtraContent(part: Part): Record<string, unknown> | undefined {\n const thoughtSignature = typeof part.thoughtSignature === 'string' && part.thoughtSignature.length > 0\n ? part.thoughtSignature\n : undefined;\n\n if (!thoughtSignature) return undefined;\n\n return {\n google: {\n thought_signature: thoughtSignature,\n },\n };\n}\n\nfunction buildGoogleReasoningParts(\n reasoning: string | null | undefined,\n reasoningDetails: ProviderReasoningDetail[] | undefined\n): Part[] {\n const googleReasoningDetails = reasoningDetails?.filter(\n (detail) =>\n detail?.format === 'google-gemini-v1' ||\n detail?.format === 'google-gemini-thought-signature-v1'\n ) || [];\n\n if (googleReasoningDetails.length === 0) {\n return reasoning ? [{ text: reasoning, thought: true }] : [];\n }\n\n const parts: Part[] = [];\n\n for (const detail of googleReasoningDetails) {\n if (detail.format === 'google-gemini-v1' && typeof detail.text === 'string') {\n parts.push({ text: detail.text, thought: true });\n continue;\n }\n\n if (detail.format === 'google-gemini-thought-signature-v1' && typeof detail.data === 'string') {\n const lastThoughtPart = parts.length > 0 ? parts[parts.length - 1] : undefined;\n if (lastThoughtPart?.thought && !lastThoughtPart.thoughtSignature) {\n lastThoughtPart.thoughtSignature = detail.data;\n } else {\n parts.push({ thought: true, thoughtSignature: detail.data });\n }\n }\n }\n\n if (parts.length === 0 && reasoning) {\n parts.push({ text: reasoning, thought: true });\n }\n\n return parts;\n}\n\nfunction transformUsage(modelId: string, usage: any, imageCount = 0): ProviderUsage {\n const mapped: ProviderUsage = {\n promptTokens: usage?.promptTokenCount || 0,\n completionTokens: usage?.candidatesTokenCount || 0,\n totalTokens: usage?.totalTokenCount || 0,\n reasoningTokens: usage?.thoughtsTokenCount,\n cachedTokens: usage?.cachedContentTokenCount,\n provider: 'google',\n };\n\n mapped.cost = calculateGoogleUsageCost(\n modelId,\n {\n ...mapped,\n promptTokenDetails: usage?.promptTokensDetails,\n completionTokenDetails: usage?.candidatesTokensDetails || usage?.responseTokensDetails,\n cachedTokenDetails: usage?.cacheTokensDetails,\n },\n imageCount\n );\n return mapped;\n}\n\nexport class GoogleProvider implements Provider {\n readonly name = 'google';\n readonly specificationVersion = '1' as const;\n\n private readonly config: ProviderFactoryConfig;\n private client: GoogleGenAI | null = null;\n\n private static readonly cacheTtl = 5 * 60 * 1000;\n private static modelsCache: ProviderModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static modelMetadataCache = new Map<string, GoogleModel>();\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n private getClient(): GoogleGenAI {\n if (!this.client) {\n this.client = new GoogleGenAI({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n supportsModel(modelId: string): boolean {\n return modelId.startsWith('gemini-')\n || modelId.startsWith('gemma-')\n || modelId.startsWith('imagen-')\n || modelId.startsWith('models/');\n }\n\n getIcon(_modelId?: string): string {\n return getGoogleIconDataUri();\n }\n\n private getHttpOptions(): Record<string, unknown> | undefined {\n if (!this.config.baseUrl && !this.config.timeout) return undefined;\n\n return {\n ...(this.config.baseUrl ? { baseUrl: this.config.baseUrl } : {}),\n ...(this.config.timeout ? { timeout: this.config.timeout } : {}),\n };\n }\n\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n const now = Date.now();\n if (GoogleProvider.modelsCache && now - GoogleProvider.modelsCacheTime < GoogleProvider.cacheTtl) {\n return this.filterModels(GoogleProvider.modelsCache, filter);\n }\n\n try {\n const models: ProviderModelInfo[] = [];\n const client = this.getClient();\n const pager = await client.models.list({\n config: {\n httpOptions: this.getHttpOptions() as any,\n },\n } as any);\n\n for await (const model of pager as AsyncIterable<GoogleModel>) {\n const id = normalizeModelId(model.name || '');\n if (!id) continue;\n const supportsGeneration = model.supportedActions?.some((action: string) =>\n ['generateContent', 'generateImages', 'editImage', 'predict'].includes(action)\n );\n if (!supportsGeneration) continue;\n GoogleProvider.modelMetadataCache.set(id, model);\n models.push(toProviderModelInfo(model));\n }\n\n for (const staticModel of STATIC_MODELS) {\n if (!models.some((model) => model.id === staticModel.id)) {\n models.push({\n id: staticModel.id,\n name: staticModel.name,\n description: staticModel.description,\n iconId: this.getIcon(staticModel.id),\n slug: staticModel.id,\n });\n }\n }\n\n GoogleProvider.modelsCache = models.sort((a, b) => a.name.localeCompare(b.name));\n GoogleProvider.modelsCacheTime = now;\n return this.filterModels(GoogleProvider.modelsCache, filter);\n } catch (error) {\n console.error('Failed to list Google models:', error);\n return this.filterModels(\n STATIC_MODELS.map((model) => ({\n id: model.id,\n name: model.name,\n description: model.description,\n iconId: this.getIcon(model.id),\n slug: model.id,\n })),\n filter\n );\n }\n }\n\n private filterModels(models: ProviderModelInfo[], filter?: string): ProviderModelInfo[] {\n if (!filter) return models;\n const query = filter.toLowerCase();\n return models.filter((model) =>\n model.id.toLowerCase().includes(query) ||\n model.name.toLowerCase().includes(query) ||\n (model.description?.toLowerCase().includes(query) ?? false)\n );\n }\n\n private async getModelMetadata(modelId: string): Promise<GoogleModel | null> {\n const normalized = normalizeModelId(modelId);\n const cached = GoogleProvider.modelMetadataCache.get(normalized);\n if (cached) {\n return cached;\n }\n\n try {\n const model = await this.getClient().models.get({\n model: normalized,\n config: {\n httpOptions: this.getHttpOptions() as any,\n },\n } as any);\n GoogleProvider.modelMetadataCache.set(normalized, model);\n return model;\n } catch {\n return null;\n }\n }\n\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n const normalized = normalizeModelId(modelId);\n const staticModel = STATIC_MODELS.find((model) => model.id === normalized);\n if (staticModel) {\n return { ...staticModel.capabilities };\n }\n\n try {\n const metadata = await this.getModelMetadata(normalized);\n if (metadata) {\n return mapDynamicCapabilities(metadata);\n }\n\n const models = await this.getModels();\n const found = models.find((model) => model.id === normalized);\n if (!found) return null;\n\n return {\n supportsImages: normalized.startsWith('gemini-') || normalized.startsWith('gemma-') || normalized.includes('image'),\n supportsToolCalls: supportsGoogleToolCalls(normalized),\n supportsStreaming: !isImagenModel(normalized),\n supportsJsonMode: supportsGoogleToolCalls(normalized),\n maxContextTokens: found.contextLength,\n };\n } catch {\n return null;\n }\n }\n\n private buildGenerateContentParams(request: ProviderRequest): Record<string, unknown> {\n const providerOptions = (request.providerOptions || {}) as Record<string, unknown>;\n const { systemInstruction, contents } = buildContents(request.messages, request.model);\n\n const config: Record<string, unknown> = {\n ...(this.getHttpOptions() ? { httpOptions: this.getHttpOptions() } : {}),\n ...(systemInstruction ? { systemInstruction } : {}),\n ...(typeof request.temperature === 'number' ? { temperature: request.temperature } : {}),\n ...(typeof request.topP === 'number' ? { topP: request.topP } : {}),\n ...(typeof request.topK === 'number' ? { topK: request.topK } : {}),\n ...(typeof request.maxOutputTokens === 'number' ? { maxOutputTokens: request.maxOutputTokens } : {}),\n ...(request.stopSequences?.length ? { stopSequences: request.stopSequences } : {}),\n ...(request.responseFormat?.type === 'json'\n ? {\n responseMimeType: 'application/json',\n ...(request.responseFormat.schema ? { responseJsonSchema: request.responseFormat.schema } : {}),\n }\n : {}),\n ...(request.tools?.length ? { tools: transformTools(request.tools) } : {}),\n ...(request.tools?.length && toolChoiceToGoogle(request.toolChoice)\n ? { toolConfig: { functionCallingConfig: toolChoiceToGoogle(request.toolChoice) } }\n : {}),\n ...(typeof providerOptions.candidateCount === 'number' ? { candidateCount: providerOptions.candidateCount } : {}),\n ...(Array.isArray(providerOptions.responseModalities) ? { responseModalities: providerOptions.responseModalities } : {}),\n ...(typeof providerOptions.mediaResolution === 'string' ? { mediaResolution: providerOptions.mediaResolution } : {}),\n ...(typeof providerOptions.cachedContent === 'string' ? { cachedContent: providerOptions.cachedContent } : {}),\n ...(typeof providerOptions.enableEnhancedCivicAnswers === 'boolean'\n ? { enableEnhancedCivicAnswers: providerOptions.enableEnhancedCivicAnswers }\n : {}),\n ...(providerOptions.labels ? { labels: providerOptions.labels } : {}),\n ...(providerOptions.safetySettings ? { safetySettings: providerOptions.safetySettings } : {}),\n ...(providerOptions.thinkingConfig ? { thinkingConfig: providerOptions.thinkingConfig } : {}),\n ...(providerOptions.imageConfig ? { imageConfig: providerOptions.imageConfig } : {}),\n ...(typeof request.reasoning?.maxTokens === 'number'\n ? { thinkingConfig: { ...(providerOptions.thinkingConfig as Record<string, unknown> || {}), thinkingBudget: request.reasoning.maxTokens } }\n : {}),\n };\n\n return {\n model: normalizeModelId(request.model),\n contents,\n config,\n };\n }\n\n private extractImagenRequest(request: ProviderRequest): {\n prompt: string;\n referenceImages?: RawReferenceImage[];\n body: Record<string, unknown>;\n } {\n const providerOptions = (request.providerOptions || {}) as Record<string, unknown>;\n const latestUser = [...request.messages].reverse().find((message) => message.role === 'user');\n const prompt = latestUser ? (typeof latestUser.content === 'string'\n ? latestUser.content\n : latestUser.content.filter((part: any) => part.type === 'text').map((part: any) => part.text).join('\\n')) : '';\n\n const referenceImages = latestUser && typeof latestUser.content !== 'string'\n ? latestUser.content\n .filter((part: any) => part.type === 'image')\n .map((part: any, index: number) => {\n const normalized = normalizeInlineBytes(part.data, part.mediaType);\n const image = new RawReferenceImage();\n image.referenceId = index + 1;\n image.referenceImage = {\n imageBytes: normalized.data,\n mimeType: normalized.mediaType,\n };\n return image;\n })\n : [];\n\n const body: Record<string, unknown> = {\n model: normalizeModelId(request.model),\n prompt,\n ...(referenceImages.length ? { referenceImages: '[binary images omitted]' } : {}),\n config: {\n ...(this.getHttpOptions() ? { httpOptions: this.getHttpOptions() } : {}),\n ...(typeof providerOptions.numberOfImages === 'number' ? { numberOfImages: providerOptions.numberOfImages } : {}),\n ...(typeof providerOptions.negativePrompt === 'string' ? { negativePrompt: providerOptions.negativePrompt } : {}),\n ...(typeof providerOptions.aspectRatio === 'string' ? { aspectRatio: providerOptions.aspectRatio } : {}),\n ...(typeof providerOptions.guidanceScale === 'number' ? { guidanceScale: providerOptions.guidanceScale } : {}),\n ...(typeof providerOptions.seed === 'number' ? { seed: providerOptions.seed } : {}),\n ...(typeof providerOptions.safetyFilterLevel === 'string' ? { safetyFilterLevel: providerOptions.safetyFilterLevel } : {}),\n ...(typeof providerOptions.personGeneration === 'string' ? { personGeneration: providerOptions.personGeneration } : {}),\n ...(typeof providerOptions.includeSafetyAttributes === 'boolean' ? { includeSafetyAttributes: providerOptions.includeSafetyAttributes } : {}),\n ...(typeof providerOptions.includeRaiReason === 'boolean' ? { includeRaiReason: providerOptions.includeRaiReason } : {}),\n ...(typeof providerOptions.language === 'string' ? { language: providerOptions.language } : {}),\n ...(typeof providerOptions.outputMimeType === 'string' ? { outputMimeType: providerOptions.outputMimeType } : {}),\n ...(typeof providerOptions.outputCompressionQuality === 'number' ? { outputCompressionQuality: providerOptions.outputCompressionQuality } : {}),\n ...(typeof providerOptions.addWatermark === 'boolean' ? { addWatermark: providerOptions.addWatermark } : {}),\n ...(providerOptions.labels ? { labels: providerOptions.labels } : {}),\n ...(typeof providerOptions.imageSize === 'string' ? { imageSize: providerOptions.imageSize } : {}),\n ...(typeof providerOptions.enhancePrompt === 'boolean' ? { enhancePrompt: providerOptions.enhancePrompt } : {}),\n ...(typeof providerOptions.editMode === 'string' ? { editMode: providerOptions.editMode } : {}),\n ...(typeof providerOptions.baseSteps === 'number' ? { baseSteps: providerOptions.baseSteps } : {}),\n },\n };\n\n return {\n prompt,\n referenceImages: referenceImages.length ? referenceImages : undefined,\n body,\n };\n }\n\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n if (isImagenModel(request.model)) {\n const imagen = this.extractImagenRequest(request);\n return {\n body: imagen.body,\n messagesPath: 'prompt',\n metadata: {\n endpoint: imagen.referenceImages?.length\n ? `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/editImage`\n : `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/generateImages`,\n headers: { 'Content-Type': 'application/json' },\n },\n };\n }\n\n return {\n body: this.buildGenerateContentParams(request),\n messagesPath: 'contents',\n metadata: {\n endpoint: `${this.config.baseUrl || 'https://generativelanguage.googleapis.com'}/generateContent`,\n headers: { 'Content-Type': 'application/json' },\n },\n };\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n if (isImagenModel(request.model)) {\n return this.generateImagen(request);\n }\n\n try {\n const client = this.getClient();\n const response = await client.models.generateContent(this.buildGenerateContentParams(request) as any);\n const candidate = response.candidates?.[0];\n const parts = candidate?.content?.parts;\n const images = extractImagesFromParts(parts);\n const usage = transformUsage(normalizeModelId(request.model), response.usageMetadata, images?.length || 0);\n\n return {\n content: response.text || null,\n reasoning: extractReasoningFromParts(parts),\n reasoningDetails: extractGoogleReasoningDetails(parts),\n toolCalls: extractToolCalls(parts),\n images,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage,\n metadata: {\n provider: 'google',\n responseId: response.responseId,\n modelVersion: response.modelVersion,\n promptFeedback: response.promptFeedback,\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private async generateImagen(request: ProviderRequest): Promise<ProviderResponse> {\n try {\n const client = this.getClient();\n const imagen = this.extractImagenRequest(request);\n const model = normalizeModelId(request.model);\n\n const response = imagen.referenceImages?.length\n ? await client.models.editImage({\n model,\n prompt: imagen.prompt,\n referenceImages: imagen.referenceImages,\n config: imagen.body.config as any,\n })\n : await client.models.generateImages({\n model,\n prompt: imagen.prompt,\n config: imagen.body.config as any,\n });\n\n const images: ProviderGeneratedImage[] = (response.generatedImages || [])\n .filter((image: any) => image.image?.imageBytes)\n .map((image: any, index: number) => ({\n id: `image_${index}`,\n data: image.image?.imageBytes || '',\n mediaType: image.image?.mimeType || 'image/png',\n revisedPrompt: image.enhancedPrompt,\n }));\n\n return {\n content: null,\n images,\n finishReason: 'stop',\n usage: {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: calculateGoogleUsageCost(model, { promptTokens: 0, completionTokens: 0, cachedTokens: 0 }, images.length),\n provider: 'google',\n },\n metadata: {\n provider: 'google',\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n if (isImagenModel(request.model)) {\n throw new ProviderError('Imagen models do not support streaming in Standard Agents.', 'invalid_request');\n }\n\n const self = this;\n\n try {\n const client = this.getClient();\n const stream = await client.models.generateContentStream(this.buildGenerateContentParams(request) as any);\n\n return {\n async *[Symbol.asyncIterator]() {\n let sawContent = false;\n let sawReasoning = false;\n const reasoningDetails: ProviderReasoningDetail[] = [];\n let finishReason: ProviderFinishReason = 'stop';\n let finalUsage: ProviderUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n provider: 'google',\n };\n let imageIndex = 0;\n\n try {\n for await (const chunk of stream) {\n const candidate = chunk.candidates?.[0];\n const parts = candidate?.content?.parts || [];\n const chunkReasoningDetails = extractGoogleReasoningDetails(parts);\n if (chunkReasoningDetails?.length) {\n reasoningDetails.push(...chunkReasoningDetails);\n }\n\n for (const part of parts) {\n if (part.text && !part.thought) {\n sawContent = true;\n yield { type: 'content-delta', delta: part.text };\n } else if (part.text && part.thought) {\n sawReasoning = true;\n yield { type: 'reasoning-delta', delta: part.text };\n } else if (part.functionCall?.name) {\n const id = part.functionCall.id || crypto.randomUUID();\n const extraContent = getGoogleToolCallExtraContent(part);\n yield { type: 'tool-call-start', id, name: part.functionCall.name, extraContent };\n yield {\n type: 'tool-call-done',\n id,\n arguments: (part.functionCall.args || {}) as Record<string, unknown>,\n extraContent,\n };\n } else if (part.inlineData?.mimeType?.startsWith('image/')) {\n const image: ProviderGeneratedImage = {\n id: `image_${imageIndex}`,\n data: part.inlineData.data || '',\n mediaType: part.inlineData.mimeType || 'image/png',\n };\n yield { type: 'image-done', index: imageIndex, image };\n imageIndex += 1;\n }\n }\n\n if (chunk.usageMetadata) {\n finalUsage = transformUsage(normalizeModelId(request.model), chunk.usageMetadata, imageIndex);\n }\n\n if (candidate?.finishReason) {\n finishReason = mapFinishReason(candidate.finishReason);\n }\n }\n\n if (sawContent) yield { type: 'content-done' };\n if (sawReasoning) yield { type: 'reasoning-done' };\n yield {\n type: 'finish',\n finishReason,\n usage: finalUsage,\n reasoningDetails: reasoningDetails.length ? reasoningDetails : undefined,\n };\n } catch (error) {\n yield { type: 'error', error: self.toProviderError(error).message };\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) return error;\n\n if (error instanceof Error) {\n const candidate = error as Error & { status?: number; statusCode?: number };\n const status = candidate.status || candidate.statusCode;\n if (status === 429) return new ProviderError(error.message, 'rate_limit', status);\n if (status === 401 || status === 403) return new ProviderError(error.message, 'auth_error', status);\n if (status === 400) return new ProviderError(error.message, 'invalid_request', status);\n if (status && status >= 500) return new ProviderError(error.message, 'server_error', status);\n if (error.name === 'AbortError') return new ProviderError(error.message, 'timeout');\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n}\n","const GOOGLE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" fill=\"none\"><rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#fff\"/><path d=\"M54 32.73c0-1.58-.14-3.1-.4-4.55H32v8.61h12.33c-.53 2.85-2.14 5.27-4.56 6.9v5.73h7.38C51.47 45.44 54 39.61 54 32.73Z\" fill=\"#4285F4\"/><path d=\"M32 55c6.2 0 11.4-2.05 15.2-5.58l-7.38-5.73c-2.05 1.37-4.67 2.18-7.82 2.18-6 0-11.08-4.05-12.9-9.49h-7.62v5.96A22.98 22.98 0 0 0 32 55Z\" fill=\"#34A853\"/><path d=\"M19.1 36.38A13.8 13.8 0 0 1 18.38 32c0-1.52.26-3 .72-4.38v-5.96h-7.62A22.98 22.98 0 0 0 9 32c0 3.67.88 7.13 2.48 10.34l7.62-5.96Z\" fill=\"#FBBC05\"/><path d=\"M32 18.9c3.37 0 6.4 1.16 8.79 3.45l6.59-6.59C43.39 12.05 38.19 9 32 9A22.98 22.98 0 0 0 11.48 21.66l7.62 5.96C20.92 22.95 26 18.9 32 18.9Z\" fill=\"#EA4335\"/></svg>`;\n\nexport function svgToDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function getGoogleIconDataUri(): string {\n return svgToDataUri(GOOGLE_ICON);\n}\n","import type { ProviderUsage } from '@standardagents/spec';\n\ntype GooglePricingModality = 'text' | 'image' | 'video' | 'audio' | 'document' | 'unspecified';\n\ninterface GoogleModalityTokenCount {\n modality?: string;\n tokenCount?: number;\n}\n\nexport interface GoogleModelPricing {\n inputPerMillion: number;\n longInputPerMillion?: number;\n outputPerMillion?: number;\n longOutputPerMillion?: number;\n cachedInputPerMillion?: number;\n longCachedInputPerMillion?: number;\n outputImagePerImage?: number;\n inputByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n outputByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n cachedByModalityPerMillion?: Partial<Record<GooglePricingModality, number>>;\n longContextThreshold?: number;\n}\n\nconst MODEL_PRICING: Record<string, GoogleModelPricing> = {\n 'gemini-3-pro-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n cachedInputPerMillion: 0.2,\n },\n 'gemini-3.1-pro-preview': {\n inputPerMillion: 2,\n longInputPerMillion: 4,\n outputPerMillion: 12,\n longOutputPerMillion: 18,\n cachedInputPerMillion: 0.2,\n longCachedInputPerMillion: 0.4,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-pro': {\n inputPerMillion: 1.25,\n longInputPerMillion: 2.5,\n outputPerMillion: 10,\n longOutputPerMillion: 15,\n cachedInputPerMillion: 0.125,\n longCachedInputPerMillion: 0.25,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-flash': {\n inputPerMillion: 0.3,\n outputPerMillion: 2.5,\n cachedInputPerMillion: 0.03,\n },\n 'gemini-2.5-flash-lite': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.01,\n },\n 'gemini-3-flash-preview': {\n inputPerMillion: 0.5,\n outputPerMillion: 3,\n cachedInputPerMillion: 0.05,\n inputByModalityPerMillion: {\n text: 0.5,\n image: 0.5,\n video: 0.5,\n audio: 1,\n },\n cachedByModalityPerMillion: {\n text: 0.05,\n image: 0.05,\n video: 0.05,\n audio: 0.1,\n },\n },\n 'gemini-3.1-flash-lite-preview': {\n inputPerMillion: 0.25,\n outputPerMillion: 1.5,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.25,\n image: 0.25,\n video: 0.25,\n audio: 0.5,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.05,\n },\n },\n 'deep-research-pro-preview-12-2025': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n cachedInputPerMillion: 0.2,\n },\n 'gemini-2.0-flash': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.1,\n image: 0.1,\n video: 0.1,\n audio: 0.7,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.175,\n },\n },\n 'gemini-2.0-flash-001': {\n inputPerMillion: 0.1,\n outputPerMillion: 0.4,\n cachedInputPerMillion: 0.025,\n inputByModalityPerMillion: {\n text: 0.1,\n image: 0.1,\n video: 0.1,\n audio: 0.7,\n },\n cachedByModalityPerMillion: {\n text: 0.025,\n image: 0.025,\n video: 0.025,\n audio: 0.175,\n },\n },\n 'gemini-2.0-flash-lite': {\n inputPerMillion: 0.075,\n outputPerMillion: 0.3,\n },\n 'gemini-2.0-flash-lite-001': {\n inputPerMillion: 0.075,\n outputPerMillion: 0.3,\n },\n 'gemini-2.5-computer-use-preview-10-2025': {\n inputPerMillion: 1.25,\n longInputPerMillion: 2.5,\n outputPerMillion: 10,\n longOutputPerMillion: 15,\n longContextThreshold: 200000,\n },\n 'gemini-2.5-flash-preview-tts': {\n inputPerMillion: 0.5,\n outputPerMillion: 10,\n outputByModalityPerMillion: {\n audio: 10,\n },\n },\n 'gemini-2.5-pro-preview-tts': {\n inputPerMillion: 1,\n outputPerMillion: 20,\n outputByModalityPerMillion: {\n audio: 20,\n },\n },\n 'gemini-robotics-er-1.5-preview': {\n inputPerMillion: 0.3,\n outputPerMillion: 2.5,\n inputByModalityPerMillion: {\n text: 0.3,\n image: 0.3,\n video: 0.3,\n audio: 1,\n },\n },\n 'gemini-2.5-flash-image': {\n inputPerMillion: 0.3,\n outputImagePerImage: 0.039,\n },\n 'gemini-3.1-flash-image-preview': {\n inputPerMillion: 0.5,\n outputPerMillion: 3,\n outputImagePerImage: 0.045,\n },\n 'gemini-3-pro-image-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n outputImagePerImage: 0.134,\n },\n 'nano-banana-pro-preview': {\n inputPerMillion: 2,\n outputPerMillion: 12,\n outputImagePerImage: 0.134,\n },\n 'imagen-4.0-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.04,\n },\n 'imagen-4.0-fast-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.02,\n },\n 'imagen-4.0-ultra-generate-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.06,\n },\n 'imagen-3.0-capability-001': {\n inputPerMillion: 0,\n outputImagePerImage: 0.04,\n },\n 'gemma-4-31b-it': {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n};\n\nconst MODEL_PRICING_PREFIXES: Array<{ prefix: string; pricing: GoogleModelPricing }> = [\n {\n prefix: 'gemini-3.1-pro-preview',\n pricing: MODEL_PRICING['gemini-3.1-pro-preview'],\n },\n {\n prefix: 'gemini-3-pro-preview',\n pricing: MODEL_PRICING['gemini-3-pro-preview'],\n },\n {\n prefix: 'gemini-3-flash-preview',\n pricing: MODEL_PRICING['gemini-3-flash-preview'],\n },\n {\n prefix: 'gemini-3.1-flash-lite-preview',\n pricing: MODEL_PRICING['gemini-3.1-flash-lite-preview'],\n },\n {\n prefix: 'gemini-2.5-flash-lite-preview-',\n pricing: MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-flash-latest',\n pricing: MODEL_PRICING['gemini-2.5-flash'],\n },\n {\n prefix: 'gemini-flash-lite-latest',\n pricing: MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-pro-latest',\n pricing: MODEL_PRICING['gemini-2.5-pro'],\n },\n {\n prefix: 'gemma-4-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n {\n prefix: 'gemma-3-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n {\n prefix: 'gemma-3n-',\n pricing: {\n inputPerMillion: 0,\n outputPerMillion: 0,\n cachedInputPerMillion: 0,\n },\n },\n];\n\nfunction normalizeGoogleModelId(modelId: string): string {\n return modelId\n .trim()\n .toLowerCase()\n .replace(/^google\\//, '')\n .replace(/^models\\//, '')\n .replace(/^publishers\\/google\\/models\\//, '');\n}\n\nfunction normalizeModality(modality: string | undefined): GooglePricingModality {\n const normalized = (modality || '').trim().toLowerCase();\n\n if (normalized === 'text') return 'text';\n if (normalized === 'image') return 'image';\n if (normalized === 'video') return 'video';\n if (normalized === 'audio') return 'audio';\n if (normalized === 'document') return 'document';\n return 'unspecified';\n}\n\nfunction toModalityCounts(\n details: GoogleModalityTokenCount[] | undefined\n): Partial<Record<GooglePricingModality, number>> {\n const counts: Partial<Record<GooglePricingModality, number>> = {};\n\n for (const detail of details || []) {\n const modality = normalizeModality(detail.modality);\n const tokenCount = Math.max(detail.tokenCount ?? 0, 0);\n counts[modality] = (counts[modality] ?? 0) + tokenCount;\n }\n\n return counts;\n}\n\nfunction sumModalityCosts(\n counts: Partial<Record<GooglePricingModality, number>>,\n modalityRates: Partial<Record<GooglePricingModality, number>> | undefined,\n defaultRate: number\n): number {\n let total = 0;\n\n for (const [modality, tokenCount] of Object.entries(counts)) {\n if (!tokenCount) continue;\n const rate = modalityRates?.[modality as GooglePricingModality] ?? defaultRate;\n total += (tokenCount / 1_000_000) * rate;\n }\n\n return total;\n}\n\nexport function getGoogleModelPricing(modelId: string): GoogleModelPricing | undefined {\n const normalizedModelId = normalizeGoogleModelId(modelId);\n const exact = MODEL_PRICING[normalizedModelId];\n if (exact) return exact;\n\n return MODEL_PRICING_PREFIXES.find((entry) => normalizedModelId.startsWith(entry.prefix))?.pricing;\n}\n\nexport function calculateGoogleUsageCost(\n modelId: string,\n usage: Pick<ProviderUsage, 'promptTokens' | 'completionTokens' | 'reasoningTokens' | 'cachedTokens'> & {\n promptTokenDetails?: GoogleModalityTokenCount[];\n completionTokenDetails?: GoogleModalityTokenCount[];\n cachedTokenDetails?: GoogleModalityTokenCount[];\n },\n imageCount = 0\n): number | undefined {\n const pricing = getGoogleModelPricing(modelId);\n if (!pricing) return undefined;\n\n const cachedTokens = usage.cachedTokens ?? 0;\n const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);\n const useLongContext = pricing.longContextThreshold != null && usage.promptTokens > pricing.longContextThreshold;\n\n const inputRate = useLongContext ? (pricing.longInputPerMillion ?? pricing.inputPerMillion) : pricing.inputPerMillion;\n const outputRate = useLongContext\n ? (pricing.longOutputPerMillion ?? pricing.outputPerMillion ?? 0)\n : (pricing.outputPerMillion ?? 0);\n const cachedRate = useLongContext\n ? (pricing.longCachedInputPerMillion ?? pricing.cachedInputPerMillion ?? 0)\n : (pricing.cachedInputPerMillion ?? 0);\n const billableOutputTokens = usage.completionTokens + (usage.reasoningTokens ?? 0);\n const promptModalityCounts = toModalityCounts(usage.promptTokenDetails);\n const cachedModalityCounts = toModalityCounts(usage.cachedTokenDetails);\n const uncachedPromptModalityCounts: Partial<Record<GooglePricingModality, number>> = {};\n\n for (const modality of new Set<GooglePricingModality>([\n ...Object.keys(promptModalityCounts) as GooglePricingModality[],\n ...Object.keys(cachedModalityCounts) as GooglePricingModality[],\n ])) {\n uncachedPromptModalityCounts[modality] = Math.max(\n (promptModalityCounts[modality] ?? 0) - (cachedModalityCounts[modality] ?? 0),\n 0\n );\n }\n\n const completionModalityCounts = toModalityCounts(usage.completionTokenDetails);\n if (usage.reasoningTokens) {\n completionModalityCounts.text = (completionModalityCounts.text ?? 0) + usage.reasoningTokens;\n }\n\n const hasPromptModalityPricing = Object.keys(uncachedPromptModalityCounts).length > 0 && pricing.inputByModalityPerMillion;\n const hasCachedModalityPricing = Object.keys(cachedModalityCounts).length > 0 && pricing.cachedByModalityPerMillion;\n const hasOutputModalityPricing = Object.keys(completionModalityCounts).length > 0 && pricing.outputByModalityPerMillion;\n\n const inputCost = hasPromptModalityPricing\n ? sumModalityCosts(uncachedPromptModalityCounts, pricing.inputByModalityPerMillion, inputRate)\n : (uncachedPromptTokens / 1_000_000) * inputRate;\n const cachedCost = hasCachedModalityPricing\n ? sumModalityCosts(cachedModalityCounts, pricing.cachedByModalityPerMillion, cachedRate)\n : (cachedTokens / 1_000_000) * cachedRate;\n const outputCost = hasOutputModalityPricing\n ? sumModalityCosts(completionModalityCounts, pricing.outputByModalityPerMillion, outputRate)\n : (billableOutputTokens / 1_000_000) * outputRate;\n const imageCost = imageCount * (pricing.outputImagePerImage ?? 0);\n\n return Number((inputCost + cachedCost + outputCost + imageCost).toFixed(12));\n}\n","import { z } from 'zod';\n\nexport const googleProviderOptions = z.object({\n candidateCount: z.number().int().min(1).max(8).optional(),\n responseModalities: z.array(z.enum(['TEXT', 'IMAGE', 'AUDIO'])).optional(),\n mediaResolution: z.string().optional(),\n cachedContent: z.string().optional(),\n enableEnhancedCivicAnswers: z.boolean().optional(),\n labels: z.record(z.string(), z.string()).optional(),\n safetySettings: z.array(z.record(z.string(), z.unknown())).optional(),\n thinkingConfig: z.record(z.string(), z.unknown()).optional(),\n imageConfig: z.record(z.string(), z.unknown()).optional(),\n\n numberOfImages: z.number().int().min(1).max(4).optional(),\n negativePrompt: z.string().optional(),\n aspectRatio: z.string().optional(),\n guidanceScale: z.number().optional(),\n safetyFilterLevel: z.string().optional(),\n personGeneration: z.string().optional(),\n includeSafetyAttributes: z.boolean().optional(),\n includeRaiReason: z.boolean().optional(),\n language: z.string().optional(),\n outputMimeType: z.string().optional(),\n outputCompressionQuality: z.number().int().optional(),\n addWatermark: z.boolean().optional(),\n imageSize: z.string().optional(),\n enhancePrompt: z.boolean().optional(),\n editMode: z.string().optional(),\n baseSteps: z.number().int().optional(),\n}).passthrough();\n\nexport type GoogleProviderOptions = z.infer<typeof googleProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions } from '@standardagents/spec';\nimport { GoogleProvider } from './GoogleProvider';\nimport { googleProviderOptions } from './providerOptions';\n\n/**\n * Google Gemini / Imagen provider factory for Standard Agents.\n */\nexport const google: ProviderFactoryWithOptions<typeof googleProviderOptions> = Object.assign(\n (config: ProviderFactoryConfig) => new GoogleProvider(config),\n { providerOptions: googleProviderOptions }\n);\n\nexport { googleProviderOptions, type GoogleProviderOptions } from './providerOptions';\nexport { GoogleProvider } from './GoogleProvider';\n"],"mappings":"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","names":["google"]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@standardagents/google",
3
- "version": "0.14.1",
3
+ "version": "0.15.1",
4
4
  "private": false,
5
5
  "publishConfig": {
6
- "access": "restricted",
6
+ "access": "public",
7
7
  "registry": "https://registry.npmjs.org/"
8
8
  },
9
9
  "type": "module",
@@ -25,12 +25,12 @@
25
25
  "zod": "^4.3.5"
26
26
  },
27
27
  "peerDependencies": {
28
- "@standardagents/spec": "^0.10.0"
28
+ "@standardagents/spec": "^0.15.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "tsup": "^8.3.5",
32
32
  "typescript": "^5.9.0",
33
- "@standardagents/spec": "0.14.1"
33
+ "@standardagents/spec": "0.15.1"
34
34
  },
35
35
  "keywords": [
36
36
  "standardagents",