webresearcher


Namewebresearcher JSON
Version 0.2.2 PyPI version JSON
download
home_pagehttps://github.com/shibing624/WebResearcher
SummaryAn Iterative Deep-Research Agent with unbounded reasoning capability
upload_time2025-10-27 05:10:50
maintainerNone
docs_urlNone
authorXuMing
requires_python>=3.8
licenseApache-2.0
keywords research agent ai llm iterative-research deep-research web-research
VCS
bugtrack_url
requirements requests loguru tiktoken openai pydantic json5 pandas tabulate pillow sandbox-fusion python-dotenv
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [**🇨🇳中文**](https://github.com/shibing624/webresearcher/blob/main/README.md) | [**🌐English**](https://github.com/shibing624/webresearcher/blob/main/README_EN.md) 


<p align="center">
  <img src="./docs/webresearcher.jpg" alt="WebResearcher Logo" height="150" alt="Logo"/>
</p>

---

# WebResearcher: An Iterative Deep-Research Agent
<p align="center">
  <a href="https://pypi.org/project/webresearcher/"><img src="https://img.shields.io/pypi/v/webresearcher.svg" alt="PyPI version"></a>
  <a href="https://pepy.tech/project/webresearcher"><img src="https://static.pepy.tech/badge/webresearcher" alt="Downloads"></a>
  <a href="https://github.com/shibing624/WebResearcher/blob/main/LICENSE"><img src="https://img.shields.io/github/license/shibing624/WebResearcher.svg" alt="License"></a>
  <a href="https://pypi.org/project/webresearcher/"><img src="https://img.shields.io/badge/Python-3.10%2B-green.svg" alt="Python versions"></a>
  <a href="https://arxiv.org/abs/2509.13309"><img src="https://img.shields.io/badge/arXiv-2509.13309-b31b1b.svg" alt="arXiv"></a>
  <a href="https://github.com/shibing624/WebResearcher"><img src="https://img.shields.io/badge/wechat-group-green.svg?logo=wechat" alt="Wechat Group"></a>
</p>

- 🧠 **迭代深度研究**: 通过周期性综合防止上下文溢出的新型范式
- 🔄 **无界推理**: 通过演化报告实现几乎无限的研究深度
- 🛠️ **丰富工具生态**: 网页搜索、学术论文、代码执行、文件解析
- 🎯 **生产就绪**: 零外部 Agent 框架依赖,完全自包含
- ⚡ **高性能**: 异步优先设计,智能 Token 管理,强大的错误处理
- 🎨 **易于使用**: 简洁的 CLI、清晰的 Python API、丰富的示例

## 📖 简介

**WebResearcher** 是迭代式深度研究智能体,基于 **IterResearch 范式**构建的自主研究智能体,旨在模拟专家级别的研究工作流。与遭受上下文溢出和噪音累积困扰的传统 Agent 不同,WebResearcher 将研究分解为离散的轮次,并进行迭代综合。

### 传统 Agent 的问题

当前的开源研究 Agent 依赖于**单上下文、线性累积**模式:

1. **🚫 认知工作空间窒息**: 不断膨胀的上下文限制了深度推理能力
2. **🚫 不可逆的噪音污染**: 错误和无关信息不断累积
3. **🚫 缺乏周期性综合**: 无法暂停以提炼、重新评估和战略性规划

### WebResearcher 的解决方案

WebResearcher 实现了 **IterResearch 范式**,每轮通过**单次 LLM 调用**同时生成:

- **Think(思考)**: 内部推理和分析
- **Report(报告)**: 综合所有发现的更新研究摘要
- **Action(行动)**: 工具调用或最终答案

这种**一步式方法**(相比传统的两步式"思考→行动→综合")带来了:
- ⚡ **速度提升 50%** - 每轮只需一次 LLM 调用而非两次
- 💰 **成本降低 40%** - 减少 Token 使用量
- 🧠 **推理更优** - Think、Report 和 Action 在统一上下文中生成

这实现了**无界的研究深度**,同时保持精简、聚焦的认知工作空间。

<p align="center">
  <img src="https://github.com/shibing624/WebResearcher/blob/main/docs/iterresearch.png" alt="范式对比" width="100%"/>
  <br>
  <em>图:单上下文范式(上)vs. 迭代深度研究范式(下)</em>
</p>

## 🏗️ 架构

### 核心组件

**IterResearch 范式 - 每轮单次 LLM 调用:**

```python
第 i 轮:
┌─────────────────────────────────────────────────────────┐
│  工作空间状态: (问题, 报告_{i-1}, 结果_{i-1})              │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  单次 LLM 调用 → 同时生成三部分:                          │
│  ├─ <think>: 分析当前状态                                │
│  ├─ <report>: 综合所有发现的更新报告                      │
│  └─ <tool_call> 或 <answer>: 下一步行动                  │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│  如果是 <tool_call>: 执行工具                             │
│  如果是 <answer>: 返回最终答案                            │
└─────────────────────────────────────────────────────────┘
                          ↓
           使用更新后的报告和工具结果进入下一轮
```

**核心优势**: 报告在决定下一步行动*之前*就已完成综合,确保在统一上下文中进行连贯推理。

### 可用工具

| 工具 | 描述 | 使用场景 |
|------|------|----------|
| `search` | 通过 Serper API 的 Google 搜索 | 通用网页信息 |
| `google_scholar` | 学术论文搜索 | 科研文献查询 |
| `visit` | 网页内容提取 | 深度内容分析 |
| `PythonInterpreter` | 沙盒代码执行 | 数据分析、计算 |
| `parse_file` | 多格式文件解析器 | 文档处理 |

## 🚀 快速开始

### 安装

```bash
pip install webresearcher
```

### 基础使用

```bash
# 设置 API 密钥
export OPENAI_API_KEY="your_key"
export SERPER_API_KEY="your_key"

# 运行研究查询
webresearcher "刘翔破纪录时候是多少岁?"
```

### Python API

```python
import asyncio
from webresearcher import WebResearcherAgent

# 配置
llm_config = {
    "model": "gpt-4o",
    "generate_cfg": {"temperature": 0.6}
}

# 创建 Agent
agent = WebResearcherAgent(
    llm_config=llm_config,
    function_list=["search", "google_scholar", "PythonInterpreter"]
)

# 开始研究
async def main():
    result = await agent.run("您的研究问题")
    print(result['prediction'])

asyncio.run(main())
```

## 📚 高级用法

### 测试时扩展 (TTS)

对于需要最高准确性的关键问题,使用 TTS 模式(3-5倍成本):

```bash
webresearcher "复杂问题" --use-tts --num-agents 3
```

```python
from webresearcher import TestTimeScalingAgent

agent = TestTimeScalingAgent(llm_config, function_list)
result = await agent.run("复杂问题", num_parallel_agents=3)
```

### 自定义工具

通过继承 `BaseTool` 创建您自己的工具:

```python
from webresearcher import BaseTool, WebResearcherAgent, TOOL_MAP

class MyCustomTool(BaseTool):
    name = "my_tool"
    description = "工具功能描述"
    parameters = {"type": "object", "properties": {...}}
    
    def call(self, params, **kwargs):
        # 您的工具逻辑
        return "结果"

# 注册并使用
TOOL_MAP['my_tool'] = MyCustomTool()
agent = WebResearcherAgent(llm_config, function_list=["my_tool", "search"])
```

查看 [examples/custom_agent.py](./examples/custom_agent.py) 获取完整示例。

### 批量处理

高效处理多个问题:

```python
from webresearcher import WebResearcherAgent

questions = ["问题 1", "问题 2", "问题 3"]
agent = WebResearcherAgent(llm_config)

for question in questions:
    result = await agent.run(question)
    print(f"Q: {question}\nA: {result['prediction']}\n")
```

查看 [examples/batch_research.py](./examples/batch_research.py) 获取高级批量处理示例。

### Python 解释器配置

`PythonInterpreter` 工具支持两种执行模式:

**1. 沙箱模式(生产环境推荐):**
```bash
# 配置沙箱端点
export SANDBOX_FUSION_ENDPOINTS="http://your-sandbox-endpoint.com"
```

**2. 本地模式(自动降级):**
- 当未配置 `SANDBOX_FUSION_ENDPOINTS` 时,代码在本地执行
- 适用于开发和测试
- ⚠️ **警告**:本地执行会在当前 Python 环境中运行代码

```python
from webresearcher import PythonInterpreter

# 如果配置了沙箱则使用沙箱,否则降级到本地执行
interpreter = PythonInterpreter()
result = interpreter.call({'code': 'print("Hello, World!")'})
```

详细示例请参考 [examples/python_interpreter_example.py](./examples/python_interpreter_example.py)。

### 日志管理

WebResearcher 提供了统一的日志管理系统,可以通过环境变量或编程方式控制日志级别:

**通过环境变量:**

```bash
# 运行前设置日志级别
export WEBRESEARCHER_LOG_LEVEL=DEBUG  # 选项:DEBUG, INFO, WARNING, ERROR, CRITICAL
webresearcher "你的问题"
```

**编程方式:**

```python
from webresearcher import set_log_level, add_file_logger

# 设置控制台日志级别
set_log_level("WARNING")  # 只显示警告和错误

# 添加文件日志,支持自动轮转
add_file_logger("research.log", level="DEBUG")

# 现在执行研究
agent = WebResearcherAgent(llm_config)
result = await agent.run("你的问题")
```

**文件日志功能:**
- 文件大小超过 10MB 时自动轮转
- 保留最近 7 天的日志
- 自动压缩旧日志为 .zip 格式

详细使用方法请参考 [logger.py](https://github.com/shibing624/WebResearcher/blob/main/webresearcher/logger.py)。

## 🎯 功能特性

### 核心特性

- ✅ **迭代综合**: 通过周期性报告更新防止上下文溢出
- ✅ **无界深度**: 几乎无限的研究轮次
- ✅ **智能 Token 管理**: 自动上下文修剪和压缩
- ✅ **强大的错误处理**: 重试逻辑、回退策略、强制答案生成
- ✅ **异步支持**: 非阻塞 I/O 提升性能
- ✅ **类型安全**: 全面的类型提示

### 工具特性

- ✅ **网页搜索**: 通过 Serper 集成 Google 搜索
- ✅ **学术搜索**: Google Scholar 查询研究论文
- ✅ **网页抓取**: 智能内容提取
- ✅ **代码执行**: 沙盒 Python 解释器
- ✅ **文件处理**: 支持 PDF、DOCX、CSV、Excel 等
- ✅ **可扩展**: 轻松创建自定义工具

### 生产特性

- ✅ **零框架锁定**: 无 qwen-agent 等类似依赖
- ✅ **轻量级**: 仅 59KB wheel 包
- ✅ **文档完善**: 全面的文档字符串和示例
- ✅ **CLI + API**: 支持命令行和 Python 调用
- ✅ **可配置**: 丰富的配置选项
- ✅ **日志记录**: 使用 loguru 的丰富日志

## 📊 性能表现

基于论文的评估结果:

- **HotpotQA**: 在多跳推理任务上表现优异
- **Bamboogle**: 在复杂事实问题上表现出色
- **上下文管理**: 即使 50+ 轮后仍保持精简的工作空间
- **准确性**: 与基线 Agent 相当或超越

<p align="center">
  <img src="https://github.com/shibing624/WebResearcher/blob/main/docs/performance.png" alt="性能表现" width="90%"/>
</p>

## 🔧 配置

### 环境变量

```bash
# 必需
OPENAI_API_KEY=sk-...              # OpenAI API 密钥
SERPER_API_KEY=...                 # Serper API(Google 搜索)

# 可选
OPENAI_BASE_URL=https://...        # 自定义 OpenAI 端点
JINA_API_KEY=...                   # Jina AI(网页抓取)
SANDBOX_FUSION_ENDPOINTS=...       # 代码执行沙盒
MAX_LLM_CALL_PER_RUN=50           # 每次研究的最大迭代次数
FILE_DIR=./files                   # 文件存储目录
```

### LLM 配置

```python
llm_config = {
    "model": "gpt-4o",              # 或: o3-mini, gpt-4-turbo 等
    "generate_cfg": {
        "temperature": 0.6,          # 采样温度 (0.0-2.0)
        "top_p": 0.95,              # 核采样
        "presence_penalty": 1.1,     # 重复惩罚
        "model_thinking_type": "enabled"  # enabled|disabled|auto
    },
    "max_input_tokens": 32000,      # 上下文窗口限制
    "llm_timeout": 300.0,           # LLM API 超时(秒)
    "agent_timeout": 600.0,         # Agent 总超时(秒)
}
```

## 📝 示例

查看 [examples/](./examples/) 目录获取完整示例:

- **[basic_usage.py](./examples/basic_usage.py)** - WebResearcher 入门
- **[batch_research.py](./examples/batch_research.py)** - 批量处理多个问题
- **[custom_agent.py](./examples/custom_agent.py)** - 创建自定义工具

## 🧪 测试

```bash
# 安装开发依赖
pip install -e ".[dev]"

# 运行测试
pytest

# 运行覆盖率测试
pytest --cov=webresearcher
```

## 🤝 参与贡献

我们欢迎各种形式的贡献!

贡献方式:
- 🐛 报告 Bug
- 💡 提出新功能建议
- 📝 改进文档
- 🔧 提交 Pull Request

详细指南请查看 [CONTRIBUTING.md](./CONTRIBUTING.md)。

## 📧 联系方式

- **GitHub Issues**: [报告问题或功能请求](https://github.com/shibing624/WebResearcher/issues)
- **邮箱**: xuming624@qq.com
- **微信**: xuming624(备注:姓名-公司-NLP)

<p align="center">
  <img src="https://github.com/shibing624/WebResearcher/blob/main/docs/wechat.jpeg" width="200" />
</p>

## 🌟 Star 历史

[![Star History Chart](https://api.star-history.com/svg?repos=shibing624/WebResearcher&type=Date)](https://star-history.com/#shibing624/WebResearcher&Date)

## 📑 引用

如果您在研究中使用了 WebResearcher,请引用:

```bibtex
@misc{qiao2025webresearcher,
    title={WebResearcher: Unleashing unbounded reasoning capability in Long-Horizon Agents}, 
    author={Zile Qiao and Guoxin Chen and Xuanzhong Chen and Donglei Yu and Wenbiao Yin and Xinyu Wang and Zhen Zhang and Baixuan Li and Huifeng Yin and Kuan Li and Rui Min and Minpeng Liao and Yong Jiang and Pengjun Xie and Fei Huang and Jingren Zhou},
    year={2025},
    eprint={2509.13309},
    archivePrefix={arXiv},
    primaryClass={cs.CL},
    url={https://arxiv.org/abs/2509.13309}, 
}
```

## 📄 许可证

本项目采用 [Apache License 2.0](./LICENSE) 许可证 - 可免费用于商业用途。

## 🙏 致谢

本项目受以下研究启发并在此基础上构建:

- **[WebResearcher 论文](https://arxiv.org/abs/2509.13309)** by Qiao et al.
- **[Alibaba-NLP/DeepResearch](https://github.com/Alibaba-NLP/DeepResearch)** - 原始研究实现

特别感谢论文作者在迭代研究范式上的开创性工作!


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/shibing624/WebResearcher",
    "name": "webresearcher",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "research, agent, ai, llm, iterative-research, deep-research, web-research",
    "author": "XuMing",
    "author_email": "XuMing <xuming624@qq.com>",
    "download_url": "https://files.pythonhosted.org/packages/8e/47/5a30c94e2ba01757bb0817a9f1e2d3fbe6bfb190b39a4dcea161280f2807/webresearcher-0.2.2.tar.gz",
    "platform": null,
    "description": "[**\ud83c\udde8\ud83c\uddf3\u4e2d\u6587**](https://github.com/shibing624/webresearcher/blob/main/README.md) | [**\ud83c\udf10English**](https://github.com/shibing624/webresearcher/blob/main/README_EN.md) \n\n\n<p align=\"center\">\n  <img src=\"./docs/webresearcher.jpg\" alt=\"WebResearcher Logo\" height=\"150\" alt=\"Logo\"/>\n</p>\n\n---\n\n# WebResearcher: An Iterative Deep-Research Agent\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/webresearcher/\"><img src=\"https://img.shields.io/pypi/v/webresearcher.svg\" alt=\"PyPI version\"></a>\n  <a href=\"https://pepy.tech/project/webresearcher\"><img src=\"https://static.pepy.tech/badge/webresearcher\" alt=\"Downloads\"></a>\n  <a href=\"https://github.com/shibing624/WebResearcher/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/shibing624/WebResearcher.svg\" alt=\"License\"></a>\n  <a href=\"https://pypi.org/project/webresearcher/\"><img src=\"https://img.shields.io/badge/Python-3.10%2B-green.svg\" alt=\"Python versions\"></a>\n  <a href=\"https://arxiv.org/abs/2509.13309\"><img src=\"https://img.shields.io/badge/arXiv-2509.13309-b31b1b.svg\" alt=\"arXiv\"></a>\n  <a href=\"https://github.com/shibing624/WebResearcher\"><img src=\"https://img.shields.io/badge/wechat-group-green.svg?logo=wechat\" alt=\"Wechat Group\"></a>\n</p>\n\n- \ud83e\udde0 **\u8fed\u4ee3\u6df1\u5ea6\u7814\u7a76**: \u901a\u8fc7\u5468\u671f\u6027\u7efc\u5408\u9632\u6b62\u4e0a\u4e0b\u6587\u6ea2\u51fa\u7684\u65b0\u578b\u8303\u5f0f\n- \ud83d\udd04 **\u65e0\u754c\u63a8\u7406**: \u901a\u8fc7\u6f14\u5316\u62a5\u544a\u5b9e\u73b0\u51e0\u4e4e\u65e0\u9650\u7684\u7814\u7a76\u6df1\u5ea6\n- \ud83d\udee0\ufe0f **\u4e30\u5bcc\u5de5\u5177\u751f\u6001**: \u7f51\u9875\u641c\u7d22\u3001\u5b66\u672f\u8bba\u6587\u3001\u4ee3\u7801\u6267\u884c\u3001\u6587\u4ef6\u89e3\u6790\n- \ud83c\udfaf **\u751f\u4ea7\u5c31\u7eea**: \u96f6\u5916\u90e8 Agent \u6846\u67b6\u4f9d\u8d56\uff0c\u5b8c\u5168\u81ea\u5305\u542b\n- \u26a1 **\u9ad8\u6027\u80fd**: \u5f02\u6b65\u4f18\u5148\u8bbe\u8ba1\uff0c\u667a\u80fd Token \u7ba1\u7406\uff0c\u5f3a\u5927\u7684\u9519\u8bef\u5904\u7406\n- \ud83c\udfa8 **\u6613\u4e8e\u4f7f\u7528**: \u7b80\u6d01\u7684 CLI\u3001\u6e05\u6670\u7684 Python API\u3001\u4e30\u5bcc\u7684\u793a\u4f8b\n\n## \ud83d\udcd6 \u7b80\u4ecb\n\n**WebResearcher** \u662f\u8fed\u4ee3\u5f0f\u6df1\u5ea6\u7814\u7a76\u667a\u80fd\u4f53\uff0c\u57fa\u4e8e **IterResearch \u8303\u5f0f**\u6784\u5efa\u7684\u81ea\u4e3b\u7814\u7a76\u667a\u80fd\u4f53\uff0c\u65e8\u5728\u6a21\u62df\u4e13\u5bb6\u7ea7\u522b\u7684\u7814\u7a76\u5de5\u4f5c\u6d41\u3002\u4e0e\u906d\u53d7\u4e0a\u4e0b\u6587\u6ea2\u51fa\u548c\u566a\u97f3\u7d2f\u79ef\u56f0\u6270\u7684\u4f20\u7edf Agent \u4e0d\u540c\uff0cWebResearcher \u5c06\u7814\u7a76\u5206\u89e3\u4e3a\u79bb\u6563\u7684\u8f6e\u6b21\uff0c\u5e76\u8fdb\u884c\u8fed\u4ee3\u7efc\u5408\u3002\n\n### \u4f20\u7edf Agent \u7684\u95ee\u9898\n\n\u5f53\u524d\u7684\u5f00\u6e90\u7814\u7a76 Agent \u4f9d\u8d56\u4e8e**\u5355\u4e0a\u4e0b\u6587\u3001\u7ebf\u6027\u7d2f\u79ef**\u6a21\u5f0f\uff1a\n\n1. **\ud83d\udeab \u8ba4\u77e5\u5de5\u4f5c\u7a7a\u95f4\u7a92\u606f**: \u4e0d\u65ad\u81a8\u80c0\u7684\u4e0a\u4e0b\u6587\u9650\u5236\u4e86\u6df1\u5ea6\u63a8\u7406\u80fd\u529b\n2. **\ud83d\udeab \u4e0d\u53ef\u9006\u7684\u566a\u97f3\u6c61\u67d3**: \u9519\u8bef\u548c\u65e0\u5173\u4fe1\u606f\u4e0d\u65ad\u7d2f\u79ef\n3. **\ud83d\udeab \u7f3a\u4e4f\u5468\u671f\u6027\u7efc\u5408**: \u65e0\u6cd5\u6682\u505c\u4ee5\u63d0\u70bc\u3001\u91cd\u65b0\u8bc4\u4f30\u548c\u6218\u7565\u6027\u89c4\u5212\n\n### WebResearcher \u7684\u89e3\u51b3\u65b9\u6848\n\nWebResearcher \u5b9e\u73b0\u4e86 **IterResearch \u8303\u5f0f**\uff0c\u6bcf\u8f6e\u901a\u8fc7**\u5355\u6b21 LLM \u8c03\u7528**\u540c\u65f6\u751f\u6210\uff1a\n\n- **Think\uff08\u601d\u8003\uff09**: \u5185\u90e8\u63a8\u7406\u548c\u5206\u6790\n- **Report\uff08\u62a5\u544a\uff09**: \u7efc\u5408\u6240\u6709\u53d1\u73b0\u7684\u66f4\u65b0\u7814\u7a76\u6458\u8981\n- **Action\uff08\u884c\u52a8\uff09**: \u5de5\u5177\u8c03\u7528\u6216\u6700\u7ec8\u7b54\u6848\n\n\u8fd9\u79cd**\u4e00\u6b65\u5f0f\u65b9\u6cd5**\uff08\u76f8\u6bd4\u4f20\u7edf\u7684\u4e24\u6b65\u5f0f\"\u601d\u8003\u2192\u884c\u52a8\u2192\u7efc\u5408\"\uff09\u5e26\u6765\u4e86\uff1a\n- \u26a1 **\u901f\u5ea6\u63d0\u5347 50%** - \u6bcf\u8f6e\u53ea\u9700\u4e00\u6b21 LLM \u8c03\u7528\u800c\u975e\u4e24\u6b21\n- \ud83d\udcb0 **\u6210\u672c\u964d\u4f4e 40%** - \u51cf\u5c11 Token \u4f7f\u7528\u91cf\n- \ud83e\udde0 **\u63a8\u7406\u66f4\u4f18** - Think\u3001Report \u548c Action \u5728\u7edf\u4e00\u4e0a\u4e0b\u6587\u4e2d\u751f\u6210\n\n\u8fd9\u5b9e\u73b0\u4e86**\u65e0\u754c\u7684\u7814\u7a76\u6df1\u5ea6**\uff0c\u540c\u65f6\u4fdd\u6301\u7cbe\u7b80\u3001\u805a\u7126\u7684\u8ba4\u77e5\u5de5\u4f5c\u7a7a\u95f4\u3002\n\n<p align=\"center\">\n  <img src=\"https://github.com/shibing624/WebResearcher/blob/main/docs/iterresearch.png\" alt=\"\u8303\u5f0f\u5bf9\u6bd4\" width=\"100%\"/>\n  <br>\n  <em>\u56fe\uff1a\u5355\u4e0a\u4e0b\u6587\u8303\u5f0f\uff08\u4e0a\uff09vs. \u8fed\u4ee3\u6df1\u5ea6\u7814\u7a76\u8303\u5f0f\uff08\u4e0b\uff09</em>\n</p>\n\n## \ud83c\udfd7\ufe0f \u67b6\u6784\n\n### \u6838\u5fc3\u7ec4\u4ef6\n\n**IterResearch \u8303\u5f0f - \u6bcf\u8f6e\u5355\u6b21 LLM \u8c03\u7528\uff1a**\n\n```python\n\u7b2c i \u8f6e:\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  \u5de5\u4f5c\u7a7a\u95f4\u72b6\u6001: (\u95ee\u9898, \u62a5\u544a_{i-1}, \u7ed3\u679c_{i-1})              \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                          \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  \u5355\u6b21 LLM \u8c03\u7528 \u2192 \u540c\u65f6\u751f\u6210\u4e09\u90e8\u5206\uff1a                          \u2502\n\u2502  \u251c\u2500 <think>: \u5206\u6790\u5f53\u524d\u72b6\u6001                                \u2502\n\u2502  \u251c\u2500 <report>: \u7efc\u5408\u6240\u6709\u53d1\u73b0\u7684\u66f4\u65b0\u62a5\u544a                      \u2502\n\u2502  \u2514\u2500 <tool_call> \u6216 <answer>: \u4e0b\u4e00\u6b65\u884c\u52a8                  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                          \u2193\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  \u5982\u679c\u662f <tool_call>: \u6267\u884c\u5de5\u5177                             \u2502\n\u2502  \u5982\u679c\u662f <answer>: \u8fd4\u56de\u6700\u7ec8\u7b54\u6848                            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                          \u2193\n           \u4f7f\u7528\u66f4\u65b0\u540e\u7684\u62a5\u544a\u548c\u5de5\u5177\u7ed3\u679c\u8fdb\u5165\u4e0b\u4e00\u8f6e\n```\n\n**\u6838\u5fc3\u4f18\u52bf**: \u62a5\u544a\u5728\u51b3\u5b9a\u4e0b\u4e00\u6b65\u884c\u52a8*\u4e4b\u524d*\u5c31\u5df2\u5b8c\u6210\u7efc\u5408\uff0c\u786e\u4fdd\u5728\u7edf\u4e00\u4e0a\u4e0b\u6587\u4e2d\u8fdb\u884c\u8fde\u8d2f\u63a8\u7406\u3002\n\n### \u53ef\u7528\u5de5\u5177\n\n| \u5de5\u5177 | \u63cf\u8ff0 | \u4f7f\u7528\u573a\u666f |\n|------|------|----------|\n| `search` | \u901a\u8fc7 Serper API \u7684 Google \u641c\u7d22 | \u901a\u7528\u7f51\u9875\u4fe1\u606f |\n| `google_scholar` | \u5b66\u672f\u8bba\u6587\u641c\u7d22 | \u79d1\u7814\u6587\u732e\u67e5\u8be2 |\n| `visit` | \u7f51\u9875\u5185\u5bb9\u63d0\u53d6 | \u6df1\u5ea6\u5185\u5bb9\u5206\u6790 |\n| `PythonInterpreter` | \u6c99\u76d2\u4ee3\u7801\u6267\u884c | \u6570\u636e\u5206\u6790\u3001\u8ba1\u7b97 |\n| `parse_file` | \u591a\u683c\u5f0f\u6587\u4ef6\u89e3\u6790\u5668 | \u6587\u6863\u5904\u7406 |\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\n\n```bash\npip install webresearcher\n```\n\n### \u57fa\u7840\u4f7f\u7528\n\n```bash\n# \u8bbe\u7f6e API \u5bc6\u94a5\nexport OPENAI_API_KEY=\"your_key\"\nexport SERPER_API_KEY=\"your_key\"\n\n# \u8fd0\u884c\u7814\u7a76\u67e5\u8be2\nwebresearcher \"\u5218\u7fd4\u7834\u7eaa\u5f55\u65f6\u5019\u662f\u591a\u5c11\u5c81?\"\n```\n\n### Python API\n\n```python\nimport asyncio\nfrom webresearcher import WebResearcherAgent\n\n# \u914d\u7f6e\nllm_config = {\n    \"model\": \"gpt-4o\",\n    \"generate_cfg\": {\"temperature\": 0.6}\n}\n\n# \u521b\u5efa Agent\nagent = WebResearcherAgent(\n    llm_config=llm_config,\n    function_list=[\"search\", \"google_scholar\", \"PythonInterpreter\"]\n)\n\n# \u5f00\u59cb\u7814\u7a76\nasync def main():\n    result = await agent.run(\"\u60a8\u7684\u7814\u7a76\u95ee\u9898\")\n    print(result['prediction'])\n\nasyncio.run(main())\n```\n\n## \ud83d\udcda \u9ad8\u7ea7\u7528\u6cd5\n\n### \u6d4b\u8bd5\u65f6\u6269\u5c55 (TTS)\n\n\u5bf9\u4e8e\u9700\u8981\u6700\u9ad8\u51c6\u786e\u6027\u7684\u5173\u952e\u95ee\u9898\uff0c\u4f7f\u7528 TTS \u6a21\u5f0f\uff083-5\u500d\u6210\u672c\uff09\uff1a\n\n```bash\nwebresearcher \"\u590d\u6742\u95ee\u9898\" --use-tts --num-agents 3\n```\n\n```python\nfrom webresearcher import TestTimeScalingAgent\n\nagent = TestTimeScalingAgent(llm_config, function_list)\nresult = await agent.run(\"\u590d\u6742\u95ee\u9898\", num_parallel_agents=3)\n```\n\n### \u81ea\u5b9a\u4e49\u5de5\u5177\n\n\u901a\u8fc7\u7ee7\u627f `BaseTool` \u521b\u5efa\u60a8\u81ea\u5df1\u7684\u5de5\u5177\uff1a\n\n```python\nfrom webresearcher import BaseTool, WebResearcherAgent, TOOL_MAP\n\nclass MyCustomTool(BaseTool):\n    name = \"my_tool\"\n    description = \"\u5de5\u5177\u529f\u80fd\u63cf\u8ff0\"\n    parameters = {\"type\": \"object\", \"properties\": {...}}\n    \n    def call(self, params, **kwargs):\n        # \u60a8\u7684\u5de5\u5177\u903b\u8f91\n        return \"\u7ed3\u679c\"\n\n# \u6ce8\u518c\u5e76\u4f7f\u7528\nTOOL_MAP['my_tool'] = MyCustomTool()\nagent = WebResearcherAgent(llm_config, function_list=[\"my_tool\", \"search\"])\n```\n\n\u67e5\u770b [examples/custom_agent.py](./examples/custom_agent.py) \u83b7\u53d6\u5b8c\u6574\u793a\u4f8b\u3002\n\n### \u6279\u91cf\u5904\u7406\n\n\u9ad8\u6548\u5904\u7406\u591a\u4e2a\u95ee\u9898\uff1a\n\n```python\nfrom webresearcher import WebResearcherAgent\n\nquestions = [\"\u95ee\u9898 1\", \"\u95ee\u9898 2\", \"\u95ee\u9898 3\"]\nagent = WebResearcherAgent(llm_config)\n\nfor question in questions:\n    result = await agent.run(question)\n    print(f\"Q: {question}\\nA: {result['prediction']}\\n\")\n```\n\n\u67e5\u770b [examples/batch_research.py](./examples/batch_research.py) \u83b7\u53d6\u9ad8\u7ea7\u6279\u91cf\u5904\u7406\u793a\u4f8b\u3002\n\n### Python \u89e3\u91ca\u5668\u914d\u7f6e\n\n`PythonInterpreter` \u5de5\u5177\u652f\u6301\u4e24\u79cd\u6267\u884c\u6a21\u5f0f\uff1a\n\n**1. \u6c99\u7bb1\u6a21\u5f0f\uff08\u751f\u4ea7\u73af\u5883\u63a8\u8350\uff09\uff1a**\n```bash\n# \u914d\u7f6e\u6c99\u7bb1\u7aef\u70b9\nexport SANDBOX_FUSION_ENDPOINTS=\"http://your-sandbox-endpoint.com\"\n```\n\n**2. \u672c\u5730\u6a21\u5f0f\uff08\u81ea\u52a8\u964d\u7ea7\uff09\uff1a**\n- \u5f53\u672a\u914d\u7f6e `SANDBOX_FUSION_ENDPOINTS` \u65f6\uff0c\u4ee3\u7801\u5728\u672c\u5730\u6267\u884c\n- \u9002\u7528\u4e8e\u5f00\u53d1\u548c\u6d4b\u8bd5\n- \u26a0\ufe0f **\u8b66\u544a**\uff1a\u672c\u5730\u6267\u884c\u4f1a\u5728\u5f53\u524d Python \u73af\u5883\u4e2d\u8fd0\u884c\u4ee3\u7801\n\n```python\nfrom webresearcher import PythonInterpreter\n\n# \u5982\u679c\u914d\u7f6e\u4e86\u6c99\u7bb1\u5219\u4f7f\u7528\u6c99\u7bb1\uff0c\u5426\u5219\u964d\u7ea7\u5230\u672c\u5730\u6267\u884c\ninterpreter = PythonInterpreter()\nresult = interpreter.call({'code': 'print(\"Hello, World!\")'})\n```\n\n\u8be6\u7ec6\u793a\u4f8b\u8bf7\u53c2\u8003 [examples/python_interpreter_example.py](./examples/python_interpreter_example.py)\u3002\n\n### \u65e5\u5fd7\u7ba1\u7406\n\nWebResearcher \u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u65e5\u5fd7\u7ba1\u7406\u7cfb\u7edf\uff0c\u53ef\u4ee5\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u6216\u7f16\u7a0b\u65b9\u5f0f\u63a7\u5236\u65e5\u5fd7\u7ea7\u522b\uff1a\n\n**\u901a\u8fc7\u73af\u5883\u53d8\u91cf\uff1a**\n\n```bash\n# \u8fd0\u884c\u524d\u8bbe\u7f6e\u65e5\u5fd7\u7ea7\u522b\nexport WEBRESEARCHER_LOG_LEVEL=DEBUG  # \u9009\u9879\uff1aDEBUG, INFO, WARNING, ERROR, CRITICAL\nwebresearcher \"\u4f60\u7684\u95ee\u9898\"\n```\n\n**\u7f16\u7a0b\u65b9\u5f0f\uff1a**\n\n```python\nfrom webresearcher import set_log_level, add_file_logger\n\n# \u8bbe\u7f6e\u63a7\u5236\u53f0\u65e5\u5fd7\u7ea7\u522b\nset_log_level(\"WARNING\")  # \u53ea\u663e\u793a\u8b66\u544a\u548c\u9519\u8bef\n\n# \u6dfb\u52a0\u6587\u4ef6\u65e5\u5fd7\uff0c\u652f\u6301\u81ea\u52a8\u8f6e\u8f6c\nadd_file_logger(\"research.log\", level=\"DEBUG\")\n\n# \u73b0\u5728\u6267\u884c\u7814\u7a76\nagent = WebResearcherAgent(llm_config)\nresult = await agent.run(\"\u4f60\u7684\u95ee\u9898\")\n```\n\n**\u6587\u4ef6\u65e5\u5fd7\u529f\u80fd\uff1a**\n- \u6587\u4ef6\u5927\u5c0f\u8d85\u8fc7 10MB \u65f6\u81ea\u52a8\u8f6e\u8f6c\n- \u4fdd\u7559\u6700\u8fd1 7 \u5929\u7684\u65e5\u5fd7\n- \u81ea\u52a8\u538b\u7f29\u65e7\u65e5\u5fd7\u4e3a .zip \u683c\u5f0f\n\n\u8be6\u7ec6\u4f7f\u7528\u65b9\u6cd5\u8bf7\u53c2\u8003 [logger.py](https://github.com/shibing624/WebResearcher/blob/main/webresearcher/logger.py)\u3002\n\n## \ud83c\udfaf \u529f\u80fd\u7279\u6027\n\n### \u6838\u5fc3\u7279\u6027\n\n- \u2705 **\u8fed\u4ee3\u7efc\u5408**: \u901a\u8fc7\u5468\u671f\u6027\u62a5\u544a\u66f4\u65b0\u9632\u6b62\u4e0a\u4e0b\u6587\u6ea2\u51fa\n- \u2705 **\u65e0\u754c\u6df1\u5ea6**: \u51e0\u4e4e\u65e0\u9650\u7684\u7814\u7a76\u8f6e\u6b21\n- \u2705 **\u667a\u80fd Token \u7ba1\u7406**: \u81ea\u52a8\u4e0a\u4e0b\u6587\u4fee\u526a\u548c\u538b\u7f29\n- \u2705 **\u5f3a\u5927\u7684\u9519\u8bef\u5904\u7406**: \u91cd\u8bd5\u903b\u8f91\u3001\u56de\u9000\u7b56\u7565\u3001\u5f3a\u5236\u7b54\u6848\u751f\u6210\n- \u2705 **\u5f02\u6b65\u652f\u6301**: \u975e\u963b\u585e I/O \u63d0\u5347\u6027\u80fd\n- \u2705 **\u7c7b\u578b\u5b89\u5168**: \u5168\u9762\u7684\u7c7b\u578b\u63d0\u793a\n\n### \u5de5\u5177\u7279\u6027\n\n- \u2705 **\u7f51\u9875\u641c\u7d22**: \u901a\u8fc7 Serper \u96c6\u6210 Google \u641c\u7d22\n- \u2705 **\u5b66\u672f\u641c\u7d22**: Google Scholar \u67e5\u8be2\u7814\u7a76\u8bba\u6587\n- \u2705 **\u7f51\u9875\u6293\u53d6**: \u667a\u80fd\u5185\u5bb9\u63d0\u53d6\n- \u2705 **\u4ee3\u7801\u6267\u884c**: \u6c99\u76d2 Python \u89e3\u91ca\u5668\n- \u2705 **\u6587\u4ef6\u5904\u7406**: \u652f\u6301 PDF\u3001DOCX\u3001CSV\u3001Excel \u7b49\n- \u2705 **\u53ef\u6269\u5c55**: \u8f7b\u677e\u521b\u5efa\u81ea\u5b9a\u4e49\u5de5\u5177\n\n### \u751f\u4ea7\u7279\u6027\n\n- \u2705 **\u96f6\u6846\u67b6\u9501\u5b9a**: \u65e0 qwen-agent \u7b49\u7c7b\u4f3c\u4f9d\u8d56\n- \u2705 **\u8f7b\u91cf\u7ea7**: \u4ec5 59KB wheel \u5305\n- \u2705 **\u6587\u6863\u5b8c\u5584**: \u5168\u9762\u7684\u6587\u6863\u5b57\u7b26\u4e32\u548c\u793a\u4f8b\n- \u2705 **CLI + API**: \u652f\u6301\u547d\u4ee4\u884c\u548c Python \u8c03\u7528\n- \u2705 **\u53ef\u914d\u7f6e**: \u4e30\u5bcc\u7684\u914d\u7f6e\u9009\u9879\n- \u2705 **\u65e5\u5fd7\u8bb0\u5f55**: \u4f7f\u7528 loguru \u7684\u4e30\u5bcc\u65e5\u5fd7\n\n## \ud83d\udcca \u6027\u80fd\u8868\u73b0\n\n\u57fa\u4e8e\u8bba\u6587\u7684\u8bc4\u4f30\u7ed3\u679c\uff1a\n\n- **HotpotQA**: \u5728\u591a\u8df3\u63a8\u7406\u4efb\u52a1\u4e0a\u8868\u73b0\u4f18\u5f02\n- **Bamboogle**: \u5728\u590d\u6742\u4e8b\u5b9e\u95ee\u9898\u4e0a\u8868\u73b0\u51fa\u8272\n- **\u4e0a\u4e0b\u6587\u7ba1\u7406**: \u5373\u4f7f 50+ \u8f6e\u540e\u4ecd\u4fdd\u6301\u7cbe\u7b80\u7684\u5de5\u4f5c\u7a7a\u95f4\n- **\u51c6\u786e\u6027**: \u4e0e\u57fa\u7ebf Agent \u76f8\u5f53\u6216\u8d85\u8d8a\n\n<p align=\"center\">\n  <img src=\"https://github.com/shibing624/WebResearcher/blob/main/docs/performance.png\" alt=\"\u6027\u80fd\u8868\u73b0\" width=\"90%\"/>\n</p>\n\n## \ud83d\udd27 \u914d\u7f6e\n\n### \u73af\u5883\u53d8\u91cf\n\n```bash\n# \u5fc5\u9700\nOPENAI_API_KEY=sk-...              # OpenAI API \u5bc6\u94a5\nSERPER_API_KEY=...                 # Serper API\uff08Google \u641c\u7d22\uff09\n\n# \u53ef\u9009\nOPENAI_BASE_URL=https://...        # \u81ea\u5b9a\u4e49 OpenAI \u7aef\u70b9\nJINA_API_KEY=...                   # Jina AI\uff08\u7f51\u9875\u6293\u53d6\uff09\nSANDBOX_FUSION_ENDPOINTS=...       # \u4ee3\u7801\u6267\u884c\u6c99\u76d2\nMAX_LLM_CALL_PER_RUN=50           # \u6bcf\u6b21\u7814\u7a76\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6570\nFILE_DIR=./files                   # \u6587\u4ef6\u5b58\u50a8\u76ee\u5f55\n```\n\n### LLM \u914d\u7f6e\n\n```python\nllm_config = {\n    \"model\": \"gpt-4o\",              # \u6216: o3-mini, gpt-4-turbo \u7b49\n    \"generate_cfg\": {\n        \"temperature\": 0.6,          # \u91c7\u6837\u6e29\u5ea6 (0.0-2.0)\n        \"top_p\": 0.95,              # \u6838\u91c7\u6837\n        \"presence_penalty\": 1.1,     # \u91cd\u590d\u60e9\u7f5a\n        \"model_thinking_type\": \"enabled\"  # enabled|disabled|auto\n    },\n    \"max_input_tokens\": 32000,      # \u4e0a\u4e0b\u6587\u7a97\u53e3\u9650\u5236\n    \"llm_timeout\": 300.0,           # LLM API \u8d85\u65f6\uff08\u79d2\uff09\n    \"agent_timeout\": 600.0,         # Agent \u603b\u8d85\u65f6\uff08\u79d2\uff09\n}\n```\n\n## \ud83d\udcdd \u793a\u4f8b\n\n\u67e5\u770b [examples/](./examples/) \u76ee\u5f55\u83b7\u53d6\u5b8c\u6574\u793a\u4f8b\uff1a\n\n- **[basic_usage.py](./examples/basic_usage.py)** - WebResearcher \u5165\u95e8\n- **[batch_research.py](./examples/batch_research.py)** - \u6279\u91cf\u5904\u7406\u591a\u4e2a\u95ee\u9898\n- **[custom_agent.py](./examples/custom_agent.py)** - \u521b\u5efa\u81ea\u5b9a\u4e49\u5de5\u5177\n\n## \ud83e\uddea \u6d4b\u8bd5\n\n```bash\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\npip install -e \".[dev]\"\n\n# \u8fd0\u884c\u6d4b\u8bd5\npytest\n\n# \u8fd0\u884c\u8986\u76d6\u7387\u6d4b\u8bd5\npytest --cov=webresearcher\n```\n\n## \ud83e\udd1d \u53c2\u4e0e\u8d21\u732e\n\n\u6211\u4eec\u6b22\u8fce\u5404\u79cd\u5f62\u5f0f\u7684\u8d21\u732e\uff01\n\n\u8d21\u732e\u65b9\u5f0f\uff1a\n- \ud83d\udc1b \u62a5\u544a Bug\n- \ud83d\udca1 \u63d0\u51fa\u65b0\u529f\u80fd\u5efa\u8bae\n- \ud83d\udcdd \u6539\u8fdb\u6587\u6863\n- \ud83d\udd27 \u63d0\u4ea4 Pull Request\n\n\u8be6\u7ec6\u6307\u5357\u8bf7\u67e5\u770b [CONTRIBUTING.md](./CONTRIBUTING.md)\u3002\n\n## \ud83d\udce7 \u8054\u7cfb\u65b9\u5f0f\n\n- **GitHub Issues**: [\u62a5\u544a\u95ee\u9898\u6216\u529f\u80fd\u8bf7\u6c42](https://github.com/shibing624/WebResearcher/issues)\n- **\u90ae\u7bb1**: xuming624@qq.com\n- **\u5fae\u4fe1**: xuming624\uff08\u5907\u6ce8\uff1a\u59d3\u540d-\u516c\u53f8-NLP\uff09\n\n<p align=\"center\">\n  <img src=\"https://github.com/shibing624/WebResearcher/blob/main/docs/wechat.jpeg\" width=\"200\" />\n</p>\n\n## \ud83c\udf1f Star \u5386\u53f2\n\n[![Star History Chart](https://api.star-history.com/svg?repos=shibing624/WebResearcher&type=Date)](https://star-history.com/#shibing624/WebResearcher&Date)\n\n## \ud83d\udcd1 \u5f15\u7528\n\n\u5982\u679c\u60a8\u5728\u7814\u7a76\u4e2d\u4f7f\u7528\u4e86 WebResearcher\uff0c\u8bf7\u5f15\u7528\uff1a\n\n```bibtex\n@misc{qiao2025webresearcher,\n    title={WebResearcher: Unleashing unbounded reasoning capability in Long-Horizon Agents}, \n    author={Zile Qiao and Guoxin Chen and Xuanzhong Chen and Donglei Yu and Wenbiao Yin and Xinyu Wang and Zhen Zhang and Baixuan Li and Huifeng Yin and Kuan Li and Rui Min and Minpeng Liao and Yong Jiang and Pengjun Xie and Fei Huang and Jingren Zhou},\n    year={2025},\n    eprint={2509.13309},\n    archivePrefix={arXiv},\n    primaryClass={cs.CL},\n    url={https://arxiv.org/abs/2509.13309}, \n}\n```\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 [Apache License 2.0](./LICENSE) \u8bb8\u53ef\u8bc1 - \u53ef\u514d\u8d39\u7528\u4e8e\u5546\u4e1a\u7528\u9014\u3002\n\n## \ud83d\ude4f \u81f4\u8c22\n\n\u672c\u9879\u76ee\u53d7\u4ee5\u4e0b\u7814\u7a76\u542f\u53d1\u5e76\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\uff1a\n\n- **[WebResearcher \u8bba\u6587](https://arxiv.org/abs/2509.13309)** by Qiao et al.\n- **[Alibaba-NLP/DeepResearch](https://github.com/Alibaba-NLP/DeepResearch)** - \u539f\u59cb\u7814\u7a76\u5b9e\u73b0\n\n\u7279\u522b\u611f\u8c22\u8bba\u6587\u4f5c\u8005\u5728\u8fed\u4ee3\u7814\u7a76\u8303\u5f0f\u4e0a\u7684\u5f00\u521b\u6027\u5de5\u4f5c\uff01\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "An Iterative Deep-Research Agent with unbounded reasoning capability",
    "version": "0.2.2",
    "project_urls": {
        "Bug Reports": "https://github.com/shibing624/WebResearcher/issues",
        "Documentation": "https://github.com/shibing624/WebResearcher#readme",
        "Homepage": "https://github.com/shibing624/WebResearcher",
        "Repository": "https://github.com/shibing624/WebResearcher"
    },
    "split_keywords": [
        "research",
        " agent",
        " ai",
        " llm",
        " iterative-research",
        " deep-research",
        " web-research"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8e475a30c94e2ba01757bb0817a9f1e2d3fbe6bfb190b39a4dcea161280f2807",
                "md5": "f6d9dea7401d46b073ddc980e6569540",
                "sha256": "3d714ba4966d0cda054c5b8c1f8325dfda1e24ca15d09d507cbeaf6409d3c5a2"
            },
            "downloads": -1,
            "filename": "webresearcher-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "f6d9dea7401d46b073ddc980e6569540",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 58686,
            "upload_time": "2025-10-27T05:10:50",
            "upload_time_iso_8601": "2025-10-27T05:10:50.462176Z",
            "url": "https://files.pythonhosted.org/packages/8e/47/5a30c94e2ba01757bb0817a9f1e2d3fbe6bfb190b39a4dcea161280f2807/webresearcher-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-27 05:10:50",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "shibing624",
    "github_project": "WebResearcher",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "requests",
            "specs": []
        },
        {
            "name": "loguru",
            "specs": []
        },
        {
            "name": "tiktoken",
            "specs": []
        },
        {
            "name": "openai",
            "specs": []
        },
        {
            "name": "pydantic",
            "specs": []
        },
        {
            "name": "json5",
            "specs": []
        },
        {
            "name": "pandas",
            "specs": []
        },
        {
            "name": "tabulate",
            "specs": []
        },
        {
            "name": "pillow",
            "specs": []
        },
        {
            "name": "sandbox-fusion",
            "specs": []
        },
        {
            "name": "python-dotenv",
            "specs": []
        }
    ],
    "lcname": "webresearcher"
}
        
Elapsed time: 1.20293s