التوثيق

كل ما تحتاجه للبناء مع واجهة قِرناس

v1 · مستقر

واجهة قِرناس البرمجية

ابنِ تجارب محادثة عربية أولاً بنفس النماذج التي تشغّل قِرناس — واجهة REST بصيغة chat completions القياسية مع بث مباشر عبر SSE.

عنوان القاعدة والمصادقة

https://api.mindlabsa.com/v1HTTPS

أرسل مفتاحك في ترويسةAuthorizationمع كل طلب.

curl https://api.mindlabsa.com/v1/chat/completions \  -H "Authorization: Bearer $QIRNAS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "model": "qirnas",    "stream": true,    "messages": [      { "role": "system", "content": "أنت مساعد عربي أولاً." },      { "role": "user", "content": "لخّص لي مبيعات الربع الرابع." }    ]  }'

البداية السريعة

Node.js / TypeScriptدون أي حزمة
// Node 18+ — no packages neededconst res = await fetch("https://api.mindlabsa.com/v1/chat/completions", {  method: "POST",  headers: {    Authorization: `Bearer ${process.env.QIRNAS_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    model: "qirnas",    messages: [{ role: "user", content: "اشرح مفهوم رؤية 2030." }],  }),});const data = await res.json();console.log(data.choices[0].message.content);
Pythonعبر مكتبة requests
# pip install requestsimport os, requestsresp = requests.post(    "https://api.mindlabsa.com/v1/chat/completions",    headers={"Authorization": f"Bearer {os.environ['QIRNAS_API_KEY']}"},    json={        "model": "qirnas",        "messages": [            {"role": "system", "content": "أجب باللغة العربية."},            {"role": "user", "content": "قارن بين قطاعي السياحة والصناعة في السعودية."},        ],    },)print(resp.json()["choices"][0]["message"]["content"])

الاتصال المباشر عبر HTTP يعمل بدون أي حزمة كما في الأمثلة أعلاه. وإن كنت تفضّل مكتبة عميل، فالواجهة تدعم مكتبات SDK المتوافقة مع الصيغة القياسية (صفحة SDKs) — وحزمة @qirnas/sdk الرسمية قادمة قريباً.

إكمال المحادثة

رد واحد بصيغة JSON، أو بث عبر SSE. الطلب الناجح يعود بالحالة 201 (وأي حالة 2xx نجاح).

