Streamlit, Gemini Pro, Vertex AI এবং BigQuery এর সাথে একটি AI-চালিত এজেন্ট ডায়েট প্ল্যানার তৈরি করুন এবং স্থাপন করুন

১. ভূমিকা

9370c0f92c692ebb.png

এই কোডল্যাবে আপনি শিখবেন কীভাবে একটি এআই-চালিত এজেন্ট ডায়েট প্ল্যানার তৈরি এবং ডেপ্লয় করতে হয়। এর ইউআই (UI) এর জন্য স্ট্রিমলিট (Streamlit), এলএলএম (LLM) মডেলের জন্য জেমিনি প্রো ২.৫ (Gemini Pro 2.5), এজেন্টিক এআই (Agentic AI) ডেভেলপমেন্টের জন্য ভার্টেক্স এআই (Vertex AI) ব্যবহার করে এজেন্টিক এআই ইঞ্জিন অর্কেস্ট্রেটর, ডেটা সংরক্ষণের জন্য বিগকোয়েরি (BigQuery) এবং ডেপ্লয়মেন্টের জন্য ক্লাউড রান (Cloud Run) ব্যবহৃত হয়েছে।

কোডল্যাবের মাধ্যমে, আপনি নিম্নলিখিত ধাপে ধাপে পদ্ধতিটি অনুসরণ করবেন:

  1. আপনার গুগল ক্লাউড প্রজেক্টটি প্রস্তুত করুন এবং এতে প্রয়োজনীয় সকল এপিআই (API) সক্রিয় করুন।
  2. স্ট্রিমলিট, ভার্টেক্স এআই এবং বিগকোয়েরি ব্যবহার করে এজেন্টিক এআই ডায়েট প্ল্যানার তৈরি করুন
  3. অ্যাপ্লিকেশনটি ক্লাউড রানে স্থাপন করুন

স্থাপত্যের সংক্ষিপ্ত বিবরণ

84e3f3620dc4ed68.png

পূর্বশর্ত

  • বিলিং সক্ষম একটি গুগল ক্লাউড প্ল্যাটফর্ম (GCP) প্রজেক্ট।
  • পাইথন সম্পর্কে প্রাথমিক জ্ঞান

আপনি যা শিখবেন

  • স্ট্রিমলিট ও ভার্টেক্স এআই ব্যবহার করে কীভাবে এজেন্টিক এআই ডায়েট প্ল্যানার তৈরি করবেন এবং বিগকোয়েরিতে ডেটা সংরক্ষণ করবেন
  • ক্লাউড রানে অ্যাপ্লিকেশনটি কীভাবে স্থাপন করবেন

আপনার যা যা লাগবে

  • ক্রোম ওয়েব ব্রাউজার
  • একটি জিমেইল অ্যাকাউন্ট
  • বিলিং সক্ষম একটি ক্লাউড প্রজেক্ট

২. প্রাথমিক সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

fbef9caa1602edd0.png

37d264871000675d.png

5e3ff691252acf41.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নাম্বার এবং কিছু এপিআই এটি ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

৩. শুরু করার আগে

ক্লাউড শেল এডিটরে ক্লাউড প্রজেক্ট সেটআপ করুন

এই কোডল্যাবটি ধরে নেয় যে আপনার ইতিমধ্যেই বিলিং চালু করা একটি গুগল ক্লাউড প্রজেক্ট আছে। যদি আপনার এটি এখনও না থাকে, তবে শুরু করার জন্য আপনি নীচের নির্দেশাবলী অনুসরণ করতে পারেন।

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ এবং এটি bq-এর সাথে আগে থেকেই লোড করা থাকে। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

26f20e837ff06119.png

  1. ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করে নিন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে অবগত আছে কিনা, তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>

বিকল্পভাবে, আপনি কনসোলে PROJECT_ID আইডিটিও দেখতে পারেন।

bb98435b79995b15.jpeg

এটিতে ক্লিক করলে আপনি ডানদিকে আপনার সম্পূর্ণ প্রজেক্ট এবং প্রজেক্ট আইডি দেখতে পাবেন।

