On September 1, 2026, Parallel Web Systems published How to eval web search for AI — a methodology post from @everythingmeta (MTS at Parallel) that answers a question explainx.ai readers keep hitting after OpenRouter's search benchmarks: how do you compare Exa, Parallel, Perplexity, and native model search fairly inside a real agent?
The short answer: do not score search snippets in a vacuum. Score answers from a fixed agent harness.
TL;DR — eval equation
Agent Harness + LLM + Search (+ Extract) = Answer
| Rule | Why |
|---|---|
| Hold constant | Same model, prompts, judge, turn budget |
| Swap only | Search (and Extract if applicable) provider |
| Allow multi-turn | Agents search → read → search again |
| Cap total budget | Reflect production cost, not unlimited turns |
| Grade | Final answer vs gold labels — not intermediate SERPs |
Search vs Extract vs Task API
| API | Agent use | Eval mistake |
|---|---|---|
| Search | Ranked, token-dense excerpts | Judging snippet BLEU instead of answer |
| Extract | URL → compressed content | Forgetting to wire fetch after search |
| Task | Long-horizon research jobs | Comparing to single-hop Search latency |
Parallel's public benchmarks page runs GPT-5.4-class agents with up to 20 tool calls (search_web plus web_fetch where Extract exists). Match your harness to what you ship — search-only providers (Brave, SerpAPI in their table) behave differently from Search+Extract stacks.
Building a gold set you trust
Parallel's first principle: no eval without labels you believe.
- Start from production logs — anonymized user tasks beat synthetic trivia
- Mix task shapes — factual, list, structured JSON, open research
- Timestamp freshness — include breaking-news items (WISER-Fresh style) so stale indexes fail loudly
- Verify ground truth — human sign-off or dual-label agreement
- Version the set — git-track prompts + labels; rerun when providers change
OpenRouter found search budget (allowed turns) moves scores as much as engine choice — your gold set should specify max tool calls and max USD per task.
Harness setup — isolate the search tool
Step-by-step from Parallel's guide:
- Expose one search provider as an MCP tool or function (see MCP search patterns)
- Keep Extract configured identically when the provider supports it
- Fix the LLM and system prompt — no provider-specific prompt hacks in v1
- Log every tool call, latency, token use, and final answer
- Re-run with the next provider — same harness binary, different API key
This mirrors Terminal-Bench-style harness engineering: the middleware is the experiment.
Parallel best practices (API + agent prompts)
From Search API best practices:
| Lever | Guidance |
|---|---|
objective | Natural-language research goal — Parallel cites +10–20% vs keywords-only |
search_queries | 1–3 keyword queries, 3–6 words, entity in each |
| Modes | turbo (speed), fast (default agent balance), advanced (max quality) |
| Avoid | site: and after: operators in agent-generated queries — brittle for agents |
| Both fields | Send objective and queries when the model can fill both |
Example request shape (fast mode):
curl https://api.parallel.ai/v1/search \
-H "x-api-key: $PARALLEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "fast",
"objective": "Find latest NVIDIA stock price and today'\''s move percent",
"search_queries": ["NVIDIA stock price today", "NVDA daily change"]
}'
Wire the Search Tool Definition into your agent so the model fills objective — do not substitute hand-written queries in eval unless that is your production path.
Grading — LLM judge + human audit
| Task shape | Judge tip |
|---|---|
| Factual | Exact match or normalized number/date |
| List | Set F1 on items; order may not matter |
| Structured | JSON schema validation + field-level match |
| Open research | Rubric + cite-required sources |
Use a strong judge model (Parallel's public benchmarks reference GPT-5.4 graders). Always hand-check ≥10% of successes and failures — judges miss subtle hallucinations and outdated facts.
Failure taxonomy — four buckets
Track separately in your spreadsheet:
| Bucket | Symptom | Fix lever |
|---|---|---|
| No search call | Agent answered from parametric memory | Prompt / tool-choice harness |
| Provider error | 429, 524, timeout | Retries, mode downgrade |
| Retrieval miss | Search ran; right URL never appeared | Provider, mode, objective wording |
| Synthesis failure | Good excerpts; wrong conclusion | Model, prompt, Extract step |
OpenRouter's BrowseComp data fits here: failed runs averaged more searches than successes — burning budget without fixing retrieval.
Cost, Pareto frontier, confidence intervals
Report cost per resolved task (search API + LLM tokens), not API list price alone. Plot accuracy vs cost per provider — Parallel's Search MCP benchmark claims higher accuracy at up to 50% lower total cost vs native web search on WISER blends, but your curve depends on turn budget and model.
Publish methodology:
- Gold set size and date range
- Harness version hash
- Judge model + rubric
- 95% CI on pass rate (Wilson interval works for binary tasks)
- Raw failure taxonomy counts
End-to-end eval checklist
- Gold labels verified by a human you trust
- Harness + LLM + judge fixed across providers
- Only search/extract tool swapped per run
- Multi-turn allowed within production budget cap
- Task shapes cover factual, list, structured, open research
- Log tool calls, latency, tokens, USD per task
- LLM judge + ≥10% manual audit
- Failure taxonomy tagged on every miss
- Pareto chart: accuracy vs cost per resolved task
- Confidence intervals published alongside point estimates
- Re-run when provider ships new modes (turbo/fast/advanced)
A worked search task with an inspectable answer contract
Consider a user asking whether a library supports a particular file format and which release introduced it. A usable gold label needs more than the word “yes.” Store the accepted feature name, the relevant version, and an official source that establishes the relationship. If the source does not name an introduction version, the correct answer should acknowledge that uncertainty.
Now compare agent runs. One run finds an official guide but guesses the version. Another finds the release note and supplies the supported format and introduction version. A third returns a forum answer without checking its date. These runs can all look helpful, but only the second meets the complete contract. The rubric should expose that distinction.
Keep the source snapshot or a dated reference with the label. If the official page changes, you can determine whether a previously correct answer became stale or whether the original grading was wrong. This matters for task sets that mix timeless definitions with rapidly changing product capabilities.
Separate retrieval evidence from answer quality
Store the URLs and excerpts the agent actually saw, together with its final answer. If the correct release note appeared in the tool results but the agent ignored it, the search provider may have done its job. If it never appeared, inspect query formulation and the provider's results before changing the synthesis prompt.
For tasks with citations, grade whether a source supports the specific claim near the citation. A correct-looking answer with a generic documentation homepage is weaker than one linking the release note that names the version. Citation presence and citation support are separate fields in a useful rubric.
Ask human reviewers to label uncertainty explicitly. Some tasks are genuinely ambiguous because vendors use different names for related features. Removing those tasks without recording why can make the benchmark easier than the production workload. Keep an ambiguity category so readers understand which questions the reported accuracy excludes.
Use paired comparisons rather than isolated headline scores
Run each provider on the same task set and retain per-task outcomes. The interesting cases are disagreements: tasks provider A resolves and provider B misses, or the reverse. Inspect those cases by task type rather than concluding that a small aggregate difference applies to every request.
Repeat a subset of tasks to estimate run-to-run variation. An agent may choose different queries or stop at a different point despite identical inputs. One result per task provides an initial comparison, but it does not reveal how consistently the stack resolves that task.
Keep repeated runs attached to their original task identity. Counting several repeats as unrelated questions overstates the diversity of the evaluation. Report both the number of unique tasks and the number of total runs so a reviewer can judge what the evidence covers.
Interpret cost failures honestly
Define what happens when a run hits the time, tool-call, or spending limit. A partially correct answer after exhausting the budget should not silently become a free failed request. Its consumed resources belong in the cost comparison even if the final answer fails.
For a production pilot, report latency at the user-visible boundary: request received to final usable answer. Tool latency alone excludes model reasoning, additional calls, and retry overhead. A provider with faster individual responses may still produce slower completed tasks if the agent needs more attempts.
Finally, keep the first experiment small enough to inspect manually. A carefully reviewed set of diverse tasks is more useful than a large synthetic set whose labels nobody checked. Expand after the logging and rubric can explain a failure without guesswork. That is what turns the end-to-end method into a decision you can defend.
Related on explainx.ai
- OpenRouter Web Search Benchmarks — engine vs budget
- Agent harness engineering — Terminal-Bench gains
- AI benchmarks complete guide
- RAG vs MCP — when to use live search
- Exa Snapshot: search the web as it looked on any past date — a versioned-web approach to the exact eval-leakage problem covered here
- Firecrawl keyless agent web search
- Perplexity Search API index debut
- Perplexity Mac hybrid compute — pplx-pii-masking Privacy Gate
- Max Stoiber joins OpenAI Plugin Platform — connectors layer
Primary sources: Parallel — How to eval web search for AI · Search API best practices · Parallel benchmarks · @everythingmeta (Sep 1, 2026)
Benchmark figures and mode names reflect Parallel's public docs as of September 1, 2026. Re-run evals before production provider lock-in. Follow @explainx_ai for updates.
