ВойтиКонтактыНачать бесплатно
Base URL and SDK Migration24 июля 2026 г.Flatkey Team

Chat Completions с cURL для нескольких AI-моделей

Используйте один совместимый с OpenAI cURL-запрос, чтобы протестировать семейства моделей GPT, Claude, Gemini и DeepSeek, сравнить результаты и добавить безопасную обработку сбоев.

Chat Completions с cURL для нескольких AI-моделей

О шлюзе для ИИ можно узнать больше из одной команды в терминале, чем из длинного списка возможностей. Если шлюз действительно совместим с OpenAI, одна и та же команда curl должна работать для поддерживаемых семейств моделей, при этом базовый URL, заголовок авторизации, формат сообщений и разбор ответа остаются неизменными.

В этом руководстве показан практический подход с Flatkey: начните с одного запроса chat-completions, вынесите имя модели в переменную и протестируйте несколько актуальных семейств моделей, не переписывая интеграцию. Материал предназначен для разработчиков, которые хотят проверить API из терминала, прежде чем подключать SDK или вносить код в приложение.

Примечание о выборе модели: Каталоги моделей меняются. Идентификаторы моделей ниже соответствуют общедоступной документации Flatkey, проверенной 24 июля 2026 года. Перед использованием ID в production подтвердите актуальную строку модели и доступность.

Кратчайший рабочий запрос cURL для chat-completions

Создайте API-ключ Flatkey, экспортируйте его в оболочку и отправьте запрос к совместимому с OpenAI endpoint для chat-completions:

export FLATKEY_API_KEY="your-flatkey-api-key"

curl https://router.flatkey.ai/v1/chat/completions \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [
      {
        "role": "user",
        "content": "Write a one-sentence product description for a waterproof daypack."
      }
    ]
  }'

Важны четыре части:

Часть запроса Что остается неизменным
Базовый URL https://router.flatkey.ai/v1
Endpoint /chat/completions
Аутентификация Authorization: Bearer $FLATKEY_API_KEY
Формат сообщений Массив объектов с полями role и content

Для совместимых chat-моделей основной параметр, который вы меняете, — model.

Используйте одинаковую структуру cURL для разных семейств моделей

Поместите идентификатор модели в переменную оболочки, чтобы не нужно было менять тело запроса:

export FLATKEY_API_KEY="your-flatkey-api-key"
export MODEL="gpt-4o-mini"

curl -sS https://router.flatkey.ai/v1/chat/completions \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\": \"$MODEL\",
    \"messages\": [
      {
        \"role\": \"system\",
        \"content\": \"Return concise ecommerce copy.\"
      },
      {
        \"role\": \"user\",
        \"content\": \"Write a product title for a lightweight waterproof daypack.\"
      }
    ],
    \"temperature\": 0.2
  }" | jq -r '.choices[0].message.content'

Теперь повторно запустите команду с другим задокументированным ID модели:

export MODEL="claude-sonnet-4-6"
export MODEL="gemini-2.5-flash"
export MODEL="deepseek-v3.1"

Запрос по-прежнему использует тот же endpoint, те же заголовки, сообщения и парсер jq. Именно эта стабильная форма вызова и дает операционное преимущество: вы можете сравнивать поддерживаемые семейства моделей, не поддерживая отдельный терминальный скрипт для каждого провайдера.

Примечание о выборе модели: Общая форма запроса не означает, что каждая модель ведет себя одинаково. Поддерживаемые параметры, ограничения контекста, поведение инструментов, поведение в части безопасности, задержка и стиль вывода могут различаться. Рассматривайте совместимость как более простую поверхность интеграции, а не как доказательство того, что модели взаимозаменяемы.

Запустите небольшой цикл тестирования нескольких моделей

Для быстрого сравнения в терминале задайте короткий список и отправьте каждой модели один и тот же запрос:

#!/usr/bin/env bash
set -euo pipefail

: "${FLATKEY_API_KEY:?Сначала задайте FLATKEY_API_KEY}"

