Chat Completions
POST /v1/chat/completions nhận một cuộc hội thoại và trả về tin nhắn tiếp theo của model theo định dạng OpenAI Chat Completions. Dùng từ bất kỳ OpenAI SDK nào hoặc qua HTTP thuần; trang này là tài liệu tham chiếu từng trường.
POST https://api.shannon-ai.com/v1/chat/completions
Yêu cầu nhỏ nhất gồm một model id và một tin nhắn người dùng.
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."}]
}' Phản hồi là một đối tượng 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 của yêu cầu
| Header | Giá trị | Mô tả |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | API key của bạn. Có thể dùng x-api-key: YOUR_API_KEY thay thế trên mọi endpoint. |
Content-Type | application/json | Bắt buộc. Mọi giá trị khác trả về 415. |
x-request-id | Tùy chọn. Id riêng của bạn cho yêu cầu. Id này được trả về nguyên vẹn trong phản hồi. |
Header của phản hồi
| Header | Mô tả |
|---|---|
x-request-id | Có trong mọi phản hồi, kể cả lỗi và stream: giá trị bạn đã gửi, hoặc 12 ký tự thập lục phân khi bạn không gửi. Hãy dẫn id này khi báo cáo sự cố. |
content-type | application/json, hoặc text/event-stream khi stream là true. |
Các trường yêu cầu
Chỉ messages là bắt buộc. Cột Áp dụng bởi nêu tên các model mà một trường làm thay đổi phản hồi. Các model open-weight hosted là mười hai id trong danh sách model; dòng Shannon 3 gồm shannon-3, shannon-3-pro, shannon-3.1 và shannon-3.1-pro. Model và giá
| Trường | Loại | Mặc định | Mô tả | Áp dụng bởi |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Model trả lời: một id từ danh sách model. Hãy gửi kèm trong mọi yêu cầu. Việc khớp tên không phân biệt chữ hoa chữ thường. Id chưa được công bố trả về 400 unknown model. | Tất cả model |
messages | array | Bắt buộc. Cuộc hội thoại, tin nhắn cũ nhất trước. Xem Tin nhắn bên dưới. | Tất cả model | |
stream | boolean | false | true gửi phản hồi dưới dạng server-sent events trong khi nó được viết. | Tất cả model |
max_tokens | integer | 4096 | Giới hạn trên của phản hồi, tính bằng token. Giá trị ngoài khoảng 1 đến 65,536 sẽ được đưa về trong khoảng đó. Đây cũng là lượng được giữ lại từ số dư của bạn trong lúc yêu cầu chạy. Xem Độ dài đầu ra bên dưới. | Các model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Giống max_tokens. Khi gửi cả hai, max_tokens được dùng. | Các model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperature lấy mẫu. Trên các model open-weight hosted, mặc định là 1 và giá trị được giữ trong khoảng từ 0 đến 2. | Các model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Nucleus sampling. Giá trị được giữ trong khoảng từ 0 đến 1. | Các model open-weight hosted |
seed | integer | Seed của bộ lấy mẫu, là một số nguyên bất kỳ. Khi không có, seed được suy ra từ model và cuộc hội thoại, nên cùng một yêu cầu gửi hai lần sẽ dùng cùng một seed. | Các model open-weight hosted | |
stop | string | array | Một chuỗi hoặc một mảng chuỗi. Tối đa 4 chuỗi được dùng. Câu trả lời kết thúc trước chuỗi đầu tiên xuất hiện; bản thân chuỗi dừng không được trả về. | Các model open-weight hosted | |
reasoning_effort | string | high | Mức model suy luận trước khi trả lời: off, low, medium hoặc high. none và minimal có nghĩa là off, default có nghĩa là medium, max có nghĩa là high. Mọi giá trị khác trả về 400. | Các model open-weight hosted |
reasoning | object | Cùng thiết lập đó ở dạng đối tượng: {"effort": "low"}. Khi gửi cả hai, reasoning_effort được dùng. | Các model open-weight hosted | |
tools | array | Các hàm mà model có thể gọi, mỗi hàm có dạng {"type": "function", "function": {"name", "description", "parameters"}}. Các lần gọi của model được trả về trong tool_calls; mã của bạn chạy chúng. | Tất cả model | |
tool_choice | string | object | auto | "auto" để model tự quyết định. "required" buộc model gọi một tool. {"type": "function", "function": {"name": "…"}} buộc model gọi đúng tool đó. | Các model open-weight hosted |
response_format | object | {"type": "json_object"} cho câu trả lời JSON, hoặc {"type": "json_schema", "json_schema": {…}} cho câu trả lời theo schema của bạn. | Tất cả các bậc Shannon; các model open-weight hosted theo danh sách từng id | |
web_search | boolean | false | true cho phép model tìm kiếm trên web trước khi trả lời. | shannon-1.6-*, shannon-2-*, dòng Shannon 3 |
Các trường OpenAI khác, như n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store và prompt_cache_key, được chấp nhận để mã client hiện có chạy không cần sửa. Chúng không làm thay đổi phản hồi: luôn chỉ có một choice, và stream luôn kết thúc bằng usage.
Một trường có kiểu JSON sai, ví dụ "max_tokens": "100", trả về 422. Yêu cầu không có messages cũng vậy.
Tool, đầu ra có cấu trúc, suy luận và tìm kiếm web đều có trang riêng: Gọi hàm, Đầu ra có cấu trúc, Mức độ suy luận, Tìm kiếm web tích hợp.
Một yêu cầu có tùy chọn
Yêu cầu này đặt một tin nhắn system, các trường lấy mẫu và mức độ suy luận. Nó dùng một model open-weight hosted, áp dụng tất cả các tùy chọn đó.
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"
}' Phản hồi có cùng cấu trúc như trên. usage của nó thêm hai chi tiết trên các model open-weight hosted: số token prompt đọc từ cache và số token dùng cho suy luận.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Độ dài đầu ra
max_tokens làm hai việc. Thứ nhất, đó là số token được giữ lại từ số dư của bạn khi yêu cầu bắt đầu. Khi phản hồi hoàn tất, lượng đó được thay bằng số token yêu cầu đã dùng. Nếu max_tokens lớn hơn phần còn lại trong số dư của bạn, yêu cầu trả về 429 Quota exceeded ngay cả khi bản thân phản hồi vẫn vừa. Hãy gửi max_tokens thấp hơn để giữ lại ít hơn.
shannon-coder-1 được tính khác trên endpoint này: mỗi yêu cầu là một lượt gọi Shannon Coder trong gói của bạn, và không có token nào được giữ lại cho nó. Giới hạn và số dư
Thứ hai, nó giới hạn độ dài phản hồi trên các model sau:
| Model | Tác dụng của max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Phản hồi dừng khi đạt giới hạn. Khi đó stream kết thúc với finish_reason là length. |
| Các model open-weight hosted | Văn bản câu trả lời dừng ở max_tokens. Phần suy luận không bị tính vào đó. Các giá trị dưới 256 được coi là 256. |
Khi không có max_tokens hoặc max_completion_tokens, giá trị là 4,096. Trên shannon-coder-1 là 65,536.
Tin nhắn
Mỗi tin nhắn là một đối tượng có role và content. content là một chuỗi, hoặc một mảng các phần khi tin nhắn mang nhiều hơn văn bản.
| Vai trò | Mô tả | Áp dụng bởi |
|---|---|---|
system | Chỉ dẫn cho model. Hãy đặt ở đầu. Trên các bậc Shannon, tin nhắn system đầu tiên là tin nhắn được dùng. | Các model open-weight hosted, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Được đọc như system. | Các model open-weight hosted |
user | Điều bạn hỏi. Trên các bậc Shannon, tin nhắn user cuối cùng là prompt và các tin nhắn trước nó là lịch sử. | Tất cả model |
assistant | Các phản hồi trước đó của model. Hãy giữ tool_calls của nó khi bạn gửi kết quả tool ngay sau. | Tất cả model |
tool | Kết quả của một lần gọi tool: tool_call_id chứa id của lần gọi và content chứa kết quả dưới dạng chuỗi. | Tất cả model |
Với id thuộc dòng Shannon 3, hãy đặt các chỉ dẫn bắt buộc phải giữ vào tin nhắn user.
Trên các bậc Shannon, yêu cầu không có văn bản người dùng và không có tools trả về 400 No user message provided.
Các phần nội dung
| Phần | Mô tả | Có trên |
|---|---|---|
{"type": "text", "text": "…"} | Văn bản thuần. | Tất cả model |
{"type": "image_url", "image_url": {"url": "…"}} | Một hình ảnh, dưới dạng URL data: với nội dung base64 hoặc dưới dạng URL http(s). | Dòng Shannon 3, shannon-1.6-lite, shannon-1.6-pro, và các model open-weight hosted có hỗ trợ đầu vào hình ảnh |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Một tài liệu (PDF, Word, PowerPoint hoặc Excel), dưới dạng base64 hoặc qua URL. | Dòng Shannon 3 |
Kích thước, giới hạn và danh sách đầy đủ các dạng có trang riêng. Hình ảnh và tệp
Đối tượng phản hồi
| Trường | Loại | Mô tả |
|---|---|---|
id | string | chatcmpl- theo sau là 32 ký tự thập lục phân. |
object | string | Luôn là chat.completion. |
created | integer | Thời điểm của phản hồi, tính bằng giây Unix. |
model | string | Id chuẩn của model đã trả lời. Cách viết có thể khác với id bạn đã gửi. |
choices | array | Luôn có đúng một choice, với index là 0. |
choices[0].message.role | string | Luôn là assistant. |
choices[0].message.content | string | null | Văn bản câu trả lời. Khi có tool_calls, giá trị là null trên các bậc Shannon; các model open-weight hosted có thể gửi văn bản bên cạnh các lần gọi. |
choices[0].message.reasoning_content | string | null | Phần suy luận model viết trước câu trả lời, hoặc null khi không có. |
choices[0].message.tool_calls | array | Chỉ có khi model gọi tool. Mỗi phần tử có id, type là function, và function với name và arguments dưới dạng chuỗi JSON. |
choices[0].message.annotations | array | Chỉ có trên yêu cầu gửi web_search: true mà lượt tìm kiếm tìm thấy kết quả. Một url_citation cho mỗi nguồn mà một dấu trong content nêu tên, gồm url, title, start_index và end_index (vị trí của dấu, đếm theo ký tự, không tính vị trí kết thúc). |
choices[0].finish_reason | string | Lý do phản hồi kết thúc. Xem Lý do kết thúc. |
usage | object | Số token của yêu cầu. Xem Usage. |
sources | array | Chỉ có trên yêu cầu gửi web_search: true mà lượt tìm kiếm tìm thấy kết quả: các kết quả đã đưa cho model, mỗi kết quả có index, title và url. [1] trong câu trả lời là mục có index bằng 1. |
Lý do kết thúc
| finish_reason | Mô tả |
|---|---|
stop | Model đã hoàn tất câu trả lời, hoặc một chuỗi stop đã xuất hiện. |
tool_calls | Model gọi một hoặc nhiều tool. Hãy chạy chúng và gửi kết quả trong các tin nhắn tool. |
length | Phản hồi bị cắt ở giới hạn đầu ra. Được báo trong các stream của shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 và dòng Shannon 3. |
Phản hồi không streaming báo stop hoặc tool_calls.
Usage
| Trường | Loại | Mô tả | Có trên |
|---|---|---|---|
usage.prompt_tokens | integer | Token đầu vào. | Tất cả model |
usage.completion_tokens | integer | Token đầu ra: suy luận, câu trả lời và các lần gọi tool cộng lại. | Tất cả model |
usage.total_tokens | integer | prompt_tokens cộng completion_tokens. | Tất cả model |
usage.prompt_tokens_details.cached_tokens | integer | Phần của prompt_tokens được đọc từ prompt cache. | Các model open-weight hosted |
usage.completion_tokens_details.reasoning_tokens | integer | Phần của completion_tokens được dùng cho suy luận. | Các model open-weight hosted |
Trên các model open-weight hosted, prompt_tokens là các tin nhắn và định nghĩa tool của bạn được đếm bằng tokenizer riêng của model, cộng thêm token của các hình ảnh nếu có. Các endpoint đếm token trả về cùng con số này trước khi bạn gửi. Đếm token
Trên các bậc Shannon, prompt_tokens đếm mọi thứ model đã đọc để viết phản hồi, nên lớn hơn riêng văn bản các tin nhắn của bạn.
Streaming
Khi stream được đặt thành true, phản hồi đến dưới dạng các sự kiện chat.completion.chunk và kết thúc bằng data: [DONE]. Chunk cuối trước đó mang finish_reason và usage; không cần stream_options. Cấu trúc chunk, dòng keep-alive và lỗi bên trong stream có trang riêng. Truyền phát
Lỗi
Lỗi là một đối tượng JSON có thành phần error. Các bước kiểm tra chạy theo thứ tự này: API key, nội dung yêu cầu, model id, rồi số dư. Bảng liệt kê những gì endpoint này trả về thường xuyên nhất. Danh sách đầy đủ, kèm những lỗi nên thử lại, có trang riêng. Xử lý lỗi
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Trạng thái | Loại | Thông báo | Khi nào |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Không có API key nào được gửi, hoặc key không xác định hoặc đã bị thu hồi. |
400 | invalid_request_error | unknown model: <id> | model không phải là id đã công bố. |
400 | invalid_request_error | No user message provided | Các bậc Shannon: yêu cầu không có văn bản người dùng và không có tools. |
400 | invalid_request_error | <id> does not accept image input | Một phần hình ảnh đã được gửi tới model open-weight hosted không hỗ trợ đầu vào hình ảnh. |
400 | invalid_request_error | <id> does not accept response_format | response_format đã được gửi tới model open-weight hosted không có đầu ra có cấu trúc. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort chứa một giá trị ngoài danh sách. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Thiếu messages, hoặc một trường có kiểu JSON sai. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens lớn hơn phần còn lại trong số dư của bạn. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: hơn 120 yêu cầu trong một phút trên tài khoản của bạn. |
500 | server_error | The model backend failed to answer. Please retry. | Model không tạo ra phản hồi. Hãy gửi lại yêu cầu. |
502 | api_error | The model backend failed to answer. Please retry. | Tương tự, trên dòng Shannon 3 và các model open-weight hosted. |