mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-18 07:19:35 +00:00
# Dealix is no longer "a platform". It is a new category: # An Autonomous Revenue Company OS that runs growth FOR Saudi businesses # as if Growth + Sales + Partnerships + Customer Success + Strategy + # Compliance + Data sat in one self-improving system. Autonomous Service Operator (16 modules) — البوت المركزي - intent_classifier: 16 supported intents (Arabic + English keywords; deterministic; no LLM) - conversation_router: route_message + handle_message — single entry point that classifies, routes to handler, recommends a bundle, builds intake + initial pipeline - session_state: 13 valid states + UUID-based sessions + audit history - intake_collector: per-intent intake question sets + parse + validation - approval_manager: Arabic approval cards (capped at 3 buttons) + decision processing (approve/edit/skip/reject including Arabic verbs) - service_orchestrator: 11-step canonical pipeline (intake→data_check→targeting→contactability→strategy→drafting→approval→execution_or_export→tracking→proof→upsell) - workflow_runner: advance + completion check - tool_action_planner: HARD-BLOCKS linkedin.scrape_profile, linkedin.auto_dm, linkedin.auto_connect, social.scrape_followers; high-risk tools require approval; draft-safe tools return draft_only; unknown tools default to approval_required - proof_pack_dispatcher: per-service Proof Pack envelope with required metrics - upsell_engine: 3 deterministic verdicts (upsell_now / iterate_first / gentle_upsell) based on csat + pipeline + meetings - whatsapp_renderer: render any card / approval / daily brief as WhatsApp draft (≤3 buttons, Arabic body, never live) - operator_memory: in-process sessions + customer_facts + preferences + audit log (production = Supabase) - service_bundles: 6 customer-facing bundles instead of 20 raw services (Growth Starter, Data to Revenue, Executive Growth OS, Partnership Growth, Local Growth OS, Full Growth Control Tower) - executive_mode: CEO command center + daily brief + revenue risks (3) + next 3 moves - client_mode: Growth Manager dashboard with 4 panels - agency_mode: multi-client roster + co-branded Proof Pack + revenue share calc Revenue Company OS (10 modules) — الذكاء عبر القنوات - event_to_card: 13 event types → Arabic decision cards (email/whatsapp/form/review/payment/risk/partner/meeting/service.completed/...) each with title_ar/summary_ar/why_now_ar/recommended_action_ar/risk_level/buttons_ar (≤3) - command_feed_engine: aggregate events for a customer + sort by risk (high first) + by_type and by_risk counts - action_graph: 14 typed edges (signal_created_opportunity → message_triggered_reply → reply_led_to_meeting → meeting_led_to_proposal → proposal_led_to_payment → ...) with what_works_for_customer scoring (outcome edges weigh more) - revenue_work_units: 19 RWU types (Salesforce-inspired): opportunity_created, draft_created, approval_collected, meeting_drafted, payment_received, risk_blocked, etc. + aggregate_work_units (counts/revenue/risks) - channel_health: cross-channel reputation snapshot (email/whatsapp/linkedin) + overall_score + channels_at_risk - opportunity_factory: turn (sector, city) into 5 opportunity cards via targeting_os.recommend_accounts + buying committee - service_factory: instantiate any service for a customer (intake + workflow + quote) - proof_ledger (revenue-tier, NOT platform_services.proof_ledger): customer-facing scoreboard with totals + summary_ar + by_type breakdown - growth_memory: anonymized cross-customer aggregates — sector_message_winrate, sector_channel_winrate, common_objections, blocked_action_reasons, successful_playbooks; best_message_for_sector + best_channel_for_sector - self_improvement_loop: weekly Arabic recommendations from real metrics (approval_rate, reply_rate, meeting_rate, blocked_actions, service_revenue) + best_service_id + next_experiment Routers (2 new) — 47 endpoints - /api/v1/operator/* (28): chat (message/decision/classify), sessions (new/transition/context/get), cards (approval/whatsapp/render), intake (questions/validate), service (start), tools (plan), proof-pack (dispatch), upsell (recommend/card), bundles (list/recommend), modes (ceo/ceo-daily-brief/ceo-risks/client/agency/agency-add-client/agency-revenue-share/agency-co-branded-proof), demos (whatsapp-daily-brief/proof-pack) - /api/v1/revenue-os/* (19): command-feed (demo/build/events-ingest), work-units (types/build/aggregate/demo), proof-ledger/demo, action-graph (edge-types/demo), channel-health (snapshot/demo), opportunity-factory (run/demo), service-factory (instantiate/demo), growth-memory/demo, self-improvement (weekly-report/demo) Tests (2 new files, 81 tests) - test_autonomous_service_operator.py: 50 tests * 8 intent classification tests (want_more_customers, has_contact_list, partnerships, whatsapp, pricing, approve, unknown fallback) * 4 conversation router (recommends correct service per intent + bundle, processes approval decisions) * 4 session lifecycle (UUID, transition validation, memory store, context build) * 4 intake (questions per intent, validation detects missing fields, complete intake passes) * 4 approval (≤3 buttons, approve/skip Arabic, unknown decision returns error) * 5 tool planner (linkedin scrape blocked, auto_dm blocked, high-risk → approval, draft-safe → draft_only, unknown → approval_required) * 4 bundles (6 total, agency → partnership_growth, local → local_growth_os, default → growth_starter) * 7 modes (CEO Arabic, daily brief 3 decisions, 3 risks, client panels, agency aggregation, revenue share calc, co-branded includes both names) * 3 WhatsApp renderer (no live send, ≤3 buttons, Arabic morning text) * 4 proof + upsell (Proof Pack draft, upsell_now for strong, iterate_first for weak, ≤3 buttons) - test_revenue_company_os.py: 31 tests * 4 event → card (email Arabic, low review high-risk, risk.blocked high, unknown → action_required) * 3 command feed (demo 8 events, sorts high-risk first, empty handling) * 4 RWUs (≥18 types, build validates, aggregate sums revenue, risks_blocked counted) * 4 action graph (≥12 edge types, validates type, demo 2 customers, what_works scoring) * 2 channel health (returns score, flags risky channel) * 2 opportunity factory (5 opps no live send, blocks unsafe in notes) * 3 service factory (instantiate known + unknown errors, demo 4 services) * 3 proof ledger (appends, rejects unknown, demo has revenue + risks) * 2 growth memory (top objections, best message per sector) * 3 self-improvement (low approval recommends fix, high blocked recommends review, returns best service) Docs (1 new + 1 updated) - AUTONOMOUS_REVENUE_COMPANY_OS.md (Arabic): 12-layer architecture + service bundles + safety + endpoints + competitive positioning - DEALIX_100_PERCENT_LAUNCH_PLAN.md: added §44 Autonomous Revenue Company OS Test results - 81/81 new tests pass - Full suite: 905 passed, 2 skipped (missing API keys, unrelated) - 0 existing tests broken Safety + integration - All 47 new endpoints: live_send_allowed=False, approval_required=True - LinkedIn scrape/auto-DM/auto-connect HARD-BLOCKED in tool_action_planner - High-risk tools (whatsapp.send_message, gmail.send, calendar.insert_event, moyasar.charge, gbp.publish_review_reply, social.publish_dm, social.publish_post) → approval_required forced - Cold WhatsApp blocked via existing contactability_matrix - Operator memory hashes nothing yet — production must wire to security_curator.trace_redactor before any persistence - 6 bundles unify the 12 productized services from Service Tower - Modes integrate platform_services + intelligence_layer + service_excellence - Action Graph + Revenue Work Units + Proof Ledger together form Dealix's Saudi Revenue Graph - Self-improvement loop reads metrics that flow from agent_observability + growth_curator Integration with everything before - Autonomous Service Operator orchestrates Service Tower, Service Excellence OS, Targeting OS, Platform Services, Intelligence Layer - Revenue Company OS reads from platform_services event_bus + intelligence_layer mission_engine + targeting_os reputation_guard - Service factory uses service_tower.get_service + build_intake_questions + quote_service - Opportunity factory uses targeting_os.recommend_accounts + map_buying_committee - Channel health uses targeting_os.calculate_channel_reputation - Tool planner integrates with platform_services.tool_gateway policies - WhatsApp renderer aligns with launch_ops button caps - Bundles map to service_tower upgrade_paths Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
380 lines
13 KiB
Python
380 lines
13 KiB
Python
"""Unit tests for the Autonomous Service Operator."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from auto_client_acquisition.autonomous_service_operator import (
|
|
OperatorMemory,
|
|
SUPPORTED_INTENTS,
|
|
add_agency_client,
|
|
build_agency_dashboard,
|
|
build_approval_card,
|
|
build_ceo_command_center,
|
|
build_client_dashboard,
|
|
build_co_branded_proof_pack,
|
|
build_executive_daily_brief,
|
|
build_intake_questions_for_intent,
|
|
build_new_session,
|
|
build_revenue_risks_summary,
|
|
build_service_pipeline,
|
|
build_session_context,
|
|
build_upsell_card,
|
|
classify_intent,
|
|
dispatch_proof_pack,
|
|
handle_message,
|
|
intent_to_service,
|
|
list_agency_revenue_share,
|
|
list_bundles,
|
|
plan_tool_action,
|
|
process_approval_decision,
|
|
recommend_bundle,
|
|
recommend_upsell_after_service,
|
|
render_approval_card_for_whatsapp,
|
|
render_card_for_whatsapp,
|
|
render_daily_brief_for_whatsapp,
|
|
transition_session,
|
|
validate_intake_completeness,
|
|
)
|
|
|
|
|
|
# ── Intent classification ────────────────────────────────────
|
|
def test_intent_want_more_customers():
|
|
out = classify_intent("أبغى عملاء أكثر لشركتي")
|
|
assert out["intent"] == "want_more_customers"
|
|
|
|
|
|
def test_intent_has_contact_list():
|
|
out = classify_intent("عندي قائمة أرقام كبيرة")
|
|
assert out["intent"] == "has_contact_list"
|
|
|
|
|
|
def test_intent_partnerships():
|
|
out = classify_intent("أبغى شراكات مع وكالات")
|
|
assert out["intent"] == "want_partnerships"
|
|
|
|
|
|
def test_intent_whatsapp_setup():
|
|
out = classify_intent("نستخدم واتساب بدون opt-in")
|
|
assert out["intent"] == "want_whatsapp_setup"
|
|
|
|
|
|
def test_intent_pricing():
|
|
out = classify_intent("بكم السعر؟")
|
|
assert out["intent"] == "ask_pricing"
|
|
|
|
|
|
def test_intent_approve():
|
|
out = classify_intent("اعتمد")
|
|
assert out["intent"] == "approve_action"
|
|
|
|
|
|
def test_intent_unknown_falls_back_to_services():
|
|
out = classify_intent("xyz random text")
|
|
assert out["intent"] == "ask_services"
|
|
|
|
|
|
def test_intent_to_service_mapping():
|
|
assert intent_to_service("want_more_customers") == "first_10_opportunities_sprint"
|
|
assert intent_to_service("has_contact_list") == "list_intelligence"
|
|
assert intent_to_service("want_partnerships") == "partner_sprint"
|
|
|
|
|
|
def test_supported_intents_count():
|
|
assert len(SUPPORTED_INTENTS) == 16
|
|
|
|
|
|
# ── Conversation router ──────────────────────────────────────
|
|
def test_handle_message_recommends_first_10_for_want_more_customers():
|
|
out = handle_message("أبغى عملاء أكثر")
|
|
assert out["service_id"] == "first_10_opportunities_sprint"
|
|
assert out["live_send_allowed"] is False
|
|
|
|
|
|
def test_handle_message_uses_agency_bundle_for_agency():
|
|
out = handle_message("أبغى شراكات", is_agency=True)
|
|
assert out["bundle_recommendation"]["recommended_bundle_id"] == "partnership_growth"
|
|
|
|
|
|
def test_handle_message_uses_data_to_revenue_when_list_provided():
|
|
out = handle_message("أبغى أستخدم قائمتي", has_contact_list=True)
|
|
assert out["bundle_recommendation"]["recommended_bundle_id"] == "data_to_revenue"
|
|
|
|
|
|
def test_handle_message_approval_processes_decision():
|
|
out = handle_message("اعتمد")
|
|
assert "decision_processed" in out
|
|
assert out["decision_processed"]["state"] == "approved"
|
|
|
|
|
|
# ── Sessions ────────────────────────────────────────────────
|
|
def test_new_session_has_uuid():
|
|
s = build_new_session(customer_id="cust_1")
|
|
assert s.session_id
|
|
assert s.state == "new"
|
|
assert s.customer_id == "cust_1"
|
|
|
|
|
|
def test_session_transition_audit_trail():
|
|
s = build_new_session()
|
|
transition_session(s, new_state="intent_classified", note="initial")
|
|
assert s.state == "intent_classified"
|
|
assert len(s.history) == 1
|
|
assert s.history[0]["from"] == "new"
|
|
|
|
|
|
def test_session_transition_unknown_raises():
|
|
s = build_new_session()
|
|
with pytest.raises(ValueError):
|
|
transition_session(s, new_state="bogus_state")
|
|
|
|
|
|
def test_operator_memory_stores_session():
|
|
mem = OperatorMemory()
|
|
s = build_new_session(customer_id="cust_1")
|
|
mem.upsert_session(s)
|
|
assert mem.get_session(s.session_id) is s
|
|
ctx = build_session_context(memory=mem, session_id=s.session_id)
|
|
assert ctx["session"]["session_id"] == s.session_id
|
|
|
|
|
|
# ── Intake ──────────────────────────────────────────────────
|
|
def test_intake_questions_for_known_intent():
|
|
out = build_intake_questions_for_intent("want_more_customers")
|
|
assert len(out["questions"]) >= 4
|
|
|
|
|
|
def test_intake_questions_unknown_intent_falls_back():
|
|
out = build_intake_questions_for_intent("totally_unknown_intent")
|
|
assert out["questions"]
|
|
|
|
|
|
def test_intake_validation_detects_missing():
|
|
out = validate_intake_completeness(
|
|
"want_more_customers",
|
|
{"sector": "training"}, # only one field
|
|
)
|
|
assert out["complete"] is False
|
|
assert "company_name" in out["missing_fields"]
|
|
|
|
|
|
def test_intake_validation_complete():
|
|
out = validate_intake_completeness(
|
|
"want_more_customers",
|
|
{"company_name": "X", "sector": "training", "city": "Riyadh",
|
|
"offer": "Pilot 7 أيام", "ideal_customer": "B2B"},
|
|
)
|
|
assert out["complete"] is True
|
|
|
|
|
|
# ── Approval manager ────────────────────────────────────────
|
|
def test_approval_card_has_three_buttons():
|
|
card = build_approval_card(
|
|
action_type="send_email", title_ar="إرسال إيميل",
|
|
summary_ar="إيميل لـ Acme",
|
|
)
|
|
assert len(card["buttons_ar"]) <= 3
|
|
assert card["live_send_allowed"] is False
|
|
|
|
|
|
def test_approval_decision_approve():
|
|
card = build_approval_card(action_type="x", title_ar="x", summary_ar="x")
|
|
out = process_approval_decision(card, decision="approve")
|
|
assert out["state"] == "approved"
|
|
assert out["next_action"] == "execute_with_audit"
|
|
|
|
|
|
def test_approval_decision_arabic_skip():
|
|
card = build_approval_card(action_type="x", title_ar="x", summary_ar="x")
|
|
out = process_approval_decision(card, decision="تخطي")
|
|
assert out["state"] == "rejected"
|
|
|
|
|
|
def test_approval_decision_unknown_returns_error():
|
|
card = build_approval_card(action_type="x", title_ar="x", summary_ar="x")
|
|
out = process_approval_decision(card, decision="bogus")
|
|
assert "error" in out
|
|
|
|
|
|
# ── Service pipeline ────────────────────────────────────────
|
|
def test_service_pipeline_starts_at_intake():
|
|
p = build_service_pipeline("first_10_opportunities_sprint")
|
|
assert p["current_step"] == "intake"
|
|
assert any(s["step_id"] == "approval" for s in p["steps"])
|
|
|
|
|
|
# ── Tool action planner ─────────────────────────────────────
|
|
def test_plan_blocks_linkedin_scrape():
|
|
out = plan_tool_action(tool="linkedin.scrape_profile")
|
|
assert out["verdict"] == "blocked"
|
|
|
|
|
|
def test_plan_blocks_linkedin_auto_dm():
|
|
out = plan_tool_action(tool="linkedin.auto_dm")
|
|
assert out["verdict"] == "blocked"
|
|
|
|
|
|
def test_plan_high_risk_requires_approval():
|
|
out = plan_tool_action(tool="whatsapp.send_message")
|
|
assert out["verdict"] == "approval_required"
|
|
assert out["live_send_allowed"] is False
|
|
|
|
|
|
def test_plan_draft_safe_returns_draft_only():
|
|
out = plan_tool_action(tool="gmail.create_draft")
|
|
assert out["verdict"] == "draft_only"
|
|
|
|
|
|
def test_plan_unknown_defaults_to_approval_required():
|
|
out = plan_tool_action(tool="bogus.tool")
|
|
assert out["verdict"] == "approval_required"
|
|
|
|
|
|
# ── Bundles ─────────────────────────────────────────────────
|
|
def test_list_bundles_returns_six():
|
|
out = list_bundles()
|
|
assert out["total"] == 6
|
|
|
|
|
|
def test_recommend_bundle_for_agency():
|
|
out = recommend_bundle(is_agency=True)
|
|
assert out["recommended_bundle_id"] == "partnership_growth"
|
|
|
|
|
|
def test_recommend_bundle_for_local_business():
|
|
out = recommend_bundle(is_local_business=True)
|
|
assert out["recommended_bundle_id"] == "local_growth_os"
|
|
|
|
|
|
def test_recommend_bundle_with_list():
|
|
out = recommend_bundle(has_contact_list=True)
|
|
assert out["recommended_bundle_id"] == "data_to_revenue"
|
|
|
|
|
|
def test_recommend_bundle_default():
|
|
out = recommend_bundle(budget_sar=500)
|
|
assert out["recommended_bundle_id"] == "growth_starter"
|
|
|
|
|
|
# ── Modes ───────────────────────────────────────────────────
|
|
def test_ceo_command_center_arabic():
|
|
out = build_ceo_command_center(company_name="Acme")
|
|
assert out["mode"] == "ceo"
|
|
assert any("" <= ch <= "ۿ" for ch in out["daily_brief"]["title_ar"])
|
|
|
|
|
|
def test_executive_daily_brief_three_decisions():
|
|
out = build_executive_daily_brief(company_name="Acme")
|
|
assert len(out["priority_decisions_ar"]) == 3
|
|
assert len(out["buttons_ar"]) <= 3
|
|
|
|
|
|
def test_revenue_risks_summary_three_risks():
|
|
out = build_revenue_risks_summary()
|
|
assert len(out["risks"]) == 3
|
|
|
|
|
|
def test_client_dashboard_has_panels():
|
|
out = build_client_dashboard(customer_id="c1", company_name="Acme")
|
|
assert out["mode"] == "client"
|
|
assert len(out["today_panels_ar"]) >= 3
|
|
|
|
|
|
def test_agency_dashboard_aggregates():
|
|
clients = [
|
|
{"client_company_name": "A", "monthly_subscription_sar": 2999,
|
|
"revenue_share_pct": 20, "status": "active"},
|
|
{"client_company_name": "B", "monthly_subscription_sar": 1500,
|
|
"revenue_share_pct": 25, "status": "onboarding"},
|
|
]
|
|
out = build_agency_dashboard(agency_id="ag1", clients=clients)
|
|
assert out["metrics"]["total_clients"] == 2
|
|
assert out["metrics"]["monthly_revenue_sar"] == 4499.0
|
|
|
|
|
|
def test_agency_revenue_share_calculation():
|
|
clients = [
|
|
{"client_company_name": "A", "monthly_subscription_sar": 2999,
|
|
"revenue_share_pct": 20},
|
|
]
|
|
out = list_agency_revenue_share(clients=clients)
|
|
assert out["total_share_sar"] == 599.8
|
|
|
|
|
|
def test_agency_add_client_appends():
|
|
clients: list = []
|
|
add_agency_client(
|
|
agency_id="ag1", client_company_name="Acme",
|
|
monthly_subscription_sar=2999, revenue_share_pct=20,
|
|
clients=clients,
|
|
)
|
|
assert len(clients) == 1
|
|
|
|
|
|
def test_co_branded_proof_pack_includes_both_names():
|
|
out = build_co_branded_proof_pack(
|
|
agency_name="Vortex", client_company_name="Acme",
|
|
)
|
|
assert out["co_branded"] is True
|
|
assert out["agency_name"] == "Vortex"
|
|
|
|
|
|
# ── WhatsApp renderer ────────────────────────────────────────
|
|
def test_render_card_for_whatsapp_no_live_send():
|
|
card = build_approval_card(
|
|
action_type="x", title_ar="فرصة", summary_ar="ملخص",
|
|
)
|
|
out = render_card_for_whatsapp(card)
|
|
assert out["live_send_allowed"] is False
|
|
assert any("" <= ch <= "ۿ" for ch in out["body_ar"])
|
|
|
|
|
|
def test_render_approval_card_has_3_buttons():
|
|
card = build_approval_card(
|
|
action_type="x", title_ar="فرصة", summary_ar="ملخص",
|
|
)
|
|
out = render_approval_card_for_whatsapp(card)
|
|
assert len(out["buttons_ar"]) == 3
|
|
|
|
|
|
def test_render_daily_brief_arabic():
|
|
brief = build_executive_daily_brief(company_name="Acme")
|
|
out = render_daily_brief_for_whatsapp(brief)
|
|
assert "صباح" in out["body_ar"]
|
|
assert out["live_send_allowed"] is False
|
|
|
|
|
|
# ── Proof + Upsell ──────────────────────────────────────────
|
|
def test_proof_pack_dispatch_returns_draft():
|
|
out = dispatch_proof_pack(
|
|
service_id="first_10_opportunities_sprint",
|
|
customer_id="c1",
|
|
)
|
|
assert out["status"] == "draft"
|
|
assert out["live_send_allowed"] is False
|
|
|
|
|
|
def test_upsell_recommends_growth_os_after_first_10():
|
|
out = recommend_upsell_after_service(
|
|
completed_service_id="first_10_opportunities_sprint",
|
|
pilot_metrics={"pipeline_sar": 30000, "meetings": 3, "csat": 9},
|
|
)
|
|
assert out["recommended_next_service_id"] == "growth_os_monthly"
|
|
assert out["verdict"] == "upsell_now"
|
|
|
|
|
|
def test_upsell_iterate_for_weak_outcome():
|
|
out = recommend_upsell_after_service(
|
|
completed_service_id="first_10_opportunities_sprint",
|
|
pilot_metrics={"pipeline_sar": 1000, "meetings": 0, "csat": 5},
|
|
)
|
|
assert out["verdict"] == "iterate_first"
|
|
|
|
|
|
def test_upsell_card_has_three_buttons():
|
|
out = build_upsell_card(
|
|
completed_service_id="first_10_opportunities_sprint",
|
|
)
|
|
assert len(out["buttons_ar"]) == 3
|
|
assert out["live_send_allowed"] is False
|