Швидкий старт
Зробіть перший запит: отримайте ключ, надішліть одне повідомлення й прочитайте відповідь. API розмовляє форматами OpenAI та Anthropic, тож SDK, який ви вже використовуєте, працює після зміни базового URL і ключа.
1. Отримайте ключ
Кожен обліковий запис має один API-ключ. Увійдіть, відкрийте Keys & usage і скопіюйте його. Ключ працює на кожному ендпоінті та з кожною моделлю. Ключі та використання
2. Спрямуйте клієнт на API
Усі ендпоінти розташовані під одним базовим URL. SDK OpenAI приймає його з /v1 наприкінці; SDK Anthropic — без нього, бо /v1/messages він додає сам.
| Клієнт | Базовий URL |
|---|---|
| SDK OpenAI та клієнти, сумісні з OpenAI | https://api.shannon-ai.com/v1 |
| SDK Anthropic | 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 перелічено на Models & pricing. | |
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 | Міркування моделі перед відповіддю або 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; як це обчислюється, описано на Limits and balance. Ліміти та баланс - Кожна відповідь, також помилка й стрім, має заголовок
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 з Models & pricing. |
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 і помилки всередині стріму.
- Виклик функцій — Дозвольте моделі викликати ваші функції.
- Ліміти та баланс — Що запит резервує та скільки коштує, і скільки запитів можна надсилати.
- Playground — Пробуйте запити в браузері зі своїм ключем.