ffa73dee57de5307.jpeg

  1. নিচে দেখানো কমান্ডের মাধ্যমে প্রয়োজনীয় API-গুলো সক্রিয় করুন। এতে কয়েক মিনিট সময় লাগতে পারে, তাই অনুগ্রহ করে ধৈর্য ধরুন।
gcloud services enable aiplatform.googleapis.com \
                           run.googleapis.com \
                           cloudbuild.googleapis.com \
                           cloudresourcemanager.googleapis.com \
                    bigquery.googleapis.com

কমান্ডটি সফলভাবে কার্যকর হলে, আপনি নিচে দেখানো বার্তার মতো একটি বার্তা দেখতে পাবেন:

Operation "operations/..." finished successfully.

gcloud কমান্ডের বিকল্প হলো কনসোলের মাধ্যমে প্রতিটি পণ্য অনুসন্ধান করা অথবা এই লিঙ্কটি ব্যবহার করা।

যদি কোনো API বাদ পড়ে যায়, তবে আপনি বাস্তবায়ন চলাকালীন সময়েই তা সক্রিয় করে নিতে পারেন।

gcloud কমান্ড ও তার ব্যবহারবিধি জানতে ডকুমেন্টেশন দেখুন।

অ্যাপ্লিকেশন ওয়ার্কিং ডিরেক্টরি সেটআপ করুন

  1. ওপেন এডিটর বাটনে ক্লিক করুন, এটি একটি ক্লাউড শেল এডিটর খুলবে, আমরা এখানে আমাদের কোড লিখতে পারি। 6f8e18e89d3198c0.png
  2. নিশ্চিত করুন যে ক্লাউড শেল এডিটরের নিচের বাম কোণে (স্ট্যাটাস বারে) ক্লাউড কোড প্রজেক্টটি সেট করা আছে, যেমনটি নিচের ছবিতে হাইলাইট করা হয়েছে, এবং এটি সেই সক্রিয় গুগল ক্লাউড প্রজেক্টে সেট করা আছে যেখানে আপনার বিলিং চালু করা আছে। অনুরোধ করা হলে অনুমোদন করুন । ক্লাউড শেল এডিটর চালু হওয়ার পর ক্লাউড কোড - সাইন ইন বাটনটি প্রদর্শিত হতে কিছুটা সময় লাগতে পারে, অনুগ্রহ করে ধৈর্য ধরুন।

4e372d87c51afa30.png

এরপরে, আমরা আমাদের পাইথন পরিবেশ প্রস্তুত করব।

পরিবেশ সেটআপ

পাইথন ভার্চুয়াল পরিবেশ প্রস্তুত করুন

পরবর্তী ধাপ হলো ডেভেলপমেন্ট এনভায়রনমেন্ট প্রস্তুত করা। এই কোডল্যাবে আমরা পাইথন ৩.১২ ব্যবহার করব এবং পাইথন ভার্সন ও ভার্চুয়াল এনভায়রনমেন্ট তৈরি ও পরিচালনার কাজ সহজ করার জন্য পাইথন ভার্চুয়ালএনভ (python virtualenv) ব্যবহার করব।

  1. আপনি যদি এখনও টার্মিনালটি না খুলে থাকেন, তাহলে Terminal -> New Terminal- এ ক্লিক করে অথবা Ctrl + Shift + C চেপে এটি খুলুন।

8635b60ae2f45bbc.jpeg

  1. নিম্নলিখিত কমান্ডটি চালিয়ে একটি নতুন ফোল্ডার তৈরি করুন এবং এর অবস্থান পরিবর্তন করুন।
mkdir agent_diet_planner
cd agent_diet_planner
  1. নিম্নলিখিত কমান্ডটি চালিয়ে নতুন ভার্চুয়ালএনভ তৈরি করুন।
python -m venv .env
  1. নিম্নলিখিত কমান্ডের সাহায্যে ভার্চুয়ালএনভি সক্রিয় করুন।
source .env/bin/activate
  1. requirements.txt তৈরি করুন। File → New Text File-এ ক্লিক করুন এবং নিচের বিষয়বস্তু দিয়ে পূরণ করুন। তারপর ফাইলটি requirements.txt নামে সেভ করুন।
