Skip to content

Commit

Permalink
# This is a combination of 16 commits.
Browse files Browse the repository at this point in the history
# This is the 1st commit message:

refactor: updating codeowners

# This is the commit message #2:

add chat functions

# This is the commit message #3:

use correct testing project

# This is the commit message #4:

refactor: adding system tests + updating corresponding chat samples

# This is the commit message #5:

add countTokens sample

# This is the commit message #6:

refactor: adding in region tags, abstracting out mimetype, adding new image ur

# This is the commit message #7:

refactor: updating gs url in test, fix to args getting passed to sample functions

# This is the commit message #8:

refactor: resolving file paths in tests, adding wait helper function

# This is the commit message #9:

add warning about safety concerns

# This is the commit message #10:

refactor:filling out nonstreamingchat and streamcontent tests

# This is the commit message #11:

add countTokens test

# This is the commit message #12:

refactor: filling out more streaming tests

# This is the commit message #13:

add safety settings test

# This is the commit message #14:

refactor: adding in stream content and multipart content tests

# This is the commit message #15:

feat: add new sendMultiModalPromptWithImage sample

# This is the commit message #16:

refactor: adding region tags
  • Loading branch information
pattishin committed Dec 13, 2023
1 parent dc9370f commit f5e5888
Show file tree
Hide file tree
Showing 21 changed files with 1,052 additions and 4 deletions.
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ monitoring/opencensus @GoogleCloudPlatform/nodejs-samples-reviewers

# Data & AI
ai-platform @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers
generative-ai @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers
automl @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers
cloud-language @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers
contact-center-insights @GoogleCloudPlatform/dee-data-ai @GoogleCloudPlatform/nodejs-samples-reviewers
Expand Down
52 changes: 52 additions & 0 deletions generative-ai/snippets/countTokens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// 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.

const { VertexAI } = require('@google-cloud/vertexai');

async function countTokens(
projectId = 'PROJECT_ID',
location = 'LOCATION_ID',
model = 'MODEL'
) {
// [START aiplatform_gemini_token_count]

/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// const projectId = 'your-project-id';
// const location = 'us-central1';
// const model = 'gemini-pro';

// Initialize Vertex with your Cloud project and location
const vertex_ai = new VertexAI({ project: projectId, location: location });

// Instantiate the model
const generativeModel = vertex_ai.preview.getGenerativeModel({
model: model,
});

const req = {
contents: [{ role: 'user', parts: [{ text: 'How are you doing today?' }] }],
};

const countTokensResp = await generativeModel.countTokens(req);
console.log('count tokens response: ', countTokensResp);

// [END aiplatform_gemini_token_count]
}

countTokens(...process.argv.slice(2)).catch(err => {
console.error(err.message);
process.exitCode = 1;
});
124 changes: 124 additions & 0 deletions generative-ai/snippets/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
const {
VertexAI,
HarmBlockThreshold,
HarmCategory,
} = require('@google-cloud/vertexai');

const project = 'cloud-llm-preview1';
const location = 'us-central1';

// Initialize Vertex with your Cloud project and location
const vertex_ai = new VertexAI({project: project, location: location});

