QA Test Planner-Agent mit ADK, MCP und Gemini 2.5 Flash mit Denkmodus erstellen

1. Einführung

fd4ad67ab57d9257.png

Das Potenzial von generativer KI für die Erstellung von Testplänen beruht auf ihrer Fähigkeit, zwei der größten Herausforderungen in der modernen Qualitätssicherung zu lösen: Geschwindigkeit und Vollständigkeit. In den heutigen schnellen agilen und DevOps-Zyklen ist das manuelle Erstellen detaillierter Testpläne ein erheblicher Engpass, der den gesamten Testprozess verzögert. Ein auf generativer KI basierender Agent kann User-Storys und technische Anforderungen aufnehmen und in wenigen Minuten einen umfassenden Testplan erstellen. So kann der QA-Prozess mit der Entwicklung Schritt halten. Außerdem ist KI hervorragend geeignet, komplexe Szenarien, Grenzfälle und negative Pfade zu erkennen, die ein Mensch möglicherweise übersieht. Dies führt zu einer erheblich verbesserten Testabdeckung und einer deutlichen Reduzierung von Fehlern, die in die Produktion gelangen.

In diesem Codelab erfahren Sie, wie Sie einen solchen Agent erstellen, der die Produktspezifikationen aus Confluence abrufen, konstruktives Feedback geben und einen umfassenden Testplan generieren kann, der in eine CSV-Datei exportiert werden kann.

In diesem Codelab gehen Sie schrittweise so vor:

  1. Google Cloud-Projekt vorbereiten und alle erforderlichen APIs aktivieren
  2. Arbeitsbereich für Ihre Programmierumgebung einrichten
  3. Lokalen MCP-Server für Confluence vorbereiten
  4. ADK-Agent-Quellcode, ‑Prompt und ‑Tools strukturieren, um eine Verbindung zum MCP-Server herzustellen
  5. Auslastung von Artefaktdienst- und Tool-Kontexten
  6. Agent mit der lokalen Webentwicklungs-UI des ADK testen
  7. Umgebungsvariablen verwalten und erforderliche Dateien für die Bereitstellung der Anwendung in Cloud Run einrichten
  8. Anwendung in Cloud Run bereitstellen

Architekturübersicht

819179179d974c07.jpeg

Voraussetzungen

  • Vertrautheit mit Python
  • Grundkenntnisse der Full-Stack-Architektur mit HTTP-Dienst

Lerninhalte

  • ADK-Agenten entwerfen und dabei die verschiedenen Funktionen nutzen
  • Tool-Nutzung mit benutzerdefiniertem Tool und MCP
  • Dateiausgabe durch Agent mithilfe der Artifact Service-Verwaltung einrichten
  • BuiltInPlanner nutzen, um die Ausführung von Aufgaben zu verbessern, indem die Denkfähigkeiten von Gemini 2.5 Flash für die Planung eingesetzt werden
  • Interaktion und Debugging über die ADK-Weboberfläche
  • Anwendung mit Dockerfile in Cloud Run bereitstellen und Umgebungsvariablen angeben

Voraussetzungen

  • Chrome-Webbrowser
  • Ein Gmail-Konto
  • Ein Cloud-Projekt mit aktivierter Abrechnung
  • (Optional) Confluence-Bereich mit Seiten für Produktanforderungsdokumente

In diesem Codelab, das sich an Entwickler aller Erfahrungsstufen (auch Anfänger) richtet, wird Python in der Beispielanwendung verwendet. Python-Kenntnisse sind jedoch nicht erforderlich, um die vorgestellten Konzepte zu verstehen. Keine Sorge, wenn Sie keinen Confluence-Bereich haben. Wir stellen Anmeldedaten für dieses Codelab zur Verfügung.

2. Hinweis

Aktives Projekt in der Cloud Console auswählen

In diesem Codelab wird davon ausgegangen, dass Sie bereits ein Google Cloud-Projekt mit aktivierter Abrechnung haben. Wenn Sie noch kein Konto haben, können Sie der Anleitung unten folgen, um loszulegen.

  1. Wählen Sie in der Google Cloud Console auf der Seite zur Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

3a29a3ec1306e9b4.png

Cloud-Projekt im Cloud Shell-Terminal einrichten

  1. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. Klicken Sie oben in der Google Cloud Console auf „Cloud Shell aktivieren“.

