واجهة برمجة التطبيقات المفتوحة
نقطة وصول متوافقة مع OpenAI لشخصياتك.
تتيح Reverie نقطة وصول Chat Completions متوافقة مع OpenAI. وجّه إليها أي عميل OpenAI، ومرّر مفتاح API من Reverie، واستخدم حقل model لتسمية شخصية أو سيناريو بدل نموذج لغوي. تحتفظ Reverie بالمحادثة والذكريات والملخصات عندها، فلا تحتاج كل طلبية إلا إلى رسالتك الجديدة.
يستطيع أي حساب مسجَّل الدخول استخدامها. لا توجد فئة اشتراك ولا قائمة انتظار — تحتاج مفتاح API فقط، لا غير. أنشئ واحدًا ←
العنوان الأساسي والمصادقة
https://www.reverie.im/api/device/v1
Authorization: Bearer rk_...الإعدادات ← المزيد ← مفاتيح API تعرض العنوان الأساسي بالضبط في بطاقة API Endpoint، ومعه زر نسخ.
هذه واجهة تعمل من الخادم. طلبات المتصفح من أصل مختلف محجوبة، لذا سيفشل أي fetch من صفحتك أنت مهما كان المفتاح صحيحًا. نادِها من خادمك الخلفي، وأبقِ المفتاح خارج شيفرة العميل.
بداية سريعة
curl --no-buffer https://www.reverie.im/api/device/v1/chat/completions \
-H "Authorization: Bearer $REVERIE_API_KEY" \
-H "Content-Type: application/json" \
--data-binary '{
"model": "Luna [abc12345]",
"messages": [
{
"role": "user",
"content": "Hi"
}
],
"stream": true,
"temperature": 0.8
}'في الإعدادات ← المزيد ← مفاتيح API يوجد أيضًا مُنشئ طلبات يولّد هذه المقاطع الثلاثة باستخدام أحد مفاتيحك الحقيقية وشخصية حقيقية.
حقل model يسمّي شخصية
اسم الشخصية وحده لا يعمل. model: "Luna" لا يبحث عن شخصية اسمها Luna. فهو لا يطابق شيئًا، ويسقط إلى شخصية المفتاح الافتراضية أو إلى أحدث محادثاتك، فيأتيك رد من شخصية أخرى دون أي خطأ. استخدم دائمًا صيغة الاسم [معرّف قصير] التي يعيدها GET /models.
قيمة model | من يجيب |
|---|---|
Luna [abc12345] | الشخصية أو السيناريو الذي ينتهي معرّفه بتلك الأحرف الثمانية |
| معرّف كامل لشخصية أو سيناريو | تلك الشخصية أو ذلك السيناريو |
معرّف نموذج في Reverie، مثل deepseek-v4-flash | يختار النموذج اللغوي؛ أما الشخصية فتأتي من المفتاح أو من آخر محادثة لك |
| متروك | الشخصية المثبَّتة على المفتاح، وإلا فأحدث محادثاتك |
تفاصيل تحدّد ما إذا كان المعرّف القصير سيُحَل:
- يجب أن يكون
[...]في نهاية النص. - اللاحقة المكوّنة من 8 أحرف أو أقل تُطابَق فقط مع الشخصيات التي لديك معها محادثة أصلًا، على الويب أو عبر الواجهة. أما المعرّف القصير لشخصية لم تفتحها قط فيسقط بصمت.
- لا يجري البحث عن السيناريو إلا حين يكون المفتاح مثبَّتًا على شخصية. ومع مفتاح عام، لا يمكن لمعرّف سيناريو قصير أن يُحَل أبدًا.
- ما زاد عن 8 أحرف يُعامَل كمعرّف كامل.
سرد من يمكنك التحدث إليه
curl https://www.reverie.im/api/device/v1/models \
-H "Authorization: Bearer $REVERIE_API_KEY"المفتاح العام يعيد شخصياتك الأخيرة. أما المفتاح المثبَّت على شخصية فيعيد سيناريوهات تلك الشخصية، أو الشخصية نفسها إن لم يكن لها سيناريوهات. وكل مُدخَل يبدو هكذا:
{
"id": "Luna [abc12345]",
"object": "model",
"created": 1759200000,
"owned_by": "character",
"permission": [],
"root": "<full character id>",
"parent": null
}انسخ id مباشرة إلى model. أخطاء هذه النقطة تستخدم شكل خطأ بسيطًا بدل غلاف OpenAI.
ما الذي يُقرأ من جسم الطلب
تُقرأ أربعة حقول. وكل ما عداها يُقبل ثم يُهمَل بصمت.
| الحقل | النوع | القيمة الافتراضية | ملاحظات |
|---|---|---|---|
messages | مصفوفة | مطلوب | انظر أدناه — لا يُستخدم منها إلا جزء |
model | نص | اختياري | شخصية أو سيناريو أو نموذج لغوي، كما سبق |
stream | منطقي | true | البث هو الوضع الافتراضي هنا، بخلاف واجهة OpenAI |
temperature | رقم بين 0 و2 | إعداد الشخصية، وإلا 0.8 | القيم خارج المدى تُرفض |
يُتجاهل دون تنبيه: max_tokens, top_p, n, stop, presence_penalty, frequency_penalty, logit_bias, seed, user, response_format, tools, tool_choice, logprobs, stream_options.
كيف تُعالَج messages:
- رسائل
systemتُسقَط. الشخصية والسلوك يأتيان من حقول الشخصية نفسها، لا من الطلب. حقول التوجيه ← - لا دعم للرؤية. قد يكون المحتوى نصًّا أو مصفوفة أجزاء، لكن لا تُقرأ إلا أجزاء
text؛ أما أجزاء الصور فتُتجاهل. - لا يُضاف إلى المحادثة إلا آخر رسالة
user. والرسائل السابقة من المستخدم تُتجاهل. - رسائل المساعد تُستخدم فقط لمزامنة السجل (انظر أدناه).
- إن كانت آخر رسالة للمستخدم فارغة أو كلها مسافات، يُعاد
missing_user_message.
الاستجابات
الاستجابة غير المتدفقة كائن chat.completion عادي. وfinish_reason دائمًا stop — فاستدعاءات الأدوات الداخلية لا تظهر أبدًا — وعدّادات usage أصفار، لذا قِس التوكنات من إحصاءات الاستخدام في صفحة مفاتيح API لا من الاستجابة.
الاستجابة المتدفقة هي text/event-stream:
- مقاطع المحتوى: كائنات
chat.completion.chunkتحملdelta.content. ولا يُرسَل مقطعdelta: {"role": "assistant"}في البداية. - مقطع إنهاء، بـ
finish_reasonيساويstopأوlengthأوcontent_filter. والإنهاء الناتج عن استدعاء أداة يُبلَّغ عنه كـstop. - مقطع استخدام بمصفوفة
choicesفارغة. data: [DONE].
وإن فشل التوليد في منتصف البث، يُصدر البث data: {"error": {...}} ثم [DONE].
حالة المحادثة
تخزّن Reverie المحادثة. توجد محادثة واحدة لكل ثنائي مفتاح وشخصية، وتظهر في تطبيق الويب إلى جانب محادثاتك الأخرى، ويُبنى كل دور من توجيه النظام للشخصية وسيناريوها، وقانون كتب العالم، والذكريات بعيدة المدى، والملخصات المتجدّدة، وأسلوب سرد الشخصية وطول ردودها وإعدادات المحتوى الحساس، وقفل اللغة المأخوذ من لغة حسابك، وما تتسع له نافذة سياق النموذج من السجل الحديث. وتعمل أدوات الذاكرة حين يدعم النموذج الأدوات.
وبما أن الخادم يحتفظ بالسجل، فلا حاجة لأن تعيد إرساله.
إرسال رسائل المساعد قد يحذف السجل. إن احتوت مصفوفة messages عندك على رسائل مساعد، تأخذ Reverie آخرها وتبحث عنها بين آخر 20 رسالة مخزَّنة، وعند المطابقة تحذف نهائيًا كل رسالة أُنشئت بعدها، مع الذكريات التي نشأت بعد تلك النقطة. وإن لم تطابق شيئًا فلا يُحذف شيء. وطول مصفوفتك لا يغيّر ذلك. ولتجنّب هذا تمامًا، أرسل رسالة المستخدم الجديدة وحدها.
أي نموذج لغوي يجيب
الشخصية هي التي تقرّر، لا الطلب — إلا إذا سمّيت نموذجًا لغويًا بنفسك. الأولوية من الأدنى إلى الأعلى: نموذج المحادثة الافتراضي، ثم إعداد النموذج الخاص بالشخصية، ثم معرّف نموذج Reverie المُمرَّر في model، وأخيرًا تفضيل النموذج الذي ضبطته لتلك المحادثة في تطبيق الويب، وهو يتغلّب على الجميع. النماذج ←
الأخطاء
أخطاء /chat/completions تستخدم غلاف OpenAI: {"error": {"message", "type", "param": null, "code"}}.
| HTTP | code | type | السبب |
|---|---|---|---|
| 401 | invalid_api_key | invalid_request_error | Authorization مفقود أو مشوّه، أو المفتاح مجهول، أو المفتاح غير مفعّل |
| 401 | api_key_expired | invalid_request_error | انتهت صلاحية المفتاح |
| 404 | scenario_not_found | invalid_request_error | تم حلّ معرّف السيناريو لكن السيناريو لم يعد موجودًا |
| 404 | character_not_found | invalid_request_error | الشخصية مفقودة أو محذوفة |
| 404 | no_chat_history | invalid_request_error | لا model، ولا شخصية مثبَّتة، ولا محادثة سابقة يُرجع إليها |
| 400 | missing_user_message | invalid_request_error | لا توجد رسالة user غير فارغة |
| 429 | rate_limit_exceeded | rate_limit_exceeded | نفدت نافذة النماذج المجانية. وRetry-After يذكر عدد الثواني التي يجب انتظارها |
| 429 | insufficient_quota | insufficient_quota | الأرصدة لا تكفي لهذا الطلب |
| 502 | MODEL_EMPTY_RESPONSE | server_error | انتهى النموذج بسلام لكن دون نص |
| متغيّر | رمز المزوّد | server_error | فشل التوليد عند المزوّد |
هناك حالتان خارج هذا الغلاف: أخطاء GET /models، وأجسام الطلبات التي يرفضها التحقق (مثل temperature خارج المدى) — وكلتاهما تعيد شكل خطأ بسيطًا.
حدود المعدّل والحصص
لا يوجد في هذه الواجهة حدّ معدّل لكل مفتاح، ولا سقف للتزامن، ولا حصة للطلبات. ما يقيّد استخدامك شيئان فقط:
| القيد | القيمة |
|---|---|
| رصيد الأرصدة | يُفحص قبل كل طلب؛ وعند الفشل يُعاد insufficient_quota |
| نافذة النماذج المجانية | 15 رسالة كل 3 ساعات لكل حساب — ×3 في Pro (45)، و×4 في Premium (60)، و×5 في Ultimate (75) |
نافذة النماذج المجانية مشتركة مع دردشة الويب والقصص والروايات والبوتات — فهي حصة واحدة لكل حساب، لا حصة لكل واجهة. النماذج المجانية ←
ولا ترسل Reverie أي webhooks إلى الخارج؛ فليس هناك ما تشترك فيه لتصلك أحداث انتهاء التوليد.
استيراد الشخصيات
وهناك نقطة وصول ثانية، POST /api/v1/characters/import، تُنشئ شخصية من بطاقة شخصية. وهي تحتاج مفتاحًا بصلاحية الاستيراد، وليس هذا نوع المفاتيح الذي تنشئه صفحة الإعدادات. مفاتيح API ← واستيراد الشخصيات ←
ذات صلة
- مفاتيح API — إنشاء المفاتيح وتثبيتها وتحديد صلاحيتها ومتابعتها
- النماذج — معرّفات النماذج ومُضاعِفات الأرصدة
- الحدود — بقية السقوف في المنتج
- الأرصدة — كيف تُسعَّر الطلبات