// Instantiate the models
const generativeModel = vertex_ai.preview.getGenerativeModel({
model: 'gemini-pro',
// The following parameters are optional
// They can also be passed to individual content generation requests
safety_settings: [
{
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
],
generation_config: {max_output_tokens: 256},
});

const generativeVisionModel = vertex_ai.preview.getGenerativeModel({
model: 'gemini-pro-vision',
});

async function streamContentTextOnly() {
const req = {
contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
};

const streamingResp = await generativeModel.generateContentStream(req);

for await (const item of streamingResp.stream) {
console.log('stream chunk:', item);
}

console.log('aggregated response: ', await streamingResp.response);
}

async function nonStreamingTextOnly() {
const req = {
contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
};

const nonstreamingResp = await generativeModel.generateContent(req);
console.log('non-streaming response: ', await nonstreamingResp.response);
}

async function countTokens() {
const req = {
contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
};

const countTokensResp = await generativeModel.countTokens(req);
console.log('count tokens response: ', countTokensResp);
}

async function nonStreamingChat() {
const chat = generativeModel.startChat({});
const result1 = await chat.sendMessage('hello');
console.log('send message result1: ', result1);
const resp1 = result1.response;
console.log('send message response1: ', resp1);
const result2 = await chat.sendMessage('what day is it today?');
console.log('result2: ', result2);
const resp2 = result2.response;
console.log('send message response2: ', resp2);
const result3 = await chat.sendMessage('what day is it tomorrow?');
console.log('result3: ', result3);
const resp3 = result3.response;
console.log('send message response3: ', resp3);
}

async function streamingChat() {
const chat = generativeModel.startChat({});
const streamResult1 = await chat.sendMessageStream('hello again');
console.log('stream result1: ', streamResult1);
const streamResp1 = await streamResult1.response;
console.log('stream send message response1: ', streamResp1);
const streamResult2 = await chat.sendMessageStream('what is the date today?');
console.log('stream result2: ', streamResult2);
const streamResp2 = await streamResult2.response;
console.log('stream send message response2: ', streamResp2);
const streamResult3 = await chat.sendMessageStream(
'what is the date tomorrow?'
);
console.log('stream result3: ', streamResult3);
const streamResp3 = await streamResult3.response;
console.log('stream send message response3: ', streamResp3);
}

async function multiPartContent() {
const filePart = {
file_data: {
file_uri: 'gs://sararob_imagegeneration_test/kitten.jpeg',
mime_type: 'image/jpeg',
},
};
const textPart = {text: 'What is this a picture of?'};

const request = {
contents: [{role: 'user', parts: [textPart, filePart]}],
};

const generativeVisionModel = vertex_ai.preview.getGenerativeModel({
model: 'gemini-pro-vision',
});

const resp = await generativeVisionModel.generateContentStream(request);
const contentResponse = await resp.response;
console.log(contentResponse.candidates[0].content);
}

nonStreamingTextOnly();
streamContentTextOnly();
countTokens();
nonStreamingChat();
streamingChat();
multiPartContent();
73 changes: 73 additions & 0 deletions generative-ai/snippets/nonStreamingChat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// 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.

const {VertexAI} = require('@google-cloud/vertexai');

function wait(time) {
return new Promise(resolve => {
setTimeout(resolve, time);
});
}

async function createNonStreamingChat(
projectId = 'PROJECT_ID',
location = 'LOCATION_ID',
model = 'MODEL'
) {
// TODO: Find better method. Setting delay to give api time to respond, otherwise it will 404
// await wait(10);

// [START aiplatform_gemini_multiturn_chat]
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// const projectId = 'your-project-id';
// const location = 'us-central1';

// Initialize Vertex with your Cloud project and location
const vertexAI = new VertexAI({project: projectId, location: location});

// Instantiate the model
const generativeModel = vertexAI.preview.getGenerativeModel({
model: model,
});

const chat = generativeModel.startChat({});

const chatInput1 = 'Hello';
console.log(`User: ${chatInput1}`);

const result1 = await chat.sendMessage(chatInput1);
const response1 = result1.response.candidates[0].content.parts[0].text;
console.log('Chat bot: ', response1);

const chatInput2 = 'Can you tell me a scientific fun fact?';
console.log(`User: ${chatInput2}`);
const result2 = await chat.sendMessage(chatInput2);
const response2 = result2.response.candidates[0].content.parts[0].text;
console.log('Chat bot: ', response2);

const chatInput3 = 'How can I learn more about that?';
console.log(`User: ${chatInput3}`);
const result3 = await chat.sendMessage(chatInput3);
const response3 = result3.response.candidates[0].content.parts[0].text;
console.log('Chat bot: ', response3);

// [END aiplatform_gemini_multiturn_chat]
}

createNonStreamingChat(...process.argv.slice(2)).catch(err => {
console.error(err.message);
process.exitCode = 1;
});
64 changes: 64 additions & 0 deletions generative-ai/snippets/nonStreamingContent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// 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.

const {VertexAI} = require('@google-cloud/vertexai');

async function createNonStreamingContent(
projectId = 'PROJECT_ID',
location = 'LOCATION_ID',
model = 'MODEL'
) {
// [START aiplatform_gemini_function_calling]

/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// const projectId = 'your-project-id';
// const location = 'us-central1';

// Initialize Vertex with your Cloud project and location
const vertexAI = new VertexAI({project: projectId, location: location});

// Instantiate the model
const generativeModel = vertexAI.preview.getGenerativeModel({
model: model,
});

const request = {
contents: [{role: 'user', parts: [{text: 'What is Node.js?'}]}],
};

console.log('Prompt:');
console.log(request.contents[0].parts[0].text);
console.log('Non-Streaming Response Text:');

// Create the response stream
const responseStream = await generativeModel.generateContentStream(request);

// Wait for the response stream to complete
const aggregatedResponse = await responseStream.response;

// Select the text from the response
const fullTextResponse =
aggregatedResponse.candidates[0].content.parts[0].text;

console.log(fullTextResponse);

// [END aiplatform_gemini_function_calling]
}

createNonStreamingContent(...process.argv.slice(2)).catch(err => {
console.error(err.message);
process.exitCode = 1;
});
Loading

0 comments on commit f5e5888

Please sign in to comment.