Chat Completions
POST /v1/chat/completions menerima sebuah percakapan dan mengembalikan pesan berikutnya dari model dalam format OpenAI Chat Completions. Gunakan dari SDK OpenAI mana pun atau lewat HTTP biasa; halaman ini adalah referensi field demi field.
POST https://api.shannon-ai.com/v1/chat/completions
Permintaan terkecil adalah id model dan satu pesan user.
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": "Say hello in one sentence."}],
)
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: "Say hello in one sentence." }],
});
console.log(response.choices[0].message.content); curl 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": "Say hello in one sentence."}]
}' Balasannya adalah satu objek JSON:
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello, it is good to meet you.",
"reasoning_content": "The user wants a greeting in one sentence. Keep it short and friendly."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1184,
"completion_tokens": 46,
"total_tokens": 1230
}
} Header
Header permintaan
| Header | Nilai | Deskripsi |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Kunci API Anda. x-api-key: YOUR_API_KEY diterima sebagai penggantinya di setiap endpoint. |
Content-Type | application/json | Wajib. Nilai lain mengembalikan 415. |
x-request-id | Opsional. Id Anda sendiri untuk permintaan. Id ini dikembalikan tanpa perubahan pada balasan. |
Header balasan
| Header | Deskripsi |
|---|---|
x-request-id | Ada di setiap balasan, termasuk error dan stream: nilai yang Anda kirim, atau 12 karakter heksadesimal jika Anda tidak mengirim. Sertakan saat Anda melaporkan masalah. |
content-type | application/json, atau text/event-stream ketika stream bernilai true. |
Field permintaan
Hanya messages yang wajib. Kolom Diterapkan oleh menyebutkan model tempat sebuah field mengubah balasan. Model open-weight hosted adalah dua belas id dalam daftar model; keluarga Shannon 3 adalah shannon-3, shannon-3-pro, shannon-3.1, dan shannon-3.1-pro. Model & harga
| Field | Tipe | Default | Deskripsi | Diterapkan oleh |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Model yang menjawab: id dari daftar model. Kirim di setiap permintaan. Pencocokan tidak membedakan huruf besar dan kecil. Id yang tidak dipublikasikan mengembalikan 400 unknown model. | Semua model |
messages | array | Wajib. Percakapan, dari pesan terlama. Lihat Pesan di bawah. | Semua model | |
stream | boolean | false | true mengirim balasan sebagai server-sent events selagi ditulis. | Semua model |
max_tokens | integer | 4096 | Batas atas balasan, dalam token. Nilai di luar rentang 1 sampai 65,536 dipindahkan ke dalam rentang itu. Nilai ini juga jumlah yang dicadangkan dari saldo Anda selama permintaan berjalan. Lihat Panjang output di bawah. | Model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Sama seperti max_tokens. Jika keduanya dikirim, max_tokens yang dipakai. | Model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperature sampling. Pada model open-weight hosted, defaultnya 1 dan nilai dijaga di antara 0 dan 2. | Model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Nucleus sampling. Nilai dijaga di antara 0 dan 1. | Model open-weight hosted |
seed | integer | Seed untuk sampler, bilangan bulat apa pun. Tanpanya, seed diturunkan dari model dan percakapan, sehingga permintaan yang sama yang dikirim dua kali memakai seed yang sama. | Model open-weight hosted | |
stop | string | array | String atau array string. Hingga 4 yang dipakai. Jawaban berakhir sebelum string pertama yang muncul; teks penghentinya sendiri tidak dikembalikan. | Model open-weight hosted | |
reasoning_effort | string | high | Seberapa banyak model bernalar sebelum menjawab: off, low, medium, atau high. none dan minimal berarti off, default berarti medium, max berarti high. Nilai lain mengembalikan 400. | Model open-weight hosted |
reasoning | object | Pengaturan yang sama dalam bentuk objek: {"effort": "low"}. Jika keduanya dikirim, reasoning_effort yang dipakai. | Model open-weight hosted | |
tools | array | Fungsi yang boleh dipanggil model, masing-masing sebagai {"type": "function", "function": {"name", "description", "parameters"}}. Panggilan dari model kembali di tool_calls; kode Anda yang menjalankannya. | Semua model | |
tool_choice | string | object | auto | "auto" membiarkan model memutuskan. "required" membuatnya memanggil sebuah tool. {"type": "function", "function": {"name": "…"}} membuatnya memanggil tool tersebut. | Model open-weight hosted |
response_format | object | {"type": "json_object"} untuk jawaban JSON, atau {"type": "json_schema", "json_schema": {…}} untuk jawaban yang mengikuti schema Anda. | Semua tingkat Shannon; model open-weight hosted sesuai daftar per id | |
web_search | boolean | false | true membiarkan model mencari di web sebelum menjawab. | shannon-1.6-*, shannon-2-*, keluarga Shannon 3 |
Field OpenAI lainnya, seperti n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store, dan prompt_cache_key, diterima agar kode klien yang ada berjalan tanpa perubahan. Semuanya tidak mengubah balasan: selalu hanya ada satu choice, dan stream selalu diakhiri dengan usage.
Field dengan tipe JSON yang salah, misalnya "max_tokens": "100", mengembalikan 422. Permintaan tanpa messages juga demikian.
Tools, output terstruktur, reasoning, dan pencarian web masing-masing punya halaman sendiri: Pemanggilan fungsi, Output Terstruktur, Reasoning effort, Pencarian Web Terintegrasi.
Permintaan dengan opsi
Permintaan ini mengatur pesan system, field sampling, dan reasoning effort. Permintaan ini memakai model open-weight hosted, yang menerapkan semuanya.
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="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages=[
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"},
],
max_tokens=512,
temperature=0.3,
top_p=0.9,
seed=7,
stop=["\n\n"],
reasoning_effort="low",
)
message = response.choices[0].message
print(message.reasoning_content) # the reasoning
print(message.content) # the answer
print(response.usage) 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: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages: [
{ role: "system", content: "You are a physics teacher. Answer in two sentences." },
{ role: "user", content: "Why is the sky blue?" },
],
max_tokens: 512,
temperature: 0.3,
top_p: 0.9,
seed: 7,
stop: ["\n\n"],
reasoning_effort: "low",
});
const message = response.choices[0].message;
console.log(message.reasoning_content); // the reasoning
console.log(message.content); // the answer
console.log(response.usage); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"messages": [
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"}
],
"max_tokens": 512,
"temperature": 0.3,
"top_p": 0.9,
"seed": 7,
"stop": ["\n\n"],
"reasoning_effort": "low"
}' Balasan berbentuk sama seperti di atas. usage-nya menambahkan dua rincian pada model open-weight hosted: token prompt yang dibaca dari cache dan token yang dipakai untuk reasoning.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Panjang output
max_tokens melakukan dua hal. Pertama, itu adalah jumlah token yang dicadangkan dari saldo Anda saat permintaan dimulai. Ketika balasan selesai, jumlah itu diganti dengan token yang dipakai permintaan. Jika max_tokens lebih besar daripada sisa saldo Anda, permintaan mengembalikan 429 Quota exceeded meskipun balasannya sendiri sebenarnya muat. Kirim max_tokens yang lebih rendah untuk mencadangkan lebih sedikit.
shannon-coder-1 dihitung secara berbeda di endpoint ini: setiap permintaan adalah satu panggilan Shannon Coder dari paket Anda, dan tidak ada token yang dicadangkan untuknya. Batas dan saldo
Kedua, nilai ini membatasi panjang balasan pada model-model berikut:
| Model | Fungsi max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Balasan berhenti ketika mencapai batas. Stream kemudian berakhir dengan finish_reason length. |
| Model open-weight hosted | Teks jawaban berhenti pada max_tokens. Reasoning tidak dihitung terhadapnya. Nilai di bawah 256 diperlakukan sebagai 256. |
Tanpa max_tokens atau max_completion_tokens, nilainya 4,096. Pada shannon-coder-1 nilainya 65,536.
Pesan
Setiap pesan adalah objek dengan role dan content. content berupa string, atau array bagian ketika pesan membawa lebih dari teks.
| Role | Deskripsi | Diterapkan oleh |
|---|---|---|
system | Instruksi untuk model. Taruh paling awal. Pada tingkat Shannon, pesan system pertama yang dipakai. | Model open-weight hosted, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Dibaca sebagai system. | Model open-weight hosted |
user | Apa yang Anda tanyakan. Pada tingkat Shannon, pesan user terakhir adalah prompt dan pesan sebelumnya adalah riwayat. | Semua model |
assistant | Balasan model sebelumnya. Pertahankan tool_calls-nya ketika Anda mengirim hasil tool setelahnya. | Semua model |
tool | Hasil panggilan tool: tool_call_id berisi id panggilan dan content berisi hasilnya sebagai string. | Semua model |
Dengan id keluarga Shannon 3, taruh instruksi yang harus dipatuhi ke dalam pesan user.
Pada tingkat Shannon, permintaan tanpa teks pengguna dan tanpa tools mengembalikan 400 No user message provided.
Bagian konten
| Bagian | Deskripsi | Tersedia di |
|---|---|---|
{"type": "text", "text": "…"} | Teks biasa. | Semua model |
{"type": "image_url", "image_url": {"url": "…"}} | Gambar, sebagai URL data: dengan konten base64 atau sebagai URL http(s). | Keluarga Shannon 3, shannon-1.6-lite, shannon-1.6-pro, dan model open-weight hosted yang mencantumkan input gambar |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Dokumen (PDF, Word, PowerPoint, atau Excel), sebagai base64 atau lewat URL. | Keluarga Shannon 3 |
Ukuran, batas, dan daftar lengkap bentuknya punya halaman sendiri. Gambar dan file
Objek balasan
| Field | Tipe | Deskripsi |
|---|---|---|
id | string | chatcmpl- diikuti 32 karakter heksadesimal. |
object | string | Selalu chat.completion. |
created | integer | Waktu balasan, dalam detik Unix. |
model | string | Id kanonis dari model yang menjawab. Ejaannya bisa berbeda dari id yang Anda kirim. |
choices | array | Selalu tepat satu choice, dengan index 0. |
choices[0].message.role | string | Selalu assistant. |
choices[0].message.content | string | null | Teks jawaban. Dengan tool_calls, nilainya null pada tingkat Shannon; model open-weight hosted dapat mengirim teks di samping panggilan. |
choices[0].message.reasoning_content | string | null | Penalaran yang ditulis model sebelum jawaban, atau null jika tidak ada. |
choices[0].message.tool_calls | array | Hanya ada ketika model memanggil tool. Setiap entri memiliki id, type function, dan function dengan name serta arguments sebagai string JSON. |
choices[0].message.annotations | array | Hanya pada permintaan dengan web_search: true yang pencariannya menemukan sesuatu. Satu url_citation untuk setiap sumber yang disebut oleh penanda di content, dengan url, title, start_index, dan end_index (posisi penanda, dihitung dalam karakter, posisi akhir tidak termasuk). |
choices[0].finish_reason | string | Alasan balasan berakhir. Lihat Alasan selesai. |
usage | object | Token dari permintaan. Lihat Penggunaan. |
sources | array | Hanya pada permintaan dengan web_search: true yang pencariannya menemukan sesuatu: hasil yang diberikan kepada model, masing-masing dengan index, title, dan url. [1] dalam jawaban adalah entri dengan index 1. |
Alasan selesai
| finish_reason | Deskripsi |
|---|---|
stop | Model menyelesaikan jawabannya, atau string stop muncul. |
tool_calls | Model memanggil satu tool atau lebih. Jalankan dan kirim hasilnya dalam pesan tool. |
length | Balasan terpotong pada batas output. Dilaporkan dalam stream shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, dan keluarga Shannon 3. |
Balasan tanpa streaming melaporkan stop atau tool_calls.
Penggunaan
| Field | Tipe | Deskripsi | Tersedia di |
|---|---|---|---|
usage.prompt_tokens | integer | Token input. | Semua model |
usage.completion_tokens | integer | Token output: reasoning, jawaban, dan panggilan tool bersama-sama. | Semua model |
usage.total_tokens | integer | prompt_tokens ditambah completion_tokens. | Semua model |
usage.prompt_tokens_details.cached_tokens | integer | Bagian dari prompt_tokens yang dibaca dari prompt cache. | Model open-weight hosted |
usage.completion_tokens_details.reasoning_tokens | integer | Bagian dari completion_tokens yang dipakai untuk reasoning. | Model open-weight hosted |
Pada model open-weight hosted, prompt_tokens adalah pesan dan definisi tool Anda yang dihitung dengan tokenizer milik model itu, ditambah token dari gambar apa pun. Endpoint penghitungan token mengembalikan angka yang sama sebelum Anda mengirim. Penghitungan token
Pada tingkat Shannon, prompt_tokens menghitung semua yang dibaca model untuk menulis balasan, sehingga lebih besar daripada teks pesan Anda saja.
Streaming
Dengan stream diatur ke true, balasan tiba sebagai event chat.completion.chunk dan berakhir dengan data: [DONE]. Chunk terakhir sebelumnya membawa finish_reason dan usage; tidak diperlukan stream_options. Bentuk chunk, baris keep-alive, dan error di dalam stream punya halaman sendiri. Streaming
Error
Error adalah objek JSON dengan member error. Pemeriksaan berjalan dalam urutan ini: API key, body permintaan, id model, lalu saldo. Tabel mencantumkan apa yang paling sering dikembalikan endpoint ini. Daftar lengkap, beserta apa yang perlu dicoba ulang, ada di halaman tersendiri. Penanganan kesalahan
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Tipe | Pesan | Kapan |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Kunci API tidak dikirim, atau kunci tidak dikenal atau sudah dicabut. |
400 | invalid_request_error | unknown model: <id> | model bukan id yang dipublikasikan. |
400 | invalid_request_error | No user message provided | Tingkat Shannon: permintaan tidak memiliki teks pengguna dan tidak memiliki tools. |
400 | invalid_request_error | <id> does not accept image input | Bagian gambar dikirim ke model open-weight hosted yang tidak mendukung input gambar. |
400 | invalid_request_error | <id> does not accept response_format | response_format dikirim ke model open-weight hosted tanpa output terstruktur. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort berisi nilai di luar daftar. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages tidak ada, atau sebuah field memiliki tipe JSON yang salah. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens lebih besar daripada sisa saldo Anda. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: lebih dari 120 permintaan dalam satu menit pada akun Anda. |
500 | server_error | The model backend failed to answer. Please retry. | Model tidak menghasilkan balasan. Kirim permintaan sekali lagi. |
502 | api_error | The model backend failed to answer. Please retry. | Sama, pada keluarga Shannon 3 dan model open-weight hosted. |