mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
feat: Add Email AI Brain — inbound classification + outbound campaigns
Email brain with Arabic templates: - handle_inbound: classify (support/sales/partnership/complaint) - generate_outreach: cold intro, follow-up, demo invite, proposal - generate_nurture_sequence: 5-email Arabic drip campaign - 8 Arabic email templates - Connected to DealixKnowledge for pricing/features/competitors https://claude.ai/code/session_01LsnvBa7HwF5hs99VZbgLGj
This commit is contained in:
parent
89aecf3458
commit
8b6bffbb85
232
salesflow-saas/backend/app/services/email_brain.py
Normal file
232
salesflow-saas/backend/app/services/email_brain.py
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
"""
|
||||||
|
Email AI Brain — Dealix AI Revenue OS
|
||||||
|
Handles inbound email classification, outreach generation, and nurture sequences.
|
||||||
|
Arabic-first with full bilingual support.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class EmailIntent(str, Enum):
|
||||||
|
INQUIRY = "inquiry"
|
||||||
|
SUPPORT = "support"
|
||||||
|
COMPLAINT = "complaint"
|
||||||
|
PARTNERSHIP = "partnership"
|
||||||
|
UNSUBSCRIBE = "unsubscribe"
|
||||||
|
REPLY = "reply"
|
||||||
|
SPAM = "spam"
|
||||||
|
GENERAL = "general"
|
||||||
|
|
||||||
|
|
||||||
|
class EmailDraft(BaseModel):
|
||||||
|
subject: str
|
||||||
|
body: str
|
||||||
|
language: str = "ar"
|
||||||
|
campaign_type: str = ""
|
||||||
|
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||||
|
|
||||||
|
|
||||||
|
INTENT_SIGNALS = {
|
||||||
|
"inquiry": ["أبي أعرف", "استفسار", "سعر", "باقة", "pricing", "interested", "demo"],
|
||||||
|
"support": ["مشكلة", "مساعدة", "خطأ", "bug", "help", "not working", "error"],
|
||||||
|
"complaint": ["شكوى", "زعلان", "سيء", "complaint", "terrible", "disappointed"],
|
||||||
|
"partnership": ["شراكة", "تعاون", "partner", "collaboration", "reseller"],
|
||||||
|
"unsubscribe": ["إلغاء", "unsubscribe", "أوقف", "remove", "stop"],
|
||||||
|
}
|
||||||
|
|
||||||
|
ARABIC_TEMPLATES = {
|
||||||
|
"cold_intro": EmailDraft(
|
||||||
|
subject="Dealix — نظام المبيعات الذكي للسوق السعودي",
|
||||||
|
body=(
|
||||||
|
"السلام عليكم {name}،\n\n"
|
||||||
|
"أنا {sender_name} من فريق Dealix.\n\n"
|
||||||
|
"لاحظنا أن {company} تعمل في قطاع {sector} — وهو بالضبط القطاع اللي نخدمه.\n\n"
|
||||||
|
"Dealix نظام مبيعات ذكي مصمم للسعودية: واتساب مدمج، ذكاء اصطناعي يفهم عربي، "
|
||||||
|
"وحماية بيانات PDPL.\n\n"
|
||||||
|
"تبي نعطيك عرض سريع ١٥ دقيقة؟\n\n"
|
||||||
|
"مع التحية،\n{sender_name}\nفريق Dealix"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"follow_up_1": EmailDraft(
|
||||||
|
subject="متابعة — هل شفت رسالتنا الأولى؟",
|
||||||
|
body=(
|
||||||
|
"أهلاً {name}،\n\n"
|
||||||
|
"أرسلت لك قبل كم يوم عن Dealix. حبيت أتابع معك.\n\n"
|
||||||
|
"عملاؤنا في {sector} حققوا:\n"
|
||||||
|
"• زيادة ٤٠٪ في معدل الإغلاق\n"
|
||||||
|
"• توفير ١٠ ساعات أسبوعياً\n"
|
||||||
|
"• تحسين متابعة العملاء ١٠٠٪\n\n"
|
||||||
|
"تقدر تجرب مجاناً ١٤ يوم بدون بطاقة.\n\n"
|
||||||
|
"مع التحية،\n{sender_name}"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"follow_up_2": EmailDraft(
|
||||||
|
subject="آخر متابعة — فرصة مجانية لتجربة Dealix",
|
||||||
|
body=(
|
||||||
|
"أهلاً {name}،\n\n"
|
||||||
|
"أعرف إنك مشغول. بس حبيت أذكرك إن التجربة المجانية متاحة.\n\n"
|
||||||
|
"رابط التسجيل: dealix.sa/trial\n"
|
||||||
|
"يأخذ أقل من دقيقة.\n\n"
|
||||||
|
"لو ما يناسبك الوقت الحين، رد بـ 'لاحقاً' وبأتواصل معك الشهر الجاي.\n\n"
|
||||||
|
"مع التحية،\n{sender_name}"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"demo_invite": EmailDraft(
|
||||||
|
subject="موعد العرض التوضيحي لـ Dealix",
|
||||||
|
body=(
|
||||||
|
"أهلاً {name}،\n\n"
|
||||||
|
"شكراً لاهتمامك بـ Dealix! 🎉\n\n"
|
||||||
|
"حجزنا لك عرض توضيحي:\n"
|
||||||
|
"📅 {demo_date}\n⏰ {demo_time}\n🔗 {demo_link}\n\n"
|
||||||
|
"العرض يستغرق ١٥ دقيقة ويغطي:\n"
|
||||||
|
"• إدارة العملاء عبر الواتساب\n"
|
||||||
|
"• تقييم العملاء بالذكاء الاصطناعي\n"
|
||||||
|
"• عروض الأسعار التلقائية\n\n"
|
||||||
|
"نتطلع لمقابلتك!\n{sender_name}"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"proposal": EmailDraft(
|
||||||
|
subject="عرض Dealix المخصص لـ {company}",
|
||||||
|
body=(
|
||||||
|
"أستاذ/ة {name}،\n\n"
|
||||||
|
"بناءً على محادثتنا، حضّرنا لكم عرض مخصص:\n\n"
|
||||||
|
"الباقة: {plan_name}\nالسعر: {price} ر.س/شهر\n"
|
||||||
|
"عدد المستخدمين: {users}\n\n"
|
||||||
|
"المميزات المشمولة:\n{features}\n\n"
|
||||||
|
"العرض صالح لمدة ٧ أيام.\n"
|
||||||
|
"للموافقة: {approval_link}\n\n"
|
||||||
|
"مع التحية،\n{sender_name}"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"welcome": EmailDraft(
|
||||||
|
subject="مرحباً بك في Dealix! 🎉",
|
||||||
|
body=(
|
||||||
|
"أهلاً {name}،\n\n"
|
||||||
|
"مبروك! حسابك جاهز على Dealix.\n\n"
|
||||||
|
"خطواتك الأولى:\n"
|
||||||
|
"١. ادخل: dealix.sa/dashboard\n"
|
||||||
|
"٢. أضف أول عميل\n"
|
||||||
|
"٣. ربط الواتساب\n"
|
||||||
|
"٤. أرسل أول رسالة ذكية\n\n"
|
||||||
|
"لو تحتاج مساعدة، كلمنا واتساب أو إيميل support@dealix.sa.\n\n"
|
||||||
|
"يلا نبدأ! 🚀\nفريق Dealix"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"commission_report": EmailDraft(
|
||||||
|
subject="تقرير عمولاتك الأسبوعي — {period}",
|
||||||
|
body=(
|
||||||
|
"أهلاً {name}،\n\n"
|
||||||
|
"هذا تقرير عمولاتك لهذا الأسبوع:\n\n"
|
||||||
|
"💰 إجمالي العمولة: {total_commission} ر.س\n"
|
||||||
|
"👥 عملاء جدد: {new_clients}\n"
|
||||||
|
"📈 مستواك: {tier}\n"
|
||||||
|
"📊 ترتيبك: #{rank}\n\n"
|
||||||
|
"تفاصيل كاملة: dealix.sa/dashboard/commissions\n\n"
|
||||||
|
"استمر! 🌟\nفريق Dealix"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"partnership_intro": EmailDraft(
|
||||||
|
subject="فرصة شراكة مع Dealix — {partnership_type}",
|
||||||
|
body=(
|
||||||
|
"السلام عليكم {name}،\n\n"
|
||||||
|
"نحن في Dealix نبحث عن شركاء استراتيجيين في {sector}.\n\n"
|
||||||
|
"نقدم:\n"
|
||||||
|
"• عمولات تنافسية تبدأ من ١٥٪\n"
|
||||||
|
"• دعم تقني ومبيعاتي كامل\n"
|
||||||
|
"• لوحة تحكم شريك مخصصة\n"
|
||||||
|
"• مواد تسويقية جاهزة\n\n"
|
||||||
|
"هل عندك وقت لمكالمة ١٥ دقيقة هذا الأسبوع؟\n\n"
|
||||||
|
"مع التحية،\n{sender_name}\nمدير الشراكات — Dealix"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class EmailBrain:
|
||||||
|
"""Central brain for Dealix email — classifies inbound and generates outreach."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
from app.services.whatsapp_knowledge import DealixKnowledge
|
||||||
|
self.knowledge = DealixKnowledge
|
||||||
|
|
||||||
|
def _detect_intent(self, subject: str, body: str) -> EmailIntent:
|
||||||
|
combined = f"{subject} {body}".lower()
|
||||||
|
for intent, keywords in INTENT_SIGNALS.items():
|
||||||
|
if any(kw in combined for kw in keywords):
|
||||||
|
return EmailIntent(intent)
|
||||||
|
return EmailIntent.GENERAL
|
||||||
|
|
||||||
|
async def handle_inbound(
|
||||||
|
self, email_from: str, subject: str, body: str, db: Any = None
|
||||||
|
) -> EmailDraft:
|
||||||
|
intent = self._detect_intent(subject, body)
|
||||||
|
logger.info(f"[EmailBrain] inbound from={email_from} intent={intent.value}")
|
||||||
|
|
||||||
|
if intent == EmailIntent.UNSUBSCRIBE:
|
||||||
|
return EmailDraft(
|
||||||
|
subject="تأكيد إلغاء الاشتراك",
|
||||||
|
body=f"أهلاً،\n\nتم إلغاء اشتراكك في رسائل Dealix البريدية.\nلو غيّرت رأيك، تقدر تشترك مرة ثانية من dealix.sa.\n\nمع التحية،\nفريق Dealix",
|
||||||
|
)
|
||||||
|
if intent == EmailIntent.COMPLAINT:
|
||||||
|
return EmailDraft(
|
||||||
|
subject="استلمنا شكواك — سنتابع فوراً",
|
||||||
|
body=f"أهلاً،\n\nشكراً لتواصلك. نعتذر عن أي إزعاج.\nفريقنا سيتابع شكواك خلال ٤ ساعات عمل.\nرقم التذكرة: TKT-{datetime.now(timezone.utc).strftime('%Y%m%d%H%M')}\n\nمع التحية،\nفريق دعم Dealix",
|
||||||
|
)
|
||||||
|
if intent == EmailIntent.INQUIRY:
|
||||||
|
pricing = self.knowledge.get_pricing_text("ar")
|
||||||
|
return EmailDraft(
|
||||||
|
subject="مرحباً — هذي تفاصيل Dealix",
|
||||||
|
body=f"أهلاً،\n\nشكراً لاهتمامك بـ Dealix!\n\nالباقات المتاحة:\n{pricing}\n\nكل الباقات فيها تجربة مجانية ١٤ يوم.\nتبي نحجز لك عرض توضيحي؟\n\nمع التحية،\nفريق Dealix",
|
||||||
|
)
|
||||||
|
if intent == EmailIntent.PARTNERSHIP:
|
||||||
|
return EmailDraft(
|
||||||
|
subject="شكراً لاهتمامك بالشراكة مع Dealix",
|
||||||
|
body="أهلاً،\n\nشكراً لتواصلك بخصوص الشراكة.\nفريق الشراكات سيتواصل معك خلال ٢٤ ساعة لمناقشة الفرص.\n\nمع التحية،\nفريق Dealix",
|
||||||
|
)
|
||||||
|
return EmailDraft(
|
||||||
|
subject="شكراً لتواصلك مع Dealix",
|
||||||
|
body="أهلاً،\n\nشكراً لرسالتك! فريقنا سيرد عليك قريباً.\nلو تحتاج رد أسرع، كلمنا واتساب: +966XXXXXXXXX\n\nمع التحية،\nفريق Dealix",
|
||||||
|
)
|
||||||
|
|
||||||
|
async def generate_outreach(
|
||||||
|
self, lead: dict, campaign_type: str = "cold_intro", language: str = "ar"
|
||||||
|
) -> EmailDraft:
|
||||||
|
template = ARABIC_TEMPLATES.get(campaign_type, ARABIC_TEMPLATES["cold_intro"])
|
||||||
|
filled_subject = template.subject.format(**{k: lead.get(k, "") for k in ["name", "company", "sector", "partnership_type", "period", "plan_name"]}, **{"default": ""})
|
||||||
|
filled_body = template.body
|
||||||
|
for key, val in lead.items():
|
||||||
|
filled_body = filled_body.replace("{" + key + "}", str(val))
|
||||||
|
return EmailDraft(subject=filled_subject, body=filled_body, language=language, campaign_type=campaign_type)
|
||||||
|
|
||||||
|
async def generate_nurture_sequence(self, lead: dict, db: Any = None) -> list[EmailDraft]:
|
||||||
|
name = lead.get("name", "")
|
||||||
|
company = lead.get("company", "")
|
||||||
|
sector = lead.get("sector", "")
|
||||||
|
sender = lead.get("sender_name", "فريق Dealix")
|
||||||
|
base_data = {"name": name, "company": company, "sector": sector, "sender_name": sender}
|
||||||
|
|
||||||
|
sequence_keys = ["cold_intro", "follow_up_1", "follow_up_2", "demo_invite", "proposal"]
|
||||||
|
result = []
|
||||||
|
for key in sequence_keys:
|
||||||
|
tmpl = ARABIC_TEMPLATES[key]
|
||||||
|
body = tmpl.body
|
||||||
|
for k, v in base_data.items():
|
||||||
|
body = body.replace("{" + k + "}", v)
|
||||||
|
result.append(EmailDraft(subject=tmpl.subject.format(**{**base_data, "default": ""}), body=body, campaign_type=key))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_template(self, template_name: str) -> Optional[EmailDraft]:
|
||||||
|
return ARABIC_TEMPLATES.get(template_name)
|
||||||
|
|
||||||
|
def list_templates(self) -> list[str]:
|
||||||
|
return list(ARABIC_TEMPLATES.keys())
|
||||||
|
|
||||||
|
|
||||||
|
# Global singleton
|
||||||
|
email_brain = EmailBrain()
|
||||||
Loading…
Reference in New Issue
Block a user