Research-Copilot是一个面向科研调研工作区的多智能体系统。它把前端研究工作台、高层 research 编排、底层 RAG 执行、CLI 和本地持久化放在同一个仓库里。
当前项目最值得先记住的是四层边界:
services/research/高层 research 业务服务层,负责 conversation、task、paper pool、import job、collection QA、workspace、report 和持久化收口。runtime/research/Supervisor Graph 运行时,负责构建ResearchAgentToolContext、技能匹配、manager 决策、specialist agent 调度和最终响应聚合。tools/research/研究领域能力单元,负责 query planning、paper ranking、survey writing、paper import/search、QA routing、Zotero search 等可复用业务能力。rag_runtime/底层 tool-first 执行层,负责parse / index / retrieve / answer / chart understanding。
当前活跃前端工作区(web/ 目录):
- 技术栈:Next.js 15 (App Router) + React 18 + TypeScript + Tailwind CSS
- 应用入口:
web/app/layout.tsx+web/app/page.tsx - 主组件:
web/src/App.tsx - API 封装:
web/src/api.ts(当前直接请求http://127.0.0.1:8000;next.config.ts里仍保留/api/backend/*rewrite,但活跃前端请求没有走这层代理) - 图片服务:
web/app/api/files/[...path]/route.ts(Next.js Route Handler) - 聊天视图:
web/src/components/ChatView.tsx - 消息气泡:
web/src/components/MessageBubble.tsx(含内联图片渲染)
前端采用类似 ChatGPT / Claude 的对话式布局:
- 主区域:居中的对话线程,占满屏幕高度
- 输入栏:底部固定,支持文本输入、文件选择和流式发送
- 侧边栏:桌面端默认展开,移动端可通过顶部按钮收起/展开
- 内联图片:自动检测消息中的图片路径并渲染为
<img>标签 - 决策轨迹:Agent 活动和 Trace 默认展开显示
核心前端组件(web/src/components/):
| 组件 | 职责 |
|---|---|
ChatView |
聊天视图:消息过滤、发送、task_id 跟踪 |
MessageBubble |
消息气泡:Markdown 渲染、内联图片、论文卡片、决策轨迹 |
InputBar |
底部输入栏 |
FileUpload |
文件选择和待上传文件预览 |
PaperCard |
论文卡片 |
Sidebar |
侧边栏会话列表 |
Toast |
前端提示消息 |
WelcomeScreen |
空状态欢迎页 |
Browser (http://localhost:3000)
-> Next.js (web/, App Router)
-> web/src/api.ts -> FastAPI (http://127.0.0.1:8000)
-> /api/files/* -> Route Handler -> .data/storage/
-> LiteratureResearchService
-> ResearchSupervisorGraphRuntime
-> runtime/research context builder / dispatcher / result aggregator
-> specialist agents / research services
-> RagRuntime
-> DocumentTools / RetrievalTools / AnswerTools / ChartTools
-> Milvus (vector) / Neo4j (graph) / session memory / local persistence
research discovery根据研究主题搜索 arXiv、OpenAlex、Semantic Scholar、IEEE 等学术源,生成候选论文池和研究草稿。paper import对选中的论文执行download -> parse -> optional Zotero sync -> embedding index。ImportPapersRequest.fast_mode默认是true,因此主导入阶段默认先完成 embedding 索引;如果include_graph=true,图谱索引会标记为graph_backfill_pending,后台导入 job 会继续执行 graph backfill。索引阶段有RESEARCH_IMPORT_INDEX_TIMEOUT_SECONDS超时保护;索引超时会保留已解析/已同步的论文,不再把整次导入判为失败。collection QA基于已导入论文集合做混合检索和 grounded answer,必要时下钻到单文档或图表链路。paper question answering对已导入且索引成功的论文,问答优先走RAG 正文证据 -> 图谱/摘要证据 -> 元数据兜底。如果论文仍是index_status=timeout|failed|skipped,系统不会假装有全文证据,只会用标题、摘要、候选元数据做弱回答并暴露证据边界。advanced actions做多论文对比、优先阅读推荐、上下文压缩,并写回 workspace。CLI terminal agent支持本地会话、profile 管理、runtime 配置和交互式研究终端。
项目里有两套相关但边界不同的“记忆”:
- research agent memory
定义在
memory/,包括WorkingMemory、SessionMemory、LongTermMemory、PaperKnowledgeMemory和UserProfileMemory。UserProfileMemory构建在LongTermMemory之上,由MemoryManager统一管理。 - RAG runtime session memory
定义在
rag_runtime/memory.py,核心是GraphSessionMemory,用于给底层问答链路保存结构化会话快照。
代码默认配置下:
SESSION_MEMORY_PROVIDER=sqlite底层GraphSessionMemory默认写入RESEARCH_SQLITE_DB_PATH。LONG_TERM_MEMORY_PROVIDER=sqliteruntime profile 显示为 sqlite;research service 内部的长期记忆仍由MemoryManager和本地 JSON store 承载业务画像/论文知识。VECTOR_STORE_PROVIDER=milvusGRAPH_STORE_PROVIDER=memory
本机常用业务配置会覆盖上述代码默认值。当前业务运行一般使用 RUNTIME_BACKEND=business、OpenAI-compatible LLM/embedding、Milvus compose 暴露端口 19531、GRAPH_STORE_PROVIDER=neo4j。在这种配置下 Neo4j 是必需服务;如果保持代码默认的 GRAPH_STORE_PROVIDER=memory,则不需要启动 Neo4j。
web/当前活跃前端(Next.js 15 + React 18 + Tailwind),ChatGPT 风格对话式布局apps/api/FastAPI 入口、依赖注入、runtime 装配和 HTTP 路由services/research/research 主业务 service、paper operations、QA router 和 workspace/report/conversation 持久化runtime/research/高层 Supervisor Graph runtime、context builder、unified action adapters、result aggregator 和 response formatteragents/高层 specialist agents(10 个:Supervisor、Writer、PreferenceMemory、Knowledge、LiteratureScout、ChartAnalysis、GeneralAnswer、PaperAnalysis、ResearchQA、ResearchDocument)rag_runtime/底层 RAG runtimetools/文档、图表、检索、回答等稳定工具层tools/research/研究领域能力与工具:学术源搜索、Zotero search、query planning、paper ranking/reading/analysis、survey/review writing、QA routing 等retrieval/vector / sparse / graph / graph summary 检索与重排adapters/LLM、embedding、vector store、graph store 等基础设施适配adapters/mcp/zotero_local.pyZotero 本地 Connector 网关和进程内 MCP appadapters/storage/数据持久化后端(JSON 文件 / SQLite),通过StorageBackend协议抽象observability/轻量级进程内指标收集(counters、histograms)、LLM 调用自动埋点security/敏感数据脱敏(API key、token、密码、连接串等 11 种模式)memory/research 侧工作记忆、会话记忆、长期记忆、用户画像记忆和论文知识记忆chains/+rag_runtime/strategies.py可复用推理策略实现与协议。CoTReasoningAgent和PlanAndSolveReasoningAgent在chains/,ReAct 工具推理 worker 在agents/research_qa_agent.py,策略组合定义在rag_runtime/strategies.py。tooling/工具注册 / 执行框架和 research function 规范mcp/MCP(Model Context Protocol)客户端注册和服务端暴露。已实现标准 MCP 协议,详见下方 MCP 标准化架构 章节evaluation/评测框架(7 种 case 类型)、benchmark 构建、metrics 和数据集管理core/共享核心模块:配置(config.py)、知识加载(knowledge_loader.py)、技能系统(skill_registry.py、skill_matcher.py、skill_validator.py)skills/标准化技能目录,builtin/内置技能(git-tracked),community/社区/外部技能(gitignored)。每个技能是一个含SKILL.md的文件夹scripts/环境检查、Milvus 重置、SciGraphQA 入库、WSL Zotero 桥接等工具脚本sdk/本地 CLI / SDK 调用封装和 runtime profile 管理
POST /research/agent当前统一主入口POST /research/agent/stream前端当前使用的 SSE 流式入口GET/POST /research/conversationsGET/PATCH/DELETE /research/conversations/{conversation_id}POST /research/resetPOST /research/papers/searchPOST /research/tasksGET /research/tasks/{task_id}POST /research/tasks/{task_id}/runGET /research/tasks/{task_id}/reportPOST /research/tasks/{task_id}/papers/importPOST /research/tasks/{task_id}/papers/import/jobsGET /research/jobs/{job_id}GET /research/tasks/{task_id}/papers/{paper_id}/figuresPOST /research/tasks/{task_id}/papers/{paper_id}/figures/analyzePATCH /research/tasks/{task_id}/todos/{todo_id}POST /research/tasks/{task_id}/todos/{todo_id}/searchPOST /research/tasks/{task_id}/todos/{todo_id}/import
兼容入口仍保留但已标记为 deprecated:POST /research/agent/run、POST /research/agent/chat、POST /research/papers/import、POST /research/papers/import/jobs。
POST /research/documents/upload- 文档解析、索引、图表理解和 grounded QA 已收编为 Supervisor 内部 knowledge tools,不再暴露独立低层 API
GET /health— 应用健康检查(含 uptime)GET /health/metrics— 运行时指标(LLM 调用延迟/计数/错误分布)
入口文件是 apps/cli.py,console script 别名是:
research-copilotkepler
一级命令:
list-conversationsshow-profiledoctorstatustrajectoryupdate-profilemodels show|setplugins list|enable|disableagent
详细说明见 docs/CLI终端使用文档.md。
配置入口是 core/config.py,默认从项目根目录 .env 读取。
关键配置维度:
- LLM
LLM_PROVIDER、LLM_MODEL、OPENAI_API_KEY、DASHSCOPE_API_KEY - embedding / reranker
EMBEDDING_PROVIDER、EMBEDDING_MODEL、RERANKER_MODEL、RERANKER_UNAVAILABLE_POLICY - stores
VECTOR_STORE_PROVIDER、GRAPH_STORE_PROVIDER、SESSION_MEMORY_PROVIDER - external store config
MILVUS_URI、NEO4J_URI - research persistence
RESEARCH_STORAGE_ROOT、RESEARCH_RESET_ON_STARTUP - long-term memory
LONG_TERM_MEMORY_PROVIDER - uploads
UPLOAD_DIR、UPLOAD_MAX_BYTES
代码默认值中比较关键的几点:
APP_ENV=local时会暴露/uploads/*UPLOAD_MAX_BYTES默认25 MiBVECTOR_STORE_PROVIDER默认milvusMILVUS_URI代码默认http://localhost:19530;使用仓库的docker-compose.milvus.yml时需要配置为http://localhost:19531MILVUS_DIMENSION代码默认自动跟随 embedding adapter;如果用text-embedding-3-large,本地通常配置为3072GRAPH_STORE_PROVIDER代码默认memory;业务.env可配置为neo4j,此时后端启动会要求NEO4J_URI、NEO4J_USER、NEO4J_PASSWORD且 Neo4j 可连接SESSION_MEMORY_PROVIDER默认sqliteLONG_TERM_MEMORY_PROVIDER默认sqliteRESEARCH_IMPORT_INDEX_TIMEOUT_SECONDS默认300STORAGE_PROVIDER默认json(可切换为sqlite)CORS_ALLOW_ORIGINS默认允许 localhost:3000/3001RATE_LIMIT_MAX_REQUESTS默认 60 次/分钟/IPJSON_LOG_FORMAT默认false,设为true启用结构化 JSON 日志- WSL 下
kepler agent会在启动时尝试从默认网关自动注入 Windows 代理环境,避免api.bltcy.ai直连 DNS/443 不稳定导致 manager 或 embedding 调用卡住。可用KEPLER_WSL_PROXY_AUTO_ENABLE=0关闭。
项目的 MCP(Model Context Protocol)客户端已完成标准化,完全符合 MCP 规范:
- JSON-RPC 2.0 信封:所有 MCP 通信(
tools/list、tools/call、initialize等)均使用标准 JSON-RPC 2.0 格式,包含jsonrpc、method、params、id字段 - initialize 握手:客户端在首次通信前自动执行 MCP
initialize握手,交换protocolVersion、capabilities和clientInfo,并发送notifications/initialized通知 - 错误处理:自动解析 JSON-RPC
error对象(含code和message),并对错误消息进行凭据脱敏
| 传输方式 | 客户端类 | 说明 |
|---|---|---|
| stdio | StdioMCPClient |
通过子进程 stdin/stdout 通信,支持自动重连、指数退避 |
| HTTP | HttpMCPClient |
通过 HTTP POST 通信,支持自定义 headers 和重试 |
| 进程内 | InProcessMCPClient |
直接调用本地 MCPServerApp,无网络开销 |
用户可以通过配置文件动态添加外部 MCP 工具服务器(如论文搜索、翻译等):
- 复制配置模板:
cp mcp_servers.example.json mcp_servers.json - 编辑
mcp_servers.json,添加你的 MCP 服务器:
{
"servers": {
"paper-search": {
"transport": "http",
"url": "http://localhost:3001",
"headers": {"Authorization": "Bearer your-token"},
"timeout": 60,
"enabled": true
},
"local-tool": {
"transport": "stdio",
"command": "npx",
"args": ["-y", "@some/mcp-server"],
"env": {"API_KEY": "xxx"},
"enabled": true
}
}
}- 重启后端服务,系统自动注册并初始化配置的 MCP 服务器
- 外部工具会自动注入到 ReAct 推理引擎的可用工具池中
注意:mcp_servers.json 已加入 .gitignore,不会被提交到版本控制。
| 文件 | 职责 |
|---|---|
mcp/client/base.py |
MCP 客户端基类、JSON-RPC 2.0 构建器、协议常量 |
mcp/client/stdio_client.py |
stdio 传输客户端 |
mcp/client/http_client.py |
HTTP 传输客户端 |
mcp/client/registry.py |
MCP 客户端注册中心、配置加载、工具发现 |
mcp/security.py |
环境变量过滤、错误脱敏、工具描述注入检测 |
mcp/server/app.py |
MCP 服务端(对外暴露本系统能力) |
mcp_servers.example.json |
用户配置模板 |
项目实现了标准化的技能系统,支持内置技能和外部社区技能的即插即用。
skills/
├── builtin/ # 内置技能(git-tracked)
│ ├── academic-concepts/
│ ├── chart-analysis/
│ ├── knowledge-management/
│ ├── paper-comparison/ # 论文对比分析
│ ├── paper-discovery/
│ ├── paper-recommendation/
│ ├── literature-survey/ # 文献综述写作
│ ├── paper-reading/ # 论文深度阅读
│ ├── research-evaluation/ # 研究质量评估
│ └── research-qa/
├── community/ # 社区/外部技能(gitignored)
└── .skill_config.json # 技能启用/禁用配置(gitignored)
| 文件 | 职责 |
|---|---|
core/skill_registry.py |
SkillRegistry — 扫描、索引、三级渐进加载(L1 元数据 / L2 指令 / L3 引用文件) |
core/skill_matcher.py |
SkillMatcher — trigger 正则匹配 + tag/description 关键词匹配 |
core/skill_validator.py |
SkillValidator — prompt injection 检测、路径安全、大小限制 |
从网上下载的技能文件夹(包含 SKILL.md)放入 skills/community/ 即可:
cp -r downloaded-skill/ skills/community/
# 重启后自动扫描并可用每个技能目录必须包含一个 SKILL.md 文件,使用 YAML frontmatter + Markdown body:
---
name: my-skill
description: "技能描述"
triggers:
- "触发正则1"
- "触发正则2"
tags: [tag1, tag2]
trust_level: community # builtin | trusted | community
enabled: true
requires:
tools: [tool_name]
---
# 技能指令(Markdown)
具体的执行步骤和输出格式要求...# 1. 启动 Milvus(Docker Compose,含 etcd + minio + milvus)
cd /home/myc/Research-Copilot
docker-compose -f docker-compose.milvus.yml up -d
# 等待端口 19531 就绪(约 15-30 秒)
# 检查:curl -s http://localhost:9092/healthz → 应返回 "OK"
# 2. 如果 GRAPH_STORE_PROVIDER=neo4j,启动 Neo4j(Docker 容器,数据挂载在 .data/neo4j/)
docker start kepler-neo4j
# 等待端口 7687 就绪(约 10-15 秒)
# 检查:docker exec kepler-neo4j cypher-shell -u neo4j -p neo4j1234 'RETURN 1'
# 3. 如果需要访问本地 Zotero,启动 Zotero Bridge(WSL 环境,需要 Windows 上先打开 Zotero 桌面程序)
bash scripts/wsl_zotero_bridge.sh start
# 检查:ss -tlnp | grep 23119cd /home/myc/Research-Copilot
/home/myc/miniconda3/envs/Research-Copilot/bin/python -m uvicorn apps.api.main:app \
--host 127.0.0.1 --port 8000 --reload \
--reload-dir apps --reload-dir services --reload-dir rag_runtime \
--reload-dir agents --reload-dir tools --reload-dir adapters \
--reload-dir memory --reload-dir retrieval --reload-dir domain
# 等待日志出现 "Application startup complete"
# 如果卡在 "Waiting for application startup",优先检查 Milvus;若 GRAPH_STORE_PROVIDER=neo4j,再检查 Neo4j
# 注意:必须用 --reload-dir 限制监视目录,否则 watchfiles 会因 web/node_modules 文件过多而崩溃cd /home/myc/Research-Copilot/web
npm run dev
# 访问 http://localhost:3000| 服务 | 端口 | 启动方式 |
|---|---|---|
| Milvus | 19531 (映射到容器内 19530) | docker-compose -f docker-compose.milvus.yml up -d(在 Research-Copilot 目录下) |
| Neo4j | 7474/7687 | 仅 GRAPH_STORE_PROVIDER=neo4j 时需要,常用 docker start kepler-neo4j |
| Zotero Bridge | 23119 | 仅需要本地 Zotero 时启动,bash scripts/wsl_zotero_bridge.sh start |
| 后端 (FastAPI) | 8000 | uvicorn apps.api.main:app |
| 前端 (Next.js) | 3000 | cd web && npm run dev |
- WSL 默认只分配宿主机一半内存,建议在
C:\Users\<用户名>\.wslconfig中配置memory=24GB wsl --shutdown后所有服务需要重新启动- 如果 Docker daemon 配置了 HTTP 代理(如
systemdproxy),容器会继承代理设置,导致 Milvus 内部组件(etcd、minio)之间通信失败(502 Bad Gateway)。docker-compose.milvus.yml中已为所有服务设置no_proxy="*"解决此问题 - Milvus v2.5.4 在某些 WSL2 内核版本下可能出现 SIGABRT 崩溃,确保使用
docker-compose方式启动(含security_opt: seccomp:unconfined)
/home/myc/miniconda3/envs/Research-Copilot/bin/python apps/cli.py --help
/home/myc/miniconda3/envs/Research-Copilot/bin/python apps/cli.py agent/home/myc/miniconda3/envs/Research-Copilot/bin/python scripts/check_env.py- apps/api/main.py
- apps/api/runtime.py
- apps/api/research_runtime.py
- web/src/App.tsx
- web/src/api.ts
- web/src/components/ChatView.tsx
- web/src/components/MessageBubble.tsx
- runtime/research/supervisor_graph_runtime_core.py
- runtime/research/context_builder.py
- services/research/literature_research_service.py
- tools/research/paper_search.py
- rag_runtime/runtime.py
- memory/memory_manager.py
- retrieval/hybrid_retriever.py