Первый запрос к API
Положите ключ в переменную окружения, проверьте его запросом списка моделей и отправьте первое сообщение. Примеры для curl, Python и Node.js.
Отправьте первый запрос
Понадобятся ключ API и положительный баланс. Ключ выдаёт кабинет разработчика (страница /developers), условия выдачи описаны в статье Ключ API.
- Положите ключ в переменную окружения, чтобы он не попал в код и в историю команд.
# Linux и macOS export EPICAI_API_KEY="sk-epic-ВАШ_КЛЮЧ" # Windows PowerShell $env:EPICAI_API_KEY = "sk-epic-ВАШ_КЛЮЧ" - Проверьте ключ запросом списка моделей. Он ничего не стоит и сразу показывает, принят ли ключ.
curl https://epicai.ru/v1/models \ -H "Authorization: Bearer $EPICAI_API_KEY"Придёт JSON со списком моделей и их ценами. Код 401 означает, что ключ неверен или отозван. Остальные коды разобраны в статье Ошибки API.
- Отправьте сообщение выбранной модели.
curl https://epicai.ru/v1/chat/completions \ -H "Authorization: Bearer $EPICAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-6-luna", "messages": [ {"role": "user", "content": "Назови столицу Франции одним словом."} ], "max_tokens": 400 }'
Имя модели берите из списка GET /v1/models как есть, у многих оно содержит косую черту, например vendor/model. Имя в примере служит образцом, подставьте любое из своего списка.
СоветВ консолях Windows кириллица в аргументе
-dможет исказиться. Сохраните тело запроса в файл в кодировке UTF-8 и передайте его ключом--data-binary @request.json.
Прочитайте ответ
{
"id": "chatcmpl-dab33bdee0ce7fc5d1c862a9",
"object": "chat.completion",
"created": 1793095138,
"model": "gpt-6-luna",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Париж"},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 14, "completion_tokens": 7, "total_tokens": 21},
"epic": {"cost_tok": 1, "request_id": "req_dab33bdee0ce7fc5d1c862a9"}
}
choices[0].message.content— текст ответа.finish_reason— причина остановки. Значениеstopговорит о естественном конце ответа, аlengthоб обрыве поmax_tokens.usage— токены модели: сколько ушло на запрос и сколько на ответ.epic.cost_tok— сколько TOK списано с баланса. То же число лежит в заголовке ответаx-epic-cost-tok, аepic.request_idсовпадает с заголовкомx-request-id. Номер запроса пригодится, если придётся писать в поддержку.
То же в Python и Node.js
Официальные библиотеки openai принимают адрес и ключ в конструкторе, остальной код не меняется.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://epicai.ru/v1",
api_key=os.environ["EPICAI_API_KEY"],
)
reply = client.chat.completions.create(
model="gpt-6-luna",
messages=[{"role": "user", "content": "Назови столицу Франции одним словом."}],
max_tokens=400,
)
print(reply.choices[0].message.content)
print("Списано TOK:", reply.model_extra["epic"]["cost_tok"])
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://epicai.ru/v1",
apiKey: process.env.EPICAI_API_KEY,
});
const reply = await client.chat.completions.create({
model: "gpt-6-luna",
messages: [{ role: "user", content: "Назови столицу Франции одним словом." }],
max_tokens: 400,
});
console.log(reply.choices[0].message.content);
console.log("Списано TOK:", reply.epic.cost_tok);
Поле epic принадлежит epicai, в описании типов библиотек его нет. Python отдаёт такие поля через model_extra, Node.js оставляет их на объекте ответа, а в TypeScript к ним обращаются через приведение типа.
Поставьте потолок ответа
Параметр max_tokens ограничивает длину ответа и задаёт размер резерва на балансе. Без него epicai берёт запас по умолчанию, и резерв получается большим. Пока токенов мало, это приводит к отказу 402 insufficient_funds даже при коротком реальном ответе. Как считается резерв, объясняет статья Баланс и списание в API.
Не нашли ответ?
Посмотрите частые вопросы или напишите в поддержку.