POST/v1/chat/completions
المعاملالنوعالوصف
modelstringمعرّف نموذج من GET /v1/models، أو qirnas للنموذج الافتراضي. إن حُذف: النموذج الافتراضي. والمعرّف الذي لا تعرفه البوابة يجيب عنه النموذج الافتراضي كذلك، لكن ذلك مُهمَل وسيتوقف (انظر ترويسة Deprecation في الرد).
messages
مطلوب
array · ≥ 1 itemالمحادثة حتى الآن، بالأدوار system وuser وassistant وtool. إن لم ترسل رسالة system يُستخدم موجّه النظام الخاص بالنموذج.
temperaturenumber · 0–2درجة حرارة أخذ العينات.
top_pnumber · 0–1أخذ العينات النووي: كتلة الاحتمال التي يُختار منها. القيمة 0: الرمز الأرجح وحده.
max_tokensinteger · ≥ 1أقصى عدد من الرموز يُولَّد. إن حُذف: default_max_tokens للنموذج. وإن تجاوز max_output_tokens: يُخفَّض إليه.
presence_penaltynumber · −2–2يعاقب الرموز التي ظهرت من قبل، فيشجّع على موضوعات جديدة.
frequency_penaltynumber · −2–2يعاقب الرموز بحسب عدد مرات ظهورها. إن حُذف: القيمة الافتراضية للنموذج.
seedintegerيجعل أخذ العينات قابلاً للتكرار للطلب والنموذج نفسيهما، بقدر ما يتيحه خادم النموذج.
stopstring | string[] · ≤ 4 items · 1–256 charsحتى 4 سلاسل (كل منها حتى 256 حرفاً) يتوقف عندها التوليد، ولا تُضمَّن في الرد.
streambooleanبث الرد عبر أحداث SSE (انظر «البث»).
stream_optionsobjectالقيمة { "include_usage": true } تضيف مقطعاً أخيراً يحمل الاستهلاك. مع stream: true فقط.
toolsarrayدوال يمكن للنموذج استدعاؤها (انظر «استدعاء الأدوات»).
tool_choice"auto" | "none" | "required" | objectauto (يقرر النموذج) أو none أو required، أو دالة واحدة محددة بالاسم.
userstring · ≤ 256 charsمعرّف مُعتِم للمستخدم النهائي لديك، لتُنسب إساءة الاستخدام إلى أحد مستخدميك دون معرفة هويته. أرسل قيمة تجزئة ثابتة، لا بريداً إلكترونياً ولا اسماً. لا يُرسل إلى النموذج، ولا يُسجَّل إلا بتجزئة مفتاحية.
reasoningboolean · default false
يتطلب صلاحية: نطاق reasoning
القيمة true: يفكّر النموذج قبل أن يجيب (إجابات أفضل للأسئلة الصعبة، مع زمن ورموز أكثر؛ ولا يُعاد نص التفكير نفسه).
thinkboolean · default false
يتطلب صلاحية: نطاق think
القيمة true: وضع التفكير المعمّق. يجيب النموذج عدة مرات وتُعاد الإجابة التي تتفق عليها المحاولات، ويُحتسب الاستهلاك لكل المحاولات. لا يجتمع مع tools.
معاملات تتطلب صلاحية. reasoning وthink جزء من المخطط، لكن القيمة true تتطلب مفتاحاً يملك النطاق الذي يحمل الاسم نفسه، وإلا يعود الطلب 403 بالرمز scope_required. المفاتيح التي تُنشأ من هذه البوابة تبدأ دون هذين النطاقين. أما القيمة false، أو حذف الحقل، فمقبولة دائماً. ولا يقبل الحقلان إلا true أو false أو null: أي قيمة أخرى، مثل الكائن {"effort": "low"}، تعود 400 بالرمز invalid_request.
curl https://api.mindlabsa.com/v1/chat/completions \  -H "Authorization: Bearer $QIRNAS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "model": "qirnas",    "messages": [{ "role": "user", "content": "اقترح ثلاثة أسماء لمقهى في جدة." }],    "temperature": 0.7,    "top_p": 0.9,    "max_tokens": 512,    "stop": ["###"],    "seed": 7,    "user": "u_8f14e45fceea167a"  }'
  • القيمة null للحقول top_p وpresence_penalty وfrequency_penalty وseed وstop وstream_options وuser وreasoning وthink تعادل عدم إرسالها، وكذلك stop أو user الفارغان.
  • الحقول غير المدرجة هنا تُتجاهل (ومنها reasoning_effort من OpenAI). أما الحقل المدرج بقيمة غير صالحة، أي من نوع آخر أو خارج حدوده، فيعود 400 بالرمز invalid_request، ويسمّيه param.
  • الحقل model في الرد يكون دائماً qirnas. وإن لم تتسع الرسائل مع max_tokens (أو default_max_tokens للنموذج إن لم ترسله) في نافذة السياق يعود 400 بالرمز context_length_exceeded.
  • جسم الطلب 256 كيلوبايت على الأكثر، وإلا يعود 413 بالرمز request_too_large. وقيمة max_tokens تبقى ضمن سقف مخرجات مفتاحك (انظر «صلاحيات المفتاح»).

البث

مع stream: true يصل الرد أحداثاً من نوع SSE، كل حدث data: يحمل مقطع chat.completion.chunk، وينتهي بـ data: [DONE].

  • أثناء تشغيل النموذج (قد يستغرق تشغيل وحدة GPU من السكون دقائق) ترسل البوابة سطر تعليق : keep-alive كل 15 ثانية — تجاهل كل سطر يبدأ بـ :.
  • أرسل stream_options: { "include_usage": true } ليحمل آخر مقطع قبل [DONE] الاستهلاك، بقائمة choices فارغة.
  • الفشل قبل بدء البث خطأ HTTP عادي. أما بعده فيصل حدث خطأ واحد يحمل كائن error نفسه (مع request_id)، ثم data: [DONE] — انظر رموز الأخطاء.
