Files

Political Focus Group Simulator

Simulate a political focus group with persistent AI personas to test candidate messaging.

Architecture

┌─────────────────────────────────────────────────────────────┐
│                      FOCUS GROUP                             │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌──────────────┐                                           │
│  │  CANDIDATE   │ ──────────► Presents position             │
│  │              │ ◄────────── Asks follow-up questions      │
│  └──────────────┘                                           │
│         │                                                    │
│         ▼                                                    │
│  ┌──────────────┐  ┌──────────────┐                         │
│  │   VOTER 1    │  │   VOTER 2    │  ... (expandable)       │
│  │   (Maria)    │  │   (James)    │                         │
│  │  Independent │  │  Republican  │                         │
│  └──────────────┘  └──────────────┘                         │
│         │                  │                                 │
│         └────────┬─────────┘                                │
│                  ▼                                           │
│         ┌──────────────┐                                    │
│         │   ANALYST    │  Observes and provides insights    │
│         └──────────────┘                                    │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Quick Start

cd examples/focus-group

# Run on a specific topic
bun cli.ts "healthcare reform"

# Interactive mode (enter multiple topics)
bun cli.ts

# Check status
bun cli.ts --status

# Reset all agents
bun cli.ts --reset

Flow

  1. Candidate presents - Takes a topic and presents a specific position
  2. Voters react - Each voter responds based on their persona
  3. Candidate follows up - Asks a probing question based on reactions
  4. Voters respond - Answer the follow-up question
  5. Analyst summarizes - Provides insights and recommendations

Default Personas

Maria (Independent)

  • 34 years old, Phoenix, AZ
  • Nurse, mother of two
  • Top issues: healthcare costs, education, immigration
  • Weak party identification

James (Republican)

  • 58 years old, rural Ohio
  • Former auto worker, small business owner
  • Top issues: economy, manufacturing jobs, government spending
  • Moderate party identification, skeptical of both parties

Customizing Personas

Edit agents.ts and modify SAMPLE_PERSONAS:

export const SAMPLE_PERSONAS: VoterPersona[] = [
  {
    name: 'Sarah',
    age: 28,
    location: 'Austin, TX',
    party: 'Democrat',
    leaningStrength: 'moderate',
    topIssues: ['climate change', 'student debt', 'housing costs'],
    background: 'Software engineer, renting, worried about buying a home.',
  },
  // Add more personas...
];

Key Letta Features Demonstrated

  1. Agent Persistence - All agents remember previous sessions
  2. Multi-Agent Coordination - Candidate, voters, and analyst interact
  3. Persona Memory - Each voter maintains their identity in memory blocks
  4. Streaming Responses - See responses as they're generated

Expanding to More Voters

The architecture supports any number of voters. To add more:

  1. Add personas to SAMPLE_PERSONAS in agents.ts
  2. The FocusGroup class automatically creates agents for each persona
  3. Each new voter gets their own persistent agent

Example Session

$ bun cli.ts "raising the minimum wage"

═══ CANDIDATE PRESENTS ═══
Candidate: I support raising the minimum wage to $15/hour over three years. 
This gives businesses time to adjust while ensuring workers can afford basic 
necessities. No one working full-time should live in poverty.

═══ VOTER REACTIONS ═══
Maria: That really resonates with me. As a nurse, I see patients who can't 
afford medications because they're working two jobs just to pay rent. $15 
feels like a starting point for dignity.

James: I'm torn. My employees deserve better pay, but I'm already struggling 
with costs. Three years might help, but I worry about the businesses that 
can't absorb it. What happens to them?

═══ FOLLOW-UP QUESTION ═══
Candidate: James, if there were tax credits or support for small businesses 
during the transition, would that change how you feel about it?

═══ FOLLOW-UP RESPONSES ═══
Maria: That actually makes me more confident. If we're supporting workers 
AND small businesses, that's the kind of balanced approach I can get behind.

James: Tax credits would help. I'm still skeptical, but at least you're 
thinking about people like me. Most politicians forget we exist.

═══ ANALYST INSIGHTS ═══
Analyst: Key finding: the "three year transition" message softened James's 
opposition. Maria is already supportive but responds to fairness framing. 
James opened up when small business concerns were acknowledged directly - 
quote: "at least you're thinking about people like me."

Recommendation: Lead with the transition timeline and pair minimum wage 
with small business support. This creates permission for moderate 
Republicans to consider the position.