Chuyển đến nội dung
Chat Completions

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)

Phản hồi là một đối tượng JSON:

200 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)

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.

200 JSON
{
  "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

400 JSON
{
  "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 authentication
Invalid 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.