1829c3759227c19b.png

  1. Wenn Sie mit Cloud Shell verbunden sind, können Sie mit dem folgenden Befehl prüfen, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist:
gcloud auth list
  1. Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass der gcloud-Befehl Ihr Projekt kennt.
gcloud config list project
  1. Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:
gcloud config set project <YOUR_PROJECT_ID>

Alternativ können Sie die PROJECT_ID-ID auch in der Console sehen.

4032c45803813f30.jpeg

Klicken Sie darauf. Rechts sehen Sie dann alle Ihre Projekte und die Projekt-ID.

8dc17eb4271de6b5.jpeg

  1. Aktivieren Sie die erforderlichen APIs mit dem unten gezeigten Befehl. Dies kann einige Minuten dauern.
gcloud services enable aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudresourcemanager.googleapis.com

Bei erfolgreicher Ausführung des Befehls sollte eine Meldung wie die unten gezeigte angezeigt werden:

Operation "operations/..." finished successfully.

Alternativ zum gcloud-Befehl können Sie in der Konsole nach den einzelnen Produkten suchen oder diesen Link verwenden.

Wenn eine API fehlt, können Sie sie jederzeit während der Implementierung aktivieren.

Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.

Cloud Shell-Editor aufrufen und Arbeitsverzeichnis der Anwendung einrichten

Jetzt können wir unseren Code-Editor für einige Programmieraufgaben einrichten. Dazu verwenden wir den Cloud Shell-Editor.

  1. Klicken Sie auf die Schaltfläche „Editor öffnen“. Dadurch wird ein Cloud Shell-Editor geöffnet, in dem wir unseren Code schreiben können b16d56e4979ec951.png
  2. Achten Sie darauf, dass das Cloud Code-Projekt in der unteren linken Ecke (Statusleiste) des Cloud Shell-Editors festgelegt ist, wie im Bild unten dargestellt. Es muss auf das aktive Google Cloud-Projekt festgelegt sein, für das die Abrechnung aktiviert ist. Autorisieren, wenn Sie dazu aufgefordert werden. Wenn Sie den vorherigen Befehl bereits ausgeführt haben, wird die Schaltfläche möglicherweise direkt zu Ihrem aktivierten Projekt weitergeleitet und nicht zur Schaltfläche „Anmelden“.

f5003b9c38b43262.png

  1. Als Nächstes klonen wir das Arbeitsverzeichnis der Vorlage für dieses Codelab von GitHub. Führen Sie dazu den folgenden Befehl aus. Das Arbeitsverzeichnis wird im Verzeichnis qa-test-planner-agent erstellt.
git clone https://github.com/alphinside/qa-test-planner-agent.git qa-test-planner-agent
  1. Klicken Sie dann oben im Cloud Shell Editor auf Datei > Ordner öffnen, suchen Sie nach dem Verzeichnis username und dann nach dem Verzeichnis qa-test-planner-agent. Klicken Sie auf die Schaltfläche „OK“. Dadurch wird das ausgewählte Verzeichnis zum Hauptarbeitsverzeichnis. In diesem Beispiel ist der Nutzername alvinprayuda. Der Verzeichnispfad wird unten angezeigt.

2c53696f81d805cc.png

fb321426f3c848b3.png

Ihr Cloud Shell Editor sollte jetzt so aussehen:

9ae344bc522d2a6f.png

Umgebung einrichten

Virtuelle Python-Umgebung vorbereiten

Im nächsten Schritt bereiten Sie die Entwicklungsumgebung vor. Ihr aktuelles aktives Terminal sollte sich im Arbeitsverzeichnis qa-test-planner-agent befinden. In diesem Codelab verwenden wir Python 3.12 und den uv-Python-Projektmanager, um das Erstellen und Verwalten von Python-Versionen und virtuellen Umgebungen zu vereinfachen.

  1. Wenn Sie das Terminal noch nicht geöffnet haben, klicken Sie auf Terminal > Neues Terminal oder verwenden Sie Strg + Umschalt + C. Dadurch wird ein Terminalfenster im unteren Bereich des Browsers geöffnet.

f8457daf0bed059e.jpeg

  1. Laden Sie uv herunter und installieren Sie Python 3.12 mit dem folgenden Befehl:
curl -LsSf https://astral.sh/uv/0.7.19/install.sh | sh && \
source $HOME/.local/bin/env && \
uv python install 3.12
  1. Initialisieren wir jetzt die virtuelle Umgebung mit uv. Führen Sie diesen Befehl aus:
