AgentExecutor.execute() وFlowExecutor.execute() مقاطع تتبّع (spans) عبر TraceExporter. تتبع أسماء المقاطع وسماتها الاصطلاحات الدلالية للذكاء الاصطناعي التوليدي (GenAI) في OpenTelemetry، فتستطيع أنظمة المراقبة التي تدعم GenAI التعرّف عليها دون ربط مخصّص.
الاستقرار. اصطلاحات GenAI في حالةDevelopment(غير مستقرة). سبق أن تغيّرت أسماء السمات بين إصدارات المواصفة (مثلًا أصبحgen_ai.systemهوgen_ai.provider.name) وقد تتغير مجددًا. تتبع حزمة SDK هذه المواصفةَ كما استُرجعت بتاريخ 2026-10-01 من مستودع semantic-conventions-genai (حيث توجد الاصطلاحات الآن). ثبّت إصدار SDK لديك إذا كانت لوحات المتابعة تعتمد على هذه الأسماء.
البدء السريع
createOtelTraceExporter() من @lousho/build-ai-agent/otel (يتطلب الاعتمادية النظيرة الاختيارية @opentelemetry/api وTracerProvider مسجَّلًا). وهو ينقل نوع المقطع وحالة الخطأ إلى OpenTelemetry. راجع examples/tracing (npm run example:tracing:console، وnpm run example:tracing:otel الذي يطبع المقاييس أيضًا).
شجرة المقاطع
FlowExecutor.execute) يُنتج:
parentSpanId (تسلّم withSpan المقطع إلى دالة رد النداء الممرَّرة إليها)؛ فيصبح مقطع مسار العمل ابنًا له.
السمات
ثوابت جميع الأسماء موجودة فيsrc/execution/semconv.ts (ومصدَّرة بالأسماء GenAiAttr، GenAiOperation، GenAiMetric، ErrorAttr، FlowAttr، SdkAttr، LegacyAttr).
تشغيل الوكيل: invoke_agent {agent name}
استدعاء النموذج: chat {model} (CLIENT)
استدعاء الأداة: execute_tool {tool}
مسارات العمل
لا تعرّف مواصفة GenAI أي اصطلاح لعُقد مسارات العمل، ولذلك تستخدم مقاطع العُقد فضاء الأسماءlousho.flow.*. أما مقطع التشغيل فيستخدم اصطلاح workflow الوارد في المواصفة.
الأخطاء
المقطع الفاشل يحصل علىerror.type وعلى حالة خطأ للمقطع (ERROR في OpenTelemetry، والرسالة = رسالة الخطأ). قيمة error.type هي name الخطأ المرمي (و_OTHER عندما يُرمى شيء ليس من نوع Error). واستدعاء الأداة الذي يُرجع خطأً إلى النموذج (isError) يوسَم بـ error.type = tool_error.
المقاييس
يسجّلcreateOtelTraceExporter() أيضًا مقاييس عميل GenAI في OpenTelemetry عبر واجهة المقاييس في @opentelemetry/api، مستخدمًا MeterProvider العام (metrics.getMeter(...)) أو الخيار meter:
يستخدم كلاهما حدود الفئات (bucket boundaries) التي توصي بها المواصفة. وهما يتبعان صفحة
gen-ai-metrics من semantic-conventions v1.40 (بدرجة استقرار Development): أحدث الاصطلاحات تقسّم المدرَّج التكراري للرموز إلى عدّادات لكل نوع، وحزمة SDK هذه لا تُصدرها بعد. لا تُحتسب مقاطع الوكلاء ومسارات العمل في مقياس المدة، بل استدعاءات النموذج والأدوات داخلها فقط.
MeterProvider مسجَّل، يتجاهل العدّاد الخامل (no-op meter) في OpenTelemetry القياسات المسجَّلة. واجهة المقاييس موجودة في @opentelemetry/api، فلا يُسجَّل شيء (ولا يُحمَّل شيء) إذا لم تكن تلك الاعتمادية النظيرة الاختيارية مثبّتة. والتكلفة تقدير مستمد من جدول الأسعار (راجع registerModel)، وليست فاتورة.
محتوى الرسائل والوسائط لا يُسجَّل إلا بتفعيل صريح
الموجّهات ومخرجات النموذج ووسائط الأدوات ونتائجها بيانات حساسة وكبيرة الحجم، ولذلك لا تُسجَّل سمات المحتوىgen_ai.* افتراضيًا أبدًا. فعّلها لكل تشغيل على حدة:
captureContent). وإذا لم يُحدَّد captureContent، فإن متغير البيئة OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true (وهو الاسم الذي تورده المواصفة مثالًا) يفعّله. والقيمة الصريحة captureContent: false تغلب دائمًا.
عند تفعيله، يُسجَّل المحتوى على هيئة سلاسل JSON (وهو البديل الاحتياطي الذي تنص عليه المواصفة للمقاطع) وفق مخطط الرسائل في المواصفة:
أسماء السمات المُهمَلة
قبل اصطلاحات GenAI، كانت المقاطع تستخدم أسماء ارتجالية، وكانت أسماء المقاطعagent.run وllm.generate وtool.call. ما زالت أسماء السمات القديمة تُصدَر إلى جانب الجديدة لتستمر لوحات المتابعة القائمة في العمل، لكنها مُهمَلة وستُزال في إصدار رئيسي قادم. أما أسماء المقاطع فقد تغيّرت (إلى ما تشترطه المواصفة)؛ فحدّث الاستعلامات التي كانت تطابقها.
سمات المحتوى المُهمَلة (
input، prompt، args، result) تحتفظ بسلوكها القديم: تُسجَّل ما لم يُضبط redactContent: true. اضبط redactContent: true إذا أردت ألا يظهر أي محتوى في المقاطع إلا إذا فعّلته عبر captureContent.