1. ভূমিকা
সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি দেখতে পাবেন কিভাবে আপনি ফাংশন কলিং নামক একটি নতুন বৈশিষ্ট্য ব্যবহার করে জেমিনিকে রিয়েল টাইম ডেটাতে অ্যাক্সেস দিতে পারেন। রিয়েল টাইম ডেটা সিমুলেট করার জন্য, আপনি একটি আবহাওয়া পরিষেবার শেষ বিন্দু তৈরি করবেন যা 2টি অবস্থানের জন্য বর্তমান আবহাওয়া ফেরত দেবে। তারপর আপনি জেমিনি দ্বারা চালিত একটি চ্যাট অ্যাপ তৈরি করবেন, যা বর্তমান আবহাওয়া পুনরুদ্ধার করতে ফাংশন কলিং ব্যবহার করে।
ফাংশন কলিং বোঝার জন্য একটি দ্রুত ভিজ্যুয়াল ব্যবহার করা যাক।
- একটি নির্দিষ্ট স্থানে বর্তমান আবহাওয়ার অবস্থানের জন্য তাৎক্ষণিক অনুরোধ
- এই প্রম্পট + getWeather() এর ফাংশন কন্ট্রাক্টটি জেমিনিকে পাঠানো হয়েছে।
- জেমিনি অনুরোধ করছে যে চ্যাট বট অ্যাপটি তার পক্ষ থেকে "getWeather(Seattle)" কল করুক।
- অ্যাপটি ফলাফল ফেরত পাঠায় (৪০ ডিগ্রি ফারেনহাইট এবং বৃষ্টিপাত)
- জেমিনি ফলাফল কলকারীর কাছে ফেরত পাঠায়।
সংক্ষেপে বলতে গেলে, জেমিনি ফাংশনটি কল করে না। ডেভেলপার হিসেবে আপনাকে অবশ্যই ফাংশনটি কল করতে হবে এবং ফলাফলগুলি জেমিনিকে ফেরত পাঠাতে হবে।

তুমি কি শিখবে
- জেমিনি ফাংশন কলিং কীভাবে কাজ করে
- ক্লাউড রান পরিষেবা হিসেবে জেমিনি-চালিত চ্যাটবট অ্যাপ কীভাবে স্থাপন করবেন
2. সেটআপ এবং প্রয়োজনীয়তা
পূর্বশর্ত
- আপনি ক্লাউড কনসোলে লগ ইন করেছেন।
- আপনি পূর্বে একটি দ্বিতীয় প্রজন্মের ফাংশন স্থাপন করেছেন। উদাহরণস্বরূপ, শুরু করার জন্য আপনি ক্লাউড ফাংশন দ্বিতীয় প্রজন্মের কুইকস্টার্ট স্থাপন করতে পারেন।
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন
.

যদি আপনি প্রথমবারের মতো ক্লাউড শেল শুরু করেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রিন দেখানো হবে যা এটি কী তা বর্ণনা করবে। যদি আপনার কাছে একটি মধ্যবর্তী স্ক্রিন থাকে, তাহলে Continue এ ক্লিক করুন।