streamlit==1.33.0
google-cloud-aiplatform
google-cloud-bigquery
pandas==2.2.2
db-dtypes==1.2.0
pyarrow==16.1.0
  1. এরপর requirements.txt থেকে সমস্ত ডিপেন্ডেন্সি ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান।
pip install -r requirements.txt
  1. পাইথনের সমস্ত লাইব্রেরির নির্ভরতা ইনস্টল করা হয়েছে কিনা তা পরীক্ষা করতে নিচের কমান্ডটি টাইপ করুন।
pip list

সেটআপ কনফিগারেশন ফাইল

এখন আমাদের এই প্রজেক্টের জন্য কনফিগারেশন ফাইল তৈরি করতে হবে। ভেরিয়েবল এবং সার্ভিস অ্যাকাউন্টের ক্রেডেনশিয়াল সংরক্ষণের জন্য কনফিগারেশন ফাইল ব্যবহার করা হয়।

  1. প্রথম ধাপ হলো একটি সার্ভিস অ্যাকাউন্ট তৈরি করা। সার্চে ‘service account’ টাইপ করুন, তারপর সার্ভিস অ্যাকাউন্টে ক্লিক করুন। 18c210d5d1e2a666.png
  2. + Create service account-এ ক্লিক করুন। সার্ভিস অ্যাকাউন্টের নাম ইনপুট করুন, তারপর create and continue-তে ক্লিক করুন। 67cad62d367e236a.png
  3. অনুমতির ক্ষেত্রে, 'সার্ভিস অ্যাকাউন্ট ইউজার' রোলটি বেছে নিন। '+ অ্যাড অ্যানাদার রোল'-এ ক্লিক করুন এবং 'বিগকোয়েরি অ্যাডমিন', 'ক্লাউড রান অ্যাডমিন', 'ক্লাউড রান ইনভোকার', 'ভার্টেক্স এআই সার্ভিস এজেন্ট' ও 'ভার্টেক্স এআই ইউজার'-এর মতো আইএএম রোলগুলো বেছে নিন, তারপর 'ডান'-এ ক্লিক করুন। be84afdc13678f6c.png
  4. সার্ভিস অ্যাকাউন্ট ইমেইলে ক্লিক করুন, ট্যাব কী চাপুন, অ্যাড কী-তে ক্লিক করুন → নতুন কী তৈরি করুন। 50989af3bb9e1538.png
  5. json নির্বাচন করে Create-এ ক্লিক করুন। পরবর্তী ধাপের জন্য এই সার্ভিস অ্যাকাউন্ট ফাইলটি আপনার লোকাল ফোল্ডারে সংরক্ষণ করুন। a4a119672da532da.png
  6. নিম্নলিখিত কনফিগারেশন সহ .streamlit নামে একটি ফোল্ডার তৈরি করুন। মাউসের ডান বোতামে ক্লিক করে 'New Folder'-এ ক্লিক করুন এবং ফোল্ডারের নাম .streamlit টাইপ করুন।
  7. .streamlit ফোল্ডারে রাইট ক্লিক করুন, তারপর New File-এ ক্লিক করে নিচের মানগুলো দিয়ে পূরণ করুন। এরপর ফাইলটি secrets.toml নামে সেভ করুন।
# secrets.toml (for Streamlit sharing)
# Store in .streamlit/secrets.toml

[gcp]
project_id = "your_gcp_project"
location = "us-central1"

[gcp_service_account]
type = "service_account"
project_id = "your-project-id"
private_key_id = "your-private-key-id"
private_key = '''-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----'''
client_email = "your-sa@project-id.iam.gserviceaccount.com"
client_id = "your-client-id"
auth_uri = "https://accounts.google.com/o/oauth2/auth"
token_uri = "https://oauth2.googleapis.com/token"
auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs"
client_x509_cert_url = "https://www.googleapis.com/robot/v1/metadata/x509/your-sa%40project-id.iam.gserviceaccount.com"
  1. পূর্ববর্তী ধাপে তৈরি করা আপনার সার্ভিস অ্যাকাউন্টের উপর ভিত্তি করে project_id , private_key_id , private_key , client_email , client_id , and auth_provider_x509_cert_url এর মান আপডেট করুন।

