API инструментов AI-агента: эндпоинты-функции с авторизацией для LLM

Дайте каждому инструменту LLM свой HTTP-эндпоинт с авторизацией за шлюзом: API-ключ проверяется до запуска обработчика, секреты подставляются из рабочего пространства, изолированный контейнер на инструмент и тёплые пулы для стабильного трафика модели. Одна функция на инструмент — небольшая, тестируемая, наблюдаемая.

Обновлено: 2026-10-26

Что нужно бэкенду инструментов LLM

  • HTTP-эндпоинты с авторизацией — модель не вызывает открытые маршруты
  • Секреты вне пути модели — API-ключи никогда не попадают в промпты и контекст
  • Изолированное выполнение — сбой одного инструмента не заражает другой
  • Низкая задержка на тёплом пути — плотным циклам инструментов нужен ответ быстрее 100 мс
  • Наблюдаемость — видно, какой инструмент упал и почему, на каждый вызов модели

В большинстве демо агентов вся логика инструментов лежит в одном сервере или одной Lambda. В продакшене каждый инструмент нужно изолировать, каждый секрет — ограничить областью, каждый сбой — трассировать независимо.

Почему монолитные бэкенды инструментов ломаются в продакшене

Один сервер со всеми инструментами означает, что один сбой зависимости (например, конфликт версий numpy) кладёт все инструменты сразу. Один деплой затрагивает каждую возможность.

Общие API-ключи на все инструменты означают, что ротация одной учётки задевает посторонние инструменты. Один слой авторизации на всё не позволяет ограничить права на уровне инструмента.

Одна функция на инструмент, один шлюз на всех

Развёртывайте каждый инструмент отдельной функцией за API-шлюзом. Шлюз проверяет API-ключ до запуска кода обработчика — без шаблонной авторизации в каждой функции. Секреты ограничены рабочим пространством и подставляются в среде выполнения как переменные окружения.

Тёплые контейнеры держат эндпоинты инструментов отзывчивыми при стабильном трафике агента — хотя первый деплой или вытесненный по простою контейнер всё ещё может быть холодным, поэтому задавайте таймауты с учётом самых важных инструментов. Разные инструменты используют разные среды выполнения: Node.js для вызовов API, Python для ML-инференса, Go для быстрых lookup-запросов. Общая архитектура агента — на странице /serverless-for-ai-agents.

Возможности API инструментов AI-агента

Авторизация по API-ключу на шлюзе

Авторизация на маршруте (none, X-Api-Key или bearer) выполняется до кода функции. Ключи — 32 байта base64url, хранятся как SHA-256, показываются один раз; маршрут можно ограничить конкретными ID ключей и ротировать без правок обработчика.

Секреты на инструмент

Привязывайте секреты рабочего пространства к функции. Ключ OpenAI у суммаризатора никогда не попадёт в инструмент-коннектор к базе.

Изолированные контейнеры

Каждый инструмент работает в своём контейнере. Сломанная зависимость в одном не задевает остальные.

Тёплые пулы для циклов инструментов

Включайте тёплые контейнеры для инструментов, которые модель вызывает раз за разом. Прежде чем настраивать размер пула, измерьте p95 задержки под реалистичным трафиком агента.

Как собрать API инструментов AI-агента на Inquir

1

Описать контракты инструментов

Задокументируйте схему входа, схему выхода и формы ошибок для каждого инструмента. Держите контракты стабильными между версиями модели.

2

Развернуть одну функцию на инструмент

Node.js, Python или Go — выбирайте под инструмент по нужным библиотекам. Секреты привязывайте на уровне рабочего пространства.

3

Подключить маршруты шлюза с API-ключом

Создайте маршрут на каждый эндпоинт инструмента. Включите авторизацию по API-ключу на уровне маршрута. Передайте ключ оркестратору через секреты.

API инструментов: lookup (Node.js), classify (Python) и диспетчеризация в оркестраторе

Один шлюз, разные среды выполнения. Оркестратор сопоставляет каждый tool_call модели с маршрутом шлюза и вызывает его с одним API-ключом; секреты ограничены каждой функцией.

tools/lookup.mjs (Node.js — обращается к внутренней БД)
export async function handler(event) {
  // API key verified at gateway — handler assumes authenticated caller
  const { customerId } = JSON.parse(event.body || '{}');
  if (!customerId) return { statusCode: 400, body: JSON.stringify({ error: 'customerId required' }) };
  const record = await db.customers.findById(customerId); // DB_URL from workspace secrets
  if (!record) return { statusCode: 404, body: JSON.stringify({ error: 'not found' }) };
  return { statusCode: 200, body: JSON.stringify({ customer: record }) };
}
tools/classify.py (Python — вызывает OpenAI)
import json, os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])  # scoped to this tool only

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: {text}"}])
    return {"statusCode": 200, "body": json.dumps({"intent": r.choices[0].message.content})}
orchestrator/dispatch.mjs (tool_call модели → шлюз)
// When the model returns a tool_call, dispatch it to the matching gateway route
const ROUTES = {
  lookup_customer: process.env.GATEWAY_URL + '/tools/lookup',
  classify_intent: process.env.GATEWAY_URL + '/tools/classify',
};

export async function dispatchToolCall(toolCall) {
  const { name, arguments: args } = toolCall.function ?? toolCall;
  const url = ROUTES[name];
  if (!url) return { error: `Unknown tool: ${name}` }; // returned to the model as the tool result
  const res = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', 'X-Api-Key': process.env.TOOLS_API_KEY },
    body: typeof args === 'string' ? args : JSON.stringify(args),
  });
  return res.json(); // structured JSON (result or error) goes back to the model
}

Кому подходит API инструментов AI-агента

Когда это уместно

  • Продакшен-агенты с несколькими инструментами, которым нужны авторизация, изолированные секреты и наблюдаемость по инструментам
  • Разноязычные бэкенды инструментов: Python для ML, Node.js для вызовов API
  • LLM-приложения с function calling OpenAI, tool use Anthropic или function declarations Gemini

Когда лучше выбрать другое

  • Демо с одним инструментом, которому не нужны авторизация и изоляция секретов

Частые вопросы

Может ли модель находить маршруты инструментов автоматически?

Отдавайте OpenAPI-спецификацию или манифест инструментов с эндпоинта обнаружения. Как только маршруты подключены, шлюз сам направляет вызовы модели к отдельным функциям инструментов.

Как версионировать инструменты?

Используйте префиксы пути (/tools/v1/lookup, /tools/v2/lookup) и направляйте их на разные версии функций. Переключайтесь вперёд, когда модель перепроверена на новом контракте.

Как обрабатывать ошибки вызова инструментов?

Возвращайте из обработчика структурированный JSON с ошибкой и передавайте его модели как результат инструмента — пусть модель решит, повторить, уточнить или сдаться.

А если инструмент работает дольше одного хода модели?

Пусть обработчик ставит фоновую задачу в очередь и сразу возвращает ID задачи. Оркестратор опрашивает маршрут статуса или ждёт колбэк, а задача повторяет упавшую работу с увеличивающейся задержкой.