ক্লাউড শেলের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে।

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সকল ডেভেলপমেন্ট টুল রয়েছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি অফার করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার বেশিরভাগ কাজ, যদি সব না হয়, একটি ব্রাউজার দিয়ে করা যেতে পারে।
একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি প্রমাণিত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে।
- আপনি প্রমাণিত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি তা না হয়, তাহলে আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
৩. পরিবেশ ভেরিয়েবল সেটআপ করুন এবং API গুলি সক্ষম করুন
পরিবেশ ভেরিয়েবল সেটআপ করুন
আপনি এই কোডল্যাব জুড়ে ব্যবহৃত পরিবেশগত ভেরিয়েবল সেট করতে পারেন।
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> WEATHER_SERVICE=weatherservice FRONTEND=frontend SERVICE_ACCOUNT="vertex-ai-caller" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
API গুলি সক্ষম করুন
এই কোডল্যাব ব্যবহার শুরু করার আগে, আপনাকে বেশ কয়েকটি API সক্রিয় করতে হবে। এই কোডল্যাবটির জন্য নিম্নলিখিত API ব্যবহার করা প্রয়োজন। আপনি নিম্নলিখিত কমান্ডটি চালিয়ে এই APIগুলি সক্রিয় করতে পারেন:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com
৪. Vertex AI-তে কল করার জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন
এই পরিষেবা অ্যাকাউন্টটি ক্লাউড রান দ্বারা Vertex AI Gemini API কল করার জন্য ব্যবহার করা হবে।
প্রথমে, এই কমান্ডটি চালিয়ে পরিষেবা অ্যাকাউন্ট তৈরি করুন:
gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run to access Vertex AI APIs"
দ্বিতীয়ত, পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা প্রদান করুন।
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/aiplatform.user
৫. ব্যাকএন্ড ক্লাউড রান পরিষেবা তৈরি করুন
প্রথমে, সোর্স কোডের জন্য একটি ডিরেক্টরি তৈরি করুন এবং সেই ডিরেক্টরিতে সিডি দিন।
mkdir -p gemini-function-calling/weatherservice gemini-function-calling/frontend && cd gemini-function-calling/weatherservice
তারপর, নিম্নলিখিত বিষয়বস্তু সহ একটি package.json ফাইল তৈরি করুন:
{
"name": "weatherservice",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.3"
}
}
এরপর, নিচের কন্টেন্ট দিয়ে একটি app.js সোর্স ফাইল তৈরি করুন। এই ফাইলটিতে পরিষেবার এন্ট্রি পয়েন্ট এবং অ্যাপের মূল লজিক রয়েছে।
const express = require("express");
const app = express();
app.get("/getweather", (req, res) => {
const location = req.query.location;
let temp, conditions;
if (location == "New Orleans") {
temp = 99;
conditions = "hot and humid";
} else if (location == "Seattle") {
temp = 40;
conditions = "rainy and overcast";
} else {
res.status(400).send("there is no data for the requested location");
}
res.json({
weather: temp,
location: location,
conditions: conditions
});
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`weather service: listening on port ${port}`);
});
app.get("/", (req, res) => {
res.send("welcome to hard-coded weather!");
});
আবহাওয়া পরিষেবা স্থাপন করুন
আপনি আবহাওয়া পরিষেবা স্থাপন করতে এই কমান্ডটি ব্যবহার করতে পারেন।
gcloud run deploy $WEATHER_SERVICE \ --source . \ --region $REGION \ --allow-unauthenticated
আবহাওয়া পরিষেবা পরীক্ষা করুন
আপনি curl ব্যবহার করে দুটি অবস্থানের আবহাওয়া যাচাই করতে পারেন:
WEATHER_SERVICE_URL=$(gcloud run services describe $WEATHER_SERVICE \
--platform managed \
--region=$REGION \
--format='value(status.url)')
curl $WEATHER_SERVICE_URL/getweather?location=Seattle
curl $WEATHER_SERVICE_URL/getweather?location\=New%20Orleans
সিয়াটলের তাপমাত্রা ৪০ ডিগ্রি ফারেনহাইট এবং বৃষ্টিপাতের সময়, আর নিউ অরলিন্সের তাপমাত্রা ৯৯ ডিগ্রি ফারেনহাইট এবং আর্দ্র, সবসময়।
৬. ফ্রন্টএন্ড পরিষেবা তৈরি করুন
প্রথমে, ফ্রন্টএন্ড ডিরেক্টরিতে cd লিখুন।
cd gemini-function-calling/frontend
তারপর, নিম্নলিখিত বিষয়বস্তু সহ একটি package.json ফাইল তৈরি করুন:
{
"name": "demo1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node app.js",
"nodemon": "nodemon app.js",
"cssdev": "npx tailwindcss -i ./input.css -o ./public/output.css --watch",
"tailwind": "npx tailwindcss -i ./input.css -o ./public/output.css",
"dev": "npm run tailwind && npm run nodemon"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/vertexai": "^0.4.0",
"axios": "^1.6.7",
"express": "^4.18.2",
"express-ws": "^5.0.2",
"htmx.org": "^1.9.10"
},
"devDependencies": {
"nodemon": "^3.1.0",
"tailwindcss": "^3.4.1"
}
}
এরপর, নিচের কন্টেন্ট দিয়ে একটি app.js সোর্স ফাইল তৈরি করুন। এই ফাইলটিতে পরিষেবার এন্ট্রি পয়েন্ট এবং অ্যাপের মূল লজিক রয়েছে।
const express = require("express");
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
const path = require("path");
const fs = require("fs");
const util = require("util");
const { spinnerSvg } = require("./spinnerSvg.js");
const expressWs = require("express-ws")(app);
app.use(express.static("public"));
const {
VertexAI,
FunctionDeclarationSchemaType
} = require("@google-cloud/vertexai");
// get project and location from metadata service
const metadataService = require("./metadataService.js");
// instance of Gemini model
let generativeModel;
// 1: define the function
const functionDeclarations = [
{
function_declarations: [
{
name: "getweather",
description: "get weather for a given location",
parameters: {
type: FunctionDeclarationSchemaType.OBJECT,
properties: {
location: {
type: FunctionDeclarationSchemaType.STRING
},
degrees: {
type: FunctionDeclarationSchemaType.NUMBER,
"description":
"current temperature in fahrenheit"
},
conditions: {
type: FunctionDeclarationSchemaType.STRING,
"description":
"how the weather feels subjectively"
}
},
required: ["location"]
}
}
]
}
];
// on instance startup
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, async () => {
console.log(`demo1: listening on port ${port}`);
const project = await metadataService.getProjectId();
const location = await metadataService.getRegion();
// Vertex client library instance
const vertex_ai = new VertexAI({
project: project,
location: location
});
// Instantiate models
generativeModel = vertex_ai.getGenerativeModel({
model: "gemini-1.0-pro-001"
});
});
const axios = require("axios");
const baseUrl = "https://weatherservice-k6msmyp47q-uc.a.run.app";
app.ws("/sendMessage", async function (ws, req) {
// this chat history will be pinned to the current
// Cloud Run instance. Consider using Firestore &
// Firebase anonymous auth instead.
// start ephemeral chat session with Gemini
const chatWithModel = generativeModel.startChat({
tools: functionDeclarations
});
ws.on("message", async function (message) {
let questionToAsk = JSON.parse(message).message;
console.log("WebSocket message: " + questionToAsk);
ws.send(`<div hx-swap-oob="beforeend:#toupdate"><div
id="questionToAsk"
class="text-black m-2 text-right border p-2 rounded-lg ml-24">
${questionToAsk}
</div></div>`);
// to simulate a natural pause in conversation
await sleep(500);
// get timestamp for div to replace
const now = "fromGemini" + Date.now();
ws.send(`<div hx-swap-oob="beforeend:#toupdate"><div
id=${now}
class=" text-blue-400 m-2 text-left border p-2 rounded-lg mr-24">
${spinnerSvg}
</div></div>`);
const results = await chatWithModel.sendMessage(questionToAsk);
// Function calling demo
let response1 = await results.response;
let data = response1.candidates[0].content.parts[0];
let methodToCall = data.functionCall;
if (methodToCall === undefined) {
console.log("Gemini says: ", data.text);
ws.send(`<div
id=${now}
hx-swap-oob="true"
hx-swap="outerHTML"
class="text-blue-400 m-2 text-left border p-2 rounded-lg mr-24">
${data.text}
</div>`);
// bail out - Gemini doesn't want to return a function
return;
}
// otherwise Gemini wants to call a function
console.log(
"Gemini wants to call: " +
methodToCall.name +
" with args: " +
util.inspect(methodToCall.args, {
showHidden: false,
depth: null,
colors: true
})
);
// make the external call
let jsonReturned;
try {
const responseFunctionCalling = await axios.get(
baseUrl + "/" + methodToCall.name,
{
params: {
location: methodToCall.args.location
}
}
);
jsonReturned = responseFunctionCalling.data;
} catch (ex) {
// in case an invalid location was provided
jsonReturned = ex.response.data;
}
console.log("jsonReturned: ", jsonReturned);
// tell the model what function we just called
const functionResponseParts = [
{
functionResponse: {
name: methodToCall.name,
response: {
name: methodToCall.name,
content: { jsonReturned }
}
}
}
];
// // Send a follow up message with a FunctionResponse
const result2 = await chatWithModel.sendMessage(
functionResponseParts
);
// This should include a text response from the model using the response content
// provided above
const response2 = await result2.response;
let answer = response2.candidates[0].content.parts[0].text;
console.log("answer: ", answer);
ws.send(`<div
id=${now}
hx-swap-oob="true"
hx-swap="outerHTML"
class="text-blue-400 m-2 text-left border p-2 rounded-lg mr-24">
${answer}
</div>`);
});
ws.on("close", () => {
console.log("WebSocket was closed");
});
});
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
tailwindCSS এর জন্য একটি input.css ফাইল তৈরি করুন।
@tailwind base; @tailwind components; @tailwind utilities;
tailwindCSS এর জন্য tailwind.config.js ফাইল তৈরি করুন।
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ["./**/*.{html,js}"],
theme: {
extend: {}
},
plugins: []
};
মোতায়েন করা ক্লাউড রান পরিষেবার জন্য প্রজেক্ট আইডি এবং অঞ্চল পেতে metadataService.js ফাইল তৈরি করুন। এই মানগুলি Vertex AI ক্লায়েন্ট লাইব্রেরির একটি উদাহরণ তৈরি করতে ব্যবহার করা হবে।
const your_project_id = "YOUR_PROJECT_ID";
const your_region = "YOUR_REGION";
const axios = require("axios");
module.exports = {
getProjectId: async () => {
let project = "";
try {
// Fetch the token to make a GCF to GCF call
const response = await axios.get(
"http://metadata.google.internal/computeMetadata/v1/project/project-id",
{
headers: {
"Metadata-Flavor": "Google"
}
}
);
if (response.data == "") {
// running locally on Cloud Shell
project = your_project_id;
} else {
// use project id from metadata service
project = response.data;
}
} catch (ex) {
// running locally on local terminal
project = your_project_id;
}
return project;
},
getRegion: async () => {
let region = "";
try {
// Fetch the token to make a GCF to GCF call
const response = await axios.get(
"http://metadata.google.internal/computeMetadata/v1/instance/region",
{
headers: {
"Metadata-Flavor": "Google"
}
}
);
if (response.data == "") {
// running locally on Cloud Shell
region = your_region;
} else {
// use region from metadata service
let regionFull = response.data;
const index = regionFull.lastIndexOf("/");
region = regionFull.substring(index + 1);
}
} catch (ex) {
// running locally on local terminal
region = your_region;
}
return region;
}
};
spinnerSvg.js নামে একটি ফাইল তৈরি করুন।
module.exports.spinnerSvg = `<svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-blue-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
>
<circle
class="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="4"
></circle>
<path
class="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
></path></svg>`;
একটি নতুন public ডিরেক্টরি তৈরি করুন।
mkdir public cd public
এখন ফ্রন্ট এন্ডের জন্য index.html ফাইল তৈরি করুন, যা htmx ব্যবহার করবে।
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<script
src="https://unpkg.com/htmx.org@1.9.10"
integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
crossorigin="anonymous"
></script>
<link href="./output.css" rel="stylesheet" />
<script src="https://unpkg.com/htmx.org/dist/ext/ws.js"></script>
<title>Demo 2</title>
</head>
<body>
<div id="herewego" text-center>
<!-- <div id="replaceme2" hx-swap-oob="true">Hello world</div> -->
<div
class="container mx-auto mt-8 text-center max-w-screen-lg"
>
<div
class="overflow-y-scroll bg-white p-2 border h-[500px] space-y-4 rounded-lg m-auto"
>
<div id="toupdate"></div>
</div>
<form
hx-trigger="submit, keyup[keyCode==13] from:body"
hx-ext="ws"
ws-connect="/sendMessage"
ws-send=""
hx-on="htmx:wsAfterSend: document.getElementById('message').value = ''"
>
<div class="mb-6 mt-6 flex gap-4">
<textarea
rows="2"
type="text"
id="message"
name="message"
class="block grow rounded-lg border p-6 resize-none"
required
>
What's is the current weather in Seattle?</textarea
>
<button
type="submit"
class="bg-blue-500 text-white px-4 py-2 rounded-lg text-center text-sm font-medium"
>
Send
</button>
</div>
</form>
</div>
</div>
</body>
</html>
৭. স্থানীয়ভাবে ফ্রন্টএন্ড পরিষেবা চালান
প্রথমে, নিশ্চিত করুন যে আপনি আপনার কোডল্যাবের ডিরেক্টরি frontend আছেন।
cd .. && pwd
তারপর, নিম্নলিখিত কমান্ডটি চালিয়ে নির্ভরতা ইনস্টল করুন:
npm install
স্থানীয়ভাবে চালানোর সময় ADC ব্যবহার করা
যদি আপনি ক্লাউড শেল ব্যবহার করেন, তাহলে আপনি ইতিমধ্যেই একটি Google Compute Engine ভার্চুয়াল মেশিন ব্যবহার করছেন। এই ভার্চুয়াল মেশিনের সাথে সম্পর্কিত আপনার শংসাপত্রগুলি (যেমন gcloud auth list চালানোর মাধ্যমে দেখানো হয়েছে) স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র দ্বারা ব্যবহৃত হবে, তাই gcloud auth application-default login কমান্ড ব্যবহার করার প্রয়োজন নেই। আপনি "স্থানীয়ভাবে অ্যাপটি চালান" বিভাগে যেতে পারেন।
তবে, যদি আপনি আপনার স্থানীয় টার্মিনালে (অর্থাৎ ক্লাউড শেলে না) কাজ করেন, তাহলে আপনাকে Google API-তে প্রমাণীকরণের জন্য অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র ব্যবহার করতে হবে। আপনি হয় ১) আপনার শংসাপত্র ব্যবহার করে লগইন করতে পারেন (যদি আপনার Vertex AI ব্যবহারকারী এবং ডেটাস্টোর ব্যবহারকারী উভয় ভূমিকা থাকে) অথবা ২) আপনি এই কোডল্যাবে ব্যবহৃত পরিষেবা অ্যাকাউন্টের ছদ্মবেশ ধারণ করে লগইন করতে পারেন।
বিকল্প ১) ADC-এর জন্য আপনার শংসাপত্র ব্যবহার করা
যদি আপনি আপনার শংসাপত্র ব্যবহার করতে চান, তাহলে প্রথমে gcloud auth list চালাতে পারেন যাতে আপনি gcloud-এ কীভাবে প্রমাণীকরণ করেছেন তা যাচাই করতে পারেন। এরপর, আপনার পরিচয়কে Vertex AI ব্যবহারকারীর ভূমিকা দিতে হতে পারে। যদি আপনার পরিচয়ে মালিকের ভূমিকা থাকে, তাহলে আপনার ইতিমধ্যেই এই Vertex AI ব্যবহারকারীর ভূমিকা রয়েছে। যদি না থাকে, তাহলে আপনি আপনার পরিচয় Vertex AI ব্যবহারকারীর ভূমিকা এবং Datastore ব্যবহারকারীর ভূমিকা প্রদান করতে এই কমান্ডটি চালাতে পারেন।
USER=<YOUR_PRINCIPAL_EMAIL> gcloud projects add-iam-policy-binding $PROJECT_ID \ --member user:$USER \ --role=roles/aiplatform.user gcloud projects add-iam-policy-binding $PROJECT_ID \ --member user:$USER \ --role=roles/datastore.user
তারপর নিম্নলিখিত কমান্ডটি চালান
gcloud auth application-default login
বিকল্প ২) ADC-এর জন্য একটি পরিষেবা অ্যাকাউন্টের ছদ্মবেশ ধারণ করা
এই কোডল্যাবে তৈরি করা পরিষেবা অ্যাকাউন্টটি ব্যবহার করতে চাইলে, আপনার ব্যবহারকারী অ্যাকাউন্টে পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর ভূমিকা থাকতে হবে। আপনি নিম্নলিখিত কমান্ডটি চালিয়ে এই ভূমিকাটি পেতে পারেন:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member user:$USER \ --role=roles/iam.serviceAccountTokenCreator
এরপর, পরিষেবা অ্যাকাউন্টের সাথে ADC ব্যবহার করার জন্য আপনাকে নিম্নলিখিত কমান্ডটি চালাতে হবে
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
স্থানীয়ভাবে অ্যাপটি চালান
অবশেষে, আপনি নিম্নলিখিত স্ক্রিপ্টটি চালিয়ে অ্যাপটি শুরু করতে পারেন। এই ডেভ স্ক্রিপ্টটি tailwindCSS থেকে output.css ফাইলটিও তৈরি করবে।
npm run dev
আপনি ওয়েব প্রিভিউ বোতামটি খুলে এবং প্রিভিউ পোর্ট 8080 নির্বাচন করে ওয়েবসাইটটি প্রিভিউ করতে পারেন।