BigQuery ডেটাসেট প্রস্তুত করুন

পরবর্তী পদক্ষেপ হলো BigQuery-তে উৎপাদিত ফলাফল সংরক্ষণের জন্য একটি BigQuery ডেটাসেট তৈরি করা।

  1. সার্চে BigQuery টাইপ করুন, তারপর BigQuery-তে ক্লিক করুন।
  2. ক্লিক করুন 2f2e87396859bc74.png তারপর ডেটাসেট তৈরি করুন-এ ক্লিক করুন
  3. diet_planner_data ডেটাসেট আইডিটি ইনপুট করুন, তারপর Create dataset-এ ক্লিক করুন। 2055cda1ee0360bd.png

৪. একটি এজেন্ট ডায়েট প্ল্যানার অ্যাপ তৈরি করুন

আমরা ৪টি ইনপুট সহ একটি সাধারণ ওয়েব ইন্টারফেস তৈরি করব যা দেখতে এইরকম হবে।

43b20db2d5f94f38.png

আপনার প্রোফাইল অনুযায়ী ওজন, উচ্চতা, বয়স এবং লিঙ্গ পরিবর্তন করুন, তারপর জেনারেট-এ ক্লিক করুন। এটি ভার্টেক্স এআই লাইব্রেরিতে থাকা এলএলএম মডেল জেমিনি প্রো ২.৫-কে কল করবে এবং তৈরি হওয়া ফলাফল বিগকোয়েরিতে সংরক্ষণ করবে।

কোডটি যাতে খুব বেশি দীর্ঘ না হয়, সেজন্য এটিকে ৬টি অংশে বিভক্ত করা হবে।

বিএমআই স্ট্যাটাস গণনা করার জন্য ফাংশন তৈরি করুন

  1. agent_diet_planner ফোল্ডারে রাইট ক্লিক করুন → নতুন ফাইল .. → bmi_calc.py ফাইলের নাম দিয়ে এন্টার চাপুন।
  2. নিম্নলিখিত দিয়ে কোডটি পূরণ করুন
# Add this function to calculate BMI and health status
def calculate_bmi_status(weight, height):
   """
   Calculate BMI and return status message
   """
   height_m = height / 100  # Convert cm to meters
   bmi = weight / (height_m ** 2)
  
   if bmi < 18.5:
       status = "underweight"
       message = "⚠️ Your BMI suggests you're underweight. Consider increasing calorie intake with nutrient-dense foods."
   elif 18.5 <= bmi < 25:
       status = "normal"
       message = "✅ Your BMI is in the healthy range. Let's maintain this balance!"
   elif 25 <= bmi < 30:
       status = "overweight"
       message = "⚠️ Your BMI suggests you're overweight. Focus on gradual weight loss through balanced nutrition."
   else:
       status = "obese"
       message = "❗ Your BMI indicates obesity. Please consult a healthcare provider for personalized guidance."
  
   return {
       "value": round(bmi, 1),
       "status": status,
       "message": message
   }

এজেন্ট ডায়েট প্ল্যানার প্রধান অ্যাপ তৈরি করুন

  1. agent_diet_planner ফোল্ডারে রাইট ক্লিক করুন → নতুন ফাইল .. → app.py ফাইলনামটি ইনপুট করে এন্টার চাপুন।
  2. নিম্নলিখিত দিয়ে কোডটি পূরণ করুন
import os
from google.oauth2 import service_account
import streamlit as st
from google.cloud import bigquery
from vertexai.preview.generative_models import GenerativeModel
import vertexai
import datetime
import time
import pandas as pd
from bmi_calc import calculate_bmi_status

# Get configuration from environment
PROJECT_ID = os.environ.get("GCP_PROJECT_ID", "your_gcp_project_id")
LOCATION = os.environ.get("GCP_LOCATION", "us-central1")

#CONSTANTS Dataset and table in BigQuery
DATASET = "diet_planner_data"
TABLE = "user_plans"

# Initialize Vertex AI
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Initialize BigQuery client
try:
   # For Cloud Run, use default credentials
   bq_client = bigquery.Client()
