Skip to main content

Open Research Agent (ORA)

Open Research Agent (ORA) is an open-source multi-agent research CLI. ORA plans research, searches and scrapes web sources, synthesizes findings, and optionally uses an adversarial reviewer for higher-intensity research.

Current release: 0.3.0

What ORA does

ORA turns a research question into a sourced markdown report:

  1. A supervisor drafts a research plan.
  2. The researcher searches and scrapes web sources.
  3. At intensity 3+, an LLM extraction layer pulls key claims, data, and entities from each source.
  4. The writer synthesizes findings into a report.
  5. For intensity levels 3 and above, an adversarial reviewer audits the draft.

Current backend support

ORA 0.3.0 supports two LLM backends:

  • DeepSeek API (default), models like deepseek-v4-flash and deepseek-v4-pro
  • OpenRouter, an OpenAI-compatible gateway to many models, e.g. anthropic/claude-3.5-sonnet via openrouter:anthropic/claude-3.5-sonnet

Search and scraping use Firecrawl.

Installation

Install from PyPI:

pip install open-research-agent

The primary CLI command is open-research-agent. The shorter ora command is also installed as a convenience alias.

Install from source for development:

git clone https://github.com/cameronmpalmer/open-research-agent.git
cd open-research-agent
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Configuration

Set the required API keys:

export DEEPSEEK_API_KEY="your-deepseek-api-key"
export FIRECRAWL_API_KEY="your-firecrawl-api-key"
export OPENROUTER_API_KEY="your-openrouter-api-key"

Create a default config file:

open-research-agent config --init

Show the active configuration and intensity levels:

open-research-agent config --show

The config file is stored at:

~/.ora/config.yaml

See CONFIG.md for the complete reference of the config.yaml format, the available settings, and their environment-variable equivalents.

Using a provider prefix

Any model name can carry a provider:model prefix to select the backend:

open-research-agent research "..." --model openrouter:anthropic/claude-3.5-sonnet

Without a prefix, calls use the default provider (deepseek by default). The default can be changed in config.yaml under provider.default. An unknown prefix (e.g. openai:gpt-4.1) warns and falls back to the default provider. Each provider reads its API key from the environment variable named in its api_key_env (DEEPSEEK_API_KEY for deepseek, OPENROUTER_API_KEY for openrouter), and can be configured under providers: in config.yaml:

provider:
  default: deepseek
providers:
  deepseek:
    base_url: https://api.deepseek.com
    api_key_env: DEEPSEEK_API_KEY
  openrouter:
    base_url: https://openrouter.ai/api/v1
    api_key_env: OPENROUTER_API_KEY
    headers:
      HTTP-Referer: https://github.com/cameronmpalmer/open-research-agent
      X-Title: ORA

The legacy top-level deepseek_base_url key is still honored when no providers: section exists.

Quick start

Preview a research plan without running the full pipeline:

open-research-agent plan "What are the tradeoffs between Rust and Go for backend services?"

Run a standard research task:

open-research-agent research "What are the tradeoffs between Rust and Go for backend services?" --intensity 2

Run deeper research with adversarial review:

open-research-agent research "What are the tradeoffs between Rust and Go for backend services?" --intensity 4

Save to an explicit file:

open-research-agent research "AI memory systems" --output ai-memory-systems.md

Print only to stdout and do not save a report file:

open-research-agent research "AI memory systems" --no-save

Intensity levels

ORA supports five research intensity levels:

Level Label Minimum sources Max rounds (safety cap) Reviewer
1 Quick 3 5 No
2 Standard 8 5 No
3 Thorough 15 7 Yes
4 Deep 50 10 Yes
5 Exhaustive 100 10 Yes

Levels 3, 4, and 5 use the adversarial reviewer by default.

CLI flags

Flag Description
-i, --intensity 1-5 Research intensity level (default: 2)
-o, --output PATH Save report to a specific path
--no-save Print to stdout without saving a file
--stdout Print to stdout (report is still saved)
-m, --model NAME Override the LLM model for research and writing
-r, --reviewer-model NAME Override the LLM model for planning and review
-y, --auto-approve Skip the interactive plan approval prompt
--no-review Disable adversarial reviewer (even at intensity 3+)
--max-revisions N Maximum reviewer audits including the initial draft audit (1 = single audit, no revision; defaults to limits.max_revisions in config, itself 3 = up to two revision passes)
--quiet Suppress progress output, show only the final report

Output files

By default, open-research-agent research saves a timestamped markdown report in the current directory. Generated research reports are local outputs and should not be committed to the repository.

Use --output to choose a specific path, or --no-save to print the report without writing a file.

Development

ORA requires Python 3.10. Later versions (3.11+) may encounter incompatibilities with the LangChain/LangGraph ecosystem.

The repository ships a Makefile that manages a local virtual environment automatically. From a clean clone:

make setup

Run the test suite (pass T=tests/path for a focused file, ARGS="-x -q" for pytest options):

make test

Lint and auto-format:

make lint
make format

Build the package (wheel and sdist into dist/):

make build

Run a research task from the Makefile. Reports are saved to reports/ by default:

make research QUERY="What are the tradeoffs between Rust and Go for backend services?"

make research QUERY="..." INTENSITY=4 runs at a higher intensity level; OUTPUT=path.md overrides the output path. make plan QUERY="..." previews a research plan without running it. make check runs lint then tests. See make help for the full target list.

Install the git pre-commit hook (run once per clone):

make install-hooks

The hook runs make precommit (lint, tests, and build) before every commit. Bypass it for a quick commit with git commit --no-verify.

Run the CLI locally:

open-research-agent --help
ora --help
python -m ora --help

See CONTRIBUTING.md for contributor setup and repository hygiene expectations.

License

MIT License. See LICENSE.

Metadata

Release files for open-research-agent 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for open-research-agent 0.3.0
File Size Uploaded
open_research_agent-0.3.0.tar.gz 116.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for open-research-agent 0.3.0
File Interpreter ABI Platform
open_research_agent-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 182.0 kB

Release files / open_research_agent-0.3.0.tar.gz

Download URL open_research_agent-0.3.0.tar.gz
Size 116.9 kB
Tags Source
SHA-256 checksum
How to use checksums
38c3bbc2ed953f7e59dd185b8eaabb87788c195f8a01de03ff0e2cd76d9a085a
BLAKE2b-256 checksum
How to use checksums
5ffe8d90c816054ac3f7a407c17b419c86119076b91fcd0a9a3087ef99783d73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / open_research_agent-0.3.0-py3-none-any.whl

Download URL open_research_agent-0.3.0-py3-none-any.whl
Size 65.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6dd69778a3d4e4bc6e20ab5a08b8c5a7bc95b03734f51e46fd0f62d52eaa8fcb
BLAKE2b-256 checksum
How to use checksums
ae2f273eaf31af1948b6d6c2b87e00ab7746b730a99e3f404071783fb223b490
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page