ForcePilot/CODE_WIKI.md

893 lines
34 KiB
Markdown
Raw Normal View History

# Yuxi 项目 Code Wiki
> 本文档是 Yuxi语析项目的结构化代码百科涵盖项目整体架构、主要模块职责、关键类与函数说明、依赖关系以及项目运行方式等关键信息。
>
> 项目版本v0.6.2 | 最后更新2026-05-14
---
## 目录
1. [项目概述](#1-项目概述)
2. [整体架构](#2-整体架构)
3. [后端核心模块](#3-后端核心模块)
4. [前端核心模块](#4-前端核心模块)
5. [关键类与函数详解](#5-关键类与函数详解)
6. [数据流与运行链路](#6-数据流与运行链路)
7. [依赖关系](#7-依赖关系)
8. [项目运行方式](#8-项目运行方式)
9. [测试体系](#9-测试体系)
10. [附录:目录结构总览](#10-附录目录结构总览)
---
## 1. 项目概述
**Yuxi语析** 是一个基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 **LangGraph v1 + Vue.js + FastAPI + LightRAG** 架构构建。
### 核心特性
- **智能体开发**:基于 LangGraph支持子智能体、Skills、MCPs、Tools 与中间件机制
- **知识库RAG**:多格式文档解析,支持 Embedding / Rerank 配置及知识库评估
- **知识图谱**:基于 LightRAG 的图谱构建与可视化,支持属性图谱并参与智能体推理
- **平台与工程化**Vue + FastAPI 架构支持暗黑模式、Docker 与生产级部署
- **多渠道网关**:支持 Slack、Discord、Telegram、飞书、微信、QQ 等 20+ 渠道接入
### 技术栈
| 层级 | 技术 |
|------|------|
| 前端 | Vue 3 + Vite + Pinia + Ant Design Vue + Sigma.js/G6 |
| 后端 API | FastAPI + Uvicorn |
| 智能体框架 | LangGraph + LangChain |
| 任务队列 | ARQ (Redis) |
| 数据库 | PostgreSQL (业务数据) + Neo4j (图谱) + Milvus (向量) |
| 对象存储 | MinIO |
| 缓存/消息 | Redis |
| 文档解析 | MinerU + PaddleX + RapidOCR + DeepSeek OCR |
| 沙盒执行 | Docker Sandbox |
---
## 2. 整体架构
### 2.1 架构分层
```
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (Frontend) │
│ Vue 3 + Vite + Pinia + Ant Design Vue + Sigma.js/G6 │
│ web/src/ │
├─────────────────────────────────────────────────────────────┤
│ API 网关层 (Gateway) │
│ FastAPI + 路由注册 + 认证中间件 + CORS + 限流 │
│ backend/server/ │
├─────────────────────────────────────────────────────────────┤
│ 业务服务层 (Services) │
│ 聊天服务、运行队列、知识库、Skills、MCP、SubAgents │
│ backend/package/yuxi/services/ │
├─────────────────────────────────────────────────────────────┤
│ 智能体层 (Agents) │
│ BaseAgent + LangGraph + 中间件 + 工具集 + 沙盒后端 │
│ backend/package/yuxi/agents/ │
├─────────────────────────────────────────────────────────────┤
│ 数据访问层 (Repositories) │
│ SQLAlchemy + 异步会话 + 业务模型 │
│ backend/package/yuxi/repositories/ │
├─────────────────────────────────────────────────────────────┤
│ 基础设施层 (Infrastructure) │
│ PostgreSQL + Neo4j + Milvus + Redis + MinIO │
│ backend/package/yuxi/storage/ │
└─────────────────────────────────────────────────────────────┘
```
### 2.2 Docker Compose 服务拓扑
| 服务 | 容器名 | 端口 | 职责 |
|------|--------|------|------|
| api-dev | api-dev | 5050 | FastAPI 主服务(热重载) |
| worker-dev | worker-dev | - | ARQ 异步任务 Worker |
| web-dev | web-dev | 5173 | Vue 前端(热重载) |
| sandbox-provisioner | sandbox-provisioner | 8002 | 沙盒环境供应器 |
| postgres | postgres | 5432 | 业务与知识库元数据 |
| redis | redis | 6379 | 运行事件、队列状态、缓存 |
| minio | minio | 9000/9001 | 对象存储 |
| milvus | milvus | 19530 | 向量检索 |
| graph | graph | 7474/7687 | Neo4j 知识图谱 |
| mineru-vllm-server | mineru-vllm-server | 30000 | 文档解析 VLLM 服务profile: all |
| mineru-api | mineru-api | 30001 | 文档解析 APIprofile: all |
| paddlex | paddlex-ocr | 8080 | PaddleX OCRprofile: all |
---
## 3. 后端核心模块
后端分为两个顶层边界:`backend/server` 是 Web 应用入口与 HTTP 适配层,`backend/package/yuxi` 是可复用业务包。
### 3.1 入口与路由层 (`backend/server/`)
#### 3.1.1 主入口 (`server/main.py`)
- 创建 FastAPI 应用,注册 lifespan 生命周期
- 挂载所有业务路由到 `/api` 前缀
- 注册中间件CORS、访问日志、登录限流、认证
- 集成 WebSocket 聊天端点和 Slack Webhook
#### 3.1.2 路由注册 (`server/routers/__init__.py`)
| 路由模块 | API 前缀 | 职责 | LITE 模式 |
|----------|----------|------|-----------|
| `system_router.py` | `/api/system/*` | 健康检查、全局配置 | ✓ |
| `auth_router.py` | `/api/auth/*` | 登录、用户信息、OIDC | ✓ |
| `chat_router.py` | `/api/chat/*` | 对话、消息流、运行态 | ✓ |
| `dashboard_router.py` | `/api/dashboard/*` | 仪表盘聚合数据 | ✓ |
| `auth_dept_router.py` | `/api/departments/*` | 部门与权限 | ✓ |
| `system_task_router.py` | `/api/tasks/*` | 后台任务管理 | ✓ |
| `mcp_router.py` | `/api/system/mcp-servers/*` | MCP 服务管理 | ✓ |
| `model_provider_router.py` | `/api/system/model-providers/*` | 模型供应商配置 | ✓ |
| `skill_router.py` | `/api/system/skills/*` | Skills 管理 | ✓ |
| `subagent_router.py` | `/api/system/subagents/*` | 子智能体管理 | ✓ |
| `tool_router.py` | `/api/system/tools/*` | 工具列表与配置 | ✓ |
| `auth_apikey_router.py` | `/api/apikey/*` | API Key 管理 | ✓ |
| `filesystem_router.py` | `/api/viewer/filesystem/*` | 工作台文件系统视图 | ✓ |
| `workspace_router.py` | `/api/workspace/*` | 用户个人工作区 | ✓ |
| `channels_router.py` | `/api/channels/*` | 多渠道网关管理 | ✓ |
| `webhook_router.py` | `/api/webhook/*` | 统一 Webhook 分发 | ✓ |
| `knowledge_router.py` | `/api/knowledge/*` | 知识库管理与检索 | ✗ |
| `knowledge_eval_router.py` | `/api/evaluation/*` | 知识库评估 | ✗ |
| `knowledge_mindmap_router.py` | `/api/mindmap/*` | 思维导图生成与查询 | ✗ |
| `graph_router.py` | `/api/graph/*` | 图谱查询与管理 | ✗ |
#### 3.1.3 Worker 入口 (`server/worker_main.py`)
- ARQ Worker 入口,导入 `WorkerSettings`
- 处理智能体运行等异步任务
### 3.2 智能体体系 (`backend/package/yuxi/agents/`)
#### 3.2.1 核心基类
| 文件 | 类/函数 | 职责 |
|------|---------|------|
| `base.py` | `BaseAgent` | 智能体基类,定义 graph 编译、消息流式处理、历史记录、checkpointer 管理 |
| `context.py` | `BaseContext` | 智能体运行配置上下文包含模型、工具、知识库、MCP、Skills、子智能体等配置 |
| `state.py` | `BaseState` | LangGraph 状态定义,包含 messages 和 artifacts |
| `state.py` | `AgentStatePayload` | 前端可消费的序列化状态结构 |
| `models.py` | `load_chat_model()` | 根据 v1/v2 spec 加载聊天模型,支持多供应商 |
#### 3.2.2 内置智能体 (`agents/buildin/`)
| 智能体 | 文件 | 职责 |
|--------|------|------|
| ChatbotAgent | `chatbot/graph.py` | 基础对话机器人支持文件上传、知识库、MCP、Skills、子智能体 |
| DeepAgent | `deep_agent/graph.py` | 深度研究智能体,用于复杂任务分解与执行 |
#### 3.2.3 中间件 (`agents/middlewares/`)
中间件负责把各种能力挂载到智能体运行时:
| 中间件 | 职责 |
|--------|------|
| `KnowledgeBaseMiddleware` | 知识库检索工具注入 |
| `SkillsMiddleware` | Skills 提示词注入、依赖展开、动态激活 |
| `RuntimeConfigMiddleware` | 运行时配置应用(模型/工具/MCP/提示词) |
| `SummaryOffloadMiddleware` | 上下文摘要优化token 阈值触发) |
| `SubAgentMiddleware` | 子智能体调度 |
| `FilesystemMiddleware` | 沙盒文件系统后端 |
| `TodoListMiddleware` | 待办事项管理 |
| `PatchToolCallsMiddleware` | 工具调用补丁 |
| `ModelRetryMiddleware` | 模型重试机制 |
#### 3.2.4 工具集 (`agents/toolkits/`)
| 模块 | 职责 |
|------|------|
| `buildin/tools.py` | 内置工具(如 tavily_search、ask_user_question |
| `kbs/tools.py` | 知识库相关工具 |
| `mysql/tools.py` | MySQL 数据库工具 |
| `registry.py` | 工具注册中心 |
#### 3.2.5 后端执行 (`agents/backends/`)
| 模块 | 职责 |
|------|------|
| `sandbox/backend.py` | 沙盒执行后端 |
| `sandbox/paths.py` | 沙盒路径管理 |
| `composite.py` | 复合后端(知识库 + Skills + 沙盒) |
| `skills_backend.py` | Skills 执行后端 |
### 3.3 服务层 (`backend/package/yuxi/services/`)
服务层是用例层,负责串联 repositories、agents、knowledge、storage 和外部系统。
| 服务文件 | 职责 | 关键函数 |
|----------|------|----------|
| `chat_service.py` | 聊天核心服务 | `agent_chat()`, `stream_agent_chat()`, `stream_agent_resume()`, `get_agent_state_view()` |
| `agent_run_service.py` | Agent 运行管理(创建/轮询/取消) | `create_agent_run_view()`, `stream_agent_run_events()`, `cancel_agent_run_view()` |
| `run_worker.py` | ARQ Worker 任务处理 | `process_agent_run()`, `RunContext`, `ChunkedEventWriter` |
| `run_queue_service.py` | 运行队列与事件流 | `get_arq_pool()`, `append_run_stream_event()`, `publish_cancel_signal()` |
| `skill_service.py` | Skills 业务逻辑 | `import_skill_zip()`, `list_skills()`, `install_builtin_skill()`, `update_builtin_skill()` |
| `mcp_service.py` | MCP 服务管理 | `get_mcp_tools()`, `get_enabled_mcp_server_config()`, `ensure_builtin_mcp_servers_in_db()` |
| `subagent_service.py` | 子智能体管理 | `get_subagents_from_names()`, `init_builtin_subagents()` |
| `langfuse_service.py` | 可观测性追踪 | `build_run_context()`, `get_trace_info()`, `flush_langfuse()` |
| `model_provider_service.py` | 模型供应商配置 | `ensure_builtin_model_providers_in_db()`, `get_all_model_providers()` |
| `model_cache.py` | 模型信息缓存 | `model_cache.rebuild()`, `is_v2_spec_format()` |
| `conversation_service.py` | 对话管理 | - |
| `filesystem_service.py` | 文件系统服务 | - |
| `knowledge_fs_service.py` | 知识库文件服务 | - |
| `task_service.py` | 后台任务调度 | `tasker.start()`, `tasker.shutdown()` |
| `upload_utils.py` | 文件上传工具 | - |
| `workspace_service.py` | 工作区服务 | - |
| `evaluation_service.py` | 知识库评估 | - |
| `feedback_service.py` | 反馈服务 | - |
| `oidc_service.py` | OIDC 认证 | - |
| `tool_service.py` | 工具元数据 | `get_tool_metadata()` |
### 3.4 知识库领域 (`backend/package/yuxi/knowledge/`)
| 文件 | 类/函数 | 职责 |
|------|---------|------|
| `base.py` | `KnowledgeBase` (ABC) | 知识库抽象基类,定义统一接口(创建/删除/查询/文件管理) |
| `manager.py` | `KnowledgeBaseManager` | 知识库管理器,统一管理多种类型知识库实例 |
| `factory.py` | `KnowledgeBaseFactory` | 知识库工厂,根据类型创建实例 |
| `implementations/dify.py` | `DifyKnowledgeBase` | Dify 知识库实现 |
| `implementations/milvus.py` | `MilvusKnowledgeBase` | Milvus 向量知识库实现 |
| `chunking/` | - | 文档分块策略RAGflow-like 语义分块) |
| `graphs/adapters/` | - | 图谱适配与上传服务 |
| `utils/kb_utils.py` | - | 知识库通用工具 |
### 3.5 数据访问层 (`backend/package/yuxi/repositories/`)
| 仓库文件 | 职责 |
|----------|------|
| `skill_repository.py` | Skills CRUD |
| `task_repository.py` | 后台任务 CRUD |
| `user_repository.py` | 用户 CRUD |
| `agent_config_repository.py` | 智能体配置 CRUD |
| `agent_run_repository.py` | 智能体运行记录 CRUD |
| `conversation_repository.py` | 对话与消息 CRUD |
| `knowledge_base_repository.py` | 知识库元数据 CRUD |
| `knowledge_file_repository.py` | 知识库文件 CRUD |
| `evaluation_repository.py` | 评估基准与结果 CRUD |
### 3.6 存储层 (`backend/package/yuxi/storage/`)
| 模块 | 职责 |
|------|------|
| `postgres/manager.py` | `PostgresManager` - 数据库连接池、会话管理、schema 迁移 |
| `postgres/models_business.py` | 业务数据模型User、Conversation、AgentRun 等) |
| `postgres/models_knowledge.py` | 知识库数据模型KnowledgeBase、KnowledgeFile 等) |
| `postgres/models_channels.py` | 渠道网关数据模型 |
| `minio/client.py` | MinIO 客户端封装 |
### 3.7 多渠道网关 (`backend/package/yuxi/channels/`)
支持 20+ 即时通讯渠道接入:
| 渠道 | 适配器位置 |
|------|-----------|
| Slack | `channels/adapters/slack/` |
| Discord | `channels/adapters/discord/` |
| Telegram | `channels/adapters/telegram/` |
| 飞书 (Feishu) | `channels/adapters/feishu/` |
| 微信 (WeChat) | `channels/adapters/wechat/` |
| QQ 机器人 | `channels/adapters/qqbot/` |
| 钉钉 | `channels/adapters/dingding/` |
| Microsoft Teams | `channels/adapters/msteams/` |
| Matrix | `channels/adapters/matrix/` |
| IRC | `channels/adapters/irc/` |
| Line | `channels/adapters/line/` |
| Twitch | `channels/adapters/twitch/` |
| Nostr | `channels/adapters/nostr/` |
| Signal | `channels/adapters/signal/` |
| WhatsApp | `channels/adapters/whatsapp/` |
| Urbit | `channels/adapters/urbit/` |
| 元宝 (Yuanbao) | `channels/adapters/yuanbao/` |
| Zalo | `channels/adapters/zalo_oa/`, `zalo_user/` |
核心文件:
- `channels/manager.py` - 渠道管理器
- `channels/base.py` - 渠道基类
- `channels/router.py` - 消息路由
- `channels/message_actions.py` - 消息动作处理
### 3.8 配置与模型 (`backend/package/yuxi/config/`, `models/`)
| 文件 | 职责 |
|------|------|
| `config/app.py` | 应用配置管理 |
| `config/builtin_providers.py` | 内置模型供应商配置 |
| `config/static/models.py` | 静态模型信息 |
| `models/chat.py` | 聊天模型适配 |
| `models/embed.py` | Embedding 模型适配 |
| `models/rerank.py` | Rerank 模型适配 |
### 3.9 文档解析 (`backend/package/yuxi/plugins/parser/`)
| 文件 | 职责 |
|------|------|
| `unified.py` | `Parser` 统一入口,封装所有解析实现 |
| `factory.py` | 解析器工厂 |
| `base.py` | 解析器抽象基类 |
| `mineru.py` | MinerU 解析实现 |
| `mineru_official.py` | MinerU 官方 API 实现 |
| `pp_structure_v3.py` | PaddleX 结构解析 |
| `rapid_ocr.py` | RapidOCR 实现 |
| `deepseek_ocr.py` | DeepSeek OCR 实现 |
---
## 4. 前端核心模块
前端是 Vue 3 + Vite 应用,业务入口集中在 `web/src/`
### 4.1 入口与路由 (`web/src/`)
| 文件 | 职责 |
|------|------|
| `main.js` | 应用挂载入口 |
| `App.vue` | 根组件 |
| `router/index.js` | 路由配置含权限守卫requiresAuth/requiresAdmin/requiresSuperAdmin |
**路由表:**
| 路径 | 页面 | 权限 |
|------|------|------|
| `/` | HomeView | 公开 |
| `/login` | LoginView | 公开 |
| `/agent` | AgentView | 登录用户 |
| `/agent/:thread_id` | AgentView带线程ID | 登录用户 |
| `/workspace` | WorkspaceView | 登录用户 |
| `/graph` | GraphView | 管理员 |
| `/database` | DataBaseView | 管理员 |
| `/database/:database_id` | DataBaseInfoView | 管理员 |
| `/dashboard` | DashboardView | 管理员 |
| `/model-config` | ModelConfigView | 管理员 |
| `/channels` | ChannelManageView | 管理员 |
| `/extensions` | ExtensionsView | 超级管理员 |
### 4.2 API 封装 (`web/src/apis/`)
所有后端接口统一封装,复用 `base.js` 的请求、鉴权和错误处理。
| API 文件 | 职责 |
|----------|------|
| `base.js` | HTTP 客户端、请求/响应拦截、权限头处理 |
| `agent_api.js` | 智能体管理、聊天接口 |
| `knowledge_api.js` | 知识库管理、文档管理、查询 |
| `graph_api.js` | 知识图谱操作 |
| `mcp_api.js` | MCP 服务器管理 |
| `skill_api.js` | Skills 管理 |
| `subagent_api.js` | 子智能体管理 |
| `system_api.js` | 系统状态、配置 |
| `auth_api.js` | 认证、用户信息 |
| `dashboard_api.js` | 仪表盘数据 |
| `department_api.js` | 部门管理 |
| `channel_api.js` | 渠道管理 |
| `tool_api.js` | 工具信息 |
| `tasker.js` | 任务管理 |
| `mindmap_api.js` | 思维导图 |
| `workspace_api.js` | 工作区 |
| `viewer_filesystem.js` | 文件系统视图 |
| `apikey_api.js` | API Key 管理 |
### 4.3 状态管理 (`web/src/stores/`)
使用 Pinia + `pinia-plugin-persistedstate` 持久化。
| Store 文件 | 职责 |
|-----------|------|
| `user.js` | 用户信息、登录状态、权限 |
| `agent.js` | 智能体配置、初始化状态 |
| `chatThreads.js` | 聊天线程列表、当前线程 |
| `database.js` | 知识库列表、当前知识库 |
| `graphStore.js` | 图谱数据、可视化状态 |
| `theme.js` | 主题(暗黑/亮色) |
| `config.js` | 系统配置 |
| `chatUI.js` | 聊天界面状态 |
| `tasker.js` | 任务状态 |
| `channel.js` | 渠道配置 |
| `info.js` | 系统信息 |
### 4.4 可组合逻辑 (`web/src/composables/`)
| 文件 | 职责 |
|------|------|
| `useAgentStreamHandler.js` | Agent 流式响应处理 |
| `useAgentRunStream.js` | Agent runs SSE 流处理 |
| `useApproval.js` | 审批逻辑处理 |
| `useMention.js` | @提及功能 |
| `useStreamSmoother.js` | 流式消息平滑调度 |
### 4.5 视图与组件 (`web/src/views/`, `components/`)
| 视图 | 职责 |
|------|------|
| `AgentView.vue` | 智能体对话主页面 |
| `WorkspaceView.vue` | 个人工作区(文件管理) |
| `DataBaseView.vue` | 知识库列表与管理 |
| `DataBaseInfoView.vue` | 知识库详情与文件管理 |
| `GraphView.vue` | 知识图谱可视化 |
| `DashboardView.vue` | 数据统计仪表盘 |
| `ModelConfigView.vue` | 模型供应商配置 |
| `ChannelManageView.vue` | 渠道网关管理 |
| `ExtensionsView.vue` | 扩展管理Skills/MCP/SubAgents |
| `LoginView.vue` | 登录页面 |
| `HomeView.vue` | 首页 |
---
## 5. 关键类与函数详解
### 5.1 智能体基类
#### `BaseAgent` (`agents/base.py`)
```python
class BaseAgent:
name = "base_agent"
description = "base_agent"
capabilities: list[str] = []
context_schema: type[BaseContext] = BaseContext
# 核心方法
async def get_graph(self, **kwargs) -> CompiledStateGraph # 子类必须实现
async def stream_messages(self, messages, input_context=None, **kwargs) # 流式消息
async def stream_messages_with_state(self, messages, input_context=None, **kwargs) # 流式消息+状态
async def invoke_messages(self, messages, input_context=None, **kwargs) # 同步调用
async def get_history(self, user_id, thread_id) -> list[dict] # 获取历史
async def get_info(self, include_configurable_items=True) # 获取元数据
def reload_graph(self) # 重置 graph 缓存
```
#### `BaseContext` (`agents/context.py`)
```python
@dataclass(kw_only=True)
class BaseContext:
thread_id: str # 对话线程ID
user_id: str # 用户ID
system_prompt: str # 系统提示词
model: str # 主模型v2 spec: provider_id:model_id
tools: list[str] # 启用工具列表
knowledges: list[str] # 启用知识库列表
mcps: list[str] # 启用 MCP 服务器列表
skills: list[str] # 启用 Skills 列表
subagents_model: str # 子智能体默认模型
subagents: list[str] # 启用子智能体列表
summary_threshold: int # 上下文摘要触发阈值KB
```
### 5.2 聊天服务
#### `chat_service.py` 核心函数
| 函数 | 职责 |
|------|------|
| `agent_chat()` | 非流式对话,返回完整响应 |
| `stream_agent_chat()` | 流式对话yield 事件块 |
| `stream_agent_resume()` | 恢复中断的对话(处理 human-in-the-loop |
| `get_agent_state_view()` | 获取 Agent 当前状态 |
| `save_messages_from_langgraph_state()` | 从 LangGraph state 持久化消息 |
| `extract_agent_state()` | 从 state 提取 todos/files/artifacts |
### 5.3 Agent Run 服务
#### `agent_run_service.py` 核心函数
| 函数 | 职责 |
|------|------|
| `create_agent_run_view()` | 创建后台运行任务,入队 ARQ |
| `stream_agent_run_events()` | SSE 流式推送运行事件 |
| `cancel_agent_run_view()` | 取消运行任务 |
| `get_active_run_by_thread()` | 获取线程的活跃运行 |
### 5.4 Worker 任务处理
#### `run_worker.py` 核心类/函数
| 类/函数 | 职责 |
|---------|------|
| `process_agent_run()` | ARQ 任务主函数,消费流并写入 Redis |
| `RunContext` | 运行上下文,管理取消信号监听 |
| `ChunkedEventWriter` | 事件块缓冲写入器 |
| `WorkerSettings` | ARQ Worker 配置max_tries=2, job_timeout=900s |
### 5.5 知识库管理
#### `KnowledgeBaseManager` (`knowledge/manager.py`)
```python
class KnowledgeBaseManager:
async def create_database(name, description, kb_type="lightrag", ...) # 创建知识库
async def delete_database(db_id) # 删除知识库
async def add_file_record(db_id, item, params) # 添加文件记录
async def parse_file(db_id, file_id) # 解析文件为 Markdown
async def index_file(db_id, file_id) # 索引文件到向量库
async def aquery(query_text, db_id, **kwargs) # 异步查询
def get_retrievers() -> dict[str, dict] # 获取所有检索器
```
### 5.6 MCP 服务
#### `mcp_service.py` 核心函数
| 函数 | 职责 |
|------|------|
| `get_mcp_tools()` | 获取指定服务器的工具(带缓存) |
| `get_enabled_mcp_tools()` | Agent 统一入口(自动过滤 disabled_tools |
| `get_tools_from_all_servers()` | 获取所有启用服务器的工具 |
| `ensure_builtin_mcp_servers_in_db()` | 同步内置 MCP 配置到数据库 |
| `create_mcp_server()` / `update_mcp_server()` / `delete_mcp_server()` | CRUD |
### 5.7 Skills 服务
#### `skill_service.py` 核心函数
| 函数 | 职责 |
|------|------|
| `import_skill_zip()` | 从 ZIP 导入 Skill |
| `list_skills()` | 列出所有 Skills |
| `install_builtin_skill()` | 安装内置 Skill |
| `update_builtin_skill()` | 更新内置 Skill带覆盖确认 |
| `sync_thread_visible_skills()` | 同步线程可见 Skills 到沙盒 |
### 5.8 数据库管理
#### `PostgresManager` (`storage/postgres/manager.py`)
```python
class PostgresManager(metaclass=SingletonMeta):
def initialize() # 初始化连接池
async def create_business_tables() # 创建业务表
async def ensure_business_schema() # 确保业务 schema增量迁移
async def ensure_knowledge_schema() # 确保知识库 schema
async def get_async_session_context() # 异步会话上下文管理器
```
---
## 6. 数据流与运行链路
### 6.1 典型智能体对话流程
```
1. AgentView 收集输入、附件、配置
2. web/src/apis/agent_api.js 调用 /api/chat/*
3. server/routers/chat_router.py → chat_service / agent_run_service
4. 服务层读取 conversation、agent_config、tools、skills、knowledge
5a. 同步模式: 直接调用 stream_agent_chat() → 返回 SSE 流
5b. 异步模式: create_agent_run_view() → ARQ 入队 → worker 执行
6. worker 执行 LangGraph 智能体
- 中间件挂载知识库、工具、Skills、MCP、附件、沙盒
- 运行事件写入 Redis
7. 最终状态和业务记录写入 Postgres
文件和产物落到 saves/、MinIO 或沙盒映射目录
8. 前端通过 SSE/轮询消费运行事件
渲染消息、工具调用、引用来源、产物卡片、文件预览
```
### 6.2 Agent Run 异步流程
```
用户请求
create_agent_run_view()
- 创建 AgentRun 记录status=pending
- ARQ enqueue_job("process_agent_run", run.id)
worker process_agent_run()
- 加载用户和配置
- mark_run_running()
- stream_agent_chat() 消费流
- ChunkedEventWriter 缓冲写入 Redis
- 处理取消信号
- mark_run_terminal(status=completed/failed/cancelled)
前端 SSE 连接 /api/chat/runs/{run_id}/events
- 轮询 Redis 事件
- 心跳保活
- 终端状态返回 close 事件
```
### 6.3 知识库文档处理流程
```
上传文件
add_file_record() → status=UPLOADED
parse_file() → 调用 Parser.aparse()
- status=PARSING
- 解析为 Markdown
- 保存到 MinIO
- status=PARSED / ERROR_PARSING
index_file() → 向量化和图谱构建
- status=INDEXING
- 分块 → Embedding → 向量库
- status=INDEXED / ERROR_INDEXING
aquery() → 检索 → Rerank → 返回结果
```
---
## 7. 依赖关系
### 7.1 后端核心依赖
```
fastapi>=0.121 # Web 框架
uvicorn[standard]>=0.34 # ASGI 服务器
arq>=0.26.3 # 异步任务队列
langgraph>=1.0.1 # 智能体编排
langchain>=1.2.0 # LLM 框架
langchain-openai>=1.0 # OpenAI 兼容层
langchain-mcp-adapters # MCP 适配
lightrag-hku>=1.4.6 # 知识图谱
neo4j>=5.28 # 图数据库
pymilvus>=2.5 # 向量数据库
asyncpg>=0.30 # PostgreSQL 异步驱动
psycopg[binary,pool] # PostgreSQL 连接池
redis>=5.2 # 缓存/消息
minio>=7.2 # 对象存储
sqlalchemy[asyncio]>=2 # ORM
langfuse>=4.0 # 可观测性
pydantic # 数据验证
pyjwt>=2.8 # JWT 认证
```
### 7.2 前端核心依赖
```
vue@^3.5 # 框架
vue-router@^4.6 # 路由
pinia@^3.0 # 状态管理
pinia-plugin-persistedstate # 状态持久化
ant-design-vue@^4.2 # UI 组件库
lucide-vue-next # 图标库
@antv/g6@^5.0 # 图谱可视化
sigma@^3.0 # 图谱渲染
@vueuse/core # 组合式工具
vite@^7.3 # 构建工具
less@^4.5 # CSS 预处理器
marked@^16 # Markdown 渲染
highlight.js # 代码高亮
```
### 7.3 模块依赖图
```
server/main.py
├── server/routers/*
│ └── yuxi.services.*
│ ├── yuxi.agents.* (BaseAgent, agent_manager)
│ ├── yuxi.knowledge.* (KnowledgeBaseManager)
│ ├── yuxi.repositories.* (SQLAlchemy CRUD)
│ ├── yuxi.storage.* (Postgres, MinIO)
│ └── yuxi.channels.* (多渠道网关)
└── server/utils/* (lifespan, auth, middleware)
yuxi.agents.base.BaseAgent
├── yuxi.agents.context.BaseContext
├── yuxi.agents.models.load_chat_model
└── yuxi.storage.postgres.manager.pg_manager
yuxi.services.chat_service
├── yuxi.agents.buildin.agent_manager
├── yuxi.repositories.conversation_repository
├── yuxi.services.langfuse_service
└── yuxi.plugins.guard.content_guard
```
---
## 8. 项目运行方式
### 8.1 环境要求
- Docker & Docker Compose
- Python 3.12+(后端开发)
- Node.js 20+ + pnpm前端开发
- Git
### 8.2 快速启动
```bash
# 1. 克隆项目
git clone --branch v0.6.2 --depth 1 https://github.com/xerrors/Yuxi.git
cd Yuxi
# 2. 初始化(创建 .env 等)
# Linux/macOS
./scripts/init.sh
# Windows PowerShell
.\scripts\init.ps1
# 3. 启动全部服务
docker compose up -d
# 或使用 Makefile
make up
# 4. 访问前端
open http://localhost:5173
```
### 8.3 LITE 模式(轻量启动)
跳过知识库、图谱、评估等重依赖:
```bash
make up-lite
# 等效于:
# LITE_MODE=true VITE_USE_RUNS_API=false docker compose up -d postgres redis minio api web
```
### 8.4 开发常用命令
```bash
# 查看日志
make logs
docker logs api-dev --tail 100
docker logs worker-dev --tail 100
# 代码格式化
make format
# 等效于:
cd backend && uv run ruff format package
cd backend && uv run ruff check package --fix
cd web && pnpm run format
cd web && pnpm run lint
# 运行测试
cd backend && uv run --group test pytest
# 停止服务
make down
```
### 8.5 开发环境特性
- **热重载**`api-dev` 和 `web-dev` 服务均配置热重载,本地修改代码后无需重启容器
- **代码挂载**`backend/server`、`backend/package`、`web/src` 等目录挂载到容器
- **调试**:使用 `docker logs` 查看实时日志
---
## 9. 测试体系
测试代码放在 `backend/test/`,按三层组织:
| 层级 | 目录 | 职责 |
|------|------|------|
| 单元测试 | `test/unit/` | 不依赖外部服务的纯逻辑测试 |
| 集成测试 | `test/integration/` | API 路由测试(需运行中的服务) |
| 端到端测试 | `test/e2e/` | 完整业务流程测试 |
### 9.1 运行测试
```bash
cd backend
uv run --group test pytest
# 带覆盖率
uv run --group test pytest --cov=yuxi --cov-report=html
# 仅运行单元测试
uv run --group test pytest -m unit
# 仅运行集成测试
uv run --group test pytest -m integration
# 仅运行 e2e 测试
uv run --group test pytest -m e2e
```
### 9.2 测试配置
- `pytest.ini` 配置在 `backend/pyproject.toml`
- 全局 fixtures 在 `test/conftest.py`
- 各层独立 `conftest.py` 管理层级 fixtures
---
## 10. 附录:目录结构总览
```
ForcePilot/
├── .github/ # GitHub 配置Issue 模板、工作流)
│ ├── ISSUE_TEMPLATE/
│ └── workflows/
├── backend/ # 后端代码
│ ├── package/ # 可复用业务包
│ │ └── yuxi/ # 核心包
│ │ ├── agents/ # 智能体体系
│ │ │ ├── backends/ # 执行后端沙盒、Skills
│ │ │ ├── buildin/ # 内置智能体
│ │ │ ├── middlewares/# 中间件
│ │ │ ├── toolkits/ # 工具注册与实现
│ │ │ ├── base.py # BaseAgent
│ │ │ ├── context.py # BaseContext
│ │ │ ├── models.py # 模型加载
│ │ │ └── state.py # 状态定义
│ │ ├── channels/ # 多渠道网关
│ │ │ └── adapters/ # 各渠道适配器
│ │ ├── config/ # 应用配置
│ │ ├── gateway/ # 网关协议
│ │ ├── knowledge/ # 知识库领域
│ │ │ ├── chunking/ # 分块策略
│ │ │ ├── graphs/ # 图谱适配
│ │ │ └── implementations/ # 具体实现
│ │ ├── models/ # 模型适配chat/embed/rerank
│ │ ├── plugins/ # 插件
│ │ │ └── parser/ # 文档解析
│ │ ├── repositories/ # 数据访问层
│ │ ├── services/ # 业务服务层
│ │ ├── storage/ # 存储基础设施
│ │ │ ├── minio/ # 对象存储
│ │ │ └── postgres/ # PostgreSQL
│ │ └── utils/ # 通用工具
│ ├── server/ # Web 应用入口
│ │ ├── routers/ # HTTP 路由
│ │ ├── utils/ # Web 层工具
│ │ ├── main.py # FastAPI 入口
│ │ └── worker_main.py # Worker 入口
│ ├── test/ # 测试代码
│ │ ├── unit/ # 单元测试
│ │ ├── integration/ # 集成测试
│ │ └── e2e/ # 端到端测试
│ └── pyproject.toml # 后端项目配置
├── web/ # 前端代码
│ ├── src/
│ │ ├── apis/ # API 封装
│ │ ├── components/ # 可复用组件
│ │ ├── composables/ # 可组合逻辑
│ │ ├── layouts/ # 布局组件
│ │ ├── router/ # 路由配置
│ │ ├── stores/ # Pinia 状态
│ │ ├── utils/ # 前端工具
│ │ ├── views/ # 页面级视图
│ │ ├── App.vue # 根组件
│ │ └── main.js # 入口
│ ├── public/
│ ├── index.html
│ ├── package.json
│ └── vite.config.js
├── docker/ # Docker 配置
│ ├── api.Dockerfile
│ ├── web.Dockerfile
│ ├── sandbox_provisioner/ # 沙盒供应器
│ └── volumes/ # 数据卷挂载点
├── docs/ # 项目文档
│ ├── .vitepress/ # VitePress 配置
│ ├── agents/ # Agent 开发文档
│ ├── develop-guides/ # 开发指南
│ └── vibe/ # 开发者笔记
├── docker-compose.yml # Docker Compose 配置
├── Makefile # 快捷命令
├── README.md # 项目说明
├── ARCHITECTURE.md # 架构文档
├── AGENTS.md # 开发准则
└── .env.template # 环境变量模板
```
---
## 参考文档
- [ARCHITECTURE.md](ARCHITECTURE.md) - 架构代码地图
- [AGENTS.md](AGENTS.md) - 开发准则与行为规范
- [README.md](README.md) - 项目快速开始
- [docker-compose.yml](docker-compose.yml) - 服务拓扑与配置
- [backend/package/pyproject.toml](backend/package/pyproject.toml) - Python 依赖
- [web/package.json](web/package.json) - Node.js 依赖