Gemini Code Assist की मदद से, अपने डेवलपमेंट वर्कफ़्लो को बेहतर बनाएं

1. परिचय

e5b98fd4e417c877.png

इस कोडलैब में, आपको यह जानकारी मिलेगी कि Gemini Code Assist, सॉफ़्टवेयर डेवलपमेंट लाइफ़ साइकल (एसडीएलसी) के मुख्य चरणों में आपकी कैसे मदद कर सकता है. जैसे, डिज़ाइन, बिल्ड और टेस्ट करना, और डिप्लॉय करना. हम एक पूरा ऐप्लिकेशन डिज़ाइन और डेवलप करेंगे. इसके बाद, उसे Google Cloud पर डिप्लॉय करेंगे.

हम एक एपीआई और ऐप्लिकेशन बनाएंगे. इसकी मदद से, किसी तकनीकी इवेंट के सभी सेशन में खोज की जा सकेगी. हर सेशन में टाइटल, खास जानकारी, अवधि, कैटगरी, और एक या उससे ज़्यादा स्पीकर होंगे.

आपको क्या करना होगा

  • OpenAPI स्पेसिफ़िकेशन के आधार पर, वेब ऐप्लिकेशन को शुरू से डिज़ाइन करें, बनाएं, टेस्ट करें, और डिप्लॉय करें

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

  • OpenAPI स्पेसिफ़िकेशन जनरेट करने के लिए, Gemini Code Assist का इस्तेमाल कैसे करें
  • OpenAPI स्पेसिफ़िकेशन के लिए Python Flask ऐप्लिकेशन डेवलप करने के लिए, Gemini Code Assist की कोड जनरेट करने की सुविधाओं का इस्तेमाल कैसे करें
  • Python Flask ऐप्लिकेशन के लिए वेब फ़्रंट-एंड जनरेट करने के लिए, Gemini Code Assist का इस्तेमाल कैसे करें
  • Google Cloud Run पर ऐप्लिकेशन डिप्लॉय करने के तरीके के बारे में मदद पाने के लिए, Gemini Code Assist का इस्तेमाल कैसे करें
  • ऐप्लिकेशन बनाते और उसकी टेस्टिंग करते समय, Gemini Code Assist की सुविधाओं का इस्तेमाल करें. जैसे, कोड के बारे में जानकारी पाना और टेस्ट केस जनरेट करना

आपको इन चीज़ों की ज़रूरत होगी

  • Chrome वेब ब्राउज़र
  • Gmail खाता
  • ऐसा Cloud प्रोजेक्ट जिसमें बिलिंग की सुविधा चालू हो
  • आपके Cloud प्रोजेक्ट के लिए Gemini Code Assist की सुविधा चालू हो

यह लैब, सभी लेवल के डेवलपर के लिए है. इसमें शुरुआती डेवलपर भी शामिल हैं. हालांकि, सैंपल ऐप्लिकेशन Python भाषा में है, लेकिन इसमें क्या हो रहा है, यह समझने के लिए आपको Python प्रोग्रामिंग के बारे में जानकारी होना ज़रूरी नहीं है. हमारा फ़ोकस, Gemini Code Assist की क्षमताओं के बारे में जानने पर होगा.

2. Gemini Code Assist को सेटअप करना

इस सेक्शन में, इस लैब को शुरू करने के लिए ज़रूरी सभी चरणों के बारे में बताया गया है.

Cloud Shell IDE में Gemini Code Assist को चालू करना

इस कोडलैब के बाकी चरणों के लिए, हम Cloud Shell IDE का इस्तेमाल करेंगे. यह पूरी तरह से मैनेज किया गया, Code OSS पर आधारित डेवलपमेंट एनवायरमेंट है. हमें Cloud Shell IDE में Code Assist को चालू और कॉन्फ़िगर करना होगा. इसके लिए, यहां दिया गया तरीका अपनाएं:

  1. ide.cloud.google.com पर जाएं. आईडीई दिखने में कुछ समय लग सकता है. इसलिए, कृपया इंतज़ार करें और सेटअप के लिए डिफ़ॉल्ट विकल्पों को स्वीकार करें. अगर आपको आईडीई सेट अप करने के बारे में कुछ निर्देश दिखते हैं, तो कृपया डिफ़ॉल्ट सेटिंग के साथ उन्हें पूरा करें.
  2. नीचे दिए गए स्टेटस बार में, Cloud Code - Sign in बटन पर क्लिक करें. निर्देशों के मुताबिक, प्लगिन को अनुमति दें. अगर आपको स्टेटस बार में "Cloud Code - no project" दिखता है, तो उसे चुनें. इसके बाद, प्रोजेक्ट की सूची में से वह Google Cloud प्रोजेक्ट चुनें जिस पर आपको काम करना है.

6f5ce865fc7a3ef5.png

  1. नीचे दी गई इमेज में दिखाए गए तरीके से, सबसे नीचे दाएं कोने में मौजूद कोड असिस्ट बटन पर क्लिक करें. इसके बाद, सही Google Cloud प्रोजेक्ट को एक बार फिर से चुनें. अगर आपसे Cloud AI Companion API को चालू करने के लिए कहा जाता है, तो कृपया इसे चालू करें और आगे बढ़ें.
  2. Google Cloud प्रोजेक्ट चुनने के बाद, पक्का करें कि आपको स्टेटस बार में Cloud Code का स्टेटस मैसेज दिख रहा हो. साथ ही, यह भी पक्का करें कि आपने स्टेटस बार में दाईं ओर, कोड असिस्ट की सुविधा चालू की हो. यह सुविधा नीचे दिए गए तरीके से चालू की जा सकती है:

709e6c8248ac7d88.png

Gemini Code Assist का इस्तेमाल किया जा सकता है!

3. Firestore सेटअप करना

