بيئة تشغيل المزوّد
تحوّل بيئة تشغيل المزوّد مسار مزوّد محددًا إلى استجابة نموذج نهائية. وهي تملك تنفيذ المزوّد، ومسارات الرجوع الاحتياطي، وجمع البث، والتعامل مع سبب الإنهاء، والمتابعة، وسجل استدعاءات الأدوات الأصلي للمزوّد، والحد الفاصل بين خرج المزوّد والأدوات القابلة للتنفيذ.
هذه الصفحة للمشرفين والمشغّلين الذين يفحصون سلوك المزوّدين. تفاصيل الإعداد الموجهة للمستخدم موجودة في المزوّدون.
ما الذي تغطيه هذه الصفحة
استخدم هذه الصفحة عندما تحتاج إلى فحص:
- لماذا تم اختيار مسار مزوّد معين
- هل عملت مسارات الرجوع الاحتياطي
- لماذا تابعت الاستجابة، أو توقفت، أو فشلت باتجاه المنع
- هل كانت استدعاءات الأدوات النهائية آمنة للتنفيذ
- هل أُعيد تمرير استدعاءات أدوات سابقة كسجل أصلي للمزوّد
- هل تم الاحتفاظ بـ
providerReplayEchoأو حذفه - ما التشخيصات التي يجب أن تظهر لجولة مزوّد معينة
إعداد المزوّدين، والاعتمادات، واختيار النماذج موثّقة في صفحات أخرى. هذه الصفحة تشرح تنفيذ بيئة التشغيل بعد أن يكون المسار قد حُلّ بالفعل.
مسار التنفيذ
ينقسم تنفيذ المزوّدين بين سطحين رئيسيين في بيئة التشغيل:
| السطح | الدور |
|---|---|
ProviderExecutor | ينفّذ المسار الأساسي وسلسلة الرجوع الاحتياطي عبر موائمات المزوّدين المسجلة. |
ProviderTurnLoop | يشغّل حلقة الجولة حول تنفيذ المزوّد، والأدوات، والمتابعة، والميزانيات، والتعامل مع الاستجابة النهائية. |
ProviderExecutor هو حد الموائم. يحل المسار المطلوب، ويستدعي موائم المزوّد المطابق، ويجمع خرج البث حيث يكون مدعومًا، ويسجل بيانات المحاولة، ويتعامل مع محاولات الرجوع الاحتياطي، ثم يعيد نتيجة تنفيذ مزوّد نهائية.
يستهلك ProviderTurnLoop تلك النتيجة. يقرر هل اكتملت الجولة، وهل يجب تخطيط استدعاءات الأدوات النهائية، وهل يُسمح بمتابعة النص، وهل تم تجاوز حدود الفشل المتكرر أو ميزانية الوقت، وما الاستجابة المرئية التي يجب إرجاعها.
لا تنفّذ بيئة التشغيل أجزاء استدعاءات الأدوات المبثوثة. يبدأ تخطيط الأدوات فقط بعد إنهاء خرج المزوّد.
دعم الموائمات
يوجه EstaCoda استدعاءات المزوّدين عبر موائمات مزوّدين مهيأة.
مسارات OpenAI-compatible Chat Completions هي المسار الأساسي لإعادة تمرير سجل استدعاءات الأدوات بصيغة المزوّد الأصلية. لا تُفعّل إعادة التمرير الأصلية إلا عندما تسمح بها بيانات المسار، وقدرة النموذج، ووضع API جميعًا.
يتضمن EstaCoda أيضًا موائم OpenAI Responses لمسارات openai_responses المهيأة. تجهيز طلبات Responses والتنفيذ غير المبثوث مدعومان عندما يكون الاستدلال الشبكي مفعّلًا في بيئة التشغيل. بث Responses ليس جزءًا من خط الأساس الحالي، كما أن مسارات Responses ليست حاليًا مسار إعادة تمرير سجل الأدوات الأصلي.
لا توجد قاعدة عامة تقول إن كل مزوّد OpenAI-compatible يدعم كل ميزة في بيئة التشغيل. دعم الأدوات، والسجل الأصلي، وصدى الاستدلال، ووضع API تُفحص عبر البيانات الوصفية وقدرات ملف تعريف النموذج.
عقد الإنهاء
خرج المزوّد لا يصبح مرجعًا حاسمًا حتى يكتمل الإنهاء. قد يُعرض النص المرئي المبثوث أثناء تنفيذ الطلب، لكن كتابة الجلسة، وتخطيط الأدوات، وتنفيذ الأدوات، وإعادة المحاولة، والمتابعة تستخدم ProviderResponse وProviderExecutionResult النهائيين.
يوحّد الإنهاء أسباب انتهاء المزوّد ضمن مجموعة بيئة التشغيل:
| سبب الإنهاء | سلوك بيئة التشغيل |
|---|---|
stop | اكتمال عادي. |
tool_calls | يمكن تخطيط استدعاءات الأدوات النهائية بعد الإنهاء. |
length | يمكن متابعة النص المرئي؛ استدعاءات الأدوات غير آمنة حتى تُعاد المحاولة. |
content_filter | الخرج المفلتر لا يُتابع نصيًا. |
incomplete | لا تُعامل الاستجابة كمكتملة إلا إذا نجح رجوع احتياطي لاحق. |
unknown | انتهى النقل دون سبب إنهاء خاص بالمزوّد. |
استدعاءات الأدوات المقتطعة بسبب الطول لا تُنفّذ أبدًا من المحاولة الأولى. تعيد بيئة التشغيل المحاولة مرة واحدة على سلسلة المسار الناجح. إذا بقيت المحاولة مقتطعة بسبب الطول مع استدعاءات أدوات، تعيد الجولة نص رفض مرئيًا حتميًا ولا تنفّذ أي أدوات.
JSON أدوات نهائي لكنه غير صالح يُعامل كخطأ في تخطيط الأدوات، لا كفشل مزوّد. أنتج المزوّد جوابًا نهائيًا، لكن بيئة التشغيل رفضت وسائط أدوات غير قابلة للاستخدام.
الميزانيات والمتابعة
تعمل جولات المزوّدين داخل ميزانيات صريحة. تتتبع الحلقة الحالية:
| الميزانية | الغرض |
|---|---|
| تكرارات المزوّد | تمنع حلقات متابعة غير محدودة بين المزوّد والأدوات. |
| استدعاءات أدوات المزوّد | تحد من حجم استدعاءات الأدوات داخل الجولة. |
| فشل الأدوات المتكرر | يوقف الفشل المتكرر للأداة نفسها وبالنتيجة نفسها. |
| وقت المزوّد الكلي | يمنع الجولة من العمل إلى أجل غير محدود. |
متابعة النص منفصلة عن إعادة محاولة استدعاءات الأدوات. إذا انتهت الاستجابة بـ length واحتوت على نص مرئي، قد تطلب بيئة التشغيل من سلسلة المسار نفسها متابعة الجواب. المتابعة مقيّدة بقيود تكرارات المزوّد ووقت التنفيذ نفسها.
تُعامل استدعاءات الأدوات داخل خرج مقتطع بسبب الطول بصرامة أكبر. تُعاد المحاولة للحصول على استجابة أدوات نهائية نظيفة قبل أن يتمكن أي مسار تنفيذ من المتابعة.
استجابات الاستدلال فقط
يمكن لبعض المزوّدين إرجاع استدلال أو بيانات مزوّد دون نص مرئي صالح للاستخدام. تتعامل بيئة التشغيل مع ذلك كمسألة تخص جولة المزوّد، لا كمحتوى عادي موجه للمستخدم.
يمكن لتعامل الاستدلال فقط أن يعيد المحاولة برسالة تمهيدية حيث يكون ذلك مناسبًا. إذا بقيت الاستجابة غير قابلة للاستخدام، تعيد بيئة التشغيل إرشادًا مرئيًا آمنًا بدل كشف حقول الاستدلال الخام أو التظاهر بأن المزوّد أجاب بشكل طبيعي.
استدلال المزوّد الخام ليس نص مساعد عاديًا. يجب ألا يصبح ذاكرة، أو مدخل تلخيص، أو نص واجهة، أو محتوى تشخيصات إلا إذا وُجد مسار محدد ومنظف لذلك.
إعادة تمرير استدعاءات الأدوات الأصلية
يمكن لـ EstaCoda حفظ جولات استدعاءات الأدوات النهائية من المزوّد وإعادة تمريرها كسجل assistant/tool أصلي للمزوّد لمسارات OpenAI-compatible Chat Completions المدعومة. يساعد ذلك النماذج التي تفكر بشكل أفضل، أو تتحقق بصرامة أعلى، عندما تُرسل لها tool_calls وردود tool السابقة بالشكل الأصلي للبروتوكول.
تُحجب إعادة التمرير الأصلية أثناء تركيب prompt:
| البوابة | القيمة المطلوبة |
|---|---|
| بيانات المزوّد | supportsNativeToolHistory === true |
| ملف تعريف النموذج | supportsTools === true |
| وضع API للمسار | openai_chat_completions |
إذا فشلت أي بوابة، يستخدم المسار سجلًا نصيًا مسطحًا. تبقى مسارات Responses مؤجلة أو مسار رجوع لإعادة التمرير الأصلية. تبقى إعادة التمرير الأصلية لـ Anthropic مؤجلة. لا توجد قاعدة مختصرة تقول إن OpenAI-compatible يعني إعادة تمرير أصلية.
دورة الحياة:
- تنتهي استجابة المزوّد.
- تُطبّع معرفات استدعاءات الأدوات المفقودة مرة واحدة باستخدام المساعد الثابت نفسه المستخدم في التخطيط.
- تُحفظ جولة استدعاءات أدوات المزوّد كرسالة جلسة
agentقبل تنفيذ الأدوات. - يستخدم تخطيط الأدوات وتنفيذها المعرفات المطبّعة نفسها.
- يختار تركيب prompt لاحقة زمنية مقيّدة بميزانية من السجل السابق.
- يحوّل باني السجل الأصلي مجموعات أدوات المزوّد الآمنة إلى رسائل مزوّد منظمة.
- يصدر serializer الخاص بـ Chat Completions مجموعة
assistant/toolكاملة ذريًا.
تعليمة المستخدم الحالية أو تعليمة المتابعة تُضاف عبر مسار prompt العادي وتبقى رسالة المزوّد النهائية. تُستبعد من اختيار السجل الأصلي.
أمان إعادة التمرير
nativeReplaySafe على مستوى الجولة. إعادة التمرير الأصلية لجولة استدعاءات أدوات المزوّد إما كاملة أو لا تحدث.
الجولات غير الآمنة لا تصدر أي tool_calls أصلية من assistant ولا أي رسائل tool أصلية مطابقة. قد تظل ممثلة عبر سجل نصي مسطح منظف أو عبر الملخصات.
تصبح الجولة غير آمنة عندما يحدث مثلًا:
- يحتوي أي استدعاء على مادة اعتماد واضحة
- يكون
argumentsTextالأمين مفقودًا أو منقحًا - يكون صدى المزوّد المطلوب مفقودًا
- يتجاوز صدى المزوّد المطلوب الحد المهيأ
- تكون المجموعة الأصلية مشوهة أو غير مكتملة
لا تُحفظ الوسائط الحاملة للأسرار بأمانة. تخزن الاستدعاءات المتأثرة argumentsRedacted: true، وتُعلّم الجولة كلها كغير آمنة. لا تعيد بيئة التشغيل تمرير النصف الذي يبدو آمنًا فقط من جولة assistant متعددة الاستدعاءات؛ يتوقع المزوّدون رسالة استدعاءات أدوات assistant وكل ردود الأدوات المطابقة كمجموعة بروتوكول واحدة.
لا تُنشأ نتائج أدوات اصطناعية عبر حفظ المزوّد أو serialization. إصلاح النتائج المفقودة المعروفة، حيث يكون مدعومًا، صريح ولا يتظاهر أبدًا بأن أداة قد نُفذت فعلًا.
الميزانية والضغط
يستخدم السجل الأصلي لاحقة زمنية مختارة بميزانية، لا شريحة ثابتة من آخر N رسائل. يعمل المحدد على رسائل الجلسة الخام السابقة قبل أي تلخيص نصي مسطح غير قابل للعكس.
الوحدات الذرية هي:
- رسائل الجلسة العادية
- مجموعات أدوات المزوّد: رسالة
agent(provider-tool-call-turn)مع رسائل نتائج الأدوات المطابقة التي تليها
تتجاوز الوحدات الأصلية المختارة الضغط الدلالي. تبقى الوحدات الأقدم غير المختارة متاحة للتلخيص أو الضغط. تُحفظ مجموعات الأدوات الكاملة كاملة أو تُضغط كاملة. لا تُقسّم الجولات متعددة الاستدعاءات. تبقى المجموعات النشطة أو غير المكتملة محمية.
قبل بناء مدخلات الضاغط الدلالي، تُزال provider replay echo، وحقول الاستدلال الخام، وأجزاء حمولة المزوّد، وبيانات بيئة التشغيل أو الجلسة غير اللازمة للضغط المنظف. يجب ألا يرى نموذج الضغط صدى استدلال المزوّد الخام.
Provider replay echo
بعض مزوّدي نمط التفكير يحتاجون إلى أن تتضمن جولات استدعاءات أدوات assistant السابقة صدى استدلال المزوّد عند إعادة تمريرها. يدعم EstaCoda ذلك عبر providerReplayEcho.
providerReplayEcho هو استدلال مزوّد خام محفوظ كحالة بروتوكول مزوّد حساسة ومستمرة. يوجد فقط لإعادة التمرير الأصلية مع المزوّد نفسه ووضع API نفسه. ليس نص واجهة، ولا نص prompt عادي، ولا ذاكرة، ولا مدخل تلخيص، ولا مادة تصدير، ولا محتوى تشخيصات، ولا سجلات.
القواعد:
- خزّن echo فقط للمسارات المؤهلة أصلًا لإعادة التمرير الأصلية والتي تحتاج echo.
- خزّن echo فقط عندما تبقى الجولة كلها
nativeReplaySafe. - قيّد echo بالحد المهيأ.
- احذف echo عند إعادة التمرير بين مزوّدين مختلفين أو بين أوضاع API مختلفة.
- أزل echo قبل مدخلات الضغط.
- echo المطلوب إذا كان مفقودًا أو زائد الحجم يعطل إعادة التمرير الأصلية لتلك الجولة إلا إذا كان مسار placeholder مختبر مفعّلًا صراحة.
قد تضع بيانات المزوّد علامة على بعض مسارات Chat Completions ذات نمط التفكير باعتبارها تحتاج reasoning_content echo. تُعامل تلك المسارات عبر فحوصات المزوّد نفسه ووضع API نفسه.
مقايضة التخزين: إذا لم تكن بيانات الجلسة الوصفية مشفرة أو خاصة، يبقى providerReplayEcho حالة محفوظة حساسة. إذا أُضيفت طبقة بيانات وصفية خاصة ومشفرة لاحقًا، يجب نقل هذا الحقل إليها.
Serialization والتطبيع
يحوّل serialization الخاص بـ OpenAI-compatible Chat Completions رسائل المزوّد المنظمة إلى رسائل طلب أصلية:
toolCallsفيassistantتصبحtool_callstoolCallIdفيtoolيصبحtool_call_id- محتوى
assistantالفارغ مع أدوات يُسلسل كـcontent: null - محتوى
assistantغير الفارغ مع أدوات يُسلسل معcontentوtool_calls
يتحقق serialization من المجموعة الأصلية كاملة قبل إصدارها. إذا كانت رسالة assistant متعددة الاستدعاءات تفتقد أي رد أداة مطابق قبل الرسالة التالية غير الأداة، تفشل المجموعة كاملة باتجاه المنع. لا يصدر serializer استدعاءات tool_calls جزئية من assistant، ولا ردود أدوات جزئية، ولا معرفات مخترعة، ولا وسائط مخترعة، ولا نتائج مخترعة، ولا stubs اصطناعية.
تُطبّع الرسائل المرسلة إلى المزوّد قبل أن تغادر بيئة التشغيل. يزيل normalizer الحقول الخاصة ببيئة التشغيل، ويحذف echo غير الآمن لإعادة التمرير، ويحافظ على شكل طلب المزوّد منفصلًا عن بيانات الجلسة الوصفية.
للمزوّدين الذين يحتاجون echo، لا يُسلسل providerReplayEcho.value المطابق والصالح إلا داخل حقل echo المهيأ، وهو حاليًا reasoning_content. حقول الاستدلال الخام خارج providerReplayEcho لا تُسلسل.
التشخيصات
تشخيصات إعادة التمرير الأصلية هي سجلات SessionEvent مستمرة:
| الحدث | الغرض |
|---|---|
structured-tool-history-selected | نجح اختيار السجل الأصلي. |
structured-tool-history-repaired | سُجلت أعداد إصلاحات الباني. |
structured-tool-history-skipped | تم تخطي إعادة التمرير الأصلية لسبب عام. |
structured-tool-history-serialized | وصل السجل الأصلي المنظم إلى سياق Chat Completions المرسل إلى المزوّد. |
الحمولات تحتوي على أعداد وأسباب عامة فقط. قد تشمل حقولًا مثل المزوّد، والنموذج، ودور المسار، وأعداد الأزواج الأصلية، وأعداد التخطي، وأعداد الإصلاح، وأعداد echo، وقيم reason enum.
يجب ألا تتضمن التشخيصات وسائط خامًا، أو نتائج أدوات، أو استدلالًا خامًا، أو قيم echo، أو حمولات مزوّد، أو محتوى رسائل، أو مسارات، أو hashes، أو بصمات محتوى، أو أجسام طلبات serialized، أو stack traces تحتوي على محتوى prompt.
الفحص والاختبارات
ملفات مفيدة:
src/providers/provider-executor.tssrc/runtime/provider-turn-loop.tssrc/providers/openai-compatible-provider.tssrc/providers/openai-responses-provider.tssrc/providers/provider-reasoning.tssrc/providers/provider-message-normalizer.tssrc/providers/provider-metadata.tssrc/prompt/prompt-assembly.tssrc/prompt/native-history-builder.tssrc/prompt/native-history-selector.tssrc/prompt/semantic-compressor.ts
تشمل الفحوصات المركزة اختبارات منفّذ المزوّد، وحلقة جولات المزوّد، وموائم OpenAI-compatible، وموائم OpenAI Responses، وبيانات المزوّد، وتركيب prompt، وباني/محدد السجل الأصلي، والضاغط الدلالي.
pnpm exec vitest run src/providers/provider-executor-route.test.ts
pnpm exec vitest run src/providers/provider-executor-fallback.test.ts
pnpm exec vitest run src/runtime/provider-turn-loop.test.ts
pnpm exec vitest run src/providers/openai-compatible-provider.test.ts
pnpm exec vitest run src/providers/openai-responses-provider.test.ts
pnpm exec vitest run src/providers/provider-metadata.test.ts
pnpm exec vitest run src/prompt/prompt-assembly.test.ts
pnpm exec vitest run src/prompt/native-history-builder.test.ts
pnpm exec vitest run src/prompt/native-history-selector.test.ts
pnpm exec vitest run src/prompt/semantic-compressor.test.ts
إذا لم تتفعّل إعادة التمرير الأصلية، افحص بيانات المسار، ودعم النموذج للأدوات، ووضع API، وسبب structured-tool-history-skipped، وما إذا كان السجل المختار يحتوي على مجموعة أدوات مزوّد آمنة وكاملة.