Person to Brief AF [](#early-preview)

August 12, 2026 · View on GitHub

Person to Brief AF Beta

Adaptive person intelligence for marketing, inbound, and outreach teams, built on AgentField

Apache 2.0 Python Tests Built with AgentField GitHub

Early Preview · APIs may change. Feedback welcome.

One-Call DX · Output · How It Works · Quick Start · Configuration

Person to Brief AF — public-professional research for marketing, inbound, and outreach

Give it only a person's name and company. Person to Brief AF resolves the right identity, decides what matters for that person, searches public professional sources in parallel, fills evidence gaps, verifies claims, and returns an organized marketing brief plus a polished PDF with clickable citations.

This is an adaptive intelligence API for inbound qualification and outreach preparation—not a chat wrapper.

Fast runs can land in around 20 seconds; deeper searches take longer. That makes the node useful upstream of time-sensitive workflows: just-in-time personalized marketing collateral, inbound lead handoff, meeting prep, live deal support, and downstream brochure or campaign generation.

One-Call DX

af call person-to-brief-af.research_person \
  --in '{"person":"Patrick Collison","context":"Stripe"}'

Prefer raw HTTP:

curl -X POST http://localhost:8080/api/v1/execute/async/person-to-brief-af.research_person \
  -H "Content-Type: application/json" \
  -d @sample_payload.json

What You Get Back

The PDF path is intentionally the first response attribute:

{
  "pdf_path": "/absolute/path/output/pdf/patrick-collison-research-brief-<timestamp>.pdf",
  "research": {
    "status": "succeeded",
    "brief": {
      "canonical_name": "Patrick Collison",
      "professional_identity": "...",
      "executive_summary": "...",
      "background": ["..."],
      "likely_priorities": ["..."],
      "recent_signals": ["..."],
      "conversation_starters": ["..."],
      "messaging_angles": ["..."],
      "cautions": ["..."]
    },
    "research_themes": ["..."],
    "sources": [{"title": "...", "url": "https://..."}],
    "confidence": "confident"
  }
}

Citation markers inside the PDF link directly to their original sources. Its source appendix prints the complete URLs, and every report links to agentfield.ai and this GitHub repository.

Open the Patrick Collison / Stripe sample brief

How It Works

Resolve → Plan → Research in parallel → Verify → Fill gaps → Synthesize → PDF

  • Identity resolution plans targeted searches and independently tries to disprove the match.
  • Ambiguous names return needs_identity_review instead of a guessed profile.
  • A planner chooses 3–5 research themes dynamically from the resolved identity and company.
  • Theme researchers run concurrently; each separately extracts, scores, and verifies claims.
  • Weak coverage can trigger one focused recursive gap search.
  • Profile, public signals, and outreach guidance are synthesized in parallel.
  • A deterministic renderer produces the cited PDF.

Every cross-reasoner call flows through the AgentField control plane, producing an observable execution DAG and verifiable workflow chain.

Quick Start

Two keys are required:

git clone https://github.com/Agent-Field/person-to-brief-af.git
cd person-to-brief-af
cp .env.example .env
# Add EXA_API_KEY and OPENROUTER_API_KEY to .env
docker compose up --build -d

Run the included Stripe CEO example:

EXEC_ID=$(curl -sS -X POST \
  http://localhost:8080/api/v1/execute/async/person-to-brief-af.research_person \
  -H 'Content-Type: application/json' \
  -d @sample_payload.json | jq -r '.execution_id')

while :; do
  RESULT=$(curl -sS "http://localhost:8080/api/v1/executions/$EXEC_ID")
  STATUS=$(echo "$RESULT" | jq -r '.status')
  case "$STATUS" in
    succeeded) echo "$RESULT" | jq '.result'; break ;;
    failed) echo "$RESULT" | jq '.'; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Open localhost:8080/ui to watch the adaptive reasoner graph execute.

Search backend: Exa is required today. Want Tavily, Brave, Serper, or another provider? Open a PR implementing the same SourceItem contract. Additional search backends are especially welcome.

Model Routing

The default is openrouter/minimax/minimax-m2.7, hard-pinned to Groq through OpenRouter with fallbacks disabled:

{"provider": {"only": ["groq"], "allow_fallbacks": False}}

An explicit per-request model overrides that routing policy.

Input

Only two values are needed:

{
  "input": {
    "person": "Full Name",
    "context": "Company"
  }
}

Optional controls: team_goal, max_themes, and model.

Configuration

VariableRequiredDefaultPurpose
EXA_API_KEYYesPublic-web search and evidence retrieval
OPENROUTER_API_KEYYesMiniMax M2.7 access through Groq
AI_MODELNoopenrouter/minimax/minimax-m2.7Default reasoning model
AGENT_NODE_IDNoperson-to-brief-afAgentField node ID
OUTPUT_RESPONSE_ROOTNoProject output/Host-visible PDF path

Responsible Scope

Person to Brief AF uses public professional information for respectful marketing preparation. It filters private contact details, home addresses, family information, health data, compensation details, and inferred sensitive traits.

Human-review time-sensitive claims before outreach, and delete reports according to your team's data-retention policy.

Development

python3 -m unittest discover -s tests -v
python3 -m py_compile main.py reasoners/*.py
docker compose config

Search-provider adapters are a good first contribution: preserve the SourceItem shape, source provenance, clickable URLs, and identity-safety behavior while adding the provider behind the search skill contract.


Built on AgentField, open infrastructure for production AI agents. See AgentField on GitHub.