uv sync --frozen

Dadurch wird das Verzeichnis .venv erstellt und die Abhängigkeiten werden installiert. Ein kurzer Blick in die Datei pyproject.toml gibt Ihnen Informationen zu den Abhängigkeiten, die so angezeigt werden:

dependencies = [
    "google-adk>=1.5.0",
    "mcp-atlassian>=0.11.9",
    "pandas>=2.3.0",
    "python-dotenv>=1.1.1",
]
  1. Um die virtuelle Umgebung zu testen, erstellen Sie die neue Datei main.py und kopieren Sie den folgenden Code.
def main():
   print("Hello from qa-test-planner-agent")

if __name__ == "__main__":
   main()
  1. Führen Sie dann den folgenden Befehl aus:
uv run main.py

Die Ausgabe sollte in etwa so aussehen:

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

Das zeigt, dass das Python-Projekt richtig eingerichtet wird.

Nun können wir mit dem nächsten Schritt fortfahren und den Agent und dann die Dienste erstellen.

3. Agent mit Google ADK und Gemini 2.5 erstellen

Einführung in die ADK-Verzeichnisstruktur

Sehen wir uns zuerst an, was das ADK zu bieten hat und wie Sie den Agenten erstellen. Die vollständige ADK-Dokumentation finden Sie unter dieser URL . Das ADK bietet uns viele Dienstprogramme für die Ausführung von CLI-Befehlen. Einige davon sind :

  • Agent-Verzeichnisstruktur einrichten
  • Schnell Interaktion über CLI-Ein- und -Ausgabe ausprobieren
  • Schnelle Einrichtung der Web-Benutzeroberfläche für die lokale Entwicklung

Erstellen wir nun die Agent-Verzeichnisstruktur mit dem CLI-Befehl. Führen Sie den folgenden Befehl aus:

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

Damit wird die folgende Agent-Verzeichnisstruktur in Ihrem aktuellen Arbeitsverzeichnis erstellt:

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

Wenn Sie init.py und agent.py untersuchen, sehen Sie diesen Code:

# __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-Testplaner-Agent erstellen

Lassen Sie uns einen KI-Agenten für die QA-Testplanung erstellen. Öffnen Sie die Datei qa_test_planner/agent.py und kopieren Sie den folgenden Code, der den root_agent enthält.

# 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,
        )
    ),
)

Konfigurationsdateien einrichten

Jetzt müssen wir zusätzliche Konfigurationen für dieses Projekt hinzufügen, da dieser Agent Zugriff auf Confluence benötigt.

Öffnen Sie qa_test_planner/.env und fügen Sie die folgenden Umgebungsvariablenwerte hinzu. Die resultierende .env-Datei sollte so aussehen:

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}

Leider kann dieser Confluence-Bereich nicht öffentlich gemacht werden. Sie können die Dateien jedoch mit den oben genannten Anmeldedaten aufrufen, um die verfügbaren Produktspezifikationen zu lesen.

Erläuterung zum Code

Dieses Skript enthält unsere Agent-Initialisierung, in der wir Folgendes initialisieren:

  • Legen Sie das zu verwendende Modell auf gemini-2.5-flash fest.
  • Confluence MCP-Tools einrichten, die über Stdio kommunizieren
  • Benutzerdefiniertes Tool write_test_tool einrichten, um einen Testplan zu schreiben und CSV in ein Artefakt zu exportieren
  • Beschreibung und Anleitung für den Agent einrichten
  • Planung vor der Generierung der endgültigen Antwort oder Ausführung mit den Denkfunktionen von Gemini 2.5 Flash aktivieren

Der Agent selbst, wenn er auf dem Gemini-Modell mit integrierten Denkfunktionen basiert und mit den planner-Argumenten konfiguriert ist, kann seine Denkfunktionen zeigen, die auch auf der Weboberfläche angezeigt werden. Der Code zum Konfigurieren dieser Einstellung ist unten zu sehen.

# 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,
        )
    ),

...

Und bevor Maßnahmen ergriffen werden, können wir den Denkprozess sehen.

185371e0e7e5995e.png

Das Confluence MCP-Tool

Um eine Verbindung zum MCP-Server über das ADK herzustellen, müssen wir MCPToolSet verwenden, das aus dem Modul google.adk.tools.mcp_tool.mcp_toolset importiert werden kann. Der Code, der hier initialisiert wird, ist unten zu sehen ( aus Effizienzgründen gekürzt).

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