: keep-alivedata: {"id":"chatcmpl-5b2d…","object":"chat.completion.chunk","model":"qirnas","choices":[{"index":0,"delta":{"content":"أهلاً"},"finish_reason":null}]}data: {"id":"chatcmpl-5b2d…","object":"chat.completion.chunk","model":"qirnas","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}data: {"id":"chatcmpl-5b2d…","object":"chat.completion.chunk","model":"qirnas","choices":[],"usage":{"prompt_tokens":21,"completion_tokens":4,"total_tokens":25}}data: [DONE]
// Node 18+ — read the stream, skip keep-alive comments, surface in-band errors.async function streamChat(body) {  const res = await fetch("https://api.mindlabsa.com/v1/chat/completions", {    method: "POST",    headers: {      Authorization: `Bearer ${process.env.QIRNAS_API_KEY}`,      "Content-Type": "application/json",    },    body: JSON.stringify({ ...body, stream: true, stream_options: { include_usage: true } }),  });  if (!res.ok) throw new Error((await res.json()).error.code); // failed before streaming  const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();  let buffer = "";  for (;;) {    const { value, done } = await reader.read();    if (done) return;    buffer += value;    let end;    while ((end = buffer.indexOf("\n\n")) >= 0) {      const event = buffer.slice(0, end);      buffer = buffer.slice(end + 2);      if (event.startsWith(":")) continue; // ": keep-alive" while the model starts      const data = event.slice("data: ".length);      if (data === "[DONE]") return;      const chunk = JSON.parse(data);      if (chunk.error) throw new Error(`${chunk.error.code}: ${chunk.error.message}`);      if (chunk.usage) console.log("\n", chunk.usage);      process.stdout.write(chunk.choices[0]?.delta?.content ?? "");    }  }}

استدعاء الأدوات

النماذج التي تذكر tools ضمن capabilities في GET /v1/models تستطيع استدعاء دوالك.

  1. اعرض الدوال في tools (واختيارياً tool_choice).
  2. حين يستدعي النموذج دالة يكون finish_reason هو tool_calls، وتحمل message.tool_calls اسم الدالة ومعاملاتها بصيغة JSON نصية.
  3. نفّذ الدوال، ثم أضف رسالة المساعد ورسالة role: "tool" لكل استدعاء (مع tool_call_id)، واطلب من جديد.

في البث تصل الاستدعاءات أجزاءً في delta.tool_calls — اجمع الأجزاء التي تشترك في index.

// 1. Offer a tool{  "model": "qirnas",  "messages": [{ "role": "user", "content": "كم درجة الحرارة في الرياض الآن؟" }],  "tools": [{    "type": "function",    "function": {      "name": "get_weather",      "description": "Current weather for a city",      "parameters": {        "type": "object",        "properties": { "city": { "type": "string" } },        "required": ["city"]      }    }  }]}// 2. The model calls it: finish_reason is "tool_calls""message": {  "role": "assistant",  "content": null,  "tool_calls": [{    "id": "call_abc123",    "type": "function",    "function": { "name": "get_weather", "arguments": "{\"city\":\"الرياض\"}" }  }]}// 3. Run it, append both messages, and call again with the same tools"messages": [  { "role": "user", "content": "كم درجة الحرارة في الرياض الآن؟" },  { "role": "assistant", "content": null, "tool_calls": [/* as received */] },  { "role": "tool", "tool_call_id": "call_abc123", "content": "{\"temp_c\":41}" }]

النماذج

النماذج التي يستطيع مفتاحك استدعاءها بالاسم الآن، بنافذة السياق وحدود المخرجات والقدرات والحالة.

GET/v1/models

القائمة لكل مفتاح على حدة: تسرد بالضبط النماذج التي يحق لهذا المفتاح استدعاؤها، مع خفض max_output_tokens وdefault_max_tokens إلى سقف مخرجات المفتاح إن كان له سقف. qirnas اسم مستعار دائم للنموذج الافتراضي، ويتصدّر القائمة بحقول ذلك النموذج حين يحق لمفتاحك استدعاؤه. أرسله في model، أو احذف model، ليجيب النموذج الافتراضي. يُحتسب هذا الطلب ضمن حد معدل حسابك.

المعرّفات غير المعروفة مُهمَلة. المعرّف الذي لا تعرفه البوابة ما زال يجيب عنه النموذج الافتراضي، لكن الرد يحمل ترويسة Deprecation ورابطاً إلى سجل التغييرات في ترويسة Link. أرسل qirnas أو معرّفاً من GET /v1/models: بعد 60 يوماً على الأقل من إشعار سجل التغييرات ستعود هذه المعرّفات بالخطأ 404 model_not_found، ويُعلن الموعد الدقيق في سجل التغييرات.

Deprecation: @1790467200Link: <https://developer.mindlabsa.com/changelog>; rel="deprecation"; type="text/html"
curl https://api.mindlabsa.com/v1/models \  -H "Authorization: Bearer $QIRNAS_API_KEY"
{  "object": "list",  "data": [    {      "id": "qirnas",      "object": "model",      "created": 1782982800,      "owned_by": "mindlab",      "provider": "mindlab",      "self_hosted": true,      "upstream_revision": null,      "context_window": 16384,      "max_output_tokens": 8192,      "default_max_tokens": 3072,      "capabilities": ["tools", "streaming"],      "status": "on"    },    // the default model under its own id, with the same fields    { "id": "qirnas-v0", "object": "model", /* … */ "status": "on" }  ]}
الحقلالنوعالوصف
idstringالمعرّف الذي ترسله في model.
object"model"دائماً model.
createdintegerوقت إضافة النموذج بثواني Unix (0 إن كان غير معروف).
owned_bystringمطابق لقيمة provider.
providerstringالجهة التي تشغّل النموذج؛ unknown إلى أن يُراجَع.
self_hostedbooleanالقيمة true: أوزان نتحكم بها، يخدمها خادم نشغّله أو نستأجره. يكون النموذج نموذجنا فقط حين تكون هذه القيمة true وقيمة provider هي mindlab. ولا تدل على مكان معالجة البيانات.
upstream_revisionstring | nullالقيمة null للنموذج المستضاف ذاتياً. وإلا فبصمة (64 حرفاً ست عشرياً) للجهة التي تُرسل إليها طلباته، تتغير حين يُوجَّه النموذج إلى جهة أخرى.
context_windowinteger | nullعدد الرموز التي يجب أن تتسع فيها الرسائل والرد معاً؛ null إن لم يُسجَّل. تجاوزه يعيد 400 context_length_exceeded.
max_output_tokensintegerأكبر max_tokens يُعطى للنموذج مع مفتاحك: سقف النموذج نفسه، مخفّضاً إلى سقف مخرجات مفتاحك إن كان له سقف. الطلب الأكبر يُخفَّض إليه.
default_max_tokensintegerقيمة max_tokens للطلب الذي لا يرسلها، ضمن سقف مخرجات مفتاحك كذلك.
capabilitiesstring[]ما يدعمه النموذج، مثل tools وstreaming.
status"on" | "offline"offline: متوقف حالياً. الاستدعاء بهذا المعرّف يعيد 503 model_offline، وبالاسم qirnas (أو دون model) يعيد 503 no_model_available.

صلاحيات المفتاح

ما يحق لكل مفتاح استدعاؤه. تضبطها المنصة لكل مفتاح على حدة؛ والمفتاح الذي يُنشأ من هذه البوابة لا يملك نطاقات ولا قائمة نماذج ولا سقف مخرجات.

الصلاحيةما تفعلهالرد عند الرفض
النطاقاتتفعّل معاملاً أو مساراً: reasoning وthink للمعاملين بالاسم نفسه (ولنموذج يعمل بوضع التفكير المعمّق)، وembeddings لـ POST /v1/embeddings، وsearch لـ POST /v1/search.403 scope_required
قائمة النماذجالمفتاح ذو القائمة يستدعي النماذج المدرجة فيها فقط، ولا تسرد له GET /v1/models غيرها. وإن لم تضم القائمة النموذج الافتراضي رُفض qirnas والطلب الذي لا يرسل model.403 model_not_permitted، وparam هو model
نماذج المزوّدين الخارجيينالنموذج الذي قيمة self_hosted فيه false يحتاج إذناً لذلك النموذج بعينه، ولا يُمنح أي إذن افتراضياً.403 model_not_permitted، وparam هو model
ظهور النماذجالنموذج الذي لا يحق لمفتاحك رؤيته (نموذج داخلي، أو نموذج خاص دون إذن) لا يُسرد، ويعود كأنه غير موجود.404 model_not_found
سقف المخرجاتيُعطى النموذج أصغر هذه القيم: max_tokens في طلبك (أو default_max_tokens للنموذج)، وmax_output_tokens للنموذج، وسقف المفتاح، و8192. وتعرض GET /v1/models القيمتين بعد التخفيض.لا رفض: تُخفَّض القيمة
حد المعدلكل مفاتيح حسابك في المستوى القياسي وتتشارك عدّاداً واحداً لكل مسار: 120 طلباً في أي 60 ثانية.429 rate_limit_exceeded مع Retry-After

بالنسبة للنموذج: الرد 403 model_not_permitted يعني أن النموذج ظاهر لمفتاحك لكن المفتاح لا يملك الإذن به، أما 404 model_not_found فيعني أنه لا يحق لمفتاحك معرفته أصلاً. انظر رموز الأخطاء وحدود المعدل.

المتجهات

متجهات للبحث والتجميع وRAG، بصيغة المتجهات القياسية المتوافقة مع OpenAI.

POST/v1/embeddings
يتطلب صلاحية: نطاق embeddings
يحتاج هذا المسار مفتاحاً يملك النطاق embeddings، وإلا يعود كل طلب 403 بالرمز scope_required أياً كانت نطاقات المفتاح الأخرى. المفاتيح التي تُنشأ من هذه البوابة تبدأ دون هذا النطاق.
المعاملالنوعالوصف
input
مطلوب
string | string[] · ≥ 1 item · ≤ 64 items · ≥ 1 charsالنص المراد تحويله: سلسلة واحدة، أو قائمة من 1 إلى 64 سلسلة، كل منها غير فارغة، وبحد أقصى 32,000 حرف للطلب كله. لا تُقبل قوائم الرموز. المدخل الأطول من 4096 رمزاً يُقتطع ولا يُرفض. ويسمّي param العنصر المرفوض (input.3).
model"bge-m3"اختياري: النموذج الوحيد الذي يخدمه هذا المسار. أي قيمة أخرى تعود 400 invalid_request.
encoding_format"float" | "base64" · default "float"القيمة float: كل متجه قائمة أعداد. والقيمة base64: ترميز base64 لأعداده العشرية بطول 32 بت وبترتيب little-endian (ما تطلبه مكتبات OpenAI وتفكّه).
dimensions1024اختياري: البُعد الوحيد للنموذج. أي قيمة أخرى تعود 400.
userstring · ≤ 256 charsيُقبل للتوافق مع OpenAI ويُتجاهل: لا يُمرَّر ولا يُخزَّن.
curl https://api.mindlabsa.com/v1/embeddings \  -H "Authorization: Bearer $QIRNAS_API_KEY" \  -H "Content-Type: application/json" \  -d '{ "input": ["مقهى هادئ في جدة", "a quiet café in Jeddah"] }'
{  "object": "list",  "data": [    { "object": "embedding", "index": 0, "embedding": [0.0213, -0.0087, /* … 1024 numbers */] },    { "object": "embedding", "index": 1, "embedding": [/* … */] }  ],  "model": "bge-m3",  "usage": { "prompt_tokens": 14, "total_tokens": 14 }}
  • النموذج bge-m3 بـ 1024 بُعداً، وكل متجه مُطبَّع إلى طول الوحدة. يحمل الرد (200) متجهاً لكل مدخل بالترتيب نفسه، ويحتسب usage.prompt_tokens الرموز التي حُوّلت.
  • حتى 64 مدخلاً و32,000 حرف في الطلب، في جسم لا يتجاوز 256 كيلوبايت (وإلا 413 request_too_large). الحقول غير المدرجة تُتجاهل (فعملاء OpenAI يرسلون حقولاً إضافية)، أما الحقل المدرج بقيمة غير صالحة فيعود 400 invalid_request ويسمّيه param.
  • يستطيع حسابك إرسال 20 طلباً في الدقيقة هنا، فوق الحد العام (وإلا 429 rate_limit_exceeded). والسعة خلفه مشتركة بين كل المستخدمين: في لحظة الانشغال يعود 429 capacity_exceeded مع Retry-After، وحين لا تستطيع الخدمة قبول الطلبات يعود 503 service_unavailable، مع Retry-After حين تُعرف مدة الانتظار.
  • الرد 502 أو 504 يحمل x-should-retry: false: فقد استُهلك العمل، فأعد إرسال الطلب لاحقاً، أو أصغر، لا فوراً.

معرّفات الطلبات

كل رد يحمل ترويسة x-request-id، بما فيها الأخطاء والبث.

  • أرسل معرّفك في x-request-id لتتطابق سجلاتك مع سجلاتنا: من 1 إلى 128 حرفاً من A-Z a-z 0-9 . _ : - (النمط ^[A-Za-z0-9._:-]{1,128}$). أي قيمة أخرى تُستبدل بمعرّف مولَّد.
  • يكرّره غلاف الخطأ وحدث الخطأ أثناء البث في الحقل request_id.
  • أرفقه عند التواصل مع الدعم لنتتبّع الطلب في سجلاتنا.
curl -si https://api.mindlabsa.com/v1/models \  -H "Authorization: Bearer $QIRNAS_API_KEY" \  -H "x-request-id: checkout-7f3a" | grep -i x-request-id# x-request-id: checkout-7f3a

ترويسات الرد

كل ترويسة يعد بها عقد الواجهة والردود التي تحملها، ولا شيء غيرها.

الترويسةمتى تُرسلالوصف
x-request-idكل رد، بما فيه الأخطاء والبث.
POST /v1/chat/completions · 201 400 401 403 404 413 429 500 502 503 504
GET /v1/models · 200 401 429 500
POST /v1/embeddings · 200 400 401 403 413 429 500 502 503 504
POST /v1/search · 200 400 401 403 413 429 500 502 503 504
معرّف هذا الطلب: معرّفك إن أرسلت معرّفاً صالحاً، وإلا فمعرّف مولَّد. أرفقه عند التواصل مع الدعم.
Retry-Afterالرد 429 بالرمز rate_limit_exceeded أو capacity_exceeded، والرد 503 service_unavailable من POST /v1/embeddings أو POST /v1/search (وقد يأتي ذلك الرد دونها). لا يُرسل مع upstream_rate_limited.
POST /v1/chat/completions · 429
GET /v1/models · 429
POST /v1/embeddings · 429 503
POST /v1/search · 429 503
عدد الثواني (عدد صحيح، 1 على الأقل) قبل أن تعيد المحاولة: حتى يسمح الحد الذي رفض الطلب بطلب آخر (حد حسابك على المسار، أو حصة حسابك من المتجهات أو البحث)، أو حتى تتسع السعة المشتركة.
Deprecationطلب إكمال محادثة يسمّي في model معرّفاً لا تعرفه البوابة (الاسم qirnas معروف)، والأخطاء التي يتلقاها بعد التحقق من مفتاحه وحقوله. لا تحملها ردود 401 و413 و429 rate_limit_exceeded، ولا رد 400 لحقل فشل في التحقق.
POST /v1/chat/completions · 201 400 403 429 500 502 503 504
هذا الاستخدام مُهمَل (RFC 9745). القيمة تاريخ الإهمال: @1790467200، أي 27 سبتمبر 2026. يجيب النموذج الافتراضي كالمعتاد؛ أرسل qirnas أو معرّفاً من GET /v1/models.
Linkمع Deprecation.
POST /v1/chat/completions · 201 400 403 429 500 502 503 504
رابط سجل التغييرات، حيث يُعلن موعد توقف المعرّفات غير المعروفة قبل 60 يوماً على الأقل.
x-should-retryالرد 502 أو 504 من POST /v1/embeddings، والرد 503 service_unavailable من POST /v1/search حين يزيد الانتظار على دقيقة.
POST /v1/embeddings · 502 504
POST /v1/search · 503
القيمة دائماً false: لا تُعد هذا الطلب فوراً (فقد استُهلك العمل وراءه، أو أن الانتظار طويل)، ومكتبات OpenAI تحترمها. أعد إرساله لاحقاً، أو أصغر.

الأدلة والمراجع

واجهة الوكلاء (تجريبية)وكلاء وتشغيلات وموافقات وأدوات ومشغّلات وWebhooks.
إكمال المحادثةأرسل الرسائل واستلم الردود مع البث المباشر.
المتجهات (Embeddings)توليد متجهات للبحث والتجميع وRAG، بمفتاح يملك نطاق embeddings.
الملفات ومخازن المتجهاتقريباًارفع المستندات واسترجع إجابات موثّقة.
استدعاء الدوالامنح النموذج أدوات يستدعيها نيابة عنك.
الرؤيةقريباًتحليل الصور ولقطات الشاشة والمخططات.
الصوت (TTS / STT)قريباًتحويل الكلام العربي إلى نص وبالعكس.
المخرجات المهيكلةقريباًإرجاع JSON مطابق لمخطط محدد.
واجهة الدفعاتقريباًمعالجة ملايين الطلبات بتكلفة أقل.
أفضل الممارساتمعالجة الأخطاء وإعادة المحاولة والمهلات.