৮. ফ্রন্টএন্ড পরিষেবা স্থাপন এবং পরীক্ষা করুন
প্রথমে, ডিপ্লয়মেন্ট শুরু করতে এই কমান্ডটি চালান এবং কোন সার্ভিস অ্যাকাউন্টটি ব্যবহার করতে হবে তা নির্দিষ্ট করুন। যদি কোন সার্ভিস অ্যাকাউন্ট নির্দিষ্ট না থাকে, তাহলে ডিফল্ট কম্পিউট সার্ভিস অ্যাকাউন্ট ব্যবহার করা হবে।
gcloud run deploy $FRONTEND \ --service-account $SERVICE_ACCOUNT_ADDRESS \ --source . \ --region $REGION \ --allow-unauthenticated
আপনার ব্রাউজারে ফ্রন্টএন্ডের জন্য পরিষেবা URL খুলুন। "সিয়াটলের বর্তমান আবহাওয়া কেমন?" প্রশ্ন জিজ্ঞাসা করুন এবং জেমিনিকে উত্তর দিতে হবে "বর্তমানে ৪০ ডিগ্রি তাপমাত্রা এবং বৃষ্টি হচ্ছে।" যদি আপনি জিজ্ঞাসা করেন "বোস্টনে বর্তমান আবহাওয়া কেমন?", তাহলে জেমিনি উত্তর দেবে "আমি এই অনুরোধটি পূরণ করতে পারছি না। উপলব্ধ আবহাওয়া API-তে বোস্টনের জন্য ডেটা নেই।"
9. অভিনন্দন!
কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!
আমরা ক্লাউড রান , ভার্টেক্স এআই জেমিনি এপিআই এবং ফাংশন কলিং ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিচ্ছি।
আমরা যা কভার করেছি
- জেমিনি ফাংশন কলিং কীভাবে কাজ করে
- ক্লাউড রান পরিষেবা হিসেবে জেমিনি-চালিত চ্যাটবট অ্যাপ কীভাবে স্থাপন করবেন
১০. পরিষ্কার করা
অসাবধানতাবশত চার্জ এড়াতে, (উদাহরণস্বরূপ, যদি এই ক্লাউড রান পরিষেবাটি আপনার মাসিক ফ্রি টিয়ারে ক্লাউড রান ইনভোকমেন্ট বরাদ্দের চেয়ে বেশি বার অনিচ্ছাকৃতভাবে ব্যবহৃত হয়), আপনি হয় ক্লাউড রান পরিষেবাটি মুছে ফেলতে পারেন অথবা ধাপ ২-এ তৈরি করা প্রকল্পটি মুছে ফেলতে পারেন।
ক্লাউড রান পরিষেবাগুলি মুছে ফেলার জন্য, https://console.cloud.google.com/functions/ এ ক্লাউড রান ক্লাউড কনসোলে যান এবং এই কোডল্যাবে আপনার তৈরি করা $WEATHER_SERVICE এবং $FRONTEND পরিষেবাগুলি মুছে ফেলুন।
জেমিনিকে যেকোনো অসাবধানতাবশত কল এড়াতে, আপনি vertex-ai-caller পরিষেবা অ্যাকাউন্টটি মুছে ফেলতে অথবা Vertex AI ব্যবহারকারীর ভূমিকা প্রত্যাহার করতে চাইতে পারেন।
যদি আপনি সম্পূর্ণ প্রকল্পটি মুছে ফেলতে চান, তাহলে আপনি https://console.cloud.google.com/cloud-resource-manager এ যেতে পারেন, ধাপ ২-এ তৈরি করা প্রকল্পটি নির্বাচন করুন এবং মুছে ফেলুন নির্বাচন করুন। যদি আপনি প্রকল্পটি মুছে ফেলেন, তাহলে আপনাকে আপনার ক্লাউড SDK-তে প্রকল্পগুলি পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রকল্পের তালিকা দেখতে পারেন।