- Notifications
You must be signed in to change notification settings - Fork225
TypeScript/JavaScript SDK for Gemini and Vertex AI.
License
googleapis/js-genai
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Documentation:https://googleapis.github.io/js-genai/
The Google Gen AI JavaScript SDK is designed forTypeScript and JavaScript developers to build applications powered by Gemini. The SDKsupports both theGemini Developer APIandVertex AI.
The Google Gen AI SDK is designed to work with Gemini 2.0+ features.
Caution
API Key Security: Avoid exposing API keys in client-side code.Use server-side implementations in production environments.
Generative models are often unaware of recent API and SDK updates and may suggest outdated or legacy code.
We recommend using our Code Generation instructionscodegen_instructions.md when generating Google Gen AI SDK code to guide your model towards using the more recent SDK features. Copy and paste the instructions into your development environment to provide the model with the necessary context.
- Node.js version 20 or later
Configure authentication for your project.
- Install the gcloud CLI.
- Initialize the gcloud CLI.
- Create local authentication credentials for your user account:
gcloud auth application-default login
A list of accepted authentication options are listed inGoogleAuthOptions interface of google-auth-library-node.js GitHub repo.
To install the SDK, run the following command:
npm install @google/genai
The simplest way to get started is to use an API key fromGoogle AI Studio:
import{GoogleGenAI}from'@google/genai';constGEMINI_API_KEY=process.env.GEMINI_API_KEY;constai=newGoogleGenAI({apiKey:GEMINI_API_KEY});asyncfunctionmain(){constresponse=awaitai.models.generateContent({model:'gemini-2.5-flash',contents:'Why is the sky blue?',});console.log(response.text);}main();
The Google Gen AI SDK provides support for both theGoogle AI Studio andVertex AIimplementations of the Gemini API.
For server-side applications, initialize using an API key, which canbe acquired fromGoogle AI Studio:
import{GoogleGenAI}from'@google/genai';constai=newGoogleGenAI({apiKey:'GEMINI_API_KEY'});
Caution
API Key Security: Avoid exposing API keys in client-side code.Use server-side implementations in production environments.
In the browser the initialization code is identical:
import{GoogleGenAI}from'@google/genai';constai=newGoogleGenAI({apiKey:'GEMINI_API_KEY'});
Sample code for VertexAI initialization:
import{GoogleGenAI}from'@google/genai';constai=newGoogleGenAI({vertexai:true,project:'your_project',location:'your_location',});
For NodeJS environments, you can create a client by configuring the necessaryenvironment variables. Configuration setup instructions depends on whetheryou're using the Gemini Developer API or the Gemini API in Vertex AI.
Gemini Developer API: SetGOOGLE_API_KEY as shown below:
export GOOGLE_API_KEY='your-api-key'
Gemini API on Vertex AI: SetGOOGLE_GENAI_USE_VERTEXAI,GOOGLE_CLOUD_PROJECT andGOOGLE_CLOUD_LOCATION, as shown below:
export GOOGLE_GENAI_USE_VERTEXAI=trueexport GOOGLE_CLOUD_PROJECT='your-project-id'export GOOGLE_CLOUD_LOCATION='us-central1'
import{GoogleGenAI}from'@google/genai';constai=newGoogleGenAI();
By default, the SDK uses the beta API endpoints provided by Google to supportpreview features in the APIs. The stable API endpoints can be selected bysetting the API version tov1.
To set the API version useapiVersion. For example, to set the API version tov1 for Vertex AI:
constai=newGoogleGenAI({vertexai:true,project:'your_project',location:'your_location',apiVersion:'v1'});
To set the API version tov1alpha for the Gemini Developer API:
constai=newGoogleGenAI({apiKey:'GEMINI_API_KEY',apiVersion:'v1alpha'});
All API features are accessed through an instance of theGoogleGenAI classes.The submodules bundle together related API methods:
ai.models:Usemodelsto query models (generateContent,generateImages, ...), orexamine their metadata.ai.caches:Create and managecachesto reduce costs when repeatedly using the samelarge prompt prefix.ai.chats:Create local statefulchatobjects to simplify multi turn interactions.ai.files:Uploadfilesto the API and reference them in your prompts.This reduces bandwidth if you use a file many times, and handles files toolarge to fit inline with your prompt.ai.live:Start alivesession for real time interaction, allows text + audio + videoinput, and text or audio output.
More samples can be found in thegithub samples directory.
For quicker, more responsive API interactions use thegenerateContentStreammethod which yields chunks as they're generated:
import{GoogleGenAI}from'@google/genai';constGEMINI_API_KEY=process.env.GEMINI_API_KEY;constai=newGoogleGenAI({apiKey:GEMINI_API_KEY});asyncfunctionmain(){constresponse=awaitai.models.generateContentStream({model:'gemini-2.5-flash',contents:'Write a 100-word poem.',});forawait(constchunkofresponse){console.log(chunk.text);}}main();
To let Gemini to interact with external systems, you can providefunctionDeclaration objects astools. To use these tools it's a 4 step
- Declare the function name, description, and parametersJsonSchema
- Call
generateContentwith function calling enabled - Use the returned
FunctionCallparameters to call your actual function - Send the result back to the model (with history, easier in
ai.chat)as aFunctionResponse
import{GoogleGenAI,FunctionCallingConfigMode,FunctionDeclaration,Type}from'@google/genai';constGEMINI_API_KEY=process.env.GEMINI_API_KEY;asyncfunctionmain(){constcontrolLightDeclaration:FunctionDeclaration={name:'controlLight',parametersJsonSchema:{type:'object',properties:{brightness:{type:'number',},colorTemperature:{type:'string',},},required:['brightness','colorTemperature'],},};constai=newGoogleGenAI({apiKey:GEMINI_API_KEY});constresponse=awaitai.models.generateContent({model:'gemini-2.5-flash',contents:'Dim the lights so the room feels cozy and warm.',config:{toolConfig:{functionCallingConfig:{// Force it to call any functionmode:FunctionCallingConfigMode.ANY,allowedFunctionNames:['controlLight'],}},tools:[{functionDeclarations:[controlLightDeclaration]}]}});console.log(response.functionCalls);}main();
Built-inMCP support is anexperimental feature. You can pass a local MCP server as a tool directly.
import{GoogleGenAI,FunctionCallingConfigMode,mcpToTool}from'@google/genai';import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport}from"@modelcontextprotocol/sdk/client/stdio.js";// Create server parameters for stdio connectionconstserverParams=newStdioClientTransport({command:"npx",// Executableargs:["-y","@philschmid/weather-mcp"]// MCP Server});constclient=newClient({name:"example-client",version:"1.0.0"});// Configure the clientconstai=newGoogleGenAI({});// Initialize the connection between client and serverawaitclient.connect(serverParams);// Send request to the model with MCP toolsconstresponse=awaitai.models.generateContent({model:"gemini-2.5-flash",contents:`What is the weather in London in${newDate().toLocaleDateString()}?`,config:{tools:[mcpToTool(client)],// uses the session, will automatically call the tool using automatic function calling},});console.log(response.text);// Close the connectionawaitclient.close();
The SDK allows you to specify the following types in thecontents parameter:
Content: The SDK will wrap the singularContentinstance in an array whichcontains only the given content instanceContent[]: No transformation happens
Parts will be aggregated on a singular Content, with role 'user'.
Part | string: The SDK will wrap thestringorPartin aContentinstance with role 'user'.Part[] | string[]: The SDK will wrap the full provided list into a singleContentwith role 'user'.
NOTE: This doesn't apply toFunctionCall andFunctionResponse parts,if you are specifying those, you need to explicitly provide the fullContent[] structure making it explicit which Parts are 'spoken' by the model,or the user. The SDK will throw an exception if you try this.
To handle errors raised by the API, the SDK provides thisApiError class.
import{GoogleGenAI}from'@google/genai';constGEMINI_API_KEY=process.env.GEMINI_API_KEY;constai=newGoogleGenAI({apiKey:GEMINI_API_KEY});asyncfunctionmain(){awaitai.models.generateContent({model:'non-existent-model',contents:'Write a 100-word poem.',}).catch((e)=>{console.error('error name: ',e.name);console.error('error message: ',e.message);console.error('error status: ',e.status);});}main();
Warning: The Interactions API is inBeta. This is a preview of anexperimental feature. Features and schemas are subject tobreaking changes.
The Interactions API is a unified interface for interacting with Gemini modelsand agents. It simplifies state management, tool orchestration, and long-runningtasks.
See thedocumentation sitefor more details.
constinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',input:'Hello, how are you?',});console.debug(interaction);
The Interactions API supports server-side state management. You can continue aconversation by referencing theprevious_interaction_id.
// 1. First turnconstinteraction1=awaitai.interactions.create({model:'gemini-2.5-flash',input:'Hi, my name is Amir.',});console.debug(interaction1);// 2. Second turn (passing previous_interaction_id)constinteraction2=awaitai.interactions.create({model:'gemini-2.5-flash',input:'What is my name?',previous_interaction_id:interaction1.id,});console.debug(interaction2);
You can use specialized agents likedeep-research-pro-preview-12-2025 forcomplex tasks.
functionsleep(ms:number):Promise<void>{returnnewPromise(resolve=>setTimeout(resolve,ms));}// 1. Start the Deep Research AgentconstinitialInteraction=awaitai.interactions.create({input:'Research the history of the Google TPUs with a focus on 2025 and 2026.',agent:'deep-research-pro-preview-12-2025',background:true,});console.log(`Research started. Interaction ID:${initialInteraction.id}`);// 2. Poll for resultswhile(true){constinteraction=awaitai.interactions.get(initialInteraction.id);console.log(`Status:${interaction.status}`);if(interaction.status==='completed'){console.debug('\nFinal Report:\n',interaction.outputs);break;}elseif(['failed','cancelled'].includes(interaction.status)){console.log(`Failed with status:${interaction.status}`);break;}awaitsleep(10000);// Sleep for 10 seconds}
You can provide multimodal data (text, images, audio, etc.) in the input list.
importbase64// Assuming you have a base64 string// const base64Image = ...;constinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',input:[{type:'text',text:'Describe the image.'},{type:'image',data:base64Image,mime_type:'image/png'},],});console.debug(interaction);
You can define custom functions for the model to use. The Interactions APIhandles the tool selection, and you provide the execution result back to themodel.
// 1. Define the toolconstgetWeather=(location:string)=>{/* Gets the weather for a given location. */return`The weather in${location} is sunny.`;};// 2. Send the request with toolsletinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',input:'What is the weather in Mountain View, CA?',tools:[{type:'function',name:'get_weather',description:'Gets the weather for a given location.',parameters:{type:'object',properties:{location:{type:'string',description:'The city and state, e.g. San Francisco, CA',},},required:['location'],},},],});// 3. Handle the tool callfor(constoutputofinteraction.outputs!){if(output.type==='function_call'){console.log(`Tool Call:${output.name}(${JSON.stringify(output.arguments)})`);// Execute your actual function here// Note: ensure arguments match your function signatureconstresult=getWeather(JSON.stringify(output.arguments.location));// Send result back to the modelinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',previous_interaction_id:interaction.id,input:[{type:'function_result',name:output.name,call_id:output.id,result:result,},],});console.debug(`Response:${JSON.stringify(interaction)}`);}}
You can also use Google's built-in tools, such asGoogle Search orCodeExecution.
constinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',input:'Who won the last Super Bowl',tools:[{type:'google_search'}],});console.debug(interaction);
constinteraction=awaitai.interactions.create({model:'gemini-2.5-flash',input:'Calculate the 50th Fibonacci number.',tools:[{type:'code_execution'}],});console.debug(interaction);
The Interactions API can generate multimodal outputs, such as images. You mustspecify theresponse_modalities.
import*asfsfrom'fs';constinteraction=awaitai.interactions.create({model:'gemini-3-pro-image-preview',input:'Generate an image of a futuristic city.',response_modalities:['image'],});for(constoutputofinteraction.outputs!){if(output.type==='image'){console.log(`Generated image with mime_type:${output.mime_type}`);// Save the imagefs.writeFileSync('generated_city.png',Buffer.from(output.data!,'base64'));}}
This SDK (@google/genai) is Google Deepmind’s "vanilla" SDK for its generativeAI offerings, and is where Google Deepmind adds new AI features.
Models hosted either on theVertex AI platform or theGemini Developer platform are accessible through this SDK.
Other SDKs may be offering additional AI frameworks on top of this SDK, or maybe targeting specific project environments (like Firebase).
The@google/generative_language and@google-cloud/vertexai SDKs are previousiterations of this SDK and are no longer receiving new Gemini 2.0+ features.
About
TypeScript/JavaScript SDK for Gemini and Vertex AI.
Resources
License
Code of conduct
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.