🩺 Doctor
](https://github.com/sisig-ai/doctor)   
一种用于发现、抓取和索引网站的工具,这些网站将作为LLM代理的MCP服务器公开,以实现更好、更及时的推理和代码生成。
______________________________________________________________________
🔍 概述
医生提供了一个完整的堆栈:
- 使用带有层次跟踪的crawl4ai抓取网页
- 使用LangChain对文本进行分块
- 通过litellm使用OpenAI创建嵌入
- 在支持向量搜索的DuckDB中存储数据
- 通过FastAPI web服务公开搜索功能
- 通过MCP服务器向LLM提供这些功能
- 使用分层站点地图导航已爬网站点
______________________________________________________________________
🏗️ 核心基础设施
🗄️ DuckDB
- 用于存储文档数据和具有矢量搜索功能的嵌入的数据库
- 由统一的数据库类管理
📨 雷迪斯
- 用于异步任务处理的消息代理
🕸️ 爬行工人
- 处理爬网作业
- 文本块
- 创建嵌入
🌐 Web服务器
- FastAPI服务公开端点
- 获取、搜索和查看数据
- 暴露MCP服务器
______________________________________________________________________
💻 设置
⚙️ 先决条件
- Docker和Docker Compose
- Python 3.10+
- uv(Python包管理器)
- OpenAI API密钥
📦 安装
- 克隆此存储库
- 设置环境变量:
export OPENAI_API_KEY=your-openai-key- 运行堆栈:
docker compose up______________________________________________________________________
👁 用法
- 首选http://localhost:9111/docs查看OpenAPI文档
- 寻找
/fetch_url端点,并通过提供URL启动爬网作业 - 使用
/job_progress查看当前作业状态 - 配置编辑器以使用
http://localhost:9111/mcp作为MCP服务器
______________________________________________________________________
☁️ Web API
核心终点
POST /fetch_url:开始抓取URLGET /search_docs:搜索索引文档GET /job_progress:检查爬网作业进度GET /list_doc_pages:列出索引页面GET /get_doc_page:获取页面的全文
网站地图功能
地图功能提供了抓取网站的分层视图,使导航和探索索引网站的结构变得容易。
终点:
GET /map查看所有抓取网站的索引GET /map/site/{root_page_id}:查看特定站点的层次树结构GET /map/page/{page_id}:查看具有导航功能的特定页面(父级、兄弟级、子级)GET /map/page/{page_id}/raw:获取页面的原始降价内容
特征:
- 分层导航:页面保持父子关系,允许您浏览网站结构
- 域分组:单独抓取的同一域中的页面会自动分组在一起
- 自动标题提取:页面标题从HTML或markdown内容中提取
- 面包屑导航:导航简单,面包屑显示从根到当前页面的路径
- 兄弟姐妹导航:快速访问层次结构中同一级别的页面
- 传统页面支持:在层次结构跟踪之前抓取的页面按域分组,以便于访问
- 无需JavaScript:所有导航都使用纯HTML和CSS,以实现最大兼容性
使用示例:
- 使用
/fetch_url端点 - 访问
/map查看所有已爬网的网站 - 点击网站查看其层次结构
- 使用提供的链接浏览页面
______________________________________________________________________
🔧 MCP集成
确保Docker Compose堆栈已启动,然后添加到Cursor或VSCode MCP服务器配置中:
"doctor": {
"type": "sse",
"url": "http://localhost:9111/mcp"
}______________________________________________________________________
🧪 测试
运行测试
要运行所有测试,请执行以下操作:
# Run all tests with coverage report
pytest要运行特定的测试类别:
# Run only unit tests
pytest -m unit
# Run only async tests
pytest -m async_test
# Run tests for a specific component
pytest tests/lib/test_crawler.py测试覆盖率
该项目配置为自动生成覆盖率报告:
# Run tests with detailed coverage report
pytest --cov=src --cov-report=term-missing测试结构
tests/conftest.py:所有测试的通用夹具tests/lib/:库组件测试
- test_crawler.py:爬虫模块测试 - test_crawler_enhanced.py:对具有层次跟踪功能的增强型爬虫的测试 - test_chunker.py:分块器模块测试 - test_embedder.py:嵌入式模块测试 - test_database.py:统一数据库类的测试 - test_database_hierarchy.py:数据库层次结构操作测试
tests/common/:通用模块测试tests/services/:服务层测试
- test_map_service.py:地图服务测试
tests/api/:API端点测试
- test_map_api.py:映射API终结点的测试
tests/integration/:集成测试
- test_processor_enhanced.py:对具有层次结构的增强型处理器的测试
______________________________________________________________________
🐞 代码质量
预提交钩子
该项目配置了在每次提交之前自动运行的预提交挂钩:
ruff check --fix:Lints代码并自动修复问题ruff format:根据项目样式格式化代码- 删除尾随空格
- 文件修复结束
- YAML验证
- 大文件检查
设置预提交
要设置预提交挂钩,请执行以下操作:
# Install pre-commit
uv pip install pre-commit
# Install the git hooks
pre-commit install手动运行预提交
您可以在所有文件上手动运行预提交挂钩:
# Run all pre-commit hooks
pre-commit run --all-files或者仅适用于暂存文件:
# Run on staged files
pre-commit run______________________________________________________________________
⚖️ 许可证
此项目根据MIT许可证获得许可-请参阅 许可证.md 文件以获取详细信息。
