Chat Completions
POST /v1/chat/completions یک گفتگو میگیرد و پیام بعدی مدل را با فرمت OpenAI Chat Completions برمیگرداند. از هر SDK مربوط به OpenAI یا با HTTP ساده از آن استفاده کنید؛ این صفحه مرجع فیلد به فیلد است.
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": "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."}]
}' پاسخ یک شیء 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
}
} هدرها
هدرهای درخواست
| هدر | مقدار | توضیحات |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | کلید API شما. بهجای آن x-api-key: YOUR_API_KEY در هر endpoint پذیرفته میشود. |
Content-Type | application/json | الزامی. هر مقدار دیگری 415 برمیگرداند. |
x-request-id | اختیاری. شناسه دلخواه شما برای درخواست. بدون تغییر در پاسخ برمیگردد. |
هدرهای پاسخ
| هدر | توضیحات |
|---|---|
x-request-id | روی هر پاسخ، از جمله خطاها و streamها: مقداری که فرستادید، یا 12 نویسه هگزادسیمال وقتی چیزی نفرستاده باشید. هنگام گزارش مشکل آن را ذکر کنید. |
content-type | application/json، یا وقتی stream برابر true است text/event-stream. |
فیلدهای درخواست
فقط messages الزامی است. ستون اعمالشده توسط مدلهایی را نام میبرد که یک فیلد روی آنها پاسخ را تغییر میدهد. مدلهای open-weight میزبانیشده دوازده شناسه فهرست مدلها هستند؛ خانواده Shannon 3 شامل shannon-3، shannon-3-pro، shannon-3.1 و shannon-3.1-pro است. مدلها و قیمتها
| فیلد | نوع | پیشفرض | توضیحات | اعمالشده توسط |
|---|---|---|---|---|
model | string | shannon-1.6-lite | مدلی که پاسخ میدهد: یک شناسه از فهرست مدلها. آن را با هر درخواست بفرستید. تطبیق به حروف بزرگ و کوچک حساس نیست. شناسهای که منتشر نشده باشد 400 unknown model برمیگرداند. | همه مدلها |
messages | array | الزامی. گفتگو، قدیمیترین پیام اول. بخش «پیامها» را در ادامه ببینید. | همه مدلها | |
stream | boolean | false | true پاسخ را در حین نوشته شدن بهصورت server-sent events میفرستد. | همه مدلها |
max_tokens | integer | 4096 | حد بالای پاسخ، بر حسب توکن. مقداری خارج از بازه 1 تا 65,536 به همان بازه برگردانده میشود. همچنین مقداری است که تا پایان درخواست از موجودی شما کنار گذاشته میشود. بخش «طول خروجی» را در ادامه ببینید. | مدلهای open-weight میزبانیشده، shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 |
max_completion_tokens | integer | همانند max_tokens. اگر هر دو فرستاده شوند، max_tokens استفاده میشود. | مدلهای open-weight میزبانیشده، shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 | |
temperature | number | دمای نمونهبرداری. در مدلهای open-weight میزبانیشده مقدار پیشفرض 1 است و مقادیر بین 0 و 2 نگه داشته میشوند. | مدلهای open-weight میزبانیشده، shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 | |
top_p | number | 0.95 | نمونهبرداری هستهای (nucleus). مقادیر بین 0 و 1 نگه داشته میشوند. | مدلهای open-weight میزبانیشده |
seed | integer | seed نمونهبردار، هر عدد صحیح. بدون آن، seed از مدل و گفتگو مشتق میشود، پس یک درخواست یکسان که دو بار فرستاده شود از یک seed استفاده میکند. | مدلهای open-weight میزبانیشده | |
stop | string | array | یک رشته یا آرایهای از رشتهها. حداکثر 4 مورد استفاده میشود. پاسخ پیش از نخستین موردی که ظاهر شود پایان مییابد؛ خود متن توقف برگردانده نمیشود. | مدلهای open-weight میزبانیشده | |
reasoning_effort | string | high | اینکه مدل پیش از پاسخ چقدر استدلال کند: off، low، medium یا high. none و minimal یعنی off، default یعنی medium و max یعنی high. هر مقدار دیگری 400 برمیگرداند. | مدلهای open-weight میزبانیشده |
reasoning | object | همین تنظیم به شکل شیء: {"effort": "low"}. اگر هر دو فرستاده شوند، reasoning_effort استفاده میشود. | مدلهای open-weight میزبانیشده | |
tools | array | توابعی که مدل میتواند فراخوانی کند، هرکدام به شکل {"type": "function", "function": {"name", "description", "parameters"}}. فراخوانیهای مدل در tool_calls برمیگردند؛ کد شما آنها را اجرا میکند. | همه مدلها | |
tool_choice | string | object | auto | "auto" تصمیم را به مدل میسپارد. "required" مدل را به فراخوانی یک ابزار وادار میکند. {"type": "function", "function": {"name": "…"}} او را به فراخوانی همان ابزار وادار میکند. | مدلهای open-weight میزبانیشده |
response_format | object | {"type": "json_object"} برای پاسخ JSON، یا {"type": "json_schema", "json_schema": {…}} برای پاسخی که از schema شما پیروی میکند. | همه سطوح Shannon؛ مدلهای open-weight میزبانیشده بهصورت فهرستشده برای هر شناسه | |
web_search | boolean | false | true به مدل اجازه میدهد پیش از پاسخ در وب جستجو کند. | shannon-1.6-*، shannon-2-*، خانواده Shannon 3 |
فیلدهای دیگر OpenAI، مانند n، user، stream_options، parallel_tool_calls، presence_penalty، frequency_penalty، logit_bias، logprobs، metadata، store و prompt_cache_key، پذیرفته میشوند تا کد کلاینت موجود بدون تغییر اجرا شود. آنها پاسخ را تغییر نمیدهند: همیشه یک choice وجود دارد و stream همیشه با usage پایان مییابد.
فیلدی با نوع JSON نادرست، برای مثال "max_tokens": "100"، 422 برمیگرداند. درخواست بدون messages هم همینطور.
ابزارها، خروجی ساختاریافته، استدلال و جستجوی وب هرکدام صفحه خودشان را دارند: فراخوانی توابع, خروجیهای ساختاریافته, میزان تلاش استدلال, جستجوی وب داخلی.
درخواست با گزینهها
این درخواست یک پیام system، فیلدهای نمونهبرداری و میزان تلاش استدلال را تنظیم میکند. از یک مدل open-weight میزبانیشده استفاده میکند که همه آنها را اعمال میکند.
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"
}' پاسخ همان شکل بالا را دارد. usage آن در مدلهای open-weight میزبانیشده دو جزئیات اضافه میکند: توکنهای پرامپت خواندهشده از کش و توکنهای صرفشده برای استدلال.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} طول خروجی
max_tokens دو کار میکند. اول، تعداد توکنهایی است که هنگام شروع درخواست از موجودی شما کنار گذاشته میشود. وقتی پاسخ کامل شود، این مقدار با توکنهایی که درخواست مصرف کرده جایگزین میشود. اگر max_tokens از باقیمانده موجودی شما بزرگتر باشد، درخواست 429 Quota exceeded برمیگرداند، حتی اگر خود پاسخ جا میشد. برای کنار گذاشتن مقدار کمتر، max_tokens پایینتری بفرستید.
shannon-coder-1 در این endpoint متفاوت شمرده میشود: هر درخواست یکی از فراخوانیهای Shannon Coder پلن شماست و هیچ توکنی برای آن کنار گذاشته نمیشود. محدودیتها و موجودی
دوم، طول پاسخ را در این مدلها محدود میکند:
| مدلها | max_tokens چه کاری انجام میدهد |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | پاسخ وقتی به حد برسد متوقف میشود. stream آنگاه با finish_reason برابر length پایان مییابد. |
| مدلهای open-weight میزبانیشده | متن پاسخ در max_tokens متوقف میشود. استدلال در آن شمرده نمیشود. مقادیر زیر 256 مانند 256 عمل میکنند. |
بدون max_tokens یا max_completion_tokens مقدار 4,096 است. روی shannon-coder-1 برابر 65,536.
پیامها
هر پیام یک شیء با role و content است. content یک رشته است یا، وقتی پیام چیزی بیش از متن دارد، آرایهای از بخشها.
| نقش | توضیحات | اعمالشده توسط |
|---|---|---|
system | دستورالعملها برای مدل. آن را اول بگذارید. در سطوح Shannon، نخستین پیام system همان است که استفاده میشود. | مدلهای open-weight میزبانیشده، shannon-1.6-*، shannon-2-*، shannon-coder-1 |
developer | مانند system خوانده میشود. | مدلهای open-weight میزبانیشده |
user | آنچه میپرسید. در سطوح Shannon آخرین پیام user پرامپت است و پیامهای پیش از آن تاریخچه. | همه مدلها |
assistant | پاسخهای قبلی مدل. وقتی بعد از آن نتیجه ابزار میفرستید، tool_calls آن را نگه دارید. | همه مدلها |
tool | نتیجه یک فراخوانی ابزار: tool_call_id شناسه فراخوانی را و content نتیجه را بهصورت رشته دارد. | همه مدلها |
با شناسهای از خانواده Shannon 3، دستورالعملهایی را که باید رعایت شوند در پیام user بگذارید.
در سطوح Shannon، درخواستی بدون متن کاربر و بدون tools 400 No user message provided برمیگرداند.
بخشهای محتوا
| بخش | توضیحات | در دسترس روی |
|---|---|---|
{"type": "text", "text": "…"} | متن ساده. | همه مدلها |
{"type": "image_url", "image_url": {"url": "…"}} | یک تصویر، بهصورت URL از نوع data: با محتوای base64 یا بهصورت URL از نوع http(s). | خانواده Shannon 3، shannon-1.6-lite، shannon-1.6-pro و مدلهای open-weight میزبانیشدهای که ورودی تصویر را فهرست کردهاند |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | یک سند (PDF، Word، PowerPoint یا Excel)، بهصورت base64 یا با URL. | خانواده Shannon 3 |
اندازهها، محدودیتها و فهرست کامل شکلها صفحه خودشان را دارند. تصاویر و فایلها
شیء پاسخ
| فیلد | نوع | توضیحات |
|---|---|---|
id | string | chatcmpl- و پس از آن 32 نویسه هگزادسیمال. |
object | string | همیشه chat.completion. |
created | integer | زمان پاسخ، بر حسب ثانیه Unix. |
model | string | شناسه استاندارد مدلی که پاسخ داد. ممکن است از نظر املا با شناسهای که فرستادید فرق کند. |
choices | array | همیشه دقیقاً یک choice، با index برابر 0. |
choices[0].message.role | string | همیشه assistant. |
choices[0].message.content | string | null | متن پاسخ. با tool_calls در سطوح Shannon برابر null است؛ مدلهای open-weight میزبانیشده میتوانند کنار فراخوانیها متن هم بفرستند. |
choices[0].message.reasoning_content | string | null | استدلالی که مدل پیش از پاسخ نوشت، یا وقتی وجود ندارد null. |
choices[0].message.tool_calls | array | فقط وقتی مدل ابزار فراخوانی کند وجود دارد. هر مورد یک id، type برابر function و function با name و arguments بهصورت رشته JSON دارد. |
choices[0].message.annotations | array | فقط در درخواستی با web_search: true که جستجویش چیزی پیدا کرده باشد. برای هر منبعی که یک نشانه در content نام میبرد یک url_citation، با url، title، start_index و end_index (جای نشانه، بر حسب نویسه، بدون احتساب پایان). |
choices[0].finish_reason | string | دلیل پایان پاسخ. «دلایل پایان» را ببینید. |
usage | object | توکنهای درخواست. «مصرف» را ببینید. |
sources | array | فقط در درخواستی با web_search: true که جستجویش چیزی پیدا کرده باشد: نتایجی که به مدل داده شده، هر کدام با index، title و url. [1] در پاسخ همان ورودی با index برابر 1 است. |
دلایل پایان
| finish_reason | توضیحات |
|---|---|
stop | مدل پاسخ خود را تمام کرد، یا یک رشته stop ظاهر شد. |
tool_calls | مدل یک یا چند ابزار را فراخوانی میکند. آنها را اجرا کنید و نتایج را در پیامهای tool بفرستید. |
length | پاسخ در حد خروجی بریده شد. در streamهای shannon-1.6-lite، shannon-1.6-pro، shannon-coder-1 و خانواده Shannon 3 گزارش میشود. |
پاسخی که stream نمیشود stop یا tool_calls گزارش میکند.
مصرف
| فیلد | نوع | توضیحات | در دسترس روی |
|---|---|---|---|
usage.prompt_tokens | integer | توکنهای ورودی. | همه مدلها |
usage.completion_tokens | integer | توکنهای خروجی: استدلال، پاسخ و فراخوانیهای ابزار با هم. | همه مدلها |
usage.total_tokens | integer | prompt_tokens بهعلاوه completion_tokens. | همه مدلها |
usage.prompt_tokens_details.cached_tokens | integer | بخشی از prompt_tokens که از کش پرامپت خوانده شده است. | مدلهای open-weight میزبانیشده |
usage.completion_tokens_details.reasoning_tokens | integer | بخشی از completion_tokens که صرف استدلال شده است. | مدلهای open-weight میزبانیشده |
در مدلهای open-weight میزبانیشده، prompt_tokens پیامها و تعریف ابزارهای شماست که با توکنایزر خود مدل شمرده میشود، بهعلاوه توکنهای تصاویر. endpointهای شمارش توکن پیش از ارسال همین عدد را برمیگردانند. شمارش توکن
در سطوح Shannon، prompt_tokens هر چیزی را که مدل برای نوشتن پاسخ خوانده میشمارد، پس از متن پیامهای شما بهتنهایی بزرگتر است.
Streaming
وقتی stream برابر true باشد، پاسخ بهصورت رویدادهای chat.completion.chunk میرسد و با data: [DONE] پایان مییابد. آخرین chunk پیش از آن finish_reason و usage را دارد؛ به stream_options نیازی نیست. شکل chunkها، خطوط keep-alive و خطاها داخل stream صفحه خودشان را دارند. استریم
خطاها
خطا یک شیء JSON با عضو error است. بررسیها به این ترتیب انجام میشوند: کلید API، بدنه درخواست، شناسه مدل و سپس موجودی. جدول رایجترین مواردی را که این endpoint برمیگرداند فهرست میکند. فهرست کامل، همراه با اینکه کدام را دوباره امتحان کنید، صفحه خودش را دارد. مدیریت خطا
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | وضعیت | نوع | پیام | زمان |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | هیچ کلید API ارسال نشده، یا کلید ناشناخته یا ابطالشده است. |
400 | invalid_request_error | unknown model: <id> | model شناسه منتشرشده نیست. |
400 | invalid_request_error | No user message provided | سطوح Shannon: درخواست نه متن کاربر دارد و نه tools. |
400 | invalid_request_error | <id> does not accept image input | یک بخش تصویر به مدل open-weight میزبانیشدهای فرستاده شد که ورودی تصویر ندارد. |
400 | invalid_request_error | <id> does not accept response_format | response_format به مدل open-weight میزبانیشدهای فرستاده شد که خروجی ساختاریافته ندارد. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort مقداری خارج از فهرست دارد. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages وجود ندارد، یا نوع JSON یک فیلد نادرست است. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens از باقیمانده موجودی شما بزرگتر است. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | محافظت در برابر هجوم درخواست (flood protection): بیش از 120 درخواست در یک دقیقه روی حساب شما. |
500 | server_error | The model backend failed to answer. Please retry. | مدل پاسخی تولید نکرد. درخواست را دوباره بفرستید. |
502 | api_error | The model backend failed to answer. Please retry. | همین، روی خانواده Shannon 3 و مدلهای open-weight میزبانیشده. |