চিন্তা মোড সহ ADK, MCP, এবং Gemini 2.5 Flash ব্যবহার করে QA টেস্ট প্ল্যানার এজেন্ট তৈরি করুন

1. ভূমিকা

fd4ad67ab57d9257.png

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

এই কোডল্যাবে, আমরা অন্বেষণ করব কীভাবে এমন একটি এজেন্ট তৈরি করা যায় যা কনফ্লুয়েন্স থেকে পণ্যের প্রয়োজনীয় নথিগুলি পুনরুদ্ধার করতে পারে এবং গঠনমূলক প্রতিক্রিয়া দিতে সক্ষম এবং একটি বিস্তৃত পরীক্ষা পরিকল্পনা তৈরি করতে পারে যা একটি CSV ফাইলে রপ্তানি করা যেতে পারে।

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

  1. আপনার Google ক্লাউড প্রকল্প প্রস্তুত করুন এবং এতে প্রয়োজনীয় সমস্ত API সক্ষম করুন৷
  2. আপনার কোডিং পরিবেশের জন্য ওয়ার্কস্পেস সেটআপ করুন
  3. সঙ্গমের জন্য স্থানীয় mcp-সার্ভার প্রস্তুত করা হচ্ছে
  4. MCP সার্ভারের সাথে সংযোগ করার জন্য ADK এজেন্ট সোর্স কোড, প্রম্পট এবং সরঞ্জামগুলি গঠন করা
  5. আর্টিফ্যাক্ট পরিষেবা এবং টুল প্রসঙ্গগুলির ব্যবহার বোঝা
  6. ADK স্থানীয় ওয়েব ডেভেলপমেন্ট UI ব্যবহার করে এজেন্ট পরীক্ষা করা হচ্ছে
  7. ক্লাউড রানে অ্যাপ্লিকেশনটি স্থাপন করার জন্য প্রয়োজনীয় পরিবেশের ভেরিয়েবল এবং সেটআপ প্রয়োজনীয় ফাইলগুলি পরিচালনা করুন৷
  8. ক্লাউড রানে অ্যাপ্লিকেশনটি স্থাপন করুন

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

819179179d974c07.jpeg

পূর্বশর্ত

  • পাইথনের সাথে কাজ করা আরামদায়ক
  • HTTP পরিষেবা ব্যবহার করে মৌলিক ফুল-স্ট্যাক আর্কিটেকচারের একটি বোঝাপড়া

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

  • ADK এজেন্টের আর্কিটেক্টিং এর বিভিন্ন ক্ষমতা ব্যবহার করার সময়
  • কাস্টম টুল এবং MCP সহ টুল ব্যবহার
  • আর্টিফ্যাক্ট সার্ভিস ম্যানেজমেন্ট ব্যবহার করে এজেন্ট দ্বারা ফাইল আউটপুট সেট আপ করা
  • জেমিনি 2.5 ফ্ল্যাশ চিন্তা করার ক্ষমতার সাথে পরিকল্পনা করে টাস্ক এক্সিকিউশন উন্নত করতে বিল্টইনপ্ল্যানার ব্যবহার করা
  • ADK ওয়েব ইন্টারফেসের মাধ্যমে মিথস্ক্রিয়া এবং ডিবাগিং
  • ডকারফাইল ব্যবহার করে ক্লাউড রানে অ্যাপ্লিকেশন স্থাপন করুন এবং পরিবেশের ভেরিয়েবল সরবরাহ করুন

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

  • ক্রোম ওয়েব ব্রাউজার
  • একটি জিমেইল অ্যাকাউন্ট
  • বিলিং সক্ষম সহ একটি ক্লাউড প্রকল্প৷
  • (ঐচ্ছিক) পণ্যের প্রয়োজনীয় নথির পৃষ্ঠার সাথে সঙ্গম স্থান

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

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

ক্লাউড কনসোলে সক্রিয় প্রকল্প নির্বাচন করুন

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

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

3a29a3ec1306e9b4.png

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

  1. আপনি Cloud Shell ব্যবহার করবেন, Google ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে সক্রিয় ক্লাউড শেল ক্লিক করুন।

1829c3759227c19b.png

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

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

4032c45803813f30.jpeg

এটিতে ক্লিক করুন এবং আপনি আপনার সমস্ত প্রকল্প এবং প্রকল্প আইডি ডানদিকে পাবেন

8dc17eb4271de6b5.jpeg

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

