6.2 KiB
Agents Reference
Every agent extends core.agents.base.BaseAgent and exposes async def run(**kwargs).
Phase 8 — Auto Client Acquisition
IntakeAgent
File: auto_client_acquisition/agents/intake.py
Captures leads from any source, normalizes them, detects duplicates.
Inputs:
payload: dict[str, Any]— raw lead datasource: LeadSource | str— where it came from
Output: Lead dataclass with:
- Normalized
contact_phone(E.164 viaphonenumbers) - Normalized
contact_email(lowercase, validated) - Detected
locale(aroren) from message text dedup_hash— SHA-256 of(email or phone) + companymetadata.is_duplicateflag
Sources supported: website, whatsapp, email, referral, linkedin, cold_outreach, manual, api.
ICPMatcherAgent
File: auto_client_acquisition/agents/icp_matcher.py
Scores leads against an Ideal Customer Profile across 5 weighted dimensions.
Weights (sum to 1.0):
- Industry: 0.25
- Size: 0.15
- Region: 0.20
- Budget: 0.20
- Pain: 0.20
Output: FitScore with per-dimension scores + overall tier (A/B/C/D) + recommendations.
Default ICP: target industries (tech, real estate, healthcare, education, logistics), GCC regions, SAR 10k–200k budget.
PainExtractorAgent
File: auto_client_acquisition/agents/pain_extractor.py
Hybrid extraction:
- Fast keyword pass (local, zero-cost) — scans AR+EN keyword dictionary
- LLM enrichment — routed to GLM for Arabic, Claude otherwise
Output: ExtractionResult with pain points, urgency 0–1, likely offer, recommended next step.
QualificationAgent
File: auto_client_acquisition/agents/qualification.py
Generates 5 BANT questions (Budget / Authority / Need / Timeline) and updates lead status.
LLM-first with bilingual fallback question sets if LLM fails.
Status advancement:
- BANT ≥ 3 →
QUALIFIED - BANT ≥ 2 →
DISCOVERY
BookingAgent
File: auto_client_acquisition/agents/booking.py
Priority order:
- Calendly — returns scheduling link (self-service)
- Google Calendar — creates event directly (if service account configured)
- Manual fallback — returns "team will contact you" message
Saudi weekend aware — skips Friday/Saturday when picking default slots.
CRMAgent
File: auto_client_acquisition/agents/crm.py
HubSpot integration:
- Upserts contact by email (handles 409 conflicts via search-then-update)
- Creates deal with stage mapped from lead status
- Associates deal ↔ contact
Uses tenacity retry with exponential backoff.
ProposalAgent
File: auto_client_acquisition/agents/proposal.py
Generates proposals via Claude (Task.PROPOSAL).
Region-aware pricing:
- Saudi Arabia →
PRICING_SA_*from settings - Other GCC →
PRICING_GCC_* - Global →
PRICING_GLOBAL_*_USD
Output: Proposal with markdown body + 30-day validity.
OutreachAgent
File: auto_client_acquisition/agents/outreach.py
Bilingual cold opener generation per channel (email, WhatsApp, LinkedIn, SMS).
Email variant includes a bilingual subject line builder.
FollowUpAgent
File: auto_client_acquisition/agents/followup.py
Cadence: [0d, 3d, 7d, 14d] by default.
- Attempts 1–2 use canned bilingual scripts.
- Attempts 3+ use LLM with prior-history context.
- Auto-pauses on terminal statuses (won/lost/disqualified).
AcquisitionPipeline
File: auto_client_acquisition/pipeline.py
Orchestrates the full funnel with per-step error isolation. Failures in any step appear in result.warnings but never abort the pipeline.
Phase 9 — Autonomous Growth
SectorIntelAgent
File: autonomous_growth/agents/sector_intel.py
Curated data for 12 Saudi sectors. Can optionally enrich with LLM research.
Methods:
run(sector, enrich_with_llm=False)— single sectorbest_opportunity()— highest (growth × AI readiness)target_sectors()— top 5
ContentCreatorAgent
File: autonomous_growth/agents/content.py
Generates articles, LinkedIn posts, case studies, newsletters, tweet threads.
Arabic content → GLM (for nuance); English content → Claude.
DistributionAgent
File: autonomous_growth/agents/distribution.py
Plans when to publish across channels using Riyadh-timezone optimal slots.
Optimal times (examples):
- LinkedIn: 8am, 12pm, 5pm
- Twitter: 9am, 1pm, 7pm
- Email: 9am
- WhatsApp broadcast: 7pm
EnrichmentAgent
File: autonomous_growth/agents/enrichment.py
Three-layer enrichment:
- Email domain → sector hints (e.g.,
aramco.com→oil_gas) - Phone country code → region
- LLM inference from company name (best-effort)
CompetitorMonitorAgent
File: autonomous_growth/agents/competitor.py
Summarizes competitor intel into: positioning, pricing hints, strengths, weaknesses, counter-moves.
MarketResearchAgent
File: autonomous_growth/agents/market_research.py
Uses Gemini (Task.RESEARCH) for source-dense research with three depth levels (quick/standard/deep).
Output includes summary + bullet points + explicit caveats section.
Prompt library
All prompts live in core/prompts/karpathy_prompts.py. Every prompt is Karpathy-style: explicit role, explicit task, explicit output format.
Registered prompts: pain_extraction, icp_reasoning, proposal_generation, content_writer, sector_analysis, qualification_questions, competitor_summary, outreach_opener, followup.
Sales scripts (canned bilingual) in core/prompts/sales_scripts.py: opener, follow_up_1, follow_up_2, demo_confirm, proposal_cover.
Extending with a new agent
# auto_client_acquisition/agents/my_agent.py
from core.agents.base import BaseAgent
class MyAgent(BaseAgent):
name = "my_agent"
async def run(self, *, foo: str, **_) -> dict:
self.log.info("running", foo=foo)
response = await self.router.run(
task=Task.REASONING,
messages=f"Process this: {foo}",
)
return {"result": response.content}
Register it in auto_client_acquisition/agents/__init__.py and optionally add to pipeline.py.