useChat من
@ai-sdk/react، ومقابلاتها في Vue و Svelte و Angular)، فبإمكانك الإبقاء
عليها وتشغيل وكيل Lousho خلف المسار. ثلاث دوال، مصدَّرة من
جذر الحزمة، تتولى التحويل. وهي لا تستورد شيئًا من ai، ولا تستخدم أي
وحدة node:*، وتعمل على Node و Workers وأي بيئة تشغيل مبنية على Fetch.
معالج المسار
toUIMessageStreamResponse(agent.stream(fromUIMessages(messages))).
العميل
مقابلة الأحداث
الأحداث التي لا مقابل لها في الواجهة (إعادات المحاولة، وضغط السياق، وقرارات الصلاحيات،
وحواجز الحماية، …) وأحداث الوكلاء الفرعيين لا تُمرَّر. وقيمة
finishReason
في الجزء finish هي من قيم AI SDK (stop، length، content-filter،
tool-calls، error؛ وأي قيمة أخرى، مثل awaiting-approval أو
max-steps، تصبح other).
الاستهلاك والتكلفة
يوضع الاستهلاك فيmessageMetadata الخاص بالجزء finish، فتجده في message.metadata
على رسالة المساعد المكتملة:
usage هو AgentEventUsage الخاص بالتشغيل (ويغيب إذا فشل التشغيل)؛
وloushoFinishReason هو سبب انتهاء التشغيل نفسه، دون تحويل.
الموافقات وask_question
الأداة التي تحتاج إلى موافقة، أو استدعاء ask_question، يوقفان التشغيل مؤقتًا:
ينتهي البث (finish مع loushoFinishReason: "awaiting-approval") بعد
جزء بيانات مخصَّص يعرضه useChat جزءًا من النوع
data-lousho-approval:
kind وquestion لا يحضران إلا في حالة ask_question. اعرض الجزء
بأزرارك الخاصة وأجب عنه عبر مسار الموافقات في واجهة الجلسات
(POST /chat/:sessionId/approvals/:approvalId، راجع الجلسات
والموافقات): { "approved": true } أو { "approved": false, "note": "..." }
للأداة، و{ "answer": "prod" } للسؤال. الاستجابة
هي تتمة التشغيل في صورة بث أحداث، يمكنك قراءته بالمحلِّل الذي توفره واجهات
الربط (UI bindings) أو تجاهله واستدعاء sendMessage من useChat مرة أخرى؛ أو، في
مسارك الخاص، استدعِ agent.approvals.streamResolve() /
streamAnswer() وأعد toUIMessageStreamResponse() للنتيجة،
فتُعرض التتمة في المحادثة نفسها.
تحويل الرسائل الواردة
fromUIMessages() تحوّل الأجزاء النصية إلى نص، وأجزاء الملفات من نوع image/* إلى أجزاء
صور، وأجزاء الملفات الأخرى إلى أجزاء ملفات (يصبح url الخاص بالجزء، وهو عنوان data: أو
http(s)، هو البيانات). أما أجزاء الأدوات والاستدلال والبيانات والمصادر والأجزاء
غير المعروفة فتُتجاهل، والرسائل التي تصبح فارغة تُحذف.
قد يُضاف لاحقًا مسار فرعي مخصَّص @lousho/build-ai-agent/ai-sdk-ui؛ أما الآن
فالدوال تأتي من جذر الحزمة.