MODELS=(
  "gpt-4o-mini"
  "claude-sonnet-4-6"
  "gemini-2.5-flash"
  "deepseek-v3.1"
)

PROMPT="Write three benefit-led bullet points for a waterproof commuter backpack."

for MODEL in "${MODELS[@]}"; do
  echo
  echo "=== $MODEL ==="

  jq -n \
    --arg model "$MODEL" \
    --arg prompt "$PROMPT" \
    '{
      model: $model,
      messages: [
        {role: "system", content: "You write concise ecommerce copy."},
        {role: "user", content: $prompt}
      ],
      temperature: 0.2
    }' |
  curl -sS https://router.flatkey.ai/v1/chat/completions \
    -H "Authorization: Bearer $FLATKEY_API_KEY" \
    -H "Content-Type: application/json" \
    --data-binary @- |
  jq -r '.choices[0].message.content // .error.message'
done

Использование jq -n для построения JSON безопаснее, чем ручное экранирование длинной shell-строки. Это также упрощает расширение скрипта переменными, дополнительными сообщениями или необязательными параметрами.

Сохраните скрипт как compare-models.sh, сделайте его исполняемым и запустите:

chmod +x compare-models.sh
./compare-models.sh

Что сравнивать в выводе

Тестирование нескольких моделей полезно только тогда, когда запрос и метод оценки остаются неизменными. Для задачи написания ecommerce-копирайта сравнивайте:

Dimension Terminal-friendly check
Instruction following Вывод вернул ровно три пункта?
Format stability Можно ли разобрать ответ без особых случаев?
Brand fit Тон специфичен, убедителен и не содержит неподтвержденных утверждений?
Latency Сколько времени занял запрос?
Token usage Что ответ сообщил в своем объекте usage?
Error behavior Возвращает ли неудачный запрос полезное сообщение об ошибке?

Добавьте поля тайминга cURL, когда важна задержка:

curl -sS -o response.json \
  -w 'status=%{http_code} total=%{time_total}s\n' \
  https://router.flatkey.ai/v1/chat/completions \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-2.5-flash",
    "messages": [
      {"role": "user", "content": "Напишите продуктовый слоган из пяти слов."}
    ]
  }'

jq . response.json

Это разделяет измерения транспортного уровня и вывод модели. Терминал выводит HTTP-статус и общее время запроса, а JSON-ответ остаётся доступным для просмотра.

Примечание по выбору модели: Не выбирайте production-модель по одному ответу. Запустите репрезентативный набор запросов, повторите обращения и оцените результаты по требованиям, важным для вашего приложения.

Сделайте запрос сопоставимым

Небольшие изменения промпта или параметров могут сделать тест модели вводящим в заблуждение. Используйте следующие настройки:

  1. Оставляйте сообщения идентичными. Не улучшайте промпт для одной модели и не оставляйте его без изменений для остальных.
  2. Используйте одинаковую temperature. Более низкие значения обычно упрощают анализ сравнительных запусков.
  3. Сохраняйте сырой JSON. Храните полный ответ, а не только отрендеренный текст.
  4. Записывайте ID модели. Отображаемого имени недостаточно для воспроизводимых тестов.
  5. Отделяйте ошибки от плохих ответов. Ошибка транспорта или доступности не является оценкой качества вывода.
  6. Проверяйте текущую доступность. Указанная в документации модель всё равно может менять операционный статус.

Добавьте базовую обработку сбоев

Используйте --fail-with-body, чтобы cURL завершался при HTTP-ошибках, сохраняя тело ответа:

HTTP_BODY=$(mktemp)

if ! curl --fail-with-body -sS \
  -o "$HTTP_BODY" \
  https://router.flatkey.ai/v1/chat/completions \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [
      {"role": "user", "content": "Верните слово ready."}
    ]
  }'; then
  jq -r '.error.message // "Request failed"' "$HTTP_BODY" >&2
  rm -f "$HTTP_BODY"
  exit 1
fi

jq -r '.choices[0].message.content' "$HTTP_BODY"
rm -f "$HTTP_BODY"

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

Практическая политика выбора модели

