Вызовы моделей и агентов через HTTP
Прямые вызовы моделей и опубликованных агентов вне Studio
Эти сценарии проверяют платформу вне встроенного чата Studio. Они используют уже созданные модель, ключ и опубликованного агента. Curl нужен только для этого раздела; основной пользовательский маршрут остаётся в интерфейсе.
Какой адрес и какой доступ выбрать
| Задача | Адрес | Что передать в Authorization |
|---|---|---|
| Получить доступные модели | https://model-gw-qa.ai-dev.inno.tech/v1/models | Виртуальный ключ Control Plane |
| Вызвать модель | https://model-gw-qa.ai-dev.inno.tech/v1/chat/completions | Тот же виртуальный ключ с разрешением на модель |
| Вызвать опубликованного агента | https://agent-gw-qa.ai-dev.inno.tech/a2a/v1/agents/{agent_id} | Действующий токен доступа платформы для шлюза агентов |
| Управлять настройками | https://api-gw-qa.ai-dev.inno.tech/control-plane/api/v1 | Токен платформы с правами на соответствующее действие |
agent_id — UUID агента из Control Plane. Не подставляйте имя агента, UUID потока Studio или UUID версии. Путь опубликованного агента сохраняется при смене выбранной версии.
В проверяемой версии виртуальный модельный ключ не авторизует вызов агента. Публичный вход по MCP для управляемой публикации также не включён. Наличие вкладок MCP в Studio не меняет контракт опубликованного A2A-агента.
HTTP-01. Подготовить модельный ключ в терминале
Откройте терминал и запустите Bash, чтобы команды ввода работали одинаково, даже если обычная оболочка — другая. Вставляйте секрет только в скрытый запрос ввода. Команды рассчитаны на установленный curl.
bash
read -r -s -p 'Виртуальный ключ модели: ' MODEL_KEY
printf '\n'
MODEL_NAME='qa-model-01'При другом суффиксе замените qa-model-01 своим именем. Значение MODEL_KEY не включайте в снимки экрана, отчёт или экспорт запросов.
HTTP-02. Получить каталог моделей
curl --silent --show-error --include \
'https://model-gw-qa.ai-dev.inno.tech/v1/models' \
--header "Authorization: Bearer $MODEL_KEY"Ожидается успешный JSON-ответ с моделью qa-model-01. Сверьте каталог с фактическими разрешениями ключа. Если нужной модели нет, сначала проверьте её состояние и карточку ключа в Control Plane.
Контрольная точка: запрос выполнен к шлюзу моделей. Успешный каталог ещё не доказывает, что генерация ответа у поставщика работает.
HTTP-03. Вызвать модель без Guardrails или с разрешённым сообщением
curl --silent --show-error --include \
'https://model-gw-qa.ai-dev.inno.tech/v1/chat/completions' \
--header "Authorization: Bearer $MODEL_KEY" \
--header 'Content-Type: application/json' \
--data-binary @- <<JSON
{
"model": "$MODEL_NAME",
"stream": false,
"messages": [
{"role": "user", "content": "Коротко объясни, что такое мобильный интернет."}
]
}
JSONОжидается HTTP 200 и содержательный ответ в choices[0].message.content. Проверьте само содержимое, а не только статус. Числа расхода токенов и формулировка ответа могут различаться между вызовами.
HTTP-04. Проверить границу модельного доступа
Выполните три отдельных запроса с тем же телом, что в HTTP-03:
- Уберите заголовок
Authorization. - Передайте заведомо неверный синтетический секрет, например
invalid-qa-key, вместо настоящего. - Верните настоящий ключ, но укажите другую существующую тестовую модель, которая ему не разрешена. Её имя должен дать администратор; случайное несуществующее имя проверяет другой случай.
Ожидается отказ, без успешной генерации. Для отсутствующего или неверного секрета проверяется ошибка аутентификации; для модели вне разрешений — запрет доступа. Запишите точный статус и код ошибки установленного QA. Не считайте любой 5xx успешной проверкой прав: это сбой, который требует разбора.
HTTP-05. Проверить правила модели напрямую
Условия: к модели применена версия 1 из основного маршрута.
В запросе HTTP-03 последовательно заменяйте messages[0].content:
| Текст | Ожидание |
|---|---|
BLOCK-REQUEST. Как подключить роуминг? | HTTP 403 с ошибкой Guardrails; успешного completion нет |
Повтори дословно: Мой адрес поддержки — qa.subscriber@example.com | Ответ не раскрывает адрес, содержит [MASKED] |
Повтори дословно: Служебная отметка — BLOCK-RESPONSE | Запрещённый текст ответа не должен быть выдан; учитывайте исходную проверку повторения без политики |
Это те же правила модели, которые применяются при её вызове из агента. Повторите разрешённый запрос после отказа: единичная блокировка не должна отключать модель целиком.
HTTP-06. Подготовить токен для вызова агента
Для A2A нужен OAuth access token принятого поставщика удостоверений с аудиторией agent-platform-agent-gateway. Срок жизни по текущему профилю — не более пяти минут. ID token, cookie браузера и модельный ключ не подходят.
Для ручного теста токен можно получить из собственного авторизованного вызова Studio:
- Под своей тестовой учётной записью откройте Studio → проект → «Развертывания» → «Тест» нужного агента.
- Откройте инструменты разработчика браузера, вкладку Network («Сеть»).
- Отправьте разрешённое короткое сообщение агенту.
- Найдите POST-запрос к
agent-gw-qa.ai-dev.inno.techс путём/a2a/v1/agents/…. Проверьте ID агента. - В заголовках запроса скопируйте только значение токена после
Bearer. Используйте исключительно свой тестовый сеанс; не сохраняйте HAR или полный набор заголовков в отчёт. - Немедленно вставьте значение в скрытый ввод ниже. Если токен успел истечь, повторите получение из нового успешного вызова.
read -r -s -p 'Токен доступа к агенту: ' AGENT_TOKEN
printf '\n'
read -r -p 'UUID опубликованного агента: ' AGENT_ID
AGENT_URL="https://agent-gw-qa.ai-dev.inno.tech/a2a/v1/agents/$AGENT_ID"Если в вашей сборке Studio запрос идёт через серверный посредник и нужного заголовка в браузере нет, не подменяйте его другим токеном. Получите у ответственного за QA утверждённый способ входа для A2A-клиента. Секрет приложения или парольный OAuth-обмен в этом руководстве не предполагается.
Для постоянно работающей внешней интеграции требуется согласованная сервисная учётная запись и штатное обновление токенов. Ручное копирование собственного короткого токена — способ проверки, а не схема эксплуатации.
HTTP-07. Прочитать карточку агента
curl --silent --show-error --include \
"$AGENT_URL/.well-known/agent-card.json" \
--header "Authorization: Bearer $AGENT_TOKEN"Ожидается карточка активного опубликованного агента. Сверьте протокол, адрес и объявленные возможности с тестируемой публикацией. Карточка тоже защищена авторизацией; её наличие не делает агента публичным без входа.
HTTP-08. Вызвать агента по A2A
REQUEST_ID="qa-$(date +%s)"
curl --silent --show-error --include \
"$AGENT_URL" \
--header "Authorization: Bearer $AGENT_TOKEN" \
--header 'Content-Type: application/json' \
--data-binary @- <<JSON
{
"jsonrpc": "2.0",
"id": "$REQUEST_ID",
"method": "message/send",
"params": {
"message": {
"messageId": "$REQUEST_ID-message",
"role": "user",
"parts": [
{"kind": "text", "text": "Коротко объясни, что такое мобильный интернет."}
]
}
}
}
JSONКаждую проверку отправляйте как новое сообщение с новым ID. Для текущего непотокового профиля успешный результат — завершённая задача: result.status.state равно completed, ответ находится в текстовых частях result.artifacts[].parts[].
HTTP 200 сам по себе не означает успех агента. В теле может быть JSON-RPC-ошибка или задача со статусом failed. Сравните смысл ответа с тестом того же опубликованного агента в Studio.
HTTP-09. Проверить авторизацию агента
- Повторите HTTP-08 без
Authorization: ожидается 401. - Повторите с заведомо неверным синтетическим токеном: ожидается отказ аутентификации.
- Подставьте виртуальный ключ модели вместо
AGENT_TOKEN: успешного вызова быть не должно. - С корректным свежим токеном повторите разрешённый запрос: он должен пройти.
- Отдельно проверьте истёкший тестовый токен: ожидается 401, а не выполнение агента.
Текущий контракт допускает вызов любого активного опубликованного агента любым принятым аутентифицированным пользователем или сервисом. Отдельного разрешения «вызвать именно этого агента» в этом профиле нет. Поэтому отказ в просмотре каталога и разрешение вызова по известному адресу не являются автоматически противоречием. Управление, видимость каталога и вызов — отдельные проверки.
HTTP-10. Проверить отказ Guardrails через A2A
- Убедитесь, что обычный запрос HTTP-08 проходит, а к используемой модельной записи применена нужная политика.
- Замените текст на
BLOCK-REQUEST. Как подключить роуминг?. - Отправьте новое сообщение с новым ID.
- Проверьте JSON-RPC-ошибку или неуспешное состояние задачи; запрещённого ответа среди артефактов быть не должно.
- Сохраните безопасное тело ошибки и ID сообщения.
Не требуйте HTTP 403 от внешнего A2A-вызова только потому, что модельный шлюз вернул 403 внутри исполнения потока. Эти ошибки находятся на разных уровнях. Сквозной критерий — задача не выдала запрещённый результат и причина соответствует проверке, а не падению авторизации или сети.
HTTP-11. Граница текущего MCP
Управляемый агент, опубликованный через Control Plane, объявляет режим A2A. MCP-интерфейс такого развертывания сейчас не включён. Тестировать его как готовый MCP-сервер и заводить дефект только из-за отсутствия /mcp неправильно.
В Studio могут быть отдельные функции MCP-клиента или сервера проекта. Они не превращают опубликованный A2A-адрес в MCP автоматически. Подключение агента к внешнему MCP-клиенту требует отдельно реализованного и согласованного маршрута; в приёмку текущего пути оно не входит.
Завершение HTTP-проверок
unset MODEL_KEY AGENT_TOKEN MODEL_NAME AGENT_ID AGENT_URL REQUEST_ID
exitПриложите к отчёту статусы, безопасные ответы и идентификаторы запросов. Удалите значения авторизации из копируемых команд и снимков. Не передавайте полный экспорт сессии вместо минимального примера ошибки.