https://api.echonova.aiسجل التغييرات
سجل التغييرات
إصدار API، وما يُعدّ تغييرًا كاسرًا، وقائمة مؤرخة بكل تغيير على نقاط نهاية v1 منذ إطلاقها.
هذه الصفحة سجل لما تغيّر في API المطورين ومتى. اقرأها قبل أن ترقّي عميلًا، وراجعها عندما يبدأ طلب كان يعمل في الفشل.
الإصدار
يوجد إصدار واحد للواجهة، هو v1، وهو جزء من كل مسار: /v1/text-to-speech و/v1/speech-to-text ونقاط النهاية التي تحتهما. لا يوجد header للإصدار. التغيير الذي لا يمكن إجراؤه داخل v1 وفق السياسة أدناه يُطلق تحت بادئة جديدة، ويبقى v1 يعمل لفترة منشورة.
سياسة التغييرات الكاسرة
التغيير الكاسر هو التغيير الذي يجعل طلبًا كان يعمل بالأمس يفشل اليوم، أو يغيّر معنى استجابة كان العميل يقرؤها من قبل.
| كاسر | غير كاسر |
|---|---|
| حذف نقطة نهاية أو إعادة تسميتها، أو حذف حقل طلب أو حقل استجابة أو حدث Webhook أو إعادة تسميته. | إضافة نقطة نهاية. |
| جعل حقل طلب اختياري حقلًا مطلوبًا. | إضافة حقل طلب اختياري. |
| خفض حد: أحرف أقل، أو صوت أقصر، أو ملف أصغر، أو طلبات أقل في الدقيقة. | رفع حد. |
| تغيير نوع حقل أو حالة HTTP لاستجابة. | إضافة حقل إلى استجابة أو إلى جسم Webhook. |
| تغيير مخطط المصادقة أو صيغة المفتاح. | إضافة نوع حدث Webhook جديد. يُرسل فقط إلى Webhooks المشتركة فيه. |
تغيير نص errorMessage موجود. |
إضافة errorMessage جديد لحالة فشل جديدة. |
تنتج خاصيتان للواجهة من هذا الجدول. أولًا، تُرفض الحقول غير المعروفة في جسم JSON أو في سلسلة الاستعلام بالرمز 400 مع property <name> should not exist، لذلك لا ينبغي للعميل أن يرسل حقلًا قبل المدخل أدناه الذي يقدّمه. ونقطتا رفع الملفات في تحويل الكلام إلى نص تقرآن حقول النموذج المسماة وتتجاهلان أي حقل نموذج آخر. ثانيًا، ينبغي للعميل أن يقرأ الحقول التي يحتاجها من الاستجابة ويتجاهل الباقي، لأن حقولًا جديدة ستظهر دون إشعار.
تُدرج التغييرات الكاسرة أدناه مع تاريخها.
التغييرات
2026-10-23
أُضيف:
- تقبل نقطتا رفع تحويل الكلام إلى نص،
POST /v1/speech-to-textوPOST /v1/speech-to-text/sync، حقل نموذج اختياريًا باسمidentify_speakersبقيمةtrueأوfalse. القيمة الافتراضية هيfalse، فالطلب الذي لا يرسله يحصل على النص المفرّغ نفسه كما كان من قبل. والقيمة غيرtrueأوfalseأو1أو0تحصل على400معidentify_speakers must be true or false. - صارت
identifySpeakersوsegmentsوspeakersتُعاد في الاستجابة المتزامنة وفي المهمة التي تعيدها الجلب والقائمة. تحملsegmentsالقيمstartوendوtextوspeaker(spk0أوspk1أو … أوnull)؛ وتحملspeakersالقيمتينidوtalkTime. المهام التي أُنشئت قبل هذا التاريخ تُظهرfalseو[]و[]. ولم يتغير جسم Webhook job.completed. - تنزّل
GET /v1/speech-to-text/jobs/{jobId}/exportمهمة مكتملة بقيمةformat=txtأوsrtأوjson، مع تسميات المتحدثين بقيمةlang=enأوar. الجسم هو الملف، لا الغلاف. وتضيف الرسائلformat must be one of the following values: txt, srt, jsonوlang must be one of the following values: en, arوJob is not completed، وكلها400. انظر صيغ تحويل الكلام إلى نص ومخرجاته.
2026-10-21
كاسر:
- صار
jobIdالذي ليس من 24 حرفًا سداسيًا عشريًا يحصل على400معInvalid identifierفي مساراتGETوDELETEالخاصة بالمهام. كانDELETEيجيب عنه بـ404من قبل، وكان المعرّف من 12 حرفًا يجيب بـ404. - صارت طريقة HTTP الخاطئة على مسار
/v1موجود تحصل على405معMethod not allowedوheader باسمAllow. كانت404.
تغيّر:
- صار مسار
/v1غير المعروف يحصل على404معRoute not found. كانCannot GET ….
أُضيف:
- يحمل كل خطأ على مسار
/v1الحقلdocs، بما في ذلك413و400للجسم الذي ليس JSON صالحًا. - يقبل سجل الطلبات فلتر
requestId، ويضم تبويب السجلات في النشاط ابحث بمعرّف الطلب. ويعرض الصوت المعالَج الثواني عندما يقل عن دقيقة.
2026-10-20
أُضيف:
- يسجّل النشاط وسجل الطلبات الآن كل طلب إلى
/v1يُرسل بمفتاح معروف، بأي أسلوب وبأي حالة. تحصل طلباتGETوDELETEعلى صفوف أيضًا. لا تخصم طلباتGETأي رصيد. - جسم JSON أكبر من 100 كيلوبايت يعيد
413معRequest body is larger than 100 KB. والجسم الذي ليس JSON صالحًا يعيد400معRequest body is not valid JSON. لا صف لأي منهما في النشاط، لأن المفتاح لم يُفحص بعد. - الجسم المُرسل إلى
POST /v1/text-to-speechأوPOST /v1/text-to-speech/syncأو تذكرة ودجت بـContent-Typeغيرapplication/jsonيعيد415معContent-Type must be application/json. - تعرض نافذة إضافة نقطة النهاية سر توقيع Webhook الجديد مرة واحدة، مع زر نسخ.
تغيّر:
- صار حد IP يحتسب فقط الطلبات التي يرفضها فحص المفتاح. لا يحجب هذا الحد مفتاحًا صالحًا أبدًا، وتُقيَّد المفاتيح الصالحة لكل مفتاح فقط.
- صار
apiKeyNameفيspending.warningوspending.exhaustedاسم المفتاح، لا معرّفه.
2026-10-15
أُضيف:
- يقبل نقطتا رفع تحويل الكلام إلى نص،
POST /v1/speech-to-textوPOST /v1/speech-to-text/sync، حقل نموذج اختياريًا باسمnumbers_as_digitsبقيمةtrueأوfalse. القيمة الافتراضية هيtrue: تعود الأعداد المنطوقة أرقامًا، كما كان من قبل. أرسلfalseلتبقى كما قيلت كلمات. لا تُحوَّل النصوص الإنجليزية في أي من الحالتين. - صار
numbersAsDigitsيُعاد في الاستجابة المتزامنة وفي المهمة التي تعيدها الجلب والقائمة. المهام التي أُنشئت قبل هذا التاريخ تُظهرtrue.
2026-10-11
أُضيف:
- تنقية الصوت:
POST /v1/sound-cleaningوGET /v1/sound-cleaning/jobsوGET /v1/sound-cleaning/jobs/{jobId}. الرفع متزامن، حتى 10 دقائق و150 ميجابايت، بصيغة MP3 أو WAV أو FLAC أو OGG/Opus، ويكلّف 1,000 credits في الدقيقة. راجع دليل البدء لتنقية الصوت. cleanقيمة جديدة في الخدمات المسموح بها للمفتاح. المفتاح الذي لا يقيّد الخدمات يستطيع استخدام تنقية الصوت فورًا. أما المفتاح الذي يسرد خدماته فلا يستطيع ذلك، حتى تضغط تعديل في البوابة وتفعّل تنقية الصوت؛ وإلى أن تفعل ذلك تحصل استدعاءات تنقية الصوت منه على403.
تغيّر:
- حدود كل طلب: يُقيَّد
textفي نقطتي تحويل النص إلى كلام بـ 500 حرف، ويُقيَّد الصوت في نقطتي تحويل الكلام إلى نص وفي تنقية الصوت بـ 10 دقائق. صارت رسالة المدة في نقطتي تحويل الكلام إلى نص هيAudio exceeds the 10-minute limit. - تغيّرت وحدة الرصيد. يكلّف تحويل النص إلى كلام رصيدًا واحدًا لكل حرف من
text، بما في ذلك المسافات وفواصل الأسطر؛ ويكلّف تحويل الكلام إلى نص 100 credits في الدقيقة من الصوت، يُحتسب بالثانية. راجع الرصيد. - تحتفظ
creditsConsumedوcreditsUsedوcreditLimitبأسمائها وأنواعها؛ أما قيمها فبالوحدة الجديدة، أي أرصدة صحيحة بلا كسور. ضُرب حد الرصيد لكل مفتاح في 3,000 لينتقل إلى الوحدة الجديدة، فصار الحد 100 يُقرأ الآن 300,000. - صارت الأرصدة أعدادًا صحيحة. يُقرَّب كل خصم إلى رصيد صحيح (تقريب نصفي للأعلى، وبحد أدنى 1)، لذلك لا تكون
creditsConsumedعددًا عشريًا أبدًا؛ استدعاء تحويل كلام إلى نص مدته ثانية واحدة يكلّف 2 credits، لا 1.666667. وcreditsUsedعدد صحيح أيضًا.
2026-10-06
أُضيف:
- يقبل نقطتا رفع تحويل الكلام إلى نص،
POST /v1/speech-to-textوPOST /v1/speech-to-text/sync، حقل نموذج اختياريًا باسمlanguage:autoأوarأوen. القيمة الافتراضية هيauto. - صار
languageيُعاد في الاستجابة المتزامنة وفي المهمة التي تعيدها الجلب والقائمة. المهام التي أُنشئت قبل هذا التاريخ تُظهرauto.
كاسر:
- قيمة
languageكانت تُتجاهل من قبل، مثلen-USأوarabic، صارت تحصل على400معlanguage must be one of: auto, ar, en. حقول النموذج الزائدة الأخرى ما زالت تُتجاهل.
2026-10-01
- صارت مبالغ الرصيد في استجابات
/v1وفي webhooksspending.warningوspending.exhaustedأعدادًا عشرية بحد أقصى 6 منازل عشرية. أسماء الحقول كما هي:creditsConsumedوcreditsUsedوcreditLimit. اقرأها كأعداد بفاصلة عائمة. ما زالتpercentageUsedعددًا صحيحًا. - يُحتسب الرصيد بدقة. لم يعد الخصم يُقرَّب إلى رصيد صحيح كاملًا، ولا حد أدنى له.
- صار الرصيد الواحد يساوي $0.095 من الاستخدام، وتُسعَّر كل خدمة بتكلفة المزوّد زائد 20%. راجع الرصيد.
2026-09-06
كاسر:
- نقطتا تحويل النص إلى كلام: أُزيلت حقول الطلب
creativityوexaggerationوstability. الطلب الذي ما زال يرسل أحدها يحصل على400معproperty creativity should not exist، أو الرسالة نفسها للحقلين الآخرين. - نقطتا الرفع: الرفع الذي يتجاوز حد الحجم يُرفض الآن بالرمز
413معFile too largeأثناء استلام الجسم. قبل ذلك كان يُرفض بالرمز400معAudio file exceeds the 50MB limit.بعد قراءة الملف كله. - نقطتا الرفع: تغيّرت رسالة رفض المدة. كانت
Audio exceeds the 60-second limit. Use the async endpoint for longer audio.في النقطة المتزامنة، والنص نفسه مع1800-secondفي النقطة غير المتزامنة. صارتAudio exceeds the 20-minute limit.وAudio exceeds the 1-hour limit.
حدود رُفعت:
POST /v1/text-to-speech/sync: من 500 إلى 5 000 حرف لـtext. تبقى النقطة غير المتزامنة عند 5 000، فصارت النقطتان تشتركان في حد واحد. كان الحد غير المتزامن قد صار 20 000 لفترة قصيرة في اليوم نفسه؛ وهو الآن 5 000.POST /v1/speech-to-text/sync: مدة الصوت من دقيقة واحدة إلى 20 دقيقة.POST /v1/speech-to-text: مدة الصوت من 30 دقيقة إلى ساعة واحدة.- نقطتا الرفع: حجم الملف من 50 ميجابايت إلى 150 ميجابايت.
أُضيف:
- نقطتا تحويل النص إلى كلام: الحقول الاختيارية
cfg(من 1 إلى 5، والافتراضي 2)، وnumSteps(16 أو 32 أو 64 أو 128، والافتراضي 32)، وtashkeel(قيمة منطقية، والافتراضيfalse). بقيspeed(من 0.5 إلى 2، والافتراضي 1) كما هو. عند حذف حقل يُطبَّق الافتراضي، فيتصرف الطلب الذي لا يحملها كما كان من قبل. - Webhooks: صار حدثا
job.completedوjob.failedيُرسلان عندما ينتهي مهمة غير متزامنة بدأت بمفتاح API. قبل هذا التاريخ كان يمكن الاشتراك في الحدثين لكنهما لم يكونا يُرسلان.
2026-06-08
كاسر:
- نقطتا الرفع: تغيّرت رسائل رفض المدة من
Audio exceeds 30 minute limit (got <seconds>s)وSync STT supports up to 60s. Use the async endpoint for longer audio.إلىAudio exceeds the 1800-second limit. Use the async endpoint for longer audio.وAudio exceeds the 60-second limit. Use the async endpoint for longer audio. - نقطتا الرفع: الطلب الذي لا يحمل جزء ملف يُرفض بالرسالة
File is requiredبدلًا منAudio file is required.
2026-06-07
أول إصدار من v1:
- تحويل النص إلى كلام:
POST /v1/text-to-speechحتى 5 000 حرف، وPOST /v1/text-to-speech/syncحتى 500 حرف، وGET /v1/text-to-speech/voices، وGET /v1/text-to-speech/jobs، وGET /v1/text-to-speech/jobs/{jobId}. - تحويل الكلام إلى نص:
POST /v1/speech-to-textحتى 30 دقيقة من الصوت، وPOST /v1/speech-to-text/syncحتى دقيقة واحدة، وكلاهما حتى 50 ميجابايت، وGET /v1/speech-to-text/jobs، وGET /v1/speech-to-text/jobs/{jobId}. - المصادقة بـ
Authorization: Bearerومفاتيح تبدأ بـek_. - حد معدل 100 طلب كل 60 ثانية لكل مفتاح على كل نقطة نهاية.
- سجلات الطلبات في البوابة.
- Webhooks مع حدثي
spending.warningوspending.exhausted.
الأسئلة الشائعة
كيف أثبّت عميلي على إصدار معين؟
كل مسار يبدأ بـ /v1، وهذه البادئة هي الإصدار. لا يوجد header للإصدار ترسله.
ماذا يحدث إذا واصلت إرسال حقل تمت إزالته؟
يحصل على 400 مع property <name> should not exist. أزل الحقل؛ عندها يتصرف الطلب كما كان قبل أن يوجد الحقل.
هل يكسر حقل استجابة جديد عميلي؟
لا، إذا كان العميل يقرأ الحقول التي يحتاجها ويتجاهل الباقي. تُضاف الحقول دون إشعار؛ وحذف حقل أو إعادة تسميته تغيير كاسر وتُدرج هنا.