Build a Multi-Agent Research Team · 40 min · Python · LangGraph · Anthropic Python SDK
Objective
Build the real Synthesizer node with conflict-handling and citation deduplication, then run the complete 5-agent system on a real research question.
Build
The capstone project
All 3 specialists run in parallel and produce real, cited findings. Today's Synthesizer replaces Lesson 5's stub — the one node in this whole graph that sees everything at once, and the only one that can catch specialists quietly disagreeing with each other.
Synthesis prompting: explicitly ask for conflict-handling
SYNTHESIS_PROMPT = """You are synthesizing research from 3 specialists into one report.
Research question: {question}
Web Researcher findings:
{web_findings}
Technical Analyst findings:
{technical_findings}
Market Analyst findings:
{market_findings}
Write a structured Markdown report. IMPORTANT:
- If specialists disagree on a factual point, note the disagreement explicitly
rather than silently picking one version
- Deduplicate overlapping information -- don't repeat the same fact 3 times
because 3 specialists happened to find it
- Structure: Executive Summary, then a section per relevant specialist angle,
then Sources
- Every claim should be traceable to a citation number from the inputs above
"""
The explicit instruction to surface disagreements rather than silently resolve them is the difference between a Synthesizer that's actually useful and one that just concatenates 3 reports into 1 — if the Web Researcher and Market Analyst found conflicting adoption numbers from different sources, the honest output says so, rather than confidently picking whichever number sounds more authoritative.
Silent conflict resolution is worse than no synthesis at all
A Synthesizer that picks one specialist's version of a disputed fact without flagging the disagreement produces a report that LOOKS more authoritative than any individual specialist's raw output, while actually being less trustworthy -- it's hidden the exact uncertainty a reader needs to know about. This is the multi-agent-research equivalent of Course 06's "test-driven fix loop beats trusting the model's own claim" principle: don't let synthesis quietly discard information a careful human synthesizer would have flagged.
Citation deduplication
Specialists citing the same URL independently is common, not a bug
If the Web Researcher and Technical Analyst both surfaced the same article (likely, since they're researching related sub-tasks on the same overall question), naive concatenation of their citation lists produces duplicates. Deduplicate by URL before presenting the final Sources list — a simple list(dict.fromkeys(citations)) (preserves order, removes exact duplicates) is enough for this course; a production system might also merge near-duplicate URLs (with/without tracking parameters).
Your Synthesizer produces a report where the Executive Summary states a specific adoption percentage, but that number doesn't appear anywhere in the Market Analyst's actual findings passed into the prompt. What's the most likely explanation?
This is exactly the failure mode the "every claim should be traceable to a citation number" instruction in the synthesis prompt exists to prevent — and catching it means actually checking, not assuming the instruction was followed. A useful verification habit: spot-check a few specific numbers or claims in the final report against the raw specialist findings before trusting a report you haven't read closely.
Ship it
Pick a real research question you actually want answered. Run the complete system. It takes 2-4 minutes. Read the report — actually read it, not skim it — and note anywhere it surprised you or where you'd want to dig deeper.
Ship Prompt: Share the question you gave it + 3 sentences from the report that surprised you. How does it compare to what you'd get from just asking Claude directly?