Research Mode¶
Research mode replaces ad-hoc "agent does research" calls with a recorded, six-stage pipeline. A research brief (a question plus source toggles and limits) drives query planning, concurrent multi-source retrieval (internal knowledge, web, academic, code), source-credibility triage, near-duplicate deduplication, and LLM synthesis into a report whose every claim cites a retrievable source. Every run is persisted and is deterministically replayable: an identical request reproduces the same run id and swaps live retrieval for the stored items.
The implementation lives under src/synthorg/research/. See the research mode design spec for the full architecture.
Concepts¶
- Research brief: the input (question, project scope, source toggles, credibility floor, sub-query ceiling).
- Query plan: the planner's decomposition of the brief into source-targeted sub-queries.
- Retrieved item: one candidate result with a stable reference id, snippet, content hash, relevance score, and citation.
- Credibility triage: a verdict (score, authority bucket, red flags, pass/fail) that gates retention.
- Research report: the deliverable (title, summary, claims, source counts, synthesis model); each claim carries at least one citation.
- Research run: the persisted record (brief snapshot, plan, items, verdicts, report, status, cost, elapsed time).
Enablement¶
The master toggle is research.enabled (default false, restart required). When disabled, the service is not wired and the MCP handlers return 503.
Settings live in the research namespace (src/synthorg/settings/definitions/research.py); all keys are restart-required:
| Key | Type | Default | Purpose |
|---|---|---|---|
research.enabled |
bool | false |
Master switch. |
research.provider |
str | "" |
LLM provider for pipeline calls (empty uses the first registered provider). |
research.model |
str | "" |
LLM model id (must be set for research to wire). |
research.query_planner |
str | llm |
Query-planning strategy. |
research.credibility_triage |
str | hybrid |
Triage strategy (hybrid, heuristic, llm). |
research.deduplicator |
str | lexical |
Deduplication strategy (lexical, embedding). |
research.synthesizer |
str | llm |
Synthesis strategy. |
research.triage_batch_size |
int | 10 |
Items per LLM triage call (1 to 100). |
research.hybrid_prefilter_factor |
float | 0.6 |
Heuristic fraction of the credibility floor required before LLM escalation. |
research.dedup_similarity_threshold |
float | 0.85 |
Similarity threshold for near-duplicate collapse. |
research.per_query_limit |
int | 10 |
Candidate items per source per sub-query. |
Surface¶
Research mode has no REST controller; the operator surface is exclusively MCP (src/synthorg/meta/mcp/domains/research.py):
| MCP tool | Kind | Purpose |
|---|---|---|
synthorg_research_run |
write | Execute a brief; returns the full run including the cited report. |
synthorg_research_get |
read | Fetch a single run by run_id. |
synthorg_research_list |
read | List runs (recency-first), filtered by brief, project, or status. |
Worked example: a research brief¶
The synthorg_research_run tool accepts these arguments (at least one include_* must be true):
{
"question": "What are the main scaling bottlenecks in transformer-based LLM inference?",
"title": "LLM Inference Scaling Bottlenecks",
"project_id": "proj-acme-ai",
"include_knowledge": true,
"include_web": true,
"include_academic": true,
"include_code": false,
"min_credibility": 0.6,
"max_subqueries": 6
}
| Field | Type | Default | Notes |
|---|---|---|---|
question |
str | (required) | The research question (1 to 16384 chars). |
title |
str | first 120 chars of the question | Human-readable brief title. |
project_id |
str | unset | Scope knowledge retrieval to a project. |
include_knowledge |
bool | true |
Query the internal knowledge substrate. |
include_web |
bool | true |
Query web search. |
include_academic |
bool | false |
Query academic search. |
include_code |
bool | false |
Query code search. |
min_credibility |
float | 0.5 |
Credibility floor for source retention. |
max_subqueries |
int | 8 |
Ceiling on planner-emitted sub-queries (1 to 32). |
Observability¶
Research mode emits structured log events only (no WebSocket events): research.run.started, research.run.planned, research.run.retrieved, research.run.triaged, research.run.deduplicated, research.run.synthesised, and research.run.completed, plus warning-level keys for source failures, budget overruns, and invalid LLM output.