الدعم
افرز تذكرة دعم إلى مسودة إجابة مسندة
أخفِ بيانات التذكرة وصنّف النية والأولوية بـChat واسترجع المقاطع المجيبة من الوثائق وافحص محادثات الحوادث العامة واترك مسودة موجهة لاعتماد بشري.
انسخ الموجّه
استبدل الحقول بين الأقواس المربعة وألصق في Claude Code أو Codex أو أي ذكاء اصطناعي يملك وصولًا إلى الطرفية. يثبّت مهارة Felo ويسأل قبل إنفاق الرصيد وينفّذ سير العمل.
صنّف تذكرة الدعم هذه واكتب مسودة رد لمراجعة بشرية: [الصق التذكرة بعد إزالة الاسم والبريد ومعرّف الحساب وبيانات الدفع وأي معلومات تعريفية أخرى]. مجال المنتج: [المنتج]. الخطة أو المنطقة: [فقط إذا لزم للإجابة]. مصدر الوثائق: [رابط مركز المساعدة أو LiveDoc short_id]. مسار الموافقة: [من يراجع]. قائمة انتظار التصعيد: [الفريق أو القناة]. أنتج: 1. النية: فئة واحدة وجملة تبرير. 2. الأولوية: عاجلة / عادية / منخفضة، مع القاعدة المطبقة. 3. الدليل: مقاطع الوثائق التي تجيب عن التذكرة، مع العنوان والصلة. 4. فحص الحادث: هل تشير التقارير العامة إلى انقطاع واسع؟ رابط وتاريخ، أو «لا إشارة عامة». 5. التوجيه: مسودة، طلب معلومات إضافية من العميل، أو تصعيد — ولماذا. 6. مسودة الرد: جملتان إلى أربع، مبنية على الأدلة فقط، مع تسمية المصدر المعتمد عليه. القواعد: - لا تضع أسماء أو بريدًا أو أرقام طلبات أو رموزًا أو بيانات دفع في استدعاءات API أو المخرجات. اعمل فقط على التذكرة المقنّعة. - أجب فقط من الوثائق المسترجعة. بلا دليل، صعّد بدلًا من التخمين. - لا تعد باسترداد أو خصم أو مواعيد أو تغيير الحساب؛ أحل هذه الحالات إلى التصعيد. - شائعات الانقطاع العامة إشارات لا أدلة. اقتبس المنشور والتاريخ. - قبل استهلاك الأرصدة، اعرض الاستدعاءات المخطط لها وانتظر موافقتي. - لا ترسل ردًا ولا تحدّث التذكرة ولا تنفّذ إجراءات على الحساب. أعد المسودة للمراجعة. - اكتب النتيجة في ./support-triage.md ولخّصها في الدردشة.
تتضمن النسخة خطوات التثبيت وقواعد الأمان أيضًا.
ما تحصل عليه
مخرجات نموذجية لتشغيل واحد. ليست توليدًا مباشرًا.
فرز — تذكرة مثال
النية
سؤال فواتير / تجديد. يسأل العميل لماذا تجددت الخطة مرة أخرى.
الأولوية
عادية. سؤال فواتير وليس انقطاعًا، والعميل غير محظور.
الأدلة
- «الأسئلة الشائعة للفواتير» — توقيت التجديد وإعادة محاولة البطاقة. الصلة: عالية.
- «تغييرات الخطة» — تخفيض بين التجديدات. الصلة: متوسطة.
فحص الحوادث
لا تقارير عامة في آخر 48 ساعة.
التوجيه
مسودة. التوثيق يغطي السؤال.
مسودة الرد
مرحبًا — تتجدد خطتك في أول كل شهر، وإذا فشلت البطاقة تُعاد المحاولة ثلاثة أيام قبل إيقاف المقعد. يمكنك تغيير البطاقة من إعدادات الفواتير؛ والأسئلة الشائعة للفواتير فيها الخطوات. إذا احتجت نقل تاريخ التجديد، ردّ وسنصعّد إلى فريق الفواتير.
ملاحظة المراجع
اعتماد أو تحرير أو تصعيد إلى طابور الفواتير.
الاستدعاءات الدقيقة
للمطورين: سير العمل نفسه ككود، بترتيب التنفيذ.
عرض استدعاءات API الفعلية
أخفِ وصنّف
أزل بالكود البريد والهاتف ورقم الطلب ثم استخدم Chat للنية والأولوية.
triage.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } const redact = (text: string) => text .replace(/[\w.+-]+@[\w.-]+\.\w+/g, "[email]") .replace(/\b(?:acct|account|order|invoice)[-_ ]?\w+\b/gi, "[id]") .replace(/\b(?:\d[ -]?){13,19}\b/g, "[card]"); type Ticket = { id: string; product: string; subject: string; body: string; plan?: string; sensitive?: boolean; }; const ticket: Ticket = { id: "T-1042", product: "Acme Workspace", subject: "Why did my plan renew?", body: "I was charged again and cannot find the renewal date on my account.", plan: "team", }; const summary = redact(`${ticket.subject}\n\n${ticket.body}`).slice(0, 1500); type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const triage = await felo<ChatData>("/v2/chat", { query: `Classify this support question by intent and priority, and list what is missing:\n\n${summary}`, }); console.log(triage.data.answer);مخرجات نموذجية
{ "answer": "Intent: billing / renewal question. Priority: normal. Missing: the renewal date the customer expects.", "resources": [ { "link": "https://example.com/billing-faq", "title": "Billing FAQ", "snippet": "…" } ] }استرجع أدلة الوثائق
ابحث المقاطع ذات الصلة في LiveDoc الدعم مع حفظ العناوين والدرجات.
triage.ts type Hit = { title: string; content: string; score: number }; const KB = process.env.SUPPORT_LIVEDOC_ID!; // the help-center LiveDoc short_id const retrieved = await felo<{ data: Hit[] }>( `/v2/livedocs/${KB}/resources/retrieve`, { query: summary }, ); const hits = retrieved.data.filter((hit) => hit.score >= 0.7).slice(0, 4); if (hits.length === 0) { console.log("No grounded evidence: escalate instead of drafting"); }مخرجات نموذجية
[ { "title": "Billing FAQ", "content": "Your plan renews on the first of the month; a failed card retries for three days…", "score": 0.91 } ]افحص الحادث العام
ابحث على X المنتج وكلمات مثل «انقطاع/غير متصل» خلال 48 ساعة كإشارة عامة فقط.
triage.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; url: string; }[]; }; }; const since = Math.floor((Date.now() - 48 * 60 * 60 * 1000) / 1000); const incident = await felo<XData>("/v2/x/tweet/search", { query: `"${ticket.product}" (outage OR "not working" OR error)`, limit: 20, since_time: since, }); const reports = incident.data.tweets.map((post) => ({ text: post.content, handle: post.author.username, at: post.created_at.slice(0, 10), link: post.url, }));مخرجات نموذجية
[ { "text": "Workspace login is failing for my whole team.", "handle": "example_user", "at": "2026-10-30", "link": "https://x.com/example_user/status/..." } ]حدد المسار وركّب الإجابة
القواعد تحدد الصف؛ ضمّ الأدلة والخطوة التالية والمسودة.
triage.ts type Route = "draft" | "ask-customer" | "escalate"; function decideRoute(): { route: Route; reason: string } { if (hits.length === 0) { return { route: "escalate", reason: "no grounded evidence in the knowledge base" }; } if (ticket.sensitive) { return { route: "escalate", reason: "an account or billing action is requested" }; } if (reports.length >= 3) { return { route: "escalate", reason: "public reports suggest a wider issue" }; } if (!ticket.plan) { return { route: "ask-customer", reason: "the plan is needed to answer the question" }; } return { route: "draft", reason: "the documentation covers the question" }; } const decision = decideRoute(); const packet = [ `# Triage — ${ticket.id}`, "", `Route: ${decision.route} (${decision.reason})`, "", "## Intent and priority", triage.data.answer, "", "## Evidence", ...hits.map((hit) => `- ${hit.title} (score ${hit.score})`), "", "## Public signal", ...(reports.length ? reports.map((report) => `- @${report.handle} (${report.at}): ${report.text} — ${report.link}`) : ["No public reports in the last 48 hours."]), "", "## Reply draft", "[Written by the host Agent from the evidence above — human review required]", ].join("\n"); console.log(packet);مخرجات نموذجية
# Triage — T-1042 Route: draft (the documentation covers the question) ## Intent and priority Intent: billing / renewal question. Priority: normal. ## Evidence - Billing FAQ (score 0.91)
سجّل الفرز
اكتب النتيجة في LiveDoc للمراجعة والتدقيق.
triage.ts type LiveDocData = { data: { short_id: string } }; const log = await felo<LiveDocData>("/v2/livedocs", { name: "Support triage log", description: "One document resource per triaged ticket", }); await felo(`/v2/livedocs/${log.data.short_id}/resources/doc`, { title: `Triage — ${ticket.id}`, content: packet, }); console.log(log.data.short_id); // reuse it for the next ticketمخرجات نموذجية
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
ما يتضمنه
- النية والأولوية بعد الإخفاء
- أدلة الوثائق بالدرجات
- فحص الحادث العام
- مسودة إجابة موجهة
- LiveDoc بسجل الفرز
ما لا يفعله
- لا يرسل إجابة ولا يغلق التذكرة ولا ينفذ إجراءات حساب
- لا ترسل كلمات مرور أو بيانات دفع أو بيانات عميل كاملة إلى API
- دون نتيجة وثائق فالتصعيد إلزامي
- X إشارة حادث عام لا حالة نظام الدعم
- قواعد الأولوية لك والنموذج يقترح فقط
أسئلة
أي بيانات تذكرة يمكن إرسالها؟
السياق اللازم فقط بعد الإخفاء: المنتج والوصف والخطة والمنطقة. بلا كلمات مرور أو دفع أو عنوان كامل أو محادثة خاصة.
من أين الإجابة؟
من المقاطع المسترجعة في LiveDoc الوثائق. دون نتائج يصعّد سير العمل بدل التخمين.
هل يجيب أو يغلق التذكرة؟
لا. ينشئ مسودة ومسارًا فقط؛ الإرسال والإغلاق يقوم به شخص أو نظامك.
كيف تحدد الأولوية؟
بقواعدك؛ يقترح النموذج ويبرر ويؤكد المسار الأولوية النهائية.
إن لم تغطِّ الوثائق؟
تصعيد إلى الصف البشري مع «غير مغطى» في حزمة الفرز.
كم تكلفة فرز واحد؟
يُحتسب Chat والبحث وX Search حسب الاستخدام؛ الأسعار الحالية في صفحة الأسعار ويطلب الموجّه الموافقة قبل الإنفاق.
سير عمل مرتبط
أجب عن أسئلة الدعم من وثائقك
أنشئ LiveDoc وحمّل مركز المساعدة ودليل التشغيل الداخلي واسترجع المقاطع التي تجيب التذكرة ودع النموذج يجيب من تلك الأدلة فقط.
افتح سير العملالمحتوىحوّل المحادثات الاجتماعية إلى موجز استماع أسبوعي
ابحث منشورات X هذا الأسبوع عن العلامة والمنافسين وأضف سياق ويب بمصادر واقرأ الصفحات خلفه وأرشِف كل إصدار ليبدأ الأسبوع التالي من المعلوم.
افتح سير العملالبحثحوّل سؤالًا واحدًا إلى موجز بحث بمصادر
اسأل الويب واحفظ الصفحات خلف الإجابة بصيغة Markdown وأضف ما يقوله الممارسون على X واحتفظ بالأدلة في LiveDoc يمكن البحث فيه لاحقًا.
افتح سير العملاجعله مناسبًا لك
الوصفة نفسها، معدّلة بحسب طريقة تسليمك الفعلية.
تصنيف فقط
بلا إجابة: النية والأولوية والصف المقترح فقط.
اربط بنظام التذاكر
بـwebhook من جانبك اكتب الحزمة في التذكرة دون إرسال تلقائي.
وسّع إلى قاعدة المعرفة
عند وجود نتيجة وثائق انتقل إلى سير عمل قاعدة المعرفة لإجابة أكمل.
واصل
صفحات المراجع خلف هذه الوصفة والخطوات التالية.