টুলস একটি এজেন্ট তৈরি করুন: ADK-এর সাহায্যে জিরো থেকে অ্যাসিস্ট্যান্ট

1. ভূমিকা

এই ল্যাবে, আপনি এজেন্ট ডেভেলপমেন্ট কিট (ADK) দিয়ে একজন এজেন্ট তৈরি করবেন! আপনি শিখবেন কিভাবে ADK এবং বিভিন্ন ধরনের টুল ব্যবহার করে একটি সফটওয়্যার বাগ সহকারী এজেন্ট তৈরি করতে হয়। আপনি একটি মৌলিক এজেন্ট দিয়ে শুরু করবেন এবং ফাংশন টুলস , বিল্ট-ইন টুলস , থার্ড-পার্টি টুলস এবং মডেল কনটেক্সট প্রোটোকল (MCP) টুল সহ এর ক্ষমতা বাড়াতে ক্রমান্বয়ে টুল যোগ করবেন।

সরঞ্জাম একটি এজেন্ট করুন

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

  • কিভাবে ADK উন্নয়নের জন্য একটি পাইথন প্রকল্প সেট আপ করবেন।
  • কিভাবে একটি মৌলিক ADK এজেন্ট তৈরি করবেন।
  • কিভাবে ফাংশন টুল বাস্তবায়ন এবং ব্যবহার করতে হয়।
  • গুগল সার্চের মতো বিল্ট-ইন টুলগুলোকে কিভাবে ইন্টিগ্রেট করা যায়।
  • কিভাবে ADK-এর মধ্যে LangChain-এর মতো ফ্রেমওয়ার্ক থেকে থার্ড-পার্টি টুলস ব্যবহার করা যায়।
  • ডাটাবেস (ক্লাউড এসকিউএল) এবং এপিআইগুলির সাথে ইন্টারঅ্যাক্ট করতে MCP সরঞ্জামগুলি কীভাবে ব্যবহার করবেন।

2. ওভারভিউ

কল্পনা করুন যে আপনি একটি বিশ্বব্যাপী কফি মেশিন কোম্পানি QuantumRoast-এর একজন প্রজেক্ট ম্যানেজার।

কোয়ান্টাম রোস্ট

আপনি আপনার সতীর্থদের ইঞ্জিনিয়ারিং রোডম্যাপের সমুদ্রে নেভিগেট করতে সাহায্য করেন, আকস্মিক কৌশল পিভট (আমরা এখন ম্যাচা করছি!), এবং গ্রাহকদের কাছ থেকে ইনকামিং টিকিট — বগি ইনভয়েস সিস্টেম থেকে শুরু করে একটি কফি মেশিন যা 24/7 উচ্চ শব্দ করে।

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

অভিভূত প্রজেক্ট ম্যানেজার

সফ্টওয়্যার টিকিট এবং ডিবাগ সমস্যাগুলি তৈরি করতে এবং ট্রিজ করতে আপনাকে সাহায্য করার জন্য আমরা যদি এমন একজন সাহায্যকারী তৈরি করতে পারি তবে কী হবে? একটি এআই এজেন্ট এটি সম্ভব করে তোলে।

এআই এজেন্ট

এজেন্ট ডেভেলপমেন্ট কিট (ADK)

এজেন্ট ডেভেলপমেন্ট কিট (ADK) হল একটি নমনীয় এবং মডুলার ফ্রেমওয়ার্ক যা এআই এজেন্টদের ডেভেলপ করা এবং মোতায়েনের জন্য। Gemini এবং Google ইকোসিস্টেমের জন্য অপ্টিমাইজ করা হলেও, ADK হল মডেল-অজ্ঞেয়বাদী, স্থাপনা-অজ্ঞেয়বাদী, এবং অন্যান্য কাঠামোর সাথে সামঞ্জস্যের জন্য তৈরি করা হয়েছে৷ ADK ডিজাইন করা হয়েছে এজেন্ট ডেভেলপমেন্টকে সফটওয়্যার ডেভেলপমেন্টের মতো অনুভব করার জন্য, যাতে ডেভেলপারদের জন্য সহজ কাজ থেকে জটিল ওয়ার্কফ্লো পর্যন্ত এজেন্টিক আর্কিটেকচার তৈরি করা, স্থাপন করা এবং অর্কেস্ট্রেট করা সহজ হয়।

ADK হল সেই ফ্রেমওয়ার্ক যা আমরা আমাদের QuantumRoast সফ্টওয়্যার বাগ সহকারী তৈরির জন্য ব্যবহার করব৷

এজেন্ট ডায়াগ্রাম

টুল 101

এআই এজেন্টরা তাদের সমস্যার সমাধান করার জন্য মডেল ব্যবহার করে, শুধু কঠিন কোডেড লজিক নয়। কিন্তু শুধু এলএলএম-ভিত্তিক যুক্তির চেয়েও বেশি, এআই এজেন্টগুলি বাহ্যিক ডেটা সংগ্রহ করতে এবং তারপর ব্যবহারকারীর পক্ষে পদক্ষেপ নিতে অনন্যভাবে চালিত হয়। একটি সমস্যা কীভাবে সমাধান করতে হয় তা বলার পরিবর্তে, একজন এআই এজেন্ট আপনাকে প্রকৃতপক্ষে এটি সমাধান করতে সহায়তা করতে পারে। আমরা এটা কিভাবে করব? সরঞ্জাম দিয়ে!

একটি টুল হল একটি ক্ষমতা যা একজন এআই এজেন্টকে বিশ্বের সাথে যোগাযোগ করতে সাহায্য করে। একটি টুল প্রায় যেকোনো কিছু হতে পারে: একটি ইনলাইন ফাংশন, একটি হোস্ট করা ডাটাবেস, একটি তৃতীয় পক্ষের API বা এমনকি অন্য এজেন্ট। এজেন্ট ডেভেলপমেন্ট কিট (ADK) এর মতো AI এজেন্ট ফ্রেমওয়ার্কগুলিতে সরঞ্জামগুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে , বিভিন্ন ধরণের সরঞ্জামকে সমর্থন করে যা আমরা কিছুক্ষণের মধ্যে কভার করব।

কিন্তু কীভাবে একজন এজেন্ট শুধুমাত্র একটি নির্দিষ্ট টুলকে কল করতে হবে তা নয়, এটি কীভাবে কল করতে হবে তাও জানেন? এজেন্টের মডেল এখানে কয়েকটি মূল ভূমিকা পালন করে।

কিভাবে টুল কাজ করে

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

দ্বিতীয় মূল ধাপ হল ফাংশন-কলিং । ফাংশন কলিং কিছুটা ভুল নাম কারণ মডেলটি আসলে টুলটিকে কল করছে না, বরং, ফ্রেমওয়ার্কটি টুলটিকে কল করার জন্য যে রিকোয়েস্ট বডিটি ফর্ম্যাট করে সেটিকে কল করার প্রস্তুতি নিচ্ছে

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

এই সমস্ত কাজ দেখতে, ADK Python ব্যবহার করে QuantumRoast বাগ সহকারী এজেন্ট তৈরি করার সময় এসেছে।

কোয়ান্টামরোস্ট বাগ সহকারী

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