কমান্ডের সফল সঞ্চালন হলে, আপনি নীচের দেখানো একটি অনুরূপ একটি বার্তা দেখতে হবে:

Operation "operations/..." finished successfully.

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

যদি কোনো API মিস হয়, আপনি সর্বদা বাস্তবায়নের সময় এটি সক্রিয় করতে পারেন।

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

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

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

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

f5003b9c38b43262.png

  1. এর পরে, আসুন Github থেকে এই কোডল্যাবের জন্য টেমপ্লেট ওয়ার্কিং ডিরেক্টরি ক্লোন করি, নিম্নলিখিত কমান্ডটি চালান। এটি qa-test-planner-agent ডিরেক্টরিতে কাজের ডিরেক্টরি তৈরি করবে
git clone https://github.com/alphinside/qa-test-planner-agent.git qa-test-planner-agent
  1. এর পরে, ক্লাউড শেল এডিটরের উপরের বিভাগে যান এবং ফাইল->ফোল্ডার খুলুন ক্লিক করুন, আপনার ব্যবহারকারীর নাম ডিরেক্টরি খুঁজুন এবং qa-test-planner-agent ডিরেক্টরি খুঁজুন তারপর ওকে বোতামে ক্লিক করুন। এটি নির্বাচিত ডিরেক্টরিটিকে প্রধান কার্যকারী ডিরেক্টরি হিসাবে তৈরি করবে। এই উদাহরণে, ব্যবহারকারীর নাম হল alvinprayuda , তাই ডিরেক্টরির পথটি নীচে দেখানো হয়েছে

2c53696f81d805cc.png

fb321426f3c848b3.png

এখন, আপনার ক্লাউড শেল এডিটর দেখতে এইরকম হওয়া উচিত

9ae344bc522d2a6f.png

এনভায়রনমেন্ট সেটআপ

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

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

  1. আপনি যদি এখনও টার্মিনাল না খুলে থাকেন, তাহলে টার্মিনাল -> নিউ টার্মিনাল- এ ক্লিক করে এটি খুলুন, অথবা Ctrl + Shift + C ব্যবহার করুন, এটি ব্রাউজারের নীচের অংশে একটি টার্মিনাল উইন্ডো খুলবে।

f8457daf0bed059e.jpeg

  1. uv ডাউনলোড করুন এবং নিম্নলিখিত কমান্ড দিয়ে পাইথন 3.12 ইনস্টল করুন
curl -LsSf https://astral.sh/uv/0.7.19/install.sh | sh && \
source $HOME/.local/bin/env && \
uv python install 3.12
  1. এখন uv ব্যবহার করে ভার্চুয়াল পরিবেশ শুরু করা যাক, এই কমান্ডটি চালান
uv sync --frozen

এটি .venv ডিরেক্টরি তৈরি করবে এবং নির্ভরতাগুলি ইনস্টল করবে। pyproject.toml- এ দ্রুত স্নিক পিক আপনাকে এইভাবে দেখানো নির্ভরতা সম্পর্কে তথ্য দেবে

dependencies = [
    "google-adk>=1.5.0",
    "mcp-atlassian>=0.11.9",
    "pandas>=2.3.0",
    "python-dotenv>=1.1.1",
]
  1. ভার্চুয়াল env পরীক্ষা করতে, নতুন ফাইল main.py তৈরি করুন এবং নিম্নলিখিত কোডটি অনুলিপি করুন
def main():
   print("Hello from qa-test-planner-agent")

if __name__ == "__main__":
   main()
  1. তারপরে, নিম্নলিখিত কমান্ডটি চালান
uv run main.py

আপনি নিচের মত আউটপুট পাবেন

Using CPython 3.12
Creating virtual environment at: .venv
Hello from qa-test-planner-agent!

এটি দেখায় যে পাইথন প্রকল্পটি সঠিকভাবে সেট আপ করা হচ্ছে।

এখন আমরা পরবর্তী ধাপে যেতে পারি, এজেন্ট তৈরি করতে পারি এবং তারপরে পরিষেবা

3. Google ADK এবং Gemini 2.5 ব্যবহার করে এজেন্ট তৈরি করুন৷

ADK ডিরেক্টরি কাঠামোর ভূমিকা