...

Bei dieser Konfiguration initialisiert der Agent den Confluence-MCP-Server als separaten Prozess und verarbeitet die Kommunikation mit diesen Prozessen über Studio I/O. Dieser Ablauf wird im folgenden Bild der MCP-Architektur im roten Feld dargestellt.

85d51458405f9217.png

Außerdem beschränken wir in den Befehlsargumenten der MCP-Initialisierung die Tools, die verwendet werden können, auf confluence_search, confluence_get_page und confluence_get_page_children, die unsere QA-Test-Agent-Anwendungsfälle unterstützen. In diesem Codelab verwenden wir den von der Community beigesteuerten Atlassian MCP-Server ( vollständige Dokumentation).

Write Test Tool

Nachdem der Kundenservicemitarbeiter Kontext vom Confluence MCP Tool erhalten hat, kann er den erforderlichen Testplan für den Nutzer erstellen. Wir möchten jedoch eine Datei erstellen, die diesen Testplan enthält, damit er gespeichert und mit der anderen Person geteilt werden kann. Dazu stellen wir das benutzerdefinierte Tool write_test_tool unten zur Verfügung.

# 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)}",
        }


...

Die oben deklarierte Funktion unterstützt die folgenden Funktionen:

  1. Prüfen Sie den erstellten Testplan, damit er den Spezifikationen für Pflichtfelder entspricht. Wir prüfen ihn mit dem Pydantic-Modell. Wenn ein Fehler auftritt, geben wir die Fehlermeldung an den Agent zurück.
  2. Ergebnis mit Pandas-Funktionen in CSV exportieren
  3. Die generierte Datei wird dann als Artefakt mit den Funktionen des Artifact Service gespeichert, auf die über das ToolContext-Objekt zugegriffen werden kann, das bei jedem Tool-Aufruf verfügbar ist.

Wenn wir die generierten Dateien als Artefakt speichern, werden sie in der ADK-Laufzeit als Ereignis markiert und können später in der Agent-Interaktion in der Weboberfläche angezeigt werden.

57f5ab95f4ae86e7.png

So können wir die Dateiantwort des Agents, die dem Nutzer gegeben werden soll, dynamisch einrichten.

4. Agent testen

Versuchen wir nun, über die Befehlszeile mit dem Agent zu kommunizieren. Führen Sie dazu den folgenden Befehl aus:

uv run adk run qa_test_planner

Es wird eine Ausgabe wie diese angezeigt, in der Sie abwechselnd mit dem Agent chatten können. Über diese Oberfläche können Sie jedoch nur Text senden.

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: 

Es ist schön, dass man über die CLI mit dem Agenten chatten kann. Noch besser ist es aber, wenn wir einen schönen Webchat haben, und das können wir auch! Mit dem ADK können wir auch eine Entwickler-UI erstellen, um zu interagieren und zu prüfen, was während der Interaktion passiert. Führen Sie den folgenden Befehl aus, um den lokalen Entwicklungsserver für die Benutzeroberfläche zu starten:

uv run adk web --port 8080

Es wird eine Ausgabe wie im folgenden Beispiel erzeugt. Das bedeutet, dass wir bereits auf die Weboberfläche zugreifen können.

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)

Klicken Sie nun oben im Cloud Shell Editor auf die Schaltfläche Webvorschau und wählen Sie Vorschau auf Port 8080 aus, um die Vorschau aufzurufen.

e7c9f56c2463164.png

Sie sehen die folgende Webseite, auf der Sie oben links im Drop-down-Menü verfügbare Kundenservicemitarbeiter auswählen können ( in unserem Fall sollte es qa_test_planner sein) und mit dem Bot interagieren können. Im linken Fenster sehen Sie während der Laufzeit des Agents viele Informationen zu den Protokolldetails.

8ed90debb774207f.png

Probieren wir einige Aktionen aus. So können Sie mit den Agents chatten:

  • „Bitte liste alle verfügbaren PRDs auf.“
  • „Schreibe einen Testplan für das Snaprecipe-PRD.“

Bei der Verwendung einiger Tools können Sie in der Entwicklungsoberfläche sehen, was passiert.

3469a0785b507be3.png

Sehen Sie sich an, wie der Agent auf Sie reagiert, und prüfen Sie, wann wir nach einer Testdatei fragen. In diesem Fall wird der Testplan als Artefakt in einer CSV-Datei generiert.