except:
   # For local development, use service account from secrets
   if "gcp_service_account" in st.secrets:
       service_account_info = dict(st.secrets["gcp_service_account"])
       credentials = service_account.Credentials.from_service_account_info(service_account_info)
       bq_client = bigquery.Client(credentials=credentials, project=PROJECT_ID)
   else:
       st.error("BigQuery client initialization failed")
       st.stop()

your_gcp_project_id মানটি আপনার প্রজেক্ট আইডি দিয়ে পরিবর্তন করুন।

এজেন্ট ডায়েট প্ল্যানার প্রধান অ্যাপ তৈরি করুন - setup_bq_tables

এই অংশে, আমরা bq_client নামক একটি ইনপুট প্যারামিটারসহ setup_bq_table নামে একটি ফাংশন তৈরি করব। এই ফাংশনটি বিগকোয়েরি টেবিলে স্কিমা নির্ধারণ করবে এবং টেবিলটি বিদ্যমান না থাকলে তা তৈরি করবে।

app.py ফাইলে নিচের পূর্ববর্তী কোডটি দিয়ে কোডটি পূরণ করুন।

# Create BigQuery table if not exists
def setup_bq_table(bq_client):
   dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
   table_id = f"{dataset_id}.{TABLE}"
  
   schema = [
       bigquery.SchemaField("user_id", "STRING", mode="REQUIRED"),
       bigquery.SchemaField("timestamp", "TIMESTAMP", mode="REQUIRED"),
       bigquery.SchemaField("weight", "FLOAT", mode="REQUIRED"),
       bigquery.SchemaField("height", "INTEGER", mode="REQUIRED"),
       bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
       bigquery.SchemaField("gender", "STRING", mode="REQUIRED"),
       bigquery.SchemaField("diet_plan", "STRING", mode="REQUIRED")
   ]
  
   try:
       bq_client.get_table(table_id)
   except:
       table = bigquery.Table(table_id, schema=schema)
       bq_client.create_table(table)
       st.toast("BigQuery table created successfully")

এজেন্ট ডায়েট প্ল্যানার প্রধান অ্যাপ তৈরি করুন - ডায়েট_প্ল্যান তৈরি করুন

এই অংশে, আমরা ১টি ইনপুট প্যারামিটার সহ generate_diet_plan নামের একটি ফাংশন তৈরি করব। এই ফাংশনটি `define` প্রম্পট সহ `Gemini Pro 2.5` LLM মডেলটিকে কল করবে এবং ফলাফল তৈরি করবে।

app.py ফাইলে নিচের পূর্ববর্তী কোডটি দিয়ে কোডটি পূরণ করুন।

# Generate diet plan using Gemini Pro
def generate_diet_plan(params):
   try:
       model = GenerativeModel("gemini-2.5-pro")
       prompt = f"""
       Create a personalized 7-day diet plan for:
       - {params['gender']}, {params['age']} years old
       - Weight: {params['weight']} kg
       - Height: {params['height']} cm
      
       Include:
       1. Daily calorie target
       2. Macronutrient breakdown (carbs, protein, fat)
       3. Meal timing and frequency
       4. Food recommendations
       5. Hydration guidance
      
       Make the plan:
       - Nutritionally balanced
       - Practical for daily use
       - Culturally adaptable
       - With portion size guidance
       """
      
       response = model.generate_content(prompt)
       return response.text
   except Exception as e:
       st.error(f"AI generation error: {str(e)}")
       return None

এজেন্ট ডায়েট প্ল্যানার প্রধান অ্যাপ তৈরি করুন - save_to_bq

এই অংশে, আমরা save_to_bq নামে একটি ফাংশন তৈরি করব, যেখানে bq_client , user_id এবং plan এই তিনটি ইনপুট প্যারামিটার থাকবে। এই ফাংশনটি তার তৈরি করা ফলাফল BigQuery টেবিলে সংরক্ষণ করবে।

app.py ফাইলে নিচের পূর্ববর্তী কোডটি দিয়ে কোডটি পূরণ করুন।

