CLI Reference
Complete reference for all deep-research-client commands.
Global Options
--verbose, -v Increase verbosity (-v, -vv, -vvv)
--help Show help and exit
Commands
research
Perform deep research on a query.
deep-research-client research [OPTIONS] [QUERY]
Arguments
| Argument | Description |
|---|---|
QUERY |
Research query or question (not needed if using --template) |
Options
| Option | Description |
|---|---|
--provider TEXT |
Provider to use. --help names every registered provider, derived from the registry rather than restated here |
--model TEXT |
Model to use (overrides provider default) |
--fallback |
If the chosen provider cannot do the work, try the other configured providers instead, in registration order (off by default) |
--fallback-provider TEXT |
Provider to fall back to, in preference order (repeatable); implies --fallback |
--output PATH |
Output file path (prints to stdout if not provided) |
--no-cache |
Disable caching for this query |
--separate-citations PATH |
Save citations to separate file |
--cache-dir PATH |
Override cache directory (default: ~/.deep_research_cache) |
--template PATH |
Template file with variable placeholders |
--var TEXT |
Template variable as key=value (repeatable) |
--param TEXT |
Provider-specific parameter as key=value (repeatable) |
--base-url TEXT |
Custom base URL for API endpoint |
--use-cborg |
Use CBORG proxy (api.cborg.lbl.gov) |
--api-key-env TEXT |
Environment variable name for API key |
--title TEXT |
Title for the research report |
--abstract TEXT |
Abstract or summary for the research |
--keyword TEXT |
Keyword/tag for the research (repeatable) |
--author TEXT |
Primary author of the research |
--contributor TEXT |
Contributor to the research (repeatable) |
--validate-references |
Resolve every cited identifier and append a validation section |
--validation-cache-dir PATH |
Directory for cached reference lookups (default: ./references_cache) |
--validation-email TEXT |
Contact email for the NCBI Entrez API (defaults to $NCBI_EMAIL) |
--validation-full-text |
Fetch full text as well as abstracts when validating (~23x slower) |
--validation-max-references INT |
Stop after validating this many references |
--validation-skip-prefix TEXT |
Identifier prefix to report as unverifiable rather than resolving (repeatable) |
--validation-rate-limit-delay FLOAT |
Seconds to wait between lookups (default: 0.5) |
--validation-relevance / --validation-no-relevance |
Weigh each resolved reference against the report's own vocabulary, flagging citations that exist but look off topic (default: on, costs no extra lookups) |
--validate-terms |
Resolve every cited ontology CURIE, check it against the label the report gave it, and append a validation section |
--term-adapter TEXT |
OAK adapter to resolve terms through (default: ols:; sqlite:obo: for bulk work) |
--term-oak-config PATH |
oak_config.yaml mapping prefixes to adapters, for ontologies the default adapter does not serve |
--term-cache-dir PATH |
Directory for cached term labels (default: ./terms_cache) |
--term-offline |
Resolve terms only from the label cache, never reaching the network |
--term-max-terms INT |
Stop after validating this many ontology terms |
--term-skip-prefix TEXT |
CURIE prefix to report as unverifiable rather than resolving (repeatable) |
--term-labels / --no-term-labels |
Compare the label written beside each CURIE with the term's own label (default: on, costs no extra lookups) |
--fail-on-unresolved |
Exit with code 2 if any reference, quote or ontology term fails validation |
When --output is provided, any non-text artifacts recovered with the report are written beside it in an OUTPUT_STEM_artifacts/ directory and linked from the generated markdown.
The --validate-* options require the optional validation extra; see validate-references and the Validate References how-to. Validation runs after the report has been written or printed, so a lookup service being unreachable never costs you the research result; that case exits with code 3. On a cold cache it adds roughly 10-25% to the wall time of the research call, and next to nothing on a warm one.
The --term-* options require the optional terms extra; see validate-terms and the Validate Ontology Terms how-to. They behave the same way: term validation runs after the report is written, and an unreachable ontology service exits with code 3 without costing you the research result. --validate-references and --validate-terms compose - passing both appends both sections.
Examples
# Research a gene with comprehensive information
deep-research-client research "Research the human CFAP300 gene including molecular function, disease associations, and evolutionary conservation"
# Use specific provider and model for tech research
deep-research-client research "Analyze current approaches to federated learning for privacy-preserving machine learning" \
--provider perplexity \
--model sonar-pro
# Save comprehensive report to file
deep-research-client research "Review the evidence on long-term effects of COVID-19 on cardiovascular health" \
--output long-covid-cardio.md
# Separate citations file
deep-research-client research "Survey ethical considerations in clinical AI deployment" \
--output ai-ethics.md \
--separate-citations
# Use template
deep-research-client research \
--template template.md \
--var "gene=TP53" \
--var "organism=human"
# Provider-specific parameters
deep-research-client research "Medical research" \
--provider perplexity \
--param "reasoning_effort=high" \
--param "search_recency_filter=week"
# Skip cache
deep-research-client research "Current events" --no-cache
# Use CBORG proxy
deep-research-client research "Quantum computing" --use-cborg
# Add publication-style metadata
deep-research-client research "CFAP300 gene function" \
--title "CFAP300 Gene Function Review" \
--author "Jane Doe" \
--keyword "genetics" \
--keyword "cilia" \
--contributor "John Smith"
# Custom endpoint
deep-research-client research "AI" \
--base-url https://api.example.com \
--api-key-env CUSTOM_API_KEY
# Let another provider take over if this one is out of credits
deep-research-client research "Statins and myopathy" --provider falcon --fallback
# Name the fallback order explicitly
deep-research-client research "CRISPR delivery" \
--provider falcon --fallback-provider openai --fallback-provider perplexity
# Check every cited identifier before trusting the report
deep-research-client research "Statins and myopathy risk" \
--output statins.md \
--validate-references
# Check that the ontology terms it cites are the terms it names them as
deep-research-client research "Marfan syndrome surveillance" \
--output marfan.md \
--validate-terms
validate-references
Check that the references cited in a saved report actually exist, and that quotes attributed to them really appear in the source. Handles PMIDs, DOIs, PMC accessions and GEO accessions.
deep-research-client validate-references [OPTIONS] FILES...
Requires the optional validation extra:
pip install "deep_research_client[validation]"
Arguments
| Argument | Description |
|---|---|
FILES... |
One or more markdown report files to validate |
Options
| Option | Description |
|---|---|
--check-quotes / --no-check-quotes |
Check quoted claims against the text of the reference they cite (default: on) |
--check-relevance / --no-check-relevance |
Weigh each resolved reference against the report's own vocabulary, flagging citations that exist but look off topic (default: on, costs no extra lookups) |
--cache-dir PATH |
Directory for cached reference lookups (default: ./references_cache) |
--email TEXT |
Contact email for the NCBI Entrez API (defaults to $NCBI_EMAIL) |
--full-text |
Fetch full text as well as abstracts (~23x slower, better quote checks) |
--max-references INT |
Stop after validating this many references per file |
--skip-prefix TEXT |
Identifier prefix to report as unverifiable rather than resolving (repeatable) |
--rate-limit-delay FLOAT |
Seconds to wait between lookups (default: 0.5); lowering it risks rate-limit errors being reported as unresolved references |
--in-place |
Replace or append the validation section in each input file |
--output PATH |
Write the markdown validation report to a file (single input file only) |
--json PATH |
Write the validation report as JSON (single input file only) |
--fail-on-unresolved |
Exit with code 2 if any reference or quote fails validation |
Notes
- Every PMID, DOI, PMC accession and GEO accession in the file is resolved against PubMed, Crossref, DataCite and Entrez. Identifiers that do not resolve are reported as likely confabulations — but see the caveat on what the outcomes mean, since a lookup that failed for network reasons is indistinguishable from one that failed because the record does not exist.
- Quotes are checked only when they are directly attributed, as in
"quoted text" (PMID:12345678). A quote whose reference could not be fetched is reported as not checked rather than as unsupported. - Every record that resolves is additionally weighed against the report's own vocabulary, so a citation that exists but is about an unrelated subject is flagged. That verdict is a clue rather than a finding: it is reported separately, excluded from
confabulation_rate, and does not trip--fail-on-unresolved. See topical relevance. - Fetched references are cached on disk, so re-running over the same corpus is fast and polite to the upstream APIs. A cold run costs roughly 1.6s per PMID or PMC accession and 6.5s per DOI; a warm one is 1-2s for a whole report.
--full-textmultiplies the cold cost by about 23. See how long it takes. --in-placeis idempotent: an existing validation section is replaced rather than appended to, so repeated runs neither stack sections nor re-count the identifiers a previous run listed.- Exit codes:
0success,1usage, input or filesystem error,2validation found problems (only with--fail-on-unresolved),3a lookup service was unreachable.
Examples
# Validate a saved report
deep-research-client validate-references report.md
# Validate several reports and append the results to each
deep-research-client validate-references reports/*.md --in-place
# Fail a pipeline when any citation is fabricated
deep-research-client validate-references report.md --fail-on-unresolved
# Existence checks only, capped at 20 references
deep-research-client validate-references report.md --no-check-quotes --max-references 20
# Machine-readable output
deep-research-client validate-references report.md --json validation.json
validate-terms
Check that the ontology terms cited in a saved report are the terms the report names them as. Resolves every CURIE through OAK and compares it with the label written beside it.
deep-research-client validate-terms [OPTIONS] FILES...
Requires the optional terms extra:
pip install "deep_research_client[terms]"
Arguments
| Argument | Description |
|---|---|
FILES... |
One or more markdown report files to validate |
Options
| Option | Description |
|---|---|
--check-labels / --no-check-labels |
Compare the label written beside each CURIE with the term's own label (default: on, costs no extra lookups) |
--adapter TEXT |
OAK adapter to resolve terms through (default: ols:; sqlite:obo: downloads each ontology once and answers locally) |
--oak-config PATH |
oak_config.yaml mapping prefixes to adapters, for ontologies the default adapter does not serve |
--cache-dir PATH |
Directory for cached term labels (default: ./terms_cache) |
--offline |
Resolve only from the label cache, never reaching the network; uncached terms are reported as unverifiable |
--max-terms INT |
Stop after validating this many terms per file |
--skip-prefix TEXT |
CURIE prefix to report as unverifiable rather than resolving (repeatable) |
--in-place |
Replace or append the term validation section in each input file |
--output PATH |
Write the markdown validation report to a file (single input file only) |
--json PATH |
Write the validation report as JSON (single input file only) |
--fail-on-unresolved |
Exit with code 2 if any term is unresolved or named as a different term |
Notes
- The check that matters most is the label comparison.
NCIT:C16814is a real NCIT term that resolves cleanly, and it means Malaysia; a report that writes it beside "Echocardiography Test" passes every existence check ever written. See what the outcomes mean. - Comparison runs against every name a term carries, not just its label. Exact synonyms count as the term's own names, so a report using one — up to case, punctuation, word order and plurals — reads as
MATCH; a near miss on one reads asVARIANT, as do broad, narrow and related synonyms, which the ontology records precisely because they name something adjacent. Synonyms are read from OAK, or from the already-cached OLS payload on the default adapter, so they cost no extra request. See synonyms. - Labels are only read from positions where a label is the only thing the text can be — a table cell, an emphasised run, a bracket or separator immediately after the CURIE. A term mentioned in flowing prose is resolved but not label-checked, because reading a clause as a name would flag correctly cited terms. See where labels are read from.
- A failed lookup is reported as
NOT_FOUNDonly under a prefix this run has reason to believe is resolvable — an OBO-library prefix, one configured inoak_config.yaml, or one some other term resolved under. Anything else isUNVERIFIABLE, which is never evidence of fabrication. - Obsolete terms and variant labels are reported separately, set
needs_review, and do not trip--fail-on-unresolved: both are go-and-looks, not failures. - Bibliographic prefixes — PMID, DOI, PMC, GEO — are left to validate-references rather than reported here as terms no ontology contains.
- Labels are cached on disk. A warm run costs about half a cold one rather than nothing, because obsolescence is asked per term on every run;
--adapter sqlite:obo:makes both checks local after the first download. See how long it takes. --in-placeis idempotent: an existing term validation section is replaced rather than appended to, and a## Reference Validationsection written by the other command is preserved in place. The same holds in reverse for validate-references, so a report can carry both and be re-validated by either.- A lookup that cannot determine anything — a connectivity failure, a 5xx, a 408 or a 429 — exits
3rather than reporting the term as absent, so a rate-limited run costs a re-run rather than producing falseNOT_FOUNDfindings. This is why there is no rate-limit delay option. - Exit codes:
0success,1usage, input or filesystem error,2validation found problems (only with--fail-on-unresolved),3an ontology service was unreachable.
Examples
# Validate a saved report
deep-research-client validate-terms report.md
# Validate several reports and append the results to each
deep-research-client validate-terms reports/*.md --in-place
# Fail a pipeline when a term is invented or mislabelled
deep-research-client validate-terms report.md --fail-on-unresolved
# Bulk work: download each ontology once, then answer locally
deep-research-client validate-terms reports/*.md --adapter sqlite:obo:
# Machine-readable output
deep-research-client validate-terms report.md --json terms.json
edison-trajectory
Retrieve an existing Edison trajectory by ID, preserving any report artifacts recovered from the verbose trajectory payload.
deep-research-client edison-trajectory [OPTIONS] TRAJECTORY_ID
Arguments
| Argument | Description |
|---|---|
TRAJECTORY_ID |
Existing Edison trajectory/task ID |
Options
| Option | Description |
|---|---|
--output PATH |
Output file path (prints to stdout if not provided) |
--separate-citations PATH |
Save citations to a separate file |
Notes
- Requires
EDISON_API_KEY(or legacyFUTUREHOUSE_API_KEY) to be set. - When
--outputis provided, recovered artifacts are written beside the report in anOUTPUT_STEM_artifacts/directory. - Frontmatter includes
trajectory_idandartifact_sourcesso it is clear where recovered artifacts came from.
Examples
# Retrieve an Edison trajectory into the current directory
deep-research-client edison-trajectory 784d73d5-da42-402e-9701-6c5b44beab14 \
--output edison-report.md
# Write citations separately
deep-research-client edison-trajectory 784d73d5-da42-402e-9701-6c5b44beab14 \
--output edison-report.md \
--separate-citations edison-report.citations.md
transcript-stats
Summarize what an agent did, from the transcripts saved alongside a run.
deep-research-client transcript-stats [OPTIONS] PATHS...
Arguments
| Argument | Description |
|---|---|
PATHS... |
Transcript JSON files, or directories searched recursively for *transcript*.json |
Options
| Option | Description |
|---|---|
--format [markdown\|json\|text] |
Output format (default: markdown) |
--output PATH |
Write to this file instead of stdout |
Notes
- Several transcripts merge into one summary, which is what a job writing one transcript per iteration needs.
- Reports distinct tools and call counts, per-tool failures, skills invoked, shell programs, web searches (total and distinct — a retried query is one query but several searches), files changed, models, token usage, and the tools a session declared but never called.
- Transcripts are dropped by the default artifact policy. To keep them, run the
provider with
--param artifact_keep_runtime=true(see Artifact selection). - Exits 1 on a missing path or a transcript that is not a JSON list of objects.
Examples
# Summarize a job's provenance directory
deep-research-client transcript-stats run_artifacts/provenance/
# Machine-readable, for downstream tooling
deep-research-client transcript-stats run_artifacts/ --format json --output stats.json
# Compact terminal view
deep-research-client transcript-stats run_artifacts/ --format text
providers
List available research providers.
deep-research-client providers [OPTIONS]
Options
| Option | Description |
|---|---|
--show-params |
Show available parameters for each provider |
--provider TEXT |
Show details for specific provider only |
--check |
Probe the configured providers for live reachability. With nothing configured, lists what every provider needs instead |
Examples
# List all providers
deep-research-client providers
# Show parameters
deep-research-client providers --show-params
# Specific provider
deep-research-client providers --provider perplexity --show-params
models
Show available models and their characteristics.
deep-research-client models [OPTIONS]
Options
| Option | Description |
|---|---|
--provider TEXT |
Filter by provider |
--cost TEXT |
Filter by cost level |
--capability TEXT |
Filter by what a model can do |
--resource TEXT |
Filter by the data resource a model wraps |
--archetype TEXT |
Filter by provider archetype |
--detailed |
Show detailed model information |
The accepted values for --provider, --capability, --resource and
--archetype are generated from the registry and the controlled vocabularies,
so deep-research-client models --help is the current list. Filters combine:
several flags ask for their intersection.
Examples
# List all models
deep-research-client models
# Filter by provider
deep-research-client models --provider perplexity
# Filter by cost
deep-research-client models --cost low
# Filter by capability, wrapped resource, or archetype
deep-research-client models --capability code_interpretation
deep-research-client models --resource pubmed
deep-research-client models --archetype co_scientist
# Combine filters: co-scientists that reach PubMed
deep-research-client models --archetype co_scientist --resource pubmed
# Detailed view
deep-research-client models --detailed
# Combined filters
deep-research-client models --provider perplexity --cost medium --detailed
list-cache
List cached research files with metadata.
deep-research-client list-cache [OPTIONS]
Options
| Option | Description |
|---|---|
--detailed, -d |
Show detailed metadata for each entry |
--provider, -p TEXT |
Filter by provider name |
--limit, -n INT |
Limit number of results |
Examples
# List all cached files
deep-research-client list-cache
# Detailed view with query, model, duration, citations
deep-research-client list-cache --detailed
# Filter by provider
deep-research-client list-cache --provider perplexity
# Show only last 10 entries
deep-research-client list-cache -n 10
# Combined
deep-research-client list-cache -p openai -d -n 5
search-cache
Search cached research files by keyword.
deep-research-client search-cache [OPTIONS] KEYWORD
Arguments
| Argument | Description |
|---|---|
KEYWORD |
Keyword to search for in queries and content |
Options
| Option | Description |
|---|---|
--detailed, -d |
Show detailed metadata for each match |
--query-only, -q |
Only search in queries, not content |
--context, -c INT |
Characters of context around matches (default: 60) |
--max-snippets, -m INT |
Maximum snippets to show per match (default: 3) |
--no-snippets |
Hide match snippets |
Examples
# Search for keyword
deep-research-client search-cache "BRCA1"
# With more context
deep-research-client search-cache "CRISPR" --context 100
# More snippets
deep-research-client search-cache "mutation" --max-snippets 5
# Only search queries
deep-research-client search-cache "gene" --query-only
# No snippets
deep-research-client search-cache "protein" --no-snippets
browse-cache
Generate a standalone HTML browser for cached research results.
deep-research-client browse-cache [OPTIONS] OUTPUT_DIR
Requires the browser optional dependency:
pip install deep-research-client[browser]
Arguments
| Argument | Description |
|---|---|
OUTPUT_DIR |
Output directory for browser files |
Options
| Option | Description |
|---|---|
--title, -t TEXT |
Browser title |
--description, -d TEXT |
Browser description |
--force, -f |
Overwrite existing directory |
--export-only |
Only export JSON data, don't generate browser |
--no-pages |
Skip generating individual HTML pages |
--template PATH |
Custom Jinja2 template for individual pages |
Examples
# Generate browser with individual pages
deep-research-client browse-cache ./browser
# Overwrite existing
deep-research-client browse-cache ./browser --force
# Custom title
deep-research-client browse-cache ./browser -t "My Research Archive"
# Browser only (no individual pages)
deep-research-client browse-cache ./browser --no-pages
# Export JSON for customization
deep-research-client browse-cache ./data --export-only
# Custom template
deep-research-client browse-cache ./browser --template my-template.j2
Output
output_dir/
├── index.html # Faceted browser
├── data.js # Browser data
├── schema.js # Browser schema
└── pages/ # Individual result pages
├── openai-xxx.html
└── ...
browse-files
Generate a standalone HTML browser from markdown research files.
deep-research-client browse-files [OPTIONS] SOURCES... -o OUTPUT_DIR
Requires the browser optional dependency:
pip install deep-research-client[browser]
Arguments
| Argument | Description |
|---|---|
SOURCES... |
One or more directories or files to include |
Options
| Option | Description |
|---|---|
--output, -o PATH |
Output directory for browser files (required) |
--pattern, -p TEXT |
Glob pattern for finding files in directories (default: **/*.md) |
--title, -t TEXT |
Browser title |
--description TEXT |
Browser description |
--force, -f |
Overwrite existing directory |
--export-only |
Only export JSON data, don't generate browser |
--no-pages |
Skip generating individual HTML pages |
--template PATH |
Custom Jinja2 template for individual pages |
Examples
# Browse all markdown files in a directory
deep-research-client browse-files ./research-outputs -o ./browser
# Use a specific glob pattern
deep-research-client browse-files ./docs -o ./browser -p "*.md"
# Browse a single file
deep-research-client browse-files ./my-research.md -o ./browser
# Multiple sources (directories and files)
deep-research-client browse-files ./dir1 ./dir2 ./extra.md -o ./browser
# Recursively find files matching pattern
deep-research-client browse-files ./notes -o ./browser -p "research/**/*.md"
# Export JSON only
deep-research-client browse-files ./research -o ./data --export-only
# Custom title
deep-research-client browse-files ./research -o ./browser -t "Research Archive"
Output
Same structure as browse-cache:
output_dir/
├── index.html # Faceted browser
├── data.js # Browser data
├── schema.js # Browser schema
└── pages/ # Individual result pages
├── file1.html
└── ...
clear-cache
Clear all cached research results.
deep-research-client clear-cache
Removes all files from ~/.deep_research_cache/.
eval
Evaluate research tools against benchmark eval sets. A benchmark is read by an adapter; see Evaluate Providers for the full workflow.
Subcommands
| Command | Purpose |
|---|---|
eval adapters |
List the benchmark formats this client can read |
eval fetch |
Download a benchmark dataset into the local cache |
eval load |
Load an eval set and show what it contains |
eval run |
Run every task in an eval set against every arm |
eval score |
Score a saved report against one task from an eval set |
eval adapters
Lists every registered adapter with its description, marking those that download data.
eval fetch
| Argument/Option | Description |
|---|---|
SUBSET |
LAB-Bench subset(s), comma-separated, or all (default: LitQA2) |
--cache-dir PATH |
Cache directory (default: ~/.deep_research_cache) |
--revision TEXT |
Fail unless the dataset's current revision is this one (asserts; the API serves only the current revision) |
--refresh |
Re-download even if a cached copy exists |
Benchmark data is cached rather than committed: LAB-Bench ships a contamination canary, is CC-BY-SA-4.0 where this project is BSD-3-Clause, and is large. The revision downloaded is recorded so a score can name the data behind it.
eval load
| Argument/Option | Description |
|---|---|
SOURCE |
Source for the adapter: a file, a directory, or a dataset subset |
--adapter, -a TEXT |
Eval set format (default: yaml) |
--output, -o PATH |
Write the eval set as JSON instead of summarising it |
--limit INTEGER |
Show only the first N tasks in the summary (default: 10) |
eval run
Runs every task in an eval set against every arm, writing results into a predictable directory tree.
| Argument/Option | Description |
|---|---|
SOURCE |
Eval set source: a file, a directory, or a dataset subset name |
--adapter, -a TEXT |
Eval set format (default: yaml) |
--arm TEXT |
Arm as provider, provider:model, or id=provider:model (repeatable) |
--arms PATH |
YAML file defining arms, for arms that need provider params |
--output-dir, -o PATH |
Run directory (default: runs/<timestamp>) |
--limit INTEGER |
Run only the first N tasks |
--task-id TEXT |
Run only these task ids (repeatable) |
--concurrency, -j INTEGER |
Cells to run at a time (default: 4) |
--no-resume |
Re-run cells an earlier run already completed (does not bypass the response cache; pair with --no-cache) |
--no-cache |
Never replay a response from the client cache; call the provider for every cell |
--cache-dir TEXT |
Override the response cache directory (default: ~/.deep_research_cache) |
--grade |
Also score multiple-choice answers with the provisional regex extractor |
--dry-run |
Show the matrix and one prompt without calling any provider |
A run materialises results and does not score them: every response lands on disk
beside the prompt that produced it, so grading can be decided and redone later
without re-running any provider. --grade opts into a provisional regex-based
multiple-choice grader, which is fine for a quick look but is not the intended
design — see Evaluate Providers.
Responses are cached by default, keyed on prompt, provider, model and
parameters, so a cell can be served from an earlier run rather than measured in
this one. The end-of-run summary separates cells measured now, replayed from the
cache, and resumed from a previous run in the same directory; results.tsv
carries resumed and cached columns. Use --no-cache when the number has to
describe calls made now, and --no-resume --no-cache when the run directory
already holds results.
Output layout:
<run_dir>/
manifest.json arms, dataset revision, every cell
results.tsv one row per cell
scores.tsv per-arm aggregates, for multiple-choice runs
<task_id>/<arm_id>/
prompt.md exactly what the provider was sent
output.md exactly what it returned
cell.json the cell record
answer.json the graded answer, for multiple-choice tasks
Cells are written as they finish, so a run is resumable: point --output-dir at
an existing run and completed cells are skipped. Failed cells are always
retried. A provider failure fails its own cell and no others.
eval score
| Argument/Option | Description |
|---|---|
REPORT |
Markdown file with the report to score |
--source TEXT |
Eval set source (required) |
--adapter, -a TEXT |
Eval set format (default: yaml) |
--task-id TEXT |
Task to score against; required when the set has more than one |
--provider TEXT |
Name of the provider that generated the report |
--no-fact |
Skip FACT (citation support) scoring |
--no-recall |
Skip claim recall scoring |
--no-race |
Skip RACE (report quality) scoring |
--no-intrinsic |
Skip intrinsic (LLM-free) scoring |
--output, -o PATH |
Output file for results (JSON) |
--llm-base-url TEXT |
Base URL for the LLM judge API |
--llm-api-key-env TEXT |
Env var for the LLM judge API key (default: OPENAI_API_KEY) |
--llm-model TEXT |
Model for the LLM judge (default: gpt-4o-mini) |
FACT, claim recall and RACE need an LLM judge; the intrinsic scores do not.
Examples
# See what benchmark formats are available
deep-research-client eval adapters
# Check your own questions parse before spending money on providers
deep-research-client eval load questions.yaml
deep-research-client eval load questions.tsv --adapter tsv
# Download and inspect a published benchmark
deep-research-client eval fetch LitQA2
deep-research-client eval load LitQA2 --adapter lab-bench
# Load curated Monarch ground truth
deep-research-client eval load /path/to/dismech/kb/disorders --adapter dismech
# Price a matrix run before committing to it
deep-research-client eval run LitQA2 --adapter lab-bench --arms arms.yaml --limit 20 --dry-run
# Run a benchmark across several arms
deep-research-client eval run LitQA2 --adapter lab-bench \\
--arm edison=falcon --arm baseline=claude_code --limit 20
# Score a saved report
deep-research-client eval score report.md --source questions.yaml --task-id fgfr3_mech
# Intrinsic scores only: no LLM judge, no API spend
deep-research-client eval score report.md --source questions.yaml \
--no-fact --no-recall --no-race
# A local OpenAI-compatible judge, which needs no API key
deep-research-client eval score report.md --source questions.yaml \
--llm-base-url http://localhost:8000/v1 --llm-model my-local-model
eval score refuses to start when a judge-backed score is enabled and no API
key is set, rather than running the intrinsic scores and then failing at the
judge. Set OPENAI_API_KEY, point --llm-api-key-env at a variable that is
set, pass --llm-base-url, or turn the judge-backed scores off with the three
flags above.
Any --llm-base-url skips that check, not only a local one: the command cannot
tell a keyless endpoint from one that checks keys, so it sends a placeholder and
says so. A local server accepts it; a remote proxy that does check will answer
401 on every judge call.
Environment Variables
| Variable | Provider | Description |
|---|---|---|
OPENAI_API_KEY |
OpenAI | OpenAI API key |
EDISON_API_KEY |
Edison | Edison Scientific API key |
ASTA_API_KEY |
Asta | Asta retrieval API key |
PERPLEXITY_API_KEY |
Perplexity | Perplexity AI API key |
CONSENSUS_API_KEY |
Consensus | Consensus API key |
CBORG_API_KEY |
CBORG | CBORG proxy API key |
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (invalid options, API failure, etc.) |
Shell Completion
Install shell completion:
# Bash
deep-research-client --install-completion bash
# Zsh
deep-research-client --install-completion zsh
# Fish
deep-research-client --install-completion fish