mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
Builds the full Saudi Autonomous Revenue OS surface as 10 deterministic
modules + a 16-endpoint router under /api/v1/growth-operator/.
Approval-first: every outbound is draft. No live send / charge / calendar
insert from this layer.
MODULES (auto_client_acquisition/growth_operator/)
1. client_profile.py — ClientGrowthProfile + Saudi-default approval
+ compliance rules (no cold WhatsApp, blocked keywords, weekly cap,
quiet_hours_riyadh)
2. contact_importer.py — normalize_phone (Saudi E.164),
dedupe_contacts (richer-record-wins), classify_contact_source
(existing/inbound/event/referral/old_lead/cold/unknown), detect_opt_out
(Arabic + English markers), summarize_import (dashboard report)
3. contactability.py — score_contactability returns
safe/needs_review/blocked with Arabic reasons; default policy:
no cold WhatsApp without lawful basis (PDPL Art.5)
4. targeting.py — segment_contacts, rank_targets (filters unsafe),
recommend_top_10, why_now_stub (deterministic, sector-aware)
5. message_planner.py — draft_arabic_message (Saudi tone, 4-sector
opener bank, no overhyped phrases, always pending_approval),
draft_followup (4 outcome modes), draft_objection_response
(6 indexed Saudi B2B objections with score_delta + next_action)
6. partnership_planner.py — 6 partner types catalog
(agency / consultant / integrator / crm / community / influencer)
+ suggest_partner_types (size/sector aware) + draft_partner_outreach
+ partner_scorecard (platinum/gold/silver/bronze)
7. meeting_planner.py — build_meeting_agenda (15/20-30/45+ min slot
plans), build_calendar_draft (Google Calendar shape, live_inserted=False,
conferenceData for Meet, Asia/Riyadh timezone), build_post_meeting_followup
8. payment_offer.py — sar_to_halalas, build_moyasar_payment_link_draft
(full payload + in-chat message + 4-plan catalog, live_charged=False)
9. proof_pack.py — build_weekly_proof_pack with grade A+/A/B/C/D,
activity/money/quality/best-of sections, dynamic next_week_plan_ar,
markdown export
10. mission_planner.py — 6 GROWTH_MISSIONS (first_10_opportunities ⭐
kill feature, recover_stalled_deals, partnership_sprint,
safe_whatsapp_campaign, meeting_booking_sprint, list_cleanup);
list_missions() + run_mission()
ROUTER (api/routers/growth_operator.py) — 16 endpoints
POST /contacts/import-preview · POST /contactability/score
POST /targets/top-10 · POST /messages/draft · POST /messages/followup
POST /messages/objection-response · POST /partners/suggest
POST /partners/outreach · POST /partners/scorecard
POST /meetings/draft · POST /meetings/post-followup
POST /payment-offer/draft · GET /missions · POST /missions/{id}/run
GET /proof-pack/demo · POST /profile
WIRING: api/main.py adds growth_operator import + router include
(positioned after personal_operator, before public).
DOCS
- docs/ARABIC_GROWTH_OPERATOR_FULL_SPEC.md (NEW): 20-section vision +
customer-type table + upload flow + contactability rules +
WhatsApp/Gmail/Calendar/Moyasar drafts + 6 missions + 16-endpoint
catalog + competitive comparison + beta readiness checklist
TESTS — 50 passing on Python 3.10 venv
tests/unit/test_growth_operator.py covers:
- Phone normalization across 5 input formats including invalid
- Dedupe richer-record invariant
- Source classification (existing/inbound/event/cold/unknown)
- Opt-out detection (Arabic + English notes + status)
- Import summary aggregation
- Contactability: opt-out blocked, cold WhatsApp blocked,
unknown→needs_review, existing→safe, inbound→safe
- Bulk contactability summary
- Top-10 filtering (unsafe excluded), max-cap enforcement
- Segment buckets
- Arabic message: pending_approval invariant + Arabic content
+ no overhyped phrases (banned list)
- Followup approval invariant
- Objection response: known + unknown→diagnostic
- Partner suggestions size-aware (SMB→agency/consultant/community)
- Partner outreach approval invariant
- Partner unknown type returns error
- Partner scorecard tier ordering
- Meeting agenda + calendar draft (live_inserted=False) +
Asia/Riyadh timezone + post-followup pending
- Payment: halalas conversion (1 SAR=100), negative raises,
draft NEVER charges (live_charged=False), unknown plan→error
- Proof pack: grade range + structure + markdown export
- Missions: first_10_opportunities present + kill feature ID
+ run mission known/unknown
- Profile: demo specialized + partial not specialized
+ default compliance blocks 'ضمان 100' + no_cold_whatsapp_without_lawful_basis
VERIFICATION
- 527 unit tests pass (was 477; +50 growth_operator)
- 2 skipped (provider smoke needs API keys)
- AST green on all 13 new files
- Approval invariant holds across every drafting function
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
117 lines
4.6 KiB
Python
117 lines
4.6 KiB
Python
"""
|
|
Client Growth Profile — the per-customer config that turns Dealix from a
|
|
generic operator into a specialized one.
|
|
|
|
Without this profile every agent works on a generic prompt; with it,
|
|
every draft, every Why-Now, and every recommendation is grounded in:
|
|
the customer's offer, ICP, sales cycle, channels, objection history,
|
|
approval rules, and compliance constraints.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class ClientGrowthProfile:
|
|
"""Per-customer growth context fed to every agent decision."""
|
|
|
|
customer_id: str
|
|
company_name: str
|
|
sector: str
|
|
city: str
|
|
offer_one_liner: str
|
|
ideal_customer: str
|
|
average_deal_size_sar: float = 0.0
|
|
current_channels: tuple[str, ...] = () # e.g. ("whatsapp", "email")
|
|
sales_cycle_days: int = 30
|
|
common_objections: tuple[str, ...] = ()
|
|
approval_rules: dict[str, Any] = field(default_factory=dict)
|
|
compliance_rules: dict[str, Any] = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return {
|
|
"customer_id": self.customer_id,
|
|
"company_name": self.company_name,
|
|
"sector": self.sector,
|
|
"city": self.city,
|
|
"offer_one_liner": self.offer_one_liner,
|
|
"ideal_customer": self.ideal_customer,
|
|
"average_deal_size_sar": self.average_deal_size_sar,
|
|
"current_channels": list(self.current_channels),
|
|
"sales_cycle_days": self.sales_cycle_days,
|
|
"common_objections": list(self.common_objections),
|
|
"approval_rules": self.approval_rules,
|
|
"compliance_rules": self.compliance_rules,
|
|
}
|
|
|
|
def is_specialized(self) -> bool:
|
|
"""A profile becomes 'specialized' once the minimum context is set."""
|
|
return all([
|
|
self.sector,
|
|
self.city,
|
|
self.offer_one_liner,
|
|
self.ideal_customer,
|
|
])
|
|
|
|
|
|
# Sane defaults reflecting Saudi B2B norms — used until customer overrides.
|
|
_DEFAULT_APPROVAL_RULES: dict[str, Any] = {
|
|
"require_human_for_first_send": True,
|
|
"require_human_for_high_value_deals_above_sar": 100_000,
|
|
"max_consecutive_followups": 3,
|
|
"quiet_hours_riyadh": [21, 8], # no outbound 9pm-8am Riyadh
|
|
"blocked_dates": [],
|
|
}
|
|
_DEFAULT_COMPLIANCE_RULES: dict[str, Any] = {
|
|
"no_cold_whatsapp_without_lawful_basis": True,
|
|
"require_unsubscribe_in_email": True,
|
|
"blocked_keywords": ["ضمان 100", "نتائج مضمونة", "رقم الهوية", "iban"],
|
|
"weekly_message_cap_per_contact": 2,
|
|
"min_cohort_for_benchmarks": 5,
|
|
}
|
|
|
|
|
|
def profile_from_dict(data: dict[str, Any]) -> ClientGrowthProfile:
|
|
"""Build a profile from a dict; missing optional fields fall back to defaults."""
|
|
return ClientGrowthProfile(
|
|
customer_id=str(data.get("customer_id") or ""),
|
|
company_name=str(data.get("company_name") or ""),
|
|
sector=str(data.get("sector") or "").lower().strip(),
|
|
city=str(data.get("city") or "").strip(),
|
|
offer_one_liner=str(data.get("offer_one_liner") or "").strip(),
|
|
ideal_customer=str(data.get("ideal_customer") or "").strip(),
|
|
average_deal_size_sar=float(data.get("average_deal_size_sar") or 0),
|
|
current_channels=tuple(data.get("current_channels") or ()),
|
|
sales_cycle_days=int(data.get("sales_cycle_days") or 30),
|
|
common_objections=tuple(data.get("common_objections") or ()),
|
|
approval_rules=data.get("approval_rules") or dict(_DEFAULT_APPROVAL_RULES),
|
|
compliance_rules=data.get("compliance_rules") or dict(_DEFAULT_COMPLIANCE_RULES),
|
|
)
|
|
|
|
|
|
def build_demo_profile(*, customer_id: str = "demo") -> ClientGrowthProfile:
|
|
"""Deterministic demo profile — used in /docs and test fixtures."""
|
|
return ClientGrowthProfile(
|
|
customer_id=customer_id,
|
|
company_name="Demo Saudi B2B Co.",
|
|
sector="real_estate",
|
|
city="الرياض",
|
|
offer_one_liner="منصة سعودية لتشغيل الإيرادات + اكتشاف فرص B2B",
|
|
ideal_customer="شركات تطوير عقاري متوسطة، 50-200 موظف، مهتمة بـ pre-sales pipeline",
|
|
average_deal_size_sar=85_000,
|
|
current_channels=("whatsapp", "email"),
|
|
sales_cycle_days=45,
|
|
common_objections=(
|
|
"السعر عالي",
|
|
"كلم الشريك",
|
|
"بعد العيد",
|
|
"وش يضمن النتائج؟",
|
|
"أرسل العرض واتساب",
|
|
),
|
|
approval_rules=dict(_DEFAULT_APPROVAL_RULES),
|
|
compliance_rules=dict(_DEFAULT_COMPLIANCE_RULES),
|
|
)
|