ADK কী অফার করে এবং কীভাবে এজেন্ট তৈরি করতে হয় তা অন্বেষণ করে শুরু করা যাক। ADK সম্পূর্ণ ডকুমেন্টেশন এই URL এ অ্যাক্সেস করা যেতে পারে। ADK তার CLI কমান্ড এক্সিকিউশনের মধ্যে আমাদের অনেক ইউটিলিটি অফার করে। তাদের মধ্যে কয়েকটি নিম্নরূপ:

  • এজেন্ট ডিরেক্টরি কাঠামো সেটআপ করুন
  • দ্রুত CLI ইনপুট আউটপুট মাধ্যমে মিথস্ক্রিয়া চেষ্টা করুন
  • স্থানীয় উন্নয়ন UI ওয়েব ইন্টারফেস দ্রুত সেটআপ করুন

এখন, CLI কমান্ড ব্যবহার করে এজেন্ট ডিরেক্টরি কাঠামো তৈরি করা যাক। নিম্নলিখিত কমান্ডটি চালান

uv run adk create qa_test_planner \
   --model gemini-2.5-flash \
   --project {your-project-id} \
   --region global

এটি আপনার বর্তমান কাজের ডিরেক্টরিতে নিম্নলিখিত এজেন্ট ডিরেক্টরি কাঠামো তৈরি করবে

qa_test_planner/
├── __init__.py
├── .env
├── agent.py

এবং আপনি init.py এবং agent.py পরিদর্শন করলে আপনি এই কোডটি দেখতে পাবেন

# __init__.py

from . import agent
# agent.py

from google.adk.agents import Agent

root_agent = Agent(
    model='gemini-2.5-flash',
    name='root_agent',
    description='A helpful assistant for user questions.',
    instruction='Answer user questions to the best of your knowledge',
)

আমাদের QA টেস্ট প্ল্যানার এজেন্ট তৈরি করা

আসুন আমাদের QA পরীক্ষা পরিকল্পনাকারী এজেন্ট তৈরি করি! qa_test_planner / agent.py ফাইলটি খুলুন এবং নীচের কোডটি কপি করুন যাতে root_agent থাকবে।

# qa_test_planner/agent.py

from google.adk.agents import Agent
from google.adk.tools.mcp_tool.mcp_toolset import (
    MCPToolset,
    StdioConnectionParams,
    StdioServerParameters,
)
from google.adk.planners import BuiltInPlanner
from google.genai import types
from dotenv import load_dotenv
import os
from pathlib import Path
from pydantic import BaseModel
from typing import Literal
import tempfile
import pandas as pd
from google.adk.tools import ToolContext


load_dotenv(dotenv_path=Path(__file__).parent / ".env")

confluence_tool = MCPToolset(
    connection_params=StdioConnectionParams(
        server_params=StdioServerParameters(
            command="uvx",
            args=[
                "mcp-atlassian",
                f"--confluence-url={os.getenv('CONFLUENCE_URL')}",
                f"--confluence-username={os.getenv('CONFLUENCE_USERNAME')}",
                f"--confluence-token={os.getenv('CONFLUENCE_TOKEN')}",
                "--enabled-tools=confluence_search,confluence_get_page,confluence_get_page_children",
            ],
            env={},
        ),
        timeout=60,
    ),
)


class TestPlan(BaseModel):
    test_case_key: str
    test_type: Literal["manual", "automatic"]
    summary: str
    preconditions: str
    test_steps: str
    expected_result: str
    associated_requirements: str


