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

1. ভূমিকা

9370c0f92c692ebb.png

এই কোডল্যাবে আপনি শিখবেন কীভাবে একটি এআই-চালিত এজেন্ট ডায়েট প্ল্যানার তৈরি এবং স্থাপন করতে হয়। স্ট্রিমলিট ব্যবহার করে UI, জেমিনি প্রো 2.5 ব্যবহার করে LLM মডেল, Agentic AI উন্নয়নের জন্য Vertex AI ব্যবহার করে Agentic AI, স্টোর ডেটার জন্য BigQuery এবং স্থাপনার জন্য Cloud Run ব্যবহার করে।

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

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

আর্কিটেকচার ওভারভিউ

84e3f3620dc4ed68.png

পূর্বশর্ত

  • বিলিং সক্ষম সহ একটি Google ক্লাউড প্ল্যাটফর্ম (GCP) প্রকল্প৷
  • মৌলিক জ্ঞান পাইথন

আপনি কি শিখবেন

  • স্ট্রিমলিট, ভার্টেক্স এআই ব্যবহার করে কীভাবে এজেন্টিক এআই ডায়েট প্ল্যানার তৈরি করবেন এবং BigQuery-এ ডেটা সঞ্চয় করবেন
  • ক্লাউড রানে অ্যাপ্লিকেশনটি কীভাবে স্থাপন করবেন

আপনি কি প্রয়োজন হবে

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

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

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

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

fbef9caa1602edd0.png

37d264871000675d.png

5e3ff691252acf41.png

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

3. আপনি শুরু করার আগে

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

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

  1. Google ক্লাউড কনসোলে , প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
  2. নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, Google ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ যা bq এর সাথে প্রিলোড করা হয়। গুগল ক্লাউড কনসোলের শীর্ষে সক্রিয় ক্লাউড শেল ক্লিক করুন।

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 মিস হয়, আপনি সর্বদা বাস্তবায়নের সময় এটি সক্রিয় করতে পারেন।

জিক্লাউড কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন পড়ুন।

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

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

4e372d87c51afa30.png

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

পরিবেশ সেটআপ

পাইথন ভার্চুয়াল এনভায়রনমেন্ট প্রস্তুত করুন

পরবর্তী ধাপ হচ্ছে উন্নয়ন পরিবেশ প্রস্তুত করা। আমরা এই কোডল্যাবে পাইথন 3.12 ব্যবহার করব এবং পাইথন সংস্করণ এবং ভার্চুয়াল পরিবেশ তৈরি এবং পরিচালনার প্রয়োজনীয়তা সহজ করতে আমরা পাইথন ভার্চুয়ালেনভ ব্যবহার করব

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

8635b60ae2f45bbc.jpeg

  1. নতুন ফোল্ডার তৈরি করুন এবং নিম্নলিখিত কমান্ডটি চালান দিয়ে এই ফোল্ডারে অবস্থান পরিবর্তন করুন
mkdir agent_diet_planner
cd agent_diet_planner
  1. নিম্নলিখিত কমান্ডটি চালানোর সাথে নতুন virtualenv তৈরি করুন
python -m venv .env
  1. নিম্নলিখিত কমান্ড দিয়ে virtualenv সক্রিয় করুন
