Chat Completions
POST /v1/chat/completions একটি কথোপকথন নেয় এবং OpenAI Chat Completions ফরম্যাটে মডেলের পরের মেসেজ রিটার্ন করে। এটি যেকোনো OpenAI SDK থেকে বা সাধারণ HTTP-তে ব্যবহার করুন; এই পেজটি ফিল্ড ধরে ধরে রেফারেন্স।
POST https://api.shannon-ai.com/v1/chat/completions
সবচেয়ে ছোট রিকোয়েস্ট হলো একটি মডেল id এবং একটি ইউজার মেসেজ।
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 key। প্রতিটি এন্ডপয়েন্টে এর বদলে x-api-key: YOUR_API_KEY গ্রহণ করা হয়। |
Content-Type | application/json | আবশ্যক। অন্য যেকোনো মানে 415 রিটার্ন হয়। |
x-request-id | ঐচ্ছিক। রিকোয়েস্টের জন্য আপনার নিজের id। এটি উত্তরে অপরিবর্তিত ফেরত আসে। |
উত্তরের হেডার
| হেডার | বিবরণ |
|---|---|
x-request-id | প্রতিটি উত্তরে, এরর ও স্ট্রিম সহ: আপনার পাঠানো মান, অথবা আপনি কিছু না পাঠালে 12টি হেক্সাডেসিমাল অক্ষর। সমস্যা জানানোর সময় এটি উল্লেখ করুন। |
content-type | application/json, অথবা stream true হলে text/event-stream। |
রিকোয়েস্ট ফিল্ড
শুধু messages আবশ্যক। যারা প্রয়োগ করে কলামে সেই মডেলগুলোর নাম আছে যেগুলোতে একটি ফিল্ড উত্তর বদলায়। হোস্টেড ওপেন-ওয়েট মডেল হলো মডেল তালিকার বারোটি id; Shannon 3 ফ্যামিলি হলো shannon-3, shannon-3-pro, shannon-3.1 ও shannon-3.1-pro। মডেল ও মূল্য
| ফিল্ড | টাইপ | ডিফল্ট | বিবরণ | যারা প্রয়োগ করে |
|---|---|---|---|---|
model | string | shannon-1.6-lite | যে মডেল উত্তর দেবে: মডেল তালিকা থেকে একটি id। প্রতিটি রিকোয়েস্টের সাথে পাঠান। মিলানোর সময় বড়-ছোট হাতের অক্ষর গুরুত্বপূর্ণ নয়। প্রকাশিত নয় এমন id-তে 400 unknown model রিটার্ন হয়। | সব মডেল |
messages | array | আবশ্যক। কথোপকথন, সবচেয়ে পুরনো মেসেজ আগে। নিচে মেসেজ দেখুন। | সব মডেল | |
stream | boolean | false | true উত্তরটি লেখার সাথে সাথে server-sent events হিসেবে পাঠায়। | সব মডেল |
max_tokens | integer | 4096 | উত্তরের ঊর্ধ্বসীমা, tokens-এ। 1 থেকে 65,536-এর বাইরের মান ওই সীমার মধ্যে নিয়ে আসা হয়। রিকোয়েস্ট চলার সময় আপনার ব্যালেন্স থেকে এই পরিমাণ আলাদা করে রাখা হয়। নিচে আউটপুটের দৈর্ঘ্য দেখুন। | হোস্টেড ওপেন-ওয়েট মডেল, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | max_tokens-এর মতোই। দুটিই পাঠানো হলে max_tokens ব্যবহার হয়। | হোস্টেড ওপেন-ওয়েট মডেল, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | স্যাম্পলিং টেম্পারেচার। হোস্টেড ওপেন-ওয়েট মডেলগুলোতে ডিফল্ট 1 এবং মান 0 থেকে 2-এর মধ্যে রাখা হয়। | হোস্টেড ওপেন-ওয়েট মডেল, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | নিউক্লিয়াস স্যাম্পলিং। মান 0 থেকে 1-এর মধ্যে রাখা হয়। | হোস্টেড ওপেন-ওয়েট মডেল |
seed | integer | স্যাম্পলারের সিড, যেকোনো পূর্ণসংখ্যা। এটি না দিলে সিড মডেল ও কথোপকথন থেকে নির্ধারিত হয়, তাই একই রিকোয়েস্ট দুবার পাঠালে একই সিড ব্যবহার হয়। | হোস্টেড ওপেন-ওয়েট মডেল | |
stop | string | array | একটি স্ট্রিং বা স্ট্রিংয়ের একটি অ্যারে। সর্বোচ্চ 4টি ব্যবহার হয়। প্রথমটি যেখানে আসে তার আগেই উত্তর শেষ হয়; স্টপ টেক্সট নিজে ফেরত দেওয়া হয় না। | হোস্টেড ওপেন-ওয়েট মডেল | |
reasoning_effort | string | high | উত্তর দেওয়ার আগে মডেল কতটা রিজনিং করে: off, low, medium বা high। none ও minimal মানে off, default মানে medium, max মানে high। অন্য যেকোনো মানে 400 রিটার্ন হয়। | হোস্টেড ওপেন-ওয়েট মডেল |
reasoning | object | একই সেটিং অবজেক্ট ফর্মে: {"effort": "low"}। দুটিই পাঠানো হলে reasoning_effort ব্যবহার হয়। | হোস্টেড ওপেন-ওয়েট মডেল | |
tools | array | মডেল যেসব ফাংশন কল করতে পারে, প্রতিটি {"type": "function", "function": {"name", "description", "parameters"}} হিসেবে। মডেলের কলগুলো tool_calls-এ ফেরত আসে; আপনার কোড সেগুলো চালায়। | সব মডেল | |
tool_choice | string | object | auto | "auto" মডেলকে সিদ্ধান্ত নিতে দেয়। "required" তাকে একটি টুল কল করাতে বাধ্য করে। {"type": "function", "function": {"name": "…"}} তাকে সেই টুলটিই কল করাতে বাধ্য করে। | হোস্টেড ওপেন-ওয়েট মডেল |
response_format | object | JSON উত্তরের জন্য {"type": "json_object"}, অথবা আপনার schema অনুসরণ করা উত্তরের জন্য {"type": "json_schema", "json_schema": {…}}। | সব Shannon টিয়ার; হোস্টেড ওপেন-ওয়েট মডেল প্রতিটি id-র তালিকা অনুযায়ী | |
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 থাকে, এবং স্ট্রিম সবসময় ইউসেজ দিয়ে শেষ হয়।
ভুল JSON টাইপের ফিল্ড, যেমন "max_tokens": "100", 422 রিটার্ন করে। messages ছাড়া রিকোয়েস্টও তা-ই করে।
টুলস, স্ট্রাকচার্ড আউটপুট, রিজনিং ও ওয়েব সার্চের প্রতিটির নিজস্ব পেজ আছে: ফাংশন কলিং, স্ট্রাকচার্ড আউটপুট, রিজনিং effort, ওয়েব সার্চ.
অপশন সহ একটি রিকোয়েস্ট
এই রিকোয়েস্টে একটি সিস্টেম মেসেজ, স্যাম্পলিং ফিল্ড এবং রিজনিং effort সেট করা হয়। এটি একটি হোস্টেড ওপেন-ওয়েট মডেল ব্যবহার করে, যা সবগুলো প্রয়োগ করে।
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 দুটি বিবরণ যোগ করে: ক্যাশ থেকে পড়া প্রম্পট tokens এবং রিজনিংয়ে খরচ হওয়া tokens।
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} আউটপুটের দৈর্ঘ্য
max_tokens দুটি কাজ করে। প্রথমত, রিকোয়েস্ট শুরুর সময় আপনার ব্যালেন্স থেকে যত tokens আলাদা করে রাখা হয় এটি সেই সংখ্যা। উত্তর সম্পূর্ণ হলে সেই পরিমাণ রিকোয়েস্টের ব্যবহৃত tokens দিয়ে প্রতিস্থাপিত হয়। max_tokens আপনার ব্যালেন্সের বাকি অংশের চেয়ে বড় হলে উত্তর নিজে ঢুকে গেলেও রিকোয়েস্ট 429 Quota exceeded রিটার্ন করে। কম আলাদা করে রাখতে কম max_tokens পাঠান।
এই এন্ডপয়েন্টে shannon-coder-1 ভিন্নভাবে গণনা হয়: প্রতিটি রিকোয়েস্ট আপনার প্ল্যানের একটি Shannon Coder কল, এবং এর জন্য কোনো tokens আলাদা করে রাখা হয় না। সীমা ও ব্যালেন্স
দ্বিতীয়ত, এটি এই মডেলগুলোতে উত্তরের দৈর্ঘ্য সীমিত করে:
| মডেল | উত্তরের দৈর্ঘ্যে max_tokens-এর প্রভাব |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | লিমিটে পৌঁছালে উত্তর থামে। তখন স্ট্রিম finish_reason length দিয়ে শেষ হয়। |
| হোস্টেড ওপেন-ওয়েট মডেল | উত্তরের টেক্সট max_tokens-এ থামে। রিজনিং এর হিসাবে ধরা হয় না। 256-এর নিচের মান 256 হিসেবে কাজ করে। |
max_tokens বা max_completion_tokens ছাড়া মান 4,096। shannon-coder-1-এ এটি 65,536।
মেসেজ
প্রতিটি মেসেজ একটি role ও একটি content সহ অবজেক্ট। content হলো একটি স্ট্রিং, অথবা মেসেজ শুধু টেক্সটের বেশি কিছু বহন করলে অংশের একটি অ্যারে।
| রোল | বিবরণ | যারা প্রয়োগ করে |
|---|---|---|
system | মডেলের জন্য নির্দেশনা। এটি সবার আগে দিন। Shannon টিয়ারগুলোতে প্রথম system মেসেজটিই ব্যবহার হয়। | হোস্টেড ওপেন-ওয়েট মডেল, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | system হিসেবে পড়া হয়। | হোস্টেড ওপেন-ওয়েট মডেল |
user | আপনি যা জিজ্ঞাসা করেন। Shannon টিয়ারগুলোতে শেষ user মেসেজটি প্রম্পট এবং এর আগের মেসেজগুলো হিস্ট্রি। | সব মডেল |
assistant | মডেলের আগের উত্তর। এর পরে টুল ফলাফল পাঠানোর সময় এর tool_calls রেখে দিন। | সব মডেল |
tool | একটি টুল কলের ফলাফল: tool_call_id-তে কলের id থাকে এবং content-এ ফলাফল একটি স্ট্রিং হিসেবে। | সব মডেল |
Shannon 3 ফ্যামিলির কোনো id-র ক্ষেত্রে, যেসব নির্দেশনা অবশ্যই মানতে হবে তা user মেসেজে দিন।
Shannon টিয়ারগুলোতে ইউজার টেক্সট ও tools ছাড়া রিকোয়েস্ট 400 No user message provided রিটার্ন করে।
কনটেন্ট অংশ
| অংশ | বিবরণ | যেখানে পাওয়া যায় |
|---|---|---|
{"type": "text", "text": "…"} | সাধারণ টেক্সট। | সব মডেল |
{"type": "image_url", "image_url": {"url": "…"}} | একটি ইমেজ, base64 কনটেন্ট সহ data: URL হিসেবে অথবা http(s) URL হিসেবে। | Shannon 3 ফ্যামিলি, shannon-1.6-lite, shannon-1.6-pro, এবং যেসব হোস্টেড ওপেন-ওয়েট মডেল ইমেজ ইনপুট তালিকাভুক্ত করে |
{"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 | যে মডেল উত্তর দিয়েছে তার canonical id। বানানে এটি আপনার পাঠানো id থেকে আলাদা হতে পারে। |
choices | array | সবসময় ঠিক একটি choice, index 0 সহ। |
choices[0].message.role | string | সবসময় assistant। |
choices[0].message.content | string | null | উত্তরের টেক্সট। tool_calls থাকলে Shannon টিয়ারগুলোতে এটি null; হোস্টেড ওপেন-ওয়েট মডেল কলের পাশে টেক্সট পাঠাতে পারে। |
choices[0].message.reasoning_content | string | null | উত্তরের আগে মডেল যে রিজনিং লিখেছে, অথবা কিছু না থাকলে null। |
choices[0].message.tool_calls | array | শুধু মডেল টুল কল করলেই থাকে। প্রতিটি এন্ট্রিতে একটি id, type function, এবং function-এ name ও JSON স্ট্রিং হিসেবে arguments থাকে। |
choices[0].message.annotations | array | শুধু সেই রিকোয়েস্টে যাতে web_search: true আছে এবং যার সার্চে কিছু পাওয়া গেছে। content-এর কোনো মার্কারের নাম করা প্রতিটি উৎসের জন্য একটি url_citation, তাতে url, title, start_index ও end_index থাকে (মার্কারের অবস্থান, অক্ষরে গোনা, শেষটি অন্তর্ভুক্ত নয়)। |
choices[0].finish_reason | string | উত্তর কেন শেষ হয়েছে। ফিনিশ রিজন দেখুন। |
usage | object | রিকোয়েস্টের tokens। ইউসেজ দেখুন। |
sources | array | শুধু সেই রিকোয়েস্টে যাতে web_search: true আছে এবং যার সার্চে কিছু পাওয়া গেছে: মডেলকে দেওয়া ফলাফলগুলো, প্রতিটিতে index, title ও url থাকে। উত্তরের [1] হলো index 1 সহ এন্ট্রি। |
ফিনিশ রিজন
| finish_reason | বিবরণ |
|---|---|
stop | মডেল তার উত্তর শেষ করেছে, অথবা একটি stop স্ট্রিং এসেছে। |
tool_calls | মডেল এক বা একাধিক টুল কল করে। সেগুলো চালান এবং ফলাফল tool মেসেজে পাঠান। |
length | আউটপুট লিমিটে এসে উত্তর কেটে গেছে। shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 ও Shannon 3 ফ্যামিলির স্ট্রিমে জানানো হয়। |
স্ট্রিম না করা উত্তর stop বা tool_calls জানায়।
ইউসেজ
| ফিল্ড | টাইপ | বিবরণ | যেখানে পাওয়া যায় |
|---|---|---|---|
usage.prompt_tokens | integer | ইনপুট tokens। | সব মডেল |
usage.completion_tokens | integer | আউটপুট tokens: রিজনিং, উত্তর ও টুল কল একসাথে। | সব মডেল |
usage.total_tokens | integer | prompt_tokens যোগ completion_tokens। | সব মডেল |
usage.prompt_tokens_details.cached_tokens | integer | prompt_tokens-এর যে অংশ প্রম্পট ক্যাশ থেকে পড়া হয়েছে। | হোস্টেড ওপেন-ওয়েট মডেল |
usage.completion_tokens_details.reasoning_tokens | integer | completion_tokens-এর যে অংশ রিজনিংয়ে খরচ হয়েছে। | হোস্টেড ওপেন-ওয়েট মডেল |
হোস্টেড ওপেন-ওয়েট মডেলগুলোতে prompt_tokens হলো আপনার মেসেজ ও টুল সংজ্ঞা মডেলের নিজস্ব টোকেনাইজার দিয়ে গণনা করা, সঙ্গে যেকোনো ইমেজের tokens। token গণনার এন্ডপয়েন্টগুলো পাঠানোর আগেই একই সংখ্যা রিটার্ন করে। Token গণনা
Shannon টিয়ারগুলোতে prompt_tokens উত্তর লিখতে মডেল যা কিছু পড়েছে সবকিছু গণনা করে, তাই এটি শুধু আপনার মেসেজের টেক্সটের চেয়ে বড় হয়।
স্ট্রিমিং
stream true সেট করলে উত্তর chat.completion.chunk ইভেন্ট হিসেবে আসে এবং data: [DONE] দিয়ে শেষ হয়। এর আগের শেষ চাংকে finish_reason ও usage থাকে; কোনো stream_options লাগে না। চাংকের গঠন, কিপ-অ্যালাইভ লাইন এবং স্ট্রিমের ভেতরের এররের জন্য আলাদা পেজ আছে। স্ট্রিমিং
এরর
এরর হলো error সদস্য সহ একটি JSON অবজেক্ট। যাচাই এই ক্রমে চলে: API key, রিকোয়েস্ট বডি, মডেল id, তারপর ব্যালেন্স। টেবিলে এই এন্ডপয়েন্ট সবচেয়ে বেশি যা রিটার্ন করে তা দেওয়া আছে। কোনটি আবার চেষ্টা করতে হবে সহ সম্পূর্ণ তালিকার জন্য আলাদা পেজ আছে। এরর হ্যান্ডলিং
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | স্ট্যাটাস | টাইপ | মেসেজ | কখন |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | কোনো API key পাঠানো হয়নি, অথবা key অজানা বা বাতিল করা। |
400 | invalid_request_error | unknown model: <id> | model কোনো প্রকাশিত id নয়। |
400 | invalid_request_error | No user message provided | Shannon টিয়ার: রিকোয়েস্টে কোনো ইউজার টেক্সট নেই এবং কোনো tools নেই। |
400 | invalid_request_error | <id> does not accept image input | ইমেজ ইনপুট নেই এমন একটি হোস্টেড ওপেন-ওয়েট মডেলে ইমেজ অংশ পাঠানো হয়েছে। |
400 | invalid_request_error | <id> does not accept response_format | স্ট্রাকচার্ড আউটপুট নেই এমন একটি হোস্টেড ওপেন-ওয়েট মডেলে response_format পাঠানো হয়েছে। |
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. | ফ্লাড প্রোটেকশন: আপনার অ্যাকাউন্টে এক মিনিটে 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 ফ্যামিলি এবং হোস্টেড ওপেন-ওয়েট মডেলগুলোতে। |