গুগল ক্লাউড প্রজেক্ট সেটআপ

  1. আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে তবে আপনাকে অবশ্যই একটি Google অ্যাকাউন্ট তৈরি করতে হবে।
    • কাজের বা স্কুল অ্যাকাউন্টের পরিবর্তে একটি ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন। কর্মক্ষেত্র এবং স্কুল অ্যাকাউন্টগুলিতে বিধিনিষেধ থাকতে পারে যা আপনাকে এই ল্যাবের জন্য প্রয়োজনীয় APIগুলি সক্ষম করতে বাধা দেয়৷
  2. Google ক্লাউড কনসোলে সাইন-ইন করুন।
  3. ক্লাউড কনসোলে বিলিং সক্ষম করুন
    • এই ল্যাবটি সম্পূর্ণ করতে ক্লাউড সংস্থানগুলিতে $1 USD-এর কম খরচ হওয়া উচিত৷
    • আপনি আরও চার্জ এড়াতে সংস্থানগুলি মুছতে এই ল্যাবের শেষে পদক্ষেপগুলি অনুসরণ করতে পারেন৷
    • নতুন ব্যবহারকারীরা $300 USD ফ্রি ট্রায়ালের জন্য যোগ্য৷
  4. একটি নতুন প্রকল্প তৈরি করুন বা একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করতে বেছে নিন।

ক্লাউড শেল এডিটর খুলুন

  1. ক্লাউড শেল এডিটরে নেভিগেট করুন
  2. যদি টার্মিনালটি স্ক্রিনের নীচে প্রদর্শিত না হয় তবে এটি খুলুন:
    • হ্যামবার্গার মেনুতে ক্লিক করুন হ্যামবার্গার মেনু আইকন
    • টার্মিনাল ক্লিক করুন
    • নতুন টার্মিনালে ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  3. টার্মিনালে, এই কমান্ড দিয়ে আপনার প্রকল্প সেট করুন ( YOUR_PROJECT_ID প্রতিস্থাপন):
    • বিন্যাস:
      gcloud config set project YOUR_PROJECT_ID
      
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • আপনি যদি আপনার প্রকল্প আইডি মনে করতে না পারেন:
      • আপনি আপনার সমস্ত প্রকল্প আইডি এর সাথে তালিকাভুক্ত করতে পারেন:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      ক্লাউড শেল এডিটর টার্মিনালে প্রজেক্ট আইডি সেট করুন
  4. অনুমোদন করার জন্য অনুরোধ করা হলে, চালিয়ে যেতে অনুমোদন ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  5. আপনার এই বার্তাটি দেখতে হবে:
    Updated property [core/project].
    
    যদি আপনি একটি WARNING দেখতে পান এবং জিজ্ঞাসা করা হয় Do you want to continue (Y/N)? , তাহলে আপনি সম্ভবত প্রজেক্ট আইডি ভুলভাবে প্রবেশ করেছেন। N টিপুন, Enter টিপুন এবং আবার gcloud config set project কমান্ড চালানোর চেষ্টা করুন।
  6. টার্মিনালে, পরবর্তী ধাপে ব্যবহার করার জন্য PROJECT_ID পরিবেশ পরিবর্তনশীল সেট করুন।
    export PROJECT_ID=$(gcloud config get project)
    

এপিআই সক্ষম করুন

টার্মিনালে, প্রয়োজনীয় Google ক্লাউড API সক্রিয় করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud services enable sqladmin.googleapis.com \
   compute.googleapis.com \
   cloudresourcemanager.googleapis.com \
   secretmanager.googleapis.com \
   servicenetworking.googleapis.com \
   aiplatform.googleapis.com \
   run.googleapis.com \
   artifactregistry.googleapis.com \
   cloudbuild.googleapis.com

PostgreSQL উদাহরণের জন্য একটি ক্লাউড SQL তৈরি করুন

QuantumRoast এর একটি বাগ টিকিট ডাটাবেস রয়েছে যা সমস্ত অভ্যন্তরীণ টিকিট ধারণ করে। চলুন এগিয়ে যাই এবং PostgreSQL উদাহরণের জন্য একটি ক্লাউড এসকিউএল তৈরি করে এটি সেট আপ করি।

gcloud sql instances create software-assistant \
   --database-version=POSTGRES_16 \
   --tier=db-custom-1-3840 \
   --region=us-central1 \
   --edition=ENTERPRISE \
   --enable-google-ml-integration \
   --database-flags cloudsql.enable_google_ml_integration=on \
   --root-password=admin

উদাহরণ তৈরি হওয়ার জন্য অপেক্ষা করুন (এটি কয়েক মিনিট সময় নিতে পারে)।

একবার তৈরি হয়ে গেলে, আপনি এখানে ক্লাউড কনসোলে আপনার উদাহরণ দেখতে পারেন।

একটি ক্লাউড এসকিউএল ডাটাবেস তৈরি করুন

একটি SQL ডাটাবেস তৈরি করুন ( tickets-db ), এবং ক্লাউড এসকিউএল পরিষেবা অ্যাকাউন্টটিকে Vertex AI-তে অ্যাক্সেস দিন (যাতে আমরা মিল অনুসন্ধান করতে এমবেডিং তৈরি করতে পারি)।

gcloud sql databases create tickets-db --instance=software-assistant

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe software-assistant --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" --role="roles/aiplatform.user"

tickets টেবিল সেটআপ করুন

ক্লাউড কনসোল (ক্লাউড এসকিউএল) থেকে, software-assistant উদাহরণের জন্য ক্লাউড SQL স্টুডিও খুলুন।

পাসওয়ার্ড হিসাবে postgres ব্যবহারকারী এবং admin ব্যবহার করে tickets-db ডাটাবেসে লগ ইন করুন।

ক্লাউড এসকিউএল স্টুডিও

একটি নতুন Editor ট্যাব খুলুন।

ক্লাউড এসকিউএল স্টুডিও সম্পাদক

তারপর, টেবিল সেট আপ করতে এবং ভেক্টর এম্বেডিং তৈরি করতে নিম্নলিখিত SQL কোড পেস্ট করুন। কমান্ড চালানোর জন্য Run বোতাম টিপুন।

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;
GRANT EXECUTE ON FUNCTION embedding TO postgres;

CREATE TABLE tickets (
    ticket_id SERIAL PRIMARY KEY,             -- PostgreSQL's auto-incrementing integer type (SERIAL is equivalent to INT AUTO_INCREMENT)
    title VARCHAR(255) NOT NULL,              -- A concise summary or title of the bug/issue.
    description TEXT,                         -- A detailed description of the bug.
    assignee VARCHAR(100),                    -- The name or email of the person/team assigned to the ticket.
    priority VARCHAR(50),                     -- The priority level (e.g., 'P0 - Critical', 'P1 - High').
    status VARCHAR(50) DEFAULT 'Open',        -- The current status of the ticket (e.g., 'Open', 'In Progress', 'Resolved'). Default is 'Open'.
    creation_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- Timestamp when the ticket was first created. 'WITH TIME ZONE' is recommended for clarity and compatibility.
    updated_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP  -- Timestamp when the ticket was last updated. Will be managed by a trigger.
);

tickets টেবিল তৈরি করা হয়েছে, পুরানো ক্যোয়ারী সাফ করতে Clear ক্লিক করুন।

