1. Введение
Потенциал использования генеративного ИИ для создания планов тестирования обусловлен его способностью решать две важнейшие задачи современного контроля качества: скорость и полноту. В современных быстрых циклах Agile и DevOps ручное создание подробных планов тестирования является существенным узким местом, замедляя весь процесс тестирования. Агент на базе генеративного ИИ может обрабатывать пользовательские истории и технические требования для создания тщательного плана тестирования за считанные минуты, а не дни, обеспечивая соответствие процесса контроля качества темпам разработки. Более того, ИИ превосходно выявляет сложные сценарии, пограничные случаи и негативные пути, которые может пропустить человек, что приводит к значительному улучшению тестового покрытия и значительному сокращению количества ошибок, попадающих в производство.
В этой лабораторной работе мы рассмотрим, как создать такой агент, который сможет извлекать документы с требованиями к продукту из Confluence и давать конструктивную обратную связь, а также генерировать комплексный план тестирования, который можно экспортировать в CSV-файл.
В ходе выполнения лабораторной работы вы будете применять следующий пошаговый подход:
- Подготовьте свой проект Google Cloud и включите в нем все необходимые API.
- Настройте рабочее пространство для вашей среды кодирования
- Подготовка локального mcp-сервера для Confluence
- Структурирование исходного кода агента ADK, подсказок и инструментов для подключения к серверу MCP
- Понимание использования служб артефактов и контекстов инструментов
- Тестирование агента с использованием локального пользовательского интерфейса веб-разработки ADK
- Управление переменными среды и настройка необходимых файлов для развертывания приложения в Cloud Run.
- Разверните приложение в Cloud Run
Обзор архитектуры
Предпосылки
- Удобная работа с Python
- Понимание базовой архитектуры полного стека с использованием HTTP-сервиса
Чему вы научитесь
- Архитектура агента ADK с использованием его многочисленных возможностей
- Использование инструмента с пользовательским инструментом и MCP
- Настройка вывода файлов агентом с помощью управления Artifact Service
- Использование BuiltInPlanner для улучшения выполнения задач путем планирования с использованием возможностей Flash-мышления Gemini 2.5
- Взаимодействие и отладка через веб-интерфейс ADK
- Разверните приложение в Cloud Run с помощью Dockerfile и укажите переменные среды
Что вам понадобится
- веб-браузер Chrome
- Аккаунт Gmail
- Облачный проект с включенным биллингом
- (Необязательно) Пространство слияния со страницами документов с требованиями к продукту
Эта практическая работа, предназначенная для разработчиков любого уровня (включая новичков), использует Python в качестве примера приложения. Однако для понимания представленных концепций знание Python не требуется. Не беспокойтесь, если у вас нет сертификата в Confluence Space, мы предоставим его для участия в этой практической работе.
2. Прежде чем начать
Выберите активный проект в облачной консоли.
В этой лабораторной работе предполагается, что у вас уже есть проект Google Cloud с активированной функцией оплаты. Если у вас его ещё нет, следуйте инструкциям ниже, чтобы начать работу.
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
Настройка облачного проекта в Cloud Shell Terminal
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.
- После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что проекту присвоен ваш идентификатор проекта, с помощью следующей команды:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы подтвердить, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не настроен, используйте следующую команду для его настройки:
gcloud config set project <YOUR_PROJECT_ID>
Кроме того, вы также можете увидеть идентификатор PROJECT_ID
в консоли.
Нажмите на нее, и справа вы увидите все данные вашего проекта и его идентификатор.
- Включите необходимые API с помощью команды, показанной ниже. Это может занять несколько минут, поэтому, пожалуйста, наберитесь терпения.
gcloud services enable aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudresourcemanager.googleapis.com
При успешном выполнении команды вы должны увидеть сообщение, похожее на показанное ниже:
Operation "operations/..." finished successfully.
Альтернативой команде gcloud является поиск каждого продукта через консоль или использование этой ссылки .
Если какой-либо API отсутствует, вы всегда можете включить его в ходе реализации.
Информацию о командах и использовании gcloud см. в документации .
Перейдите в редактор Cloud Shell и настройте рабочий каталог приложения.
Теперь мы можем настроить наш редактор кода для написания кода. Для этого мы будем использовать Cloud Shell Editor.
- Нажмите кнопку «Открыть редактор», откроется редактор Cloud Shell, где мы можем написать наш код.
- Убедитесь, что проект Cloud Code выбран в левом нижнем углу (строке состояния) редактора Cloud Shell, как показано на изображении ниже, и соответствует активному проекту Google Cloud, для которого включена оплата. При необходимости авторизуйтесь . Если вы уже выполнили предыдущую команду, кнопка может указывать непосредственно на ваш активированный проект, а не на кнопку входа.
- Далее клонируем рабочий каталог шаблона для этой практической работы с Github, выполнив следующую команду. Она создаст рабочий каталог в каталоге qa-test-planner-agent.
git clone https://github.com/alphinside/qa-test-planner-agent.git qa-test-planner-agent
- После этого перейдите в верхнюю часть редактора Cloud Shell и выберите Файл -> Открыть папку, найдите каталог с именем пользователя и каталог qa-test-planner-agent, затем нажмите кнопку ОК. Выбранный каталог станет основным рабочим каталогом. В этом примере имя пользователя — alvinprayuda , поэтому путь к каталогу показан ниже.
Теперь ваш редактор Cloud Shell должен выглядеть так.
Настройка среды
Подготовка виртуальной среды Python
Следующий шаг — подготовка среды разработки. Ваш текущий активный терминал должен находиться в рабочем каталоге qa-test-planner-agent . В этой лабораторной работе мы будем использовать Python 3.12 и менеджер проектов UV Python для упрощения создания и управления версиями Python и виртуальными средами.
- Если вы еще не открыли терминал, откройте его, нажав «Терминал» -> «Новый терминал» или используйте сочетание клавиш Ctrl + Shift + C. Это откроет окно терминала в нижней части браузера.
- Загрузите
uv
и установите Python 3.12 с помощью следующей команды
curl -LsSf https://astral.sh/uv/0.7.19/install.sh | sh && \
source $HOME/.local/bin/env && \
uv python install 3.12
- Теперь инициализируем виртуальную среду с помощью
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", ]
- Чтобы протестировать виртуальное окружение, создайте новый файл main.py и скопируйте следующий код.
def main():
print("Hello from qa-test-planner-agent")
if __name__ == "__main__":
main()
- Затем выполните следующую команду
uv run main.py
Вы получите вывод, как показано ниже.
Using CPython 3.12 Creating virtual environment at: .venv Hello from qa-test-planner-agent!
Это показывает, что проект Python настраивается правильно.
Теперь мы можем перейти к следующему шагу: созданию агента, а затем и сервисов.
3. Создайте агента с использованием Google ADK и Gemini 2.5.
Введение в структуру каталогов ADK
Давайте начнём с изучения возможностей ADK и способов создания агента. Полную документацию ADK можно найти по этой ссылке . ADK предлагает множество утилит для выполнения команд CLI. Вот некоторые из них:
- Настройте структуру каталога агентов
- Быстро попробуйте взаимодействие через ввод-вывод CLI
- Быстрая настройка локального веб-интерфейса разработки
Теперь создадим структуру каталогов агентов с помощью команды 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_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,
)
),
)
Файлы конфигурации установки
Теперь нам нужно будет добавить дополнительную настройку конфигурации для этого проекта, поскольку этому агенту потребуется доступ к Confluence.
Откройте файл 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}
К сожалению, это пространство Confluence не может быть сделано публичным, поэтому вы можете просмотреть эти файлы, чтобы ознакомиться с имеющимися документами о требованиях к продукту, которые будут доступны при использовании указанных выше учетных данных.
Пояснение кода
Этот сценарий содержит инициализацию нашего агента, где мы инициализируем следующие вещи:
- Установите используемую модель на
gemini-2.5-flash
- Настройте Confluence MCP Tools, который будет взаимодействовать через Stdio
- Настройка пользовательского инструмента
write_test_tool
для записи плана тестирования и дампа CSV в артефакт - Настройте описание и инструкцию агента
- Включите планирование перед формированием окончательного ответа или его выполнением, используя возможности быстрого мышления Gemini 2.5
Сам агент, работающий на основе модели Gemini со встроенными возможностями мышления и настроенный с использованием аргументов планировщика , может демонстрировать свои возможности мышления и отображать их в веб-интерфейсе. Код для настройки представлен ниже.
# 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,
)
),
...
И прежде чем предпринять какие-либо действия, мы можем увидеть его мыслительный процесс.
Инструмент Confluence MCP
Для подключения к серверу MCP из ADK необходимо использовать 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],
...
При такой конфигурации агент инициализирует сервер Confluence MCP как отдельный процесс и будет осуществлять взаимодействие с этими процессами через Studio I/O. Этот процесс показан на следующем изображении архитектуры MCP, отмеченном красным прямоугольником ниже.
Кроме того, в аргументах команды инициализации MCP мы ограничиваем набор инструментов, которые можно использовать, только этими: confluence_search, confluence_get_page и confluence_get_page_children , которые поддерживают наши сценарии использования тестового агента QA. Для этого учебного занятия мы используем предоставленный сообществом сервер Atlassian MCP (подробнее см. в полной документации ).
Написать тестовый инструмент
Получив контекст от инструмента Confluence MCP, агент может создать необходимый план тестирования для пользователя. Однако нам необходимо создать файл, содержащий этот план тестирования, чтобы его можно было сохранить и передать другому пользователю. Для этого мы предлагаем ниже специальный инструмент 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)}",
}
...
Объявленная выше функция должна поддерживать следующие возможности:
- Проверяем разработанный план тестирования на соответствие обязательным полевым спецификациям. Мы проверяем с помощью модели Pydantic, и если возникает ошибка, мы отправляем сообщение об ошибке обратно агенту.
- Сохраните результат в CSV с помощью функциональности pandas.
- Сгенерированный файл затем сохраняется как артефакт с использованием возможностей Artifact Service, доступ к которым можно получить с помощью объекта ToolContext, доступ к которому можно получить при каждом вызове инструмента.
Если мы сохраним сгенерированные файлы как артефакт, он будет отмечен как событие в среде выполнения ADK и может быть отображен при взаимодействии с агентом позже в веб-интерфейсе.
Благодаря этому мы можем динамически настраивать ответный файл от агента, который будет предоставлен пользователю.
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 также позволяет нам использовать пользовательский интерфейс разработки для взаимодействия и наблюдения за происходящим во время взаимодействия. Выполните следующую команду, чтобы запустить локальный сервер пользовательского интерфейса разработки.
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)
Теперь, чтобы проверить это, нажмите кнопку «Предварительный просмотр в Интернете» в верхней части редактора Cloud Shell и выберите «Предварительный просмотр на порту 8080».
Вы увидите следующую веб-страницу, где вы можете выбрать доступных агентов в раскрывающемся списке слева вверху (в нашем случае это qa_test_planner ) и взаимодействовать с ботом. В левом окне вы увидите множество информации о журнале работы агента.
Давайте попробуем что-нибудь сделать! Общайтесь с агентами, используя эти подсказки:
- «Пожалуйста, перечислите все доступные PRD»
- «Напишите план тестирования для Snaprecipe PRD»
При использовании некоторых инструментов вы можете проверить, что происходит в пользовательском интерфейсе разработки.
Посмотрите, как агент отвечает вам, а также проверьте, когда мы запрашиваем тестовый файл, он генерирует план тестирования в CSV-файле как артефакт.
Теперь вы можете проверить содержимое CSV-файла, импортировав его, например, в Google Таблицу.
Поздравляем! Теперь у вас есть работающий агент QA Test Planner, работающий локально! Теперь давайте посмотрим, как развернуть его в Cloud Run, чтобы другие тоже могли им пользоваться!
5. Развертывание в Cloud Run
Конечно, нам нужен доступ к этому замечательному приложению из любой точки мира. Для этого мы можем упаковать его и развернуть в Cloud Run. В рамках демонстрации этот сервис будет представлен как публичный, к которому смогут получить доступ другие пользователи. Однако имейте в виду, что это не лучший вариант!
В вашем текущем рабочем каталоге уже есть все файлы, необходимые для развертывания наших приложений в Cloud Run: каталог агента, Dockerfile и server.py (основной скрипт службы) . Давайте развернем его. Перейдите в Cloud Shell Terminal и убедитесь, что текущий проект настроен на ваш активный проект. Если нет, используйте команду gcloud configure для установки идентификатора проекта:
gcloud config set project [PROJECT_ID]
Затем выполните следующую команду, чтобы развернуть его в Cloud Run.
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
Если вам будет предложено подтвердить создание реестра артефактов для репозитория Docker, просто ответьте Y. Обратите внимание, что мы разрешаем доступ без аутентификации, поскольку это демонстрационное приложение. Рекомендуется использовать соответствующую аутентификацию для ваших корпоративных и производственных приложений.
После завершения развертывания вы должны получить ссылку, похожую на приведенную ниже:
https://qa-test-planner-agent-*******.us-central1.run.app
При переходе по URL-адресу вы попадёте в веб-интерфейс разработчика, аналогичный тому, который вы используете локально. Продолжайте запускать приложение в режиме инкогнито или на мобильном устройстве. Оно должно быть уже запущено.
Теперь давайте снова попробуем выполнить эти различные подсказки последовательно и посмотрим, что произойдет:
- «Можете ли вы найти PRD, связанный с Mortgage Estimator?»
- «Дайте мне знать, что мы можем улучшить в этом вопросе».
- «Напишите план тестирования для этого»
Кроме того, поскольку мы запускаем агент как приложение FastAPI, мы можем проверить все маршруты API в маршруте /docs . Например, если вы перейдете по URL-адресу https://qa-test-planner-agent-*******.us-central1.run.app/docs, вы увидите страницу документации Swagger, показанную ниже.
Пояснение кода
Теперь давайте проверим, какой файл нам нужен для развертывания, начав с 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)
Мы можем легко преобразовать наш агент в приложение FastAPI с помощью функции get_fast_api_app . В этой функции можно настроить различные функции, например, службу сеансов, службу артефактов или даже трассировку данных в облако.
При желании вы также можете настроить жизненный цикл приложения здесь. После этого мы сможем использовать Uvicorn для запуска приложения Fast API.
После этого Dockerfile предоставит нам необходимые шаги для запуска приложения.
# 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. Вызов
Теперь пришло время отточить и отточить свои навыки исследователя. Можете ли вы создать инструмент, который позволит сохранять отзывы о PRD в файл?
7. Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этой лабораторной работе, выполните следующие действия:
- В консоли Google Cloud перейдите на страницу Управление ресурсами .
- В списке проектов выберите проект, который вы хотите удалить, и нажмите Удалить .
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу» , чтобы удалить проект.
- Либо вы можете перейти в Cloud Run на консоли, выбрать службу, которую вы только что развернули, и удалить ее.