Cloud Firestore, पूरी तरह से मैनेज किया जाने वाला सर्वरलेस दस्तावेज़ डेटाबेस है. इसका इस्तेमाल हम अपने ऐप्लिकेशन के डेटा के बैकएंड के तौर पर करेंगे. Cloud Firestore में डेटा को दस्तावेज़ों के संग्रहों में व्यवस्थित किया जाता है.

हमें अपने डिफ़ॉल्ट Firestore डेटाबेस में, sessions नाम का एक कलेक्शन बनाना होगा. इस कलेक्शन में सैंपल डेटा (दस्तावेज़) मौजूद होगा. इसका इस्तेमाल हम अपने ऐप्लिकेशन में करेंगे.

नीचे दिए गए तरीके से, Cloud Shell IDE में जाकर मुख्य मेन्यू से टर्मिनल खोलें:

f1535e14c9beeec6.png

हमें sessions नाम का एक कलेक्शन बनाना है. इसमें सैंपल सेशन के दस्तावेज़ों की सूची होगी. हर दस्तावेज़ में ये एट्रिब्यूट होंगे:

  1. title: string
  2. categories: स्ट्रिंग का कलेक्शन
  3. speakers: स्ट्रिंग का कलेक्शन
  4. duration: string
  5. summary: string

आइए, इस कलेक्शन में सैंपल डेटा भरते हैं. इसके लिए, सैंपल डेटा वाली फ़ाइल को अपने प्रोजेक्ट के बकेट में कॉपी करें. इसके बाद, gcloud firestore import कमांड का इस्तेमाल करके, कलेक्शन को इंपोर्ट करें.

Firestore डेटाबेस शुरू करना

Cloud Console में Firestore पेज पर जाएं.

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

  • Firestore मोड: Native
  • जगह: जगह के टाइप के तौर पर Region चुनें. इसके बाद, वह इलाका चुनें जो आपके आवेदन के लिए सही हो. इस जगह की जानकारी नोट कर लें, क्योंकि आपको अगले चरण में बकेट की जगह की जानकारी के लिए इसकी ज़रूरत पड़ेगी.
  • डेटाबेस बनाएं.

504cabdb99a222a5.png

अब हम नीचे दिए गए तरीके का इस्तेमाल करके, sessions कलेक्शन बनाएंगे:

  1. नीचे दिए गए gsutil कमांड का इस्तेमाल करके, अपने प्रोजेक्ट में एक बकेट बनाएं. नीचे दिए गए कमांड में, <PROJECT_ID> वैरिएबल की जगह अपना Google Cloud प्रोजेक्ट आईडी डालें. <BUCKET_LOCATION> की जगह, अपने डिफ़ॉल्ट Firestore डेटाबेस के भौगोलिक इलाके का नाम डालें. यह नाम पिछले चरण में बताया गया है. यह US-WEST1, EUROPE-WEST1, ASIA-EAST1 हो सकता है :
gsutil mb -l <BUCKET-LOCATION> gs://<PROJECT_ID>-my-bucket
  1. बकेट बन जाने के बाद, हमें डेटाबेस के उस एक्सपोर्ट को इस बकेट में कॉपी करना होगा जिसे हमने तैयार किया है. ऐसा करने के बाद ही, हम इसे Firebase डेटाबेस में इंपोर्ट कर पाएंगे. नीचे दिए गए निर्देश का इस्तेमाल करें:
gsutil cp -r gs://sessions-master-database-bucket/2024-03-26T09:28:15_95256  gs://<PROJECT_ID>-my-bucket

अब हमारे पास इंपोर्ट करने के लिए डेटा है. इसलिए, हम बनाए गए Firebase डेटाबेस (default) में डेटा इंपोर्ट करने के आखिरी चरण पर जा सकते हैं.

  1. नीचे दिए गए gcloud कमांड का इस्तेमाल करें:
gcloud firestore import gs://<PROJECT_ID>-my-bucket/2024-03-26T09:28:15_95256

इंपोर्ट होने में कुछ सेकंड लगेंगे. इंपोर्ट होने के बाद, https://console.cloud.google.com/firestore/databases पर जाकर, अपने Firestore डेटाबेस और कलेक्शन की पुष्टि की जा सकती है. इसके लिए, नीचे दिए गए तरीके से default डेटाबेस और sessions कलेक्शन चुनें:

d3e294d46ba29cd5.png

इससे, Firestore कलेक्शन बनाने की प्रोसेस पूरी हो जाती है. इसका इस्तेमाल हम अपने ऐप्लिकेशन में करेंगे.

4. ऐप्लिकेशन टेंप्लेट बनाना

हम एक सैंपल ऐप्लिकेशन (Python Flask ऐप्लिकेशन) बनाएंगे. इसका इस्तेमाल हम पूरे कोडलैब में करेंगे. यह ऐप्लिकेशन, किसी तकनीकी कॉन्फ़्रेंस में ऑफ़र किए गए सभी सेशन में खोज करेगा.

यह तरीका अपनाएं:

  1. नीचे मौजूद स्टेटस बार में, Google Cloud प्रोजेक्ट के नाम पर क्लिक करें.

f151759c156c124e.png

  1. आपको विकल्पों की एक सूची दिखेगी. यहां दी गई सूची में से, नया आवेदन पर क्लिक करें.

91ea9836f38b7f74.png

  1. Cloud Run ऐप्लिकेशन चुनें. यह हमारे ऐप्लिकेशन के लिए रनटाइम होगा.
  2. Python (Flask): Cloud Run ऐप्लिकेशन टेंप्लेट चुनें.
  3. ऐप्लिकेशन को कोई नाम दें और उसे अपनी पसंद की जगह पर सेव करें.
  4. एक सूचना से पुष्टि होती है कि आपका आवेदन बना दिया गया है. साथ ही, एक नई विंडो खुलती है, जिसमें आपका आवेदन लोड होता है. यह नीचे दिखाया गया है. README.md फ़ाइल खुल जाती है. फ़िलहाल, उस व्यू को बंद किया जा सकता है.

