-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
# This is a combination of 16 commits.
# 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
Showing
21 changed files
with
1,052 additions
and
4 deletions.
There are no files selected for viewing
Validating CODEOWNERS rules …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
}); |
Oops, something went wrong.