async def write_test_tool(
    prd_id: str, test_cases: list[dict], tool_context: ToolContext
):
    """A tool to write the test plan into file

    Args:
        prd_id: Product requirement document ID
        test_cases: List of test case dictionaries that should conform to these fields:
            - test_case_key: str
            - test_type: Literal["manual","automatic"]
            - summary: str
            - preconditions: str
            - test_steps: str
            - expected_result: str
            - associated_requirements: str

    Returns:
        A message indicating success or failure of the validation and writing process
    """
    validated_test_cases = []
    validation_errors = []

    # Validate each test case
    for i, test_case in enumerate(test_cases):
        try:
            validated_test_case = TestPlan(**test_case)
            validated_test_cases.append(validated_test_case)
        except Exception as e:
            validation_errors.append(f"Error in test case {i + 1}: {str(e)}")

    # If validation errors exist, return error message
    if validation_errors:
        return {
            "status": "error",
            "message": "Validation failed",
            "errors": validation_errors,
        }

    # Write validated test cases to CSV
    try:
        # Convert validated test cases to a pandas DataFrame
        data = []
        for tc in validated_test_cases:
            data.append(
                {
                    "Test Case ID": tc.test_case_key,
                    "Type": tc.test_type,
                    "Summary": tc.summary,
                    "Preconditions": tc.preconditions,
                    "Test Steps": tc.test_steps,
                    "Expected Result": tc.expected_result,
                    "Associated Requirements": tc.associated_requirements,
                }
            )

        # Create DataFrame from the test case data
        df = pd.DataFrame(data)

        if not df.empty:
            # Create a temporary file with .csv extension
            with tempfile.NamedTemporaryFile(suffix=".csv", delete=False) as temp_file:
                # Write DataFrame to the temporary CSV file
                df.to_csv(temp_file.name, index=False)
                temp_file_path = temp_file.name

            # Read the file bytes from the temporary file
            with open(temp_file_path, "rb") as f:
                file_bytes = f.read()

            # Create an artifact with the file bytes
            await tool_context.save_artifact(
                filename=f"{prd_id}_test_plan.csv",
                artifact=types.Part.from_bytes(data=file_bytes, mime_type="text/csv"),
            )

            # Clean up the temporary file
            os.unlink(temp_file_path)

            return {
                "status": "success",
                "message": (
                    f"Successfully wrote {len(validated_test_cases)} test cases to "
                    f"CSV file: {prd_id}_test_plan.csv"
                ),
            }
        else:
            return {"status": "warning", "message": "No test cases to write"}
    except Exception as e:
        return {
            "status": "error",
            "message": f"An error occurred while writing to CSV: {str(e)}",
        }


root_agent = Agent(
    model="gemini-2.5-flash",
    name="qa_test_planner_agent",
    description="You are an expert QA Test Planner and Product Manager assistant",
    instruction=f"""
Help user search any product requirement documents on Confluence. Furthermore you also can provide the following capabilities when asked:
- evaluate product requirement documents and assess it, then give expert input on what can be improved 
- create a comprehensive test plan following Jira Xray mandatory field formatting, result showed as markdown table. Each test plan must also have explicit mapping on 
    which user stories or requirements identifier it's associated to 

Here is the Confluence space ID with it's respective document grouping:

- "{os.getenv("CONFLUENCE_PRD_SPACE_ID")}" : space to store Product Requirements Documents

Do not making things up, Always stick to the fact based on data you retrieve via tools.
""",
    tools=[confluence_tool, write_test_tool],
    planner=BuiltInPlanner(
        thinking_config=types.ThinkingConfig(
            include_thoughts=True,
            thinking_budget=2048,
        )
    ),
)

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

এখন আমাদের এই প্রকল্পের জন্য অতিরিক্ত কনফিগারেশন সেটআপ যোগ করতে হবে, কারণ এই এজেন্টকে কনফ্লুয়েন্সে অ্যাক্সেসের প্রয়োজন হবে

qa_test_planner/.env খুলুন এবং নিম্নলিখিত এনভায়রনমেন্ট ভেরিয়েবলের মানগুলি এটিতে, নিশ্চিত করুন যে .env ফাইলটি এইরকম দেখাচ্ছে

GOOGLE_GENAI_USE_VERTEXAI=1
GOOGLE_CLOUD_PROJECT={YOUR-CLOUD-PROJECT-ID}
GOOGLE_CLOUD_LOCATION=global
CONFLUENCE_URL={YOUR-CONFLUENCE-DOMAIN}
CONFLUENCE_USERNAME={YOUR-CONFLUENCE-USERNAME}
CONFLUENCE_TOKEN={YOUR-CONFLUENCE-API-TOKEN}
CONFLUENCE_PRD_SPACE_ID={YOUR-CONFLUENCE-SPACE-ID}

দুর্ভাগ্যবশত, এই কনফ্লুয়েন্স স্পেসটি সর্বজনীন করা যাবে না, তাই আপনি উপলব্ধ পণ্যের প্রয়োজনীয় নথিগুলি পড়তে এই ফাইলগুলি পরিদর্শন করতে পারেন যা উপরের শংসাপত্রগুলি ব্যবহার করে উপলব্ধ হবে৷

কোড ব্যাখ্যা

