Gemini की सुविधाओं के ज़रिए कॉल करने की सुविधा के साथ, Cloud Run इस्तेमाल करने का तरीका

1. परिचय

खास जानकारी

इस कोडलैब में, आपको यह दिखाया जाएगा कि फ़ंक्शन कॉलिंग नाम की नई सुविधा का इस्तेमाल करके, Gemini को रीयल टाइम डेटा का ऐक्सेस कैसे दिया जा सकता है. रीयल टाइम डेटा को सिम्युलेट करने के लिए, आपको मौसम की जानकारी देने वाली सेवा का एक ऐसा एंडपॉइंट बनाना होगा जो दो जगहों के मौसम की मौजूदा जानकारी दे. इसके बाद, Gemini की मदद से काम करने वाला एक चैट ऐप्लिकेशन बनाया जाएगा. यह ऐप्लिकेशन, फ़ंक्शन कॉलिंग की सुविधा का इस्तेमाल करके, मौसम की मौजूदा जानकारी देगा.

फ़ंक्शन कॉलिंग को समझने के लिए, आइए एक विज़ुअल का इस्तेमाल करें.

  • इस प्रॉम्प्ट में, किसी जगह के मौसम की मौजूदा जानकारी देने का अनुरोध किया गया है
  • इस प्रॉम्प्ट के साथ-साथ, getWeather() फ़ंक्शन का कानूनी समझौता Gemini को भेजा जाता है
  • Gemini, चैट बॉट ऐप्लिकेशन से "getWeather(Seattle)" को कॉल करने के लिए कहता है
  • ऐप्लिकेशन, नतीजे भेजता है (40 डिग्री फ़ैरनहाइट और बारिश हो रही है)
  • Gemini, कॉल करने वाले व्यक्ति को नतीजे भेजता है

संक्षेप में कहें, तो Gemini फ़ंक्शन को कॉल नहीं करता है. डेवलपर के तौर पर, आपको फ़ंक्शन को कॉल करना होगा और Gemini को नतीजे वापस भेजने होंगे.

फ़ंक्शन कॉल करने के फ़्लो का डायग्राम

आपको क्या सीखने को मिलेगा

  • Gemini में फ़ंक्शन कॉलिंग की सुविधा कैसे काम करती है
  • Gemini की मदद से काम करने वाले चैटबॉट ऐप्लिकेशन को Cloud Run सेवा के तौर पर डिप्लॉय करने का तरीका

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.

  1. पुष्टि करें कि आपने Cloud Shell में पुष्टि कर ली है. इसके लिए, यह कमांड चलाएं:
gcloud auth list

कमांड आउटपुट

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. एनवायरमेंट वैरिएबल सेट अप करना और एपीआई चालू करना

एनवायरमेंट वैरिएबल सेट अप करना

ऐसे एनवायरमेंट वैरिएबल सेट किए जा सकते हैं जिनका इस्तेमाल इस कोडलैब में किया जाएगा.

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

एपीआई चालू करें

इस कोडलैब का इस्तेमाल करने से पहले, आपको कई एपीआई चालू करने होंगे. इस कोडलैब के लिए, इन एपीआई का इस्तेमाल करना ज़रूरी है. इन एपीआई को चालू करने के लिए, यह कमांड चलाएं:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com

4. Vertex AI को कॉल करने के लिए सेवा खाता बनाना

इस सेवा खाते का इस्तेमाल, Cloud Run करेगा. इससे 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

5. बैकएंड Cloud Run सेवा बनाना

सबसे पहले, सोर्स कोड के लिए एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में cd करें.

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

सिएटल में 40 डिग्री फ़ारेनहाइट तापमान है और बारिश हो रही है. वहीं, न्यू ऑरलियन्स में हमेशा 99 डिग्री फ़ारेनहाइट तापमान रहता है और नमी बनी रहती है.

6. फ़्रंटएंड सेवा बनाना

सबसे पहले, फ़्रंटएंड डायरेक्ट्री में जाएं.

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: []
};

डिप्लॉय की गई Cloud Run सेवा के लिए, प्रोजेक्ट आईडी और क्षेत्र की जानकारी पाने के लिए 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&apos;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>

7. फ़्रंटएंड सेवा को स्थानीय तौर पर चलाएं

सबसे पहले, पक्का करें कि आप अपने कोडलैब के लिए frontend डायरेक्ट्री में हों.

cd .. && pwd

इसके बाद, यहां दिया गया कमांड चलाकर ज़रूरी सॉफ़्टवेयर इंस्टॉल करें:

npm install

स्थानीय तौर पर विज्ञापन दिखाने के लिए, एडीसी का इस्तेमाल करना

अगर Cloud Shell में काम किया जा रहा है, तो इसका मतलब है कि Google Compute Engine की वर्चुअल मशीन का इस्तेमाल किया जा रहा है. इस वर्चुअल मशीन से जुड़े आपके क्रेडेंशियल (जैसा कि gcloud auth list चलाने पर दिखता है) का इस्तेमाल, ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल अपने-आप करेंगे. इसलिए, gcloud auth application-default login कमांड का इस्तेमाल करना ज़रूरी नहीं है. सीधे ऐप्लिकेशन को स्थानीय तौर पर चलाना सेक्शन पर जाएं

