Company research for sales and strategy is slow, manual, and inconsistent — an analyst can spend days assembling market position, competitors, personas, and brand signals for a single prospect. Could an orchestrated network of AI agents produce a comprehensive, consistent report in minutes, from nothing but a company name?
- Designed a research brief stage that infers 13 structured research fields from a single company name
- Fanned the brief out to seven parallel agents, each on the model best suited to its task: Gemini for market and SEO analysis, Perplexity deep-research for competitor intelligence, GPT for buyer personas, Claude for brand documentation, Grok for social signals, DeepSeek for performance data, and a dedicated agent for lateral, non-obvious signals
- Merged all agent outputs into a nine-section, fact-tagged report with deterministic section splitting
- Exposed the whole pipeline as an authenticated API: submit a job via webhook, poll a result endpoint for structured, sectioned JSON
A production research API that returns in ~20 minutes what previously took days. Per-agent retries and graceful degradation mean one flaky provider costs a single report section, not the whole run.
- n8n (orchestration)
- OpenRouter + 6 model providers
- Webhook API · header auth · job store
Why multi-model, not one model
No single model is best at everything. Deep-research models excel at competitor digging but are slow; fast models handle structured extraction cheaply; some models have distinctive strengths in social or market analysis. Routing each research dimension to the model best suited to it produced measurably better sections than any single-model version — and made the system resilient, because providers fail independently.
Hard-won lessons
The interesting engineering was in the failure modes: provider-side content filters silently rewriting entity names in prompts, web-search flags that only work on concrete model IDs, and orchestration triggers hijacked by leftover test nodes. Each one is invisible until it corrupts a run — the fix was defensive design throughout: retries on every agent, deterministic parsing, and a job store that makes every run inspectable after the fact.