CASE STUDY 06 · AI

TalentScan

Sixteen specialized agents, six LLM providers, your API key.

TalentScan onboarding: choose between Google Gemini, OpenAI, Anthropic, Groq, Mistral, and Cohere with your own API key

A 16-agent AI platform for resume analysis, interview prep, career planning, and bulk screening. BYO API key — works with Google, OpenAI, Anthropic, Groq, Mistral, and Cohere.

16

specialized agents

6

LLM providers, BYO key

15+

API endpoints

2

streaming planes (WebSocket + SSE)

THE PROBLEM

Career tools built on AI are usually one prompt in a trenchcoat — paste a resume, get generic advice. Real career work decomposes into distinct tasks (gap analysis, JD matching, interview prep, salary research, bulk screening) that want different prompting, different context, and different output shapes.

Every such tool also makes you trust it with your API spend or pay its markup. Engineers already have their own keys.

WHAT I BUILT

A multi-agent system where 16 specialized agents each own one career task — resume scoring, JD gap analysis, interview question generation, career-path planning, bulk candidate screening, and more — orchestrated with typed inputs and outputs via Pydantic AI.

Fully provider-agnostic: bring your own key for Google, OpenAI, Anthropic, Groq, Mistral, or Cohere, and every agent runs against your choice. Long-running work streams progress — agent status over WebSocket, bulk screening results over SSE.

ARCHITECTURE

React SPA
  │ REST + WebSocket (agent status) + SSE (bulk)
  ▼
FastAPI
  ├─ agent orchestrator (Pydantic AI)
  │    ├─ 16 typed agents (resume, JD-match,
  │    │   interview-prep, career-path, screening…)
  │    └─ provider adapter ── Google / OpenAI /
  │        Anthropic / Groq / Mistral / Cohere
  └─ 15+ API endpoints, per-user key vault
  • Pydantic AI gives every agent a typed contract — structured inputs, validated outputs — which is what keeps 16 agents composable instead of 16 prompt spaghetti bowls.
  • The provider adapter normalizes six different APIs (auth, streaming, tool-call formats) behind one interface; agents don't know which model serves them.
  • Two streaming disciplines: WebSocket for interactive agent status (bidirectional, per-session), SSE for bulk screening (one-way firehose, resumable).

STACK — AND WHY

Pydantic AI

Typed agent contracts — validated structured output is the difference between an agent system and a prompt pile.

FastAPI

Async Python with first-class WebSocket/SSE and Pydantic integration.

React

Dashboard UI with live agent status.

6 LLM providers

BYO key removes both the trust problem and the markup problem.

THE HARD PARTS

One abstraction over six providers

Providers disagree about everything: streaming formats, token limits, JSON-mode reliability, rate-limit semantics. The adapter layer normalizes them and degrades per-provider (e.g., stricter output re-validation for models with weak JSON discipline) so agents behave consistently regardless of the key you brought.

Sixteen agents without sixteen codebases

Each agent is a typed Pydantic AI definition — system prompt, input schema, output schema, tools — registered with the orchestrator. Adding an agent is adding a definition, not a service; the WebSocket status plumbing and provider routing come free.

Bulk screening as a stream, not a batch job

Screening a folder of resumes can take minutes and burn someone else's API budget. SSE streams per-candidate results as they land, with cancellation that actually stops spend — not a spinner over a black box.

WHAT IT TAUGHT ME

  • Typed agent contracts scale; clever prompts don't. Pydantic AI's structured outputs are what made 16 agents maintainable by one person.
  • Provider abstraction is 80% error-handling — the happy paths converge, the failure modes never do.
  • Streaming progress isn't polish, it's trust: users cancel long jobs they can see and abandon ones they can't.
Visit talentscan.hire.rest← Back to the descent