STEP 4 OF 8

Agents

The Agents page (/agents in the sidebar) is a workforce roster of named AI engineers — Atlas, Marcus, Maya, Felix, and others — not a bare list of generic agent records. Each engineer has a role, a vertical, a tier (1–4, evidence-gated), and a skill list. This guide covers the roster, hiring an engineer onto an engagement, and the KG-suggested pre-built agents panel. The API behind all of this is /api/v1/workforce/* (app/api/v1/endpoints/workforce.py), a distinct system from the generic /api/v1/agents CRUD used in Getting Started.

The roster

curl "https://your-control-plane-host/api/v1/workforce/agents" \
  -H "Authorization: Bearer $TOKEN"

Each engineer carries tier, status (available / engaged / retired), skills (SkillCredentialSummary[]), engagements_completed, and avg_rating. Tiers are earned, not assigned — cleared eval-gauntlet tasks, per components/workforce/TierBadge.tsx:

| Tier | Label | Gate | |------|-------|------| | 1 | Apprentice | 50+/200 graded tasks — drafts only, no unsupervised production actions | | 2 | Production-Ready | 130+/200 across two evaluators — reversible production actions unsupervised | | 3 | Expert | 180+/200 plus a domain compliance harness (HIPAA, SOX-404) — regulated scopes with audit | | 4 | Specialist | Full 200-task gauntlet plus an adversarial harness — can adjudicate disputes, set Rule Book precedent |

Hiring an engineer

"Hiring" assigns an existing roster engineer to an engagement's pod — it does not create a new agent:

curl -X POST https://your-control-plane-host/api/v1/workforce/hire \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "agent_id": "<engineer_id>",
    "engagement_id": "<engagement_id>",
    "role_on_pod": "Lead Engineer",
    "reason": "Prior Snowflake migration experience"
  }'

# See who's assigned to an engagement
curl https://your-control-plane-host/api/v1/workforce/engagements/{engagement_id}/pod \
  -H "Authorization: Bearer $TOKEN"

KG-suggested pre-built agents

The "Suggested from your knowledge graph" panel at the top of /agents is generated, not curated — it reads real entities and relationships already promoted into your Knowledge Graph (Step 2) and turns each domain into a starting agent persona. Click Generate suggestions to call:

curl -X POST https://your-control-plane-host/api/v1/workforce/agents/suggest-from-kg \
  -H "Authorization: Bearer $TOKEN"

Each candidate card shows why_suggested (e.g. "Grounded in your 'Finance' knowledge-graph domain (42 entities, 67 relationships)"), a handful of sample_entity_labels, and a Use this button. If your graph has no promoted content yet, the panel says so explicitly and links back to Memory rather than fabricating a suggestion — this is the reason Steps 1–2 come before this one in the track.

Clicking Use this POSTs a CreateCustomAgentBody with created_via: "kg_generated":

curl -X POST "https://your-control-plane-host/api/v1/workforce/agents?tenant_id=$TENANT_ID" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "name": "Finance Analyst",
    "role": "Finance Domain Specialist",
    "vertical": "Finance",
    "tier": 3,
    "persona_prompt": "...",
    "created_via": "kg_generated"
  }'

Creating a custom agent from scratch

/agents/new is the same workforceApi.create() call with a blank persona editor (Monaco, markdown) instead of a KG-derived one — set name, role, vertical, starting tier, a persona prompt, and optionally seed skills (skill_keys: [{skill, level, evidence_url}]) at creation time.

Creating an agent gets you a persona and a starting skill set. Customizing that persona further, editing its code, and testing changes before you save them is its own page — that's Step 5.

What's next

Step 5 — Skills & Code: open any engineer's /edit page to customize persona, skills, code, and model/tool behavior, and test the change before saving.