diff --git a/genai/tools/test/tools-func-calling-stream-content.test.js b/genai/tools/test/tools-func-calling-stream-content.test.js new file mode 100644 index 00000000000..ab323c00a8c --- /dev/null +++ b/genai/tools/test/tools-func-calling-stream-content.test.js @@ -0,0 +1,43 @@ +// Copyright 2023 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 +// +// https://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. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const cp = require('child_process'); +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const projectId = process.env.GOOGLE_CLOUD_PROJECT; +const location = process.env.GOOGLE_CLOUD_LOCATION || 'global'; +const model = 'gemini-2.5-flash'; + +describe('tools-func-calling-stream-content', () => { + /** + * TODO(developer): Uncomment these variables before running the sample.\ + * (Not necessary if passing values as arguments) + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'YOUR_LOCATION'; + // const model = 'gemini-2.5-flash'; + + it('should create stream chat and begin the conversation the same in each instance', async () => { + const output = execSync( + `node ./tools-func-calling-stream-content.js ${projectId} ${location} ${model}` + ); + + // Assert that the response is what we expect + assert(output.match(/super nice/), output); + }); +}); diff --git a/genai/tools/tools-func-calling-stream-content.js b/genai/tools/tools-func-calling-stream-content.js new file mode 100644 index 00000000000..3fd8a226071 --- /dev/null +++ b/genai/tools/tools-func-calling-stream-content.js @@ -0,0 +1,96 @@ +// Copyright 2023 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 +// +// https://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. + +// [START aiplatform_genai_function_calling_stream_content] +const {GoogleGenAI} = require('@google/genai'); + +const tools = [ + { + functionDeclarations: [ + { + name: 'get_current_weather', + description: 'get weather in a given location', + parameters: { + type: 'OBJECT', + properties: { + location: {type: 'STRING'}, + unit: {type: 'STRING', enum: ['celsius', 'fahrenheit']}, + }, + required: ['location'], + }, + }, + ], + }, +]; + +const functionResponseParts = [ + { + functionResponse: { + name: 'get_current_weather', + response: {weather: 'super nice'}, + }, + }, +]; + +/** + * TODO(developer): Update these variables before running the sample. + */ +async function functionCallingStreamContent( + projectId = 'PROJECT_ID', + location = 'us-central1', + model = 'gemini-2.5-flash' +) { + // Initialize client with your Cloud project and location + const client = new GoogleGenAI({ + vertexai: true, + project: projectId, + location: location, + }); + + const request = [ + {role: 'user', parts: [{text: 'What is the weather in Boston?'}]}, + { + role: 'model', + parts: [ + { + functionCall: { + name: 'get_current_weather', + args: {location: 'Boston'}, + }, + }, + ], + }, + {role: 'user', parts: functionResponseParts}, + ]; + + const streamingResp = await client.models.generateContentStream({ + model: model, + contents: request, + config: {tools: tools}, + }); + + let completeResponseText = ''; + for await (const chunk of streamingResp) { + if (chunk.text) { + completeResponseText += chunk.text; + } + } + console.log(completeResponseText); +} +// [END aiplatform_genai_function_calling_stream_content] + +functionCallingStreamContent(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; +});