# Save user data to BigQuery
def save_to_bq(bq_client, user_id, plan):
   try:
       dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
       table_id = f"{dataset_id}.{TABLE}"
      
       row = {
           "user_id": user_id,
           "timestamp": datetime.datetime.utcnow().isoformat(),
           "weight": st.session_state.user_data["weight"],
           "height": st.session_state.user_data["height"],
           "age": st.session_state.user_data["age"],
           "gender": st.session_state.user_data["gender"],
           "diet_plan": plan
       }
      
       errors = bq_client.insert_rows_json(table_id, [row])
       if errors:
           st.error(f"BigQuery error: {errors}")
       else:
           return True
   except Exception as e:
       st.error(f"Data saving error: {str(e)}")
       return False

এজেন্ট ডায়েট প্ল্যানার প্রধান অ্যাপ তৈরি করুন - প্রধান

এই অংশে, আমরা কোনো ইনপুট প্যারামিটার ছাড়া main নামে একটি ফাংশন তৈরি করব। এই ফাংশনটি মূলত স্ট্রিমলিট UI স্ক্রিপ্ট, তৈরি হওয়া ফলাফল প্রদর্শন, বিগকোয়েরি টেবিল থেকে পূর্ববর্তী তৈরি হওয়া ফলাফল দেখানো এবং ডেটা মার্কডাউন ফাইলে ডাউনলোড করার কাজ করে।

app.py ফাইলে নিচের পূর্ববর্তী কোডটি দিয়ে কোডটি পূরণ করুন।

# Streamlit UI
def main():
   st.set_page_config(page_title="AI Diet Planner", page_icon="🍏", layout="wide")
  
   # Initialize session state
   if "user_data" not in st.session_state:
       st.session_state.user_data = None
   if "diet_plan" not in st.session_state:
       st.session_state.diet_plan = None
  
   # Initialize clients
   #bq_client = init_clients()
   setup_bq_table(bq_client)
  
   st.title("🍏 AI-Powered Diet Planner")
   st.markdown("""
   <style>
   .stProgress > div > div > div > div {
       background-color: #4CAF50;
   }
   [data-testid="stForm"] {
       background: #f0f5ff;
       padding: 20px;
       border-radius: 10px;
       border: 1px solid #e6e9ef;
   }
   </style>
   """, unsafe_allow_html=True)
  
   # User input form
   with st.form("user_profile", clear_on_submit=False):
       st.subheader("Your Profile")
       col1, col2 = st.columns(2)
      
       with col1:
           weight = st.number_input("Weight (kg)", min_value=30.0, max_value=200.0, value=70.0)
           height = st.number_input("Height (cm)", min_value=100, max_value=250, value=170)
          
       with col2:
           age = st.number_input("Age", min_value=18, max_value=100, value=30)
           gender = st.selectbox("Gender", ["Man", "Woman"])
      
       submitted = st.form_submit_button("Generate Diet Plan")
      
       if submitted:
           user_data = {
               "weight": weight,
               "height": height,
               "age": age,
               "gender": gender
           }

           st.session_state.user_data = user_data
           # Calculate BMI
           bmi_result = calculate_bmi_status(weight, height)

           # Display BMI results in a visually distinct box
           with st.container():
               st.subheader("📊 Your Health Assessment")
               col1, col2 = st.columns([1, 3])
      
               with col1:
                   st.metric("BMI", bmi_result["value"])
          
               with col2:
                   if bmi_result["status"] != "normal":
                       st.warning(bmi_result["message"])
                   else:
                       st.success(bmi_result["message"])
      
           # Add BMI scale visualization
           st.markdown(f"""
           <div style="background:#f0f2f6;padding:10px;border-radius:10px;margin-top:10px">
           <small>BMI Scale:</small><br>
           <div style="display:flex;height:20px;background:linear-gradient(90deg,
           #4e79a7 0%,
           #4e79a7 18.5%,
           #60bd68 18.5%,
           #60bd68 25%,
           #f28e2b 25%,
           #f28e2b 30%,
           #e15759 30%,
           #e15759 100%);position:relative">
           <div style="position:absolute;left:{min(100, max(0, (bmi_result["value"]/40)*100))}%;top:-5px">

           </div>
           </div>
           <div style="display:flex;justify-content:space-between">
           <span>Underweight (<18.5)</span>
           <span>Healthy (18.5-25)</span>
           <span>Overweight (25-30)</span>
           <span>Obese (30+)</span>
           </div>
           </div>
           """, unsafe_allow_html=True)

           # Store BMI in session state
           st.session_state.bmi = bmi_result         
  
   # Plan generation and display
   if submitted and st.session_state.user_data:
       with st.spinner("🧠 Generating your personalized diet plan using Gemini AI..."):
           #diet_plan = generate_diet_plan(st.session_state.user_data)
           diet_plan = generate_diet_plan({**st.session_state.user_data,"bmi": bmi_result["value"],
                                           "bmi_status": bmi_result["status"]
           })

           if diet_plan:
               st.session_state.diet_plan = diet_plan
              
               # Generate unique user ID
               user_id = f"user_{int(time.time())}"
              
               # Save to BigQuery
               if save_to_bq(bq_client, user_id, diet_plan):
                   st.toast("✅ Plan saved to database!")
  
   # Display generated plan
   if st.session_state.diet_plan:
       st.subheader("Your Personalized Diet Plan")
       st.markdown("---")
       st.markdown(st.session_state.diet_plan)
      
       # Download button
       st.download_button(
           label="Download Plan",
           data=st.session_state.diet_plan,
           file_name="my_diet_plan.md",
           mime="text/markdown"
       )
      
       # Show history
       st.subheader("Your Plan History")
       try:
           query = f"""
               SELECT timestamp, weight, height, age, gender
               FROM `{st.secrets['gcp']['project_id']}.{DATASET}.{TABLE}`
               WHERE user_id LIKE 'user_%'
               ORDER BY timestamp DESC
               LIMIT 5
           """
           history = bq_client.query(query).to_dataframe()
           if not history.empty:
               history["timestamp"] = pd.to_datetime(history["timestamp"])
               st.dataframe(history.style.format({
                   "weight": "{:.1f} kg",
                   "height": "{:.0f} cm"
               }))
           else:
               st.info("No previous plans found")
       except Exception as e:
           st.error(f"History load error: {str(e)}")

