Гайд · TNWS AI
Как настроить function calling в Cloudflare Workers AI безопасно
Traditional function calling в Workers AI: описание tools, JSON-аргументы, allowlist, schema validation, авторизация и двухшаговый вызов внешнего API.
Что именно решаем
Материал отвечает на запрос «как настроить function calling Cloudflare Workers AI». Фактическая часть сверена 12 сентября 2026 года с официальной документацией Cloudflare. Здесь нет обещаний о цене, квоте или постоянной доступности модели: эти параметры проверяют в своём аккаунте и актуальном Workers AI Models catalog перед запуском.
Применимость
Traditional Function Calling (Beta) для поддерживаемой модели Workers AI. Модель возвращает имя и аргументы; внешний вызов выполняет ваше приложение после проверки.
Результат считается готовым не после первого HTTP 200, а после проверки формального ответа и контрольного бизнес-условия. Зафиксируйте дату теста, полный model ID, способ вызова — binding, native REST или OpenAI-compatible endpoint — и версии Wrangler/SDK. Это позволяет отличить изменение кода от обновления сервиса.
Проверенные параметры
- Tools передаются массивом объектов с
name,descriptionиparameters. - Официальный пример использует
@hf/nousresearch/hermes-2-pro-mistral-7bи toolgetWeather. - Ответ содержит
tool_callsс именем функции и JSON-аргументами. - Workers AI также предлагает embedded function calling через пакет
@cloudflare/ai-utils, но это отдельный workflow.
Не переносите параметры между моделями автоматически. Text generation, embeddings, reranking и batch имеют разные формы входа и результата. Значения <ACCOUNT_ID>, <MODEL_ID> и <GATEWAY_ID> в шаблонах заменяют фактическими идентификаторами, а не догадками.
Контрольный пример
Вход: Фраза Покажи заказ 42 и единственный разрешённый инструмент чтения заказа.
Ожидаемый результат: Модель предлагает getOrder с integer 42; лишнее поле, строковый ID и недоступный пользователю заказ блокируются до внешнего API.
Сохраните очищенное тело запроса, HTTP-код, Cloudflare success, массив errors, request ID, model ID и время выполнения. API token, персональные данные и закрытые документы в тестовый артефакт не попадают. Для модельного ответа разделяйте технический PASS и смысловой PASS: корректный JSON может содержать неверный факт.
Настройка по шагам
- Создайте отдельный тестовый проект. Секрет передайте через
CLOUDFLARE_API_TOKEN; Account ID можно хранить как конфигурацию, но токен нельзя помещать во frontend, репозиторий или скриншот. - Откройте актуальную карточку модели и подтвердите требуемую функцию. Поддержка обычного inference не означает автоматически JSON Mode, function calling, batch или prompt caching.
- Выберите один интерфейс для первого теста. Для Worker binding имя в Wrangler должно совпадать с полем
env; для REST проверьте Account ID, endpoint и Bearer header; для OpenAI SDK — base URL. - Отключите автоматические retry на диагностическом запуске. Выполните минимальный пример и запишите исходную ошибку целиком после маскировки токена.
- Проверьте Cloudflare envelope и предметный контракт. Пустой result,
success=false, неполный массив или неверный тип поля — это FAIL даже при успешном транспорте. - Добавьте отрицательный тест: неверный тип, отсутствующее обязательное поле, неизвестный resource либо превышенный локальный лимит. Приложение должно отказать безопасно и не повторять неисправимый запрос.
- Прогоните 20–50 обезличенных случаев реального распределения: кириллицу, пустые строки, длинный вход, граничные числа и ожидаемые отказы. Только затем включайте concurrency, cache и retry.
Рабочий шаблон
const tools=[{name:'getOrder',description:'Read one order',parameters:{type:'object',properties:{order_id:{type:'integer',minimum:1}},required:['order_id'],additionalProperties:false}}];
const r=await env.AI.run('@hf/nousresearch/hermes-2-pro-mistral-7b',{messages:[{role:'user',content:'Покажи заказ 42'}],tools});
// validate r.tool_calls[0].arguments, check ACL, then call getOrder(42)
Шаблон показывает проверяемый контракт, но не заменяет production-обвязку. Добавьте timeout, ограничение размера тела, централизованное удаление секретов из логов, correlation ID и allowlist ресурсов. Любая операция, меняющая данные, требует отдельной авторизации и идемпотентности.
Готовый промпт для проверки
Выполни только одну задачу на данных ниже.
Не добавляй факты, которых нет во входе.
Если обязательного значения нет, верни MISSING_FIELD.
Соблюдай указанный формат буквально, без Markdown и пояснений.
Вход: {CONTROL_INPUT}
Ожидаемые маркеры: {EXPECTED_MARKERS}
Промпт — воспроизводимый fixture, а не средство безопасности. JSON Schema, проверка типов, авторизация tool arguments и фильтрация результата выполняются кодом. Инструкцию из загруженного документа нельзя повышать до системной команды.
Как проверить результат
- имя в allowlist
- аргументы прошли JSON Schema
- ACL проверен
- таймаут внешнего API задан
- аудит не содержит секретов
Создайте журнал case_id | input_hash | model | parameters | expected | actual | pass. Для latency отдельно измеряйте time to first token, полное время p50/p95 и процент ошибок. Сравнивайте варианты на одинаковых входах, с одной моделью и фиксированными параметрами.
Нагрузку повышайте ступенчато от одного параллельного запроса. Длина входа и максимальный вывод остаются постоянными. Иначе нельзя понять, вызвано ухудшение rate limit, длиной prompt или моделью. Повторный прогон после прогрева не смешивают с холодным baseline.
Типичные ошибки и что не делать
- Выполнять tool call непосредственно из ответа модели.
- Помещать секрет в description инструмента.
- Не проверять права пользователя на конкретный order_id.
Не повторяйте 400, 401, 403 и 404 как временные ошибки: исправьте payload, токен, permissions или resource ID. Для 429 и отдельных 5xx используйте ограниченный retry budget, exponential backoff и jitter. Бесконечные повторы усиливают перегрузку.
Не доверяйте тексту модели как разрешению на оплату, удаление или публикацию. Tool name проверяют по allowlist, arguments — по схеме, объект — по ACL текущего пользователя. Чувствительные операции требуют явного подтверждения и audit trail без секретов.
Регрессионная проверка
После смены модели, prompt, JSON Schema, Wrangler, SDK, binding или gateway повторите весь набор. Сравнивайте техническую успешность, бизнес-PASS, p95 latency и число ручных исправлений. Улучшение одной метрики не доказывает готовность к релизу.
Для A/B используйте стабильное разбиение по case_id и одинаковые входы. Сохраняйте дату проверки: Cloudflare обновляет модели, функции и limits, поэтому пример нельзя считать вечной гарантией поддержки.
FAQ
Достаточно ли HTTP 200?
Нет. Проверьте success, errors, форму result и предметный критерий.
Где хранить API token?
Только на backend — в переменной окружения или менеджере секретов.
Можно ли взять любое имя модели?
Нет. Используйте полный актуальный model ID из Workers AI Models catalog.
Нужно ли повторять тест после обновления?
Да. Смена модели, Wrangler, SDK, prompt или схемы требует regression-прогона.
Официальный источник
Частые вопросы
Достаточно ли HTTP 200?
Нет, проверьте success, errors и предметный результат.
Можно ли хранить API token во frontend?
Нет, постоянный токен остаётся на backend.
Нужно ли проверять model ID?
Да, используйте актуальный Workers AI Models catalog.
Нужен ли отрицательный тест?
Да, он проверяет безопасный отказ.
Читайте также
Как подключить AI Gateway к Cloudflare Workers AI
Маршрутизация Workers AI через AI Gateway: cf-aig-gateway-id, Bearer token, прежний ai/v1 endpoint, проверка логов и безопасная передача metadata.
Как подключить OpenAI SDK к Cloudflare Workers AI
OpenAI-compatible endpoint Workers AI: правильный baseURL с Account ID, Cloudflare API token, chat.completions, responses и embeddings без ложной совместимости.
Как подключить Workers AI binding к Cloudflare Worker и проверить ответ
Практическая настройка AI binding в wrangler.jsonc, вызов env.AI.run, локальная проверка через wrangler dev и безопасный деплой Worker.
Комментарии
Пока тихо. Скажите первое слово