@elizaos/plugin-google-genai 1.1.0 → 2.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js DELETED
@@ -1,582 +0,0 @@
1
- // src/index.ts
2
- import { logger as logger7, ModelType as ModelType3 } from "@elizaos/core";
3
-
4
- // src/init.ts
5
- import { GoogleGenAI as GoogleGenAI2 } from "@google/genai";
6
- import { logger as logger2 } from "@elizaos/core";
7
-
8
- // src/utils/config.ts
9
- import { GoogleGenAI, HarmCategory, HarmBlockThreshold } from "@google/genai";
10
- import { logger } from "@elizaos/core";
11
- function getSetting(runtime, key, defaultValue) {
12
- return runtime.getSetting(key) ?? process.env[key] ?? defaultValue;
13
- }
14
- function getApiKey(runtime) {
15
- return getSetting(runtime, "GOOGLE_GENERATIVE_AI_API_KEY");
16
- }
17
- function getSmallModel(runtime) {
18
- return getSetting(runtime, "GOOGLE_SMALL_MODEL") ?? getSetting(runtime, "SMALL_MODEL", "gemini-2.0-flash-001") ?? "gemini-2.0-flash-001";
19
- }
20
- function getLargeModel(runtime) {
21
- return getSetting(runtime, "GOOGLE_LARGE_MODEL") ?? getSetting(runtime, "LARGE_MODEL", "gemini-2.5-pro-preview-03-25") ?? "gemini-2.5-pro-preview-03-25";
22
- }
23
- function getImageModel(runtime) {
24
- return getSetting(runtime, "GOOGLE_IMAGE_MODEL") ?? getSetting(runtime, "IMAGE_MODEL", "gemini-2.5-pro-preview-03-25") ?? "gemini-2.5-pro-preview-03-25";
25
- }
26
- function getEmbeddingModel(runtime) {
27
- return getSetting(runtime, "GOOGLE_EMBEDDING_MODEL", "text-embedding-004") ?? "text-embedding-004";
28
- }
29
- function createGoogleGenAI(runtime) {
30
- const apiKey = getApiKey(runtime);
31
- if (!apiKey) {
32
- logger.error("Google Generative AI API Key is missing");
33
- return null;
34
- }
35
- return new GoogleGenAI({ apiKey });
36
- }
37
- function getSafetySettings() {
38
- return [
39
- {
40
- category: HarmCategory.HARM_CATEGORY_HARASSMENT,
41
- threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
42
- },
43
- {
44
- category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
45
- threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
46
- },
47
- {
48
- category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
49
- threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
50
- },
51
- {
52
- category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
53
- threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
54
- }
55
- ];
56
- }
57
-
58
- // src/init.ts
59
- function initializeGoogleGenAI(_config, runtime) {
60
- void (async () => {
61
- try {
62
- const apiKey = getApiKey(runtime);
63
- if (!apiKey) {
64
- logger2.warn(
65
- "GOOGLE_GENERATIVE_AI_API_KEY is not set in environment - Google AI functionality will be limited"
66
- );
67
- return;
68
- }
69
- try {
70
- const genAI = new GoogleGenAI2({ apiKey });
71
- const modelList = await genAI.models.list();
72
- const models = [];
73
- for await (const model of modelList) {
74
- models.push(model);
75
- }
76
- logger2.log(`Google AI API key validated successfully. Available models: ${models.length}`);
77
- } catch (fetchError) {
78
- const message = fetchError instanceof Error ? fetchError.message : String(fetchError);
79
- logger2.warn(`Error validating Google AI API key: ${message}`);
80
- logger2.warn("Google AI functionality will be limited until a valid API key is provided");
81
- }
82
- } catch (error) {
83
- const message = error instanceof Error ? error.message : String(error);
84
- logger2.warn(
85
- `Google AI plugin configuration issue: ${message} - You need to configure the GOOGLE_GENERATIVE_AI_API_KEY in your environment variables`
86
- );
87
- }
88
- })();
89
- }
90
-
91
- // src/models/text.ts
92
- import { logger as logger3, ModelType } from "@elizaos/core";
93
-
94
- // src/utils/events.ts
95
- import { EventType } from "@elizaos/core";
96
- function emitModelUsageEvent(runtime, type, prompt, usage) {
97
- runtime.emitEvent(EventType.MODEL_USED, {
98
- provider: "google",
99
- type,
100
- prompt,
101
- tokens: {
102
- prompt: usage.promptTokens,
103
- completion: usage.completionTokens,
104
- total: usage.totalTokens
105
- }
106
- });
107
- }
108
-
109
- // src/utils/tokenization.ts
110
- async function countTokens(text) {
111
- return Math.ceil(text.length / 4);
112
- }
113
-
114
- // src/models/text.ts
115
- async function handleTextSmall(runtime, {
116
- prompt,
117
- stopSequences = [],
118
- maxTokens = 8192,
119
- temperature = 0.7,
120
- frequencyPenalty = 0.7,
121
- presencePenalty = 0.7
122
- }) {
123
- const genAI = createGoogleGenAI(runtime);
124
- if (!genAI) {
125
- throw new Error("Google Generative AI client not initialized");
126
- }
127
- const modelName = getSmallModel(runtime);
128
- logger3.log(`[TEXT_SMALL] Using model: ${modelName}`);
129
- logger3.debug(`[TEXT_SMALL] Prompt: ${prompt}`);
130
- try {
131
- const systemInstruction = runtime.character.system || void 0;
132
- const response = await genAI.models.generateContent({
133
- model: modelName,
134
- contents: prompt,
135
- config: {
136
- temperature,
137
- topK: 40,
138
- topP: 0.95,
139
- maxOutputTokens: maxTokens,
140
- stopSequences,
141
- safetySettings: getSafetySettings(),
142
- ...systemInstruction && { systemInstruction }
143
- }
144
- });
145
- const text = response.text || "";
146
- const promptTokens = await countTokens(prompt);
147
- const completionTokens = await countTokens(text);
148
- emitModelUsageEvent(runtime, ModelType.TEXT_SMALL, prompt, {
149
- promptTokens,
150
- completionTokens,
151
- totalTokens: promptTokens + completionTokens
152
- });
153
- return text;
154
- } catch (error) {
155
- const message = error instanceof Error ? error.message : String(error);
156
- logger3.error(`[TEXT_SMALL] Error: ${message}`);
157
- throw error;
158
- }
159
- }
160
- async function handleTextLarge(runtime, {
161
- prompt,
162
- stopSequences = [],
163
- maxTokens = 8192,
164
- temperature = 0.7,
165
- frequencyPenalty = 0.7,
166
- presencePenalty = 0.7
167
- }) {
168
- const genAI = createGoogleGenAI(runtime);
169
- if (!genAI) {
170
- throw new Error("Google Generative AI client not initialized");
171
- }
172
- const modelName = getLargeModel(runtime);
173
- logger3.log(`[TEXT_LARGE] Using model: ${modelName}`);
174
- logger3.debug(`[TEXT_LARGE] Prompt: ${prompt}`);
175
- try {
176
- const systemInstruction = runtime.character.system || void 0;
177
- const response = await genAI.models.generateContent({
178
- model: modelName,
179
- contents: prompt,
180
- config: {
181
- temperature,
182
- topK: 40,
183
- topP: 0.95,
184
- maxOutputTokens: maxTokens,
185
- stopSequences,
186
- safetySettings: getSafetySettings(),
187
- ...systemInstruction && { systemInstruction }
188
- }
189
- });
190
- const text = response.text || "";
191
- const promptTokens = await countTokens(prompt);
192
- const completionTokens = await countTokens(text);
193
- emitModelUsageEvent(runtime, ModelType.TEXT_LARGE, prompt, {
194
- promptTokens,
195
- completionTokens,
196
- totalTokens: promptTokens + completionTokens
197
- });
198
- return text;
199
- } catch (error) {
200
- const message = error instanceof Error ? error.message : String(error);
201
- logger3.error(`[TEXT_LARGE] Error: ${message}`);
202
- throw error;
203
- }
204
- }
205
-
206
- // src/models/embedding.ts
207
- import { logger as logger4, ModelType as ModelType2 } from "@elizaos/core";
208
- async function handleTextEmbedding(runtime, params) {
209
- const genAI = createGoogleGenAI(runtime);
210
- if (!genAI) {
211
- throw new Error("Google Generative AI client not initialized");
212
- }
213
- const embeddingModelName = getEmbeddingModel(runtime);
214
- logger4.debug(`[TEXT_EMBEDDING] Using model: ${embeddingModelName}`);
215
- if (params === null) {
216
- logger4.debug("Creating test embedding for initialization");
217
- const dimension = 768;
218
- const testVector = Array(dimension).fill(0);
219
- testVector[0] = 0.1;
220
- return testVector;
221
- }
222
- let text;
223
- if (typeof params === "string") {
224
- text = params;
225
- } else if (typeof params === "object" && params.text) {
226
- text = params.text;
227
- } else {
228
- logger4.warn("Invalid input format for embedding");
229
- const dimension = 768;
230
- const fallbackVector = Array(dimension).fill(0);
231
- fallbackVector[0] = 0.2;
232
- return fallbackVector;
233
- }
234
- if (!text.trim()) {
235
- logger4.warn("Empty text for embedding");
236
- const dimension = 768;
237
- const emptyVector = Array(dimension).fill(0);
238
- emptyVector[0] = 0.3;
239
- return emptyVector;
240
- }
241
- try {
242
- const response = await genAI.models.embedContent({
243
- model: embeddingModelName,
244
- contents: text
245
- });
246
- const embedding = response.embeddings?.[0]?.values || [];
247
- const promptTokens = await countTokens(text);
248
- emitModelUsageEvent(runtime, ModelType2.TEXT_EMBEDDING, text, {
249
- promptTokens,
250
- completionTokens: 0,
251
- totalTokens: promptTokens
252
- });
253
- logger4.log(`Got embedding with length ${embedding.length}`);
254
- return embedding;
255
- } catch (error) {
256
- const message = error instanceof Error ? error.message : String(error);
257
- logger4.error(`Error generating embedding: ${message}`);
258
- const dimension = 768;
259
- const errorVector = Array(dimension).fill(0);
260
- errorVector[0] = 0.6;
261
- return errorVector;
262
- }
263
- }
264
-
265
- // src/models/image.ts
266
- import { logger as logger5 } from "@elizaos/core";
267
- import { fetch } from "undici";
268
- async function handleImageDescription(runtime, params) {
269
- const genAI = createGoogleGenAI(runtime);
270
- if (!genAI) {
271
- throw new Error("Google Generative AI client not initialized");
272
- }
273
- let imageUrl;
274
- let promptText;
275
- const modelName = getImageModel(runtime);
276
- logger5.log(`[IMAGE_DESCRIPTION] Using model: ${modelName}`);
277
- if (typeof params === "string") {
278
- imageUrl = params;
279
- promptText = "Please analyze this image and provide a title and detailed description.";
280
- } else {
281
- imageUrl = params.imageUrl;
282
- promptText = params.prompt || "Please analyze this image and provide a title and detailed description.";
283
- }
284
- try {
285
- const imageResponse = await fetch(imageUrl);
286
- if (!imageResponse.ok) {
287
- throw new Error(`Failed to fetch image: ${imageResponse.statusText}`);
288
- }
289
- const imageData = await imageResponse.arrayBuffer();
290
- const base64Image = Buffer.from(imageData).toString("base64");
291
- const contentType = imageResponse.headers.get("content-type") || "image/jpeg";
292
- const response = await genAI.models.generateContent({
293
- model: modelName,
294
- contents: [
295
- {
296
- role: "user",
297
- parts: [
298
- { text: promptText },
299
- {
300
- inlineData: {
301
- mimeType: contentType,
302
- data: base64Image
303
- }
304
- }
305
- ]
306
- }
307
- ],
308
- config: {
309
- temperature: 0.7,
310
- topK: 40,
311
- topP: 0.95,
312
- maxOutputTokens: 8192,
313
- safetySettings: getSafetySettings()
314
- }
315
- });
316
- const responseText = response.text || "";
317
- logger5.log("Received response for image description");
318
- const isCustomPrompt = typeof params === "object" && params.prompt && params.prompt !== "Please analyze this image and provide a title and detailed description.";
319
- if (isCustomPrompt) {
320
- return responseText;
321
- }
322
- try {
323
- const jsonResponse = JSON.parse(responseText);
324
- if (jsonResponse.title && jsonResponse.description) {
325
- return jsonResponse;
326
- }
327
- } catch (e) {
328
- logger5.debug(`Parsing as JSON failed, processing as text: ${e}`);
329
- }
330
- const titleMatch = responseText.match(/title[:\s]+(.+?)(?:\n|$)/i);
331
- const title = titleMatch?.[1]?.trim() || "Image Analysis";
332
- const description = responseText.replace(/title[:\s]+(.+?)(?:\n|$)/i, "").trim();
333
- return { title, description };
334
- } catch (error) {
335
- const message = error instanceof Error ? error.message : String(error);
336
- logger5.error(`Error analyzing image: ${message}`);
337
- return {
338
- title: "Failed to analyze image",
339
- description: `Error: ${message}`
340
- };
341
- }
342
- }
343
-
344
- // src/models/object.ts
345
- import { logger as logger6 } from "@elizaos/core";
346
- async function generateObjectByModelType(runtime, params, modelType, getModelFn) {
347
- const genAI = createGoogleGenAI(runtime);
348
- if (!genAI) {
349
- throw new Error("Google Generative AI client not initialized");
350
- }
351
- const modelName = getModelFn(runtime);
352
- const temperature = params.temperature ?? 0.1;
353
- logger6.info(`Using ${modelType} model: ${modelName}`);
354
- try {
355
- let enhancedPrompt = params.prompt;
356
- if (params.schema) {
357
- enhancedPrompt += `
358
-
359
- Please respond with a JSON object that follows this schema:
360
- ${JSON.stringify(params.schema, null, 2)}`;
361
- }
362
- const response = await genAI.models.generateContent({
363
- model: modelName,
364
- contents: enhancedPrompt,
365
- config: {
366
- temperature,
367
- topK: 40,
368
- topP: 0.95,
369
- maxOutputTokens: 8192,
370
- responseMimeType: "application/json",
371
- safetySettings: getSafetySettings()
372
- }
373
- });
374
- const text = response.text || "";
375
- const promptTokens = await countTokens(enhancedPrompt);
376
- const completionTokens = await countTokens(text);
377
- emitModelUsageEvent(runtime, modelType, params.prompt, {
378
- promptTokens,
379
- completionTokens,
380
- totalTokens: promptTokens + completionTokens
381
- });
382
- try {
383
- const parsedResult = JSON.parse(text);
384
- return parsedResult;
385
- } catch (parseError) {
386
- logger6.error(
387
- `Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : String(parseError)}`
388
- );
389
- const jsonMatch = text.match(/\{[\s\S]*\}/);
390
- if (jsonMatch) {
391
- try {
392
- const extractedResult = JSON.parse(jsonMatch[0]);
393
- return extractedResult;
394
- } catch (secondParseError) {
395
- throw new Error("Failed to parse JSON from response");
396
- }
397
- }
398
- throw parseError;
399
- }
400
- } catch (error) {
401
- const message = error instanceof Error ? error.message : String(error);
402
- logger6.error(`[generateObject] Error: ${message}`);
403
- throw error;
404
- }
405
- }
406
- async function handleObjectSmall(runtime, params) {
407
- return generateObjectByModelType(runtime, params, "OBJECT_SMALL", getSmallModel);
408
- }
409
- async function handleObjectLarge(runtime, params) {
410
- return generateObjectByModelType(runtime, params, "OBJECT_LARGE", getLargeModel);
411
- }
412
-
413
- // src/index.ts
414
- import { GoogleGenAI as GoogleGenAI3 } from "@google/genai";
415
- var googleGenAIPlugin = {
416
- name: "google-genai",
417
- description: "Google Generative AI plugin for Gemini models",
418
- config: {
419
- GOOGLE_GENERATIVE_AI_API_KEY: process.env.GOOGLE_GENERATIVE_AI_API_KEY,
420
- GOOGLE_SMALL_MODEL: process.env.GOOGLE_SMALL_MODEL,
421
- GOOGLE_LARGE_MODEL: process.env.GOOGLE_LARGE_MODEL,
422
- GOOGLE_IMAGE_MODEL: process.env.GOOGLE_IMAGE_MODEL,
423
- GOOGLE_EMBEDDING_MODEL: process.env.GOOGLE_EMBEDDING_MODEL,
424
- SMALL_MODEL: process.env.SMALL_MODEL,
425
- LARGE_MODEL: process.env.LARGE_MODEL,
426
- IMAGE_MODEL: process.env.IMAGE_MODEL
427
- },
428
- async init(_config, runtime) {
429
- initializeGoogleGenAI(_config, runtime);
430
- },
431
- models: {
432
- [ModelType3.TEXT_SMALL]: async (runtime, params) => {
433
- return handleTextSmall(runtime, params);
434
- },
435
- [ModelType3.TEXT_LARGE]: async (runtime, params) => {
436
- return handleTextLarge(runtime, params);
437
- },
438
- [ModelType3.TEXT_EMBEDDING]: async (runtime, params) => {
439
- return handleTextEmbedding(runtime, params);
440
- },
441
- [ModelType3.IMAGE_DESCRIPTION]: async (runtime, params) => {
442
- return handleImageDescription(runtime, params);
443
- },
444
- [ModelType3.OBJECT_SMALL]: async (runtime, params) => {
445
- return handleObjectSmall(runtime, params);
446
- },
447
- [ModelType3.OBJECT_LARGE]: async (runtime, params) => {
448
- return handleObjectLarge(runtime, params);
449
- }
450
- },
451
- tests: [
452
- {
453
- name: "google_genai_plugin_tests",
454
- tests: [
455
- {
456
- name: "google_test_api_key_validation",
457
- fn: async (runtime) => {
458
- const apiKey = getApiKey(runtime);
459
- if (!apiKey) {
460
- throw new Error("GOOGLE_GENERATIVE_AI_API_KEY not set");
461
- }
462
- const genAI = new GoogleGenAI3({ apiKey });
463
- const modelList = await genAI.models.list();
464
- const models = [];
465
- for await (const model of modelList) {
466
- models.push(model);
467
- }
468
- logger7.log(`Available models: ${models.length}`);
469
- }
470
- },
471
- {
472
- name: "google_test_text_embedding",
473
- fn: async (runtime) => {
474
- try {
475
- const embedding = await runtime.useModel(ModelType3.TEXT_EMBEDDING, {
476
- text: "Hello, world!"
477
- });
478
- logger7.log(`Embedding dimension: ${embedding.length}`);
479
- if (embedding.length === 0) {
480
- throw new Error("Failed to generate embedding");
481
- }
482
- } catch (error) {
483
- const message = error instanceof Error ? error.message : String(error);
484
- logger7.error(`Error in test_text_embedding: ${message}`);
485
- throw error;
486
- }
487
- }
488
- },
489
- {
490
- name: "google_test_text_small",
491
- fn: async (runtime) => {
492
- try {
493
- const text = await runtime.useModel(ModelType3.TEXT_SMALL, {
494
- prompt: "What is the nature of reality in 10 words?"
495
- });
496
- if (text.length === 0) {
497
- throw new Error("Failed to generate text");
498
- }
499
- logger7.log("Generated with TEXT_SMALL:", text);
500
- } catch (error) {
501
- const message = error instanceof Error ? error.message : String(error);
502
- logger7.error(`Error in test_text_small: ${message}`);
503
- throw error;
504
- }
505
- }
506
- },
507
- {
508
- name: "google_test_text_large",
509
- fn: async (runtime) => {
510
- try {
511
- const text = await runtime.useModel(ModelType3.TEXT_LARGE, {
512
- prompt: "Explain quantum mechanics in simple terms."
513
- });
514
- if (text.length === 0) {
515
- throw new Error("Failed to generate text");
516
- }
517
- logger7.log("Generated with TEXT_LARGE:", text.substring(0, 100) + "...");
518
- } catch (error) {
519
- const message = error instanceof Error ? error.message : String(error);
520
- logger7.error(`Error in test_text_large: ${message}`);
521
- throw error;
522
- }
523
- }
524
- },
525
- {
526
- name: "google_test_image_description",
527
- fn: async (runtime) => {
528
- try {
529
- const result = await runtime.useModel(
530
- ModelType3.IMAGE_DESCRIPTION,
531
- "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg/537px-Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg"
532
- );
533
- if (result && typeof result === "object" && "title" in result && "description" in result) {
534
- logger7.log("Image description:", JSON.stringify(result));
535
- } else {
536
- logger7.error("Invalid image description result format:", result);
537
- }
538
- } catch (error) {
539
- const message = error instanceof Error ? error.message : String(error);
540
- logger7.error(`Error in test_image_description: ${message}`);
541
- throw error;
542
- }
543
- }
544
- },
545
- {
546
- name: "google_test_object_generation",
547
- fn: async (runtime) => {
548
- try {
549
- const schema = {
550
- type: "object",
551
- properties: {
552
- name: { type: "string" },
553
- age: { type: "number" },
554
- hobbies: { type: "array", items: { type: "string" } }
555
- },
556
- required: ["name", "age", "hobbies"]
557
- };
558
- const result = await runtime.useModel(ModelType3.OBJECT_SMALL, {
559
- prompt: "Generate a person profile with name, age, and hobbies.",
560
- schema
561
- });
562
- logger7.log("Generated object:", result);
563
- if (!result.name || !result.age || !result.hobbies) {
564
- throw new Error("Generated object missing required fields");
565
- }
566
- } catch (error) {
567
- const message = error instanceof Error ? error.message : String(error);
568
- logger7.error(`Error in test_object_generation: ${message}`);
569
- throw error;
570
- }
571
- }
572
- }
573
- ]
574
- }
575
- ]
576
- };
577
- var index_default = googleGenAIPlugin;
578
- export {
579
- index_default as default,
580
- googleGenAIPlugin
581
- };
582
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/utils/config.ts","../src/models/text.ts","../src/utils/events.ts","../src/utils/tokenization.ts","../src/models/embedding.ts","../src/models/image.ts","../src/models/object.ts"],"sourcesContent":["import type {\n IAgentRuntime,\n Plugin,\n GenerateTextParams,\n ImageDescriptionParams,\n TextEmbeddingParams,\n ObjectGenerationParams,\n} from '@elizaos/core';\nimport { logger, ModelType } from '@elizaos/core';\nimport { initializeGoogleGenAI } from './init';\nimport {\n handleTextSmall,\n handleTextLarge,\n handleTextEmbedding,\n handleImageDescription,\n handleObjectSmall,\n handleObjectLarge,\n} from './models';\nimport { getApiKey } from './utils/config';\nimport { GoogleGenAI } from '@google/genai';\n\nexport * from './types';\n\n/**\n * Defines the Google Generative AI plugin with its name, description, and configuration options.\n * @type {Plugin}\n *\n * Available models as of March 2025:\n * - gemini-2.0-flash-001: Fast, efficient model for everyday tasks\n * - gemini-2.5-pro-exp-03-25: Latest experimental model with advanced reasoning (March 25, 2025)\n * - gemini-2.5-pro-preview-05-06: Preview version from Google I/O 2025\n * - gemini-2.5-pro: General model name for Gemini 2.5 Pro\n * - text-embedding-004: For text embeddings\n */\nexport const googleGenAIPlugin: Plugin = {\n name: 'google-genai',\n description: 'Google Generative AI plugin for Gemini models',\n config: {\n GOOGLE_GENERATIVE_AI_API_KEY: process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n GOOGLE_SMALL_MODEL: process.env.GOOGLE_SMALL_MODEL,\n GOOGLE_LARGE_MODEL: process.env.GOOGLE_LARGE_MODEL,\n GOOGLE_IMAGE_MODEL: process.env.GOOGLE_IMAGE_MODEL,\n GOOGLE_EMBEDDING_MODEL: process.env.GOOGLE_EMBEDDING_MODEL,\n SMALL_MODEL: process.env.SMALL_MODEL,\n LARGE_MODEL: process.env.LARGE_MODEL,\n IMAGE_MODEL: process.env.IMAGE_MODEL,\n },\n async init(_config, runtime) {\n // Note: We intentionally don't await here because ElizaOS expects\n // the init method to return quickly. The initializeGoogleGenAI function\n // performs background validation and logging.\n initializeGoogleGenAI(_config, runtime);\n },\n models: {\n [ModelType.TEXT_SMALL]: async (runtime: IAgentRuntime, params: GenerateTextParams) => {\n return handleTextSmall(runtime, params);\n },\n [ModelType.TEXT_LARGE]: async (runtime: IAgentRuntime, params: GenerateTextParams) => {\n return handleTextLarge(runtime, params);\n },\n [ModelType.TEXT_EMBEDDING]: async (\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n ) => {\n return handleTextEmbedding(runtime, params);\n },\n [ModelType.IMAGE_DESCRIPTION]: async (\n runtime: IAgentRuntime,\n params: ImageDescriptionParams | string\n ) => {\n return handleImageDescription(runtime, params);\n },\n [ModelType.OBJECT_SMALL]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n return handleObjectSmall(runtime, params);\n },\n [ModelType.OBJECT_LARGE]: async (runtime: IAgentRuntime, params: ObjectGenerationParams) => {\n return handleObjectLarge(runtime, params);\n },\n },\n tests: [\n {\n name: 'google_genai_plugin_tests',\n tests: [\n {\n name: 'google_test_api_key_validation',\n fn: async (runtime: IAgentRuntime) => {\n const apiKey = getApiKey(runtime);\n if (!apiKey) {\n throw new Error('GOOGLE_GENERATIVE_AI_API_KEY not set');\n }\n const genAI = new GoogleGenAI({ apiKey });\n const modelList = await genAI.models.list();\n const models = [];\n for await (const model of modelList) {\n models.push(model);\n }\n logger.log(`Available models: ${models.length}`);\n },\n },\n {\n name: 'google_test_text_embedding',\n fn: async (runtime: IAgentRuntime) => {\n try {\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: 'Hello, world!',\n });\n logger.log(`Embedding dimension: ${embedding.length}`);\n if (embedding.length === 0) {\n throw new Error('Failed to generate embedding');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in test_text_embedding: ${message}`);\n throw error;\n }\n },\n },\n {\n name: 'google_test_text_small',\n fn: async (runtime: IAgentRuntime) => {\n try {\n const text = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: 'What is the nature of reality in 10 words?',\n });\n if (text.length === 0) {\n throw new Error('Failed to generate text');\n }\n logger.log('Generated with TEXT_SMALL:', text);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in test_text_small: ${message}`);\n throw error;\n }\n },\n },\n {\n name: 'google_test_text_large',\n fn: async (runtime: IAgentRuntime) => {\n try {\n const text = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: 'Explain quantum mechanics in simple terms.',\n });\n if (text.length === 0) {\n throw new Error('Failed to generate text');\n }\n logger.log('Generated with TEXT_LARGE:', text.substring(0, 100) + '...');\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in test_text_large: ${message}`);\n throw error;\n }\n },\n },\n {\n name: 'google_test_image_description',\n fn: async (runtime: IAgentRuntime) => {\n try {\n const result = await runtime.useModel(\n ModelType.IMAGE_DESCRIPTION,\n 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg/537px-Vitalik_Buterin_TechCrunch_London_2015_%28cropped%29.jpg'\n );\n\n if (\n result &&\n typeof result === 'object' &&\n 'title' in result &&\n 'description' in result\n ) {\n logger.log('Image description:', JSON.stringify(result));\n } else {\n logger.error('Invalid image description result format:', result);\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in test_image_description: ${message}`);\n throw error;\n }\n },\n },\n {\n name: 'google_test_object_generation',\n fn: async (runtime: IAgentRuntime) => {\n try {\n const schema = {\n type: 'object',\n properties: {\n name: { type: 'string' },\n age: { type: 'number' },\n hobbies: { type: 'array', items: { type: 'string' } },\n },\n required: ['name', 'age', 'hobbies'],\n };\n\n const result = await runtime.useModel(ModelType.OBJECT_SMALL, {\n prompt: 'Generate a person profile with name, age, and hobbies.',\n schema,\n });\n\n logger.log('Generated object:', result);\n\n if (!result.name || !result.age || !result.hobbies) {\n throw new Error('Generated object missing required fields');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error in test_object_generation: ${message}`);\n throw error;\n }\n },\n },\n ],\n },\n ],\n};\n\nexport default googleGenAIPlugin;\n","import { GoogleGenAI } from '@google/genai';\nimport { logger, type IAgentRuntime } from '@elizaos/core';\nimport { getApiKey } from './utils/config';\n\n/**\n * Initialize and validate Google Generative AI configuration\n */\nexport function initializeGoogleGenAI(_config: any, runtime: IAgentRuntime) {\n // Run validation in the background without blocking initialization\n void (async () => {\n try {\n const apiKey = getApiKey(runtime);\n if (!apiKey) {\n logger.warn(\n 'GOOGLE_GENERATIVE_AI_API_KEY is not set in environment - Google AI functionality will be limited'\n );\n return;\n }\n\n // Test the API key by listing models\n try {\n const genAI = new GoogleGenAI({ apiKey });\n const modelList = await genAI.models.list();\n const models = [];\n for await (const model of modelList) {\n models.push(model);\n }\n logger.log(`Google AI API key validated successfully. Available models: ${models.length}`);\n } catch (fetchError: unknown) {\n const message = fetchError instanceof Error ? fetchError.message : String(fetchError);\n logger.warn(`Error validating Google AI API key: ${message}`);\n logger.warn('Google AI functionality will be limited until a valid API key is provided');\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\n `Google AI plugin configuration issue: ${message} - You need to configure the GOOGLE_GENERATIVE_AI_API_KEY in your environment variables`\n );\n }\n })();\n}\n","import { GoogleGenAI, HarmCategory, HarmBlockThreshold } from '@google/genai';\nimport type { IAgentRuntime } from '@elizaos/core';\nimport { logger } from '@elizaos/core';\n\n/**\n * Retrieves a configuration setting from the runtime, falling back to environment variables or a default value if not found.\n *\n * @param key - The name of the setting to retrieve.\n * @param defaultValue - The value to return if the setting is not found in the runtime or environment.\n * @returns The resolved setting value, or {@link defaultValue} if not found.\n */\nexport function getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n return runtime.getSetting(key) ?? process.env[key] ?? defaultValue;\n}\n\n/**\n * Helper function to get the API key for Google AI\n *\n * @param runtime The runtime context\n * @returns The configured API key\n */\nexport function getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, 'GOOGLE_GENERATIVE_AI_API_KEY');\n}\n\n/**\n * Helper function to get the small model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured small model name\n */\nexport function getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'GOOGLE_SMALL_MODEL') ??\n getSetting(runtime, 'SMALL_MODEL', 'gemini-2.0-flash-001') ??\n 'gemini-2.0-flash-001'\n );\n}\n\n/**\n * Helper function to get the large model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured large model name\n */\nexport function getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'GOOGLE_LARGE_MODEL') ??\n getSetting(runtime, 'LARGE_MODEL', 'gemini-2.5-pro-preview-03-25') ??\n 'gemini-2.5-pro-preview-03-25'\n );\n}\n\n/**\n * Helper function to get the image model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured image model name\n */\nexport function getImageModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'GOOGLE_IMAGE_MODEL') ??\n getSetting(runtime, 'IMAGE_MODEL', 'gemini-2.5-pro-preview-03-25') ??\n 'gemini-2.5-pro-preview-03-25'\n );\n}\n\n/**\n * Helper function to get the embedding model name with fallbacks\n *\n * @param runtime The runtime context\n * @returns The configured embedding model name\n */\nexport function getEmbeddingModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, 'GOOGLE_EMBEDDING_MODEL', 'text-embedding-004') ?? 'text-embedding-004'\n );\n}\n\n/**\n * Create a Google Generative AI client instance with proper configuration\n *\n * @param runtime The runtime context\n * @returns Configured Google Generative AI instance\n */\nexport function createGoogleGenAI(runtime: IAgentRuntime): GoogleGenAI | null {\n const apiKey = getApiKey(runtime);\n if (!apiKey) {\n logger.error('Google Generative AI API Key is missing');\n return null;\n }\n\n return new GoogleGenAI({ apiKey });\n}\n\n/**\n * Convert safety settings to Google format\n */\nexport function getSafetySettings() {\n return [\n {\n category: HarmCategory.HARM_CATEGORY_HARASSMENT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n {\n category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,\n threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,\n },\n ];\n}\n","import type { IAgentRuntime, GenerateTextParams } from '@elizaos/core';\nimport { logger, ModelType } from '@elizaos/core';\nimport {\n createGoogleGenAI,\n getSafetySettings,\n getSmallModel,\n getLargeModel,\n} from '../utils/config';\nimport { emitModelUsageEvent } from '../utils/events';\nimport { countTokens } from '../utils/tokenization';\n\nexport async function handleTextSmall(\n runtime: IAgentRuntime,\n {\n prompt,\n stopSequences = [],\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n }: GenerateTextParams\n) {\n const genAI = createGoogleGenAI(runtime);\n if (!genAI) {\n throw new Error('Google Generative AI client not initialized');\n }\n\n const modelName = getSmallModel(runtime);\n\n logger.log(`[TEXT_SMALL] Using model: ${modelName}`);\n logger.debug(`[TEXT_SMALL] Prompt: ${prompt}`);\n\n try {\n const systemInstruction = runtime.character.system || undefined;\n const response = await genAI.models.generateContent({\n model: modelName,\n contents: prompt,\n config: {\n temperature,\n topK: 40,\n topP: 0.95,\n maxOutputTokens: maxTokens,\n stopSequences,\n safetySettings: getSafetySettings(),\n ...(systemInstruction && { systemInstruction }),\n },\n });\n\n const text = response.text || '';\n\n // Count tokens for usage tracking\n const promptTokens = await countTokens(prompt);\n const completionTokens = await countTokens(text);\n\n emitModelUsageEvent(runtime, ModelType.TEXT_SMALL, prompt, {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n });\n\n return text;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[TEXT_SMALL] Error: ${message}`);\n throw error;\n }\n}\n\nexport async function handleTextLarge(\n runtime: IAgentRuntime,\n {\n prompt,\n stopSequences = [],\n maxTokens = 8192,\n temperature = 0.7,\n frequencyPenalty = 0.7,\n presencePenalty = 0.7,\n }: GenerateTextParams\n) {\n const genAI = createGoogleGenAI(runtime);\n if (!genAI) {\n throw new Error('Google Generative AI client not initialized');\n }\n\n const modelName = getLargeModel(runtime);\n\n logger.log(`[TEXT_LARGE] Using model: ${modelName}`);\n logger.debug(`[TEXT_LARGE] Prompt: ${prompt}`);\n\n try {\n const systemInstruction = runtime.character.system || undefined;\n const response = await genAI.models.generateContent({\n model: modelName,\n contents: prompt,\n config: {\n temperature,\n topK: 40,\n topP: 0.95,\n maxOutputTokens: maxTokens,\n stopSequences,\n safetySettings: getSafetySettings(),\n ...(systemInstruction && { systemInstruction }),\n },\n });\n\n const text = response.text || '';\n\n // Count tokens for usage tracking\n const promptTokens = await countTokens(prompt);\n const completionTokens = await countTokens(text);\n\n emitModelUsageEvent(runtime, ModelType.TEXT_LARGE, prompt, {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n });\n\n return text;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[TEXT_LARGE] Error: ${message}`);\n throw error;\n }\n}\n","import type { IAgentRuntime, ModelTypeName } from '@elizaos/core';\nimport { EventType } from '@elizaos/core';\n\n/**\n * Emits a model usage event\n * @param runtime The runtime context\n * @param type The model type\n * @param prompt The prompt used\n * @param usage The usage data\n */\nexport function emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n prompt: string,\n usage: { promptTokens: number; completionTokens: number; totalTokens: number }\n) {\n runtime.emitEvent(EventType.MODEL_USED, {\n provider: 'google',\n type,\n prompt,\n tokens: {\n prompt: usage.promptTokens,\n completion: usage.completionTokens,\n total: usage.totalTokens,\n },\n });\n}\n","/**\n * Helper function to count tokens for a given text (estimation)\n */\nexport async function countTokens(text: string): Promise<number> {\n // Rough estimation: ~1 token per 4 characters\n return Math.ceil(text.length / 4);\n}\n","import type { IAgentRuntime, TextEmbeddingParams } from '@elizaos/core';\nimport { logger, ModelType } from '@elizaos/core';\nimport { createGoogleGenAI, getEmbeddingModel } from '../utils/config';\nimport { emitModelUsageEvent } from '../utils/events';\nimport { countTokens } from '../utils/tokenization';\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n const genAI = createGoogleGenAI(runtime);\n if (!genAI) {\n throw new Error('Google Generative AI client not initialized');\n }\n\n const embeddingModelName = getEmbeddingModel(runtime);\n logger.debug(`[TEXT_EMBEDDING] Using model: ${embeddingModelName}`);\n\n // Handle null case for initialization\n if (params === null) {\n logger.debug('Creating test embedding for initialization');\n // Return 768-dimensional vector for text-embedding-004\n const dimension = 768;\n const testVector = Array(dimension).fill(0);\n testVector[0] = 0.1;\n return testVector;\n }\n\n // Extract text from params\n let text: string;\n if (typeof params === 'string') {\n text = params;\n } else if (typeof params === 'object' && params.text) {\n text = params.text;\n } else {\n logger.warn('Invalid input format for embedding');\n const dimension = 768;\n const fallbackVector = Array(dimension).fill(0);\n fallbackVector[0] = 0.2;\n return fallbackVector;\n }\n\n if (!text.trim()) {\n logger.warn('Empty text for embedding');\n const dimension = 768;\n const emptyVector = Array(dimension).fill(0);\n emptyVector[0] = 0.3;\n return emptyVector;\n }\n\n try {\n const response = await genAI.models.embedContent({\n model: embeddingModelName,\n contents: text,\n });\n\n const embedding = response.embeddings?.[0]?.values || [];\n\n // Count tokens for usage tracking\n const promptTokens = await countTokens(text);\n\n emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, text, {\n promptTokens,\n completionTokens: 0,\n totalTokens: promptTokens,\n });\n\n logger.log(`Got embedding with length ${embedding.length}`);\n return embedding;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error generating embedding: ${message}`);\n // Return error vector\n const dimension = 768;\n const errorVector = Array(dimension).fill(0);\n errorVector[0] = 0.6;\n return errorVector;\n }\n}\n","import type { IAgentRuntime, ImageDescriptionParams } from '@elizaos/core';\nimport { logger } from '@elizaos/core';\nimport { fetch } from 'undici';\nimport { createGoogleGenAI, getSafetySettings, getImageModel } from '../utils/config';\n\nexport async function handleImageDescription(\n runtime: IAgentRuntime,\n params: ImageDescriptionParams | string\n) {\n const genAI = createGoogleGenAI(runtime);\n if (!genAI) {\n throw new Error('Google Generative AI client not initialized');\n }\n\n let imageUrl: string;\n let promptText: string | undefined;\n const modelName = getImageModel(runtime);\n logger.log(`[IMAGE_DESCRIPTION] Using model: ${modelName}`);\n\n if (typeof params === 'string') {\n imageUrl = params;\n promptText = 'Please analyze this image and provide a title and detailed description.';\n } else {\n imageUrl = params.imageUrl;\n promptText =\n params.prompt || 'Please analyze this image and provide a title and detailed description.';\n }\n\n try {\n // Fetch image data\n const imageResponse = await fetch(imageUrl);\n if (!imageResponse.ok) {\n throw new Error(`Failed to fetch image: ${imageResponse.statusText}`);\n }\n\n const imageData = await imageResponse.arrayBuffer();\n const base64Image = Buffer.from(imageData).toString('base64');\n\n // Determine MIME type from URL or response headers\n const contentType = imageResponse.headers.get('content-type') || 'image/jpeg';\n\n const response = await genAI.models.generateContent({\n model: modelName,\n contents: [\n {\n role: 'user',\n parts: [\n { text: promptText },\n {\n inlineData: {\n mimeType: contentType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n config: {\n temperature: 0.7,\n topK: 40,\n topP: 0.95,\n maxOutputTokens: 8192,\n safetySettings: getSafetySettings(),\n },\n });\n\n const responseText = response.text || '';\n\n logger.log('Received response for image description');\n\n // Check if a custom prompt was provided\n const isCustomPrompt =\n typeof params === 'object' &&\n params.prompt &&\n params.prompt !== 'Please analyze this image and provide a title and detailed description.';\n\n // If custom prompt is used, return the raw content\n if (isCustomPrompt) {\n return responseText;\n }\n\n // Try to parse the response as JSON first\n try {\n const jsonResponse = JSON.parse(responseText);\n if (jsonResponse.title && jsonResponse.description) {\n return jsonResponse;\n }\n } catch (e) {\n // If not valid JSON, process as text\n logger.debug(`Parsing as JSON failed, processing as text: ${e}`);\n }\n\n // Extract title and description from text format\n const titleMatch = responseText.match(/title[:\\s]+(.+?)(?:\\n|$)/i);\n const title = titleMatch?.[1]?.trim() || 'Image Analysis';\n const description = responseText.replace(/title[:\\s]+(.+?)(?:\\n|$)/i, '').trim();\n\n return { title, description };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error analyzing image: ${message}`);\n return {\n title: 'Failed to analyze image',\n description: `Error: ${message}`,\n };\n }\n}\n","import type { IAgentRuntime, ObjectGenerationParams, ModelTypeName } from '@elizaos/core';\nimport { logger } from '@elizaos/core';\nimport {\n createGoogleGenAI,\n getSafetySettings,\n getSmallModel,\n getLargeModel,\n} from '../utils/config';\nimport { emitModelUsageEvent } from '../utils/events';\nimport { countTokens } from '../utils/tokenization';\n\n/**\n * Helper function to generate objects using specified model type\n */\nasync function generateObjectByModelType(\n runtime: IAgentRuntime,\n params: ObjectGenerationParams,\n modelType: string,\n getModelFn: (runtime: IAgentRuntime) => string\n): Promise<any> {\n const genAI = createGoogleGenAI(runtime);\n if (!genAI) {\n throw new Error('Google Generative AI client not initialized');\n }\n\n const modelName = getModelFn(runtime);\n const temperature = params.temperature ?? 0.1;\n\n logger.info(`Using ${modelType} model: ${modelName}`);\n\n try {\n // Add schema instructions to prompt if provided\n let enhancedPrompt = params.prompt;\n if (params.schema) {\n enhancedPrompt += `\\n\\nPlease respond with a JSON object that follows this schema:\\n${JSON.stringify(params.schema, null, 2)}`;\n }\n\n const response = await genAI.models.generateContent({\n model: modelName,\n contents: enhancedPrompt,\n config: {\n temperature,\n topK: 40,\n topP: 0.95,\n maxOutputTokens: 8192,\n responseMimeType: 'application/json',\n safetySettings: getSafetySettings(),\n },\n });\n\n const text = response.text || '';\n\n // Count tokens for usage tracking\n const promptTokens = await countTokens(enhancedPrompt);\n const completionTokens = await countTokens(text);\n\n emitModelUsageEvent(runtime, modelType as ModelTypeName, params.prompt, {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n });\n\n try {\n const parsedResult = JSON.parse(text);\n return parsedResult;\n } catch (parseError) {\n logger.error(\n `Failed to parse JSON response: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n );\n // Try to extract JSON from the response\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n const extractedResult = JSON.parse(jsonMatch[0]);\n return extractedResult;\n } catch (secondParseError) {\n throw new Error('Failed to parse JSON from response');\n }\n }\n throw parseError;\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[generateObject] Error: ${message}`);\n throw error;\n }\n}\n\nexport async function handleObjectSmall(runtime: IAgentRuntime, params: ObjectGenerationParams) {\n return generateObjectByModelType(runtime, params, 'OBJECT_SMALL', getSmallModel);\n}\n\nexport async function handleObjectLarge(runtime: IAgentRuntime, params: ObjectGenerationParams) {\n return generateObjectByModelType(runtime, params, 'OBJECT_LARGE', getLargeModel);\n}\n"],"mappings":"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","names":["logger","ModelType","GoogleGenAI","logger","logger","GoogleGenAI","logger","logger","logger","ModelType","logger","ModelType","logger","logger","logger","logger","GoogleGenAI","ModelType","logger"]}