Гайд по интеграции API DeepSeek через ECAIX: совместимые запросы OpenAI
Гайд по интеграции API DeepSeek через ECAIX: совместимые запросы OpenAI
Этот гайд показывает, как протестировать модель DeepSeek через ECAIX с использованием совместимого эндпоинта OpenAI. Он охватывает минимальный рабочий запрос, примеры на Python и curl, проверку идентификаторов моделей, потоковый вывод, структурированный ответ и инструменты, а также путь диагностики для распространённых ошибок.
Гайд описывает доступ через портал ECAIX к модели, выложенной в текущем каталоге ECAIX. Он не утверждает, что ECAIX является официальным эндпоинтом API DeepSeek или что все возможности DeepSeek доступны через все маршруты портала. Проверьте страницу модели в реальном времени и документацию поставщика перед переносом нагрузки в производство.
Что проверяет этот гайд
Примеры используют совместимый с OpenAI путь через ECAIX и идентификатор модели, который сейчас виден в публичном каталоге на момент публикации. Доступность, маршрутизация, ограничения, цены и поддерживаемые функции могут меняться. Обращайтесь к каталогу и документации API как к текущему источнику истины.
Быстрая настройка
Используйте следующий порядок действий, если у вас уже есть приложение с SDK OpenAI:
- Проверьте страницу модели DeepSeek v4.1 Flash и убедитесь, что идентификатор доступен.
- Создайте ключ API ECAIX.
- Установите совместимый с OpenAI основной URL:
https://ecaix.com/api/ai/v1. - Оставьте SDK и код приложения неизменными, где это возможно.
- Запустите минимальный запрос ниже.
- Добавьте потоковый вывод, JSON-ответы или инструменты только после того, как базовый запрос будет работать корректно.
Эндпоинт и идентификатор модели
Для совместимых с OpenAI клиентов используйте:
Base URL: https://ecaix.com/api/ai/v1
Model: deepseek-v4.1-flash
Идентификатор модели не является гарантией на странице статического поста. Убедитесь в его актуальности на живой странице каталога моделей перед каждой новой интеграцией или развёртыванием. Если вам нужен другой член семейства DeepSeek, скопируйте точный идентификатор с страницы детали модели, а не гадайте о суффиксе.
Важно также учитывать формат эндпоинта. SDK должно получать основной путь, заканчивающийся /v1, а клиент добавляет /chat/completions или другой операционный путь. Не добавляйте /chat/completions к base_url, если SDK уже добавляет его.
Python с SDK OpenAI
Установите или обновите Python SDK OpenAI в виртуальной среде:
python -m pip install --upgrade openai
Затем используйте основной URL ECAIX и ключ API:
const client = new OpenAI({
apiKey: process.env.ECAIX_API_KEY,
baseURL: "https://ecaix.com/api/ai/v1",
});
const response = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [
{ role: "user", content: "Return one short sentence about API testing." },
],
max_tokens: 128,
});
console.log(response.choices[0].message.content);
Используйте серверное приложение для выполнения API-запроса. Браузерное приложение должно обращаться к собственному бэкенду, а не экспонировать ключ ECAIX в клиентском JavaScript.
Диагностический запрос с помощью curl
Если SDK не работает, избавьтесь от SDK и протестируйте эндпоинт напрямую. Сохраните заголовки и тело запроса отдельно, чтобы различать проблемы HTTP и проблемы формата ответа.
curl -sS -D /tmp/ecaix-deepseek-headers.txt \
-o /tmp/ecaix-deepseek-response.json \
-w '\nHTTP %{http_code}\n' \
"https://ecaix.com/api/ai/v1/chat/completions" \
-H "Authorization: Bearer ${ECAIX_API_KEY}" \
-H "content-type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [
{"role": "user", "content": "Reply with one short sentence."}
],
"max_tokens": 128
}'
Не вставляйте сохранённые заголовки или ответы в публичный ticket без удаления ключей API, идентификаторов запросов, запросов, путей репозитория и данных клиентов.
Диагностика ответа
Используйте следующий порядок действий:
- Статус HTTP: определите, достиг ли запрос валидного эндпоинта.
- Тело ответа: прочитайте код ошибки поставщика или портала.
- Идентификатор модели: скопируйте точный идентификатор с текущего каталога моделей.
- Авторизация: проверьте заголовок ключа, учётную запись и разрешения.
- Форма запроса: упростите тело до
model,messagesи небольшого ограничения на вывод. - Параметры функций: добавьте потоковый вывод, JSON или инструменты по одному.
- Поведение SDK: сравните запрос SDK с прямым curl-запросом.
Это предотвращает путаницу между проблемами клиентской библиотеки, маршрутизацией модели или разрешениями на аккаунте.
Потоковые ответы
Если приложение требует инкрементального вывода, добавьте потоковый вывод только после успешного выполнения обычного запроса:
stream = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Summarize API retries in three points."}],
stream=True,
max_tokens=256,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
Поведение конкретных событий зависит от эндпоинта и SDK. Убедитесь, что ваша фреймворк корректно обрабатывает пустой delta, финальное событие использования, разрыв соединения и завершение в стиле [DONE]. Не считайте реализацию потокового вывода готовой к производству, пока не протестируете разрывы соединений и повторные попытки.
Структурированный вывод и JSON
Если вам нужен машинно-читаемый ответ, начните с обычного запроса, а затем добавьте минимальную поддерживаемую опцию структурированного вывода с эндпоинта и модели. Валидируйте возвращаемый контент с помощью реального JSON-парсера. Промпт, который говорит «верните JSON», не то же самое, что и ответ с принудительным форматом.
import json
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{
"role": "user",
"content": "Return a JSON object with keys title and priority."
}
],
response_format={"type": "json_object"},
max_tokens=128,
)
payload = json.loads(response.choices[0].message.content)
print(payload["title"])
Принятие параметра response_format может зависеть от модели и маршрута. Если эндпоинт возвращает ошибку недопустимого параметра, удалите поле и проверьте документацию маршрута перед попыткой другого формата.
Вызов функций и инструменты
Вызов инструментов требует отдельного теста от генерации текста. Начните с одного безвредного инструмента и проверьте возвращаемое имя и аргументы перед выполнением чего-либо.
tools = [
{
"type": "function",
"function": {
"name": "get_demo_status",
"description": "Return a fixed status for a local compatibility test.",
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": False,
},
},
}
]
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Check the demo status."}],
tools=tools,
tool_choice="auto",
max_tokens=128,
)
print(response.choices[0].message.tool_calls)
Модель может вернуть валидный текстовый ответ, но при этом не поддерживать вызов инструментов из-за несоответствия схемы, недопустимых параметров или специфичного поведения клиента. Никогда не выполняйте возвращаемые аргументы инструментов в производственной системе без валидации схемы и добавления проверок на авторизацию.
Совместимые с OpenAI и Anthropic пути
ECAIX предоставляет разные поверхности совместимости для разных клиентов:
| Клиент или рабочий процесс | Путь документации | Что нужно проверить |
|---|---|---|
| SDK Python/Node OpenAI | /api/ai/v1 | Chat Completions, Ответы, потоковый вывод, инструменты |
| Клиент Anthropic | /api/ai/v1/anthropic | Поля сообщений, заголовки, блоки содержимого |
| Третий-партийный рабочий процесс с Claude Code | /api/ai/v1/anthropic | Специфичное поведение поставщика; не официальная поддержка Anthropic |
Просмотрите документацию по Chat Completions, Ответам и Сообщениям Anthropic перед выбором пути. Один и тот же идентификатор модели может не экспонировать идентичные поля или поведение на каждой поверхности совместимости.
Технические детали текущих моделей
Используйте живые страницы деталей для проверки возможностей и доступности:
Эти страницы более надёжны, чем статический пост, для текущих идентификаторов моделей, контекстной информации и страниц цен.
Общие ошибки
| Статус или симптом | Вероятная причина | Действие диагностики |
|---|---|---|
401 | Отсутствует или неверный токен Bearer | Проверьте Authorization, переменную окружения и статус ключа |
403 | Ключ или учётная запись не имеет прав | Проверьте доступ к учётной записи и доступность модели |
404 | Неправильный основной URL или суффикс маршрута | Используйте /api/ai/v1/chat/completions для прямого curl-теста |
400 | Неправильное тело или не поддерживаемый параметр | Удалите необязательные параметры и повторите запрос с минимальным телом |
429 | Превышение лимитов скорости или квоты | Запишите заголовки ответа, замедлитесь и проверьте лимиты учётной записи |
5xx | Проблема портала или сервера | Сохраните время запроса и идентификатор ответа; повторите в соответствии с вашей политикой |
| Модель не найдена | Ошибка ввода, удалённая модель или несоответствие маршрутизации | Скопируйте точный идентификатор модели с /models |
| Текст работает, инструменты не работают | Несоответствие схемы инструментов или нех |