@standardagents/google 0.21.1 → 0.22.0

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
@@ -46,6 +46,7 @@ The package exports:
46
46
  - `google(config)` - provider factory
47
47
  - `GoogleProvider` - provider class
48
48
  - `googleProviderOptions` - Zod schema for provider-specific options
49
+ - pricing helpers from `@standardagents/google/pricing`
49
50
 
50
51
  Factory config follows `ProviderFactoryConfig` from `@standardagents/spec`:
51
52
 
@@ -145,4 +146,5 @@ console.log(inspected?.body);
145
146
 
146
147
  - Model IDs are normalized so variants like `google/...`, `models/...`, and `publishers/google/models/...` resolve to the same pricing and capability entries where possible.
147
148
  - 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.
149
+ - The same pricing helpers are exported from the package root and the pure `@standardagents/google/pricing` subpath for consumers that need identical cost math without importing provider runtime code.
148
150
  - Gemini thought signatures attached to tool-call parts are preserved through Standard Agents history so multi-step Google tool calling can continue across turns.
@@ -0,0 +1,11 @@
1
+ // src/pricing.ts
2
+ import {
3
+ calculateGoogleUsageCost,
4
+ getGoogleModelPricing
5
+ } from "@standardagents/provider-pricing";
6
+
7
+ export {
8
+ calculateGoogleUsageCost,
9
+ getGoogleModelPricing
10
+ };
11
+ //# sourceMappingURL=chunk-J3SOF4AE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pricing.ts"],"sourcesContent":["export {\n calculateGoogleUsageCost,\n getGoogleModelPricing,\n type GoogleModalityTokenCount,\n type GoogleModelPricing,\n} from '@standardagents/provider-pricing';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { LLMProviderInterface, ProviderFactoryConfig, ProviderModelInfo, ModelCapabilities, ProviderRequest, InspectedRequest, ProviderResponse, ProviderStreamChunk, ProviderFactoryWithOptions } from '@standardagents/spec';
2
2
  import { z } from 'zod';
3
+ export { GoogleModelPricing, calculateGoogleUsageCost, getGoogleModelPricing } from '@standardagents/provider-pricing';
3
4
 