if __name__ == "__main__":
   main()

কোডটি app.py নামে সংরক্ষণ করুন।

৫. ক্লাউড বিল্ড ব্যবহার করে ক্লাউড রান-এ অ্যাপগুলো ডেপ্লয় করুন।

এখন, অবশ্যই আমরা এই চমৎকার অ্যাপটি অন্যদের কাছে তুলে ধরতে চাই। তা করার জন্য, আমরা এই অ্যাপ্লিকেশনটিকে প্যাকেজ করে ক্লাউড রান-এ একটি পাবলিক সার্ভিস হিসেবে ডেপ্লয় করতে পারি, যা অন্যরা ব্যবহার করতে পারবে। সেটি করার জন্য, চলুন আর্কিটেকচারটি আবার পর্যালোচনা করা যাক।

84e3f3620dc4ed68.png

প্রথমে আমাদের একটি Dockerfile লাগবে। File->New Text File-এ ক্লিক করে নিচের কোডটি কপি-পেস্ট করুন এবং ফাইলটি Dockerfile হিসেবে সেভ করুন।

# Use official Python image
FROM python:3.12-slim

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PORT 8080

# Install system dependencies
RUN apt-get update && \
   apt-get install -y --no-install-recommends \
   build-essential \
   libpq-dev \
   && rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /app

# Copy requirements
COPY requirements.txt .

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy application files
COPY . .

# Expose port
EXPOSE $PORT

# Run the application
CMD ["streamlit", "run", "app.py", "--server.port", "8080", "--server.address", "0.0.0.0"]

এরপরে আমরা বিল্ড অ্যাপগুলোকে ডকার ইমেজে পরিণত করতে, আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করতে এবং ক্লাউড রান-এ ডিপ্লয় করার জন্য cloudbuild.yaml তৈরি করব।

File->New Text File-এ ক্লিক করুন এবং নিচের কোডটি কপি করে পেস্ট করুন, তারপর ফাইলটি cloudbuild.yaml নামে সেভ করুন।