এই স্ক্রিপ্টটিতে আমাদের এজেন্ট সূচনা রয়েছে যেখানে আমরা নিম্নলিখিত জিনিসগুলি শুরু করি:

  • gemini-2.5-flash ব্যবহার করার জন্য মডেল সেট করুন
  • কনফ্লুয়েন্স এমসিপি টুলস সেটআপ করুন যা Stdio এর মাধ্যমে যোগাযোগ করবে
  • পরীক্ষার পরিকল্পনা লিখতে এবং আর্টিফ্যাক্টে CSV ডাম্প করতে write_test_tool কাস্টম টুল সেটআপ করুন
  • এজেন্টের বিবরণ এবং নির্দেশনা সেটআপ করুন
  • জেমিনি 2.5 ফ্ল্যাশ চিন্তা করার ক্ষমতা ব্যবহার করে চূড়ান্ত প্রতিক্রিয়া তৈরি বা সম্পাদন করার আগে পরিকল্পনা সক্ষম করুন

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

# qa-test-planner/agent.py

from google.adk.planners import BuiltInPlanner
from google.genai import types

...

# Provide the confluence tool to agent

root_agent = Agent(
    model="gemini-2.5-flash",
    name="qa_test_planner_agent",
    ...,
    tools=[confluence_tool, write_test_tool],
    planner=BuiltInPlanner(
        thinking_config=types.ThinkingConfig(
            include_thoughts=True,
            thinking_budget=2048,
        )
    ),

...

এবং পদক্ষেপ নেওয়ার আগে, আমরা এটির চিন্তাভাবনা প্রক্রিয়া দেখতে পারি

185371e0e7e5995e.png

সঙ্গম MCP টুল

ADK থেকে MCP সার্ভারের সাথে সংযোগ করতে, আমাদের MCPToolSet ব্যবহার করতে হবে যা google.adk.tools.mcp_tool.mcp_toolset মডিউল থেকে আমদানি করা যেতে পারে। এখানে শুরু করার জন্য কোডটি নীচে দেখানো হয়েছে (দক্ষতার জন্য ছাঁটাই করা হয়েছে)

# qa-test-planner/agent.py

from google.adk.tools.mcp_tool.mcp_toolset import (
    MCPToolset,
    StdioConnectionParams,
    StdioServerParameters,
)

...

# Initialize the Confluence MCP Tool via Stdio Output

confluence_tool = MCPToolset(
    connection_params=StdioConnectionParams(
        server_params=StdioServerParameters(
            command="uvx",
            args=[
                "mcp-atlassian",
                f"--confluence-url={os.getenv('CONFLUENCE_URL')}",
                f"--confluence-username={os.getenv('CONFLUENCE_USERNAME')}",
                f"--confluence-token={os.getenv('CONFLUENCE_TOKEN')}",
                "--enabled-tools=confluence_search,confluence_get_page,confluence_get_page_children",
            ],
            env={},
        ),
        timeout=60,
    ),
)


...

# Provide the confluence tool to agent

root_agent = Agent(
    model="gemini-2.5-flash",
    name="qa_test_planner_agent",
    ...,
    tools=[confluence_tool, write_test_tool],

...

এই কনফিগারেশনের সাথে, এজেন্ট কনফ্লুয়েন্স এমসিপি সার্ভারটিকে একটি পৃথক প্রক্রিয়া হিসাবে শুরু করবে এবং এটি স্টুডিও I/O এর মাধ্যমে সেই প্রক্রিয়াগুলির সাথে যোগাযোগ পরিচালনা করবে। এই প্রবাহটি নীচের লাল বাক্সের ভিতরে চিহ্নিত নিম্নলিখিত MCP আর্কিটেকচার ছবিতে চিত্রিত হয়েছে৷

85d51458405f9217.png

অতিরিক্তভাবে MCP ইনিশিয়ালাইজেশনের কমান্ড আর্গুমেন্টের মধ্যে, আমরা সেই টুলগুলিকেও সীমিত রাখি যেগুলি শুধুমাত্র এই টুলগুলিতে ব্যবহার করা যেতে পারে: confluence_search, confluence_get_page এবং confluence_get_page_children যা আমাদের QA টেস্ট এজেন্ট ব্যবহারের ক্ষেত্রে সমর্থন করে। আমরা এই কোডল্যাব টিউটোরিয়ালের জন্য কমিউনিটি-কন্ট্রিবিউটেড অ্যাটলাসিয়ান এমসিপি সার্ভার (আরো বিশদ বিবরণের জন্য সম্পূর্ণ ডকুমেন্টেশন দেখুন) ব্যবহার করি।

টেস্ট টুল লিখুন

এজেন্ট কনফ্লুয়েন্স এমসিপি টুল থেকে প্রসঙ্গ পাওয়ার পরে, এটি ব্যবহারকারীর জন্য প্রয়োজনীয় পরীক্ষা পরিকল্পনা তৈরি করতে পারে। যাইহোক, আমরা একটি ফাইল তৈরি করতে চাই যাতে এই পরীক্ষার পরিকল্পনা রয়েছে যাতে এটি বজায় রাখা যায় এবং অন্য ব্যক্তির সাথে ভাগ করা যায়। এটি সমর্থন করার জন্য, আমরা নীচের কাস্টম টুল write_test_tool প্রদান করি

# qa-test-planner/agent.py

...

async def write_test_tool(
    prd_id: str, test_cases: list[dict], tool_context: ToolContext
):
    """A tool to write the test plan into file

    Args:
        prd_id: Product requirement document ID
        test_cases: List of test case dictionaries that should conform to these fields:
            - test_case_key: str
            - test_type: Literal["manual","automatic"]
            - summary: str
            - preconditions: str
            - test_steps: str
            - expected_result: str
            - associated_requirements: str

    Returns:
        A message indicating success or failure of the validation and writing process
    """
    validated_test_cases = []
    validation_errors = []

    # Validate each test case
    for i, test_case in enumerate(test_cases):
        try:
            validated_test_case = TestPlan(**test_case)
            validated_test_cases.append(validated_test_case)
        except Exception as e:
            validation_errors.append(f"Error in test case {i + 1}: {str(e)}")

    # If validation errors exist, return error message
    if validation_errors:
        return {
            "status": "error",
            "message": "Validation failed",
            "errors": validation_errors,
        }

    # Write validated test cases to CSV
    try:
        # Convert validated test cases to a pandas DataFrame
        data = []
        for tc in validated_test_cases:
            data.append(
                {
                    "Test Case ID": tc.test_case_key,
                    "Type": tc.test_type,
                    "Summary": tc.summary,
                    "Preconditions": tc.preconditions,
                    "Test Steps": tc.test_steps,
                    "Expected Result": tc.expected_result,
                    "Associated Requirements": tc.associated_requirements,
                }
            )

        # Create DataFrame from the test case data
        df = pd.DataFrame(data)

        if not df.empty:
            # Create a temporary file with .csv extension
            with tempfile.NamedTemporaryFile(suffix=".csv", delete=False) as temp_file:
                # Write DataFrame to the temporary CSV file
                df.to_csv(temp_file.name, index=False)
                temp_file_path = temp_file.name

            # Read the file bytes from the temporary file
            with open(temp_file_path, "rb") as f:
                file_bytes = f.read()

            # Create an artifact with the file bytes
            await tool_context.save_artifact(
                filename=f"{prd_id}_test_plan.csv",
                artifact=types.Part.from_bytes(data=file_bytes, mime_type="text/csv"),
            )

            # Clean up the temporary file
            os.unlink(temp_file_path)

            return {
                "status": "success",
                "message": (
                    f"Successfully wrote {len(validated_test_cases)} test cases to "
                    f"CSV file: {prd_id}_test_plan.csv"
                ),
            }
        else:
            return {"status": "warning", "message": "No test cases to write"}
    except Exception as e:
        return {
            "status": "error",
            "message": f"An error occurred while writing to CSV: {str(e)}",
        }


...

উপরে ঘোষিত ফাংশন নিম্নলিখিত কার্যকারিতা সমর্থন করা হয়:

  1. উত্পাদিত পরীক্ষার পরিকল্পনাটি পরীক্ষা করে দেখুন যাতে এটি বাধ্যতামূলক ক্ষেত্রের স্পেসিফিকেশনের সাথে সামঞ্জস্যপূর্ণ হয়, আমরা পাইডান্টিক মডেল ব্যবহার করে পরীক্ষা করি এবং যদি ত্রুটি ঘটে তবে আমরা এজেন্টকে ত্রুটি বার্তা প্রদান করি।
  2. পান্ডাস কার্যকারিতা ব্যবহার করে ফলাফলটি CSV-এ ডাম্প করুন
  3. তৈরি করা ফাইলটি আর্টিফ্যাক্ট পরিষেবার ক্ষমতা ব্যবহার করে আর্টিফ্যাক্ট হিসাবে সংরক্ষণ করা হয় যা ToolContext অবজেক্ট ব্যবহার করে অ্যাক্সেস করা যেতে পারে যা প্রতিটি টুল কলে অ্যাক্সেস করা যেতে পারে

যদি আমরা জেনারেট করা ফাইলগুলিকে আর্টিফ্যাক্ট হিসাবে সংরক্ষণ করি, তবে এটি ADK রানটাইমে ইভেন্ট হিসাবে চিহ্নিত করা হবে এবং এটি কি পরবর্তীতে ওয়েব ইন্টারফেসে এজেন্ট ইন্টারঅ্যাকশনে প্রদর্শিত হবে?

57f5ab95f4ae86e7.png

এটির সাহায্যে, আমরা ব্যবহারকারীকে দেওয়ার জন্য এজেন্টের কাছ থেকে ফাইল প্রতিক্রিয়া গতিশীলভাবে সেটআপ করতে পারি।

4. এজেন্ট পরীক্ষা করা

এখন CLI এর মাধ্যমে এজেন্টের সাথে যোগাযোগ করার চেষ্টা করা যাক, নিম্নলিখিত কমান্ডটি চালান

uv run adk run qa_test_planner

এটি এইরকম আউটপুট দেখাবে, যেখানে আপনি এজেন্টের সাথে চ্যাট করতে পারেন, তবে আপনি শুধুমাত্র এই ইন্টারফেসের মাধ্যমে পাঠ্য পাঠাতে পারেন

Log setup complete: /tmp/agents_log/agent.xxxx_xxx.log
To access latest log: tail -F /tmp/agents_log/agent.latest.log
Running agent qa_test_planner_agent, type exit to exit.
user: hello
[qa_test_planner_agent]: Hello there! How can I help you today?
user: 

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

uv run adk web --port 8080

এটি নিম্নলিখিত উদাহরণের মতো আউটপুট তৈরি করবে, এর অর্থ হল আমরা ইতিমধ্যে ওয়েব ইন্টারফেস অ্যাক্সেস করতে পারি

INFO:     Started server process [xxxx]
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://0.0.0.0:8080 (Press CTRL+C to quit)

এখন, এটি পরীক্ষা করতে, আপনার ক্লাউড শেল এডিটরের উপরের অংশে ওয়েব প্রিভিউ বোতামে ক্লিক করুন এবং পোর্ট 8080-এ প্রিভিউ নির্বাচন করুন

e7c9f56c2463164.png

আপনি নিম্নলিখিত ওয়েব পৃষ্ঠাটি দেখতে পাবেন যেখানে আপনি উপরের বাম ড্রপ ডাউন বোতামে উপলব্ধ এজেন্ট নির্বাচন করতে পারেন (আমাদের ক্ষেত্রে এটি qa_test_planner হওয়া উচিত) এবং বটের সাথে যোগাযোগ করতে পারেন। আপনি বাম উইন্ডোতে এজেন্ট রানটাইম চলাকালীন লগ বিবরণ সম্পর্কে অনেক তথ্য দেখতে পাবেন

8ed90debb774207f.png

এর কিছু কর্ম চেষ্টা করা যাক! এই প্রম্পট সহ এজেন্টদের সাথে চ্যাট করুন:

  • " অনুগ্রহ করে সমস্ত উপলব্ধ পিআরডি তালিকাভুক্ত করুন "
  • " Snaprecipe PRD এর জন্য পরীক্ষা পরিকল্পনা লিখুন "

যখন এটি কিছু সরঞ্জাম ব্যবহার করে, তখন আপনি উন্নয়ন UI এ কী ঘটছে তা পরিদর্শন করতে পারেন

3469a0785b507be3.png

এজেন্ট আপনাকে কীভাবে সাড়া দেয় তা দেখুন এবং আমরা পরীক্ষা ফাইলের জন্য অনুরোধ জানালে এটি CSV ফাইলে পরীক্ষার পরিকল্পনাটি আর্টিফ্যাক্ট হিসাবে তৈরি করবে

94b73fb4d447ad62.png

এখন, আপনি CSV-এর বিষয়বস্তু যেমন Google Sheet-এ আমদানি করে তা পরীক্ষা করতে পারেন

89e3fc18d6e92d82.png

অভিনন্দন! এখন আপনার কাছে স্থানীয়ভাবে চলমান একটি QA টেস্ট প্ল্যানার এজেন্ট রয়েছে! এখন দেখা যাক কিভাবে আমরা এটিকে ক্লাউড রানে স্থাপন করতে পারি যাতে অন্য লোকেরাও এটি ব্যবহার করতে পারে!

5. ক্লাউড রানে স্থাপন করা হচ্ছে

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

819179179d974c07.jpeg

আপনার বর্তমান কার্যকারী ডিরেক্টরিতে, আমাদের কাছে ইতিমধ্যেই ক্লাউড রানে আমাদের অ্যাপ্লিকেশনগুলি স্থাপন করার জন্য প্রয়োজনীয় সমস্ত ফাইল রয়েছে - এজেন্ট ডিরেক্টরি, Dockerfile, এবং server.py (প্রধান পরিষেবা স্ক্রিপ্ট) , আসুন এটি স্থাপন করি৷ ক্লাউড শেল টার্মিনালে নেভিগেট করুন এবং নিশ্চিত করুন যে বর্তমান প্রকল্পটি আপনার সক্রিয় প্রকল্পে কনফিগার করা হয়েছে, যদি না আপনি প্রকল্প আইডি সেট করতে gcloud configure কমান্ড ব্যবহার করেন:

gcloud config set project [PROJECT_ID]

তারপরে, ক্লাউড রানে এটি স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান।

gcloud run deploy qa-test-planner-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --update-env-vars GOOGLE_GENAI_USE_VERTEXAI=1 \
                  --update-env-vars GOOGLE_CLOUD_PROJECT={YOUR_PROJECT_ID} \
                  --update-env-vars GOOGLE_CLOUD_LOCATION=global \
                  --update-env-vars CONFLUENCE_URL={YOUR_CONFLUENCE_URL} \
                  --update-env-vars CONFLUENCE_USERNAME={YOUR_CONFLUENCE_USERNAME} \
                  --update-env-vars CONFLUENCE_TOKEN={YOUR_CONFLUENCE_TOKEN} \
                  --update-env-vars CONFLUENCE_PRD_SPACE_ID={YOUR_PRD_SPACE_ID} \
                  --memory 1G

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

একবার স্থাপনা সম্পূর্ণ হলে, আপনি নীচের অনুরূপ একটি লিঙ্ক পেতে হবে:

https://qa-test-planner-agent-*******.us-central1.run.app

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

এখন এই ভিন্ন প্রম্পট আবার চেষ্টা করা যাক - ক্রমানুসারে, দেখুন সেখানে কি হয়:

  • "আপনি কি মর্টগেজ এস্টিমেটরের সাথে সম্পর্কিত PRD খুঁজে পেতে পারেন?"
  • "আমরা এতে কী উন্নতি করতে পারি সে সম্পর্কে আমাকে প্রতিক্রিয়া দিন"
  • "এর জন্য পরীক্ষার পরিকল্পনা লিখুন"

উপরন্তু, যেহেতু আমরা এজেন্টকে একটি FastAPI অ্যাপ হিসেবে চালাই, আমরা /docs রুটে সমস্ত API রুটও পরিদর্শন করতে পারি। যেমন আপনি যদি এইরকম ইউআরএল অ্যাক্সেস করেন https://qa-test-planner-agent-*******.us-central1.run.app/docs আপনি নিচের মত সোয়াগার ডকুমেন্টেশন পৃষ্ঠা দেখতে পাবেন

c6f613b7bdc91ef3.png

কোড ব্যাখ্যা

এখন, সার্ভার.py থেকে শুরু করে ডিপ্লোয়মেন্টের জন্য আমাদের এখানে কোন ফাইল দরকার তা পরিদর্শন করা যাক

# server.py

import os

from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app

AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

app_args = {"agents_dir": AGENT_DIR, "web": True}

app: FastAPI = get_fast_api_app(**app_args)

app.title = "qa-test-planner-agent"
app.description = "API for interacting with the Agent qa-test-planner-agent"


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8080)

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

আপনি যদি চান, আপনি এখানে অ্যাপ্লিকেশন জীবনচক্র সেট করতে পারেন। এর পরে আমরা ফাস্ট এপিআই অ্যাপ্লিকেশন চালানোর জন্য ইউভিকর্ন ব্যবহার করতে পারি

এর পরে, ডকারফাইল আমাদের অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজনীয় পদক্ষেপগুলি সরবরাহ করবে

# Dockerfile

FROM python:3.12-slim

RUN pip install --no-cache-dir uv==0.7.13

WORKDIR /app

COPY . .

RUN uv sync --frozen

EXPOSE 8080

CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]

6. চ্যালেঞ্জ

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

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

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

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