हालांकि, अगर इसे अपने लोकल टर्मिनल (यानी कि Cloud Shell में नहीं) पर चलाया जा रहा है, तो आपको Google API से पुष्टि करने के लिए, ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल का इस्तेमाल करना होगा. आपके पास दो विकल्प हैं: 1) अपने क्रेडेंशियल का इस्तेमाल करके लॉगिन करें. इसके लिए, आपके पास Vertex AI User और Datastore User, दोनों भूमिकाएं होनी चाहिए. 2) इस कोडलैब में इस्तेमाल किए गए सेवा खाते के तौर पर लॉगिन करें.

पहला विकल्प) एडीसी के लिए अपने क्रेडेंशियल का इस्तेमाल करना

अगर आपको अपने क्रेडेंशियल का इस्तेमाल करना है, तो सबसे पहले gcloud auth list चलाकर पुष्टि करें कि gcloud में आपकी पुष्टि कैसे की जाती है. इसके बाद, आपको अपनी पहचान को Vertex AI User की भूमिका देनी पड़ सकती है. अगर आपकी पहचान के पास मालिक की भूमिका है, तो आपके पास पहले से ही 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

दूसरा विकल्प) एडीसी के लिए सेवा खाते से मिलता-जुलता खाता बनाना

अगर आपको इस कोडलैब में बनाए गए सेवा खाते का इस्तेमाल करना है, तो आपके उपयोगकर्ता खाते के पास सेवा खाता टोकन क्रिएटर की भूमिका होनी चाहिए. यह भूमिका पाने के लिए, यह कमांड चलाएं:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member user:$USER \
  --role=roles/iam.serviceAccountTokenCreator

इसके बाद, सेवा खाते के साथ एडीसी का इस्तेमाल करने के लिए, आपको यह कमांड चलानी होगी

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

ऐप्लिकेशन को स्थानीय तौर पर चलाना

आखिर में, इस स्क्रिप्ट को चलाकर ऐप्लिकेशन शुरू किया जा सकता है. यह डेवलपर स्क्रिप्ट, TailwindCSS से output.css फ़ाइल भी जनरेट करेगी.

npm run dev

वेबसाइट की झलक देखने के लिए, 'वेब की झलक देखें' बटन खोलें और 'पोर्ट 8080 की झलक देखें' को चुनें

वेब प्रीव्यू - पोर्ट 8080 पर झलक देखें बटन

8. फ़्रंटएंड सेवा को डिप्लॉय और टेस्ट करना

सबसे पहले, डिप्लॉयमेंट शुरू करने के लिए यह कमांड चलाएं. साथ ही, इस्तेमाल किए जाने वाले सेवा खाते के बारे में बताएं. अगर कोई सेवा खाता नहीं दिया जाता है, तो Compute Engine के डिफ़ॉल्ट सेवा खाते का इस्तेमाल किया जाता है.

gcloud run deploy $FRONTEND \
  --service-account $SERVICE_ACCOUNT_ADDRESS \
  --source . \
  --region $REGION \
  --allow-unauthenticated

अपने ब्राउज़र में, फ़्रंटएंड के लिए सेवा का यूआरएल खोलें. "सिऐटल में अभी मौसम कैसा है?" सवाल पूछें. Gemini को जवाब देना चाहिए कि "अभी 40 डिग्री सेल्सियस है और बारिश हो रही है." अगर आपने पूछा कि "बोस्टन का मौसम कैसा है?", Gemini जवाब देगा, "इस अनुरोध को पूरा नहीं किया जा सकता. मौसम की जानकारी देने वाले उपलब्ध एपीआई में, बॉस्टन का डेटा नहीं है."

9. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप Cloud Run, Vertex AI Gemini API, और फ़ंक्शन कॉलिंग से जुड़े दस्तावेज़ पढ़ें.

हमने क्या-क्या बताया

  • Gemini में फ़ंक्शन कॉलिंग की सुविधा कैसे काम करती है
  • Gemini की मदद से काम करने वाले चैटबॉट ऐप्लिकेशन को Cloud Run सेवा के तौर पर डिप्लॉय करने का तरीका

10. व्यवस्थित करें

अनजाने में लगने वाले शुल्क से बचने के लिए, Cloud Run सेवा को मिटा दें. उदाहरण के लिए, अगर इस Cloud Run सेवा को मुफ़्त टियर में Cloud Run सेवा के लिए हर महीने तय की गई सीमा से ज़्यादा बार इस्तेमाल किया गया है, तो अनजाने में शुल्क लग सकता है. इसके अलावा, चरण 2 में बनाए गए प्रोजेक्ट को भी मिटाया जा सकता है.

Cloud Run सेवाओं को मिटाने के लिए, Cloud Run Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/functions/ पर जाएं. इसके बाद, इस कोडलैब में बनाई गई $WEATHER_SERVICE और $FRONTEND सेवाओं को मिटाएं.

Gemini को गलती से कॉल करने से बचने के लिए, vertex-ai-caller सेवा खाता मिटाया जा सकता है या Vertex AI User की भूमिका को रद्द किया जा सकता है.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.