Inquir Compute logoInquir Compute
Паттерн · Inquir Compute

API инструментов ИИ-агента: защищённые конечные точки для LLM

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

Обновлено: 2026-04-20

Суть ответа

API инструментов ИИ-агента: защищённые конечные точки для LLM. Одна функция на инструмент: `/search-customer`, `/create-invoice`, `/check-inventory`. API-ключ на уровне маршрута — без кода проверки авторизации внутри обработчика.

Когда подходит и когда нет

  • Инструмент работает с регулируемыми данными или секретами
  • Нужна изоляция зависимостей между инструментами

На что обратить внимание

  • Если все инструменты в одной функции — зависимости конфликтуют, логи смешиваются, и по ним почти нельзя понять, что именно сломалось.
  • Без аутентификации на шлюзе инструмент открыт любому, кто знает URL.

Почему инструменты агентов нужно изолировать

  • Authenticated HTTP endpoints — model cannot call open routes
  • Secrets off the model path — API keys never in prompts or context windows
  • Isolated execution — one tool failure cannot contaminate another
  • Low latency on the warm path — tight tool loops need sub-100ms response
  • Observability — trace which tool failed and why, per model call

Один монолитный сервис для всех инструментов смешивает зависимости, секреты и логи. Один деплой ломает все инструменты разом.

Почему serverless-монолит не подходит для агентов

Если все инструменты в одной функции — зависимости конфликтуют, логи смешиваются, и по ним почти нельзя понять, что именно сломалось.

Без аутентификации на шлюзе инструмент открыт любому, кто знает URL.

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

Одна функция на инструмент: `/search-customer`, `/create-invoice`, `/check-inventory`. API-ключ на уровне маршрута — без кода проверки авторизации внутри обработчика.

Секреты провайдера (OpenAI, Stripe, БД) в переменных окружения функции; ротация без повторного деплоя. Тёплый пул уместен при частых циклах вызова инструментов, когда важна стабильно низкая задержка.

Что нужно для API инструментов ИИ-агента

Одна функция на инструмент

Изолированные зависимости, отдельный деплой, логи с явной привязкой к инструменту.

Авторизация на шлюзе

API-ключ проверяется до хендлера. Инструмент не получает неаутентифицированный запрос.

Секреты на уровне функции

Разные ключи для разных инструментов; ротация без изменения промптов.

Тёплый пул

Горячие контейнеры для инструментов с высокой частотой вызовов в цикле «модель → инструмент».

Как создать инструмент для ИИ-агента

1

Определить контракт

Входные поля, валидация, форма ответа — до написания кода.

2

Написать обработчик

Node.js, Python или Go: проверка входа, вызов внешнего API, возврат JSON.

3

Настроить доступ и секреты

API-ключ на маршруте, секреты провайдера в переменных окружения.

Multi-language tool API: lookup (Node.js) + classify (Python)

Same gateway, different runtimes. The model calls both with the same API key; secrets are scoped per function.

tools/lookup.mjs (Node.js — calls internal DB)
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 — calls 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})}

Когда нужна отдельная конечная точка инструмента

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

  • Инструмент работает с регулируемыми данными или секретами
  • Нужна изоляция зависимостей между инструментами

Когда лучше не трогать

  • Инструмент только форматирует строку без побочных эффектов — достаточно простого встроенного ответа

Вопросы и ответы

Как передать URL инструмента в промпт?

URL шлюза + маршрут: `https://gateway.../tool-name`. API-ключ — в заголовке Authorization, не в промпте.

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

Сразу вернуть `{ jobId }`; оркестратор опрашивает статус. Либо включить тёплые контейнеры, чтобы снизить задержку.

Inquir Compute logoInquir Compute

Самый простой способ запускать AI-агентов и фоновые задачи без собственной инфраструктуры.

Связаться info@inquir.org

Привет, это команда Inquir Compute. Спроси AI о продукте:

© 2025 Inquir Compute. Все права защищены.