From 63ad637914b20d1a7f2cf97faf61f012a2a2afd8 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Thu, 13 Aug 2026 17:35:21 +0100 Subject: [PATCH 1/6] fix: add Gemini 3.x before 2.5 retirement Translate and resize-images pin Gemini 2.5, which shuts down in October 2026. Default to 3.6 Flash. --- firestore-translate-text/CHANGELOG.md | 4 +++ firestore-translate-text/README.md | 2 +- firestore-translate-text/extension.yaml | 25 ++++++++++++------- .../functions/src/config.ts | 2 +- storage-resize-images/CHANGELOG.md | 4 +++ storage-resize-images/extension.yaml | 2 +- .../__tests__/content-filter.test.ts | 2 +- .../functions/src/content-filter.ts | 6 +++-- 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/firestore-translate-text/CHANGELOG.md b/firestore-translate-text/CHANGELOG.md index 051fe136fb..94a334448f 100644 --- a/firestore-translate-text/CHANGELOG.md +++ b/firestore-translate-text/CHANGELOG.md @@ -1,3 +1,7 @@ +## Version 0.1.31 + +feat - add Gemini 3.6 Flash, 3.1 Flash Lite, and 3.1 Pro Preview model options; default to Gemini 3.6 Flash. Gemini 2.5 models retire in October 2026. + ## Version 0.1.30 chore: remove unused rimraf dependency diff --git a/firestore-translate-text/README.md b/firestore-translate-text/README.md index 136f6bab77..e333770f17 100644 --- a/firestore-translate-text/README.md +++ b/firestore-translate-text/README.md @@ -89,7 +89,7 @@ To install an extension, your project must be on the [Blaze (pay as you go) plan * Translation Provider: Choose the translation provider to use for this extension. "Cloud Translation API" uses the standard Google Cloud Translation service (fast, cost-effective). "Gemini (Google AI)" leverages Google's Gemini models via Google AI Studio for more accurate and context-aware translations (requires Gemini API access and API key). "Gemini (Vertex AI)" uses Gemini models through Vertex AI in your Google Cloud project (requires Vertex AI access). -* Gemini Model: Choose the Gemini model to use for translations. Consider model pricing, performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation model. By default, the extension uses Gemini 2.5 Flash for a balance of speed and cost. +* Gemini Model: Choose the Gemini model to use for translations. Consider model pricing, performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation model. By default, the extension uses Gemini 3.6 Flash for a balance of speed and cost. Gemini 2.5 models retire in October 2026. * Google AI API Key: If you selected "AI Translations Using Gemini" and "Google AI" as the provider, provide your Google AI API key here. You can create an API key at: https://ai.google.dev/gemini-api/docs/api-key. This is not required if you use Vertex AI as the provider. diff --git a/firestore-translate-text/extension.yaml b/firestore-translate-text/extension.yaml index 1246d1f02c..abee850ebc 100644 --- a/firestore-translate-text/extension.yaml +++ b/firestore-translate-text/extension.yaml @@ -13,7 +13,7 @@ # limitations under the License. name: firestore-translate-text -version: 0.1.30 +version: 0.1.31 specVersion: v1beta tags: [ai] @@ -158,21 +158,28 @@ params: Choose the Gemini model to use for translations. Consider model pricing, performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation - model. By default, the extension uses Gemini 2.5 Flash for a balance of - speed and cost. + model. By default, the extension uses Gemini 3.6 Flash for a balance of + speed and cost. Gemini 2.5 models retire in October 2026. type: select required: false options: - label: - Gemini 2.5 Pro (highest quality, expensive, large max output size) - value: gemini-2.5-pro + Gemini 3.1 Pro Preview (highest quality, expensive, large max output + size) + value: gemini-3.1-pro-preview - label: - Gemini 2.5 Flash (cost-effective, high quality, large max output size) - value: gemini-2.5-flash + Gemini 3.6 Flash (cost-effective, high quality, large max output size) + value: gemini-3.6-flash - label: - Gemini 2.5 Flash Lite (cheap, good quality, large max output size) + Gemini 3.1 Flash Lite (cheap, good quality, large max output size) + value: gemini-3.1-flash-lite + - label: Gemini 2.5 Pro (retires October 2026) + value: gemini-2.5-pro + - label: Gemini 2.5 Flash (retires October 2026) + value: gemini-2.5-flash + - label: Gemini 2.5 Flash Lite (retires October 2026) value: gemini-2.5-flash-lite - default: gemini-2.5-flash + default: gemini-3.6-flash - param: GOOGLE_AI_API_KEY label: Google AI API Key diff --git a/firestore-translate-text/functions/src/config.ts b/firestore-translate-text/functions/src/config.ts index 6e36d23f3c..d1af9621df 100644 --- a/firestore-translate-text/functions/src/config.ts +++ b/firestore-translate-text/functions/src/config.ts @@ -23,6 +23,6 @@ export default { languagesFieldName: process.env.LANGUAGES_FIELD_NAME, useGenkit: process.env.TRANSLATION_PROVIDER.includes("gemini"), geminiProvider: process.env.TRANSLATION_PROVIDER.split("-")[1], - geminiModel: process.env.GEMINI_MODEL || "gemini-2.5-flash", + geminiModel: process.env.GEMINI_MODEL || "gemini-3.6-flash", googleAIAPIKey: process.env.GOOGLE_AI_API_KEY, }; diff --git a/storage-resize-images/CHANGELOG.md b/storage-resize-images/CHANGELOG.md index e3abe53bda..8b21702b68 100644 --- a/storage-resize-images/CHANGELOG.md +++ b/storage-resize-images/CHANGELOG.md @@ -1,3 +1,7 @@ +## Version 0.3.7 + +chore - switch content filter from `gemini-2.5-flash` to `gemini-3.6-flash` (Gemini 2.5 Flash retires in October 2026) + ## Version 0.3.6 chore: replace temp file helper dependencies with Node.js built-ins diff --git a/storage-resize-images/extension.yaml b/storage-resize-images/extension.yaml index 4f76123690..91dd557089 100644 --- a/storage-resize-images/extension.yaml +++ b/storage-resize-images/extension.yaml @@ -13,7 +13,7 @@ # limitations under the License. name: storage-resize-images -version: 0.3.6 +version: 0.3.7 specVersion: v1beta displayName: Resize Images diff --git a/storage-resize-images/functions/__tests__/content-filter.test.ts b/storage-resize-images/functions/__tests__/content-filter.test.ts index 92e1b589e8..fee6ebc499 100644 --- a/storage-resize-images/functions/__tests__/content-filter.test.ts +++ b/storage-resize-images/functions/__tests__/content-filter.test.ts @@ -187,7 +187,7 @@ describe("checkImageContent with mocks", () => { // Check basic structure without checking exact values of complex objects expect(callArgs.model?.name ?? callArgs.model).toBe( - "vertexai/gemini-2.5-flash" + "vertexai/gemini-3.6-flash" ); expect(callArgs.messages[0].role).toBe("user"); expect(callArgs.messages[0].content[0].text).toBe( diff --git a/storage-resize-images/functions/src/content-filter.ts b/storage-resize-images/functions/src/content-filter.ts index 751f22f0d8..ec66da7a63 100644 --- a/storage-resize-images/functions/src/content-filter.ts +++ b/storage-resize-images/functions/src/content-filter.ts @@ -21,6 +21,8 @@ import * as fs from "fs"; import * as log from "./logs"; import { globalRetryQueue } from "./global"; +const CONTENT_FILTER_MODEL = "gemini-3.6-flash"; + /** * Creates a data URL from an image file * @param imageBuffer Raw image file contents @@ -135,7 +137,7 @@ export async function checkImageContent( plugins: [ vertexAI({ location: process.env.LOCATION ?? "us-central1", - models: ["gemini-2.5-flash"], + models: [CONTENT_FILTER_MODEL], }), ], }); @@ -166,7 +168,7 @@ export async function checkImageContent( try { const result = await ai.generate({ - model: gemini("gemini-2.5-flash"), + model: gemini(CONTENT_FILTER_MODEL), messages: [ { role: "user", From a0e0ddf8f8b08ce5e544d2626c16d0dc263d007d Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Thu, 13 Aug 2026 19:55:34 +0100 Subject: [PATCH 2/6] fix(translate): add Gemini 3.5 Flash models Picker listed every 2.5 model; add 3.5 Flash and Flash Lite to match the current Gemini set. --- firestore-translate-text/CHANGELOG.md | 2 +- firestore-translate-text/extension.yaml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/firestore-translate-text/CHANGELOG.md b/firestore-translate-text/CHANGELOG.md index 94a334448f..367c4d4ccc 100644 --- a/firestore-translate-text/CHANGELOG.md +++ b/firestore-translate-text/CHANGELOG.md @@ -1,6 +1,6 @@ ## Version 0.1.31 -feat - add Gemini 3.6 Flash, 3.1 Flash Lite, and 3.1 Pro Preview model options; default to Gemini 3.6 Flash. Gemini 2.5 models retire in October 2026. +feat - add Gemini 3.6 Flash, 3.5 Flash, 3.5 Flash Lite, 3.1 Flash Lite, and 3.1 Pro Preview model options; default to Gemini 3.6 Flash. Gemini 2.5 models retire in October 2026. ## Version 0.1.30 diff --git a/firestore-translate-text/extension.yaml b/firestore-translate-text/extension.yaml index abee850ebc..aa4ae61370 100644 --- a/firestore-translate-text/extension.yaml +++ b/firestore-translate-text/extension.yaml @@ -170,6 +170,11 @@ params: - label: Gemini 3.6 Flash (cost-effective, high quality, large max output size) value: gemini-3.6-flash + - label: Gemini 3.5 Flash (high quality, large max output size) + value: gemini-3.5-flash + - label: + Gemini 3.5 Flash Lite (cheap, good quality, large max output size) + value: gemini-3.5-flash-lite - label: Gemini 3.1 Flash Lite (cheap, good quality, large max output size) value: gemini-3.1-flash-lite From dc4fc5f23dc5f4420b5abf94dedd18b9929a0f5f Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Thu, 13 Aug 2026 20:21:58 +0100 Subject: [PATCH 3/6] fix(resize): use gemini-3.1-flash-lite Similar price to previous gemini-2.5-flash and better quality. Avoid 3.5-flash-lite and higher cost. --- storage-resize-images/CHANGELOG.md | 2 +- .../functions/__tests__/content-filter.test.ts | 2 +- storage-resize-images/functions/src/content-filter.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/storage-resize-images/CHANGELOG.md b/storage-resize-images/CHANGELOG.md index 8b21702b68..9b1feafd30 100644 --- a/storage-resize-images/CHANGELOG.md +++ b/storage-resize-images/CHANGELOG.md @@ -1,6 +1,6 @@ ## Version 0.3.7 -chore - switch content filter from `gemini-2.5-flash` to `gemini-3.6-flash` (Gemini 2.5 Flash retires in October 2026) +chore - switch content filter from `gemini-2.5-flash` to `gemini-3.1-flash-lite` (similar price to 2.5 Flash and better quality; 2.5 Flash retires October 2026) ## Version 0.3.6 diff --git a/storage-resize-images/functions/__tests__/content-filter.test.ts b/storage-resize-images/functions/__tests__/content-filter.test.ts index fee6ebc499..17b30aa164 100644 --- a/storage-resize-images/functions/__tests__/content-filter.test.ts +++ b/storage-resize-images/functions/__tests__/content-filter.test.ts @@ -187,7 +187,7 @@ describe("checkImageContent with mocks", () => { // Check basic structure without checking exact values of complex objects expect(callArgs.model?.name ?? callArgs.model).toBe( - "vertexai/gemini-3.6-flash" + "vertexai/gemini-3.1-flash-lite" ); expect(callArgs.messages[0].role).toBe("user"); expect(callArgs.messages[0].content[0].text).toBe( diff --git a/storage-resize-images/functions/src/content-filter.ts b/storage-resize-images/functions/src/content-filter.ts index ec66da7a63..37700f6d35 100644 --- a/storage-resize-images/functions/src/content-filter.ts +++ b/storage-resize-images/functions/src/content-filter.ts @@ -21,7 +21,8 @@ import * as fs from "fs"; import * as log from "./logs"; import { globalRetryQueue } from "./global"; -const CONTENT_FILTER_MODEL = "gemini-3.6-flash"; +/** Similar price to previous `gemini-2.5-flash`, better quality than 2.5 Flash. Higher Flash/Lite tiers cost more. */ +const CONTENT_FILTER_MODEL = "gemini-3.1-flash-lite"; /** * Creates a data URL from an image file From eab7add5f4b0fbb058d92dce3574e2b3ce375b12 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Mon, 17 Aug 2026 23:23:08 +0100 Subject: [PATCH 4/6] fix(resize): use global Vertex via google-genai gemini-3.1-flash-lite is not served on us-central1. Old @genkit-ai/vertexai rejects global; switch to @genkit-ai/google-genai. --- storage-resize-images/CHANGELOG.md | 2 + .../__tests__/content-filter.test.ts | 9 +- .../functions/package-lock.json | 1056 ++++++++--------- storage-resize-images/functions/package.json | 4 +- .../functions/src/content-filter.ts | 9 +- 5 files changed, 497 insertions(+), 583 deletions(-) diff --git a/storage-resize-images/CHANGELOG.md b/storage-resize-images/CHANGELOG.md index 9b1feafd30..d938e8dd5f 100644 --- a/storage-resize-images/CHANGELOG.md +++ b/storage-resize-images/CHANGELOG.md @@ -2,6 +2,8 @@ chore - switch content filter from `gemini-2.5-flash` to `gemini-3.1-flash-lite` (similar price to 2.5 Flash and better quality; 2.5 Flash retires October 2026) +fix - content filter now calls Vertex at `global` via `@genkit-ai/google-genai`. `gemini-3.1-flash-lite` is not served on regional endpoints like `us-central1`, and the old `@genkit-ai/vertexai` plugin rejects `global`. + ## Version 0.3.6 chore: replace temp file helper dependencies with Node.js built-ins diff --git a/storage-resize-images/functions/__tests__/content-filter.test.ts b/storage-resize-images/functions/__tests__/content-filter.test.ts index 17b30aa164..399fd7cb75 100644 --- a/storage-resize-images/functions/__tests__/content-filter.test.ts +++ b/storage-resize-images/functions/__tests__/content-filter.test.ts @@ -28,11 +28,10 @@ jest.mock("genkit", () => ({ }, })); -// Mock vertexAI module -jest.mock("@genkit-ai/vertexai", () => ({ - __esModule: true, - default: jest.fn(), - gemini: jest.fn((version: string) => ({ name: `vertexai/${version}` })), +jest.mock("@genkit-ai/google-genai", () => ({ + vertexAI: Object.assign(jest.fn(), { + model: jest.fn((version: string) => ({ name: `vertexai/${version}` })), + }), })); // Mock logs so we can assert on which filter-blocked log fired. diff --git a/storage-resize-images/functions/package-lock.json b/storage-resize-images/functions/package-lock.json index 946bfbaeca..3c23f9e0df 100644 --- a/storage-resize-images/functions/package-lock.json +++ b/storage-resize-images/functions/package-lock.json @@ -7,11 +7,11 @@ "name": "storage-resize-images-functions", "license": "Apache-2.0", "dependencies": { - "@genkit-ai/vertexai": "^1.2.0", + "@genkit-ai/google-genai": "^1.24.0", "@types/node": "^20.10.3", "firebase-admin": "^13.2.0", "firebase-functions": "^6.3.1", - "genkit": "^1.2.0", + "genkit": "^1.24.0", "p-queue": "^6.6.2", "sharp": "^0.35.3", "shx": "^0.4.0", @@ -30,36 +30,6 @@ "ts-jest": "^29.2.5" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.90.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.90.0.tgz", - "integrity": "sha512-MzZtPabJF1b0FTDl6Z6H5ljphPwACLGP13lu8MTiB8jXaW/YXlpOp+Po2cVou3MPM5+f5toyLnul9whKCy7fBg==", - "license": "MIT", - "dependencies": { - "json-schema-to-ts": "^3.1.1" - }, - "bin": { - "anthropic-ai-sdk": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@anthropic-ai/vertex-sdk": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/vertex-sdk/-/vertex-sdk-0.16.0.tgz", - "integrity": "sha512-ntxemtRkwPsjVzGQJsmBPRW38tfas6VuVlD1v6pHffDJKLPtCdaiN9KUQeraJ/F34tjxEWlsaCnl3t/orJm1Xw==", - "license": "MIT", - "dependencies": { - "@anthropic-ai/sdk": ">=0.50.3 <1", - "google-auth-library": "^9.4.2" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -474,15 +444,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", @@ -1225,12 +1186,12 @@ "license": "Apache-2.0" }, "node_modules/@genkit-ai/ai": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.39.0.tgz", - "integrity": "sha512-e1ZI2ib4Y8ha2Zj/rN7Uioxd16rWMhalPe3krypLw8B4G36X8KZCqj2UhucKbCZJIffU0cxEvag7BP+JVQnsyQ==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.40.1.tgz", + "integrity": "sha512-qQZegPEHv92SRwCii9F9VmLD9nsDsX2udjk3MslayLyviRJ0izt3JbqBcWJdLkT07VjGy+pdGqQttZjRPsnROg==", "license": "Apache-2.0", "dependencies": { - "@genkit-ai/core": "1.39.0", + "@genkit-ai/core": "1.40.1", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.11.19", "colorette": "^2.0.20", @@ -1276,65 +1237,10 @@ } }, "node_modules/@genkit-ai/core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.39.0.tgz", - "integrity": "sha512-MI0cpmwc4K/KPVsXFAcHviOybt3T3IsVSsN37cEcOzo7mmv+s0JSdooxlQgZn68B6e3I8BNLL3Vk1vyc6qIlCw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/context-async-hooks": "~1.25.0", - "@opentelemetry/core": "~1.25.0", - "@opentelemetry/sdk-logs": "^0.52.0", - "@opentelemetry/sdk-metrics": "~1.25.0", - "@opentelemetry/sdk-node": "^0.52.0", - "@opentelemetry/sdk-trace-base": "~1.25.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "async-mutex": "^0.5.0", - "cors": "^2.8.5", - "dotprompt": "^1.1.1", - "express": "^4.21.0", - "get-port": "^5.1.0", - "json-schema": "^0.4.0", - "ws": "^8.18.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.22.4" - }, - "optionalDependencies": { - "@cfworker/json-schema": "^4.1.1", - "@genkit-ai/firebase": "^1.16.1" - } - }, - "node_modules/@genkit-ai/core/node_modules/@genkit-ai/ai": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.40.0.tgz", - "integrity": "sha512-uD+ZLfdCW+0gpMpWiTYGqiQitqlizDN4xPWFAnvTF9YidDhh+fzAMBtnTecp+nhCfOmLu+4PUaJ5hfvi2wy58A==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.40.1.tgz", + "integrity": "sha512-Q/QJJdSNdfJU54Nb0qPx1238hAp574jqhCd1F/l6sHQ6ZN7RPJJm5nBMBz4SQm8yc/vAhumXdfcWv+J11Ef6yw==", "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@genkit-ai/core": "1.40.0", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.11.19", - "colorette": "^2.0.20", - "dotprompt": "^1.1.1", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "node-fetch": "^3.3.2", - "partial-json": "^0.1.7", - "uri-templates": "^0.2.0", - "uuid": "^10.0.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/@genkit-ai/core": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.40.0.tgz", - "integrity": "sha512-ah42KLZgNO4XjCPaErKIHoF0C4dTiUqGsOHv9E/yNpQdFyUNapCybBVKVc6Pc8iURc8pi4Z2QzARIHIv467k4w==", - "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.52.0", @@ -1362,20 +1268,20 @@ "@genkit-ai/firebase": "^1.16.1" } }, - "node_modules/@genkit-ai/core/node_modules/@genkit-ai/firebase": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.40.0.tgz", - "integrity": "sha512-R4ko8maP+U0Pu5+V7T2ftzRAgiscbo2lr0Vw6pzqvyl1OWrOTuxVt7JE+MLU7DEm3xCTOylDYsaUB1r5T9FK9w==", + "node_modules/@genkit-ai/firebase": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.40.1.tgz", + "integrity": "sha512-VCK6hz9J73U4sfRkKksx8ziGad21Z4CBw6uhmsI29QByc9ulOAcJTqnaDwAbouUdLA++REri1gNeofvQoctpsw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@genkit-ai/google-cloud": "^1.40.0" + "@genkit-ai/google-cloud": "^1.40.1" }, "peerDependencies": { "@google-cloud/firestore": "^7.11.0", "firebase": ">=11.5.0", "firebase-admin": ">=12.2", - "genkit": "^1.40.0" + "genkit": "^1.40.1" }, "peerDependenciesMeta": { "firebase": { @@ -1383,10 +1289,10 @@ } } }, - "node_modules/@genkit-ai/core/node_modules/@genkit-ai/google-cloud": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.40.0.tgz", - "integrity": "sha512-CqHOKNBUUDrAz9rb7waSsUqzn27x1WHMVkgatl+cQ6fGFY68IMxm9yA8R8+P91kN768vbF1oXnaa3dy1vnFDng==", + "node_modules/@genkit-ai/google-cloud": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.40.1.tgz", + "integrity": "sha512-pL0gClnB7k+OCjWbQ+4Zh1BzGUpirNdc6QqazfJhMc5/KbXt5XxiyKVJC+7UTW8VWRmPa3ZN8p/HeA2+zftxzA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1411,23 +1317,10 @@ "winston": "^3.12.0" }, "peerDependencies": { - "genkit": "^1.40.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/genkit": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.40.0.tgz", - "integrity": "sha512-OB0duJgIWtAv2Exp1FTc4uh0ZIYg5AUCtQATagU0fXbaEZeSVsn9c2geNR0Btr0tAHVUabpZp19QlSmy9Gpc7Q==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@genkit-ai/ai": "1.40.0", - "@genkit-ai/core": "1.40.0", - "uuid": "^10.0.0" + "genkit": "^1.40.1" } }, - "node_modules/@genkit-ai/core/node_modules/node-fetch": { + "node_modules/@genkit-ai/google-cloud/node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", @@ -1446,167 +1339,293 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/@genkit-ai/core/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@genkit-ai/google-genai": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@genkit-ai/google-genai/-/google-genai-1.40.1.tgz", + "integrity": "sha512-U+Cl8009vVBVVRIW7L4sq4XOWE7O9wfOVqGdyp38cZWnkrQrxdsoMzg3svt/Vqn2C0lIMFNsdKeBGTxNx5RwbA==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^9.14.2", + "jsonpath-plus": "^10.3.0" + }, + "peerDependencies": { + "genkit": "^1.40.1" } }, - "node_modules/@genkit-ai/vertexai": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/vertexai/-/vertexai-1.39.0.tgz", - "integrity": "sha512-7WbgFhJtpuOVNL8HPPgqwImRdEWdrjwvYMZlzZSi5/Oq2op7/8FfI4hV46VXnuQRir5qWPHwV4RZZyC0bnR74Q==", + "node_modules/@google-cloud/firestore": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", + "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", "license": "Apache-2.0", + "optional": true, "dependencies": { - "@anthropic-ai/sdk": "^0.90.0", - "@anthropic-ai/vertex-sdk": "^0.16.0", - "@google-cloud/aiplatform": "^3.23.0", - "@google-cloud/vertexai": "^1.9.3", - "@mistralai/mistralai-gcp": "^1.3.5", - "google-auth-library": "^9.14.2", - "googleapis": "^140.0.1", - "node-fetch": "^3.3.2", - "openai": "^4.52.7" + "@opentelemetry/api": "^1.3.0", + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" }, - "optionalDependencies": { - "@google-cloud/bigquery": "^7.8.0", - "firebase-admin": ">=12.2" + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/logging": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.4.0.tgz", + "integrity": "sha512-UtDwKO+Ux9SEPhDGWfN9OPHHCQ1Kt/xgA1xWO12GsoxV6lhLZarHqL2hgOAzLzOP+qxsLkk2eOcSJDPexTEUSQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/common": "^6.0.0", + "@google-cloud/logging-api": "^0.2.0", + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "4.0.0", + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/api": "^1.7.0", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^6.0.0", + "google-auth-library": "^10.6.2", + "google-gax": "^4.0.3", + "long": "^5.3.2", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "stream-events": "^1.0.5" }, - "peerDependencies": { - "genkit": "^1.39.0" + "engines": { + "node": ">=18" } }, - "node_modules/@genkit-ai/vertexai/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/@google-cloud/logging-api": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-api/-/logging-api-0.2.0.tgz", + "integrity": "sha512-VQ9YohbLMh4wtWfrXLRfEbAjy8JyC1OSXA6dX/A2hpB/0sqnb/97Hs+Ai2fR8t83V4c3u1l2G7CPVuZN8wlG+A==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "google-gax": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/@grpc/grpc-js": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "engines": { + "node": ">=12.10.0" } }, - "node_modules/@google-cloud/aiplatform": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/@google-cloud/aiplatform/-/aiplatform-3.35.0.tgz", - "integrity": "sha512-Eo+ckr1KbTxAOew9P+MeeR0aQXeW5PeOzrSM1JyGny/SGKejwX/RcGWSFpeapnlegTfI9N9xJeUeo3M+XBOeFg==", + "node_modules/@google-cloud/logging-api/node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "google-gax": "^4.0.3", - "protobuf.js": "^1.1.2" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=6" } }, - "node_modules/@google-cloud/bigquery": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.4.tgz", - "integrity": "sha512-C7jeI+9lnCDYK3cRDujcBsPgiwshWKn/f0BiaJmClplfyosCLfWE83iGQ0eKH113UZzjR9c9q7aZQg0nU388sw==", + "node_modules/@google-cloud/logging-api/node_modules/gaxios": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.0.tgz", + "integrity": "sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@google-cloud/common": "^5.0.0", - "@google-cloud/paginator": "^5.0.2", - "@google-cloud/precise-date": "^4.0.0", - "@google-cloud/promisify": "4.0.0", - "arrify": "^2.0.1", - "big.js": "^6.0.0", - "duplexify": "^4.0.0", "extend": "^3.0.2", - "is": "^3.3.0", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@google-cloud/bigquery/node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "node_modules/@google-cloud/logging-api/node_modules/gcp-metadata": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz", + "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==", "license": "Apache-2.0", "optional": true, + "dependencies": { + "gaxios": "7.1.3", + "google-logging-utils": "1.1.3", + "json-bigint": "^1.0.0" + }, "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/@google-cloud/common": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", - "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", + "node_modules/@google-cloud/logging-api/node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", "extend": "^3.0.2", - "google-auth-library": "^9.0.0", - "html-entities": "^2.5.2", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0" + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@google-cloud/firestore": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", - "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", + "node_modules/@google-cloud/logging-api/node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@opentelemetry/api": "^1.3.0", - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@google-cloud/logging": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.3.0.tgz", - "integrity": "sha512-8Y2lFRpPz6rZUQ+J//+toAZ7H0ZT/5KagS0NMhXWdT+sN3pPtNzgm+N0NJ46cf9XX3etj4yfE7HrjX3wMRLBZw==", + "node_modules/@google-cloud/logging-api/node_modules/google-gax": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.8.tgz", + "integrity": "sha512-M4vpZcXQIC1gqIVGQ7eaU3jXQA6zecStyTXu514TYfThlgSurYJOxHZo9fzU6hAgwPWvuEynAVHWyaIk80VeEA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@google-cloud/common": "^6.0.0", - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "4.0.0", - "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/api": "^1.7.0", - "arrify": "^2.0.1", - "dot-prop": "^6.0.0", + "@grpc/grpc-js": "^1.12.6", + "@grpc/proto-loader": "^0.8.0", + "duplexify": "^4.1.3", + "google-auth-library": "10.5.0", + "google-logging-utils": "1.1.3", + "node-fetch": "^3.3.2", + "object-hash": "^3.0.0", + "proto3-json-serializer": "3.0.4", + "protobufjs": "^7.5.4", + "retry-request": "^8.0.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "optional": true, + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "optional": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/proto3-json-serializer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-3.0.4.tgz", + "integrity": "sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "protobufjs": "^7.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/retry-request": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.4.tgz", + "integrity": "sha512-pI6/7eabUYkZxamkOq0g0uMxKLLGnjzhefY+vL8bVXag5rto4OU2YBTPytWLuHH7aEKD6fn7kJycQfid0Mwnkw==", + "license": "MIT", + "optional": true, + "dependencies": { "extend": "^3.0.2", - "gcp-metadata": "^6.0.0", - "google-auth-library": "^10.6.2", - "google-gax": "^4.0.3", - "long": "^5.3.2", - "on-finished": "^2.3.0", - "pumpify": "^2.0.1", + "teeny-request": "^10.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/logging-api/node_modules/teeny-request": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.4.tgz", + "integrity": "sha512-R1Cg4Vu0UULeDfHL/kjABLaTW++9yD/B6n2g48y5dJ04hsEaxcfmAqbNDzNsbqAYJyIpZafjklLG9YxRu9uzOg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", "stream-events": "^1.0.5" }, "engines": { @@ -1633,9 +1652,9 @@ } }, "node_modules/@google-cloud/logging-winston/node_modules/gaxios": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.2.0.tgz", - "integrity": "sha512-CUVb4wcYe+771XevyH6HtGmXFAGGKkIC3kswAP8Z1JCe0j80JMaTPZH930DWFrvo0atjh18Arc0pEyUCWa5bfg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.0.tgz", + "integrity": "sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1663,9 +1682,9 @@ } }, "node_modules/@google-cloud/logging-winston/node_modules/google-auth-library": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.0.tgz", - "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.1.tgz", + "integrity": "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1710,9 +1729,9 @@ } }, "node_modules/@google-cloud/logging/node_modules/@google-cloud/common": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-6.0.1.tgz", - "integrity": "sha512-1uvKzbmAWUdchIYRsg0f4rUmezOamWuVBSWAPAhnYoUE5OiPEx6v6JOxFIdr3MsrqV+6fyLV3EI1vMPlHoeRvw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-6.1.0.tgz", + "integrity": "sha512-Ohjxjvusr65+SiEVBrilpyn1ir9CM8ZqWjcf7bA8ph1GCunxI6bbwtcl7iGl67A7Lr4Nz7WpNzITNETwggc7pw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1721,7 +1740,7 @@ "arrify": "^2.0.0", "duplexify": "^4.1.3", "extend": "^3.0.2", - "google-auth-library": "^10.0.0-rc.1", + "google-auth-library": "^10.6.2", "html-entities": "^2.5.2", "retry-request": "^8.0.0", "teeny-request": "^10.0.0" @@ -1774,9 +1793,9 @@ } }, "node_modules/@google-cloud/logging/node_modules/gaxios": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.2.0.tgz", - "integrity": "sha512-CUVb4wcYe+771XevyH6HtGmXFAGGKkIC3kswAP8Z1JCe0j80JMaTPZH930DWFrvo0atjh18Arc0pEyUCWa5bfg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.0.tgz", + "integrity": "sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1789,9 +1808,9 @@ } }, "node_modules/@google-cloud/logging/node_modules/google-auth-library": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.0.tgz", - "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.1.tgz", + "integrity": "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1865,9 +1884,9 @@ } }, "node_modules/@google-cloud/logging/node_modules/retry-request": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.3.tgz", - "integrity": "sha512-qqoc4kkGgP9cmQDWELlOpAmfgJOg0Yi7MT82ZjiPWu451ayju4itwomjM4/dBEliify8C1b3tSaeCOldugtwPQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.4.tgz", + "integrity": "sha512-pI6/7eabUYkZxamkOq0g0uMxKLLGnjzhefY+vL8bVXag5rto4OU2YBTPytWLuHH7aEKD6fn7kJycQfid0Mwnkw==", "license": "MIT", "optional": true, "dependencies": { @@ -1879,9 +1898,9 @@ } }, "node_modules/@google-cloud/logging/node_modules/teeny-request": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.3.tgz", - "integrity": "sha512-5yDliI1uWkYPo7W+Zvrxg6YmoWuj5iC5EydewqrRTvc68nyMTZhlPPlLg6cptUGfbQAb+N9XDPDPzF6N081lug==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.4.tgz", + "integrity": "sha512-R1Cg4Vu0UULeDfHL/kjABLaTW++9yD/B6n2g48y5dJ04hsEaxcfmAqbNDzNsbqAYJyIpZafjklLG9YxRu9uzOg==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1941,9 +1960,9 @@ } }, "node_modules/@google-cloud/modelarmor/node_modules/gaxios": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.2.0.tgz", - "integrity": "sha512-CUVb4wcYe+771XevyH6HtGmXFAGGKkIC3kswAP8Z1JCe0j80JMaTPZH930DWFrvo0atjh18Arc0pEyUCWa5bfg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.0.tgz", + "integrity": "sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1956,9 +1975,9 @@ } }, "node_modules/@google-cloud/modelarmor/node_modules/gcp-metadata": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.3.tgz", - "integrity": "sha512-ziTrzUhhpL9Zk5k0HHzgP/KIpWDJT0VMBC/ynt/QIBvTW+UUcSivQRl6VlwTf/EilDxtSWklHoRsKy1c4k+59w==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz", + "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2006,9 +2025,9 @@ } }, "node_modules/@google-cloud/modelarmor/node_modules/google-gax": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.7.tgz", - "integrity": "sha512-EhiqaWWJ+9h7sCcKJTsoo6tMcjokVHhWsbSuWCnZJT4vIBP3y4mAoFLnt9SzgkVZeq24ZsFaArr06nnYYku2yA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.8.tgz", + "integrity": "sha512-M4vpZcXQIC1gqIVGQ7eaU3jXQA6zecStyTXu514TYfThlgSurYJOxHZo9fzU6hAgwPWvuEynAVHWyaIk80VeEA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2099,9 +2118,9 @@ } }, "node_modules/@google-cloud/modelarmor/node_modules/retry-request": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.3.tgz", - "integrity": "sha512-qqoc4kkGgP9cmQDWELlOpAmfgJOg0Yi7MT82ZjiPWu451ayju4itwomjM4/dBEliify8C1b3tSaeCOldugtwPQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.4.tgz", + "integrity": "sha512-pI6/7eabUYkZxamkOq0g0uMxKLLGnjzhefY+vL8bVXag5rto4OU2YBTPytWLuHH7aEKD6fn7kJycQfid0Mwnkw==", "license": "MIT", "optional": true, "dependencies": { @@ -2113,9 +2132,9 @@ } }, "node_modules/@google-cloud/modelarmor/node_modules/teeny-request": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.3.tgz", - "integrity": "sha512-5yDliI1uWkYPo7W+Zvrxg6YmoWuj5iC5EydewqrRTvc68nyMTZhlPPlLg6cptUGfbQAb+N9XDPDPzF6N081lug==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.4.tgz", + "integrity": "sha512-R1Cg4Vu0UULeDfHL/kjABLaTW++9yD/B6n2g48y5dJ04hsEaxcfmAqbNDzNsbqAYJyIpZafjklLG9YxRu9uzOg==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2132,6 +2151,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-monitoring-exporter/-/opentelemetry-cloud-monitoring-exporter-0.19.0.tgz", "integrity": "sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==", + "deprecated": "Google Cloud Platform now supports native OpenTelemetry Protocol (OTLP) endpoints via the Telemetry API. Please follow https://github.com/GoogleCloudPlatform/opentelemetry-operations-js/blob/main/MIGRATION.md", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2168,6 +2188,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-2.4.1.tgz", "integrity": "sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==", + "deprecated": "Google Cloud Platform now supports native OpenTelemetry Protocol (OTLP) endpoints via the Telemetry API. Please follow https://github.com/GoogleCloudPlatform/opentelemetry-operations-js/blob/main/MIGRATION.md", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2190,6 +2211,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-2.4.0.tgz", "integrity": "sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==", + "deprecated": "Google Cloud Platform now supports native OpenTelemetry Protocol (OTLP) endpoints via the Telemetry API. Please follow https://github.com/GoogleCloudPlatform/opentelemetry-operations-js/blob/main/MIGRATION.md", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2234,15 +2256,6 @@ "node": ">=14.0.0" } }, - "node_modules/@google-cloud/promisify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.1.0.tgz", - "integrity": "sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==", - "optional": true, - "engines": { - "node": ">=18" - } - }, "node_modules/@google-cloud/storage": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.21.0.tgz", @@ -2279,17 +2292,6 @@ "node": ">=14" } }, - "node_modules/@google-cloud/vertexai": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@google-cloud/vertexai/-/vertexai-1.9.3.tgz", - "integrity": "sha512-35o5tIEMLW3JeFJOaaMNR2e5sq+6rpnhrF97PuAxeOm0GlqVTESKhkGj7a5B5mmJSSSU3hUfIhcQCRRsw4Ipzg==", - "dependencies": { - "google-auth-library": "^9.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.9.16", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.16.tgz", @@ -3372,20 +3374,34 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "optional": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@mistralai/mistralai-gcp": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai-gcp/-/mistralai-gcp-1.4.0.tgz", - "integrity": "sha512-QYBbR/T1U4qZ88m6l5RpOlhly2mXWsXi0owicSX6zt6pBaMORxRs6ZRLmaYX5BNjGqxQUl+LtsSwpMtXW2uU2A==", - "dependencies": { - "google-auth-library": "^9.11.0" + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" }, "peerDependencies": { - "zod": ">= 3" + "jsep": "^0.4.0||^1.0.0" } }, "node_modules/@nodable/entities": { @@ -3542,6 +3558,15 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", @@ -3613,9 +3638,18 @@ }, "engines": { "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" } }, "node_modules/@opentelemetry/instrumentation": { @@ -3911,6 +3945,16 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.40.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", @@ -3948,6 +3992,16 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/instrumentation-ioredis": { "version": "0.42.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", @@ -4492,7 +4546,7 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", @@ -4502,16 +4556,6 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/resource-detector-aws": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", @@ -4530,16 +4574,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/resource-detector-aws/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/resource-detector-azure": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", @@ -4558,16 +4592,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/resource-detector-azure/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/resource-detector-container": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", @@ -4602,7 +4626,7 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", @@ -4612,16 +4636,6 @@ "node": ">=14" } }, - "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/resource-detector-gcp": { "version": "0.29.13", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", @@ -4641,16 +4655,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/resource-detector-gcp/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", - "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/resources": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", @@ -4667,6 +4671,15 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/sdk-logs": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", @@ -4728,6 +4741,15 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", @@ -4745,6 +4767,15 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/sdk-trace-node": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", @@ -4766,10 +4797,11 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=14" } @@ -4893,6 +4925,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", "license": "MIT", + "optional": true, "engines": { "node": ">= 10" } @@ -4967,7 +5000,8 @@ "node_modules/@types/caseless": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "optional": true }, "node_modules/@types/connect": { "version": "3.4.38", @@ -5079,7 +5113,8 @@ "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true }, "node_modules/@types/memcached": { "version": "2.2.10", @@ -5120,31 +5155,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/node/node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -5187,6 +5197,7 @@ "version": "2.48.12", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "optional": true, "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -5238,7 +5249,8 @@ "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "optional": true }, "node_modules/@types/triple-beam": { "version": "1.3.5", @@ -5266,6 +5278,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -5286,9 +5299,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5314,17 +5327,6 @@ "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -5463,7 +5465,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "optional": true }, "node_modules/babel-jest": { "version": "29.7.0", @@ -5619,19 +5622,6 @@ "node": ">=6.0.0" } }, - "node_modules/big.js": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", - "optional": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -5707,9 +5697,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "license": "MIT", "optional": true, "dependencies": { @@ -6002,9 +5992,9 @@ } }, "node_modules/color-string/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", "license": "MIT", "optional": true, "engines": { @@ -6025,9 +6015,9 @@ } }, "node_modules/color/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", "license": "MIT", "optional": true, "engines": { @@ -6044,6 +6034,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6198,6 +6189,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "optional": true, "engines": { "node": ">=0.4.0" } @@ -6302,6 +6294,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "optional": true, "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -6422,6 +6415,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "optional": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -6480,6 +6474,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, "engines": { "node": ">=6" } @@ -6636,9 +6631,9 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -7028,6 +7023,7 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz", "integrity": "sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==", "license": "MIT", + "optional": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7040,31 +7036,6 @@ "node": ">= 0.12" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "engines": { - "node": ">= 14" - } - }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -7156,13 +7127,13 @@ } }, "node_modules/genkit": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.39.0.tgz", - "integrity": "sha512-Qz9ef/LfAEDMzO1+Nd6l6dMYK/V4ZfWDIp79rz/1V6xDM5VuJMkoqOTCDwXAviuAnjoO2noJug2wIK81ilMhWA==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.40.1.tgz", + "integrity": "sha512-YzHnrHSkLwz2h90auI5ABAxITlrM/LHvbLfSBIqe61z7gCRbCmw5Xmm36goo4flM/Q5CJ972QwO22qdiezX6BA==", "license": "Apache-2.0", "dependencies": { - "@genkit-ai/ai": "1.39.0", - "@genkit-ai/core": "1.39.0", + "@genkit-ai/ai": "1.40.1", + "@genkit-ai/core": "1.40.1", "uuid": "^10.0.0" } }, @@ -7317,6 +7288,7 @@ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", "license": "Apache-2.0", + "optional": true, "dependencies": { "@grpc/grpc-js": "^1.10.9", "@grpc/proto-loader": "^0.7.13", @@ -7340,6 +7312,7 @@ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", "license": "Apache-2.0", + "optional": true, "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -7353,6 +7326,7 @@ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", "license": "Apache-2.0", + "optional": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -7374,22 +7348,11 @@ "node": ">=14" } }, - "node_modules/googleapis": { - "version": "140.0.1", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-140.0.1.tgz", - "integrity": "sha512-ZGvBX4mQcFXO9ACnVNg6Aqy3KtBPB5zTuue43YVLxwn8HSv8jB7w+uDKoIPSoWuxGROgnj2kbng6acXncOQRNA==", - "dependencies": { - "google-auth-library": "^9.0.0", - "googleapis-common": "^7.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/googleapis-common": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "optional": true, "dependencies": { "extend": "^3.0.2", "gaxios": "^6.0.3", @@ -7476,6 +7439,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "optional": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -7544,6 +7508,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -7557,6 +7522,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -7585,14 +7551,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7711,15 +7669,6 @@ "node": ">= 0.10" } }, - "node_modules/is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -8577,6 +8526,15 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -8610,19 +8568,6 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, - "node_modules/json-schema-to-ts": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -8640,6 +8585,24 @@ "node": ">=6" } }, + "node_modules/jsonpath-plus": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", + "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==", + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", @@ -9164,6 +9127,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "optional": true, "engines": { "node": ">= 6" } @@ -9223,43 +9187,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openai": { - "version": "4.87.3", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.87.3.tgz", - "integrity": "sha512-d2D54fzMuBYTxMW8wcNmhT1rYKcTfMJ8t+4KjH2KtvYenygITiGBgHoIrzHwnDQWW+C5oCA+ikIR2jgPCFqcKQ==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.80", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.80.tgz", - "integrity": "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -9473,9 +9400,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", - "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", + "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", "license": "MIT", "optional": true }, @@ -9622,6 +9549,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", + "optional": true, "dependencies": { "protobufjs": "^7.2.5" }, @@ -9629,22 +9557,6 @@ "node": ">=14.0.0" } }, - "node_modules/protobuf.js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/protobuf.js/-/protobuf.js-1.1.2.tgz", - "integrity": "sha512-USO7Xus/pzPw549M1TguiyoOrKEhm9VMXv+CkDufcjMC8Rd7EPbxeRQPEjCV8ua1tm0k7z9xHkogcxovZogWdA==", - "dependencies": { - "long": "~1.1.2" - } - }, - "node_modules/protobuf.js/node_modules/long": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/long/-/long-1.1.5.tgz", - "integrity": "sha512-TU6nAF5SdasnTr28c7e74P4Crbn9o3/zwo1pM22Wvg2i2vlZ4Eelxwu4QT7j21z0sDBlJDEnEZjXTZg2J8WJrg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/protobufjs": { "version": "7.6.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", @@ -9828,6 +9740,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9938,6 +9851,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "optional": true, "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", @@ -10482,6 +10396,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, "dependencies": { "stubs": "^3.0.0" } @@ -10489,12 +10404,14 @@ "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "optional": true }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -10623,7 +10540,8 @@ "node_modules/stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==" + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "optional": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -10652,6 +10570,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "optional": true, "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", @@ -10667,6 +10586,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -10678,6 +10598,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -10791,12 +10712,6 @@ "node": ">= 14.0.0" } }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "license": "MIT" - }, "node_modules/ts-deepmerge": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", @@ -10933,11 +10848,6 @@ "node": ">=0.8.0" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -10986,12 +10896,14 @@ "node_modules/url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "optional": true }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "optional": true }, "node_modules/utils-merge": { "version": "1.0.1", diff --git a/storage-resize-images/functions/package.json b/storage-resize-images/functions/package.json index 5d5ba26de4..3ea81f90b2 100644 --- a/storage-resize-images/functions/package.json +++ b/storage-resize-images/functions/package.json @@ -16,11 +16,11 @@ "generate-readme": "firebase ext:info .. --markdown > ../README.md" }, "dependencies": { - "@genkit-ai/vertexai": "^1.2.0", + "@genkit-ai/google-genai": "^1.24.0", "@types/node": "^20.10.3", "firebase-admin": "^13.2.0", "firebase-functions": "^6.3.1", - "genkit": "^1.2.0", + "genkit": "^1.24.0", "p-queue": "^6.6.2", "sharp": "^0.35.3", "shx": "^0.4.0", diff --git a/storage-resize-images/functions/src/content-filter.ts b/storage-resize-images/functions/src/content-filter.ts index 37700f6d35..9cf93588af 100644 --- a/storage-resize-images/functions/src/content-filter.ts +++ b/storage-resize-images/functions/src/content-filter.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import vertexAI, { gemini } from "@genkit-ai/vertexai"; +import { vertexAI } from "@genkit-ai/google-genai"; import { genkit, z } from "genkit"; import type { SafetyThreshold } from "./config"; import * as fs from "fs"; @@ -23,6 +23,8 @@ import { globalRetryQueue } from "./global"; /** Similar price to previous `gemini-2.5-flash`, better quality than 2.5 Flash. Higher Flash/Lite tiers cost more. */ const CONTENT_FILTER_MODEL = "gemini-3.1-flash-lite"; +/** Vertex serves this model on `global` / `us` / `eu`, not single-region endpoints like `us-central1`. Old `@genkit-ai/vertexai` rejects `global`; `@genkit-ai/google-genai` accepts it. */ +const VERTEX_CONTENT_FILTER_LOCATION = "global"; /** * Creates a data URL from an image file @@ -137,8 +139,7 @@ export async function checkImageContent( const ai = genkit({ plugins: [ vertexAI({ - location: process.env.LOCATION ?? "us-central1", - models: [CONTENT_FILTER_MODEL], + location: VERTEX_CONTENT_FILTER_LOCATION, }), ], }); @@ -169,7 +170,7 @@ export async function checkImageContent( try { const result = await ai.generate({ - model: gemini(CONTENT_FILTER_MODEL), + model: vertexAI.model(CONTENT_FILTER_MODEL), messages: [ { role: "user", From 01a43caa5bd84c5ed5d34728a82ad28dc7dc7765 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Tue, 18 Aug 2026 00:09:47 +0100 Subject: [PATCH 5/6] test(resize): drop vertexai enum from unit tests @google-cloud/vertexai was a transitive dep of the old plugin. Use SafetyThreshold string literals instead. --- .../__tests__/content-filter.test.ts | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/storage-resize-images/functions/__tests__/content-filter.test.ts b/storage-resize-images/functions/__tests__/content-filter.test.ts index 399fd7cb75..190f322f61 100644 --- a/storage-resize-images/functions/__tests__/content-filter.test.ts +++ b/storage-resize-images/functions/__tests__/content-filter.test.ts @@ -16,7 +16,6 @@ import { checkImageContent } from "../src/content-filter"; import * as path from "path"; -import { HarmBlockThreshold } from "@google-cloud/vertexai"; import { ValidationError } from "@genkit-ai/core/schema"; // Mock genkit module @@ -81,7 +80,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + "BLOCK_MEDIUM_AND_ABOVE", null, "image/png" ); @@ -106,7 +105,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", "Is this image containing inappropriate content?", "image/png" ); @@ -132,7 +131,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + "BLOCK_MEDIUM_AND_ABOVE", null, "image/png", 1 @@ -154,7 +153,7 @@ describe("checkImageContent with mocks", () => { await expect( checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + "BLOCK_MEDIUM_AND_ABOVE", null, "image/png", 1 @@ -175,7 +174,7 @@ describe("checkImageContent with mocks", () => { await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + "BLOCK_MEDIUM_AND_ABOVE", null, "image/png" ); @@ -212,7 +211,7 @@ describe("checkImageContent with mocks", () => { await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, + "BLOCK_MEDIUM_AND_ABOVE", customPrompt, "image/png" ); @@ -243,7 +242,7 @@ describe("checkImageContent with mocks", () => { let result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", null, "image/png" ); @@ -267,7 +266,7 @@ describe("checkImageContent with mocks", () => { result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_ONLY_HIGH, + "BLOCK_ONLY_HIGH", null, "image/png" ); @@ -304,7 +303,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", "Is this image inappropriate?", "image/png" ); @@ -333,7 +332,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", "Is this image inappropriate?", "image/png" ); @@ -361,7 +360,7 @@ describe("checkImageContent with mocks", () => { const result = await checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", "prompt", "image/png" ); @@ -382,7 +381,7 @@ describe("checkImageContent with mocks", () => { await expect( checkImageContent( imagePath, - HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, + "BLOCK_LOW_AND_ABOVE", "prompt", "image/png", 3 From 3ec8a7f21d5d188380946cf35bc3255824ad8847 Mon Sep 17 00:00:00 2001 From: Corie Watson Date: Wed, 19 Aug 2026 12:55:53 +0100 Subject: [PATCH 6/6] fix(translate): send Vertex AI requests to the global endpoint Gemini 3.x is served from the Vertex AI `global`, `us` and `eu` endpoints only, so passing the Cloud Functions location (for example `us-central1`) makes the new `gemini-3.6-flash` default fail with a 404. Use `global` instead, matching the storage-resize-images content filter, and document it on the GEMINI_MODEL param. --- firestore-translate-text/CHANGELOG.md | 2 ++ firestore-translate-text/README.md | 2 +- firestore-translate-text/extension.yaml | 5 ++++- .../functions/src/translate/common.ts | 13 ++++++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/firestore-translate-text/CHANGELOG.md b/firestore-translate-text/CHANGELOG.md index 367c4d4ccc..28f479b46f 100644 --- a/firestore-translate-text/CHANGELOG.md +++ b/firestore-translate-text/CHANGELOG.md @@ -2,6 +2,8 @@ feat - add Gemini 3.6 Flash, 3.5 Flash, 3.5 Flash Lite, 3.1 Flash Lite, and 3.1 Pro Preview model options; default to Gemini 3.6 Flash. Gemini 2.5 models retire in October 2026. +fix - send Vertex AI translation requests to the `global` endpoint instead of the Cloud Functions location. Gemini 3.x is only served from the `global`, `us` and `eu` endpoints, so a single-region endpoint fails for the new default model. + ## Version 0.1.30 chore: remove unused rimraf dependency diff --git a/firestore-translate-text/README.md b/firestore-translate-text/README.md index e333770f17..70dabde393 100644 --- a/firestore-translate-text/README.md +++ b/firestore-translate-text/README.md @@ -89,7 +89,7 @@ To install an extension, your project must be on the [Blaze (pay as you go) plan * Translation Provider: Choose the translation provider to use for this extension. "Cloud Translation API" uses the standard Google Cloud Translation service (fast, cost-effective). "Gemini (Google AI)" leverages Google's Gemini models via Google AI Studio for more accurate and context-aware translations (requires Gemini API access and API key). "Gemini (Vertex AI)" uses Gemini models through Vertex AI in your Google Cloud project (requires Vertex AI access). -* Gemini Model: Choose the Gemini model to use for translations. Consider model pricing, performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation model. By default, the extension uses Gemini 3.6 Flash for a balance of speed and cost. Gemini 2.5 models retire in October 2026. +* Gemini Model: Choose the Gemini model to use for translations. Consider model pricing, performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation model. By default, the extension uses Gemini 3.6 Flash for a balance of speed and cost. Gemini 2.5 models retire in October 2026. Note: with the Vertex AI provider, translation requests are sent to the Vertex AI 'global' endpoint rather than the Cloud Functions location, because Gemini 3.x models are only served from the 'global', 'us' and 'eu' endpoints. * Google AI API Key: If you selected "AI Translations Using Gemini" and "Google AI" as the provider, provide your Google AI API key here. You can create an API key at: https://ai.google.dev/gemini-api/docs/api-key. This is not required if you use Vertex AI as the provider. diff --git a/firestore-translate-text/extension.yaml b/firestore-translate-text/extension.yaml index aa4ae61370..0b199381b6 100644 --- a/firestore-translate-text/extension.yaml +++ b/firestore-translate-text/extension.yaml @@ -159,7 +159,10 @@ params: performance, and availability in your selected provider. This is only required if you select "AI Translations Using Gemini" as your translation model. By default, the extension uses Gemini 3.6 Flash for a balance of - speed and cost. Gemini 2.5 models retire in October 2026. + speed and cost. Gemini 2.5 models retire in October 2026. Note: with the + Vertex AI provider, translation requests are sent to the Vertex AI 'global' + endpoint rather than the Cloud Functions location, because Gemini 3.x + models are only served from the 'global', 'us' and 'eu' endpoints. type: select required: false options: diff --git a/firestore-translate-text/functions/src/translate/common.ts b/firestore-translate-text/functions/src/translate/common.ts index 7b4d867657..46f39452e2 100644 --- a/firestore-translate-text/functions/src/translate/common.ts +++ b/firestore-translate-text/functions/src/translate/common.ts @@ -80,6 +80,17 @@ export class GoogleTranslator implements ITranslator { } } +/** + * Vertex AI location used for Gemini translations. + * + * Gemini 3.x is served from the `global`, `us` and `eu` endpoints only, so the + * Cloud Functions location is not a usable default: a single region such as + * `us-central1` returns a 404 for `gemini-3.6-flash`. + * + * @see https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations + */ +const VERTEX_LOCATION = "global"; + /** * Implementation of ITranslator using Genkit with either Vertex AI or Google AI */ @@ -114,7 +125,7 @@ export class GenkitTranslator implements ITranslator { const plugins = plugin === "vertexai" - ? [vertexAI({ location: process.env.LOCATION! })] + ? [vertexAI({ location: VERTEX_LOCATION })] : [googleAI({ apiKey: config.googleAIAPIKey })]; this.client = genkit({