১. ভূমিকা
এই কোডল্যাবে আপনি শিখবেন কিভাবে BigQuery ডেটা সোর্সের সাথে Conversational Analytics (CA) API Python SDK ব্যবহার করতে হয়। আপনি শিখবেন কিভাবে একটি নতুন এজেন্ট তৈরি করতে হয়, কিভাবে কনভারসেশন স্টেট ম্যানেজমেন্টকে কাজে লাগাতে হয় এবং কিভাবে API থেকে রেসপন্স পাঠাতে ও স্ট্রিম করতে হয়।
পূর্বশর্ত
- গুগল ক্লাউড এবং গুগল ক্লাউড কনসোল সম্পর্কে প্রাথমিক ধারণা
- কমান্ড লাইন ইন্টারফেস এবং ক্লাউড শেলে প্রাথমিক দক্ষতা
- পাইথন প্রোগ্রামিংয়ে প্রাথমিক দক্ষতা
আপনি যা শিখবেন
- BigQuery ডেটা সোর্সের সাথে Conversational Analytics API Python SDK কীভাবে ব্যবহার করবেন
- CA API ব্যবহার করে কীভাবে একটি নতুন এজেন্ট তৈরি করবেন
- কথোপকথনের অবস্থা ব্যবস্থাপনাকে কীভাবে কাজে লাগাবেন
- এপিআই থেকে প্রতিক্রিয়া কীভাবে পাঠাতে এবং স্ট্রিম করতে হয়
আপনার যা যা লাগবে
- একটি গুগল ক্লাউড অ্যাকাউন্ট এবং গুগল ক্লাউড প্রজেক্ট
- ক্রোমের মতো একটি ওয়েব ব্রাউজার
২. সেটআপ এবং প্রয়োজনীয়তা
একটি প্রকল্প বেছে নিন
- Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



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

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারের মধ্যেই করা যাবে। আপনাকে কিছুই ইনস্টল করতে হবে না।
৩. শুরু করার আগে
প্রয়োজনীয় API গুলি সক্রিয় করুন
গুগল ক্লাউড পরিষেবাগুলো ব্যবহার করার জন্য, আপনাকে প্রথমে আপনার প্রোজেক্টের জন্য সেগুলোর নিজ নিজ এপিআই (API) সক্রিয় করতে হবে। এই কোডল্যাবে আপনি নিম্নলিখিত গুগল ক্লাউড পরিষেবাগুলো ব্যবহার করবেন:
- জেমিনি সহ ডেটা অ্যানালিটিক্স এপিআই
- গুগল ক্লাউডের জন্য জেমিনি
- বিগকোয়েরি এপিআই
এই পরিষেবাগুলি সক্রিয় করতে, ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান:
gcloud services enable geminidataanalytics.googleapis.com
gcloud services enable cloudaicompanion.googleapis.com
gcloud services enable bigquery.googleapis.com
পাইথন প্যাকেজ ইনস্টল করুন
যেকোনো পাইথন প্রজেক্ট শুরু করার আগে একটি ভার্চুয়াল এনভায়রনমেন্ট (virtual environment) তৈরি করে নেওয়া ভালো। এটি প্রজেক্টের ডিপেন্ডেন্সিগুলোকে আলাদা করে রাখে, ফলে অন্য প্রজেক্ট বা সিস্টেমের গ্লোবাল পাইথন প্যাকেজগুলোর সাথে কোনো কনফ্লিক্ট বা সংঘাত হয় না। এই অংশে, আপনি pip থেকে uv ইনস্টল করবেন, কারণ ক্লাউড শেলে আগে থেকেই pip রয়েছে।
ইউভি প্যাকেজ ইনস্টল করুন
pip install uv
ইউভি সঠিকভাবে ইনস্টল করা হয়েছে কিনা তা যাচাই করুন।
uv --version
প্রত্যাশিত আউটপুট
যদি আপনি আউটপুট লাইনে uv দেখতে পান, তাহলে আপনি পরবর্তী ধাপে যেতে পারেন। মনে রাখবেন যে ভার্সন নম্বর ভিন্ন হতে পারে:

ভার্চুয়াল পরিবেশ তৈরি করুন এবং প্যাকেজ ইনস্টল করুন
uv init ca-api-codelab
cd ca-api-codelab
uv venv --python 3.12
uv add google-cloud-geminidataanalytics pandas altair
uv pip list | grep -E 'altair|pandas|google-cloud-geminidataanalytics'
প্রত্যাশিত আউটপুট
যদি আপনি তিনটি প্যাকেজসহ আউটপুট লাইন দেখতে পান, তাহলে আপনি পরবর্তী ধাপে যেতে পারেন। মনে রাখবেন যে ভার্সন নম্বরগুলো ভিন্ন হতে পারে:

পাইথন শুরু করুন
uv run python
আপনার স্ক্রিনটি দেখতে এইরকম হওয়া উচিত:

৪. একজন এজেন্ট তৈরি করুন
এখন যেহেতু আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ এবং প্রস্তুত, তাই জেমিনি ডেটা অ্যানালিটিক্স এপিআই-এর ভিত্তি স্থাপন করার সময় এসেছে। এসডিকে এই প্রক্রিয়াটিকে সহজ করে তোলে, আপনার এজেন্ট তৈরি করার জন্য শুধুমাত্র কয়েকটি প্রয়োজনীয় কনফিগারেশনের প্রয়োজন হয়।
ভেরিয়েবল সেট করুন
geminidataanalytics প্যাকেজটি ইম্পোর্ট করুন এবং আমাদের এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করুন:
import os
from google.cloud import geminidataanalytics
data_agent_client = geminidataanalytics.DataAgentServiceClient()
location = "global"
billing_project = os.environ.get('DEVSHELL_PROJECT_ID')
data_agent_id = "google_trends_analytics_agent"
এজেন্টের জন্য সিস্টেম নির্দেশাবলী সেট করুন
CA API, উল্লেখিত টেবিল এবং কলামগুলো সম্পর্কে আরও বিস্তারিত তথ্য পেতে BigQuery মেটাডেটা পড়ে। যেহেতু এই পাবলিক ডেটাসেটটিতে কোনো কলামের বিবরণ নেই, তাই আপনি YAML-ফরম্যাট করা স্ট্রিং হিসেবে এজেন্টকে অতিরিক্ত তথ্য সরবরাহ করতে পারেন। সর্বোত্তম অনুশীলন এবং ব্যবহারের জন্য একটি টেমপ্লেটের জন্য ডকুমেন্টেশন দেখুন:
system_instruction = """
system_instruction:
- You are a data analyst specializing in the Google Trends dataset.
- When querying, always use the 'week' column for date-based filtering. This needs to be a Sunday. If you are doing week over week comparison, make sure you specify a date that is a Sunday.
- The following columns should be ignored in all queries 'dma_id', 'refresh_date'
- The 'dma_name' column represents the city and state for about 210 metro areas in the USA.
tables:
top_terms:
description: "Represents the 25 most popular search terms by weekly search volume in a given US metro area (DMA)."
fields:
term: "The search query string."
week: "The start date of the week (Sunday) for which the ranking is valid."
rank: "The term's popularity rank from 1 (most popular) to 25."
score: "Relative search interest, where 100 is the peak popularity for the term in that week."
dma_name: "The name of the US metro area, e.g., 'New York NY'."
top_rising_terms:
description: "Represents the 25 fastest-growing ('breakout') search terms by momentum in a given US metro area (DMA)."
fields:
term: "The surging search query string."
week: "The start date of the week (Sunday) for which the ranking is valid."
rank: "The term's breakout rank from 1 (top rising) to 25."
percent_gain: "The percentage growth in search volume compared to the previous period."
dma_name: "The name of the US metro area, e.g., 'Los Angeles CA'."
score: "Relative search interest, where 100 is the peak popularity for the term in that week."
join_instructions:
goal: "Find terms that are simultaneously popular and rising in the same week and metro area."
method: "INNER JOIN the two tables on their common keys."
keys:
- "term"
- "week"
- "dma_name"
golden_queries:
- natural_language_query: "Find all terms in the 'New York NY' area that were in both the top 25 and top 25 rising lists for the week of July 6th, 2025, and show their ranks and percent gain."
sql_query: |
SELECT
top.term,
top.rank AS top_25_rank,
rising.rank AS rising_25_rank,
rising.percent_gain
FROM
`bigquery-public-data.google_trends.top_terms` AS top
INNER JOIN
`bigquery-public-data.google_trends.top_rising_terms` AS rising
ON
top.term = rising.term
AND top.week = rising.week
AND top.dma_name = rising.dma_name
WHERE
top.week = '2025-07-06'
AND top.dma_name = 'New York NY'
ORDER BY
top.rank;
"""
BigQuery টেবিলের ডেটা উৎস সেট করুন
এখন আপনি BigQuery টেবিলের ডেটা সোর্স সেট করতে পারেন। CA API একটি অ্যারেতে BigQuery টেবিল গ্রহণ করে:
# BigQuery table data sources
bq_top = geminidataanalytics.BigQueryTableReference(
project_id="bigquery-public-data", dataset_id="google_trends", table_id="top_terms"
)
bq_rising = geminidataanalytics.BigQueryTableReference(
project_id="bigquery-public-data", dataset_id="google_trends", table_id="top_rising_terms"
)
datasource_references = geminidataanalytics.DatasourceReferences(
bq=geminidataanalytics.BigQueryTableReferences(table_references=[bq_top, bq_rising]))
স্টেটফুল চ্যাটের জন্য কনটেক্সট সেট করুন
আপনি প্রকাশিত কনটেক্সট ব্যবহার করে নতুন এজেন্টটি তৈরি করতে পারেন, যেটিতে সিস্টেম নির্দেশাবলী, ডেটা সোর্স রেফারেন্স এবং অন্য যেকোনো অপশন একত্রিত থাকে।
মনে রাখবেন, পাবলিশ করার আগে পরিবর্তনগুলো পরীক্ষা ও যাচাই করার জন্য আপনার কাছে স্টেজিংকনটেক্সট (stagingContext) তৈরি করার কার্যকারিতা রয়েছে। এটি একজন ডেভেলপারকে চ্যাট রিকোয়েস্টে কনটেক্সটভার্সন (contextVersion ) উল্লেখ করে একটি ডেটা এজেন্টে ভার্সনিং যোগ করার সুযোগ দেয়। এই কোডল্যাবের জন্য, আপনি সরাসরি পাবলিশ করবেন:
# Context setup for stateful chat
published_context = geminidataanalytics.Context(
system_instruction=system_instruction,
datasource_references=datasource_references,
options=geminidataanalytics.ConversationOptions(
analysis=geminidataanalytics.AnalysisOptions(
python=geminidataanalytics.AnalysisOptions.Python(
enabled=False
)
)
),
)
data_agent = geminidataanalytics.DataAgent(
data_analytics_agent=geminidataanalytics.DataAnalyticsAgent(
published_context=published_context
),
)
# Create the agent
data_agent_client.create_data_agent(request=geminidataanalytics.CreateDataAgentRequest(
parent=f"projects/{billing_project}/locations/{location}",
data_agent_id=data_agent_id,
data_agent=data_agent,
))
এজেন্ট তৈরি করার পর আপনি নীচের মতো একটি আউটপুট দেখতে পাবেন:

এজেন্টকে খুঁজুন
এজেন্টটি তৈরি হয়েছে কিনা তা নিশ্চিত করতে চলুন পরীক্ষা করে দেখি:
# Test the agent
request = geminidataanalytics.GetDataAgentRequest(
name=data_agent_client.data_agent_path(
billing_project, location, data_agent_id)
)
response = data_agent_client.get_data_agent(request=request)
print(response)
আপনার নতুন এজেন্টের মেটাডেটা দেখা উচিত। এর মধ্যে সিস্টেম নির্দেশাবলী এবং ডেটা সোর্স সম্পর্কিত তৈরির সময় এবং এজেন্ট কনটেক্সটের মতো বিষয়গুলো অন্তর্ভুক্ত থাকবে।
৫. একটি কথোপকথন তৈরি করুন
আপনি এখন আপনার প্রথম কথোপকথন তৈরি করার জন্য প্রস্তুত! এই কোডল্যাবের জন্য, আপনি আপনার এজেন্টের সাথে একটি স্টেটফুল চ্যাটের জন্য একটি কনভারসেশন রেফারেন্স ব্যবহার করবেন।
তথ্যসূত্র হিসেবে, CA API বিভিন্ন রাজ্য এবং এজেন্ট পরিচালনার বিকল্পসহ চ্যাট করার নানা উপায় প্রদান করে। নিচে এই ৩টি পদ্ধতির একটি সংক্ষিপ্ত বিবরণ দেওয়া হলো:
রাজ্য | কথোপকথনের ইতিহাস | এজেন্ট | কোড | বর্ণনা | |
কথোপকথন রেফারেন্স ব্যবহার করে চ্যাট করুন | রাষ্ট্রীয় | এপিআই পরিচালিত | হ্যাঁ | একটি বিদ্যমান কথোপকথন এবং তার সংশ্লিষ্ট এজেন্ট কনটেক্সটকে উল্লেখ করে একটি চ্যাট বার্তা পাঠানোর মাধ্যমে একটি স্টেটফুল কথোপকথন অব্যাহত রাখে। একাধিক পালাবিশিষ্ট কথোপকথনের ক্ষেত্রে, গুগল ক্লাউড কথোপকথনের ইতিহাস সংরক্ষণ ও পরিচালনা করে। | |
ডেটা এজেন্ট রেফারেন্স ব্যবহার করে চ্যাট করুন | রাষ্ট্রহীন | ব্যবহারকারী দ্বারা পরিচালিত | হ্যাঁ | একটি স্টেটলেস চ্যাট বার্তা পাঠায় যা প্রাসঙ্গিকতার জন্য একটি সংরক্ষিত ডেটা এজেন্টকে নির্দেশ করে। একাধিক পালাবিশিষ্ট কথোপকথনের ক্ষেত্রে, আপনার অ্যাপ্লিকেশনকে অবশ্যই প্রতিটি অনুরোধের সাথে কথোপকথনের ইতিহাস পরিচালনা ও সরবরাহ করতে হবে। | |
ইনলাইন কনটেক্সট ব্যবহার করে চ্যাট করুন | রাষ্ট্রহীন | ব্যবহারকারী দ্বারা পরিচালিত | না | কোনো সংরক্ষিত ডেটা এজেন্ট ব্যবহার না করে, সরাসরি অনুরোধে সমস্ত প্রাসঙ্গিক তথ্য দিয়ে একটি স্টেটলেস চ্যাট বার্তা পাঠানো হয়। একাধিক পালাবিশিষ্ট কথোপকথনের ক্ষেত্রে, আপনার অ্যাপ্লিকেশনকে অবশ্যই প্রতিটি অনুরোধের সাথে কথোপকথনের ইতিহাস পরিচালনা ও সরবরাহ করতে হবে। |
আপনি আপনার কথোপকথন সেট আপ করার জন্য একটি ফাংশন তৈরি করবেন এবং কথোপকথনটির জন্য একটি অনন্য আইডি প্রদান করবেন:
def setup_conversation(conversation_id: str):
data_chat_client = geminidataanalytics.DataChatServiceClient()
conversation = geminidataanalytics.Conversation(
agents=[data_chat_client.data_agent_path(
billing_project, location, data_agent_id)],
)
request = geminidataanalytics.CreateConversationRequest(
parent=f"projects/{billing_project}/locations/{location}",
conversation_id=conversation_id,
conversation=conversation,
)
try:
data_chat_client.get_conversation(name=data_chat_client.conversation_path(
billing_project, location, conversation_id))
print(f"Conversation '{conversation_id}' already exists.")
except Exception:
response = data_chat_client.create_conversation(request=request)
print("Conversation created successfully:")
print(response)
conversation_id = "my_first_conversation"
setup_conversation(conversation_id=conversation_id)
আপনি একটি বার্তা দেখতে পাবেন যে কথোপকথনটি সফলভাবে তৈরি হয়েছে।
৬. ইউটিলিটি ফাংশন যোগ করুন
আপনি এজেন্টের সাথে চ্যাটিং শুরু করার জন্য প্রায় প্রস্তুত। তার আগে, চলুন কিছু ইউটিলিটি ফাংশন যোগ করি যা মেসেজগুলোকে ফরম্যাট করতে সাহায্য করবে, যাতে সেগুলো পড়া সহজ হয় এবং ভিজ্যুয়ালাইজেশনগুলোও রেন্ডার করা যায়। CA API একটি ভেগা স্পেসিফিকেশন পাঠাবে যা আপনি altair প্যাকেজ ব্যবহার করে প্লট করতে পারবেন:
# Utility functions for streaming and formatting responses
import altair as alt
import http.server
import pandas as pd
import proto
import socketserver
import threading
_server_thread = None
_httpd = None
# Prints a formatted section title
def display_section_title(text):
print(f"\n--- {text.upper()} ---")
# Handles and displays data responses
def handle_data_response(resp):
if "query" in resp:
query = resp.query
display_section_title("Retrieval query")
print(f"Query name: {query.name}")
print(f"Question: {query.question}")
print("Data sources:")
for datasource in query.datasources:
display_datasource(datasource)
elif "generated_sql" in resp:
display_section_title("SQL generated")
print(resp.generated_sql)
elif "result" in resp:
display_section_title("Data retrieved")
fields = [field.name for field in resp.result.schema.fields]
d = {field: [] for field in fields}
for el in resp.result.data:
for field in fields:
d[field].append(el[field])
print(pd.DataFrame(d))
# Starts a local web server to preview charts
def preview_in_browser(port: int = 8080):
"""Starts a web server in a background thread and waits for user to stop it."""
global _server_thread, _httpd
if _server_thread and _server_thread.is_alive():
print(
f"\n--> A new chart was generated. Refresh your browser at http://localhost:{port}")
return
Handler = http.server.SimpleHTTPRequestHandler
socketserver.TCPServer.allow_reuse_address = True
try:
_httpd = socketserver.TCPServer(("", port), Handler)
except OSError as e:
print(f"❌ Could not start server on port {port}: {e}")
return
_server_thread = threading.Thread(target=_httpd.serve_forever)
_server_thread.daemon = False
_server_thread.start()
print("\n" + "=" * 60)
print(" 📈 CHART READY - PREVIEW IN BROWSER ".center(60))
print("=" * 60)
print(
f"1. In the Cloud Shell toolbar, click 'Web Preview' and select port {port}.")
print(f"2. Or, open your local browser to http://localhost:{port}")
print("=" * 60)
try:
input(
"\n--> Press Enter here after viewing all charts to shut down the server...\n\n")
finally:
print("Shutting down server...")
_httpd.shutdown()
_server_thread.join()
_httpd, _server_thread = None, None
print("Server stopped.")
# Handles chart responses
def handle_chart_response(resp, chart_generated_flag: list):
def _value_to_dict(v):
if isinstance(v, proto.marshal.collections.maps.MapComposite):
return {k: _value_to_dict(v[k]) for k in v}
elif isinstance(v, proto.marshal.collections.RepeatedComposite):
return [_value_to_dict(el) for el in v]
return v
if "query" in resp:
print(resp.query.instructions)
elif "result" in resp:
vega_config_dict = _value_to_dict(resp.result.vega_config)
chart = alt.Chart.from_dict(vega_config_dict)
chart_filename = "index.html"
chart.save(chart_filename)
if chart_generated_flag:
chart_generated_flag[0] = True
# Displays the schema of a data source
def display_schema(data):
fields = getattr(data, "fields")
df = pd.DataFrame({
"Column": [f.name for f in fields],
"Type": [f.type for f in fields],
"Description": [getattr(f, "description", "-") for f in fields],
"Mode": [f.mode for f in fields],
})
print(df)
# Displays information about a BigQuery data source
def display_datasource(datasource):
table_ref = datasource.bigquery_table_reference
source_name = f"{table_ref.project_id}.{table_ref.dataset_id}.{table_ref.table_id}"
print(source_name)
display_schema(datasource.schema)
# Handles and displays schema resolution responses
def handle_schema_response(resp):
if "query" in resp:
print(resp.query.question)
elif "result" in resp:
display_section_title("Schema resolved")
print("Data sources:")
for datasource in resp.result.datasources:
display_datasource(datasource)
# Handles and prints simple text responses
def handle_text_response(resp):
parts = resp.parts
print("".join(parts))
# Processes and displays different types of system messages
def show_message(msg, chart_generated_flag: list):
m = msg.system_message
if "text" in m:
handle_text_response(getattr(m, "text"))
elif "schema" in m:
handle_schema_response(getattr(m, "schema"))
elif "data" in m:
handle_data_response(getattr(m, "data"))
elif "chart" in m:
handle_chart_response(getattr(m, "chart"), chart_generated_flag)
print("\n")
৭. একটি চ্যাট ফাংশন তৈরি করুন
চূড়ান্ত ধাপটি হলো একটি চ্যাট ফাংশন তৈরি করা যা আপনি পুনরায় ব্যবহার করতে পারবেন এবং রেসপন্স স্ট্রিমের প্রতিটি চাঙ্কের জন্য show_message ফাংশনটি কল করতে পারবেন:
def stream_chat_response(question: str):
"""
Sends a chat request, processes the streaming response, and if a chart
was generated, starts the preview server and waits for it to be closed.
"""
data_chat_client = geminidataanalytics.DataChatServiceClient()
chart_generated_flag = [False]
messages = [
geminidataanalytics.Message(
user_message=geminidataanalytics.UserMessage(text=question)
)
]
conversation_reference = geminidataanalytics.ConversationReference(
conversation=data_chat_client.conversation_path(
billing_project, location, conversation_id
),
data_agent_context=geminidataanalytics.DataAgentContext(
data_agent=data_chat_client.data_agent_path(
billing_project, location, data_agent_id
),
),
)
request = geminidataanalytics.ChatRequest(
parent=f"projects/{billing_project}/locations/{location}",
messages=messages,
conversation_reference=conversation_reference,
)
stream = data_chat_client.chat(request=request)
for response in stream:
show_message(response, chart_generated_flag)
if chart_generated_flag[0]:
preview_in_browser()
stream_chat_response ফাংশনটি এখন সংজ্ঞায়িত এবং আপনার প্রম্পটগুলির সাথে ব্যবহারের জন্য প্রস্তুত।
৮. কথা বলা শুরু করুন
প্রশ্ন ১
আপনি এখন প্রশ্ন করা শুরু করতে প্রস্তুত! চলুন দেখি এই এজেন্ট প্রাথমিকভাবে কী করতে পারেন:
question = "Hey what data do you have access to?"
stream_chat_response(question=question)
এজেন্টকে নীচের অনুরূপ কিছু দিয়ে উত্তর দিতে হবে:

প্রশ্ন ২
দারুণ, চলুন সাম্প্রতিক জনপ্রিয় সার্চ টার্মগুলো সম্পর্কে আরও তথ্য খুঁজে বের করার চেষ্টা করি:
question = "What are the top 20 most popular search terms last week in NYC based on rank? Display each term and score as a column chart"
stream_chat_response(question=question)
এটি চলতে কিছুটা সময় লাগবে। আপনি এজেন্টকে বিভিন্ন ধাপ অতিক্রম করতে এবং আপডেটগুলো স্ট্রিম করতে দেখবেন, যেমন—স্কিমা ও মেটাডেটা পুনরুদ্ধার করা, SQL কোয়েরি লেখা, ফলাফল সংগ্রহ করা, ভিজ্যুয়ালাইজেশনের নির্দেশাবলী নির্দিষ্ট করা এবং ফলাফলের সারসংক্ষেপ তৈরি করা।
চার্টটি দেখতে, ক্লাউড শেল টুলবারে গিয়ে 'ওয়েব প্রিভিউ'-তে ক্লিক করুন এবং পোর্ট ৮০৮০ নির্বাচন করুন:

আপনি ভিজ্যুয়ালাইজেশনটির একটি রেন্ডারিং দেখতে পাবেন যা দেখতে এইরকম:

সার্ভার বন্ধ করতে এবং চালিয়ে যেতে এন্টার চাপুন।
প্রশ্ন ৩
চলুন একটি অনুবর্তী প্রশ্ন করে এই ফলাফলগুলো আরও গভীরভাবে খতিয়ে দেখি:
question = "What was the percent gain in growth for these search terms from the week before?"
stream_chat_response(question=question)
আপনি নীচের মতো কিছু দেখতে পাবেন। এক্ষেত্রে এজেন্ট শতাংশ লাভ বের করার জন্য দুটি টেবিলকে যুক্ত করতে একটি কোয়েরি তৈরি করেছে। মনে রাখবেন, আপনার কোয়েরিটি দেখতে কিছুটা ভিন্ন হতে পারে:

And visualized it will look like this:

৯. পরিচ্ছন্নতা
যেহেতু এই কোডল্যাবে কোনো দীর্ঘক্ষণ ধরে চলা প্রোডাক্ট জড়িত নেই, তাই টার্মিনালে exit() লিখে আপনার সক্রিয় পাইথন সেশনটি বন্ধ করাই যথেষ্ট।
প্রজেক্টের ফোল্ডার এবং ফাইলগুলো মুছে ফেলুন
আপনি যদি আপনার ক্লাউড শেল পরিবেশ থেকে কোডটি সরাতে চান, তাহলে নিম্নলিখিত কমান্ডগুলো ব্যবহার করুন:
cd ~
rm -rf ca-api-codelab
এপিআই নিষ্ক্রিয় করুন
পূর্বে সক্রিয় করা API-গুলো নিষ্ক্রিয় করতে এই কমান্ডটি চালান।
gcloud services disable geminidataanalytics.googleapis.com
gcloud services disable cloudaicompanion.googleapis.com
gcloud services disable bigquery.googleapis.com
১০. উপসংহার
অভিনন্দন, আপনি CA SDK ব্যবহার করে সফলভাবে একটি সহজ কনভারসেশনাল অ্যানালিটিক্স এজেন্ট তৈরি করেছেন। আরও জানতে রেফারেন্স উপকরণগুলো দেখুন!