এখন নমুনা ডেটা সন্নিবেশ করুন এবং আবার Run বোতাম টিপুন।

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Login Page Freezes After Multiple Failed Attempts', 'Users are reporting that after 3 failed login attempts, the login page becomes unresponsive and requires a refresh. No specific error message is displayed.', 'samuel.green@example.com', 'P0 - Critical', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Dashboard Sales Widget Intermittent Data Loading Failure', 'The "Sales Overview" widget on the main dashboard intermittently shows a loading spinner but no data. Primarily affects Chrome browser users.', 'maria.rodriguez@example.com', 'P1 - High', 'In Progress');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Broken Link in Footer - Privacy Policy', 'The "Privacy Policy" hyperlink located in the website footer leads to a 404 "Page Not Found" error.', 'maria.rodriguez@example.com', 'P3 - Low', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('UI Misalignment on Mobile Landscape View (iOS)', 'On specific iOS devices (e.g., iPhone 14 models), the top navigation bar shifts downwards when the device is viewed in landscape orientation, obscuring content.', 'maria.rodriguez@example.com', 'P2 - Medium', 'In Progress');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Critical XZ Utils Backdoor Detected in Core Dependency (CVE-2024-3094)', 'Urgent: A sophisticated supply chain compromise (CVE-2024-3094) has been identified in XZ Utils versions 5.6.0 and 5.6.1. This malicious code potentially allows unauthorized remote SSH access by modifying liblzma. Immediate investigation and action required for affected Linux/Unix systems and services relying on XZ Utils.', 'frank.white@example.com', 'P0 - Critical', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Database Connection Timeouts During Peak Usage', 'The application is experiencing frequent database connection timeouts, particularly during peak hours (10 AM - 12 PM EDT), affecting all users and causing service interruptions.', 'frank.white@example.com', 'P1 - High', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Export to PDF Truncates Long Text Fields in Reports', 'When generating PDF exports of reports containing extensive text fields, the text is abruptly cut off at the end of the page instead of wrapping or continuing to the next page.', 'samuel.green@example.com', 'P1 - High', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Search Filter "Date Range" Not Applying Correctly', 'The "Date Range" filter on the search results page does not filter records accurately; results outside the specified date range are still displayed.', 'samuel.green@example.com', 'P2 - Medium', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Typo in Error Message: "Unathorized Access"', 'The error message displayed when a user attempts an unauthorized action reads "Unathorized Access" instead of "Unauthorized Access."', 'maria.rodriguez@example.com', 'P3 - Low', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Intermittent File Upload Failures for Large Files', 'Users are intermittently reporting that file uploads fail without a clear error message or explanation, especially for files exceeding 10MB in size.', 'frank.white@example.com', 'P1 - High', 'Open');

QuantumRoast-এ, আমরা হয়তো জানতে চাই যে কখন একটি বাগ/টিকিট শেষবার আপডেট করা হয়েছিল।

এটি করার জন্য আমরা প্রতিবার একটি রেকর্ড আপডেট করার সময় updated_time ক্ষেত্রটি আপডেট করার জন্য একটি ট্রিগার তৈরি করতে পারি।

Clear ক্লিক করুন এবং তারপর একটি ট্রিগার বাস্তবায়ন করতে নিম্নলিখিত SQL পেস্ট করুন।

চালানোর জন্য Run বোতাম টিপুন।

CREATE OR REPLACE FUNCTION update_updated_time_tickets()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_time = NOW();  -- Set the updated_time to the current timestamp
    RETURN NEW;                -- Return the new row
END;
$$ language 'plpgsql';        

CREATE TRIGGER update_tickets_updated_time
BEFORE UPDATE ON tickets
FOR EACH ROW                  -- This means the trigger fires for each row affected by the UPDATE statement
EXECUTE PROCEDURE update_updated_time_tickets();

description ক্ষেত্র থেকে ভেক্টর এম্বেডিং তৈরি করুন। এটি আমাদের এজেন্টকে আমাদের ডাটাবেসে সাদৃশ্য অনুসন্ধান করার ক্ষমতা দেবে। উদাহরণ স্বরূপ, "ওয়েবসাইটের হোমপেজ সম্পর্কিত কোন খোলা সমস্যা আছে?"।

ALTER TABLE tickets ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',description)) STORED;

আপনি এখন ডাটাবেস প্রস্তুত কিনা তা যাচাই করতে প্রশ্ন করতে পারেন।

SELECT * FROM tickets;

আপনি 10টি সারি দেখতে পাবেন যা নিম্নলিখিতগুলির সাথে সাদৃশ্যপূর্ণ:

ক্লাউড এসকিউএল ডিবি যাচাই করুন

এখন আপনি মজার অংশ, কোডে যেতে প্রস্তুত!

4. পাইথন প্রজেক্ট সেটআপ

আমরা আমাদের এজেন্ট তৈরিতে ডুব দেওয়ার আগে আমাদের অবশ্যই নিশ্চিত করতে হবে যে আমাদের একটি সঠিক পাইথন প্রকল্প সেটআপ আছে। আমরা ক্লাউড শেল এ সব করব!

প্রথমে একটি quantum-roast ফোল্ডার তৈরি করুন এবং এতে cd :

mkdir quantum-roast && cd quantum-roast

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

আমরা uv (পাইথনের অত্যন্ত দ্রুত প্যাকেজ এবং প্রজেক্ট ম্যানেজার) ব্যবহার করব যা আমাদের প্রজেক্ট এবং নির্ভরতা পরিচালনার জন্য ক্লাউড শেল-এ আগে থেকে ইনস্টল করা আছে । Uv আমাদের কিছু ফাইল সেটআপ করার পাশাপাশি ভার্চুয়াল এনভায়রনমেন্ট, নির্ভরতা ইত্যাদি পরিচালনা করতে সাহায্য করবে যাতে আমাদের করতে না হয়!

uv init দিয়ে একটি নতুন প্রকল্প শুরু করুন:

uv init --description "QuantumRoast Software Bug Assistant with ADK" --bare --python 3.10

কমান্ড চালানোর পরে, আমাদের প্রকল্পের জন্য একটি pyproject.toml ফাইল থাকা উচিত। যাচাই করতে, ক্লাউড শেল টার্মিনালে cat pyproject.toml চালান:

cat pyproject.toml

নিম্নলিখিত আউটপুট হিসাবে দেখা উচিত:

[project]
name = "quantum-roast"
version = "0.1.0"
description = "QuantumRoast Software Bug Assistant with ADK"
requires-python = ">=3.10"
dependencies = []

uv add ব্যবহার করে আমাদের প্রকল্পে নির্ভরতা হিসাবে google-adk (ADK) যুক্ত করার সময়।

uv add google-adk==1.11.0

এটি আমাদের pyproject.tomldependencies তালিকায় google-adk যোগ করে।

ADK সর্বোত্তম ফলাফল অর্জনের জন্য একটি নির্দিষ্ট প্রকল্প কাঠামো আশা করে।

quantum-roast/
    software_bug_assistant/
        __init__.py
        agent.py
        .env

software_bug_assistant ফোল্ডার এবং এর মধ্যে ফাইলগুলি তৈরি করুন:

mkdir software_bug_assistant && touch software_bug_assistant/__init__.py \
software_bug_assistant/agent.py \
software_bug_assistant/tools.py \
software_bug_assistant/.env

ls ব্যবহার করে ফাইল তৈরির যাচাই করুন:

ls -a software_bug_assistant/

আপনি নিম্নলিখিত দেখতে হবে:

__init__.py	 .  ..	 .env	 agent.py    tools.py

সঠিকভাবে জেমিনি মডেল কল করার জন্য ADK-এর জন্য প্রয়োজনীয় পরিবেশ ভেরিয়েবল সহ .env ফাইলটি পূরণ করার সময়। আমরা Vertex API এর মাধ্যমে Gemini অ্যাক্সেস করব।

echo "GOOGLE_GENAI_USE_VERTEXAI=TRUE" >> software_bug_assistant/.env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> software_bug_assistant/.env \
&& echo "GOOGLE_CLOUD_LOCATION=us-central1" >> software_bug_assistant/.env