source .env/bin/activate
  1. requirements.txt তৈরি করুন। ফাইল → নতুন পাঠ্য ফাইলে ক্লিক করুন এবং নীচের বিষয়বস্তু পূরণ করুন। তারপর 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. প্রথম পদক্ষেপটি একটি পরিষেবা অ্যাকাউন্ট তৈরি করা। অনুসন্ধানে পরিষেবা অ্যাকাউন্ট টাইপ করুন তারপর পরিষেবা অ্যাকাউন্টে ক্লিক করুন। 18c210d5d1e2a666.png
  2. ক্লিক করুন + পরিষেবা অ্যাকাউন্ট তৈরি করুন। ইনপুট পরিষেবা অ্যাকাউন্টের নাম তারপর তৈরি করুন এবং চালিয়ে যান ক্লিক করুন। 67cad62d367e236a.png
  3. অনুমতিতে, ভূমিকা পরিষেবা অ্যাকাউন্ট ব্যবহারকারী চয়ন করুন। ক্লিক করুন + অন্য ভূমিকা যোগ করুন এবং IAM ভূমিকা চয়ন করুন: BigQuery অ্যাডমিন, ক্লাউড রান অ্যাডমিন, ক্লাউড রান ইনভোকার, ভার্টেক্স এআই সার্ভিস এজেন্ট এবং ভার্টেক্স এআই ব্যবহারকারী তারপর সম্পন্ন ক্লিক করুন be84afdc13678f6c.png
  4. সার্ভিস অ্যাকাউন্ট ইমেল ক্লিক করুন, ট্যাব কী ক্লিক করুন, অ্যাড কী ক্লিক করুন → নতুন কী তৈরি করুন। 50989af3bb9e1538.png
  5. json বেছে নিন তারপর Create এ ক্লিক করুন। পরবর্তী পদক্ষেপের জন্য এই পরিষেবা অ্যাকাউন্ট ফাইলটি স্থানীয়তে সংরক্ষণ করুন a4a119672da532da.png
  6. নিম্নলিখিত কনফিগারেশন সহ .streamlit নামে একটি ফোল্ডার তৈরি করুন। মাউসের রাইট ক্লিক করুন, নতুন ফোল্ডারে ক্লিক করুন এবং ফোল্ডারের নাম লিখুন .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 তারপর Dataset তৈরি করুন ক্লিক করুন
  3. ইনপুট ডেটাসেট আইডি diet_planner_data তারপর ডেটাসেট তৈরি করুন ক্লিক করুন 2055cda1ee0360bd.png

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

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

43b20db2d5f94f38.png

আপনার প্রোফাইলের উপর ভিত্তি করে ওজন, উচ্চতা, বয়স এবং লিঙ্গ পরিবর্তন করুন তারপর জেনারেট এ ক্লিক করুন। এটি Vertex AI লাইব্রেরিতে LLM মডেল Gemini Pro 2.5 কল করবে এবং জেনারেট করা ফলাফল BigQuery-এ সঞ্চয় করবে।

কোডটি 6টি অংশ দ্বারা আলাদা হবে যাতে খুব বেশি লম্বা না হয়।

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

  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 ফোল্ডারে রাইট ক্লিক করুন → New File .. → input filename 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

এই বিভাগে, আমরা 1টি ইনপুট প্যারামিটার bq_client সহ setup_bq_table নামে একটি ফাংশন তৈরি করব। এই ফাংশন bigquery টেবিলে স্কিমা সংজ্ঞায়িত করবে এবং এটি বিদ্যমান না থাকলে একটি টেবিল তৈরি করবে।

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")

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

এই বিভাগে, আমরা 1 ইনপুট প্যারামিটার সহ generate_diet_plan নামে একটি ফাংশন তৈরি করব। এই ফাংশনটি LLM মডেল জেমিনি প্রো 2.5-কে ডেফিন প্রম্পট সহ কল করবে এবং ফলাফল তৈরি করবে।

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

এই বিভাগে, আমরা 3টি ইনপুট প্যারামিটার সহ save_to_bq নামে একটি ফাংশন তৈরি করব: bq_client , user_id এবং plan । এই ফাংশন বিগকোয়েরি টেবিলে জেনারেট ফলাফল সংরক্ষণ করবে

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 নামের সাথে কোড সংরক্ষণ করুন।

5. ক্লাউড রানে ক্লাউড বিল্ড ব্যবহার করে অ্যাপগুলি স্থাপন করুন৷

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

84e3f3620dc4ed68.png

প্রথমে আমাদের ডকারফাইল দরকার, ফাইল->নতুন পাঠ্য ফাইলে ক্লিক করুন এবং নিম্নলিখিত কোডটি অনুলিপি করুন তারপর ডকারফাইল হিসাবে সংরক্ষণ করুন

# 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"]

এরপরে আমরা Cloudbuid.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

পরিষেবা URLটি উপরের বারে থাকবে

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

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

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

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