94b73fb4d447ad62.png

Sie können den Inhalt der CSV-Datei jetzt prüfen, indem Sie sie beispielsweise in Google Tabellen importieren.

89e3fc18d6e92d82.png

Glückwunsch! Sie haben jetzt einen funktionierenden QA Test Planner-Agent, der lokal ausgeführt wird. Sehen wir uns nun an, wie wir sie in Cloud Run bereitstellen können, damit auch andere sie nutzen können.

5. In Cloud Run bereitstellen

Natürlich möchten wir von überall auf diese tolle App zugreifen. Dazu können wir diese Anwendung verpacken und in Cloud Run bereitstellen. Im Rahmen dieser Demo wird dieser Dienst als öffentlicher Dienst bereitgestellt, auf den andere zugreifen können. Beachten Sie jedoch, dass dies nicht die beste Vorgehensweise ist.

819179179d974c07.jpeg

In Ihrem aktuellen Arbeitsverzeichnis sind bereits alle Dateien vorhanden, die zum Bereitstellen unserer Anwendungen in Cloud Run erforderlich sind: das Agent-Verzeichnis, Dockerfile und server.py (das Hauptdienstskript). Stellen wir die Anwendung jetzt bereit. Rufen Sie das Cloud Shell-Terminal auf und prüfen Sie, ob das aktuelle Projekt für Ihr aktives Projekt konfiguriert ist. Wenn nicht, müssen Sie die Projekt-ID mit dem Befehl „gcloud configure“ festlegen:

gcloud config set project [PROJECT_ID]

Führen Sie dann den folgenden Befehl aus, um die Anwendung in Cloud Run bereitzustellen.

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

Wenn Sie aufgefordert werden, die Erstellung eines Artifact Registry-Repositorys für Docker zu bestätigen, antworten Sie einfach mit Y. Hinweis: Wir erlauben hier den nicht authentifizierten Zugriff, da es sich um eine Demoanwendung handelt. Es wird empfohlen, für Ihre Unternehmens- und Produktionsanwendungen eine geeignete Authentifizierung zu verwenden.

Nach Abschluss der Bereitstellung sollten Sie einen Link wie den folgenden erhalten:

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

Wenn Sie auf die URL zugreifen, wird die Web-Entwickler-UI aufgerufen, ähnlich wie bei einem lokalen Test. Sie können Ihre Anwendung nun im Inkognitofenster oder auf Ihrem Mobilgerät verwenden. Sie sollte bereits aktiv sein.

Sehen wir uns nun an, was passiert, wenn wir diese verschiedenen Prompts nacheinander ausprobieren:

  • „Kannst du das PRD für den Hypothekenrechner finden?“ "
  • „Gib mir Feedback dazu, was wir daran verbessern können.“
  • „Schreibe den Testplan dafür.“

Da wir den Agenten als FastAPI-App ausführen, können wir außerdem alle API-Routen über die Route /docs aufrufen. Wenn Sie beispielsweise über die URL https://qa-test-planner-agent-*******.us-central1.run.app/docs auf die Dokumentation zugreifen, wird die Swagger-Dokumentationsseite wie unten dargestellt angezeigt.

c6f613b7bdc91ef3.png

Erläuterung zum Code

Sehen wir uns nun an, welche Datei wir hier für das Deployment benötigen. Beginnen wir mit server.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)

Mit der Funktion get_fast_api_app können wir unseren Agenten ganz einfach in eine FastAPI-App umwandeln. In dieser Funktion können wir verschiedene Funktionen einrichten, z. B. den Sitzungsdienst, den Artefaktdienst oder sogar das Senden von Tracing-Daten in die Cloud.

Wenn Sie möchten, können Sie hier auch den Anwendungslebenszyklus festlegen. Danach können wir uvicorn verwenden, um die Fast API-Anwendung auszuführen.

Danach enthält das Dockerfile die erforderlichen Schritte zum Ausführen der Anwendung.

# 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. Herausforderung

Jetzt ist es an der Zeit, Ihre Fähigkeiten zu verfeinern. Kannst du auch ein Tool erstellen, mit dem das Feedback zur PRD-Überprüfung in eine Datei geschrieben wird?

7. Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Codelab verwendeten Ressourcen in Rechnung gestellt werden:

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.
  4. Alternativ können Sie in der Console zu Cloud Run wechseln, den gerade bereitgestellten Dienst auswählen und löschen.