aaa3725b17ce27cf.png

5. Gemini Code Assist के साथ इंटरैक्ट करना

इस लैब के लिए, हम Cloud Shell आईडीई में उपलब्ध Gemini Code Assist Chat का इस्तेमाल करेंगे. यह VS Code में Cloud Code एक्सटेंशन का हिस्सा है. इसे ऐक्सेस करने के लिए, बाईं ओर मौजूद नेविगेशन बार में, कोड असिस्ट बटन पर क्लिक करें. बाईं ओर मौजूद नेविगेशन टूलबार में, कोड असिस्ट आइकॉन a489f98a34898727.png ढूंढें और उस पर क्लिक करें.

इससे Cloud Shell IDE में Code Assist का चैट पैनल खुल जाएगा. इसके बाद, Code Assist से चैट की जा सकती है.

14ad103efaa0ddaa.png

सबसे ऊपर मौजूद ट्रैश कैन आइकॉन पर ध्यान दें. इसकी मदद से, Code Assist की चैट हिस्ट्री के कॉन्टेक्स्ट को रीसेट किया जा सकता है. यह भी ध्यान दें कि यह चैट इंटरैक्शन, उन फ़ाइलों के हिसाब से होता है जिन पर आईडीई में काम किया जा रहा है.

6. एपीआई डिज़ाइन

हमारा पहला चरण, डिज़ाइन फ़ेज़ के दौरान Gemini Code Assist की मदद लेना होगा. इस चरण में, हम उन इकाइयों (किसी इवेंट में होने वाले टेक्निकल सेशन) के लिए OpenAPI स्पेसिफ़िकेशन जनरेट करेंगे जिन्हें हमें खोजना है.

यह प्रॉम्प्ट दें:

Generate an Open API spec that will allow me to retrieve all sessions, sessions by category, session by id. Each session has the following attributes: id, title, list of speakers, list of categories, summary and duration.

इससे अलग-अलग क्वेरी पैरामीटर के ज़रिए, सभी सेशन में खोजने के लिए OpenAPI स्पेसिफ़िकेशन जनरेट होना चाहिए. खास जानकारी का सैंपल यहां दिया गया है:

openapi: 3.0.0
info:
 title: Sessions API
 description: This API allows you to retrieve all sessions, sessions by category, and session by id.
 version: 1.0.0
servers:
 - url: https://sessions.example.com
paths:
 /sessions:
   get:
     summary: Get all sessions
     operationId: getSessions
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               type: array
               items:
                 $ref: '#/components/schemas/Session'
 /sessions/{id}:
   get:
     summary: Get session by id
     operationId: getSessionById
     parameters:
       - name: id
         in: path
         required: true
         description: The id of the session
         schema:
           type: string
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               $ref: '#/components/schemas/Session'
 /sessions/categories/{category}:
   get:
     summary: Get sessions by category
     operationId: getSessionsByCategory
     parameters:
       - name: category
         in: path
         required: true
         description: The category of the sessions
         schema:
           type: string
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               type: array
               items:
                 $ref: '#/components/schemas/Session'
components:
 schemas:
   Session:
     type: object
     properties:
       id:
         type: string
         description: The id of the session
       title:
         type: string
         description: The title of the session
       speakers:
         type: array
         items:
           type: string
         description: The list of speakers for the session
       categories:
         type: array
         items:
           type: string
         description: The list of categories for the session
       summary:
         type: string
         description: The summary of the session
       duration:
         type: string
         description: The duration of the session

आपको दिख सकता है कि खास जानकारी में यह शामिल है:

  • सेशन टाइप के लिए तय किया गया स्कीमा.
  • कई एपीआई पाथ तय किए गए हैं:
  • /sessions
  • /sessions/{id}
  • /sessions/categories/{category}

सबसे ऊपर मौजूद फ़ोल्डर में sessionsapi.yaml नाम की फ़ाइल बनाएं. इसके बाद, "मौजूदा फ़ाइल में डालें" विकल्प (+ बटन) का इस्तेमाल करके, Code Assist की चैट विंडो से कॉन्टेंट कॉपी करें. साथ ही, Cloud Shell IDE में फ़ाइल को खुला रखें.

इस समय, Gemini Code Assist की एक दिलचस्प सुविधा के बारे में जानें: उद्धरण. यह जानकारी डेवलपर को तब दिखती है, जब जनरेट किया गया कोड किसी दूसरे सोर्स से सीधे तौर पर लंबा कोटेशन लेता है. जैसे, मौजूदा ओपन सोर्स कोड. यह डेवलपर को सोर्स कोड और लाइसेंस उपलब्ध कराता है, ताकि वह यह तय कर सके कि उसे इसका इस्तेमाल कैसे करना है.

मान लें कि हमें जनरेट किया गया कॉन्टेंट पसंद आया है. अब हम इस स्पेसिफ़िकेशन दस्तावेज़ का इस्तेमाल करके, इसके लिए Python Flask ऐप्लिकेशन जनरेट कर सकते हैं.

7. ऐप्लिकेशन जनरेट करना

अब हम Code Assist से ऐप्लिकेशन जनरेट करने के लिए कहेंगे. sessionsapi.yaml फ़ाइल खोलकर, यह प्रॉम्प्ट दें.

Generate a Python Application using the Flask framework, based on the sessionsapi.yaml file. This application uses a local in memory list of sessions. Do not use any Flask extensions.

इससे आपको Python Flask ऐप्लिकेशन का एक बुनियादी ढांचा मिलेगा. यह ऐप्लिकेशन, OpenAPI स्पेसिफ़िकेशन फ़ाइल में बताई गई सुविधाओं और पाथ पर आधारित होगा.