Самая простая политика — выбирать по типу нагрузки, а не по имени провайдера:

Нагрузка Первый тест Что проверить перед внедрением
Большие объемы простого копирайта Быстрая и экономичная модель Соответствие формату и приемлемый уровень ошибок
Тонкий брендовый текст Более сильная универсальная модель Тон, фактическая сдержанность и частота правок
Синтез длинного контекста Модель с подходящей поддержкой контекста Качество извлечения и поведение при усечении
Интерфейс, чувствительный к задержке Модель с низкой задержкой Хвостовая задержка, а не только один быстрый запрос
Путь резервного перехода Модель из другой семейства Совместимость параметров и контракт вывода

Начните с самой маленькой модели, которая надежно проходит ваш порог качества. Переходите к более сильной модели, когда задача этого требует. Если вы добавляете резервную маршрутизацию, тестируйте резервный вариант с тем же контрактом ответа, а не исходите из того, что он может заменить основную модель без изменений в приложении.

Перед выбором ID для производственного теста вы можете ознакомиться с текущим доступом к моделям и ценами на странице цен Flatkey.

Когда переходить от cURL к SDK

cURL идеально подходит, чтобы быстро проверить четыре вещи:

  • API-ключ работает
  • базовый URL указан верно
  • выбранная модель принимает запрос
  • форма ответа соответствует вашему парсеру

Переходите к SDK, когда вам нужны помощники для потоковой передачи, структурированная логика повторных попыток, типизированные ответы, переиспользуемые клиенты или наблюдаемость на уровне приложения. Сохраните успешный cURL-запрос в вашем рабочем регламенте: это по-прежнему самый быстрый способ отделить проблемы доступа через шлюз от проблем конфигурации SDK.

Итоговый чек-лист реализации

  • Экспортируйте API-ключ, а не помещайте его напрямую в скрипты.
  • Используйте https://router.flatkey.ai/v1 в качестве базового URL.
  • Отправляйте совместимые chat-запросы на /chat/completions.
  • Перенесите ID модели в конфигурацию.
  • Создавайте JSON с помощью jq, когда экранирование в shell становится сложным.
  • Сохраняйте HTTP-статус, задержку, содержимое ответа и данные об использовании.
  • Сравнивайте модели с идентичными промптами и параметрами.
  • Перед запуском в продакшн проверяйте актуальную доступность каталога.
  • Добавьте таймауты, ограниченные повторные попытки и безопасное для секретов логирование в коде приложения.

Один стабильный cURL-запрос дает вам чистую отправную точку. Когда он работает, изменение поля model превращает этот запрос в практический тестовый стенд для нескольких семейств AI-моделей — без необходимости каждый раз менять аутентификацию, базовый URL или парсер ответа.

Часто задаваемые вопросы

Могу ли я использовать один и тот же cURL-запрос chat-completions для каждой AI-модели?

Используйте его для моделей, которые Flatkey предоставляет через совместимый маршрут chat-completions. Для других модальностей или особенностей, зависящих от протокола, могут потребоваться другие конечные точки или поля запроса.

Каков минимальный набор полей для запроса chat-completions?

Для базового запроса укажите поддерживаемый model и массив messages. Также нужны заголовок авторизации bearer и тип содержимого JSON.

Зачем помещать имя модели в переменную окружения?

Это сохраняет стабильную структуру запроса, уменьшает количество ошибок при редактировании и упрощает запуск скриптов в средах staging, evaluation и production.

Стоит ли использовать cURL в production?

cURL отлично подходит для проверки, скриптов и runbooks. Для большинства production-приложений больше подходит SDK или HTTP-клиент с явной поддержкой тайм-аутов, повторных попыток, телеметрии и обработки типов.

Как выбрать между моделями GPT, Claude, Gemini и DeepSeek?

Выбирайте на основе репрезентативного набора для оценки. Сравнивайте следование инструкциям, качество вывода, задержку, расход токенов, поведение при ошибках и конкретные возможности, которые требуются вашей рабочей нагрузке. Перед развёртыванием подтвердите текущую доступность.