Home / Work / Research Engine

Multi-Model Company Research Engine

Seven agent nodes fanning out from one input and merging into a single report
Problem

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?

Approach
  • 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
Result

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.

Stack
  • 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.

← All work