Python Flask ऐप्लिकेशन का दिया गया कोड, यहां दिए गए कोड जैसा होना चाहिए:

from flask import Flask, jsonify, request

app = Flask(__name__)

sessions = [
    {
        "id": "1",
        "title": "Session 1",
        "speakers": ["Speaker 1", "Speaker 2"],
        "categories": ["Category 1", "Category 2"],
        "summary": "This is a summary of session 1.",
        "duration": "1 hour",
    },
    {
        "id": "2",
        "title": "Session 2",
        "speakers": ["Speaker 3", "Speaker 4"],
        "categories": ["Category 3", "Category 4"],
        "summary": "This is a summary of session 2.",
        "duration": "1 hour 30 minutes",
    },
]

@app.route('/sessions', methods=['GET'])
def get_sessions():
    return jsonify(sessions)

@app.route('/sessions/<id>', methods=['GET'])
def get_session_by_id(id):
    session = next((session for session in sessions if session['id'] == id), None)
    if session is None:
        return jsonify({}), 404
    return jsonify(session)

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
    sessions_by_category = [session for session in sessions if category in session['categories']]
    return jsonify(sessions_by_category)

if __name__ == '__main__':
    app.run()

पिछले चरण के हिस्से के तौर पर जनरेट की गई, app.py फ़ाइल मौजूद है. इसके कॉन्टेंट को Code Assist से जनरेट किए गए कोड से बदलें और फ़ाइल सेव करें.

हमें app.run() लाइन में बदलाव करके, पोर्ट 8080 और होस्ट पता 0.0.0.0 का इस्तेमाल करना है. साथ ही, लोकल एक्ज़ीक्यूशन के दौरान इसे डीबग मोड में चलाना है. इसके लिए, यहां दिया गया तरीका अपनाएं. सबसे पहले, लाइन को हाइलाइट/चुनें:

app.run()

इसके बाद, Code Assist के चैट इंटरफ़ेस में, यह प्रॉम्प्ट टाइप करें: Explain this.

इसमें उस लाइन के बारे में पूरी जानकारी होनी चाहिए. इसका एक उदाहरण यहां दिया गया है:

58ec896a32a4fb68.png

अब इस प्रॉम्प्ट का इस्तेमाल करें:

update the code to run the application on port 8080, host address 0.0.0.0, and in debug mode

जनरेट किया गया सुझाया गया कोड इस तरह होना चाहिए: :

app.run(host='0.0.0.0', port=8080, debug=True)

इस स्निपेट से app.py फ़ाइल को अपडेट करना न भूलें.

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

अब हम ऐप्लिकेशन को स्थानीय तौर पर चलाकर, ऐप्लिकेशन की ज़रूरी शर्तों की पुष्टि करेंगे. ये शर्तें वही होंगी जिनके साथ हमने शुरुआत की थी.

पहला चरण, requirements.txt में मौजूद Python पैकेज की डिपेंडेंसी के साथ एक वर्चुअल Python एनवायरमेंट बनाना होगा. ये डिपेंडेंसी, वर्चुअल एनवायरमेंट में इंस्टॉल की जाएंगी. इसके लिए, Cloud Shell IDE में कमांड पैलेट (Ctrl+Shift+P) पर जाएं और Create Python environment टाइप करें. वर्चुअल एनवायरमेंट (venv), Python 3.x इंटरप्रेटर, और requirements.txt फ़ाइल चुनने के लिए, यहां दिया गया तरीका अपनाएं.

