Бърз старт
Направете първата си заявка: вземете ключ, изпратете едно съобщение и прочетете отговора. API говори форматите на OpenAI и Anthropic, така че SDK, който вече използвате, работи, след като смените базовия му URL и ключа.
1. Вземете своя ключ
Всеки акаунт има един API ключ. Влезте, отворете Keys & usage и го копирайте. Ключът работи на всеки ендпоинт и с всеки модел. 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 е prompt-ът. Задължително. | |
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 — Пробвайте заявки в браузъра с Вашия ключ.