.env সঠিকভাবে জনবহুল হয়েছে তা যাচাই করতে, নিম্নলিখিতটি চালান:

cat software_bug_assistant/.env

your-project-id আপনার প্রকল্প আইডি যেখানে আপনি নিম্নলিখিত দেখতে হবে:

GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=us-central1

আমরা এখন আমাদের ADK এজেন্ট তৈরি শুরু করতে প্রস্তুত।

5. বেস ADK এজেন্ট

আসুন একটি বেস ADK এজেন্টের সাথে সেটআপ করি যা আমরা এই ওয়ার্কশপের সময় একটি শক্তিশালী বাগ সহকারী তৈরি করতে একের পর এক টুল যোগ করতে পারি!

ক্লাউড শেল এডিটরে agent.py খুলুন:

cloudshell edit software_bug_assistant/agent.py

নিম্নলিখিত কোডটি agent.py এ পেস্ট করুন এবং Ctrl + s ফাইলটি সংরক্ষণ করুন:

from google.adk.agents import Agent

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[],
)

ADK এর dev UI ( adk web ) শুরু করে আপনার নতুন তৈরি এজেন্ট চালান৷ uv run সাথে এটি করা স্বয়ংক্রিয়ভাবে ADK ইনস্টল সহ একটি ভার্চুয়াল পরিবেশ তৈরি করবে।

uv run adk web --port 8080 --reload_agents

কনসোলে আপনি ADK ওয়েব সার্ভারের সফল স্টার্ট আপ দেখতে পাবেন।

INFO:     Started server process [1557]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)

UI দেখতে ক্লাউড শেলের ওয়েব প্রিভিউ খুলুন।

ক্লাউড শেল ওয়েব প্রিভিউ

আপনার ADK ওয়েব UI দেখতে হবে।

ADK ওয়েব UI

এগিয়ে যান এবং ADK এজেন্টের সাথে চ্যাট করার চেষ্টা করুন।

এজেন্টকে জিজ্ঞাসা করুন What day is it today? .

ADK ওয়েব উদাহরণ

আপনি প্রতিক্রিয়া থেকে লক্ষ্য করবেন যে এজেন্ট এই মৌলিক প্রশ্নের উত্তর দিতে পারে না! অনুস্মারক যে এলএলএমগুলি বিচ্ছিন্ন সিস্টেম, অতীতের ডেটাতে প্রশিক্ষিত। সাম্প্রতিক ইভেন্ট বা এমনকি বর্তমান তারিখে তাদের রিয়েল-টাইম প্রসঙ্গ নেই... যদি না আপনি তাদের টুল দেন!

ADK-এর প্রথম টুল টাইপ, একটি ফাংশন টুল বাস্তবায়নের সময়।

6. ফাংশন টুল

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

ফাংশন টুল

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

QuantumRoast-এ আমরা বর্তমান দিনের তারিখ পেতে একটি মৌলিক ফাংশন সংজ্ঞায়িত করতে চাই, যাতে পরবর্তীতে এই ল্যাব হ্যান্ডেল প্রশ্নগুলি যেমন, "গত সপ্তাহের বাগগুলি দেখান" বা "আজ কোন দিন?" (এটা আমাদের সবার ক্ষেত্রেই ঘটে)।

/software_bug_assistant ফোল্ডারের মধ্যে tools.py ফাইলটি যেখানে আমরা এই ল্যাব জুড়ে তৈরি করা সমস্ত সরঞ্জামগুলিকে সংগঠিত করব।

+ আইকনে ক্লিক করে একটি নতুন টার্মিনাল খুলুন।

নতুন টার্মিনাল

এখন নতুন টার্মিনালে, PROJECT_ID সেট করুন এবং tools.py খুলুন :

cd quantum-roast
export PROJECT_ID=$(gcloud config get project)
cloudshell edit software_bug_assistant/tools.py

এখন get_current_date ফাংশনটি সংজ্ঞায়িত করুন যা একটি ফাংশন টুল হিসাবে ব্যবহার করা হবে।

from datetime import datetime

# ----- Example of a Function tool -----
def get_current_date() -> dict:
    """
    Get the current date in the format YYYY-MM-DD
    """
    return {"current_date": datetime.now().strftime("%Y-%m-%d")}

ফাংশন এখন সংজ্ঞায়িত করা হয়! সময় এজেন্ট একটি হাতিয়ার হিসাবে এটি পাস.

ক্লাউড শেল এডিটরে agent.py খুলুন:

cloudshell edit software_bug_assistant/agent.py

আমরা tools.py থেকে get_current_date ফাংশন আমদানি করতে চাই এবং ফাংশনটিকে এজেন্টের tools আর্গুমেন্টে পাঠাতে চাই।

আপডেট করা agent.py নিম্নরূপ দেখায়:

from google.adk.agents import Agent

from .tools import get_current_date

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date],
)

এখন আপনি যদি ADK ওয়েব UI চালিত ওয়েব প্রিভিউ ট্যাবে ফিরে যান এবং জিজ্ঞাসা করেন What day is it today? আবার...

ADK ওয়েব ফাংশন টুল

get_current_date ফাংশন টুলে কল করে এজেন্ট সফলভাবে তারিখ বলতে পারে! 🎉

পরবর্তী ADK টুল টাইপ অন্বেষণ করার সময়।

7. অন্তর্নির্মিত টুল

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

অন্তর্নির্মিত টুল

Google অনুসন্ধান বিল্ট-ইন টুলের জন্য সমর্থন যোগ করতে tools.py ফাইলটি খুলুন।

cloudshell edit software_bug_assistant/tools.py

tools.py এর নিচের অংশে যোগ করুন:

# ----- Built-in Tool Imports -----
from google.adk.agents import Agent
from google.adk.tools import google_search
from google.adk.tools.agent_tool import AgentTool

# ----- Example of a Built-in Tool -----
search_agent = Agent(
    model="gemini-2.5-flash",
    name="search_agent",
    description="A specialist in Google Search.",
    instruction="""
    You're a specialist in Google Search.
    """,
    tools=[google_search],
)

search_tool = AgentTool(search_agent)

এখানে, আমরা প্রকৃতপক্ষে সেই Google অনুসন্ধান টুলটিকে তার নিজস্ব এজেন্টে তার নিজস্ব সিস্টেম নির্দেশাবলী দিয়ে গুটিয়ে রাখছি, কার্যকরভাবে একটি এজেন্টকে একটি টুল হিসাবে ব্যবহার করে৷

এখন আমরা agent.py এ রুট এজেন্টে search_tool আমদানি এবং পাস করতে পারি:

cloudshell edit software_bug_assistant/agent.py

search_tool অন্তর্ভুক্ত করতে আপনি নিম্নলিখিত কোড দিয়ে agent.py প্রতিস্থাপন করতে পারেন:

from google.adk.agents import Agent

from .tools import get_current_date, search_tool

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool],
)

ফাইলটি সংরক্ষণ করুন এবং আপনার ওপেনটিতে ফিরে যান যেখানে ADK ওয়েব UI চলছে৷

QuantumRoast-এ আমরা নিশ্চিত করতে চাই যে আমাদের ওয়েবসাইট এবং সফ্টওয়্যার সাধারণ দুর্বলতা এবং এক্সপোজার (CVEs) থেকে সুরক্ষিত রয়েছে যা সর্বজনীন সাইবার নিরাপত্তা দুর্বলতা। আমরা আমাদের এজেন্টের নতুন Google সার্চ টুল ব্যবহার করতে পারি অতি সম্প্রতি আবিষ্কৃত CVE-এর জন্য ওয়েবে অনুসন্ধান করতে।