एनवायरमेंट बन जाने के बाद, नई टर्मिनल विंडो (Ctrl+Shift+`) लॉन्च करें और यह कमांड दें:

python app.py

यहां एक सैंपल दिखाया गया है:

(.venv) romin@cloudshell: $ python app.py 
 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://10.88.0.3:8080
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 132-247-368

अब इन यूआरएल पर एपीआई की झलक देखी जा सकती है. हम यह मान रहे हैं कि आपका डेवलपमेंट सर्वर, पोर्ट 8080 पर चल रहा है. अगर ऐसा नहीं है, तो कृपया इसे सही पोर्ट नंबर पर बदलें.

  • https://<host-name>:8080/sessions
  • https://<host-name>:8080/sessions/{id}
  • https://<host-name>:8080/sessions/categories/{category}

नीचे दिया गया तरीका अपनाकर, पक्का करें कि इन यूआरएल का इस्तेमाल करके, app.py फ़ाइल में मौजूद JSON डेटा को वापस पाया जा सकता है:

एक नई टर्मिनल विंडो खोलें और इनमें से कोई भी निर्देश आज़माएं:

curl -X GET http://127.0.0.1:8080/sessions
curl -X GET http://127.0.0.1:8080/sessions/<ID>
curl -X GET http://127.0.0.1:8080/sessions/categories/<CATEGORY_NAME> 

8. कोड रीफ़ैक्टरिंग

हम चाहते हैं कि app.py में हार्ड-कोड किया गया सैंपल JSON डेटा न हो. इसलिए, हम इसे किसी दूसरे मॉड्यूल में अलग/एक्सट्रैक्ट करना चाहेंगे, ताकि हम कोड और डेटा को अलग-अलग रख सकें. चलिए, ऐसा करते हैं!

app.py फ़ाइल को खुला रखें और यह प्रॉम्प्ट दें:

Can I improve this code and separate out the sessions data from this app.py file?

इससे आपको ऐसा करने के कुछ सुझाव मिलेंगे. हमें मिला सुझाव यहां दिया गया है. आपको भी कुछ ऐसा ही सुझाव मिलेगा:

9b9c56cb527dac4c.png

आइए, Code Assist के सुझाव के मुताबिक, अपने डेटा को sessions.py फ़ाइल में अलग-अलग करें.

sessions.py नाम की नई फ़ाइल बनाएं

, जिसमें JSON सूची का कॉन्टेंट होता है. हमारे जनरेट किए गए डेटा के मुताबिक, यह कॉन्टेंट यहां दिया गया है:

sessions = [
   {
       "id": "1",
       "title": "Session 1",
       "speakers": ["Speaker 1", "Speaker 2"],
       "categories": ["Category 1", "Category 2"],
       "summary": "This is a summary of session 1.",
       "duration": "1 hour",
   },
   {
       "id": "2",
       "title": "Session 2",
       "speakers": ["Speaker 3", "Speaker 4"],
       "categories": ["Category 3", "Category 4"],
       "summary": "This is a summary of session 2.",
       "duration": "1 hour 30 minutes",
   },
]

app.py फ़ाइल को अब काफ़ी आसान बना दिया गया है. इसे यहां दिखाया गया है:

from flask import Flask, jsonify, request
from sessions import sessions

app = Flask(__name__)

@app.route('/sessions', methods=['GET'])
def get_sessions():
   return jsonify(sessions.sessions)

@app.route('/sessions/<id>', methods=['GET'])
def get_session_by_id(id):
   session = next((session for session in sessions.sessions if session['id'] == id), None)
   if session is None:
       return jsonify({}), 404
   return jsonify(session)

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
   sessions_by_category = [session for session in sessions.sessions if category in session['categories']]
   return jsonify(sessions_by_category)

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=8080, debug=True)

पक्का करें कि अब भी ऐप्लिकेशन को स्थानीय तौर पर चलाया जा सकता हो और एपीआई का इस्तेमाल किया जा सकता हो. Python डेवलपमेंट सर्वर अब भी चल रहा होगा. इसलिए, आपको सिर्फ़ पिछले चरण की curl कमांड याद करनी होंगी.

9. Firestore कलेक्शन के साथ इंटिग्रेट करना

अगला चरण, हमारे सेशन के लिए मौजूद लोकल इन-मेमोरी JSON सूची से दूर जाना है. साथ ही, हमारे ऐप्लिकेशन को Firestore डेटाबेस में मौजूद sessions कलेक्शन से कनेक्ट करना है. इस कलेक्शन को हमने इस कोडलैब की शुरुआत में बनाया था.

sessions.py फ़ाइल को खुला रखें और यह प्रॉम्प्ट दें:

Can you further refactor the sessions.py code to read from a Firestore database that has a collection named sessions. The collection has the same attributes as the session object that we have defined. Use the Python module google-cloud-firestore. 

हमें Firestore कलेक्शन के सभी सेशन पढ़ने के लिए यह सुझाव मिला है:

import google.cloud.firestore

# Create a Firestore client
db = google.cloud.firestore.Client()

# Get the sessions collection
sessions_collection = db.collection("sessions")

# Create a list of sessions
sessions = []

# Iterate over the documents and add them to the list
for doc in sessions_collection.stream():
   session = doc.to_dict()
   session["id"] = doc.id
   sessions.append(session)

आगे बढ़ें और sessions.py में कोड शामिल करें.

अगर आपने Flask डेवलपमेंट सर्वर को स्थानीय तौर पर चालू किया है, तो हो सकता है कि आपका ऐप्लिकेशन बंद हो गया हो. ऐसा इसलिए हुआ होगा, क्योंकि उसे Python मॉड्यूल नहीं मिला.

कोड असिस्ट से पूछा जा सकता है कि requirements.txt फ़ाइल में कौनसा Python मॉड्यूल जोड़ना है. उदाहरण के लिए, इस तरह से पूछें:

Which Python package needs to be installed to make the firestore code work?

इससे आपको Python मॉड्यूल का नाम मिलेगा. जैसे, google-cloud-firestore. इसे requirements.txt फ़ाइल में जोड़ें.

आपको नए जोड़े गए मॉड्यूल (google-cloud-firestore) के साथ Python एनवायरमेंट को फिर से बनाना होगा. इसके लिए, मौजूदा टर्मिनल विंडो में यह कमांड डालें:

pip install -r requirements.txt

ऐप्लिकेशन को फिर से चलाएं (python app.py से इसे फिर से शुरू करें) और /sessions यूआरएल पर जाएं. अब आपको sessions कलेक्शन में जोड़े गए सैंपल दस्तावेज़ दिखेंगे.

975d05e6518f1a6a.png

पिछले चरणों में बताए गए तरीके से, किसी कैटगरी के लिए चुनिंदा सेशन या सभी सेशन वापस पाने के लिए, बेझिझक अन्य यूआरआई के बारे में क्वेरी करें.

10. कोड के बारे में जानकारी

अब कोड को बेहतर तरीके से समझने के लिए, Gemini Code Assist की "Explain this" सुविधा का इस्तेमाल करें. किसी भी फ़ाइल में जाएं या कोड के कुछ खास स्निपेट चुनें. इसके बाद, Code Assist से यह प्रॉम्प्ट पूछें: Explain this.

अभ्यास के तौर पर, sessions.py फ़ाइल पर जाएं. साथ ही, Firestore से जुड़े कोड को हाइलाइट करें और उसके बारे में जानकारी पाएं. इस सुविधा का इस्तेमाल, अपने प्रोजेक्ट की अन्य फ़ाइलों पर भी करें. सिर्फ़ Python कोड पर नहीं.

11. वेब ऐप्लिकेशन जनरेट करना

हमने एपीआई जनरेट कर लिया है और इसे लाइव Firestore कलेक्शन के साथ इंटिग्रेट कर दिया है. अब हम ऐप्लिकेशन के लिए, वेब पर आधारित फ़्रंट-एंड जनरेट करेंगे. फ़िलहाल, हमारा वेब फ़्रंट-एंड अपनी सुविधाओं को कम से कम रखेगा. इसका मतलब है कि यह किसी खास कैटगरी से जुड़े सेशन खोज पाएगा. ध्यान रखें कि इसके लिए हमारे पास एक एपीआई पाथ है, यानी कि /sessions/categories/{category}. इसलिए, हमारे वेब ऐप्लिकेशन को इसे चालू करना चाहिए और नतीजे वापस पाने चाहिए.

आइए, इस बारे में ज़्यादा जानें. Code Assist को यह प्रॉम्प्ट दें:

Generate a web application that allows me to search for sessions by category and uses the Flask application that we created. Please use basic HTML, CSS and JS. Embed all the Javascript and CSS code into a single HTML file only.

इससे, JavaScript और सीएसएस के साथ वेब ऐप्लिकेशन का एचटीएमएल जनरेट होगा. यह आपको app.py फ़ाइल में एक नया रूट जोड़ने के लिए भी कहेगा, ताकि रूट या बेस यूआरएल पर आने वाले किसी भी उपयोगकर्ता को होम पेज दिखाया जा सके. अगर उसमें यह जानकारी नहीं दी गई है, तो इसके बारे में पूछें या नीचे दिया गया स्निपेट इस्तेमाल करें:

@app.route('/')
def index():
   return render_template('index.html')

इसे index.html के तौर पर सेव किया जा सकता है. हालांकि, आपके मन में यह सवाल हो सकता है कि इस फ़ाइल को कहां सेव करना है (यानी कि किस फ़ोल्डर में?). हम कोड असिस्ट से अगला सवाल पूछ सकते हैं.

Given that I am using the flask framework, where should I put the index.html file?

इससे आपको यह साफ़ तौर पर पता चलना चाहिए कि यह render_template फ़्रेमवर्क का इस्तेमाल करता है. इसलिए, index.html फ़ाइल को templates फ़ोल्डर में रखना होगा. यह फ़ोल्डर आपको दिखेगा, क्योंकि हमने इस कोडलैब की शुरुआत में Flask टेंप्लेट के आधार पर एक ऐप्लिकेशन जनरेट किया था. इसलिए, यहां एक मौजूदा index.html फ़ाइल है. आपको बस इसके कॉन्टेंट को यहां जनरेट किए गए नए कॉन्टेंट से बदलना है. कोड असिस्ट, आपकी app.py फ़ाइल में render_template इंपोर्ट करने के बारे में भी बताता है.

वेब ऐप्लिकेशन के कोड को index.html फ़ाइल में सेव करें. साथ ही, उस फ़ाइल को templates फ़ोल्डर में रखना न भूलें.

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

अब हम ऐप्लिकेशन को स्थानीय तौर पर चलाकर, ऐप्लिकेशन की ज़रूरी शर्तों की पुष्टि करेंगे. ये शर्तें वही होंगी जिनके साथ हमने शुरुआत की थी.

पक्का करें कि लोकल फ़्लास्क सर्वर अब भी चल रहा हो और उसमें कोई गड़बड़ी न दिख रही हो. गड़बड़ियां होने पर, उन्हें ठीक करें और सर्वर शुरू करें.

जब ऐप्लिकेशन चालू हो जाए, तब उसके होम यूआरएल पर जाएं. इसमें आपको नीचे दिखाई गई index.html फ़ाइल दिखनी चाहिए:

8ca586acc4536879.png

डेटा से कोई एक कैटगरी इनपुट के तौर पर दें (जैसे, AI) और Search बटन पर क्लिक करें. इससे AI कैटगरी के साथ टैग किए गए सेशन दिखने चाहिए.

165faded790a6c.png

हर सेशन के लिए, अवधि, कैटगरी, स्पीकर, और खास जानकारी जैसे अतिरिक्त मेटाडेटा को दिखाना एक वैकल्पिक तरीका है.

12. टेस्ट केस जनरेट करना

हमने Sessions API जनरेट कर लिया है. अब अलग-अलग एपीआई पाथ के लिए यूनिट टेस्ट केस जनरेट करने के लिए, Gemini Code Assist का इस्तेमाल करें.

app.py फ़ाइल को खुला रखें और यह प्रॉम्प्ट दें:

Generate unit test cases for app routes. Use unittest module.

हमें यह जवाब मिला है:

import unittest
from app import app

class FlaskAppTestCase(unittest.TestCase):

    def test_index(self):
        tester = app.test_client()
        response = tester.get('/')
        self.assertEqual(response.status_code, 200)

    def test_get_sessions(self):
        tester = app.test_client()
        response = tester.get('/sessions')
        self.assertEqual(response.status_code, 200)

    def test_get_session_by_id(self):
        tester = app.test_client()
        response = tester.get('/sessions/1')
        self.assertEqual(response.status_code, 200)

    def test_get_sessions_by_category(self):
        tester = app.test_client()
        response = tester.get('/sessions/categories/category1')
        self.assertEqual(response.status_code, 200)

if __name__ == '__main__':
    unittest.main()

ऊपर दिए गए कोड का इस्तेमाल करके, tests.py नाम की फ़ाइल बनाएं.

टेस्ट केस जनरेट करने के बारे में जानकारी

आपको ऊपर दी गई कोड लिस्टिंग से अलग कोड लिस्टिंग दिख सकती है. इससे टेस्ट केस चलाने में कुछ समस्याएं आ सकती हैं. उदाहरण के लिए, हमें पता चला कि हमारे कुछ रन में, कोड के ये मुख्य हिस्से छूट गए थे:

from app import app

ऊपर दिया गया कोड, मौजूदा Flask ऐप्लिकेशन को इंपोर्ट करने के लिए ज़रूरी है. इसके ख़िलाफ़ हम टेस्ट केस लागू करेंगे.

if __name__ == '__main__':

`unittest.main()`

टेस्ट केस चलाने के लिए, ऊपर दिया गया कोड ज़रूरी है.

हमारा सुझाव है कि आप हर टेस्ट केस को देखें. साथ ही, जनरेट किए गए कोड में assertEqual और अन्य शर्तों की जांच करें, ताकि यह पक्का किया जा सके कि यह काम करेगा. Firestore कलेक्शन में मौजूद डेटा बाहरी होता है. इसलिए, हो सकता है कि आपके पास इसका ऐक्सेस न हो. साथ ही, हो सकता है कि यह कुछ डमी डेटा का इस्तेमाल करे. इस वजह से, टेस्ट फ़ेल हो सकते हैं. इसलिए, अपने टेस्ट केस में ज़रूरत के हिसाब से बदलाव करें या उन टेस्ट केस पर टिप्पणी करें जिनकी आपको तुरंत ज़रूरत नहीं है.

उदाहरण के तौर पर, हमने यहां दी गई कमांड का इस्तेमाल करके टेस्ट केस चलाए. लोकल डेवलपमेंट सर्वर को ज़रूर चलाएं, क्योंकि कॉल लोकल एपीआई एंडपॉइंट पर किए जाएंगे:

python tests.py

हमें खास जानकारी के तौर पर यह नतीजा मिला:

Ran 4 tests in 0.274s

FAILED (failures=2)

यह सही है, क्योंकि तीसरे टेस्ट में सेशन आईडी सही नहीं था. साथ ही, category1 नाम की कोई कैटगरी नहीं है

.

इसलिए, टेस्ट केस में ज़रूरी बदलाव करें और उसे आज़माएं.

13. टेस्ट ड्रिवन डेवलपमेंट

अब हम टेस्ट ड्रिवन डेवलपमेंट (टीडीडी) के तरीके का इस्तेमाल करके, Sessions API में खोज का नया तरीका जोड़ेंगे. टीडीडी का मतलब है कि पहले टेस्ट केस लिखना, उन्हें लागू न करने की वजह से फ़ेल करना, और Gemini Code Assist का इस्तेमाल करके छूटे हुए कोड को जनरेट करना, ताकि टेस्ट पास हो जाए.

tests.py फ़ाइल पर जाएं. मान लें कि आपने tests.py फ़ाइल को ठीक कर दिया है, ताकि सभी टेस्ट पास हो जाएं. कोड असिस्ट से यह प्रॉम्प्ट पूछें:

Generate a new test case to search for sessions by speaker

इससे हमें टेस्ट केस को लागू करने का यह तरीका मिला. हमने इसे tests.py फ़ाइल में डाल दिया है.

  def test_get_sessions_by_speaker(self):
        tester = app.test_client()
        response = tester.get('/sessions/speakers/speaker1')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json, [sessions.sessions[0], sessions.sessions[1]])

जांच करने पर, आपको यह गड़बड़ी दिखेगी:

$ python tests.py 
.F.
======================================================================
FAIL: test_get_sessions_by_speaker (__main__.FlaskAppTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/romin/hello-world-5/tests.py", line 21, in test_get_sessions_by_speaker
    self.assertEqual(response.status_code, 200)
AssertionError: 404 != 200

----------------------------------------------------------------------
Ran 3 tests in 0.010s

FAILED (failures=1)

ऐसा इसलिए है, क्योंकि टेस्ट केस ने इस पाथ (/sessions/speakers/) को शुरू किया है और app.py में इसे लागू नहीं किया गया है.

आइए, Code Assist से कोड लागू करने का तरीका जानें. app.py फ़ाइल पर जाएं और Code Assist को यह प्रॉम्प्ट दें:

Add a new route to search for sessions by a specific speaker

हमें कोड असिस्ट से, लागू करने का यह सुझाव मिला है. हमने इसे app.py फ़ाइल में जोड़ा है:

@app.route('/sessions/speakers/<speaker>', methods=['GET'])
def get_sessions_by_speaker(speaker):
    sessions_by_speaker = [session for session in sessions.sessions if speaker in session['speakers']]
    return jsonify(sessions_by_speaker)

tests.py फ़ाइल को फिर से देखें. हमने तुरंत जांच करने के लिए, अपने टेस्ट केस में यहां दिए गए बदलाव किए हैं:

   def test_get_sessions_by_speaker(self):
       tester = app.test_client()
       response = tester.get('/sessions/speakers/Romin Irani')
       self.assertEqual(response.status_code, 200)
       self.assertEqual(len(response.json), 1)

टेस्ट ठीक से चला. हम आपको यह टास्क देते हैं कि जनरेट किए गए टेस्ट केस देखें और Firestore में मौजूद डेटा के हिसाब से उनमें थोड़ा बदलाव करें. साथ ही, Python यूनिट टेस्ट केस में सही assert* तरीके इस्तेमाल करें.

14. Google Cloud Run पर डिप्लॉय करना

अब हमें लगता है कि हमने अच्छी क्वालिटी का डेवलपमेंट कर लिया है. इसलिए, हमारा आखिरी चरण इस ऐप्लिकेशन को Google Cloud Run पर डिप्लॉय करना होगा. हालांकि, हमें कोड असिस्ट से यह पूछना चाहिए कि कहीं हम कुछ भूल तो नहीं गए. app.py खोलें और यह प्रॉम्प्ट सबमिट करें :

Is there something here I should change before I deploy to production?

आपने यह सवाल पूछा, यह अच्छी बात है. दरअसल, हम डीबगिंग फ़्लैग को बंद करना भूल गए थे :

2f87ed3a811fb218.png

जैसा कि बताया गया है, डीबग करने की सुविधा बंद करें. इसके बाद, Gemini Code Assist से gcloud कमांड के बारे में पूछें. इस कमांड का इस्तेमाल करके, ऐप्लिकेशन को सीधे सोर्स से Cloud Run पर डिप्लॉय किया जा सकता है. इसके लिए, पहले कंटेनर बनाने की ज़रूरत नहीं होती.

यह प्रॉम्प्ट दें:

I would like to deploy the application to Cloud Run directly from source. What is the gcloud command to do that?

ऊपर दिए गए प्रॉम्प्ट के कुछ अलग-अलग वर्शन आज़माएं. हमने एक और तरीका आज़माया था:

I would like to deploy this application to Cloud Run. I don't want to build a container image locally but deploy directly from source to Cloud Run. What is the gcloud command for that?

आम तौर पर, आपको यह gcloud निर्देश मिलना चाहिए:

gcloud run deploy sessions --source .

आपको यह भी मिल सकता है:

gcloud run deploy <service-name> --source . \
—-platform managed \
—-allow-unauthenticated

ऊपर दिए गए कमांड को ऐप्लिकेशन के रूट फ़ोल्डर से चलाएं. जब region का अनुरोध किया जाए, तब us-central1 चुनें. इसके अलावा, जब unauthenticated invocations की अनुमति देने का अनुरोध किया जाए, तब Y चुनें. आपको Artifact Registry, Cloud Build, और Cloud Run जैसे Google Cloud API चालू करने के लिए भी कहा जा सकता है. साथ ही, Artifact Registry रिपॉज़िटरी बनाने की अनुमति देने के लिए भी कहा जा सकता है. कृपया अनुमति दें.

डेटा को लागू होने में करीब दो मिनट लगेंगे. इसलिए, कृपया इंतज़ार करें.

डिप्लॉय हो जाने के बाद, आपको Cloud Run सेवा का यूआरएल दिखेगा. उस सार्वजनिक यूआरएल पर जाएं. आपको दिखेगा कि वही वेब ऐप्लिकेशन डिप्लॉय किया गया है और वह सही तरीके से काम कर रहा है.

c5322d0fd3e0f616.png

बधाई हो, बहुत बढ़िया !

15. (ज़रूरी नहीं) Cloud Logging का इस्तेमाल करना

हम अपने ऐप्लिकेशन में लॉग इन करने की सुविधा जोड़ सकते हैं, ताकि ऐप्लिकेशन के लॉग को Google Cloud की किसी एक सेवा (Cloud Logging) में इकट्ठा किया जा सके. इसके बाद, हम Observability Gemini सुविधा का इस्तेमाल करके, लॉग एंट्री के बारे में भी जानकारी पा सकते हैं.

इसके लिए, हमें सबसे पहले Google Cloud की मौजूदा Python Cloud Logging लाइब्रेरी का इस्तेमाल करना होगा. साथ ही, इसका इस्तेमाल सूचना, चेतावनी या गड़बड़ी के मैसेज लॉग करने के लिए करना होगा. यह लॉग / गंभीरता के लेवल पर निर्भर करता है.

आइए, पहले Code Assist से यह सवाल पूछते हैं. यह प्रॉम्प्ट आज़माएँ:

How do I use the google-cloud-logging package in Python?

आपको ऐसा जवाब मिलेगा जिसमें इस बारे में कुछ जानकारी दी गई होगी. जैसे, यहां दिया गया है:

2472e1ccaf8a217d.png

आइए, उस फ़ंक्शन में लॉगिंग स्टेटमेंट जोड़ते हैं जो कैटगरी के हिसाब से सेशन खोजता है.

सबसे पहले, requirements.txt फ़ाइल में google-cloud-logging Python पैकेज जोड़ें.

इसके बाद, कोड का एक स्निपेट दिया गया है. इसमें दिखाया गया है कि हमने लॉगिंग को लागू करने के लिए कोड को कैसे इंटिग्रेट किया है:

...
from google.cloud import logging
...
app = Flask(__name__)

# Create a logger
logger = logging.Client().logger('my-log')

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
   logger.log_text(f"Fetching sessions with category {category}")
   sessions_by_category = [session for session in sessions.sessions if category in session['categories']]
   logger.log_text(f'Found {len(sessions_by_category)} sessions with category {category}')
   return jsonify(sessions_by_category)

# # Other App Routes

पिछले सेक्शन में दी गई कमांड का इस्तेमाल करके, सेवा को Cloud Run पर फिर से डिप्लॉय करें. डिप्लॉय हो जाने के बाद, /sessions/categories/<category> एंडपॉइंट पर कुछ कॉल करें.

Cloud Console → Logs Explorer पर जाएं

59e297577570695.png

...और आपको नीचे दिखाए गए तरीके से, इन लॉगिंग स्टेटमेंट को फ़िल्टर करने का विकल्प मिलना चाहिए:

914f1fb6cac30a89.png

किसी भी लॉग स्टेटमेंट पर क्लिक करके, उसे बड़ा किया जा सकता है. इसके बाद, Explain this log entry पर क्लिक करें. इससे Gemini, लॉग एंट्री के बारे में जानकारी देगा. ध्यान दें कि अगर आपने Google Cloud के लिए Gemini को चालू नहीं किया है, तो आपसे Cloud AI Companion API को चालू करने के लिए कहा जाएगा. कृपया निर्देशों के मुताबिक आगे बढ़ें.

जवाब का एक उदाहरण यहां दिया गया है:

7fc9783910fa92cc.png

16. बधाई हो

बधाई हो, आपने स्क्रैच से एक ऐप्लिकेशन बना लिया है. साथ ही, एसडीएलसी के कई पहलुओं में Gemini Code Assist का इस्तेमाल किया है. इनमें डिज़ाइन, बनाना, टेस्टिंग, और डिप्लॉयमेंट शामिल हैं.

आगे क्या करना है?

यहां दिए गए कुछ कोडलैब आज़माएं...

रेफ़रंस दस्तावेज़