steps:
 # Build Docker image
 - name: 'gcr.io/cloud-builders/docker'
   args: ['build', '-t', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID', '--no-cache',
        '--progress=plain',
        '.']
   id: 'Build'
   timeout: 1200s
   waitFor: ['-']
   dir: '.'
  # Push to Container Registry
 - name: 'gcr.io/cloud-builders/docker'
   args: ['push', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID']
   id: 'Push'
   waitFor: ['Build']
  # Deploy to Cloud Run
 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
   entrypoint: gcloud
   args:
     - 'run'
     - 'deploy'
     - 'diet-planner-service'
     - '--image=gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'
     - '--port=8080'
     - '--region=us-central1'
     - '--platform=managed'
     - '--allow-unauthenticated'
     - '--set-env-vars=GCP_PROJECT_ID=$PROJECT_ID,GCP_LOCATION=us-central1'
     - '--cpu=1'
     - '--memory=1Gi'
     - '--timeout=300'
   waitFor: ['Push']

options:
 logging: CLOUD_LOGGING_ONLY
 machineType: 'E2_HIGHCPU_8'
 diskSizeGb: 100

images:
 - 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'

এই পর্যায়ে, অ্যাপগুলোকে ডকার ইমেজে পরিণত করতে, আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করতে এবং ক্লাউড রান-এ ডেপ্লয় করার জন্য প্রয়োজনীয় সমস্ত ফাইল আমাদের কাছে ইতিমধ্যেই আছে, চলুন এটি ডেপ্লয় করা যাক। ক্লাউড শেল টার্মিনালে যান এবং নিশ্চিত করুন যে বর্তমান প্রজেক্টটি আপনার সক্রিয় প্রজেক্ট হিসাবে কনফিগার করা আছে, যদি না থাকে তবে প্রজেক্ট আইডি সেট করার জন্য আপনাকে gcloud configure কমান্ডটি ব্যবহার করতে হবে:

gcloud config set project [PROJECT_ID]

তারপর, অ্যাপগুলোকে ডকার ইমেজে পরিণত করতে, আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করতে এবং ক্লাউড রান-এ ডেপ্লয় করতে নিম্নলিখিত কমান্ডটি চালান।

gcloud builds submit --config cloudbuild.yaml

এটি আমাদের পূর্বে প্রদত্ত ডকারফাইলের উপর ভিত্তি করে ডকার কন্টেইনারটি তৈরি করবে এবং আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করবে। এরপর আমরা নির্মিত ইমেজটি ক্লাউড রান-এ ডেপ্লয় করব। এই সম্পূর্ণ প্রক্রিয়াটি cloudbuild.yaml ধাপগুলোতে সংজ্ঞায়িত করা আছে।

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

ডেপ্লয়মেন্ট সম্পূর্ণ হয়ে গেলে, আমরা ক্লাউড রান পেজে তা দেখতে পারি। এর জন্য, উপরের ক্লাউড কনসোল সার্চ বারে ক্লাউড রান লিখে সার্চ করুন এবং ক্লাউড রান প্রোডাক্টটিতে ক্লিক করুন।

3c460765656fc072.png

এরপরে আপনি ক্লাউড রান সার্ভিস পেজে তালিকাভুক্ত ডেপ্লয় করা সার্ভিসটি পরিদর্শন করতে পারেন, সার্ভিসটির URL পাওয়ার জন্য সেটির উপর ক্লিক করুন।

93dc975d3caeab0e.png

সার্ভিসের ইউআরএলটি টপ বারে থাকবে।

9325464321c106f8.png ইনকগনিটো উইন্ডো বা আপনার মোবাইল ডিভাইস থেকে অ্যাপ্লিকেশনটি ব্যবহার করুন। এটি ইতিমধ্যে চালু হয়ে যাওয়ার কথা।

৬. পরিষ্কার করুন

এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলি অনুসরণ করুন:

  1. গুগল ক্লাউড কনসোলে, 'ম্যানেজ রিসোর্সেস' পৃষ্ঠায় যান।
  2. প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
  3. ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।
  4. বিকল্পভাবে, আপনি কনসোলে Cloud Run- এ গিয়ে, এইমাত্র ডেপ্লয় করা সার্ভিসটি নির্বাচন করে ডিলিট করে দিতে পারেন।