নিম্নলিখিত ক্যোয়ারী চালান: Do a web search for 5 of the most recent CVEs? .

ওয়েবে অনুসন্ধান করতে আমাদের এজেন্টকে search_agent কল করা উচিত।

ADK ওয়েব বিল্ট-ইন টুলের উদাহরণ

আমাদের এজেন্ট এখন Google অনুসন্ধানের জন্য ADK-এর অন্তর্নির্মিত টুলের মাধ্যমে ওয়েবে অনুসন্ধান করার ক্ষমতা সফলভাবে আনলক করেছে! 🎉

পরবর্তী ADK টুল টাইপ সম্মুখে।

8. তৃতীয় পক্ষের টুল

ADK-কে অত্যন্ত এক্সটেনসিবল করার জন্য ডিজাইন করা হয়েছে, যা আপনাকে ক্রুওয়াআই এবং ল্যাংচেইনের মতো অন্যান্য তৃতীয় পক্ষের এআই এজেন্ট ফ্রেমওয়ার্ক থেকে নির্বিঘ্নে একত্রিত করার অনুমতি দেয়। এই আন্তঃব্যবহারযোগ্যতা অত্যন্ত গুরুত্বপূর্ণ কারণ এটি দ্রুত বিকাশের সময় এবং বিদ্যমান সরঞ্জামগুলি পুনরায় ব্যবহার করার ক্ষমতা দেয়।

তৃতীয় পক্ষের টুল

আমাদের বাগ এজেন্টকে StackOverflow-এর শক্তিশালী প্রশ্নোত্তর ডেটাতে প্লাগ করতে, আমরা LangChain-এর বিস্তৃত টুল লাইব্রেরি থেকে বিশেষভাবে, StackExchange API Wrapper টুল টানতে পারি। ADK LangChain-এর মতো তৃতীয়-পক্ষের সরঞ্জামগুলিকে সমর্থন করে, তাই আমাদের ADK এজেন্টে এই সরঞ্জামটি যোগ করার জন্য মাত্র কয়েকটি লাইনের কোড প্রয়োজন!

প্রথমত, আমাদের প্রকল্পে LangChain এবং StackOverflow ( langchain-community এবং stackapi ) এর জন্য নতুন নির্ভরতা যোগ করতে হবে:

uv add langchain-community==0.3.27 stackapi==0.3.1

LangChain StackExchange টুলের জন্য সমর্থন যোগ করতে tools.py ফাইলটি খুলুন।

cloudshell edit software_bug_assistant/tools.py

tools.py এর নিচের অংশে যোগ করুন:

# ----- Example of a Third-Party Tool -----
from google.adk.tools.langchain_tool import LangchainTool
from langchain_community.tools import StackExchangeTool
from langchain_community.utilities import StackExchangeAPIWrapper

stack_exchange_tool = StackExchangeTool(api_wrapper=StackExchangeAPIWrapper())
langchain_tool = LangchainTool(stack_exchange_tool)

এখন আমরা agent.py এ রুট এজেন্টে langchain_tool আমদানি এবং পাস করতে পারি:

cloudshell edit software_bug_assistant/agent.py

আপনি langchain_tool অন্তর্ভুক্ত করতে নিম্নলিখিত কোড দিয়ে agent.py প্রতিস্থাপন করতে পারেন:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, search_tool

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool],
)

ফাইলটি সংরক্ষণ করুন এবং ADK ওয়েব UI এর সাথে আপনার খোলা ট্যাবে ফিরে যান।

এজেন্টকে আগের CVE সম্পর্কে কিছু জিজ্ঞাসা করার চেষ্টা করুন, "Are there similar issues on stack exchange?" বা নতুন কিছু যেমন "Our database queries with SQLAlchemy seem to be timing out, is there anything on StackExchange relevant to this?" .

ADK ওয়েব থার্ড-পার্টি টুলের উদাহরণ

আমাদের এজেন্ট এখন সফলভাবে ADK-এ একটি LangChain টুল ব্যবহার করেছে যাতে StackOverflow কে জিজ্ঞাসা করা যায়। 🥳

পরবর্তী ADK টুল টাইপের জন্য সময়... MCP টুলস!

9. MCP টুল (ডাটাবেস)

MCP মানে মডেল প্রসঙ্গ প্রোটোকল । এটি একটি উন্মুক্ত প্রোটোকল যা 2024 সালে Anthropic দ্বারা প্রবর্তিত হয়েছিল ৷ MCP আপনার AI এজেন্ট এবং টুল "ব্যাকএন্ড" (APIs, ডেটাবেস) এর মধ্যে একটি বিমূর্ত স্তর প্রদান করে৷

কিভাবে MCP কাজ করে

MCP এর কিছু অনন্য বৈশিষ্ট্য রয়েছে। স্ট্যান্ডার্ড HTTP থেকে ভিন্ন, MCP ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি রাষ্ট্রীয়, দ্বি-মুখী সংযোগ প্রদান করে। এটির সরঞ্জাম এবং টুল-নির্দিষ্ট ত্রুটি বার্তা সংজ্ঞায়িত করার নিজস্ব উপায় রয়েছে। একটি টুল প্রদানকারী তারপর তাদের API-এর উপরে MCP সার্ভার তৈরি করতে পারে, ডেভেলপার এবং ব্যবহারকারীদের জন্য এক বা একাধিক পূর্বনির্মাণ সরঞ্জামগুলিকে প্রকাশ করে। তারপর, এজেন্ট ফ্রেমওয়ার্ক একটি এজেন্ট অ্যাপ্লিকেশনের ভিতরে MCP ক্লায়েন্ট শুরু করতে পারে, সেই টুলগুলিকে আবিষ্কার করতে এবং কল করতে।

QuantumRoast-এ, অভ্যন্তরীণ সফ্টওয়্যার বাগগুলির জন্য PostgreSQL ডাটাবেসের জন্য আমাদের কাছে একটি ক্লাউড SQL আছে। আমরা ADK টুল তৈরি করতে চাই যাতে আমাদের এজেন্ট আমাদের ডাটাবেসে নির্দিষ্ট কিছু প্রশ্ন করতে পারে।

MCP টুল ডাটাবেস

এটি করার সবচেয়ে সহজ উপায় হল ডাটাবেসের জন্য MCP টুলবক্স , ডাটাবেসের জন্য একটি ওপেন সোর্স MCP সার্ভার! টুলবক্স 15+ ডেটাবেস সমর্থন করে, যার মধ্যে একটি হল ক্লাউড এসকিউএল!

টুলবক্স প্রদান করে:

  • সরলীকৃত বিকাশ : আপনার এজেন্টের সাথে 10 লাইনের কম কোডে সরঞ্জামগুলিকে একীভূত করুন, একাধিক এজেন্ট বা ফ্রেমওয়ার্কের মধ্যে সরঞ্জামগুলি পুনরায় ব্যবহার করুন এবং আরও সহজে সরঞ্জামগুলির নতুন সংস্করণ স্থাপন করুন৷
  • আরও ভালো কর্মক্ষমতা : সর্বোত্তম অনুশীলন যেমন সংযোগ পুলিং, প্রমাণীকরণ এবং আরও অনেক কিছু।
  • বর্ধিত নিরাপত্তা : আপনার ডেটাতে আরও নিরাপদ অ্যাক্সেসের জন্য সমন্বিত প্রমাণীকরণ
  • এন্ড-টু-এন্ড পর্যবেক্ষণযোগ্যতা : ওপেনটেলিমেট্রির জন্য অন্তর্নির্মিত সমর্থন সহ বাক্সের বাইরের মেট্রিক্স এবং ট্রেসিং।

