ForcePilot/CODE_WIKI.md
Kris 277bf20153 feat: 新增凭证管理与渠道状态展示功能
1. 新增渠道凭证相关API与前端展示逻辑
2. 实现凭证状态自动拉取与手动刷新功能
3. 优化聊天查询支持内部用户ID参数
4. 修复部分代码格式与异常处理逻辑
5. 新增项目代码维基文档
2026-05-14 02:10:52 +08:00

893 lines
34 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 依赖