This is the official repository for our paper "O-Researcher: An Open Ended Deep Research Model via Multi-Agent Distillation and Agentic RL".By integrating web search, page crawling, and intelligent summarization, it delivers accurate and traceable research results.
O-Researcher presents a unified framework that bridges the gap between closed-source and open-source LLMs through automated multi-agent data synthesis and a two-stage training strategy, achieving state-of-the-art performance on deep research benchmarks while eliminating dependency on proprietary data.
π Web Search Integration: Multi-API Google search with intelligent caching and load balancing
π Page Crawling: Concurrent page crawling with AI-powered content summarization
β‘ High Performance: Multi-worker architecture with async processing for concurrent operations
π Smart Caching: Persistent cache mechanism reduces redundant API calls and improves response times
π‘οΈ Robust Error Handling: Automatic retry logic with multi-API fallback for enhanced reliability
π― Structured Output: Generates well-formatted research reports with traceable citations
First, install the required dependencies by executing the command below to install packages listed in requirements.txt
# Install Python dependencies
pip install -r requirements.txtYou can directly download the model by following the links below.
| Model | Download Links | Model Size | Context Length |
|---|---|---|---|
| O-Researcher-72B-rl | π€ HuggingFace | 72B | 128K |
| O-Researcher-72B-sft | π€ HuggingFace | 72B | 128K |
Alternative Download Methods:
- Direct from HuggingFace: Click the π€ HuggingFace link above
- Script Download:
cd ./model python download.py
The sft and rl datasets for O-Researcher, the download links are as below: You can directly download the model by following the links below.
| Datasets | Download Links | Dataset Size | Max Context Length |
|---|---|---|---|
| O-Researcher-SFT-Dataset | π€ HuggingFace | 2.92k | 128K |
| O-Researcher-RL-Dataset | π€ HuggingFace | 10k | 128K |
# Copy the template and fill in your values
cp env_template .env
# Edit .env with your actual configuration
vim .envServer Configuration (server/start_servers.sh):
| Variable | Description | Default |
|---|---|---|
SERVER_HOST |
Server listening address | 127.0.0.1 |
CRAWL_PAGE_PORT |
CrawlPage service port | 20001 |
WEBSEARCH_PORT |
WebSearch service port | 20002 |
CRAWL_PAGE_WORKERS |
CrawlPage worker processes | 10 |
WEBSEARCH_WORKERS |
WebSearch worker processes | 10 |
API Configuration:
| Variable | Description | Example |
|---|---|---|
SERPER_API_KEY |
Serper API Key (multiple keys separated by |) |
key1|key2 |
SERPAPI_BASE_URL |
Serper API URL | https://google.serper.dev/search |
SUMMARY_API_URLS |
Summarization API URL (multiple separated by |) |
https://api.openai.com/v1 |
SUMMARY_OPENAI_API_KEY |
OpenAI API Key for summarization | sk-xxx |
SUMMARY_MODEL |
Summarization model name | gpt-5-mini |
JINA_API_KEY |
Jina API Key (optional) | jina_xxx |
# Start all tool servers
bash server/start_servers.sh start
# Check server status
bash server/start_servers.sh status
# Stop all servers
bash server/start_servers.sh stopAvailable Tool Servers:
| Server | Port | Description |
|---|---|---|
| WebSearch | WEBSEARCH_PORT |
Multi-API Google search with intelligent caching |
| CrawlPage | CRAWL_PAGE_PORT |
Concurrent page crawling with AI summarization |
Deploy the model using vLLM for high-performance inference:
# Start model deployment
bash deploy/deploy.sh start
# Check deployment status
bash deploy/deploy.sh status
# Stop model deployment
bash deploy/deploy.sh stopDeployment Configuration:
| Variable | Description | Default |
|---|---|---|
MODEL_PATH |
Path to your model (required) | - |
MODEL_NAME |
Model name (required) | - |
MODEL_BASE_PORT |
Base port for model service | 9095 |
DEPLOY_HOST |
Deployment host address | 0.0.0.0 |
DEPLOY_INSTANCES |
Number of instances | 1 |
DEPLOY_GPUS_PER_INSTANCE |
GPUs per instance | 4 |
DEPLOY_MAX_MODEL_LEN |
Maximum model length | 131072 |
DEPLOY_LOG_DIR |
Deployment log directory | deploy/logs |
DEPLOY_WAIT_TIMEOUT |
Startup timeout (seconds) | 120 |
Inference Configuration:
| Variable | Description | Example |
|---|---|---|
MODEL_URL |
Model API URL (multiple separated by | for load balancing) |
http://localhost:9095/v1 |
WEBSEARCH_URL |
WebSearch service URL | http://localhost:20002/search |
CRAWL_PAGE_URL |
CrawlPage service URL | http://localhost:20001/crawl_page |
Multi-Instance Deployment:
When deploying multiple instances (DEPLOY_INSTANCES > 1), ports are assigned incrementally:
- Instance 1:
MODEL_BASE_PORT(e.g., 9095) - Instance 2:
MODEL_BASE_PORT + 1(e.g., 9096) - ...
Remember to update MODEL_URL accordingly:
# For 2 instances
export MODEL_URL="http://localhost:9095/v1|http://localhost:9096/v1"Make sure .env is properly configured and sourced:
source .env
cd infer
python infer.py --input_file ../data/example.jsonl --output_file ../results/output.jsonlQuick Start with Example Script:
cd infer
bash example_infer.sh # Automatically sources .env| Parameter | Description | Default |
|---|---|---|
--input_file |
Input JSON/JSONL file path | Required |
--output_file |
Output JSONL file path | Required |
--q_key |
Key name for question field | question |
--a_key |
Key name for answer field | answer |
--temperature |
Generation temperature | 1.0 |
--top_p |
Top-p sampling | 0.9 |
--max_tokens |
Max tokens per generation | 4096 |
--total_tokens |
Max total tokens | 131072 |
--max_steps |
Max inference steps per question | 100 |
--parallel |
Number of parallel workers | 1 |
--round |
Number of inference rounds | 1 |
# Custom input/output keys
python infer.py \
--input_file ../data/queries.jsonl \
--output_file ../results/output.jsonl \
--q_key "prompt" \
--a_key "answer"
# High-performance parallel processing
python infer.py \
--input_file ../data/example.json \
--output_file ../results/parallel_output.jsonl \
--parallel 30
# Multiple rounds inference
python infer.py \
--input_file ../data/example.json \
--output_file ../results/multi_round.jsonl \
--round 3The WebSearch server provides intelligent web search with caching:
- Multi-API Support: Load balancing across multiple Serper API keys
- Intelligent Caching: JSONL-based persistent cache reduces API costs
- Query Splitting: Supports multiple queries separated by
| - Result Formatting: Structured output with titles, snippets, and URLs
API Endpoint:
POST /search
Content-Type: application/json
{
"q": "query1 | query2",
"num": 10
}The CrawlPage server handles webpage content extraction:
- Concurrent Crawling: Async processing for multiple URLs
- AI Summarization: Intelligent content summarization using LLM
- Error Handling: Robust retry mechanisms for failed requests
API Endpoint:
POST /crawl_page
Content-Type: application/json
{
"urls": ["https://example.com/page1", "https://example.com/page2"],
"task": "Summarize the main points",
"chunk_size": 8192
}O-Researcher generates structured research reports with:
- Introduction: Context and problem statement
- Body: Organized findings with in-text citations
- Conclusion: Summary of key findings
- References: Numbered list of sources with URLs
Example Output:
## Research Report
### Introduction
This report examines the latest developments in AI...
### Findings
According to recent studies [1], the adoption of AI has increased by 40% in 2024...
### Conclusion
The research indicates that...
### References
[1]. https://example.com/ai-study - AI Adoption Report 2024
[2]. https://example.org/research - Latest AI Developments1. Port already in use
# Check what's using the port
lsof -i :20001
# Force stop all servers
bash server/start_servers.sh stop2. API Key errors
# Verify environment variables
echo $SERPER_API_KEY
echo $SERPAPI_BASE_URL
# Make sure .env is sourced
source .env3. Model deployment timeout
# Increase timeout in .env
export DEPLOY_WAIT_TIMEOUT=600
# Check deployment logs
tail -f deploy/logs/*.logListed below are friendly links to relevant agents works from OPPO PersonalAI Lab:
- Flash-Searcher: Fast and Effective Web Agents via DAG-Based Parallel Execution
- Agent Foundation Models: Chain-of-Agents: End-to-End Agent Foundation Models via Multi-Agent Distillation and Agentic RL
- TaskCraft: Automated Generation of Agentic Tasks
- OAgents: An Empirical Study of Building Effective Agents
- Agent-KB: Leveraging Cross-Domain Experience for Agentic Problem Solving
- MiCoTA: Bridging the Learnability Gap with Intermediate CoT and Teacher Assistants