ADK ডেটাবেস সরঞ্জামগুলির জন্য MCP টুলবক্সের জন্য সমর্থন করে যা দ্রুত একীভূত করে।

ডাটাবেসের জন্য MCP টুলবক্স

ক্লাউড রানে ডাটাবেস সার্ভারের জন্য MCP টুলবক্স স্থাপন করুন

প্রথমত, আমরা ক্লাউড রানে ডাটাবেস সার্ভারের জন্য এমসিপি টুলবক্স স্থাপন করব এবং এটিকে আমাদের ক্লাউড এসকিউএল ইনস্ট্যান্সে নির্দেশ করব।

টুলবক্স কনফিগারেশনের জন্য একটি YAML ফাইলের প্রয়োজন, যেখানে আপনি ডাটাবেস উৎস এবং কনফিগার করার জন্য সরঞ্জামগুলির রূপরেখা দেন।

স্থাপনার জন্য একটি tools.yaml ফাইল তৈরি করুন।

cloudshell edit tools.yaml

tools.yaml এ নিম্নলিখিত বিষয়বস্তু পেস্ট করুন:

sources:
  postgresql:
    kind: cloud-sql-postgres
    project: ${PROJECT_ID}
    region: us-central1
    instance: software-assistant
    database: tickets-db
    user: postgres
    password: admin

tools:
  search-tickets:
    kind: postgres-sql
    source: postgresql
    description: Search for similar tickets based on their descriptions.
    parameters:
      - name: query
        type: string
        description: The query to perform vector search with.
    statement: |
      SELECT ticket_id, title, description, assignee, priority, status, (embedding <=> embedding('text-embedding-005', $1)::vector) as distance
      FROM tickets
      ORDER BY distance ASC
      LIMIT 3;
  get-ticket-by-id:
    kind: postgres-sql
    source: postgresql
    description: Retrieve a ticket's details using its unique ID.
    parameters:
      - name: ticket_id
        type: string
        description: The unique ID of the ticket.
    statement: SELECT * FROM tickets WHERE ticket_id = $1;
  get-tickets-by-assignee:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on assignee (email).
    parameters:
      - name: assignee
        type: string
        description: The email of the assignee.
    statement: SELECT * FROM tickets WHERE assignee ILIKE '%' || $1 || '%';
  update-ticket-priority:
    kind: postgres-sql
    source: postgresql
    description: Update the priority of a ticket based on its ID.
    parameters:
      - name: priority
        type: string
        description: The priority of the ticket. Can be one of 'P0 - Critical', 'P1 - High', 'P2 - Medium', or 'P3 - Low'.
      - name: ticket_id
        type: string
        description: The ID of the ticket.
    statement: UPDATE tickets SET priority = $1 WHERE ticket_id = $2;
  update-ticket-status:
    kind: postgres-sql
    source: postgresql
    description: Update the status of a ticket based on its ID.
    parameters:
      - name: status
        type: string
        description: The new status of the ticket (e.g., 'Open', 'In Progress', 'Closed', 'Resolved').
      - name: ticket_id
        type: string
        description: The ID of the ticket.
    statement: UPDATE tickets SET status = $1 WHERE ticket_id = $2;
  get-tickets-by-status:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on their current status.
    parameters:
      - name: status
        type: string
        description: The status of the tickets to retrieve (e.g., 'Open', 'In Progress', 'Closed', 'Resolved').
    statement: SELECT * FROM tickets WHERE status ILIKE '%' || $1 || '%';
  get-tickets-by-priority:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on their priority.
    parameters:
      - name: priority
        type: string
        description: The priority of the tickets to retrieve (e.g., 'P0 - Critical', 'P1 - High', 'P2 - Medium', 'P3 - Low').
    statement: SELECT * FROM tickets WHERE priority ILIKE '%' || $1 || '%';
  create-new-ticket:
    kind: postgres-sql
    source: postgresql
    description: Create a new software ticket.
    parameters:
      - name: title
        type: string
        description: The title of the new ticket.
      - name: description
        type: string
        description: A detailed description of the bug or issue.
      - name: assignee
        type: string
        description: (Optional) The email of the person to whom the ticket should be assigned.
      - name: priority
        type: string
        description: (Optional) The priority of the ticket. Can be 'P0 - Critical', 'P1 - High', 'P2 - Medium', or 'P3 - Low'. Default is 'P3 - Low'.
      - name: status
        type: string
        description: (Optional) The initial status of the ticket. Default is 'Open'.
    statement: INSERT INTO tickets (title, description, assignee, priority, status) VALUES ($1, $2, $3, COALESCE($4, 'P3 - Low'), COALESCE($5, 'Open')) RETURNING ticket_id;
  get-tickets-by-date-range:
    kind: postgres-sql
    source: postgresql
    description: Retrieve tickets created or updated within a specific date range.
    parameters:
      - name: start_date
        type: string
        description: The start date (inclusive) for the range (e.g., 'YYYY-MM-DD').
      - name: end_date
        type: string
        description: The end date (inclusive) for the range (e.g., 'YYYY-MM-DD').
      - name: date_field
        type: string
        description: The date field to filter by ('creation_time' or 'updated_time').
    statement: SELECT * FROM tickets WHERE CASE WHEN $3 = 'creation_time' THEN creation_time ELSE updated_time END BETWEEN $1::timestamp AND $2::timestamp;

toolsets:
  tickets_toolset:
    - search-tickets
    - get-ticket-by-id
    - get-tickets-by-assignee
    - get-tickets-by-status
    - get-tickets-by-priority
    - get-tickets-by-date-range
    - update-ticket-priority
    - update-ticket-status
    - create-new-ticket

YAML ফাইলটি QuantumRoast টিকেট ডাটাবেসের সাথে সম্পর্কিত 9টি টুলকে সংজ্ঞায়িত করে।

টুলবক্স ক্লাউড রান পরিষেবার জন্য একটি পরিষেবা অ্যাকাউন্ট কনফিগার করার সময়, এটিকে ক্লাউড এসকিউএল এবং সিক্রেট ম্যানেজার অ্যাক্সেস করার অনুমতি দিন এবং আমাদের tools.yaml ফাইলের জন্য একটি সিক্রেট ম্যানেজার সিক্রেট তৈরি করুন৷

সিক্রেট ম্যানেজার হল যেখানে আমরা আমাদের tools.yaml ফাইল সংরক্ষণ করব কারণ এতে সংবেদনশীল ক্লাউড SQL শংসাপত্র রয়েছে৷

gcloud iam service-accounts create toolbox-identity

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/secretmanager.secretAccessor

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudsql.client

gcloud secrets create tools --data-file=tools.yaml

ক্লাউড রানে ডাটাবেসের জন্য MCP টুলবক্স স্থাপন করার সময়। আমরা MCP টুলবক্স কন্টেইনার ইমেজের সর্বশেষ রিলিজ সংস্করণ ব্যবহার করব।

gcloud run deploy toolbox \
    --image us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools:latest" \
    --set-env-vars="PROJECT_ID=$PROJECT_ID" \
    --args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --allow-unauthenticated

স্থাপনা শেষ হওয়ার জন্য অপেক্ষা করুন...

ক্লাউড রান লগগুলি জিজ্ঞাসা করে টুলবক্স চলছে কিনা তা যাচাই করুন:

gcloud run services logs read toolbox --region us-central1 --limit 10

আপনি দেখতে হবে:

2025-08-20 18:03:55 2025-08-20T18:03:55.465847801Z INFO "Initialized 1 sources."
2025-08-20 18:03:55 2025-08-20T18:03:55.466152914Z INFO "Initialized 0 authServices."
2025-08-20 18:03:55 2025-08-20T18:03:55.466374245Z INFO "Initialized 9 tools."
2025-08-20 18:03:55 2025-08-20T18:03:55.466477938Z INFO "Initialized 2 toolsets."
2025-08-20 18:03:55 2025-08-20T18:03:55.467492303Z INFO "Server ready to serve!"

টুলবক্স পরিষেবার জন্য ক্লাউড রান URL একটি পরিবেশ পরিবর্তনশীল হিসাবে সংরক্ষণ করুন যাতে ADK এজেন্ট এটি কোথায় খুঁজে পেতে পারে তা জানে৷

export MCP_TOOLBOX_URL=$(gcloud run services describe toolbox --region us-central1 --format "value(status.url)")
echo MCP_TOOLBOX_URL=$MCP_TOOLBOX_URL >> software_bug_assistant/.env

QuantumRoast এজেন্ট আপডেট করুন

দ্বিতীয়ত, আমাদের প্রকল্পে ডাটাবেস SDK ( toolbox-core ) এর জন্য MCP টুলবক্সের নির্ভরতা যোগ করতে হবে:

uv add toolbox-core==0.5.0

MCP টুলবক্স টুলগুলির জন্য সমর্থন যোগ করতে tools.py ফাইলটি খুলুন।

cloudshell edit software_bug_assistant/tools.py

tools.py এর নিচের অংশে যোগ করুন:

# ----- Example MCP Toolbox for Databases tools -----
import os
from toolbox_core import ToolboxSyncClient

TOOLBOX_URL = os.getenv("MCP_TOOLBOX_URL", "http://127.0.0.1:5000")

# Initialize Toolbox client
toolbox = ToolboxSyncClient(TOOLBOX_URL)
# Load all the tools from toolset
toolbox_tools = toolbox.load_toolset("tickets_toolset")

এখন আমরা agent.py এ রুট এজেন্টের কাছে toolbox_tools আমদানি এবং পাস করতে পারি:

cloudshell edit software_bug_assistant/agent.py

আপনি toolbox_tools অন্তর্ভুক্ত করতে নিম্নলিখিত কোড দিয়ে agent.py প্রতিস্থাপন করতে পারেন:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, search_tool, toolbox_tools

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool, *toolbox_tools],
)

ফাইলটি সংরক্ষণ করুন এবং ADK ওয়েব UI এর সাথে আপনার খোলা ট্যাবে ফিরে যান।

আপনি এখন আমাদের ক্লাউড এসকিউএল অভ্যন্তরীণ টিকিট ডাটাবেসে সংরক্ষিত টিকিট সম্পর্কে প্রশ্ন করতে পারেন!

নিম্নলিখিতগুলির মধ্যে একটির মত একটি প্রশ্ন জিজ্ঞাসা করুন:

  • I am seeing an issue with database timeouts, has anyone else seen a similar issue?
  • How many bugs are assigned to samuel.green@example.com? Show a table.
  • Can you bump the priority of ticket with ID 6 to to P0 - Critical priority
  • Create a new ticket (এজেন্টকে বাগ তৈরির মাধ্যমে আপনাকে গাইড করতে দিন)

MCP ডাটাবেস টুল উদাহরণ

আমাদের ADK এজেন্ট এখন সফলভাবে ডাটাবেস টুলের জন্য MCP টুলবক্সের মাধ্যমে আমাদের ডাটাবেস অনুসন্ধান করেছে!🚀

10. ঐচ্ছিক: MCP টুল (API)

আমাদের ADK এজেন্টকে MCP টুলের সাথে সংযুক্ত করার বিষয়ে কি হবে যাদের নিজস্ব SDK নেই যেমন MCP টুলবক্স ফর ডাটাবেস করে?

ADK এর MCPToolset ক্লাসের মাধ্যমে জেনেরিক MCP টুল সমর্থন করে। MCPToolset ক্লাস হল একটি MCP সার্ভার থেকে টুল একত্রিত করার জন্য ADK-এর প্রাথমিক প্রক্রিয়া।

MCP টুল (API)

MCPToolset স্থানীয় বা দূরবর্তী MCP সার্ভারের সাথে সংযোগ করতে ব্যবহার করা যেতে পারে, QuantumRoast-এ আমরা আমাদের এজেন্টকে GitHub-এর দূরবর্তী MCP সার্ভারের সাথে সংযোগ করতে চাই — সহজেই GitHub-এর API-কে কল করতে। এটি আমাদের এজেন্টকে পাবলিক সফ্টওয়্যার সংগ্রহস্থল বা এমনকি আমাদের নিজস্ব কোডবেস থেকে সমস্যাগুলির তথ্য টেনে আনতে অনুমতি দেবে। গিটহাব এমসিপি সার্ভারটি গিটহাবের কার্যকারিতার বিভিন্ন অংশ প্রকাশ করে, ইস্যু এবং পুল অনুরোধ থেকে শুরু করে বিজ্ঞপ্তি এবং কোড সুরক্ষা পর্যন্ত।

এমসিপি টুল গিটহাব

GitHub ব্যক্তিগত অ্যাক্সেস টোকেন (PAT)

GitHub MCP সার্ভারের সাথে প্রমাণীকরণ করতে, আপনার একটি GitHub ব্যক্তিগত অ্যাক্সেস টোকেন প্রয়োজন।

একটি অর্জন করার জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার GitHub বিকাশকারী সেটিংসে যান।
  2. "ব্যক্তিগত অ্যাক্সেস টোকেন" -> "টোকেন (ক্লাসিক)" এ ক্লিক করুন।
  3. "নতুন টোকেন তৈরি করুন" -> "নতুন টোকেন তৈরি করুন (ক্লাসিক)" এ ক্লিক করুন।
  4. আপনার টোকেনকে একটি বর্ণনামূলক নাম দিন।
  5. আপনার টোকেনের জন্য মেয়াদ শেষ হওয়ার তারিখ সেট করুন।
  6. গুরুত্বপূর্ণ : নিরাপত্তার জন্য, আপনার টোকেনকে প্রয়োজনীয় সর্বাধিক সীমিত সুযোগ দিন। সংগ্রহস্থলগুলিতে শুধুমাত্র-পঠন অ্যাক্সেসের জন্য, repo:status , public_repo , এবং read:user স্কোপগুলি প্রায়ই যথেষ্ট। একেবারে প্রয়োজনীয় না হলে সম্পূর্ণ সংগ্রহস্থল বা প্রশাসকের অনুমতি দেওয়া এড়িয়ে চলুন।
  7. Generate token ক্লিক করুন।
  8. জেনারেট করা টোকেন কপি করুন।

ক্লাউড শেল টার্মিনালে, এজেন্ট ব্যবহার করতে সক্ষম হওয়ার জন্য আপনার GitHub PAT সেট করতে নিম্নলিখিতটি চালান। আপনার তৈরি করা PAT দিয়ে YOUR_GITHUB_PAT প্রতিস্থাপন করুন।

export GITHUB_PAT=YOUR_GITHUB_PAT

QuantumRoast এজেন্ট আপডেট করুন

