Быстрый старт
Сделайте первый запрос: получите ключ, отправьте одно сообщение и прочитайте ответ. API понимает форматы OpenAI и Anthropic, поэтому SDK, которым вы уже пользуетесь, заработает после смены базового URL и ключа.
1. Получите ключ
У каждого аккаунта есть один API-ключ. Войдите, откройте Keys & usage и скопируйте его. Ключ работает на всех эндпоинтах и со всеми моделями. Keys & usage
2. Укажите клиенту адрес API
Все эндпоинты находятся под одним базовым URL. OpenAI SDK принимает его с /v1 на конце; Anthropic SDK — без него, потому что сам добавляет /v1/messages.
| Клиент | Базовый URL |
|---|---|
| OpenAI SDK и OpenAI-совместимые клиенты | https://api.shannon-ai.com/v1 |
| Anthropic SDK | https://api.shannon-ai.com |
Текст выдают три эндпоинта. Они обращаются к одним и тем же моделям; выберите тот, чей формат уже использует ваш код.
| Эндпоинт | Формат |
|---|---|
POST /v1/chat/completions | OpenAI Chat Completions |
POST /v1/messages | Anthropic Messages |
POST /v1/responses | OpenAI Responses |
3. Отправьте первый запрос
Отправьте одно сообщение user модели shannon-3 на эндпоинте Chat Completions. Замените YOUR_API_KEY своим ключом.
POST https://api.shannon-ai.com/v1/chat/completions
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1"
)
response = client.chat.completions.create(
model="shannon-3",
messages=[
{"role": "user", "content": "Hello, Shannon!"}
],
max_tokens=1024
)
print(response.choices[0].message.content) import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com/v1'
});
const response = await client.chat.completions.create({
model: 'shannon-3',
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
],
max_tokens: 1024
});
console.log(response.choices[0].message.content); package main
import (
"context"
"fmt"
openai "github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig("YOUR_API_KEY")
config.BaseURL = "https://api.shannon-ai.com/v1"
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: "shannon-3",
Messages: []openai.ChatCompletionMessage{
{Role: "user", Content: "Hello, Shannon!"},
},
MaxTokens: 1024,
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
} curl -X POST "https://api.shannon-ai.com/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
],
"max_tokens": 1024
}' | Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
model | string | Id модели, которая отвечает. Список id приведен на странице Модели и цены. | |
messages | array | Разговор на данный момент: объекты с role и content. Последнее сообщение user — это промпт. Обязательное поле. | |
max_tokens | integer | 4096 | Бюджет вывода запроса, от 1 до 65,536. Запрос резервирует это количество на вашем балансе, а списывается то, что реально использовано. |
stream | boolean | false | true отправляет ответ по частям, пока он пишется. |
Тело запроса — JSON, и нужен заголовок Content-Type: application/json. Полный список полей — на странице эндпоинта. Chat Completions
Ответ
Вызов без stream возвращает один JSON-объект, когда ответ готов. Тексты и числа ниже — примеры.
{
"id": "chatcmpl-9b2f6c1e4a7d4f0f8a3c5d2e1b6a7c90",
"object": "chat.completion",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! What would you like to work on?",
"reasoning_content": "A greeting. A short, friendly reply fits."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1386,
"completion_tokens": 74,
"total_tokens": 1460
}
} | Поле | Тип | Описание |
|---|---|---|
id | string | chatcmpl- и за ним 32 шестнадцатеричных символа. |
object | string | Всегда chat.completion. |
created | integer | Время ответа в секундах Unix. |
model | string | Опубликованный id модели, которая ответила, в том числе когда вы отправили псевдоним или другое написание. |
choices | array | Всегда одна запись с index 0. |
choices[0].message.role | string | Всегда assistant. |
choices[0].message.content | string | null | Ответ. Может быть null, если в ответе есть tool_calls. |
choices[0].message.reasoning_content | string | null | Reasoning модели перед ответом или null, если его нет. |
choices[0].message.tool_calls | array | Присутствует, только если модель вызывает один из объявленных вами инструментов. |
choices[0].finish_reason | string | stop для ответа, tool_calls, если модель вызывает инструмент. |
usage.prompt_tokens | integer | Токены, которые модель прочитала для этого ответа. На shannon-2-* и семействе Shannon 3 их может быть больше, чем в отправленном вами тексте. |
usage.completion_tokens | integer | Токены, которые написала модель. |
usage.total_tokens | integer | Итог. Стоимость вызова модели Shannon рассчитывается по этому числу. |
-
usageсодержит число токенов, а не деньги. Сколько вызов списал с вашего баланса, показано по каждому запросу на Keys & usage; как это считается, описано на странице Лимиты и баланс. Лимиты и баланс - В каждом ответе, в том числе в ошибке и в потоке, есть заголовок
x-request-id. Если в вашем запросе есть заголовокx-request-id, возвращается его значение; иначе значение состоит из 12 шестнадцатеричных символов. Сохраняйте его в логах: он идентифицирует именно этот запрос.
Тот же вызов в виде потока
Задайте stream равным true, чтобы читать ответ по мере его написания. Все остальное в запросе остается прежним.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1"
)
stream = client.chat.completions.create(
model="shannon-3",
messages=[
{"role": "user", "content": "Hello, Shannon!"}
],
max_tokens=1024,
stream=True
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True) import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com/v1'
});
const stream = await client.chat.completions.create({
model: 'shannon-3',
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
],
max_tokens: 1024,
stream: true
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
} curl -N -X POST "https://api.shannon-ai.com/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
],
"max_tokens": 1024,
"stream": true
}' Каждый фрейм потока — одна строка, которая начинается с data: и содержит JSON-объект. Один фрейм, выведенный в несколько строк:
{
"id": "chatcmpl-9b2f6c1e4a7d4f0f8a3c5d2e1b6a7c90",
"object": "chat.completion.chunk",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {
"content": "Hello! "
},
"finish_reason": null
}
]
} | Фреймы по порядку | delta | finish_reason |
|---|---|---|
| Пока модель рассуждает. Ноль или больше фреймов. | {"reasoning_content": "…"} | null |
| Ответ по частям. Ноль или больше фреймов. | {"content": "…"} | null |
Последний JSON-фрейм. В нем также есть usage; запрашивать его не нужно. | {} | "stop" |
Конец потока: строка data: [DONE]. |
- Ответ имеет статус
200иcontent-type: text/event-stream. Каждый фрейм — это строкаdata: <json>и следующая за ней пустая строка. - Строка
: pingприходит каждые 15 секунд. Это комментарий, который поддерживает соединение открытым; SSE-клиенты его пропускают. - Сбой после открытия потока приходит фреймом
data: {"error": {…}}. Статус остается200, поэтому проверяйте фреймы.
Если вызов не удался
Ошибка — это JSON-объект с полем error, в котором есть type и message. Вот ответы, с которыми чаще всего сталкиваются при первом вызове.
| Статус | Тип | Сообщение | Что это значит |
|---|---|---|---|
401 | authentication_error | Missing authentication | Ключ не дошел до API. Отправьте Authorization: Bearer, а за ним свой ключ. |
401 | authentication_error | Invalid API key | Ключ не является текущим ключом какого-либо аккаунта. Скопируйте его заново на странице Keys & usage. |
400 | invalid_request_error | unknown model: <id> | model не является опубликованным id. Используйте id со страницы Модели и цены. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type… | У поля неверный тип JSON или отсутствует messages. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | Бюджет вывода запроса не помещается в ваш баланс. |
Что дальше
- Модели и цены — Выберите модель: id, контекстные окна и цены.
- Chat Completions — Все поля запроса, поля ответа и события потока эндпоинта, который вы вызвали.
- Потоковая передача — Фреймы потока, keep-alive строки и ошибки внутри потока.
- Вызов функций — Позвольте модели вызывать ваши функции.
- Лимиты и баланс — Что запрос резервирует и сколько стоит, и сколько запросов можно отправлять.
- Песочница API — Попробуйте запросы в браузере со своим ключом.