Агенты в продакшене на функциях и маршрутах Inquir
Каждый инструмент — отдельная функция в духе Lambda в своём контейнере: вызов через API-Gateway с аутентификацией и секретами в рабочем пространстве, слои под тяжёлые SDK, по желанию тёплые пулы под всплески, пайплайны, если шаг не укладывается в HTTP.
Обновлено: 2026-04-20
Кратко
Суть ответа
Агенты в продакшене на функциях и маршрутах Inquir. Функция на инструмент сосредотачивает зависимости и риск при публикации правок; в консоли видна история именно этого вызова.
Когда подходит и когда нет
- Многошаговые агенты
- Доступ инструментов к закрытым данным
На что обратить внимание
- Мощные инструменты на устройстве пользователя не подходят для регулируемых данных или жёстко заблокированных ноутбуков.
- Один большой сервер смешивает обновления кода и логи всех сценариев — дежурствам больнее, чем с изолированными инструментами.
Ситуация: нагрузка и где обычно ломается
Что нужно ИИ-агенту в продакшене помимо ответа модели: отдельные HTTP-инструменты, секреты и контроль побочных эффектов
Один ответ модели — только верхушка. В проде агенты ходят в закрытые данные, пишут в учётные системы, передают эскалации людям и соблюдают ограничения — у каждого шага должны быть обработка сбоев и повторы.
Без нормального бэкенда побочные эффекты уезжают в промпт или браузер — там их почти нельзя ни проконтролировать, ни отозвать.
Когда упрощённых рецептов мало
Почему клиентский код и один общий сервер плохо подходят для инструментов агента с закрытыми данными и аудитом
Мощные инструменты на устройстве пользователя не подходят для регулируемых данных или жёстко заблокированных ноутбуков.
Один большой сервер смешивает обновления кода и логи всех сценариев — дежурствам больнее, чем с изолированными инструментами.
Как Inquir помогает в этом сценарии
Как Inquir Compute оформляет каждый инструмент агента отдельной функцией за API-шлюзом
Функция на инструмент сосредотачивает зависимости и риск при публикации правок; в консоли видна история именно этого вызова.
Те же Node, Python и Go, что и в остальной платформе. Тёплые пулы — по желанию под частые вызовы — подбирайте по нагрузке.
Что вы получаете на платформе
Правила реализации инструментов AI-агента
Одна функция — один инструмент
Разделяйте функции, если зависимости не связаны жёстко. Один инструмент на функцию — риск деплоя минимален, логи привязаны к конкретной возможности.
Проверяйте входные данные, возвращайте структурированный JSON
Отклоняйте невалидные запросы как можно раньше. Возвращайте стабильную JSON-схему, которую оркестратор сможет разобрать без исключений.
Секреты в переменных окружения, не в промптах
Скопируйте ключи API на уровне функции. Ротируйте независимо от версий модели, не трогая шаблоны промптов.
Длинную работу — в задачи или пайплайны
Когда шаг инструмента превышает таймаут шлюза, верните ответ сразу, а обогащение или побочные эффекты продолжите в фоновом пайплайне.
Отслеживайте сбои по каждой конечной точке
Настройте алерты по ошибкам на маршрут инструмента, а не только на сессию чата. Один упавший инструмент должен всплыть в наблюдаемости раньше, чем тихо ухудшит качество агента.
Hot containers for tight tool loops
When the model calls tools in rapid succession, cold-start latency adds up. Enable warm pools for tool functions with steady traffic—measure p95/p99 before and after to validate the gain.
Track failures per tool endpoint
Alert on error rates per tool route, not only per chat session. One failing tool should surface in observability before it silently degrades agent quality.
Что сделать дальше, по шагам
Как строить инструменты AI-агента на Inquir Compute
Описать контракт входных данных инструмента
Задокументируйте обязательные поля, поведение валидации и форму ошибки, которую должен обработать оркестратор.
Описать схему вывода и модель доступа
Держите форму ответа стабильной между версиями. Используйте API-ключ на уровне маршрута, чтобы инструменты случайно не оказались открытыми.
Описать повторы, идемпотентность и передачу по таймауту
Решите, когда повторять на месте, когда возвращать ID задачи и продолжать через пайплайн, и как ключевать записи, чтобы повторы не создавали дубликатов.
Пример кода
Паттерны хендлера инструмента
Тело POST приходит строкой в event.body. Возвращайте { statusCode, body } для HTTP-маршрутов. Когда работа превышает таймаут — верните ссылку на задачу и продолжите в пайплайне.
export async function handler(event) { const { id } = JSON.parse(event.body || '{}'); if (!id) return { statusCode: 400, body: JSON.stringify({ error: 'id required' }) }; // API key auth is enforced at the gateway route — handler assumes authenticated caller const row = await db.findById(id); if (!row) return { statusCode: 404, body: JSON.stringify({ error: 'not found' }) }; return { statusCode: 200, body: JSON.stringify({ row }) }; }
import json, os from openai import OpenAI client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) # injected from workspace secrets def handler(event, context): body = json.loads(event.get("body") or "{}") text = body.get("text") if not text: return {"statusCode": 400, "body": json.dumps({"error": "text required"})} r = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": f"Classify intent of: {text}"}], ) return {"statusCode": 200, "body": json.dumps({"intent": r.choices[0].message.content})}
export async function handler(event) { const { customerId } = JSON.parse(event.body || '{}'); if (!customerId) return { statusCode: 400, body: JSON.stringify({ error: 'customerId required' }) }; // Return fast; continue in pipeline — orchestrator polls /jobs/:jobId or receives webhook const { instanceId: jobId } = await global.durable.startNew('enrich-customer', undefined, { customerId }); return { statusCode: 202, body: JSON.stringify({ jobId }) }; }
Когда подходит и когда нет
Когда имеет смысл выносить действия агента в отдельные serverless-функции Inquir
Когда это уместно
- Многошаговые агенты
- Доступ инструментов к закрытым данным
Когда лучше не трогать
- Разовые ответы модели без побочных эффектов
Вопросы и ответы
Вопросы и ответы
Инструменты должны быть отдельными HTTP-функциями?
В продакшене обычно да — проще изоляция, меньше риск при публикации новой версии и понятнее логи, чем у монолита.
Где хранить секреты?
В секретах рабочего пространства с подстановкой в окружение — ключи не в промптах и не в клиентском бандле.
Streaming / SSE для пользователя?
Stream (SSE) к клиенту — через API-Gateway; связь orchestrator → tool чаще остаётся обычным JSON request/response — так проще retries и idempotency.