1. Обзор
Агенты ИИ стремительно набирают популярность, совершая революцию в автоматизации задач и принятии решений благодаря своей способности действовать автономно, обучаться и взаимодействовать с окружающей средой для достижения целей.
Но как именно создать агента? Эта лабораторная работа поможет вам начать работу, показав, как создать валютного агента, который может конвертировать валюты разных стран. Цель — подробно рассмотреть новейшие технологии и помочь вам разобраться в аббревиатурах, которые вы, возможно, встречали в интернете (MCP, ADK, A2A).
Протокол контекста модели (MCP)
Протокол контекста модели (MCP) — это открытый протокол, стандартизирующий способ предоставления контекста приложениями LLM. MCP обеспечивает стандартизированный способ подключения моделей ИИ к ресурсам, подсказкам и инструментам.
Комплект разработки агентов (ADK)
Комплект разработки агентов (ADK) — это гибкая структура оркестровки для разработки и развертывания агентов ИИ. ADK не зависит от модели и развертывания и совместим с другими фреймворками. ADK был разработан, чтобы сделать разработку агентов максимально похожей на разработку программного обеспечения, чтобы разработчикам было проще создавать, развертывать и организовывать архитектуры агентов, варьирующиеся от простых задач до сложных рабочих процессов.
Протокол Agent2Agent (A2A)
Протокол Agent2Agent (A2A) — это открытый стандарт, разработанный для обеспечения бесперебойной коммуникации и совместной работы между агентами ИИ. Подобно тому, как MCP предоставляет стандартизированный способ предоставления магистрам права доступа к данным и инструментам, A2A предоставляет агентам стандартизированный способ взаимодействия с другими агентами! В мире, где агенты создаются с использованием различных фреймворков и разными поставщиками, A2A предоставляет общий язык, устраняя разрозненность и способствуя взаимодействию.
Чему вы научитесь
- Как создать локальный MCP-сервер
- Развертывание сервера MCP в Cloud Run
- Как создать агента с помощью Agent Development Kit, использующего инструменты MCP
- Как представить агента ADK как сервер A2A
- Тестирование сервера A2A с помощью клиента A2A
Что вам понадобится
2. Прежде чем начать
Создать проект
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
- Активируйте Cloud Shell, перейдя по этой ссылке . Вы можете переключаться между Cloud Shell Terminal (для выполнения облачных команд) и Editor (для создания проектов), нажимая соответствующую кнопку в Cloud Shell.
- После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что проекту присвоен ваш идентификатор проекта, с помощью следующей команды:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы подтвердить, что команда gcloud знает о вашем проекте.
gcloud config list project
- Для настройки проекта используйте следующую команду:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
- Включите необходимые API с помощью следующей команды. Это может занять несколько минут.
gcloud services enable cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
compute.googleapis.com
- Убедитесь, что у вас установлен Python 3.10+.
Информацию о командах и использовании gcloud см. в документации .
3. Установка
- Клонировать репозиторий:
git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent
- Установка uv (используется для управления зависимостями):
# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (uncomment below line)
# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- Настройте переменные среды (через файл
.env
):
Создайте файл .env
, выполнив следующее:
echo "GOOGLE_GENAI_USE_VERTEXAI=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=us-central1" >> .env
4. Создайте локальный MCP-сервер
Прежде чем приступить к организации вашего валютного агента, вам сначала необходимо создать сервер MCP для предоставления инструментов, которые понадобятся вашему агенту.
Сервер MCP позволяет писать лёгкие программы, реализующие определённые возможности (например, получение курсов валют) в виде инструментов. Агент или даже несколько агентов могут получить доступ к этим инструментам, используя стандартизированный протокол контекста модели (MCP).
Пакет Python FastMCP можно использовать для создания MCP-сервера, предоставляющего единый инструмент get_exchange_rate
. Инструмент get_exchange_rate
обращается через интернет к API Frankfurter, чтобы получить текущий обменный курс между двумя валютами.
Код для сервера MCP можно найти в файле mcp-server/server.py
:
import logging
import os
import httpx
from fastmcp import FastMCP
# Set up logging
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
mcp = FastMCP("Currency MCP Server 💵")
@mcp.tool()
def get_exchange_rate(
currency_from: str = 'USD',
currency_to: str = 'EUR',
currency_date: str = 'latest',
):
"""Use this to get current exchange rate.
Args:
currency_from: The currency to convert from (e.g., "USD").
currency_to: The currency to convert to (e.g., "EUR").
currency_date: The date for the exchange rate or "latest". Defaults to "latest".
Returns:
A dictionary containing the exchange rate data, or an error message if the request fails.
"""
logger.info(f"--- 🛠️ Tool: get_exchange_rate called for converting {currency_from} to {currency_to} ---")
try:
response = httpx.get(
f'https://api.frankfurter.app/{currency_date}',
params={'from': currency_from, 'to': currency_to},
)
response.raise_for_status()
data = response.json()
if 'rates' not in data:
return {'error': 'Invalid API response format.'}
logger.info(f'✅ API response: {data}')
return data
except httpx.HTTPError as e:
return {'error': f'API request failed: {e}'}
except ValueError:
return {'error': 'Invalid JSON response from API.'}
if __name__ == "__main__":
logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
# Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
asyncio.run(
mcp.run_async(
transport="http",
host="0.0.0.0",
port=os.getenv("PORT", 8080),
)
)
Чтобы запустить сервер MCP локально, откройте терминал и выполните следующую команду (сервер запустится по http://localhost:8080
):
uv run mcp-server/server.py
Проверьте правильность работы сервера MCP и доступность инструмента get_exchange_rate
с использованием протокола контекста модели.
В новом окне терминала (чтобы не останавливать локальный сервер MCP) выполните следующее:
uv run mcp-server/test_server.py
Вы должны увидеть текущий обменный курс 1 USD (доллар США) к EUR (евро):
--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- ✅ Success: {
"amount": 1.0,
"base": "USD",
"date": "2025-05-26",
"rates": {
"EUR": 0.87866
}
} ---
Отлично! Вы успешно создали работающий сервер MCP с инструментом, к которому ваш агент получит доступ.
Прежде чем перейти к следующей станции, остановите локально работающий сервер MCP, нажав Ctrl+C
(или Command+C
на Mac) в терминале, где вы его запустили.
5. Разверните свой сервер MCP в Cloud Run.
Теперь вы готовы развернуть сервер MCP как удаленный сервер MCP в Cloud Run 🚀☁️
Преимущества удаленного запуска сервера MCP
Удалённый запуск сервера MCP в Cloud Run может обеспечить ряд преимуществ:
- Масштабируемость : Cloud Run разработан для быстрого масштабирования и обработки всех входящих запросов . Cloud Run автоматически масштабирует ваш сервер MCP в зависимости от потребностей.
- 👥Централизованный сервер : вы можете предоставить членам команды доступ к централизованному серверу MCP через привилегии IAM, что позволит им подключаться к нему со своих локальных компьютеров, а не запускать каждый свой сервер локально. Внесение изменений на сервере MCP принесет пользу всем членам команды.
- 🔐Безопасность : Cloud Run предоставляет простой способ принудительной аутентификации запросов. Это позволяет использовать только защищённые соединения с вашим MCP-сервером, предотвращая несанкционированный доступ.
Перейдите в каталог mcp-server
:
cd mcp-server
Разверните сервер MCP в Cloud Run:
gcloud run deploy mcp-server --no-allow-unauthenticated --region=us-central1 --source .
Если ваша служба успешно развернута, вы увидите сообщение следующего вида:
Service [mcp-server] revision [mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
Аутентификация клиентов MCP
Поскольку вы указали --no-allow-unauthenticated
для требования аутентификации, любому клиенту MCP, подключающемуся к удаленному серверу MCP, необходимо будет пройти аутентификацию.
Официальная документация по серверам Host MCP в Cloud Run содержит больше информации по этой теме в зависимости от того, где вы используете свой клиент MCP.
Вам потребуется запустить прокси-сервер Cloud Run , чтобы создать аутентифицированный туннель к удаленному серверу MCP на вашей локальной машине.
По умолчанию URL-адрес сервисов Cloud Run требует, чтобы все запросы были авторизованы с помощью IAM-роли Cloud Run Invoker ( roles/run.invoker
). Эта привязка IAM-политики обеспечивает использование надёжного механизма безопасности для аутентификации вашего локального клиента MCP.
Вам следует убедиться, что у вас или у любого члена команды, пытающегося получить доступ к удаленному серверу MCP, IAM-роль roles/run.invoker
привязана к их субъекту IAM (учетной записи Google Cloud).
gcloud run services proxy mcp-server --region=us-central1
Вы должны увидеть следующий вывод:
Proxying to Cloud Run service [mcp-server] in project [<YOUR_PROJECT_ID>] region [us-central1]
http://127.0.0.1:8080 proxies to https://mcp-server-abcdefgh-uc.a.run.app
Весь трафик на http://127.0.0.1:8080
теперь будет аутентифицироваться и перенаправляться на удаленный сервер MCP.
Тестирование удаленного сервера MCP
В новом терминале вернитесь в корневую папку и повторно запустите файл mcp-server/test_server.py
чтобы убедиться, что удаленный сервер MCP работает.
cd ..
uv run mcp-server/test_server.py
Вы должны увидеть аналогичный вывод, как и при локальном запуске сервера:
--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- ✅ Success: {
"amount": 1.0,
"base": "USD",
"date": "2025-05-26",
"rates": {
"EUR": 0.87866
}
} ---
Вы можете запросить журналы развернутого сервера Cloud Run MCP, если хотите убедиться, что удаленный сервер действительно был вызван:
gcloud run services logs read mcp-server --region us-central1 --limit 5
В журналах вы должны увидеть следующее:
2025-06-04 14:28:29,871 [INFO]: --- 🛠️ Tool: get_exchange_rate called for converting USD to EUR ---
2025-06-04 14:28:30,610 [INFO]: HTTP Request: GET https://api.frankfurter.app/latest?from=USD&to=EUR "HTTP/1.1 200 OK"
2025-06-04 14:28:30,611 [INFO]: ✅ API response: {'amount': 1.0, 'base': 'USD', 'date': '2025-06-03', 'rates': {'EUR': 0.87827}}
Теперь, когда у вас есть удаленный MCP-сервер, вы можете перейти к созданию агента! 🤖
6. Создайте агента с помощью Agent Development Kit (ADK)
У вас есть развернутый сервер MCP, теперь пришло время создать валютный агент с помощью Agent Development Kit (ADK) .
Недавно вышел стабильный релиз Agent Development Kit версии 1.0.0. Это достижение означает, что Python ADK теперь готов к использованию в промышленной среде, предлагая разработчикам надежную и мощную платформу для уверенной разработки и развертывания агентов в реальных средах.
ADK значительно упрощает создание агентов и позволяет им легко подключаться к серверам MCP благодаря встроенной поддержке MCP Tools. Валютный агент будет получать доступ к инструменту get_exchange_rate
через класс MCPToolset ADK.
Код валютного агента находится в currency_agent/agent.py
:
import logging
import os
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.a2a.utils.agent_to_a2a import to_a2a
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
load_dotenv()
SYSTEM_INSTRUCTION = (
"You are a specialized assistant for currency conversions. "
"Your sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. "
"If the user asks about anything other than currency conversion or exchange rates, "
"politely state that you cannot help with that topic and can only assist with currency-related queries. "
"Do not attempt to answer unrelated questions or use tools for other purposes."
)
logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")
root_agent = LlmAgent(
model="gemini-2.5-flash",
name="currency_agent",
description="An agent that can help with currency conversions",
instruction=SYSTEM_INSTRUCTION,
tools=[
MCPToolset(
connection_params=StreamableHTTPConnectionParams(
url=os.getenv("MCP_SERVER_URL", "http://localhost:8080/mcp")
)
)
],
)
Для быстрого тестирования валютного агента вы можете воспользоваться пользовательским интерфейсом разработчика ADK, доступ к которому осуществляется путем запуска adk web
:
uv run adk web
В браузере перейдите по адресу http://localhost:8000
чтобы увидеть и протестировать агента!
Убедитесь, что в левом верхнем углу веб-интерфейса в качестве агента выбран currency_agent
.
Задайте своему агенту в чате вопрос, например : «Сколько будет 250 канадских долларов в долларах США?» . Вы увидите, как агент вызывает наш инструмент MCP get_exchange_rate
прежде чем дать ответ.
Агент работает! Он может обрабатывать запросы, связанные с конвертацией валют 💸.
7. Протокол Agent2Agent (A2A)
Протокол Agent2Agent (A2A) — это открытый стандарт, разработанный для обеспечения бесперебойной коммуникации и совместной работы между агентами ИИ. Он позволяет агентам, созданным с использованием различных фреймворков и разными поставщиками, общаться друг с другом на общем языке, устраняя разрозненность и способствуя взаимодействию.
A2A позволяет агентам:
- Откройте для себя: найдите других агентов и изучите их навыки ( AgentSkill ) и возможности ( AgentCapabilities ) с помощью стандартизированных карт агентов .
- Общайтесь: безопасно обменивайтесь сообщениями и данными.
- Сотрудничайте: делегируйте задачи и координируйте действия для достижения сложных целей.
Протокол A2A упрощает эту коммуникацию посредством таких механизмов, как «агентские карты», которые действуют как цифровые визитные карточки, используемые агентами для рекламы своих возможностей и информации о подключении.
Теперь настало время раскрыть валютного агента с помощью A2A, чтобы его могли вызывать другие агенты и клиенты.
A2A Python SDK
A2A Python SDK предоставляет модели Pydantic для каждого из вышеупомянутых ресурсов: AgentSkill , AgentCapabilities и AgentCard . Это обеспечивает интерфейс для ускорения разработки и интеграции с протоколом A2A.
AgentSkill
— это то, как вы будете информировать других агентов о том, что у валютного агента есть инструмент для get_exchange_rate
:
# A2A Agent Skill definition
skill = AgentSkill(
id='get_exchange_rate',
name='Currency Exchange Rates Tool',
description='Helps with exchange values between various currencies',
tags=['currency conversion', 'currency exchange'],
examples=['What is exchange rate between USD and GBP?'],
)
Затем в AgentCard
будут перечислены навыки и возможности агента, а также дополнительные сведения, такие как режимы ввода и вывода, которые может обрабатывать агент:
# A2A Agent Card definition
agent_card = AgentCard(
name='Currency Agent',
description='Helps with exchange rates for currencies',
url=f'http://{host}:{port}/',
version='1.0.0',
defaultInputModes=["text"],
defaultOutputModes=["text"],
capabilities=AgentCapabilities(streaming=True),
skills=[skill],
)
Пришло время объединить все это с валютным агентом и продемонстрировать мощь A2A!
8. Раскрытие сервера A2A Currency Agent
ADK упрощает процесс создания и подключения агентов, использующих протокол A2A. Предоставление доступа (отображение) существующему агенту ADK в качестве сервера A2A осуществляется с помощью функции ADK to_a2a(root_agent)
(подробности см. в документации ADK ).
Функция to_a2a
преобразует существующий агент для работы с A2A и позволяет предоставлять его как сервер через uvicorn
. Это обеспечивает более строгий контроль над тем, что вы хотите предоставить, если планируете использовать свой агент в производственном режиме. Функция to_a2a()
автоматически генерирует карточку агента на основе его кода, используя встроенный A2A Python SDK .
Заглянув в файл currency_agent/agent.py
вы увидите использование to_a2a
и то, как валютный агент представлен как сервер A2A с помощью всего двух строк кода!
from google.adk.a2a.utils.agent_to_a2a import to_a2a
# ... see file for full code
# Make the agent A2A-compatible
a2a_app = to_a2a(root_agent, port=10000)
Чтобы запустить сервер A2A, в новом терминале выполните следующее:
uv run uvicorn currency_agent.agent:a2a_app --host localhost --port 10000
Если сервер запустится успешно, вывод будет выглядеть следующим образом, указывая на то, что он работает на порту 10000 :
[INFO]: --- 🔧 Loading MCP tools from MCP Server... ---
[INFO]: --- 🤖 Creating ADK Currency Agent... ---
INFO: Started server process [45824]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://localhost:10000 (Press CTRL+C to quit)
Валютный агент теперь успешно работает как сервер A2A, и к нему могут обращаться другие агенты или клиенты, использующие протокол A2A!
Убедитесь, что удаленный агент запущен
Вы можете еще раз убедиться, что ваш агент работает, перейдя по URL-адресу карточки агента для валютного агента, который был автоматически сгенерирован функцией to_a2a()
.
В браузере перейдите по адресу [http://localhost:10000/.well-known/agent.json]
Вы должны увидеть следующую карточку агента:
{ "capabilities": { }, "defaultInputModes": [ "text/plain" ], "defaultOutputModes": [ "text/plain" ], "description": "An agent that can help with currency conversions", "name": "currency_agent", "preferredTransport": "JSONRPC", "protocolVersion": "0.3.0", "skills": [ { "description": "An agent that can help with currency conversions I am a specialized assistant for currency conversions. my sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. If the user asks about anything other than currency conversion or exchange rates, politely state that I cannot help with that topic and can only assist with currency-related queries. Do not attempt to answer unrelated questions or use tools for other purposes.", "id": "currency_agent", "name": "model", "tags": [ "llm" ] }, { "description": "Use this to get current exchange rate.\n\nArgs:\n currency_from: The currency to convert from (e.g., \"USD\").\n currency_to: The currency to convert to (e.g., \"EUR\").\n currency_date: The date for the exchange rate or \"latest\". Defaults to \"latest\".\n\nReturns:\n A dictionary containing the exchange rate data, or an error message if the request fails.", "id": "currency_agent-get_exchange_rate", "name": "get_exchange_rate", "tags": [ "llm", "tools" ] } ], "supportsAuthenticatedExtendedCard": false, "url": "http://localhost:10000", "version": "0.0.1" }
Протестируйте сервер A2A
Теперь вы можете протестировать сервер, отправив ему несколько запросов с помощью A2A!
A2A Python SDK предоставляет класс a2a.client.A2AClient
, который упрощает эту задачу.
Файл currency_agent/test_client.py
содержит код, который проходит несколько различных тестовых случаев на сервере A2A.
# ... see file for full code
# Example test using A2AClient
async def run_single_turn_test(client: A2AClient) -> None:
"""Runs a single-turn non-streaming test."""
send_message_payload = create_send_message_payload(text="how much is 100 USD in CAD?")
request = SendMessageRequest(
id=str(uuid4()), params=MessageSendParams(**send_message_payload)
)
print("--- ✉️ Single Turn Request ---")
# Send Message
response: SendMessageResponse = await client.send_message(request)
print_json_response(response, "📥 Single Turn Request Response")
if not isinstance(response.root, SendMessageSuccessResponse):
print("received non-success response. Aborting get task ")
return
if not isinstance(response.root.result, Task):
print("received non-task response. Aborting get task ")
return
task_id: str = response.root.result.id
print("--- ❔ Query Task ---")
# query the task
get_request = GetTaskRequest(id=str(uuid4()), params=TaskQueryParams(id=task_id))
get_response: GetTaskResponse = await client.get_task(get_request)
print_json_response(get_response, "📥 Query Task Response")
# ----- Main Entrypoint (Create client --> Run tests) -----
async def main() -> None:
"""Main function to run the tests."""
print(f'--- 🔄 Connecting to agent at {AGENT_URL}... ---')
try:
async with httpx.AsyncClient() as httpx_client:
# Create a resolver to fetch the agent card
resolver = A2ACardResolver(
httpx_client=httpx_client,
base_url=AGENT_URL,
)
agent_card = await resolver.get_agent_card()
# Create a client to interact with the agent
client = A2AClient(
httpx_client=httpx_client,
agent_card=agent_card,
)
print('--- ✅ Connection successful. ---')
await run_single_turn_test(client)
await run_multi_turn_test(client)
except Exception as e:
traceback.print_exc()
print(f'--- ❌ An error occurred: {e} ---')
print('Ensure the agent server is running.')
Запустите тесты с помощью следующей команды:
uv run currency_agent/test_client.py
Успешный тестовый запуск приведет к следующему:
--- 🔄 Connecting to agent at http://localhost:10000... ---
--- ✅ Connection successful. ---
--- ✉️ Single Turn Request ---
--- 📥 Single Turn Request Response ---
{"id":"3bc92d7b-d857-4e93-9ff0-b2fb865f6e35","jsonrpc":"2.0","result":{"artifacts":[{"artifactId":"35e89e14-b977-4397-a23b-92c84bc32379","parts":[{"kind":"text","text":"Based on the current exchange rate, 1 USD is equivalent to 1.3704 CAD. Therefore, 100 USD would be 137.04 CAD.\n"}]}],"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","history":[{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"59819269f7d04849b0bfca7d43ec073c","parts":[{"kind":"text","text":"how much is 100 USD in CAD?"}],"role":"user","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"},{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"286095c6-12c9-40cb-9596-a9676d570dbd","parts":[],"role":"agent","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"}],"id":"52ae2392-84f5-429a-a14b-8413d3d20d97","kind":"task","status":{"state":"completed"}}}
// ...
--- 🚀 First turn completed, no further input required for this test case. ---
Работает! Вы успешно проверили возможность связи с валютным агентом через сервер A2A! 🎉
Посетите репозиторий a2a-samples на GitHub, чтобы увидеть более продвинутые варианты использования!
Хотите развернуть своего агента? Vertex AI Agent Engine предоставляет управляемый интерфейс для развёртывания ИИ-агентов в рабочей среде!
9. Поздравления
Поздравляем! Вы успешно создали и развернули удалённый сервер MCP, создали агента обмена валюты с помощью Agent Development Kit (ADK), который подключается к инструментам через MCP, и предоставили свой агент для работы с валютой по протоколу Agent2Agent (A2A)! Теперь агент обмена валюты может взаимодействовать с другими агентами любой платформы с помощью A2A!
Вот ссылка на полную документацию кода.
Что мы рассмотрели
- Как создать локальный MCP-сервер
- Развертывание сервера MCP в Cloud Run
- Как создать агента с помощью Agent Development Kit, использующего инструменты MCP
- Как представить агента ADK как сервер A2A
- Тестирование сервера A2A с помощью клиента A2A
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этой лабораторной работе, выполните следующие действия:
- В консоли Google Cloud перейдите на страницу Управление ресурсами .
- В списке проектов выберите проект, который вы хотите удалить, а затем нажмите Удалить .
- В диалоговом окне введите идентификатор проекта, а затем нажмите кнопку «Завершить» , чтобы удалить проект.