From 346a7f52986a11ed5838fa22d353ec2be712cbbf Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:39:57 -0600 Subject: [PATCH 1/9] build: create dedicated workflow for genai tests Moves genai testing from the shared custard-ci workflow to a dedicated workflow file. This ensures tests only run when files in genai/ change, and allows for better isolation. --- .github/config/nodejs.jsonc | 1 + .github/workflows/genai.yaml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 .github/workflows/genai.yaml diff --git a/.github/config/nodejs.jsonc b/.github/config/nodejs.jsonc index 65d19696e6..134c0082dc 100644 --- a/.github/config/nodejs.jsonc +++ b/.github/config/nodejs.jsonc @@ -70,6 +70,7 @@ "functions/http/uploadFile", // no tests exist "functions/log", // parent directory "functions/pubsub", // parent directory + "genai", // tested in .github/workflows/genai.yaml "memorystore/redis", // parent directory "recaptcha_enterprise/demosite/app", // no tests exist diff --git a/.github/workflows/genai.yaml b/.github/workflows/genai.yaml new file mode 100644 index 0000000000..a474f9a5a2 --- /dev/null +++ b/.github/workflows/genai.yaml @@ -0,0 +1,32 @@ +name: genai +on: + push: + branches: + - main + paths: + - 'genai/**' + - '.github/workflows/genai.yaml' + - '.github/workflows/test.yaml' + pull_request: + types: + - opened + - reopened + - synchronize + - labeled + paths: + - 'genai/**' + - '.github/workflows/genai.yaml' + - '.github/workflows/test.yaml' + schedule: + - cron: '0 0 * * 0' + +jobs: + test: + permissions: + contents: 'read' + id-token: 'write' + if: github.event.action != 'labeled' || github.event.label.name == 'actions:force-run' + uses: ./.github/workflows/test.yaml + with: + name: 'genai' + path: 'genai' From 6ea9d33aac112a27775d593c9d989ff579b839bd Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:45:26 -0600 Subject: [PATCH 2/9] Add copyright --- .github/workflows/genai.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/genai.yaml b/.github/workflows/genai.yaml index a474f9a5a2..c13eb9d683 100644 --- a/.github/workflows/genai.yaml +++ b/.github/workflows/genai.yaml @@ -1,3 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: genai on: push: From 8b29558c870baed0e3601f222d4b406fcc19dfaf Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:22:48 -0600 Subject: [PATCH 3/9] Move tests into dedicated directories for each sub-folder --- genai/bounding-box/package.json | 22 ++++++++++++++++ .../test/boundingbox-with-txt-img.test.js | 2 +- genai/content-cache/package.json | 21 ++++++++++++++++ ...ent-cache-create-use-update-delete.test.js | 10 ++++---- .../test/content-cache-list.test.js | 2 +- genai/controlled-generation/package.json | 20 +++++++++++++++ .../test/ctrlgen-with-class-schema.test.js | 2 +- .../ctrlgen-with-enum-class-schema.test.js | 4 +-- .../test/ctrlgen-with-enum-schema.test.js | 4 +-- .../ctrlgen-with-nested-class-schema.test.js | 4 +-- .../test/ctrlgen-with-nullable-schema.test.js | 2 +- .../test/ctrlgen-with-resp-schema.test.js | 2 +- genai/count-tokens/package.json | 20 +++++++++++++++ .../test/counttoken-compute-with-txt.test.js | 4 +-- ...en-localtokenizer-compute-with-txt.test.js | 4 +-- ...counttoken-localtokenizer-with-txt.test.js | 4 +-- .../test/counttoken-resp-with-txt.test.js | 2 +- .../test/counttoken-with-txt-vid.test.js | 4 +-- .../test/counttoken-with-txt.test.js | 2 +- genai/image-generation/package.json | 20 +++++++++++++++ ...ggen-mmflash-edit-img-with-txt-img.test.js | 4 +-- ...ggen-mmflash-locale-aware-with-txt.test.js | 4 +-- ...gen-mmflash-multiple-imgs-with-txt.test.js | 4 +-- ...mggen-mmflash-txt-and-img-with-txt.test.js | 4 +-- .../test/imggen-mmflash-with-txt.test.js | 4 +-- ...imggen_virtual-try-on-with-txt-img.test.js | 4 +-- genai/live/package.json | 25 +++++++++++++++++++ .../test/live-audio-with-txt.test.js | 2 +- .../test/live-code-exec-with-txt.test.js | 2 +- ...live-conversation-audio-with-audio.test.js | 4 +-- .../test/live-func-call-with-txt.test.js | 2 +- .../live-ground-googsearch-with-txt.test.js | 2 +- .../live-ground-ragengine-with-txt.test.js | 4 +-- .../live-structured-ouput-with-txt.test.js | 2 +- .../test/live-transcribe-with-audio.test.js | 2 +- .../test/live-txt-with-audio.test.js | 4 +-- genai/{ => live}/test/live-with-txt.test.js | 2 +- genai/package.json | 7 +++--- genai/text-generation/package.json | 20 +++++++++++++++ .../test/textgen-async-with-txt.test.js | 2 +- .../test/textgen-chat-stream-with-txt.test.js | 2 +- .../test/textgen-chat-with-txt.test.js | 2 +- .../test/textgen-code-with-pdf.test.js | 2 +- .../test/textgen-config-with-txt.test.js | 2 +- .../test/textgen-sys-instr-with-txt.test.js | 2 +- .../textgen-transcript-with-gcs-audio.test.js | 4 +-- .../test/textgen-with-gcs-audio.test.js | 2 +- .../test/textgen-with-local-video.test.js | 4 +-- .../test/textgen-with-multi-img.test.js | 4 +-- .../test/textgen-with-multi-local-img.test.js | 4 +-- .../test/textgen-with-mute-video.test.js | 2 +- .../test/textgen-with-pdf.test.js | 4 +-- .../test/textgen-with-txt-img.test.js | 4 +-- .../test/textgen-with-txt-routing.test.js | 4 +-- .../test/textgen-with-txt-stream.test.js | 2 +- .../test/textgen-with-txt.test.js | 2 +- .../test/textgen-with-video.test.js | 2 +- .../test/textgen-with-youtube-video.test.js | 2 +- genai/thinking/package.json | 20 +++++++++++++++ .../test/thinking-budget-with-txt.test.js | 2 +- .../thinking-includethoughts-with-txt.test.js | 2 +- .../test/thinking-with-txt.test.js | 4 +-- genai/tools/package.json | 20 +++++++++++++++ ...tools-code-exec-with-txt-local-img.test.js | 2 +- .../test/tools-code-exec-with-txt.test.js | 4 +-- .../test/tools-func-desc-with-txt.test.js | 4 +-- ...s-google-maps-coordinates-with-txt.test.js | 4 +-- ...gle-search-and-urlcontext-with-txt.test.js | 4 +-- .../test/tools-google-search-with-txt.test.js | 2 +- .../test/tools-urlcontext-with-txt.test.js | 4 +-- .../test/tools-vais-with-txt.test.js | 2 +- genai/tuning/package.json | 21 ++++++++++++++++ .../test/tuning-job-create.test.js | 2 +- .../{ => tuning}/test/tuning-job-get.test.js | 2 +- .../{ => tuning}/test/tuning-job-list.test.js | 2 +- .../test/tuning-textgen-with-txt.test.js | 2 +- 76 files changed, 311 insertions(+), 101 deletions(-) create mode 100644 genai/bounding-box/package.json rename genai/{ => bounding-box}/test/boundingbox-with-txt-img.test.js (93%) create mode 100644 genai/content-cache/package.json rename genai/{ => content-cache}/test/content-cache-create-use-update-delete.test.js (82%) rename genai/{ => content-cache}/test/content-cache-list.test.js (93%) create mode 100644 genai/controlled-generation/package.json rename genai/{ => controlled-generation}/test/ctrlgen-with-class-schema.test.js (92%) rename genai/{ => controlled-generation}/test/ctrlgen-with-enum-class-schema.test.js (89%) rename genai/{ => controlled-generation}/test/ctrlgen-with-enum-schema.test.js (89%) rename genai/{ => controlled-generation}/test/ctrlgen-with-nested-class-schema.test.js (89%) rename genai/{ => controlled-generation}/test/ctrlgen-with-nullable-schema.test.js (92%) rename genai/{ => controlled-generation}/test/ctrlgen-with-resp-schema.test.js (92%) create mode 100644 genai/count-tokens/package.json rename genai/{ => count-tokens}/test/counttoken-compute-with-txt.test.js (90%) rename genai/{ => count-tokens}/test/counttoken-localtokenizer-compute-with-txt.test.js (89%) rename genai/{ => count-tokens}/test/counttoken-localtokenizer-with-txt.test.js (89%) rename genai/{ => count-tokens}/test/counttoken-resp-with-txt.test.js (93%) rename genai/{ => count-tokens}/test/counttoken-with-txt-vid.test.js (90%) rename genai/{ => count-tokens}/test/counttoken-with-txt.test.js (93%) create mode 100644 genai/image-generation/package.json rename genai/{ => image-generation}/test/imggen-mmflash-edit-img-with-txt-img.test.js (90%) rename genai/{ => image-generation}/test/imggen-mmflash-locale-aware-with-txt.test.js (90%) rename genai/{ => image-generation}/test/imggen-mmflash-multiple-imgs-with-txt.test.js (90%) rename genai/{ => image-generation}/test/imggen-mmflash-txt-and-img-with-txt.test.js (90%) rename genai/{ => image-generation}/test/imggen-mmflash-with-txt.test.js (90%) rename genai/{ => image-generation}/test/imggen_virtual-try-on-with-txt-img.test.js (89%) create mode 100644 genai/live/package.json rename genai/{ => live}/test/live-audio-with-txt.test.js (95%) rename genai/{ => live}/test/live-code-exec-with-txt.test.js (94%) rename genai/{ => live}/test/live-conversation-audio-with-audio.test.js (95%) rename genai/{ => live}/test/live-func-call-with-txt.test.js (94%) rename genai/{ => live}/test/live-ground-googsearch-with-txt.test.js (93%) rename genai/{ => live}/test/live-ground-ragengine-with-txt.test.js (94%) rename genai/{ => live}/test/live-structured-ouput-with-txt.test.js (94%) rename genai/{ => live}/test/live-transcribe-with-audio.test.js (94%) rename genai/{ => live}/test/live-txt-with-audio.test.js (95%) rename genai/{ => live}/test/live-with-txt.test.js (95%) create mode 100644 genai/text-generation/package.json rename genai/{ => text-generation}/test/textgen-async-with-txt.test.js (93%) rename genai/{ => text-generation}/test/textgen-chat-stream-with-txt.test.js (92%) rename genai/{ => text-generation}/test/textgen-chat-with-txt.test.js (93%) rename genai/{ => text-generation}/test/textgen-code-with-pdf.test.js (93%) rename genai/{ => text-generation}/test/textgen-config-with-txt.test.js (93%) rename genai/{ => text-generation}/test/textgen-sys-instr-with-txt.test.js (92%) rename genai/{ => text-generation}/test/textgen-transcript-with-gcs-audio.test.js (89%) rename genai/{ => text-generation}/test/textgen-with-gcs-audio.test.js (93%) rename genai/{ => text-generation}/test/textgen-with-local-video.test.js (90%) rename genai/{ => text-generation}/test/textgen-with-multi-img.test.js (91%) rename genai/{ => text-generation}/test/textgen-with-multi-local-img.test.js (91%) rename genai/{ => text-generation}/test/textgen-with-mute-video.test.js (93%) rename genai/{ => text-generation}/test/textgen-with-pdf.test.js (90%) rename genai/{ => text-generation}/test/textgen-with-txt-img.test.js (90%) rename genai/{ => text-generation}/test/textgen-with-txt-routing.test.js (90%) rename genai/{ => text-generation}/test/textgen-with-txt-stream.test.js (92%) rename genai/{ => text-generation}/test/textgen-with-txt.test.js (93%) rename genai/{ => text-generation}/test/textgen-with-video.test.js (93%) rename genai/{ => text-generation}/test/textgen-with-youtube-video.test.js (93%) create mode 100644 genai/thinking/package.json rename genai/{ => thinking}/test/thinking-budget-with-txt.test.js (93%) rename genai/{ => thinking}/test/thinking-includethoughts-with-txt.test.js (92%) rename genai/{ => thinking}/test/thinking-with-txt.test.js (91%) create mode 100644 genai/tools/package.json rename genai/{ => tools}/test/tools-code-exec-with-txt-local-img.test.js (93%) rename genai/{ => tools}/test/tools-code-exec-with-txt.test.js (91%) rename genai/{ => tools}/test/tools-func-desc-with-txt.test.js (90%) rename genai/{ => tools}/test/tools-google-maps-coordinates-with-txt.test.js (90%) rename genai/{ => tools}/test/tools-google-search-and-urlcontext-with-txt.test.js (89%) rename genai/{ => tools}/test/tools-google-search-with-txt.test.js (93%) rename genai/{ => tools}/test/tools-urlcontext-with-txt.test.js (91%) rename genai/{ => tools}/test/tools-vais-with-txt.test.js (95%) create mode 100644 genai/tuning/package.json rename genai/{ => tuning}/test/tuning-job-create.test.js (95%) rename genai/{ => tuning}/test/tuning-job-get.test.js (96%) rename genai/{ => tuning}/test/tuning-job-list.test.js (94%) rename genai/{ => tuning}/test/tuning-textgen-with-txt.test.js (96%) diff --git a/genai/bounding-box/package.json b/genai/bounding-box/package.json new file mode 100644 index 0000000000..5118da2e42 --- /dev/null +++ b/genai/bounding-box/package.json @@ -0,0 +1,22 @@ +{ + "name": "nodejs-genai-bounding-box", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0", + "canvas": "^3.2.0", + "node-fetch": "^2.7.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/boundingbox-with-txt-img.test.js b/genai/bounding-box/test/boundingbox-with-txt-img.test.js similarity index 93% rename from genai/test/boundingbox-with-txt-img.test.js rename to genai/bounding-box/test/boundingbox-with-txt-img.test.js index fb2950e150..05df7fb73b 100644 --- a/genai/test/boundingbox-with-txt-img.test.js +++ b/genai/bounding-box/test/boundingbox-with-txt-img.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../bounding-box/boundingbox-with-txt-img'); +const sample = require('../boundingbox-with-txt-img'); describe('boundingbox-with-txt-img', async () => { it('should return the bounding box', async function () { diff --git a/genai/content-cache/package.json b/genai/content-cache/package.json new file mode 100644 index 0000000000..5ab6dc42b3 --- /dev/null +++ b/genai/content-cache/package.json @@ -0,0 +1,21 @@ +{ + "name": "nodejs-genai-content-cache", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0", + "luxon": "^3.7.1" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/content-cache-create-use-update-delete.test.js b/genai/content-cache/test/content-cache-create-use-update-delete.test.js similarity index 82% rename from genai/test/content-cache-create-use-update-delete.test.js rename to genai/content-cache/test/content-cache-create-use-update-delete.test.js index f12e7bd73e..94a1de6a38 100644 --- a/genai/test/content-cache-create-use-update-delete.test.js +++ b/genai/content-cache/test/content-cache-create-use-update-delete.test.js @@ -19,11 +19,11 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const createSample = require('../content-cache/content-cache-create-with-txt-gcs-pdf.js'); -const useSample = require('../content-cache/content-cache-use-with-txt.js'); -const updateSample = require('../content-cache/content-cache-update.js'); -const deleteSample = require('../content-cache/content-cache-delete.js'); -const {delay} = require('./util'); +const createSample = require('../content-cache-create-with-txt-gcs-pdf.js'); +const useSample = require('../content-cache-use-with-txt.js'); +const updateSample = require('../content-cache-update.js'); +const deleteSample = require('../content-cache-delete.js'); +const {delay} = require('../../test/util'); describe('content-cache-create-use-update-delete', async function () { this.timeout(600000); diff --git a/genai/test/content-cache-list.test.js b/genai/content-cache/test/content-cache-list.test.js similarity index 93% rename from genai/test/content-cache-list.test.js rename to genai/content-cache/test/content-cache-list.test.js index 079580431b..c5f7d1cfcb 100644 --- a/genai/test/content-cache-list.test.js +++ b/genai/content-cache/test/content-cache-list.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../content-cache/content-cache-list.js'); +const sample = require('../content-cache-list.js'); describe('contentcache-list', async () => { it('should return object with names of catches', async () => { diff --git a/genai/controlled-generation/package.json b/genai/controlled-generation/package.json new file mode 100644 index 0000000000..08dd02ee9c --- /dev/null +++ b/genai/controlled-generation/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-controlled-generation", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/ctrlgen-with-class-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-class-schema.test.js similarity index 92% rename from genai/test/ctrlgen-with-class-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-class-schema.test.js index 10acd5d676..fe90c51d66 100644 --- a/genai/test/ctrlgen-with-class-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-class-schema.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-class-schema.js'); +const sample = require('../ctrlgen-with-class-schema.js'); describe('ctrlgen-with-class-schema', () => { it('should generate text content in Json', async function () { diff --git a/genai/test/ctrlgen-with-enum-class-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-enum-class-schema.test.js similarity index 89% rename from genai/test/ctrlgen-with-enum-class-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-enum-class-schema.test.js index ddf581b081..98de1d5ef5 100644 --- a/genai/test/ctrlgen-with-enum-class-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-enum-class-schema.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-enum-class-schema.js'); -const {delay} = require('./util'); +const sample = require('../ctrlgen-with-enum-class-schema.js'); +const {delay} = require('../../test/util'); describe('ctrlgen-with-enum-class-schema', () => { it('should generate text content matching enum schema', async function () { diff --git a/genai/test/ctrlgen-with-enum-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-enum-schema.test.js similarity index 89% rename from genai/test/ctrlgen-with-enum-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-enum-schema.test.js index df51778225..26811bc797 100644 --- a/genai/test/ctrlgen-with-enum-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-enum-schema.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-enum-schema.js'); -const {delay} = require('./util'); +const sample = require('../ctrlgen-with-enum-schema.js'); +const {delay} = require('../../test/util'); describe('ctrlgen-with-enum-schema', async () => { it('should generate text content in Json', async function () { diff --git a/genai/test/ctrlgen-with-nested-class-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-nested-class-schema.test.js similarity index 89% rename from genai/test/ctrlgen-with-nested-class-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-nested-class-schema.test.js index 8bb16e3f62..59fe3b60d0 100644 --- a/genai/test/ctrlgen-with-nested-class-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-nested-class-schema.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-nested-class-schema.js'); -const {delay} = require('./util'); +const sample = require('../ctrlgen-with-nested-class-schema.js'); +const {delay} = require('../../test/util'); describe('ctrlgen-with-nested-class-schema', () => { it('should generate text content using nested schema', async function () { diff --git a/genai/test/ctrlgen-with-nullable-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-nullable-schema.test.js similarity index 92% rename from genai/test/ctrlgen-with-nullable-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-nullable-schema.test.js index dfb892ee10..47f2dfe0ea 100644 --- a/genai/test/ctrlgen-with-nullable-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-nullable-schema.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-nullable-schema.js'); +const sample = require('../ctrlgen-with-nullable-schema.js'); describe('ctrlgen-with-nullable-schema', () => { it('should generate text content using nullable schema', async function () { diff --git a/genai/test/ctrlgen-with-resp-schema.test.js b/genai/controlled-generation/test/ctrlgen-with-resp-schema.test.js similarity index 92% rename from genai/test/ctrlgen-with-resp-schema.test.js rename to genai/controlled-generation/test/ctrlgen-with-resp-schema.test.js index 3e0a4e2608..a20208fa91 100644 --- a/genai/test/ctrlgen-with-resp-schema.test.js +++ b/genai/controlled-generation/test/ctrlgen-with-resp-schema.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../controlled-generation/ctrlgen-with-resp-schema.js'); +const sample = require('../ctrlgen-with-resp-schema.js'); describe('ctrlgen-with-resp-schema', () => { it('should generate text content in given schema', async function () { diff --git a/genai/count-tokens/package.json b/genai/count-tokens/package.json new file mode 100644 index 0000000000..8b797ab0c4 --- /dev/null +++ b/genai/count-tokens/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-count-tokens", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/counttoken-compute-with-txt.test.js b/genai/count-tokens/test/counttoken-compute-with-txt.test.js similarity index 90% rename from genai/test/counttoken-compute-with-txt.test.js rename to genai/count-tokens/test/counttoken-compute-with-txt.test.js index b0b29c9131..6fb3eba49b 100644 --- a/genai/test/counttoken-compute-with-txt.test.js +++ b/genai/count-tokens/test/counttoken-compute-with-txt.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-compute-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../counttoken-compute-with-txt.js'); +const {delay} = require('../../test/util'); describe('counttoken-compute-with-txt', () => { it('should return tokensInfo from text prompt', async function () { diff --git a/genai/test/counttoken-localtokenizer-compute-with-txt.test.js b/genai/count-tokens/test/counttoken-localtokenizer-compute-with-txt.test.js similarity index 89% rename from genai/test/counttoken-localtokenizer-compute-with-txt.test.js rename to genai/count-tokens/test/counttoken-localtokenizer-compute-with-txt.test.js index eb9f902614..986850ba3c 100644 --- a/genai/test/counttoken-localtokenizer-compute-with-txt.test.js +++ b/genai/count-tokens/test/counttoken-localtokenizer-compute-with-txt.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-localtokenizer-compute-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../counttoken-localtokenizer-compute-with-txt.js'); +const {delay} = require('../../test/util'); describe('counttoken-localtokenizer-compute-with-txt', () => { it('should return tokensInfo from text prompt', async function () { diff --git a/genai/test/counttoken-localtokenizer-with-txt.test.js b/genai/count-tokens/test/counttoken-localtokenizer-with-txt.test.js similarity index 89% rename from genai/test/counttoken-localtokenizer-with-txt.test.js rename to genai/count-tokens/test/counttoken-localtokenizer-with-txt.test.js index d538190e45..bc02fe9bba 100644 --- a/genai/test/counttoken-localtokenizer-with-txt.test.js +++ b/genai/count-tokens/test/counttoken-localtokenizer-with-txt.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-localtokenizer-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../counttoken-localtokenizer-with-txt.js'); +const {delay} = require('../../test/util'); describe('counttoken-localtokenizer-with-txt', () => { it('should return totalTokens from text prompt', async function () { diff --git a/genai/test/counttoken-resp-with-txt.test.js b/genai/count-tokens/test/counttoken-resp-with-txt.test.js similarity index 93% rename from genai/test/counttoken-resp-with-txt.test.js rename to genai/count-tokens/test/counttoken-resp-with-txt.test.js index 45fb11fcff..60bb76b7d7 100644 --- a/genai/test/counttoken-resp-with-txt.test.js +++ b/genai/count-tokens/test/counttoken-resp-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-resp-with-txt.js'); +const sample = require('../counttoken-resp-with-txt.js'); describe('counttoken-resp-with-txt', () => { it('should return the usageMetadata from text prompt', async function () { diff --git a/genai/test/counttoken-with-txt-vid.test.js b/genai/count-tokens/test/counttoken-with-txt-vid.test.js similarity index 90% rename from genai/test/counttoken-with-txt-vid.test.js rename to genai/count-tokens/test/counttoken-with-txt-vid.test.js index eebe23ac1c..e43bd509a7 100644 --- a/genai/test/counttoken-with-txt-vid.test.js +++ b/genai/count-tokens/test/counttoken-with-txt-vid.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-with-txt-vid.js'); -const {delay} = require('./util'); +const sample = require('../counttoken-with-txt-vid.js'); +const {delay} = require('../../test/util'); describe('counttoken-with-txt-vid', async () => { it('should return the total token count for a text and video prompt', async function () { diff --git a/genai/test/counttoken-with-txt.test.js b/genai/count-tokens/test/counttoken-with-txt.test.js similarity index 93% rename from genai/test/counttoken-with-txt.test.js rename to genai/count-tokens/test/counttoken-with-txt.test.js index 390382d3ba..367ba662a5 100644 --- a/genai/test/counttoken-with-txt.test.js +++ b/genai/count-tokens/test/counttoken-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../count-tokens/counttoken-with-txt.js'); +const sample = require('../counttoken-with-txt.js'); describe('counttoken-with-txt', async () => { it('should return the total token count for a text prompt', async function () { diff --git a/genai/image-generation/package.json b/genai/image-generation/package.json new file mode 100644 index 0000000000..1a03f673c9 --- /dev/null +++ b/genai/image-generation/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-image-generation", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/imggen-mmflash-edit-img-with-txt-img.test.js b/genai/image-generation/test/imggen-mmflash-edit-img-with-txt-img.test.js similarity index 90% rename from genai/test/imggen-mmflash-edit-img-with-txt-img.test.js rename to genai/image-generation/test/imggen-mmflash-edit-img-with-txt-img.test.js index c5a04b53a8..2e917fa41f 100644 --- a/genai/test/imggen-mmflash-edit-img-with-txt-img.test.js +++ b/genai/image-generation/test/imggen-mmflash-edit-img-with-txt-img.test.js @@ -19,8 +19,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = 'global'; -const sample = require('../image-generation/imggen-mmflash-edit-img-with-txt-img'); -const {delay} = require('./util'); +const sample = require('../imggen-mmflash-edit-img-with-txt-img'); +const {delay} = require('../../test/util'); describe('imggen-mmflash-edit-img-with-txt-img', async () => { it('should return a response object containing image parts', async function () { diff --git a/genai/test/imggen-mmflash-locale-aware-with-txt.test.js b/genai/image-generation/test/imggen-mmflash-locale-aware-with-txt.test.js similarity index 90% rename from genai/test/imggen-mmflash-locale-aware-with-txt.test.js rename to genai/image-generation/test/imggen-mmflash-locale-aware-with-txt.test.js index 8764ae41da..51030fea3f 100644 --- a/genai/test/imggen-mmflash-locale-aware-with-txt.test.js +++ b/genai/image-generation/test/imggen-mmflash-locale-aware-with-txt.test.js @@ -19,8 +19,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = 'global'; -const sample = require('../image-generation/imggen-mmflash-locale-aware-with-txt'); -const {delay} = require('./util'); +const sample = require('../imggen-mmflash-locale-aware-with-txt'); +const {delay} = require('../../test/util'); describe('imggen-mmflash-locale-aware-with-txt', async () => { it('should generate a response with text and image parts', async function () { diff --git a/genai/test/imggen-mmflash-multiple-imgs-with-txt.test.js b/genai/image-generation/test/imggen-mmflash-multiple-imgs-with-txt.test.js similarity index 90% rename from genai/test/imggen-mmflash-multiple-imgs-with-txt.test.js rename to genai/image-generation/test/imggen-mmflash-multiple-imgs-with-txt.test.js index 6c23960e6b..21228a290a 100644 --- a/genai/test/imggen-mmflash-multiple-imgs-with-txt.test.js +++ b/genai/image-generation/test/imggen-mmflash-multiple-imgs-with-txt.test.js @@ -20,8 +20,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = 'global'; -const sample = require('../image-generation/imggen-mmflash-multiple-imgs-with-txt'); -const {delay} = require('./util'); +const sample = require('../imggen-mmflash-multiple-imgs-with-txt'); +const {delay} = require('../../test/util'); describe('imggen-mmflash-multiple-imgs-with-txt', async () => { it('should return a response object containing image parts', async function () { diff --git a/genai/test/imggen-mmflash-txt-and-img-with-txt.test.js b/genai/image-generation/test/imggen-mmflash-txt-and-img-with-txt.test.js similarity index 90% rename from genai/test/imggen-mmflash-txt-and-img-with-txt.test.js rename to genai/image-generation/test/imggen-mmflash-txt-and-img-with-txt.test.js index 4df689c58c..c2cd436aac 100644 --- a/genai/test/imggen-mmflash-txt-and-img-with-txt.test.js +++ b/genai/image-generation/test/imggen-mmflash-txt-and-img-with-txt.test.js @@ -19,8 +19,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = 'global'; -const sample = require('../image-generation/imggen-mmflash-txt-and-img-with-txt'); -const {delay} = require('./util'); +const sample = require('../imggen-mmflash-txt-and-img-with-txt'); +const {delay} = require('../../test/util'); describe('imggen-mmflash-txt-and-img-with-txt', async () => { it('should generate a response with text and image parts', async function () { diff --git a/genai/test/imggen-mmflash-with-txt.test.js b/genai/image-generation/test/imggen-mmflash-with-txt.test.js similarity index 90% rename from genai/test/imggen-mmflash-with-txt.test.js rename to genai/image-generation/test/imggen-mmflash-with-txt.test.js index c327a44772..0e801c53d4 100644 --- a/genai/test/imggen-mmflash-with-txt.test.js +++ b/genai/image-generation/test/imggen-mmflash-with-txt.test.js @@ -20,8 +20,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = 'global'; -const sample = require('../image-generation/imggen-mmflash-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../imggen-mmflash-with-txt.js'); +const {delay} = require('../../test/util'); describe('imggen-mmflash-with-txt', async () => { it('should generate images from a text prompt', async function () { diff --git a/genai/test/imggen_virtual-try-on-with-txt-img.test.js b/genai/image-generation/test/imggen_virtual-try-on-with-txt-img.test.js similarity index 89% rename from genai/test/imggen_virtual-try-on-with-txt-img.test.js rename to genai/image-generation/test/imggen_virtual-try-on-with-txt-img.test.js index 2f8028663c..12f085ce14 100644 --- a/genai/test/imggen_virtual-try-on-with-txt-img.test.js +++ b/genai/image-generation/test/imggen_virtual-try-on-with-txt-img.test.js @@ -19,8 +19,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../image-generation/imggen_virtual-try-on-with-txt-img'); -const {delay} = require('./util'); +const sample = require('../imggen_virtual-try-on-with-txt-img'); +const {delay} = require('../../test/util'); describe('imggen_virtual-try-on-with-txt-img', async () => { it('should return a response object containing image parts', async function () { diff --git a/genai/live/package.json b/genai/live/package.json new file mode 100644 index 0000000000..6df7d1b49b --- /dev/null +++ b/genai/live/package.json @@ -0,0 +1,25 @@ +{ + "name": "nodejs-genai-live", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0", + "google-auth-library": "^10.3.0", + "node-fetch": "^2.7.0", + "openai": "^5.19.1" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0", + "proxyquire": "^2.1.3", + "sinon": "^18.0.0" + } +} diff --git a/genai/test/live-audio-with-txt.test.js b/genai/live/test/live-audio-with-txt.test.js similarity index 95% rename from genai/test/live-audio-with-txt.test.js rename to genai/live/test/live-audio-with-txt.test.js index 9dca58c3fa..2a353a8b0b 100644 --- a/genai/test/live-audio-with-txt.test.js +++ b/genai/live/test/live-audio-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-audio-with-txt'); +const sample = require('../live-audio-with-txt'); describe('live-audio-with-txt', () => { it('should generate audio content in a live session conversation from a text prompt', async function () { diff --git a/genai/test/live-code-exec-with-txt.test.js b/genai/live/test/live-code-exec-with-txt.test.js similarity index 94% rename from genai/test/live-code-exec-with-txt.test.js rename to genai/live/test/live-code-exec-with-txt.test.js index 361a7cd824..ee4e0e08c3 100644 --- a/genai/test/live-code-exec-with-txt.test.js +++ b/genai/live/test/live-code-exec-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-code-exec-with-txt'); +const sample = require('../live-code-exec-with-txt'); describe('live-code-exec-with-txt', () => { it('should generate code execution in a live session from a text prompt', async function () { diff --git a/genai/test/live-conversation-audio-with-audio.test.js b/genai/live/test/live-conversation-audio-with-audio.test.js similarity index 95% rename from genai/test/live-conversation-audio-with-audio.test.js rename to genai/live/test/live-conversation-audio-with-audio.test.js index a31aac6d42..e832d7743e 100644 --- a/genai/test/live-conversation-audio-with-audio.test.js +++ b/genai/live/test/live-conversation-audio-with-audio.test.js @@ -19,7 +19,7 @@ const {describe, it} = require('mocha'); const sinon = require('sinon'); const projectId = process.env.CAIP_PROJECT_ID; -const {delay} = require('./util'); +const {delay} = require('../../test/util'); const proxyquire = require('proxyquire'); describe('live-conversation-audio-with-audio', () => { @@ -63,7 +63,7 @@ describe('live-conversation-audio-with-audio', () => { }, }; - const sample = proxyquire('../live/live-conversation-audio-with-audio', { + const sample = proxyquire('../live-conversation-audio-with-audio', { '@google/genai': { GoogleGenAI: function () { return mockClient; diff --git a/genai/test/live-func-call-with-txt.test.js b/genai/live/test/live-func-call-with-txt.test.js similarity index 94% rename from genai/test/live-func-call-with-txt.test.js rename to genai/live/test/live-func-call-with-txt.test.js index f63f2b8782..f2b5a4ef06 100644 --- a/genai/test/live-func-call-with-txt.test.js +++ b/genai/live/test/live-func-call-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-func-call-with-txt'); +const sample = require('../live-func-call-with-txt'); describe('live-func-call-with-txt', () => { it('should generate function call in a live session from a text prompt', async function () { diff --git a/genai/test/live-ground-googsearch-with-txt.test.js b/genai/live/test/live-ground-googsearch-with-txt.test.js similarity index 93% rename from genai/test/live-ground-googsearch-with-txt.test.js rename to genai/live/test/live-ground-googsearch-with-txt.test.js index 6c1be019d3..cafa6c67b6 100644 --- a/genai/test/live-ground-googsearch-with-txt.test.js +++ b/genai/live/test/live-ground-googsearch-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-ground-googsearch-with-txt.js'); +const sample = require('../live-ground-googsearch-with-txt.js'); describe('live-ground-googsearch-with-txt', () => { it('should generate Google Search in a live session from a text prompt', async function () { diff --git a/genai/test/live-ground-ragengine-with-txt.test.js b/genai/live/test/live-ground-ragengine-with-txt.test.js similarity index 94% rename from genai/test/live-ground-ragengine-with-txt.test.js rename to genai/live/test/live-ground-ragengine-with-txt.test.js index c98fa71908..5e24f17e40 100644 --- a/genai/test/live-ground-ragengine-with-txt.test.js +++ b/genai/live/test/live-ground-ragengine-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const proxyquire = require('proxyquire'); -const {delay} = require('./util'); +const {delay} = require('../../test/util'); describe('live-ground-ragengine-with-txt', () => { it('should return text from mocked RAG session', async function () { @@ -48,7 +48,7 @@ describe('live-ground-ragengine-with-txt', () => { }, }; - const sample = proxyquire('../live/live-ground-ragengine-with-txt', { + const sample = proxyquire('../live-ground-ragengine-with-txt', { '@google/genai': { GoogleGenAI: function () { return mockClient; diff --git a/genai/test/live-structured-ouput-with-txt.test.js b/genai/live/test/live-structured-ouput-with-txt.test.js similarity index 94% rename from genai/test/live-structured-ouput-with-txt.test.js rename to genai/live/test/live-structured-ouput-with-txt.test.js index b26e1e3092..208c329240 100644 --- a/genai/test/live-structured-ouput-with-txt.test.js +++ b/genai/live/test/live-structured-ouput-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-structured-ouput-with-txt'); +const sample = require('../live-structured-ouput-with-txt'); describe('live-structured-ouput-with-txt', () => { it('should extract structured information from text input using the model', async function () { diff --git a/genai/test/live-transcribe-with-audio.test.js b/genai/live/test/live-transcribe-with-audio.test.js similarity index 94% rename from genai/test/live-transcribe-with-audio.test.js rename to genai/live/test/live-transcribe-with-audio.test.js index 250dafb5e5..c6f72a6ce4 100644 --- a/genai/test/live-transcribe-with-audio.test.js +++ b/genai/live/test/live-transcribe-with-audio.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-transcribe-with-audio'); +const sample = require('../live-transcribe-with-audio'); describe('live-transcribe-with-audio', () => { it('should transcribe audio input into text using the live model', async function () { diff --git a/genai/test/live-txt-with-audio.test.js b/genai/live/test/live-txt-with-audio.test.js similarity index 95% rename from genai/test/live-txt-with-audio.test.js rename to genai/live/test/live-txt-with-audio.test.js index c7de558118..fe69267e26 100644 --- a/genai/test/live-txt-with-audio.test.js +++ b/genai/live/test/live-txt-with-audio.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const {delay} = require('./util'); +const {delay} = require('../../test/util'); const proxyquire = require('proxyquire'); @@ -66,7 +66,7 @@ describe('live-txt-with-audio', () => { }, }; - const sample = proxyquire('../live/live-txt-with-audio', { + const sample = proxyquire('../live-txt-with-audio', { 'node-fetch': fakeFetch, '@google/genai': { GoogleGenAI: function () { diff --git a/genai/test/live-with-txt.test.js b/genai/live/test/live-with-txt.test.js similarity index 95% rename from genai/test/live-with-txt.test.js rename to genai/live/test/live-with-txt.test.js index a32139c3e0..a95468fa02 100644 --- a/genai/test/live-with-txt.test.js +++ b/genai/live/test/live-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../live/live-with-txt'); +const sample = require('../live-with-txt'); describe('live-with-txt', () => { it('should generate content in a live session from a text prompt', async function () { diff --git a/genai/package.json b/genai/package.json index 9231c39c94..0bc4cede21 100644 --- a/genai/package.json +++ b/genai/package.json @@ -3,15 +3,16 @@ "private": true, "license": "Apache-2.0", "author": "Google LLC", + "repository": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" + }, "engines": { "node": ">=16.0.0" }, "files": [ "*.js" ], - "scripts": { - "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js test/**/*.test.js" - }, "dependencies": { "@google/genai": "1.30.0", "axios": "^1.6.2", diff --git a/genai/text-generation/package.json b/genai/text-generation/package.json new file mode 100644 index 0000000000..409a09dd2f --- /dev/null +++ b/genai/text-generation/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-text-generation", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/textgen-async-with-txt.test.js b/genai/text-generation/test/textgen-async-with-txt.test.js similarity index 93% rename from genai/test/textgen-async-with-txt.test.js rename to genai/text-generation/test/textgen-async-with-txt.test.js index 540ff3e682..29a615e40b 100644 --- a/genai/test/textgen-async-with-txt.test.js +++ b/genai/text-generation/test/textgen-async-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-async-with-txt.js'); +const sample = require('../textgen-async-with-txt.js'); describe('textgen-async-with-txt', () => { it('should generate text content from a text prompt and with system instructions', async function () { diff --git a/genai/test/textgen-chat-stream-with-txt.test.js b/genai/text-generation/test/textgen-chat-stream-with-txt.test.js similarity index 92% rename from genai/test/textgen-chat-stream-with-txt.test.js rename to genai/text-generation/test/textgen-chat-stream-with-txt.test.js index a81fdb4031..041f4795f6 100644 --- a/genai/test/textgen-chat-stream-with-txt.test.js +++ b/genai/text-generation/test/textgen-chat-stream-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-chat-stream-with-txt.js'); +const sample = require('../textgen-chat-stream-with-txt.js'); describe('textgen-chat-stream-with-txt', () => { it('should generate text content from a mute video', async function () { diff --git a/genai/test/textgen-chat-with-txt.test.js b/genai/text-generation/test/textgen-chat-with-txt.test.js similarity index 93% rename from genai/test/textgen-chat-with-txt.test.js rename to genai/text-generation/test/textgen-chat-with-txt.test.js index 184013536c..f319f29938 100644 --- a/genai/test/textgen-chat-with-txt.test.js +++ b/genai/text-generation/test/textgen-chat-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-chat-with-txt.js'); +const sample = require('../textgen-chat-with-txt.js'); describe('textgen-chat-with-txt', () => { it('should generate chat content from a text prompt', async function () { diff --git a/genai/test/textgen-code-with-pdf.test.js b/genai/text-generation/test/textgen-code-with-pdf.test.js similarity index 93% rename from genai/test/textgen-code-with-pdf.test.js rename to genai/text-generation/test/textgen-code-with-pdf.test.js index 22ec5b77fe..0987fc72e1 100644 --- a/genai/test/textgen-code-with-pdf.test.js +++ b/genai/text-generation/test/textgen-code-with-pdf.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-code-with-pdf.js'); +const sample = require('../textgen-code-with-pdf.js'); describe('textgen-code-with-pdf', () => { it('should generate text content from a pdf', async function () { diff --git a/genai/test/textgen-config-with-txt.test.js b/genai/text-generation/test/textgen-config-with-txt.test.js similarity index 93% rename from genai/test/textgen-config-with-txt.test.js rename to genai/text-generation/test/textgen-config-with-txt.test.js index b070952515..504bccbd61 100644 --- a/genai/test/textgen-config-with-txt.test.js +++ b/genai/text-generation/test/textgen-config-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-config-with-txt.js'); +const sample = require('../textgen-config-with-txt.js'); describe('textgen-config-with-txt', () => { it('should generate text content from a text prompt with config', async function () { diff --git a/genai/test/textgen-sys-instr-with-txt.test.js b/genai/text-generation/test/textgen-sys-instr-with-txt.test.js similarity index 92% rename from genai/test/textgen-sys-instr-with-txt.test.js rename to genai/text-generation/test/textgen-sys-instr-with-txt.test.js index 4e53e1de4f..f2f8ba13a6 100644 --- a/genai/test/textgen-sys-instr-with-txt.test.js +++ b/genai/text-generation/test/textgen-sys-instr-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-sys-instr-with-txt.js'); +const sample = require('../textgen-sys-instr-with-txt.js'); describe('textgen-sys-instr-with-txt', async () => { it('should generate text content from a text prompt and with system instructions', async () => { diff --git a/genai/test/textgen-transcript-with-gcs-audio.test.js b/genai/text-generation/test/textgen-transcript-with-gcs-audio.test.js similarity index 89% rename from genai/test/textgen-transcript-with-gcs-audio.test.js rename to genai/text-generation/test/textgen-transcript-with-gcs-audio.test.js index b1b7240bc9..7d9e063196 100644 --- a/genai/test/textgen-transcript-with-gcs-audio.test.js +++ b/genai/text-generation/test/textgen-transcript-with-gcs-audio.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-transcript-with-gcs-audio.js'); -const {delay} = require('./util'); +const sample = require('../textgen-transcript-with-gcs-audio.js'); +const {delay} = require('../../test/util'); describe('textgen-transcript-with-gcs-audio', async () => { it('should generate text content from gsc audio with transcript', async function () { diff --git a/genai/test/textgen-with-gcs-audio.test.js b/genai/text-generation/test/textgen-with-gcs-audio.test.js similarity index 93% rename from genai/test/textgen-with-gcs-audio.test.js rename to genai/text-generation/test/textgen-with-gcs-audio.test.js index 4a86977bcd..4e7c9f62a1 100644 --- a/genai/test/textgen-with-gcs-audio.test.js +++ b/genai/text-generation/test/textgen-with-gcs-audio.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-gcs-audio'); +const sample = require('../textgen-with-gcs-audio'); describe('textgen-with-gcs-audio', async () => { it('should generate text content from gsc audio', async function () { diff --git a/genai/test/textgen-with-local-video.test.js b/genai/text-generation/test/textgen-with-local-video.test.js similarity index 90% rename from genai/test/textgen-with-local-video.test.js rename to genai/text-generation/test/textgen-with-local-video.test.js index 7d55d67fb7..5db4bd6647 100644 --- a/genai/test/textgen-with-local-video.test.js +++ b/genai/text-generation/test/textgen-with-local-video.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-local-video.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-local-video.js'); +const {delay} = require('../../test/util'); describe('textgen-with-local-video', async () => { it('should generate text content from local video', async function () { diff --git a/genai/test/textgen-with-multi-img.test.js b/genai/text-generation/test/textgen-with-multi-img.test.js similarity index 91% rename from genai/test/textgen-with-multi-img.test.js rename to genai/text-generation/test/textgen-with-multi-img.test.js index 36a7214f2a..e62c1fc249 100644 --- a/genai/test/textgen-with-multi-img.test.js +++ b/genai/text-generation/test/textgen-with-multi-img.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-multi-img.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-multi-img.js'); +const {delay} = require('../../test/util'); describe('textgen-with-multi-img', () => { it('should generate text content from a text prompt and multiple images', async function () { diff --git a/genai/test/textgen-with-multi-local-img.test.js b/genai/text-generation/test/textgen-with-multi-local-img.test.js similarity index 91% rename from genai/test/textgen-with-multi-local-img.test.js rename to genai/text-generation/test/textgen-with-multi-local-img.test.js index bed8ce3ac7..1bdccb5b2c 100644 --- a/genai/test/textgen-with-multi-local-img.test.js +++ b/genai/text-generation/test/textgen-with-multi-local-img.test.js @@ -20,8 +20,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; const location = process.env.GOOGLE_CLOUD_LOCATION || 'global'; -const sample = require('../text-generation/textgen-with-multi-local-img.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-multi-local-img.js'); +const {delay} = require('../../test/util'); describe('textgen-with-multi-local-img', () => { it('should generate text content from multiple images', async function () { diff --git a/genai/test/textgen-with-mute-video.test.js b/genai/text-generation/test/textgen-with-mute-video.test.js similarity index 93% rename from genai/test/textgen-with-mute-video.test.js rename to genai/text-generation/test/textgen-with-mute-video.test.js index 65b5013126..a7a0b815b4 100644 --- a/genai/test/textgen-with-mute-video.test.js +++ b/genai/text-generation/test/textgen-with-mute-video.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-mute-video.js'); +const sample = require('../textgen-with-mute-video.js'); describe('textgen-with-mute-video', () => { it('should generate text content from a mute video', async function () { diff --git a/genai/test/textgen-with-pdf.test.js b/genai/text-generation/test/textgen-with-pdf.test.js similarity index 90% rename from genai/test/textgen-with-pdf.test.js rename to genai/text-generation/test/textgen-with-pdf.test.js index d5a07dfa1f..3b517aebdd 100644 --- a/genai/test/textgen-with-pdf.test.js +++ b/genai/text-generation/test/textgen-with-pdf.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-pdf.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-pdf.js'); +const {delay} = require('../../test/util'); describe('textgen-with-pdf', async () => { it('should generate text content from pdf', async function () { diff --git a/genai/test/textgen-with-txt-img.test.js b/genai/text-generation/test/textgen-with-txt-img.test.js similarity index 90% rename from genai/test/textgen-with-txt-img.test.js rename to genai/text-generation/test/textgen-with-txt-img.test.js index 3a7e20c14f..d50fe4e424 100644 --- a/genai/test/textgen-with-txt-img.test.js +++ b/genai/text-generation/test/textgen-with-txt-img.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-txt-img.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-txt-img.js'); +const {delay} = require('../../test/util'); describe('textgen-with-txt-img', async () => { it('should generate text content from a text prompt and an image', async function () { diff --git a/genai/test/textgen-with-txt-routing.test.js b/genai/text-generation/test/textgen-with-txt-routing.test.js similarity index 90% rename from genai/test/textgen-with-txt-routing.test.js rename to genai/text-generation/test/textgen-with-txt-routing.test.js index 5ee78a0802..19143796f2 100644 --- a/genai/test/textgen-with-txt-routing.test.js +++ b/genai/text-generation/test/textgen-with-txt-routing.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-txt-routing.js'); -const {delay} = require('./util'); +const sample = require('../textgen-with-txt-routing.js'); +const {delay} = require('../../test/util'); describe('textgen-with-txt-routing', async () => { it('should generate text content from a text prompt and with routing configuration', async function () { diff --git a/genai/test/textgen-with-txt-stream.test.js b/genai/text-generation/test/textgen-with-txt-stream.test.js similarity index 92% rename from genai/test/textgen-with-txt-stream.test.js rename to genai/text-generation/test/textgen-with-txt-stream.test.js index 5bfb88cade..127bdbced6 100644 --- a/genai/test/textgen-with-txt-stream.test.js +++ b/genai/text-generation/test/textgen-with-txt-stream.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-txt-stream.js'); +const sample = require('../textgen-with-txt-stream.js'); describe('textgen-with-txt-stream', async () => { it('should generate streaming text content from a text prompt', async () => { diff --git a/genai/test/textgen-with-txt.test.js b/genai/text-generation/test/textgen-with-txt.test.js similarity index 93% rename from genai/test/textgen-with-txt.test.js rename to genai/text-generation/test/textgen-with-txt.test.js index a6f772a3a4..dabfd416f3 100644 --- a/genai/test/textgen-with-txt.test.js +++ b/genai/text-generation/test/textgen-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-txt.js'); +const sample = require('../textgen-with-txt.js'); describe('textgen-with-txt', async () => { it('should generate text content from a text prompt', async () => { diff --git a/genai/test/textgen-with-video.test.js b/genai/text-generation/test/textgen-with-video.test.js similarity index 93% rename from genai/test/textgen-with-video.test.js rename to genai/text-generation/test/textgen-with-video.test.js index ba81b8cd4a..8fb5f4cd96 100644 --- a/genai/test/textgen-with-video.test.js +++ b/genai/text-generation/test/textgen-with-video.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-video.js'); +const sample = require('../textgen-with-video.js'); describe('textgen-with-video', async () => { it('should generate text content from a text prompt and a video', async () => { diff --git a/genai/test/textgen-with-youtube-video.test.js b/genai/text-generation/test/textgen-with-youtube-video.test.js similarity index 93% rename from genai/test/textgen-with-youtube-video.test.js rename to genai/text-generation/test/textgen-with-youtube-video.test.js index 4da0174f9a..948d4f974d 100644 --- a/genai/test/textgen-with-youtube-video.test.js +++ b/genai/text-generation/test/textgen-with-youtube-video.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../text-generation/textgen-with-youtube-video'); +const sample = require('../textgen-with-youtube-video'); describe('textgen-with-youtube-video', async () => { it('should generate text content from yt video', async function () { diff --git a/genai/thinking/package.json b/genai/thinking/package.json new file mode 100644 index 0000000000..eb92893f30 --- /dev/null +++ b/genai/thinking/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-thinking", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/thinking-budget-with-txt.test.js b/genai/thinking/test/thinking-budget-with-txt.test.js similarity index 93% rename from genai/test/thinking-budget-with-txt.test.js rename to genai/thinking/test/thinking-budget-with-txt.test.js index 5daaa2997f..58993ac023 100644 --- a/genai/test/thinking-budget-with-txt.test.js +++ b/genai/thinking/test/thinking-budget-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../thinking/thinking-budget-with-txt.js'); +const sample = require('../thinking-budget-with-txt.js'); describe('thinking-budget-with-txt', () => { it('should return Thought Process', async function () { diff --git a/genai/test/thinking-includethoughts-with-txt.test.js b/genai/thinking/test/thinking-includethoughts-with-txt.test.js similarity index 92% rename from genai/test/thinking-includethoughts-with-txt.test.js rename to genai/thinking/test/thinking-includethoughts-with-txt.test.js index 69a8a32800..46b50baf58 100644 --- a/genai/test/thinking-includethoughts-with-txt.test.js +++ b/genai/thinking/test/thinking-includethoughts-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../thinking/thinking-includethoughts-with-txt.js'); +const sample = require('../thinking-includethoughts-with-txt.js'); describe('thinking-includethoughts-with-txt', () => { it('should return Thought Process', async function () { diff --git a/genai/test/thinking-with-txt.test.js b/genai/thinking/test/thinking-with-txt.test.js similarity index 91% rename from genai/test/thinking-with-txt.test.js rename to genai/thinking/test/thinking-with-txt.test.js index 7fb5187910..687f694b42 100644 --- a/genai/test/thinking-with-txt.test.js +++ b/genai/thinking/test/thinking-with-txt.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../thinking/thinking-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../thinking-with-txt.js'); +const {delay} = require('../../test/util'); describe('thinking-with-txt', () => { it('should return Thought Process', async function () { diff --git a/genai/tools/package.json b/genai/tools/package.json new file mode 100644 index 0000000000..4e5e1aed4e --- /dev/null +++ b/genai/tools/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs-genai-tools", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0" + } +} diff --git a/genai/test/tools-code-exec-with-txt-local-img.test.js b/genai/tools/test/tools-code-exec-with-txt-local-img.test.js similarity index 93% rename from genai/test/tools-code-exec-with-txt-local-img.test.js rename to genai/tools/test/tools-code-exec-with-txt-local-img.test.js index d6d6538d88..7581da4899 100644 --- a/genai/test/tools-code-exec-with-txt-local-img.test.js +++ b/genai/tools/test/tools-code-exec-with-txt-local-img.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-code-exec-with-txt-local-img.js'); +const sample = require('../tools-code-exec-with-txt-local-img.js'); describe('tools-code-exec-with-txt-local-img', () => { it('should generate a function definition', async function () { diff --git a/genai/test/tools-code-exec-with-txt.test.js b/genai/tools/test/tools-code-exec-with-txt.test.js similarity index 91% rename from genai/test/tools-code-exec-with-txt.test.js rename to genai/tools/test/tools-code-exec-with-txt.test.js index da23b11b68..4d88eb2cb1 100644 --- a/genai/test/tools-code-exec-with-txt.test.js +++ b/genai/tools/test/tools-code-exec-with-txt.test.js @@ -18,8 +18,8 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-code-exec-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../tools-code-exec-with-txt.js'); +const {delay} = require('../../test/util'); describe('tools-code-exec-with-txt', async () => { it('should generate code and execution result', async function () { diff --git a/genai/test/tools-func-desc-with-txt.test.js b/genai/tools/test/tools-func-desc-with-txt.test.js similarity index 90% rename from genai/test/tools-func-desc-with-txt.test.js rename to genai/tools/test/tools-func-desc-with-txt.test.js index 6bb8852003..206a3dcf73 100644 --- a/genai/test/tools-func-desc-with-txt.test.js +++ b/genai/tools/test/tools-func-desc-with-txt.test.js @@ -17,8 +17,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-func-desc-with-txt.js'); -const {delay} = require('./util'); +const sample = require('../tools-func-desc-with-txt.js'); +const {delay} = require('../../test/util'); describe('tools-func-desc-with-txt', async () => { it('should generate a function call', async function () { diff --git a/genai/test/tools-google-maps-coordinates-with-txt.test.js b/genai/tools/test/tools-google-maps-coordinates-with-txt.test.js similarity index 90% rename from genai/test/tools-google-maps-coordinates-with-txt.test.js rename to genai/tools/test/tools-google-maps-coordinates-with-txt.test.js index e21540285c..0cd9e406f9 100644 --- a/genai/test/tools-google-maps-coordinates-with-txt.test.js +++ b/genai/tools/test/tools-google-maps-coordinates-with-txt.test.js @@ -17,8 +17,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-google-maps-coordinates-with-txt'); -const {delay} = require('./util'); +const sample = require('../tools-google-maps-coordinates-with-txt'); +const {delay} = require('../../test/util'); const {assert} = require('chai'); describe('tools-google-maps-coordinates-with-txt', () => { diff --git a/genai/test/tools-google-search-and-urlcontext-with-txt.test.js b/genai/tools/test/tools-google-search-and-urlcontext-with-txt.test.js similarity index 89% rename from genai/test/tools-google-search-and-urlcontext-with-txt.test.js rename to genai/tools/test/tools-google-search-and-urlcontext-with-txt.test.js index 5b95c84723..b5b875975c 100644 --- a/genai/test/tools-google-search-and-urlcontext-with-txt.test.js +++ b/genai/tools/test/tools-google-search-and-urlcontext-with-txt.test.js @@ -17,8 +17,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-google-search-and-urlcontext-with-txt'); -const {delay} = require('./util'); +const sample = require('../tools-google-search-and-urlcontext-with-txt'); +const {delay} = require('../../test/util'); const {assert} = require('chai'); describe('tools-google-search-and-urlcontext-with-txt', () => { diff --git a/genai/test/tools-google-search-with-txt.test.js b/genai/tools/test/tools-google-search-with-txt.test.js similarity index 93% rename from genai/test/tools-google-search-with-txt.test.js rename to genai/tools/test/tools-google-search-with-txt.test.js index 7d3dd2fd40..e4c29815ee 100644 --- a/genai/test/tools-google-search-with-txt.test.js +++ b/genai/tools/test/tools-google-search-with-txt.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-google-search-with-txt.js'); +const sample = require('../tools-google-search-with-txt.js'); describe('tools-google-search-with-txt', () => { it('should generate answer to a question in prompt using google search', async function () { diff --git a/genai/test/tools-urlcontext-with-txt.test.js b/genai/tools/test/tools-urlcontext-with-txt.test.js similarity index 91% rename from genai/test/tools-urlcontext-with-txt.test.js rename to genai/tools/test/tools-urlcontext-with-txt.test.js index 6ae66896ed..a77a4fc909 100644 --- a/genai/test/tools-urlcontext-with-txt.test.js +++ b/genai/tools/test/tools-urlcontext-with-txt.test.js @@ -17,8 +17,8 @@ const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tools/tools-urlcontext-with-txt'); -const {delay} = require('./util'); +const sample = require('../tools-urlcontext-with-txt'); +const {delay} = require('../../test/util'); const {assert} = require('chai'); describe('tools-urlcontext-with-txt', () => { diff --git a/genai/test/tools-vais-with-txt.test.js b/genai/tools/test/tools-vais-with-txt.test.js similarity index 95% rename from genai/test/tools-vais-with-txt.test.js rename to genai/tools/test/tools-vais-with-txt.test.js index 9cd58c4b2a..281c5775b9 100644 --- a/genai/test/tools-vais-with-txt.test.js +++ b/genai/tools/test/tools-vais-with-txt.test.js @@ -20,7 +20,7 @@ // const {describe, it} = require('mocha'); // // const projectId = process.env.CAIP_PROJECT_ID; -// const sample = require('../tools/tools-vais-with-txt.js'); +// const sample = require('../tools-vais-with-txt.js'); // const location = process.env.GOOGLE_CLOUD_LOCATION || 'global'; // const datastore = `projects/${projectId}/locations/global/collections/default_collection/dataStores/grounding-test-datastore`; diff --git a/genai/tuning/package.json b/genai/tuning/package.json new file mode 100644 index 0000000000..44ccf7e813 --- /dev/null +++ b/genai/tuning/package.json @@ -0,0 +1,21 @@ +{ + "name": "nodejs-genai-tuning", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=16.0.0" + }, + "scripts": { + "test": "c8 mocha -p -j 2 --timeout 2400000 test/*.test.js" + }, + "dependencies": { + "@google/genai": "1.30.0" + }, + "devDependencies": { + "c8": "^10.0.0", + "chai": "^4.5.0", + "mocha": "^10.0.0", + "proxyquire": "^2.1.3" + } +} diff --git a/genai/test/tuning-job-create.test.js b/genai/tuning/test/tuning-job-create.test.js similarity index 95% rename from genai/test/tuning-job-create.test.js rename to genai/tuning/test/tuning-job-create.test.js index 3785c8b977..bf3bb8eda7 100644 --- a/genai/test/tuning-job-create.test.js +++ b/genai/tuning/test/tuning-job-create.test.js @@ -45,7 +45,7 @@ describe('tuning-job-create', () => { } } - const sample = proxyquire('../tuning/tuning-job-create.js', { + const sample = proxyquire('../tuning-job-create.js', { '@google/genai': {GoogleGenAI: MockGoogleGenAI}, }); diff --git a/genai/test/tuning-job-get.test.js b/genai/tuning/test/tuning-job-get.test.js similarity index 96% rename from genai/test/tuning-job-get.test.js rename to genai/tuning/test/tuning-job-get.test.js index 06b136f66d..810ee81e62 100644 --- a/genai/test/tuning-job-get.test.js +++ b/genai/tuning/test/tuning-job-get.test.js @@ -47,7 +47,7 @@ describe('tuning-job-get', () => { } } - const sample = proxyquire('../tuning/tuning-job-get.js', { + const sample = proxyquire('../tuning-job-get.js', { '@google/genai': {GoogleGenAI: MockGoogleGenAI}, }); diff --git a/genai/test/tuning-job-list.test.js b/genai/tuning/test/tuning-job-list.test.js similarity index 94% rename from genai/test/tuning-job-list.test.js rename to genai/tuning/test/tuning-job-list.test.js index 500e81d7e7..db41dcda23 100644 --- a/genai/test/tuning-job-list.test.js +++ b/genai/tuning/test/tuning-job-list.test.js @@ -18,7 +18,7 @@ const {assert} = require('chai'); const {describe, it} = require('mocha'); const projectId = process.env.CAIP_PROJECT_ID; -const sample = require('../tuning/tuning-job-list.js'); +const sample = require('../tuning-job-list.js'); describe('tuning-job-list', () => { it('should return tuning job list', async () => { diff --git a/genai/test/tuning-textgen-with-txt.test.js b/genai/tuning/test/tuning-textgen-with-txt.test.js similarity index 96% rename from genai/test/tuning-textgen-with-txt.test.js rename to genai/tuning/test/tuning-textgen-with-txt.test.js index 3cd9886553..2f0b2288a1 100644 --- a/genai/test/tuning-textgen-with-txt.test.js +++ b/genai/tuning/test/tuning-textgen-with-txt.test.js @@ -56,7 +56,7 @@ describe('tuning-textgen-with-txt', () => { } } - const sample = proxyquire('../tuning/tuning-textgen-with-txt.js', { + const sample = proxyquire('../tuning-textgen-with-txt.js', { '@google/genai': {GoogleGenAI: MockGoogleGenAI}, }); From 9645bfcdf1a9bf5182a423d2a0ef84c05ebab8e4 Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:25:15 -0600 Subject: [PATCH 4/9] Change test process --- .github/config/nodejs.jsonc | 2 +- .github/workflows/genai.yaml | 46 ------------------------------------ 2 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 .github/workflows/genai.yaml diff --git a/.github/config/nodejs.jsonc b/.github/config/nodejs.jsonc index 134c0082dc..4e3cb6de8e 100644 --- a/.github/config/nodejs.jsonc +++ b/.github/config/nodejs.jsonc @@ -70,7 +70,7 @@ "functions/http/uploadFile", // no tests exist "functions/log", // parent directory "functions/pubsub", // parent directory - "genai", // tested in .github/workflows/genai.yaml + "genai", // parent directory "memorystore/redis", // parent directory "recaptcha_enterprise/demosite/app", // no tests exist diff --git a/.github/workflows/genai.yaml b/.github/workflows/genai.yaml deleted file mode 100644 index c13eb9d683..0000000000 --- a/.github/workflows/genai.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: genai -on: - push: - branches: - - main - paths: - - 'genai/**' - - '.github/workflows/genai.yaml' - - '.github/workflows/test.yaml' - pull_request: - types: - - opened - - reopened - - synchronize - - labeled - paths: - - 'genai/**' - - '.github/workflows/genai.yaml' - - '.github/workflows/test.yaml' - schedule: - - cron: '0 0 * * 0' - -jobs: - test: - permissions: - contents: 'read' - id-token: 'write' - if: github.event.action != 'labeled' || github.event.label.name == 'actions:force-run' - uses: ./.github/workflows/test.yaml - with: - name: 'genai' - path: 'genai' From 6225e590e724472466aed394c4604d862d7f9dcf Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:37:34 -0600 Subject: [PATCH 5/9] Move missing files --- .../test-data/example-image-eiffel-tower.png | Bin genai/{ => image-generation}/test-data/man.png | Bin genai/{ => image-generation}/test-data/sweater.jpg | Bin .../test-data/describe_video_content.mp4 | Bin genai/{ => text-generation}/test-data/latte.jpg | Bin genai/{ => text-generation}/test-data/scones.jpg | Bin .../test-data/640px-Monty_open_door.svg.png | Bin genai/tools/tools-code-exec-with-txt-local-img.js | 2 +- 8 files changed, 1 insertion(+), 1 deletion(-) rename genai/{ => image-generation}/test-data/example-image-eiffel-tower.png (100%) rename genai/{ => image-generation}/test-data/man.png (100%) rename genai/{ => image-generation}/test-data/sweater.jpg (100%) rename genai/{ => text-generation}/test-data/describe_video_content.mp4 (100%) rename genai/{ => text-generation}/test-data/latte.jpg (100%) rename genai/{ => text-generation}/test-data/scones.jpg (100%) rename genai/{test => tools}/test-data/640px-Monty_open_door.svg.png (100%) diff --git a/genai/test-data/example-image-eiffel-tower.png b/genai/image-generation/test-data/example-image-eiffel-tower.png similarity index 100% rename from genai/test-data/example-image-eiffel-tower.png rename to genai/image-generation/test-data/example-image-eiffel-tower.png diff --git a/genai/test-data/man.png b/genai/image-generation/test-data/man.png similarity index 100% rename from genai/test-data/man.png rename to genai/image-generation/test-data/man.png diff --git a/genai/test-data/sweater.jpg b/genai/image-generation/test-data/sweater.jpg similarity index 100% rename from genai/test-data/sweater.jpg rename to genai/image-generation/test-data/sweater.jpg diff --git a/genai/test-data/describe_video_content.mp4 b/genai/text-generation/test-data/describe_video_content.mp4 similarity index 100% rename from genai/test-data/describe_video_content.mp4 rename to genai/text-generation/test-data/describe_video_content.mp4 diff --git a/genai/test-data/latte.jpg b/genai/text-generation/test-data/latte.jpg similarity index 100% rename from genai/test-data/latte.jpg rename to genai/text-generation/test-data/latte.jpg diff --git a/genai/test-data/scones.jpg b/genai/text-generation/test-data/scones.jpg similarity index 100% rename from genai/test-data/scones.jpg rename to genai/text-generation/test-data/scones.jpg diff --git a/genai/test/test-data/640px-Monty_open_door.svg.png b/genai/tools/test-data/640px-Monty_open_door.svg.png similarity index 100% rename from genai/test/test-data/640px-Monty_open_door.svg.png rename to genai/tools/test-data/640px-Monty_open_door.svg.png diff --git a/genai/tools/tools-code-exec-with-txt-local-img.js b/genai/tools/tools-code-exec-with-txt-local-img.js index 22a8cf0a03..6c54922a49 100644 --- a/genai/tools/tools-code-exec-with-txt-local-img.js +++ b/genai/tools/tools-code-exec-with-txt-local-img.js @@ -35,7 +35,7 @@ async function generateAndExecuteMultimodalCode( const imagePath = path.join( __dirname, - '../test/test-data/640px-Monty_open_door.svg.png' + 'test-data/640px-Monty_open_door.svg.png' ); const imageBuffer = await fs.readFile(imagePath); const imageBase64 = imageBuffer.toString('base64'); From e30c55ddbd1e6238a346bbad5d378e3ab9a65875 Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:54:28 -0600 Subject: [PATCH 6/9] build: exclude genai parent directory from legacy dev tests --- .github/config/nodejs-dev.jsonc | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/config/nodejs-dev.jsonc b/.github/config/nodejs-dev.jsonc index d1c6f6f801..57cefd057b 100644 --- a/.github/config/nodejs-dev.jsonc +++ b/.github/config/nodejs-dev.jsonc @@ -185,6 +185,7 @@ "functions/v2/tips/retry", "functions/v2/typed/googlechatbot", "functions/v2/typed/greeting", + "genai", // parent directory "generative-ai/snippets", "healthcare/consent", "healthcare/datasets", From d91ef717ccaaa714324b9b1290205c9e79df6186 Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 12:06:42 -0600 Subject: [PATCH 7/9] Change video samples to use flash lite and lowest resolution to prevent tests from failing due to 429 --- genai/text-generation/textgen-with-local-video.js | 6 ++++-- genai/text-generation/textgen-with-video.js | 3 +++ genai/text-generation/textgen-with-youtube-video.js | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/genai/text-generation/textgen-with-local-video.js b/genai/text-generation/textgen-with-local-video.js index d405bbbaef..dce06ac000 100644 --- a/genai/text-generation/textgen-with-local-video.js +++ b/genai/text-generation/textgen-with-local-video.js @@ -34,9 +34,8 @@ async function generateText( const videoContent = fs.readFileSync('test-data/describe_video_content.mp4'); const response = await client.models.generateContent({ - model: 'gemini-2.5-flash', + model: 'gemini-2.5-flash-lite', contents: [ - {text: 'hello-world'}, { inlineData: { data: videoContent.toString('base64'), @@ -45,6 +44,9 @@ async function generateText( }, {text: 'Write a short and engaging blog post based on this video.'}, ], + config: { + mediaResolution: 'MEDIA_RESOLUTION_LOW' + } }); console.log(response.text); diff --git a/genai/text-generation/textgen-with-video.js b/genai/text-generation/textgen-with-video.js index 76b552facb..a59400f194 100644 --- a/genai/text-generation/textgen-with-video.js +++ b/genai/text-generation/textgen-with-video.js @@ -46,6 +46,9 @@ async function generateContent( const response = await client.models.generateContent({ model: 'gemini-2.5-flash', contents: [video, prompt], + config: { + mediaResolution: 'MEDIA_RESOLUTION_LOW' + } }); console.log(response.text); diff --git a/genai/text-generation/textgen-with-youtube-video.js b/genai/text-generation/textgen-with-youtube-video.js index f037417b30..c9b4ebe6a5 100644 --- a/genai/text-generation/textgen-with-youtube-video.js +++ b/genai/text-generation/textgen-with-youtube-video.js @@ -40,8 +40,11 @@ async function generateText( }; const response = await client.models.generateContent({ - model: 'gemini-2.5-flash', + model: 'gemini-2.5-flash-lite', contents: [ytVideo, prompt], + config: { + mediaResolution: 'MEDIA_RESOLUTION_LOW' + } }); console.log(response.text); From d93c037e1fbdb40b90b10a45baa556680dbed3ca Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 12:18:47 -0600 Subject: [PATCH 8/9] Update model ID for textgen to avoid quota issues --- genai/text-generation/textgen-with-txt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genai/text-generation/textgen-with-txt.js b/genai/text-generation/textgen-with-txt.js index ba3294ac75..a81767e664 100644 --- a/genai/text-generation/textgen-with-txt.js +++ b/genai/text-generation/textgen-with-txt.js @@ -31,7 +31,7 @@ async function generateContent( }); const response = await client.models.generateContent({ - model: 'gemini-2.5-flash', + model: 'gemini-3-flash-preview', contents: 'How does AI work?', }); From 88b5a773bdd81641127abd3fe7791b6dba9ef69c Mon Sep 17 00:00:00 2001 From: Holt Skinner <13262395+holtskinner@users.noreply.github.com> Date: Thu, 18 Dec 2025 12:20:59 -0600 Subject: [PATCH 9/9] Fix lint errors and update mute video to use low resolution/2.5 flash-lite --- genai/text-generation/textgen-with-local-video.js | 4 ++-- genai/text-generation/textgen-with-mute-video.js | 5 ++++- genai/text-generation/textgen-with-video.js | 4 ++-- genai/text-generation/textgen-with-youtube-video.js | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/genai/text-generation/textgen-with-local-video.js b/genai/text-generation/textgen-with-local-video.js index dce06ac000..d44eb9a190 100644 --- a/genai/text-generation/textgen-with-local-video.js +++ b/genai/text-generation/textgen-with-local-video.js @@ -45,8 +45,8 @@ async function generateText( {text: 'Write a short and engaging blog post based on this video.'}, ], config: { - mediaResolution: 'MEDIA_RESOLUTION_LOW' - } + mediaResolution: 'MEDIA_RESOLUTION_LOW', + }, }); console.log(response.text); diff --git a/genai/text-generation/textgen-with-mute-video.js b/genai/text-generation/textgen-with-mute-video.js index f2a7805064..b02daab172 100644 --- a/genai/text-generation/textgen-with-mute-video.js +++ b/genai/text-generation/textgen-with-mute-video.js @@ -31,7 +31,7 @@ async function generateText( }); const response = await client.models.generateContent({ - model: 'gemini-2.5-flash', + model: 'gemini-2.5-flash-lite', contents: [ { role: 'user', @@ -49,6 +49,9 @@ async function generateText( ], }, ], + config: { + mediaResolution: 'MEDIA_RESOLUTION_LOW', + }, }); console.log(response.text); diff --git a/genai/text-generation/textgen-with-video.js b/genai/text-generation/textgen-with-video.js index a59400f194..6ef043b598 100644 --- a/genai/text-generation/textgen-with-video.js +++ b/genai/text-generation/textgen-with-video.js @@ -47,8 +47,8 @@ async function generateContent( model: 'gemini-2.5-flash', contents: [video, prompt], config: { - mediaResolution: 'MEDIA_RESOLUTION_LOW' - } + mediaResolution: 'MEDIA_RESOLUTION_LOW', + }, }); console.log(response.text); diff --git a/genai/text-generation/textgen-with-youtube-video.js b/genai/text-generation/textgen-with-youtube-video.js index c9b4ebe6a5..b6eb192c6a 100644 --- a/genai/text-generation/textgen-with-youtube-video.js +++ b/genai/text-generation/textgen-with-youtube-video.js @@ -43,8 +43,8 @@ async function generateText( model: 'gemini-2.5-flash-lite', contents: [ytVideo, prompt], config: { - mediaResolution: 'MEDIA_RESOLUTION_LOW' - } + mediaResolution: 'MEDIA_RESOLUTION_LOW', + }, }); console.log(response.text);