حوّل بطء الحجز إلى تسلسل مفهوم
في مثال الحجز دون AI Model، تستهلك النتيجة الأولى طلب HTTP واحدًا وصفر استدعاءات AI Model. ولا يحتاج اختيار الموعد عادةً إلى استعلام أو AI Model جديد ما دامت الـ Dependency صالحة. ثم يستهلك Confirmation طلب POST. تخص المقاييس كل استدعاء ونتيجته. اربط الاستدعاءات باستخدام Session ID وRequest ID لتتبّع العملية كاملة؛ مقاييس نتيجة واحدة ليست إجمالي الـ Session.
إذا تأخر رد chat()، قارن httpMs وmodelRecallMs وtoolSelectionMs وconversationMs لتعرف أي مرحلة استغرقت الوقت. إذا تكرر Semantic Recall لطلبات واضحة، حسّن البيانات الوصفية قبل تكبير الـ AI Model. وإذا سيطر HTTP على الزمن، عالج backend قبل تغيير Routing.
أضف قياسًا يجيب عن سؤال محدد
ابدأ بالحالة وTool ID ورمز الخطأ والمدة وmodelCalls وtoolCalls وretryCount، ثم أضف أحداث دورة الحياة لتفسير عطل محدد. لا تسجّل بيانات الاعتماد أو تحتفظ برسائل المستخدم كاملةً دون حاجة.
تحسب ميزانية messages عمليات Runtime الواردة، بما فيها المتابعات، وليس رسائل اللغة الطبيعية فقط. ويحسب messages_per_session عمليات الـ Session طوال عمرها. أما ai_calls وtool_calls فيحسبان العمل الفعلي، فتستهلك الإعادة وحدة tool إضافية. يعمل limiter الافتراضي لكل Session وprocess، وليس كحصة عامة لكل tenant.
اختبر ميزانيات صغيرة عمدًا. توقّع RATE_LIMITED عند استنفاد الحد خلال الفترة المحددة، وRATE_SESSION_LIMIT عند استنفاد حد الـ Session طوال عمرها. أما Response 429 من الـ API فتظهر باسم TOOL_RATE_LIMITED.
مقاييس Runtime
تتضمن كل نتيجة مقاييس مثل:
interface RuntimeMetrics {
modelCalls: number;
toolCalls: number;
inputTokens: number;
outputTokens: number;
durationMs: number;
retryCount: number;
dependencySteps: number;
routingMs: number;
lexicalRetrievalMs: number;
modelRecallMs: number;
toolSelectionMs: number;
conversationMs: number;
modelRecallCalls: number;
toolSelectionCalls: number;
conversationCalls: number;
httpMs: number;
}
تساعدك هذه المقاييس في تحديد مصدر التأخير: Lexical Retrieval، أو Semantic Recall، أو اختيار الـ Tool النهائي، أو المحادثة، أو الـ Dependencies، أو طلبات HTTP للخدمات المستقبِلة.
Hook دورة التشغيل
const runtime = await AgentRuntime.create({
configPath: "./config.yml",
onEvent(event) {
logger.info({
name: event.name,
requestId: event.requestId,
sessionId: event.sessionId,
at: event.at,
details: event.details,
});
},
});
تغطي الأحداث مراحل Routing والـ Dependencies والـ Confirmation والتنفيذ وRetry والأخطاء الأساسية. تُحجب البيانات الحساسة من hooks، وتُعزل استثناءات أدوات المراقبة عمدًا، حتى لا تحوّل عملية عمل ناجحة إلى استدعاء فاشل.
وضع Debug
debug: true
يضيف معلومات تشخيص محدودة للـ Routing والتنفيذ، مثل درجات المرشحين وأسماء الحقول المربوطة. لا يطلب الاستدلال الداخلي الخفي للـ AI Model، ويجب ألا يتضمن بيانات اعتماد.
تحديد معدل الاستخدام
يوفّر محدّد المعدل الافتراضي في الذاكرة عدّادات مستقلة لـ:
- استدعاءات AI.
- محاولات HTTP والـ Tools.
- العمليات الواردة إلى Runtime.
- إجمالي العمليات طوال عمر الـ Session.
rate_limits:
ai_calls: 60
tool_calls: 120
messages: 120
messages_per_session: 1000
window_ms: 60000
عند التوسع الأفقي، تحتاج إلى محدّد مشترك إذا أردت تطبيق الحدود على جميع workers مجتمعةً.
تشخيص circuit breaker
runtime.diagnostics()
يعيد حالة circuit breaker لكل Tool في instance الحالية. ولا تُشارك هذه الحالات تلقائيًا بين workers.