4
5
  declare const googleProviderOptions: z.ZodObject<{
5
6
  candidateCount: z.ZodOptional<z.ZodNumber>;
package/dist/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ import {
2
+ calculateGoogleUsageCost,
3
+ getGoogleModelPricing
4
+ } from "./chunk-J3SOF4AE.js";
5
+
1
6
  // src/GoogleProvider.ts
2
7
  import {
3
8
  GoogleGenAI,
@@ -17,324 +22,6 @@ function getGoogleIconDataUri() {
17
22
  return svgToDataUri(GOOGLE_ICON);
18
23
  }
19
24
 
20
- // src/pricing.ts
21
- var MODEL_PRICING = {
22
- "gemini-3-pro-preview": {
23
- inputPerMillion: 2,
24
- outputPerMillion: 12,
25
- cachedInputPerMillion: 0.2
26
- },
27
- "gemini-3.1-pro-preview": {
28
- inputPerMillion: 2,
29
- longInputPerMillion: 4,
30
- outputPerMillion: 12,
31
- longOutputPerMillion: 18,
32
- cachedInputPerMillion: 0.2,
33
- longCachedInputPerMillion: 0.4,
34
- longContextThreshold: 2e5
35
- },
36
- "gemini-2.5-pro": {
37
- inputPerMillion: 1.25,
38
- longInputPerMillion: 2.5,
39
- outputPerMillion: 10,
40
- longOutputPerMillion: 15,
41
- cachedInputPerMillion: 0.125,
42
- longCachedInputPerMillion: 0.25,
43
- longContextThreshold: 2e5
44
- },
45
- "gemini-2.5-flash": {
46
- inputPerMillion: 0.3,
47
- outputPerMillion: 2.5,
48
- cachedInputPerMillion: 0.03
49
- },
50
- "gemini-2.5-flash-lite": {
51
- inputPerMillion: 0.1,
52
- outputPerMillion: 0.4,
53
- cachedInputPerMillion: 0.01
54
- },
55
- "gemini-3-flash-preview": {
56
- inputPerMillion: 0.5,
57
- outputPerMillion: 3,
58
- cachedInputPerMillion: 0.05,
59
- inputByModalityPerMillion: {
60
- text: 0.5,
61
- image: 0.5,
62
- video: 0.5,
63
- audio: 1
64
- },
65
- cachedByModalityPerMillion: {
66
- text: 0.05,
67
- image: 0.05,
68
- video: 0.05,
69
- audio: 0.1
70
- }
71
- },
72
- "gemini-3.1-flash-lite-preview": {
73
- inputPerMillion: 0.25,
74
- outputPerMillion: 1.5,
75
- cachedInputPerMillion: 0.025,
76
- inputByModalityPerMillion: {
77
- text: 0.25,
78
- image: 0.25,
79
- video: 0.25,
80
- audio: 0.5
81
- },
82
- cachedByModalityPerMillion: {
83
- text: 0.025,
84
- image: 0.025,
85
- video: 0.025,
86
- audio: 0.05
87
- }
88
- },
89
- "deep-research-pro-preview-12-2025": {
90
- inputPerMillion: 2,
91
- outputPerMillion: 12,
92
- cachedInputPerMillion: 0.2
93
- },
94
- "gemini-2.0-flash": {
95
- inputPerMillion: 0.1,
96
- outputPerMillion: 0.4,
97
- cachedInputPerMillion: 0.025,
98
- inputByModalityPerMillion: {
99
- text: 0.1,
100
- image: 0.1,
101
- video: 0.1,
102
- audio: 0.7
103
- },
104
- cachedByModalityPerMillion: {
105
- text: 0.025,
106
- image: 0.025,
107
- video: 0.025,
108
- audio: 0.175
109
- }
110
- },
111
- "gemini-2.0-flash-001": {
112
- inputPerMillion: 0.1,
113
- outputPerMillion: 0.4,
114
- cachedInputPerMillion: 0.025,
115
- inputByModalityPerMillion: {
116
- text: 0.1,
117
- image: 0.1,
118
- video: 0.1,
119
- audio: 0.7
120
- },
121
- cachedByModalityPerMillion: {
122
- text: 0.025,
123
- image: 0.025,
124
- video: 0.025,
125
- audio: 0.175
126
- }
127
- },
128
- "gemini-2.0-flash-lite": {
129
- inputPerMillion: 0.075,
130
- outputPerMillion: 0.3
131
- },
132
- "gemini-2.0-flash-lite-001": {
133
- inputPerMillion: 0.075,
134
- outputPerMillion: 0.3
135
- },
136
- "gemini-2.5-computer-use-preview-10-2025": {
137
- inputPerMillion: 1.25,
138
- longInputPerMillion: 2.5,
139
- outputPerMillion: 10,
140
- longOutputPerMillion: 15,
141
- longContextThreshold: 2e5
142
- },
143
- "gemini-2.5-flash-preview-tts": {
144
- inputPerMillion: 0.5,
145
- outputPerMillion: 10,
146
- outputByModalityPerMillion: {
147
- audio: 10
148
- }
149
- },
150
- "gemini-2.5-pro-preview-tts": {
151
- inputPerMillion: 1,
152
- outputPerMillion: 20,
153
- outputByModalityPerMillion: {
154
- audio: 20
155
- }
156
- },
157
- "gemini-robotics-er-1.5-preview": {
158
- inputPerMillion: 0.3,
159
- outputPerMillion: 2.5,
160
- inputByModalityPerMillion: {
161
- text: 0.3,
162
- image: 0.3,
163
- video: 0.3,
164
- audio: 1
165
- }
166
- },
167
- "gemini-2.5-flash-image": {
168
- inputPerMillion: 0.3,
169
- outputImagePerImage: 0.039
170
- },
171
- "gemini-3.1-flash-image-preview": {
172
- inputPerMillion: 0.5,
173
- outputPerMillion: 3,
174
- outputImagePerImage: 0.045
175
- },
176
- "gemini-3-pro-image-preview": {
177
- inputPerMillion: 2,
178
- outputPerMillion: 12,
179
- outputImagePerImage: 0.134
180
- },
181
- "nano-banana-pro-preview": {
182
- inputPerMillion: 2,
183
- outputPerMillion: 12,
184
- outputImagePerImage: 0.134
185
- },
186
- "imagen-4.0-generate-001": {
187
- inputPerMillion: 0,
188
- outputImagePerImage: 0.04
189
- },
190
- "imagen-4.0-fast-generate-001": {
191
- inputPerMillion: 0,
192
- outputImagePerImage: 0.02
193
- },
194
- "imagen-4.0-ultra-generate-001": {
195
- inputPerMillion: 0,
196
- outputImagePerImage: 0.06
197
- },
198
- "imagen-3.0-capability-001": {
199
- inputPerMillion: 0,
200
- outputImagePerImage: 0.04
201
- },
202
- "gemma-4-31b-it": {
203
- inputPerMillion: 0,
204
- outputPerMillion: 0,
205
- cachedInputPerMillion: 0
206
- }
207
- };
208
- var MODEL_PRICING_PREFIXES = [
209
- {
210
- prefix: "gemini-3.1-pro-preview",
211
- pricing: MODEL_PRICING["gemini-3.1-pro-preview"]
212
- },
213
- {
214
- prefix: "gemini-3-pro-preview",
215
- pricing: MODEL_PRICING["gemini-3-pro-preview"]
216
- },
217
- {
218
- prefix: "gemini-3-flash-preview",
219
- pricing: MODEL_PRICING["gemini-3-flash-preview"]
220
- },
221
- {
222
- prefix: "gemini-3.1-flash-lite-preview",
223
- pricing: MODEL_PRICING["gemini-3.1-flash-lite-preview"]
224
- },
225
- {
226
- prefix: "gemini-2.5-flash-lite-preview-",
227
- pricing: MODEL_PRICING["gemini-2.5-flash-lite"]
228
- },
229
- {
230
- prefix: "gemini-flash-latest",
231
- pricing: MODEL_PRICING["gemini-2.5-flash"]
232
- },
233
- {
234
- prefix: "gemini-flash-lite-latest",
235
- pricing: MODEL_PRICING["gemini-2.5-flash-lite"]
236
- },
237
- {
238
- prefix: "gemini-pro-latest",
239
- pricing: MODEL_PRICING["gemini-2.5-pro"]
240
- },
241
- {
242
- prefix: "gemma-4-",
243
- pricing: {
244
- inputPerMillion: 0,
245
- outputPerMillion: 0,
246
- cachedInputPerMillion: 0
247
- }
248
- },
249
- {
250
- prefix: "gemma-3-",
251
- pricing: {
252
- inputPerMillion: 0,
253
- outputPerMillion: 0,
254
- cachedInputPerMillion: 0
255
- }
256
- },
257
- {
258
- prefix: "gemma-3n-",
259
- pricing: {
260
- inputPerMillion: 0,
261
- outputPerMillion: 0,
262
- cachedInputPerMillion: 0
263
- }
264
- }
265
- ];
266
- function normalizeGoogleModelId(modelId) {
267
- return modelId.trim().toLowerCase().replace(/^google\//, "").replace(/^models\//, "").replace(/^publishers\/google\/models\//, "");
268
- }
269
- function normalizeModality(modality) {
270
- const normalized = (modality || "").trim().toLowerCase();
271
- if (normalized === "text") return "text";
272
- if (normalized === "image") return "image";
273
- if (normalized === "video") return "video";
274
- if (normalized === "audio") return "audio";
275
- if (normalized === "document") return "document";
276
- return "unspecified";
277
- }
278
- function toModalityCounts(details) {
279
- const counts = {};
280
- for (const detail of details || []) {
281
- const modality = normalizeModality(detail.modality);
282
- const tokenCount = Math.max(detail.tokenCount ?? 0, 0);
283
- counts[modality] = (counts[modality] ?? 0) + tokenCount;
284
- }
285
- return counts;
286
- }
287
- function sumModalityCosts(counts, modalityRates, defaultRate) {
288
- let total = 0;
289
- for (const [modality, tokenCount] of Object.entries(counts)) {
290
- if (!tokenCount) continue;
291
- const rate = modalityRates?.[modality] ?? defaultRate;
292
- total += tokenCount / 1e6 * rate;
293
- }
294
- return total;
295
- }
296
- function getGoogleModelPricing(modelId) {
297
- const normalizedModelId = normalizeGoogleModelId(modelId);
298
- const exact = MODEL_PRICING[normalizedModelId];
299
- if (exact) return exact;
300
- return MODEL_PRICING_PREFIXES.find((entry) => normalizedModelId.startsWith(entry.prefix))?.pricing;
301
- }
302
- function calculateGoogleUsageCost(modelId, usage, imageCount = 0) {
303
- const pricing = getGoogleModelPricing(modelId);
304
- if (!pricing) return void 0;
305
- const cachedTokens = usage.cachedTokens ?? 0;
306
- const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);
307
- const useLongContext = pricing.longContextThreshold != null && usage.promptTokens > pricing.longContextThreshold;
308
- const inputRate = useLongContext ? pricing.longInputPerMillion ?? pricing.inputPerMillion : pricing.inputPerMillion;
309
- const outputRate = useLongContext ? pricing.longOutputPerMillion ?? pricing.outputPerMillion ?? 0 : pricing.outputPerMillion ?? 0;
310
- const cachedRate = useLongContext ? pricing.longCachedInputPerMillion ?? pricing.cachedInputPerMillion ?? 0 : pricing.cachedInputPerMillion ?? 0;
311
- const billableOutputTokens = usage.completionTokens + (usage.reasoningTokens ?? 0);
312
- const promptModalityCounts = toModalityCounts(usage.promptTokenDetails);
313
- const cachedModalityCounts = toModalityCounts(usage.cachedTokenDetails);
314
- const uncachedPromptModalityCounts = {};
315
- for (const modality of /* @__PURE__ */ new Set([
316
- ...Object.keys(promptModalityCounts),
317
- ...Object.keys(cachedModalityCounts)
318
- ])) {
319
- uncachedPromptModalityCounts[modality] = Math.max(
320
- (promptModalityCounts[modality] ?? 0) - (cachedModalityCounts[modality] ?? 0),
321
- 0
322
- );
323
- }
324
- const completionModalityCounts = toModalityCounts(usage.completionTokenDetails);
325
- if (usage.reasoningTokens) {
326
- completionModalityCounts.text = (completionModalityCounts.text ?? 0) + usage.reasoningTokens;
327
- }
328
- const hasPromptModalityPricing = Object.keys(uncachedPromptModalityCounts).length > 0 && pricing.inputByModalityPerMillion;
329
- const hasCachedModalityPricing = Object.keys(cachedModalityCounts).length > 0 && pricing.cachedByModalityPerMillion;
330
- const hasOutputModalityPricing = Object.keys(completionModalityCounts).length > 0 && pricing.outputByModalityPerMillion;
331
- const inputCost = hasPromptModalityPricing ? sumModalityCosts(uncachedPromptModalityCounts, pricing.inputByModalityPerMillion, inputRate) : uncachedPromptTokens / 1e6 * inputRate;
332
- const cachedCost = hasCachedModalityPricing ? sumModalityCosts(cachedModalityCounts, pricing.cachedByModalityPerMillion, cachedRate) : cachedTokens / 1e6 * cachedRate;
333
- const outputCost = hasOutputModalityPricing ? sumModalityCosts(completionModalityCounts, pricing.outputByModalityPerMillion, outputRate) : billableOutputTokens / 1e6 * outputRate;
334
- const imageCost = imageCount * (pricing.outputImagePerImage ?? 0);
335
- return Number((inputCost + cachedCost + outputCost + imageCost).toFixed(12));
336
- }
337
-
338
25
  // src/GoogleProvider.ts
339
26
  var STATIC_MODELS = [
340
27
  {
@@ -1251,6 +938,8 @@ var google = Object.assign(
1251
938
  );
1252
939
  export {
1253
940
  GoogleProvider,
941
+ calculateGoogleUsageCost,
942
+ getGoogleModelPricing,
1254
943
  google,
1255
944
  googleProviderOptions
1256
945
  };
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 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 googleRestBaseUrl(baseUrl: string | undefined): string {\n const normalized = (baseUrl || 'https://generativelanguage.googleapis.com/v1beta').replace(/\\/$/, '');\n if (/\\/v1(?:beta|alpha)?$/.test(normalized)) return normalized;\n return `${normalized}/v1beta`;\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 const baseUrl = googleRestBaseUrl(this.config.baseUrl);\n\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 const { model: _model, ...body } = this.buildGenerateContentParams(request);\n\n return {\n body,\n messagesPath: 'contents',\n metadata: {\n endpoint: `${baseUrl}/models/${encodeURIComponent(normalizeModelId(request.model))}: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"]}
1
+ {"version":3,"sources":["../src/GoogleProvider.ts","../src/icons.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 googleRestBaseUrl(baseUrl: string | undefined): string {\n const normalized = (baseUrl || 'https://generativelanguage.googleapis.com/v1beta').replace(/\\/$/, '');\n if (/\\/v1(?:beta|alpha)?$/.test(normalized)) return normalized;\n return `${normalized}/v1beta`;\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 const baseUrl = googleRestBaseUrl(this.config.baseUrl);\n\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 const { model: _model, ...body } = this.buildGenerateContentParams(request);\n\n return {\n body,\n messagesPath: 'contents',\n metadata: {\n endpoint: `${baseUrl}/models/${encodeURIComponent(normalizeModelId(request.model))}: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 { 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';\nexport {\n calculateGoogleUsageCost,\n getGoogleModelPricing,\n type GoogleModelPricing,\n} from './pricing';\n"],"mappings":"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","names":["google"]}
@@ -0,0 +1 @@
1
+ export { GoogleModalityTokenCount, GoogleModelPricing, calculateGoogleUsageCost, getGoogleModelPricing } from '@standardagents/provider-pricing';
@@ -0,0 +1,9 @@
1
+ import {
2
+ calculateGoogleUsageCost,
3
+ getGoogleModelPricing
4
+ } from "./chunk-J3SOF4AE.js";
5
+ export {
6
+ calculateGoogleUsageCost,
7
+ getGoogleModelPricing
8
+ };
9
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standardagents/google",
3
- "version": "0.21.1",
3
+ "version": "0.22.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -14,6 +14,10 @@
14
14
  ".": {
15
15
  "types": "./dist/index.d.ts",
16
16
  "import": "./dist/index.js"
17
+ },
18
+ "./pricing": {
19
+ "types": "./dist/pricing.d.ts",
20
+ "import": "./dist/pricing.js"
17
21
  }
18
22
  },
19
23
  "files": [
@@ -22,15 +26,16 @@
22
26
  ],
23
27
  "dependencies": {
24
28
  "@google/genai": "^1.47.0",
25
- "zod": "^4.3.5"
29
+ "zod": "^4.3.5",
30
+ "@standardagents/provider-pricing": "0.22.0"
26
31
  },
27
32
  "peerDependencies": {
28
- "@standardagents/spec": "^0.21.1"
33
+ "@standardagents/spec": "^0.22.0"
29
34
  },
30
35
  "devDependencies": {
31
36
  "tsup": "^8.3.5",
32
37
  "typescript": "^5.9.0",
33
- "@standardagents/spec": "0.21.1"
38
+ "@standardagents/spec": "0.22.0"
34
39
  },
35
40
  "keywords": [
36
41
  "standardagents",