আমাদের বাগ সহকারীর জন্য, আমরা QuantumRoast কর্মীদের ওপেন-সোর্স নির্ভরতা সম্পর্কিত সমস্যাগুলি খুঁজে বের করার অনুমতি দেওয়ার জন্য শুধুমাত্র কিছু পঠনযোগ্য GitHub সরঞ্জামগুলিকে প্রকাশ করব, এটি দেখতে সাহায্য করতে পারে যে তারা অভ্যন্তরীণ টিকিট সিস্টেমে মূল-কারণ বাগগুলি দেখছে কিনা। এটি সেট আপ করতে আমরা একটি tool_filter সহ ADK এর MCPToolset ব্যবহার করব। tool-filter আমাদের প্রয়োজন শুধুমাত্র GitHub টুলগুলিকে প্রকাশ করে, যা শুধুমাত্র সেই টুলগুলিকে লুকিয়ে রাখে যা আমরা ব্যবহারকারীদের অ্যাক্সেস করতে চাই না (মনে করুন: সংবেদনশীল রিপোজিটরি অ্যাকশন), কিন্তু কাজের জন্য সঠিক টুল বেছে নেওয়ার চেষ্টা করার সময় এজেন্টের মডেলকে অভিভূত হওয়া থেকে রক্ষা করে।

GitHub টুলগুলির জন্য সমর্থন যোগ করতে tools.py ফাইলটি খুলুন।

cloudshell edit software_bug_assistant/tools.py

tools.py এর নিচের অংশে যোগ করুন:

# ----- Example MCP Tools with MCPToolset (GitHub) -----
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams

mcp_tools = MCPToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://api.githubcopilot.com/mcp/",
        headers={
            "Authorization": "Bearer " + os.getenv("GITHUB_PAT"),
        },
    ),
    # Read only tools
    tool_filter=[
        "search_repositories",
        "search_issues",
        "list_issues",
        "get_issue",
        "list_pull_requests",
        "get_pull_request",
    ],
)

নোট করুন কিভাবে আমাদের MCPToolset সংজ্ঞাতে GitHub পার্সোনাল অ্যাক্সেস টোকেন (PAT) প্রদান করতে হবে, ঠিক যেমন আপনি আপনার কোডে একটি আদর্শ API ক্লায়েন্ট সেট আপ করার সময় একটি প্রমাণীকরণ টোকেন প্রদান করবেন। এই PAT শুধুমাত্র পাবলিক রিপোজিটরি ডেটা অ্যাক্সেস করার জন্য স্কোপ করা হয়েছে, সংবেদনশীল ব্যবহারকারী বা রিপোজিটরি অ্যাকশনের আশেপাশে কোনো সুযোগ নেই।

এখন আমরা agent.py এ রুট এজেন্টের কাছে mcp_tools আমদানি এবং পাস করতে পারি:

cloudshell edit software_bug_assistant/agent.py

আপনি mcp_tools অন্তর্ভুক্ত করতে নিম্নলিখিত কোড দিয়ে agent.py প্রতিস্থাপন করতে পারেন:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, mcp_tools, search_tool, toolbox_tools

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool, *toolbox_tools, mcp_tools],
)

ফাইলটি সংরক্ষণ করুন এবং ADK ওয়েব UI এর সাথে আপনার খোলা ট্যাবে ফিরে যান।

এখন, আমাদের কাছে গিটহাব এমসিপি সরঞ্জামগুলির একটি সেট রয়েছে যা আমাদের এজেন্ট কল করতে পারে। QuantumRoast-এর পরিষেবাগুলি XZ utils-এর উপর নির্ভর করে, একটি ডেটা কম্প্রেশন টুল । আমাদের অভ্যন্তরীণ বাগ টিকিট সিস্টেম গত বছর থেকে একটি CVE (নিরাপত্তা দুর্বলতা) ট্র্যাক করছে, যা আমরা StackOverflow এবং Google অনুসন্ধান টুল ব্যবহার করে XZ Utils GitHub সংগ্রহস্থলে ফিরে আসতে পারি। সেই CVE কখন এবং কিভাবে প্যাচ করা হয়েছিল তা নির্ধারণ করতে আমরা তখন GitHub-এর MCP টুলগুলির একটি, search_issues ব্যবহার করতে পারি:

এজেন্টকে নিম্নলিখিতগুলি জিজ্ঞাসা করুন:

  • Find the official XZ Utils GitHub repository
  • Search the repository for issues related to CVE-2024-3094

আপনার এজেন্ট দ্বারা কল করা গিটহাব সরঞ্জামগুলি দেখতে হবে।

এমসিপি টুলস গিটহাবের উদাহরণ

QuantumRoast ADK এজেন্ট এখন GitHub MCP সার্ভার টুলের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম! 🤩

11. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে QuantumRoast বাগ সহকারী এজেন্ট তৈরি করেছেন এবং এর ক্ষমতা বাড়ানোর জন্য বিভিন্ন ধরনের টুল একত্রিত করেছেন। আপনি একটি মৌলিক এজেন্ট দিয়ে শুরু করেছেন এবং ক্রমান্বয়ে যুক্ত করেছেন ফাংশন টুলস, বিল্ট-ইন টুলস, থার্ড-পার্টি টুলস এবং MCP টুলস।

আমরা কভার করেছি কি

  • কিভাবে ADK উন্নয়নের জন্য একটি পাইথন প্রকল্প সেট আপ করবেন।
  • কিভাবে একটি মৌলিক ADK এজেন্ট তৈরি করবেন।
  • কিভাবে ফাংশন টুল বাস্তবায়ন এবং ব্যবহার করতে হয়।
  • গুগল সার্চের মতো বিল্ট-ইন টুলগুলোকে কিভাবে ইন্টিগ্রেট করা যায়।
  • কিভাবে ADK-এর মধ্যে LangChain-এর মতো ফ্রেমওয়ার্ক থেকে থার্ড-পার্টি টুলস ব্যবহার করা যায়।
  • ডাটাবেস (ক্লাউড এসকিউএল) এবং এপিআইগুলির সাথে ইন্টারঅ্যাক্ট করতে MCP সরঞ্জামগুলি কীভাবে ব্যবহার করবেন।

কোয়ান্টাম রোস্ট ফাইনাল

ক্লিনআপ

অতিরিক্ত চার্জ এড়াতে আপনি আপনার ক্লাউড প্রকল্প মুছে ফেলতে পারেন।

পরিষেবাটি ব্যবহার না হলে ক্লাউড রান চার্জ না করলেও, আর্টিফ্যাক্ট রেজিস্ট্রিতে কন্টেইনার ইমেজ সংরক্ষণ করার জন্য আপনাকে চার্জ করা হতে পারে। আপনার ক্লাউড প্রকল্প মুছে ফেলা সেই প্রকল্পের মধ্যে ব্যবহৃত সমস্ত সংস্থানের জন্য বিলিং বন্ধ করে দেয়।

আপনি যদি চান, প্রকল্প মুছে ফেলুন:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

আপনি আপনার ক্লাউডশেল ডিস্ক থেকে অপ্রয়োজনীয় সংস্থানগুলিও মুছতে চাইতে পারেন। আপনি করতে পারেন:

  1. কোডল্যাব প্রকল্প ডিরেক্টরি মুছুন:
    rm -rf ~/quantum-roast
    
  2. সতর্কতা ! এই পরবর্তী ক্রিয়াটি পূর্বাবস্থায় ফেরানো যাবে না! আপনি যদি স্থান খালি করতে আপনার ক্লাউড শেলের সবকিছু মুছতে চান, তাহলে আপনি আপনার পুরো হোম ডিরেক্টরি মুছে ফেলতে পারেন। সতর্ক থাকুন যে আপনি যা কিছু রাখতে চান তা অন্য কোথাও সংরক্ষণ করা হয়।
    sudo rm -rf $HOME