refactor: 重构:将项目重命名为 Yuxi 并更新模块路径

- 在所有文档和配置中将品牌从 "Yuxi-Know" 重命名为 "Yuxi"
- 将 Python 导入路径从 `src.*` 更新为 `yuxi.*` 以保持后端包的一致性
- 将 Web 包名称从 `yuxi-know-web` 更新为 `yuxi-web`

此更改与后端代码迁移至 backend/ 目录保持一致。
This commit is contained in:
Wenjie Zhang 2026-03-17 18:56:42 +08:00
parent 410dd47c14
commit 90bfd20d8d
42 changed files with 129 additions and 129 deletions

View File

@ -1,7 +1,7 @@
# 项目目录结构 (Project Overview)
Yuxi-Know 是一个基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建。项目完全通过 Docker Compose 进行管理,支持热重载开发。
Yuxi 是一个基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建。项目完全通过 Docker Compose 进行管理,支持热重载开发。
## 开发准则

View File

@ -1,7 +1,7 @@
# 项目目录结构 (Project Overview)
Yuxi-Know 是一个基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建。项目完全通过 Docker Compose 进行管理,支持热重载开发。
Yuxi 是一个基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建。项目完全通过 Docker Compose 进行管理,支持热重载开发。
## 开发准则

View File

@ -17,5 +17,5 @@ executor = ThreadPoolExecutor() # noqa: E402
def get_version():
"""Return the Yuxi-Know version."""
"""Return the Yuxi version."""
return __version__

View File

@ -18,5 +18,5 @@ __all__ = [
# 模块元数据
__version__ = "1.0.0"
__author__ = "Yuxi-Know Team"
__author__ = "Yuxi Team"
__description__ = "基于 create_deep_agent 的深度分析智能体"

View File

@ -10,8 +10,8 @@ organization:
# 项目信息
branding:
name: "Yuxi-Know"
title: "Yuxi-Know: 更智能的知识库智能体平台" # 系统标题
name: "Yuxi"
title: "Yuxi: 更智能的知识库智能体平台" # 系统标题
subtitle: "大模型驱动的知识库智能体平台" # 副标题
features:

View File

@ -337,7 +337,7 @@ def upload(
poll_interval: int = typer.Option(5, help="Polling interval in seconds for checking task status."),
):
"""
Batch upload and process files into a Yuxi-Know knowledge base.
Batch upload and process files into a Yuxi knowledge base.
"""
console.print(f"[bold green]Starting batch upload for knowledge base: {db_id}[/bold green]")

View File

@ -1,8 +1,8 @@
# Yuxi-Know Initialization Script for PowerShell
# This script helps set up the environment for the Yuxi-Know project
# Yuxi Initialization Script for PowerShell
# This script helps set up the environment for the Yuxi project
# Note: API keys will be visible during input - use with care
Write-Host "🚀 Initializing Yuxi-Know project..." -ForegroundColor Cyan
Write-Host "🚀 Initializing Yuxi project..." -ForegroundColor Cyan
Write-Host "==================================" -ForegroundColor Cyan
# Check if .env file exists

View File

@ -1,11 +1,11 @@
#!/bin/bash
# Yuxi-Know Initialization Script for Bash/Linux/macOS
# This script helps set up the environment for the Yuxi-Know project
# Yuxi Initialization Script for Bash/Linux/macOS
# This script helps set up the environment for the Yuxi project
set -e
echo "🚀 Initializing Yuxi-Know project..."
echo "🚀 Initializing Yuxi project..."
echo "=================================="
# Check if .env file exists

View File

@ -1362,7 +1362,7 @@ async def get_supported_file_types(current_user: User = Depends(get_admin_user))
@knowledge.post("/files/markdown")
async def mark_it_down(file: UploadFile = File(...), current_user: User = Depends(get_admin_user)):
"""调用 src.knowledge.indexing 下面的 process_file_to_markdown 解析为 markdown参数是文件需要管理员权限"""
"""调用 yuxi.knowledge.indexing 下面的 process_file_to_markdown 解析为 markdown参数是文件需要管理员权限"""
try:
content = await file.read()
markdown_content = await process_file_to_markdown(content)

View File

@ -3,7 +3,7 @@
# 测试脚本运行器
# 提供快速运行不同类型测试的方法
echo "Yuxi-Know API 测试运行器"
echo "Yuxi API 测试运行器"
echo "========================"
# 检查测试服务是否运行

View File

@ -79,7 +79,7 @@ async def test_dify_kb_aquery_maps_records(monkeypatch, tmp_path):
}
monkeypatch.setattr(
"src.knowledge.implementations.dify.httpx.AsyncClient",
"yuxi.knowledge.implementations.dify.httpx.AsyncClient",
lambda **kwargs: _FakeAsyncClient(response_payload=payload, **kwargs),
)
@ -110,7 +110,7 @@ async def test_dify_kb_aquery_error_returns_empty(monkeypatch, tmp_path):
}
monkeypatch.setattr(
"src.knowledge.implementations.dify.httpx.AsyncClient",
"yuxi.knowledge.implementations.dify.httpx.AsyncClient",
lambda **kwargs: _FakeAsyncClient(raises=RuntimeError("boom"), **kwargs),
)

View File

@ -36,7 +36,7 @@ async def test_txt_add_vector_entity_parsing():
mock_session.execute_write.side_effect = side_effect_execute_write
# Mock embedding model
with patch("src.models.select_embedding_model") as mock_select_model:
with patch("yuxi.models.select_embedding_model") as mock_select_model:
mock_embed_model = MagicMock()
mock_select_model.return_value = mock_embed_model
@ -52,14 +52,14 @@ async def test_txt_add_vector_entity_parsing():
gd.embed_model_name = "test_model"
# Mock config where it's imported in upload_graph_service.py
# The import is `from src import config`, so patch at the usage location
# The import is `from yuxi import config`, so patch at the usage location
mock_config = MagicMock()
mock_config.embed_model = "test_model"
mock_embed_info = MagicMock()
mock_embed_info.dimension = 1024
mock_config.embed_model_names = {"test_model": mock_embed_info}
with patch("src.knowledge.graphs.upload_graph_service.config", mock_config):
with patch("yuxi.knowledge.graphs.upload_graph_service.config", mock_config):
# Test data: Mixed format
triples = [
# Legacy format

View File

@ -5,7 +5,7 @@ import markdownItTaskCheckbox from 'markdown-it-task-checkbox'
// https://vitepress.dev/reference/site-config
export default defineConfig({
lang: 'zh-CN',
title: "Yuxi-Know",
title: "Yuxi",
description: "语析",
base: '/Yuxi-Know/',
srcDir: './',
@ -35,7 +35,7 @@ export default defineConfig({
{
text: '简介',
items: [
{ text: '什么是 Yuxi-Know', link: '/latest/intro/project-overview' },
{ text: '什么是 Yuxi', link: '/latest/intro/project-overview' },
{ text: '快速开始', link: '/latest/intro/quick-start' },
{ text: '模型配置', link: '/latest/intro/model-config' },
{ text: '知识库与知识图谱', link: '/latest/intro/knowledge-base' },
@ -77,7 +77,7 @@ export default defineConfig({
{
text: '简介',
items: [
{ text: '什么是 Yuxi-Know', link: '/v0.4.0/intro/project-overview' },
{ text: '什么是 Yuxi', link: '/v0.4.0/intro/project-overview' },
{ text: '快速开始', link: '/v0.4.0/intro/quick-start' },
{ text: '模型配置', link: '/v0.4.0/intro/model-config' },
{ text: '知识库与知识图谱', link: '/v0.4.0/intro/knowledge-base' },

View File

@ -3,7 +3,7 @@
layout: home
hero:
name: "Yuxi-Know"
name: "Yuxi"
text: "智能知识库与知识图谱问答系统"
tagline: 基于 LangGraph + Vue.js + FastAPI + LightRAG 架构构建的智能问答平台
image:

View File

@ -1,18 +1,18 @@
# 品牌自定义
Yuxi-Know 支持完整的品牌自定义,包括 Logo、组织名称、版权信息、登录协议等方便企业用户进行品牌定制。
Yuxi 支持完整的品牌自定义,包括 Logo、组织名称、版权信息、登录协议等方便企业用户进行品牌定制。
## 品牌信息配置
### 步骤 1复制模板文件
```bash
cp src/config/static/info.template.yaml src/config/static/info.local.yaml
cp backend/package/yuxi/config/static/info.template.yaml backend/package/yuxi/config/static/info.local.yaml
```
### 步骤 2编辑品牌信息
`src/config/static/info.local.yaml` 中配置你的品牌信息:
`backend/package/yuxi/config/static/info.local.yaml` 中配置你的品牌信息:
- 应用名称
- 组织名称
@ -25,7 +25,7 @@ cp src/config/static/info.template.yaml src/config/static/info.local.yaml
`.env` 中指定配置文件路径:
```env
YUXI_BRAND_FILE_PATH=src/config/static/info.local.yaml
YUXI_BRAND_FILE_PATH=backend/package/yuxi/config/static/info.local.yaml
```
::: tip 配置优先级
@ -38,7 +38,7 @@ YUXI_BRAND_FILE_PATH=src/config/static/info.local.yaml
### 配置项
`src/config/static/info.local.yaml` 的 `footer` 下新增以下字段:
`backend/package/yuxi/config/static/info.local.yaml` 的 `footer` 下新增以下字段:
```yaml
footer:

View File

@ -1,10 +1,10 @@
# 配置系统详解
Yuxi-Know 采用了现代化的配置管理系统,基于 Pydantic BaseModel 和 TOML 格式,提供了类型安全、智能提示和选择性持久化等特性。这套系统既满足了开发者对灵活配置的需求,又保证了运行时的稳定性。
Yuxi 采用了现代化的配置管理系统,基于 Pydantic BaseModel 和 TOML 格式,提供了类型安全、智能提示和选择性持久化等特性。这套系统既满足了开发者对灵活配置的需求,又保证了运行时的稳定性。
## 设计理念
传统的配置文件往往存在以下问题格式不统一、类型安全缺失、难以追踪哪些配置是用户修改过的。Yuxi-Know 的配置系统针对这些问题给出了解决方案:
传统的配置文件往往存在以下问题格式不统一、类型安全缺失、难以追踪哪些配置是用户修改过的。Yuxi 的配置系统针对这些问题给出了解决方案:
- **类型安全**:基于 Pydantic所有配置项都有明确的类型定义
- **智能提示**IDE 可以根据类型定义提供自动补全
@ -26,7 +26,7 @@ Yuxi-Know 采用了现代化的配置管理系统,基于 Pydantic BaseModel
### 各层作用
1. **代码默认值**:定义在 `src/config/app.py` 和 `src/config/static/models.py` 中,提供所有配置项的初始值
1. **代码默认值**:定义在 `backend/package/yuxi/config/app.py` 和 `backend/package/yuxi/config/static/models.py` 中,提供所有配置项的初始值
2. **用户配置**:保存在 `saves/config/base.toml`,只包含用户实际修改过的配置项。这种设计的好处是:当代码更新添加了新配置项时,不会被用户的旧配置文件覆盖
@ -72,7 +72,7 @@ DEFAULT_CHAT_MODEL_PROVIDERS: dict[str, ChatModelProvider] = {
### 读取配置
```python
from src.config import config
from yuxi.config import config
# 访问配置项
model = config.default_model
@ -82,7 +82,7 @@ reranker_enabled = config.enable_reranker
### 修改配置
```python
from src.config import config
from yuxi.config import config
# 修改配置
config.enable_reranker = True
@ -95,7 +95,7 @@ config.save()
### 配置验证
```python
from src.config import config
from yuxi.config import config
# 检查模型提供商可用性
for provider, status in config.model_provider_status.items():
@ -112,7 +112,7 @@ embed_models = config.get_embed_model_choices()
### 步骤 1添加提供商配置
`src/config/static/models.py` 的 `DEFAULT_CHAT_MODEL_PROVIDERS` 字典中添加新条目:
`backend/package/yuxi/config/static/models.py` 的 `DEFAULT_CHAT_MODEL_PROVIDERS` 字典中添加新条目:
```python
"new-provider": ChatModelProvider(
@ -144,7 +144,7 @@ NEW_PROVIDER_API_KEY=your_api_key_here
配置可以动态修改,无需重启服务:
```python
from src.config import config
from yuxi.config import config
# 更新单个配置项
config.enable_reranker = True

View File

@ -1,6 +1,6 @@
# 生产部署指南
本文档介绍如何在生产环境中部署 Yuxi-Know
本文档介绍如何在生产环境中部署 Yuxi。
## 前置要求

View File

@ -1,6 +1,6 @@
# 文档处理与 OCR
Yuxi-Know 支持多种文档格式的智能解析,从简单的文本文件到复杂的 PDF 文档,都能自动提取内容并转换为可检索的格式。
Yuxi 支持多种文档格式的智能解析,从简单的文本文件到复杂的 PDF 文档,都能自动提取内容并转换为可检索的格式。
## 支持的文件类型

View File

@ -1,6 +1,6 @@
# 其他配置
本文档介绍 Yuxi-Know 的其他配置选项,包括内容安全、网页搜索和服务端口等。
本文档介绍 Yuxi 的其他配置选项,包括内容安全、网页搜索和服务端口等。
## 内容安全
@ -22,7 +22,7 @@
**关键词检测**
敏感词库位于 `src/config/static/bad_keywords.txt`,每行一个关键词。修改后实时生效,无需重启服务。
敏感词库位于 `backend/package/yuxi/config/static/bad_keywords.txt`,每行一个关键词。修改后实时生效,无需重启服务。
**LLM 检测**

View File

@ -1,6 +1,6 @@
# 智能体开发指南
Yuxi-Know 的智能体系统基于 LangGraph 构建,提供了灵活而强大的 Agent 开发能力。通过统一的 `AgentManager`,系统能够自动发现和管理所有智能体,让开发者能够专注于业务逻辑的实现。
Yuxi 的智能体系统基于 LangGraph 构建,提供了灵活而强大的 Agent 开发能力。通过统一的 `AgentManager`,系统能够自动发现和管理所有智能体,让开发者能够专注于业务逻辑的实现。
## 智能体架构
@ -15,7 +15,7 @@ Yuxi-Know 的智能体系统基于 LangGraph 构建,提供了灵活而强大
### 自动发现机制
智能体采用自动发现模式。在 `src/agents/__init__.py` 中,系统会遍历 `src/agents` 目录,自动注册所有继承自 `BaseAgent` 的类。这意味着开发者只需要按照规范编写代码,智能体就会自动被系统识别,无需手动配置。
智能体采用自动发现模式。在 `backend/package/yuxi/agents/__init__.py` 中,系统会遍历 `backend/package/yuxi/agents` 目录,自动注册所有继承自 `BaseAgent` 的类。这意味着开发者只需要按照规范编写代码,智能体就会自动被系统识别,无需手动配置。
仓库预置了几个可以直接使用的智能体示例:
@ -29,10 +29,10 @@ Yuxi-Know 的智能体系统基于 LangGraph 构建,提供了灵活而强大
### 目录结构
`src/agents` 目录下创建新的智能体包,建议保持以下结构:
`backend/package/yuxi/agents` 目录下创建新的智能体包,建议保持以下结构:
```
src/agents/
backend/package/yuxi/agents/
└── my_agent/
├── __init__.py # 暴露主类
├── graph.py # Graph 构造逻辑
@ -44,7 +44,7 @@ src/agents/
智能体类需要继承 `BaseAgent` 并实现异步的 `get_graph` 方法:
```python
from src.agents.common import BaseAgent
from yuxi.agents.common import BaseAgent
from langgraph.prebuilt import create_agent
class MyAgent(BaseAgent):

View File

@ -5,7 +5,7 @@
## BaseContext 详解
```python
from src.agents.common import BaseContext
from yuxi.agents.common import BaseContext
from dataclasses import dataclass
@dataclass(kw_only=True)
@ -38,9 +38,9 @@ class MyAgentContext(BaseContext):
有时需要自定义工具选项,比如 ReporterAgent 需要包含 MySQL 工具:
```python
from src.agents.common import BaseContext, gen_tool_info
from src.agents.common.toolkits.buildin import calculator, query_knowledge_graph
from src.agents.common.toolkits.mysql import get_mysql_tools
from yuxi.agents.common import BaseContext, gen_tool_info
from yuxi.agents.common.toolkits.buildin import calculator, query_knowledge_graph
from yuxi.agents.common.toolkits.mysql import get_mysql_tools
@dataclass(kw_only=True)
class ReporterContext(BaseContext):

View File

@ -17,7 +17,7 @@
支持文件上传功能的中间件。如果智能体需要处理用户上传的文档,可以启用此中间件:
```python
from src.agents.common.middlewares import inject_attachment_context
from yuxi.agents.common.middlewares import inject_attachment_context
async def get_graph(self):
graph = create_agent(
@ -41,4 +41,4 @@ async def get_graph(self):
## 自定义中间件
新增中间件时,将其放入 `src/agents/common/middlewares` 目录,然后在智能体的 `middleware` 列表中引用即可。
新增中间件时,将其放入 `backend/package/yuxi/agents/common/middlewares` 目录,然后在智能体的 `middleware` 列表中引用即可。

View File

@ -1,6 +1,6 @@
# Skills 管理系统
Skills 是 Yuxi-Know 系统中用于扩展 Agent 能力的重要机制。通过 Skills开发者可以将特定的工具、提示词模板或领域知识打包成可复用的技能包让 Agent 在对话过程中能够调用这些额外能力。
Skills 是 Yuxi 系统中用于扩展 Agent 能力的重要机制。通过 Skills开发者可以将特定的工具、提示词模板或领域知识打包成可复用的技能包让 Agent 在对话过程中能够调用这些额外能力。
## 为什么需要 Skills
@ -280,4 +280,4 @@ A系统会在保存依赖配置时进行校验如果引用的工具或 MCP
---
通过 Skills 机制Yuxi-Know 为 Agent 提供了一个灵活、可扩展的能力扩展框架。你可以将自己积累的业务知识、工具能力封装成 Skills让不同的 Agent 复用这些能力,极大地提升了系统的可维护性和复用性。
通过 Skills 机制Yuxi 为 Agent 提供了一个灵活、可扩展的能力扩展框架。你可以将自己积累的业务知识、工具能力封装成 Skills让不同的 Agent 复用这些能力,极大地提升了系统的可维护性和复用性。

View File

@ -1,6 +1,6 @@
# 工具系统
Yuxi-Know 提供了统一的工具获取机制,支持多种工具类型的动态组装。
Yuxi 提供了统一的工具获取机制,支持多种工具类型的动态组装。
## 工具获取机制
@ -11,7 +11,7 @@ Yuxi-Know 提供了统一的工具获取机制,支持多种工具类型的动
3. **MCP 工具**:根据 `context.mcps` 加载并过滤的 MCP 服务器工具
```python
from src.agents.common.tools import get_tools_from_context
from yuxi.agents.common.tools import get_tools_from_context
async def get_graph(self, **kwargs):
context = self.get_context()
@ -20,16 +20,16 @@ async def get_graph(self, **kwargs):
## 工具注册机制
Yuxi-Know 的工具系统基于注册机制而非继承体系,这一点与 LangChain 原生的 `@tool` 装饰器有本质区别。
Yuxi 的工具系统基于注册机制而非继承体系,这一点与 LangChain 原生的 `@tool` 装饰器有本质区别。
LangChain 的 `@tool` 装饰器通常需要继承特定基类或实现特定接口,创建的工具有着强烈的框架耦合。而 Yuxi-Know 的工具注册表是一个独立的全局注册中心,任何符合规范的函数都可以通过 `@tool` 装饰器注册到系统中,无需继承任何基类,也不需要了解框架内部实现。
LangChain 的 `@tool` 装饰器通常需要继承特定基类或实现特定接口,创建的工具有着强烈的框架耦合。而 Yuxi 的工具注册表是一个独立的全局注册中心,任何符合规范的函数都可以通过 `@tool` 装饰器注册到系统中,无需继承任何基类,也不需要了解框架内部实现。
需要特别说明的是Yuxi-Know`@tool` 装饰器并非全新实现,而是基于 LangChain 原生 `@tool` 的扩展。装饰器的核心逻辑继承自 LangChain新增了 `category`、`tags`、`display_name` 等元数据字段用于前端展示和分类,原有的 LangChain 特性(如函数参数注解、描述文档等)完全兼容。
需要特别说明的是Yuxi 的 `@tool` 装饰器并非全新实现,而是基于 LangChain 原生 `@tool` 的扩展。装饰器的核心逻辑继承自 LangChain新增了 `category`、`tags`、`display_name` 等元数据字段用于前端展示和分类,原有的 LangChain 特性(如函数参数注解、描述文档等)完全兼容。
注册表的核心位于 `src/agents/common/toolkits/registry.py`,它维护着一个全局的工具实例列表。当系统启动时,所有导入 `toolkits` 包的模块都会自动执行其内部的工具注册逻辑,这意味着开发者只需要在自己的模块中添加装饰器,工具就会自动被发现和使用。
注册表的核心位于 `backend/package/yuxi/agents/common/toolkits/registry.py`,它维护着一个全局的工具实例列表。当系统启动时,所有导入 `toolkits` 包的模块都会自动执行其内部的工具注册逻辑,这意味着开发者只需要在自己的模块中添加装饰器,工具就会自动被发现和使用。
```python
from src.agents.common.toolkits.registry import tool
from yuxi.agents.common.toolkits.registry import tool
@tool(category="buildin", tags=["计算"], display_name="计算器")
def calculator(a: float, b: float, operation: str) -> float:
@ -54,7 +54,7 @@ def calculator(a: float, b: float, operation: str) -> float:
与内置工具不同,知识库工具是动态生成的。当在智能体配置中指定 `context.knowledges` 时,系统会根据指定的 knowledge 名称动态创建对应的检索工具。这种设计使得知识库工具不需要预先注册,而是在运行时按需生成。
```python
from src.agents.common.toolkits.kbs import get_common_kb_tools
from yuxi.agents.common.toolkits.kbs import get_common_kb_tools
kb_tools = get_common_kb_tools(knowledge_names=["kb1", "kb2"])
```

View File

@ -1,6 +1,6 @@
# 参与贡献
感谢你对 Yuxi-Know 项目的兴趣!我们欢迎任何形式的贡献,包括但不限于代码提交、功能建议、问题反馈和文档改进。
感谢你对 Yuxi 项目的兴趣!我们欢迎任何形式的贡献,包括但不限于代码提交、功能建议、问题反馈和文档改进。
<a href="https://github.com/xerrors/Yuxi-Know/contributors">
<img src="https://contributors.nn.ci/api?repo=xerrors/Yuxi-Know" alt="贡献者名单">

View File

@ -1,6 +1,6 @@
# 常见问题
以下是 Yuxi-Know 在安装和使用过程中最常见的问题及其解决方案。
以下是 Yuxi 在安装和使用过程中最常见的问题及其解决方案。
## Docker 与启动问题

View File

@ -148,14 +148,14 @@ sequenceDiagram
### 后端
1. `/Yuxi-Know/src/services/run_queue_service.py`
2. `/Yuxi-Know/src/services/run_worker.py`
3. `/Yuxi-Know/src/services/agent_run_service.py`
4. `/Yuxi-Know/src/repositories/agent_run_repository.py`
1. `/Yuxi-Know/backend/package/yuxi/services/run_queue_service.py`
2. `/Yuxi-Know/backend/package/yuxi/services/run_worker.py`
3. `/Yuxi-Know/backend/package/yuxi/services/agent_run_service.py`
4. `/Yuxi-Know/backend/package/yuxi/repositories/agent_run_repository.py`
5. `/Yuxi-Know/server/routers/chat_router.py`
6. `/Yuxi-Know/server/worker_main.py`
7. `/Yuxi-Know/src/storage/postgres/manager.py`
8. `/Yuxi-Know/src/storage/postgres/models_business.py`
7. `/Yuxi-Know/backend/package/yuxi/storage/postgres/manager.py`
8. `/Yuxi-Know/backend/package/yuxi/storage/postgres/models_business.py`
### 前端

View File

@ -1,6 +1,6 @@
# 知识库与知识图谱
Yuxi-Know 提供了强大的知识管理能力,将知识以向量和图谱两种形式存储,既支持传统的语义检索,又能构建结构化的知识关系网络。
Yuxi 提供了强大的知识管理能力,将知识以向量和图谱两种形式存储,既支持传统的语义检索,又能构建结构化的知识关系网络。
## 为什么需要知识库
@ -161,4 +161,4 @@ POST /api/knowledge/databases/{db_id}/documents
---
知识库是 Yuxi-Know 的核心能力之一,通过本文档的介绍,你应该能够掌握创建和使用知识库的基本方法。对于更高级的用法,如评估基准构建、图增强检索优化等,可以进一步探索系统的其他功能。
知识库是 Yuxi 的核心能力之一,通过本文档的介绍,你应该能够掌握创建和使用知识库的基本方法。对于更高级的用法,如评估基准构建、图增强检索优化等,可以进一步探索系统的其他功能。

View File

@ -182,7 +182,7 @@ models = [
#### 1. 配置模型信息
`src/config/static/models.py` 中的默认配置部分添加:
`backend/package/yuxi/config/static/models.py` 中的默认配置部分添加:
```python
# 默认嵌入模型配置
@ -214,8 +214,8 @@ DEFAULT_RERANKERS: dict[str, RerankerInfo] = {
你也可以通过代码动态添加本地模型:
```python
from src.config import config
from src.config.static.models import EmbedModelInfo, RerankerInfo
from yuxi.config import config
from yuxi.config.static.models import EmbedModelInfo, RerankerInfo
# 添加本地嵌入模型
config.embed_model_names["local/embed-model"] = EmbedModelInfo(

View File

@ -1,6 +1,6 @@
# 项目简介
Yuxi-Know(语析)是一个基于大模型的智能知识库与知识图谱智能体开发平台。它融合了 RAG检索增强生成技术与知识图谱技术为用户提供智能问答和知识管理服务。
Yuxi语析是一个基于大模型的智能知识库与知识图谱智能体开发平台。它融合了 RAG检索增强生成技术与知识图谱技术为用户提供智能问答和知识管理服务。
## 设计理念
@ -62,7 +62,7 @@ Yuxi-Know语析是一个基于大模型的智能知识库与知识图谱
## 适用场景
Yuxi-Know 适用于以下场景:
Yuxi 适用于以下场景:
- **企业知识库**:构建私有知识问答系统
- **智能客服**:基于文档的自动问答

View File

@ -1,6 +1,6 @@
# 快速开始指南
Yuxi-Know(语析)是一个基于知识图谱和向量数据库的智能知识库系统。通过本文档,你可以在几分钟内完成环境搭建并开始使用。
Yuxi语析是一个基于知识图谱和向量数据库的智能知识库系统。通过本文档你可以在几分钟内完成环境搭建并开始使用。
::: tip 提示
除了此文档网站外,你还可以访问 [Zread](https://zread.ai/xerrors/Yuxi-Know) 或 [DeepWiki](https://deepwiki.com/xerrors/Yuxi-Know) 查看自动生成的详细项目文档。

View File

@ -2,7 +2,7 @@
## 智能体开发
系统基于 [LangGraph](https://github.com/langchain-ai/langgraph) 并通过统一的 `AgentManager` 管理所有智能体。`src/agents/__init__.py` 会在启动时遍历 `src/agents` 目录,对每个包含 `__init__.py` 的子包执行自动发现:所有继承 `BaseAgent` 的类都会被注册并立即初始化,因此只要代码落位正确,就不需要再手动登记或修改管理器。
系统基于 [LangGraph](https://github.com/langchain-ai/langgraph) 并通过统一的 `AgentManager` 管理所有智能体。`backend/package/yuxi/agents/__init__.py` 会在启动时遍历 `backend/package/yuxi/agents` 目录,对每个包含 `__init__.py` 的子包执行自动发现:所有继承 `BaseAgent` 的类都会被注册并立即初始化,因此只要代码落位正确,就不需要再手动登记或修改管理器。
仓库预置了若干可直接运行的智能体:`chatbot` 聚焦对话与动态工具调度,`reporter` 演示报告类链路。这些目录展示了上下文类、Graph 构造方式、子智能体引用以及中间件组合的范例,新增功能时可以直接复用。
@ -14,29 +14,29 @@
- `description`: 智能体功能描述
- `examples`: 示例问题列表(数组格式)
例如,`src/agents/chatbot/metadata.toml`
例如,`backend/package/yuxi/agents/chatbot/metadata.toml`
<<< @/../src/agents/chatbot/metadata.toml
<<< @/../backend/package/yuxi/agents/chatbot/metadata.toml
**注意**`metadata.toml` 文件是可选的,如果没有提供,系统将使用智能体类的基本属性。
### 创建新的智能体
`src/agents` 下新建一个包,保持与现有目录一致的结构:放置 Graph 构造逻辑(通常命名为 `graph.py`),并在包内的 `__init__.py` 中暴露主类。
`backend/package/yuxi/agents` 下新建一个包,保持与现有目录一致的结构:放置 Graph 构造逻辑(通常命名为 `graph.py`),并在包内的 `__init__.py` 中暴露主类。
智能体类必须继承 `src.agents.common.BaseAgent`,同时实现异步的 `get_graph` 方法来返回编译后的 LangGraph 实例,并配置好 `checkpointer`,否则无法从历史对话中恢复。
智能体类必须继承 `yuxi.agents.common.BaseAgent`,同时实现异步的 `get_graph` 方法来返回编译后的 LangGraph 实例,并配置好 `checkpointer`,否则无法从历史对话中恢复。
需要额外上下文字段时,可继承 `BaseContext` 构建自己的配置表单,再把类绑定到 `context_schema`,平台会在 `saves/agents/<module>` 下生成默认配置。
案例 基于MySQL工具以及自定义 MCP Server 的数据库报表助手。
<<< @/../src/agents/reporter/graph.py
<<< @/../backend/package/yuxi/agents/reporter/graph.py
智能体实例的生命周期交给管理器处理,会在自动发现时完成初始化并缓存单例,以便快速响应请求。在容器内热重载时,只要保存文件即可触发重新导入;需要强制刷新可调用 `agent_manager.get_agent(<id>, reload=True)`
更多动态工具选择与 MCP 注册的例子,见 `src/agents/chatbot/graph.py` 中的中间件组合。
更多动态工具选择与 MCP 注册的例子,见 `backend/package/yuxi/agents/chatbot/graph.py` 中的中间件组合。
### 拓展现有智能体
@ -46,13 +46,13 @@
### 子智能体与中间件
子智能体集中放在 `src/agents/common/subagents` 目录,典型例子是 `calc_agent`,它通过 LangChain 的 `create_agent` 构建计算器能力并以工具暴露给主图。新增子智能体时沿用这一结构:在目录内编写封装函数与 `@tool` 装饰器,导出后即可被任意智能体调用。
子智能体集中放在 `backend/package/yuxi/agents/common/subagents` 目录,典型例子是 `calc_agent`,它通过 LangChain 的 `create_agent` 构建计算器能力并以工具暴露给主图。新增子智能体时沿用这一结构:在目录内编写封装函数与 `@tool` 装饰器,导出后即可被任意智能体调用。
中间件位于 `src/agents/common/middlewares`,包含上下文感知提示词、模型选择、动态工具加载以及附件注入等实现。如果需要编写新的中间件,请遵循 LangChain 官方文档中对 `AgentMiddleware`、`ModelRequest`、`ModelResponse` 等接口的定义,完成后在该目录的 `__init__.py` 暴露入口,主智能体即可在 `middleware` 列表中引用。
中间件位于 `backend/package/yuxi/agents/common/middlewares`,包含上下文感知提示词、模型选择、动态工具加载以及附件注入等实现。如果需要编写新的中间件,请遵循 LangChain 官方文档中对 `AgentMiddleware`、`ModelRequest`、`ModelResponse` 等接口的定义,完成后在该目录的 `__init__.py` 暴露入口,主智能体即可在 `middleware` 列表中引用。
#### 文件上传中间件
文件上传功能通过 `inject_attachment_context` 中间件实现(位于 `src/agents/common/middlewares/attachment_middleware.py`)。该中间件基于 LangChain 1.0 的 `AgentMiddleware` 标准实现,具有以下特点:
文件上传功能通过 `inject_attachment_context` 中间件实现(位于 `backend/package/yuxi/agents/common/middlewares/attachment_middleware.py`)。该中间件基于 LangChain 1.0 的 `AgentMiddleware` 标准实现,具有以下特点:
1. **状态扩展**:定义 `AttachmentState` 扩展 `AgentState`,添加可选的 `attachments` 字段
2. **自动注入**:在模型调用前,从 `request.state` 中读取附件并转换为 `SystemMessage`
@ -72,7 +72,7 @@ class MyAgent(BaseAgent):
**步骤 2添加中间件**(让智能体能够处理附件内容)
```python
from src.agents.common.middlewares import inject_attachment_context
from yuxi.agents.common.middlewares import inject_attachment_context
async def get_graph(self):
graph = create_agent(
@ -102,7 +102,7 @@ async def get_graph(self):
系统会根据配置自动组装工具集合涵盖知识图谱查询、向量检索生成的动态工具、MySQL 只读查询能力、Tavily 搜索以及所有注册的 MCP 工具。
工具的启用状态和描述由配置文件或环境变量决定当依赖缺失时会被中间件自动忽略从而避免在图中加载不可用能力。MCP Server 的接入方式保持不变,只需在 `src/agents/common/mcp.py` 的 `MCP_SERVERS` 中填入服务地址与 `transport` 类型,如需更多范式可参阅 LangChain 官方文档。
工具的启用状态和描述由配置文件或环境变量决定当依赖缺失时会被中间件自动忽略从而避免在图中加载不可用能力。MCP Server 的接入方式保持不变,只需在 `backend/package/yuxi/agents/common/mcp.py` 的 `MCP_SERVERS` 中填入服务地址与 `transport` 类型,如需更多范式可参阅 LangChain 官方文档。
### MCP 服务器配置方式
@ -172,7 +172,7 @@ MCP_SERVERS = {
"tool",
"run",
"arxiv-mcp-server",
"--storage-path", "src/agents/mcp_repos/arxiv-mcp-server"
"--storage-path", "backend/package/yuxi/agents/mcp_repos/arxiv-mcp-server"
],
"transport": "stdio"
}
@ -197,7 +197,7 @@ MCP_SERVERS = {
系统支持动态加载 MCP 工具:
```python
from src.agents.common.mcp import get_mcp_tools, add_mcp_server
from yuxi.agents.common.mcp import get_mcp_tools, add_mcp_server
# 获取特定服务器的工具
tools = await get_mcp_tools("sequentialthinking")
@ -227,7 +227,7 @@ MYSQL_PORT=3306
MYSQL_CHARSET=utf8mb4
```
所有查询限定在只读范围SELECT、SHOW、DESCRIBE、EXPLAIN请求会经过表名校验与超时控制默认限制 60 秒与 100 行输出,并可通过配置调整上限。连接信息会反馈给 LangGraph智能体可以自动陈述数据库用途并选择更准确的检索策略。详见代码部分 `src/agents/common/toolkits/mysql/`
所有查询限定在只读范围SELECT、SHOW、DESCRIBE、EXPLAIN请求会经过表名校验与超时控制默认限制 60 秒与 100 行输出,并可通过配置调整上限。连接信息会反馈给 LangGraph智能体可以自动陈述数据库用途并选择更准确的检索策略。详见代码部分 `backend/package/yuxi/agents/common/toolkits/mysql/`
### 多模态图片支持

View File

@ -7,14 +7,14 @@
### 1. 复制模板文件
```bash
cp src/config/static/info.template.yaml src/config/static/info.local.yaml
cp backend/package/yuxi/config/static/info.template.yaml backend/package/yuxi/config/static/info.local.yaml
```
### 2. 编辑品牌信息
`src/config/static/info.local.yaml` 中配置:
`backend/package/yuxi/config/static/info.local.yaml` 中配置:
<<< @/../src/config/static/info.template.yaml
<<< @/../backend/package/yuxi/config/static/info.template.yaml
上述中提到的 ICON 预设了下面这些,如果需要更多的 ICONS可以手动从 `lucide-vue-next` 中引入。
@ -25,7 +25,7 @@ cp src/config/static/info.template.yaml src/config/static/info.local.yaml
`.env` 文件中指定配置文件路径:
```bash
YUXI_BRAND_FILE_PATH=src/config/static/info.local.yaml
YUXI_BRAND_FILE_PATH=backend/package/yuxi/config/static/info.local.yaml
```
::: tip 配置优先级

View File

@ -11,8 +11,8 @@ Yuxi-Know 从 v0.3.x 版本开始采用了全新的配置系统,基于 Pydanti
```
配置系统架构
├── 默认配置 (代码定义)
│ ├── src/config/static/models.py (模型配置)
│ └── src/config/app.py (应用配置)
│ ├── backend/package/yuxi/config/static/models.py (模型配置)
│ └── backend/package/yuxi/config/app.py (应用配置)
├── 用户配置 (TOML 文件)
│ └── saves/config/base.toml (仅保存用户修改)
└── 环境变量 (运行时覆盖)
@ -21,7 +21,7 @@ Yuxi-Know 从 v0.3.x 版本开始采用了全新的配置系统,基于 Pydanti
### 核心组件
#### 1. Config 类 (`src/config/app.py`)
#### 1. Config 类 (`backend/package/yuxi/config/app.py`)
主配置类,继承自 Pydantic BaseModel提供
@ -44,7 +44,7 @@ class Config(BaseModel):
model_provider_status: dict[str, bool] = Field(exclude=True)
```
#### 2. 模型配置类 (`src/config/static/models.py`)
#### 2. 模型配置类 (`backend/package/yuxi/config/static/models.py`)
定义了三种类型的模型配置:
@ -95,7 +95,7 @@ config.save() # 只保存 enable_reranker 到 TOML 文件
# enable_reranker = true
```
### 默认模型配置 (`src/config/static/models.py`)
### 默认模型配置 (`backend/package/yuxi/config/static/models.py`)
包含所有支持的模型提供商的默认配置,开发者可以直接修改此文件添加新的模型:
@ -140,7 +140,7 @@ models = [
### 动态配置更新
```python
from src.config import config
from yuxi.config import config
# 更新配置
config.enable_reranker = True
@ -160,7 +160,7 @@ config._save_models_to_file("siliconflow")
```python
# 验证配置
from src.config import config
from yuxi.config import config
# 检查模型提供商可用性
for provider, status in config.model_provider_status.items():

View File

@ -7,11 +7,11 @@
检测流程为,接收到用户输入之后,就对用户的输入进行检测是否合规,同时在流式传输的过程中进行实时检测(仅关键词)。当流式输出结束之后,则开始检测整个内容。
**注意**,使用 LLM 检测虽然可以大大缓解提示词注入带来的问题,但也会在用户交互上带来延迟影响,需要考虑是否启用。
对于关键词检测,敏感词词库位于 `src/config/static/bad_keywords.txt` 文件,每行一个关键词,实时生效,无需重启服务。
对于关键词检测,敏感词词库位于 `backend/package/yuxi/config/static/bad_keywords.txt` 文件,每行一个关键词,实时生效,无需重启服务。
对于 LLM 检测Prompt 可以看到 `src/plugins/guard.py`
对于 LLM 检测Prompt 可以看到 `backend/package/yuxi/plugins/guard.py`
<<< @/../src/plugins/guard.py#guard_prompt
<<< @/../backend/package/yuxi/plugins/guard.py#guard_prompt
## 网页搜索

View File

@ -40,7 +40,7 @@ default_model: siliconflow/deepseek-ai/DeepSeek-V3.2
::: tip 配置系统升级 (v0.3.x)
`v0.3.x` 版本开始,模型配置系统已升级为基于 Pydantic BaseModel 的类型安全配置,支持 TOML 格式的用户配置文件。
- **默认配置**: `src/config/static/models.py` (Python 代码)
- **默认配置**: `backend/package/yuxi/config/static/models.py` (Python 代码)
- **用户配置**: `saves/config/base.toml` (TOML 格式,仅保存用户修改)
- **自定义供应商**: `saves/config/custom_providers.toml` (独立配置文件)
:::
@ -156,7 +156,7 @@ models = [
#### 1. 配置模型信息
`src/config/static/models.py` 中的默认配置部分添加:
`backend/package/yuxi/config/static/models.py` 中的默认配置部分添加:
```python
# 默认嵌入模型配置
@ -188,8 +188,8 @@ DEFAULT_RERANKERS: dict[str, RerankerInfo] = {
你也可以通过代码动态添加本地模型:
```python
from src.config import config
from src.config.static.models import EmbedModelInfo, RerankerInfo
from yuxi.config import config
from yuxi.config.static.models import EmbedModelInfo, RerankerInfo
# 添加本地嵌入模型
config.embed_model_names["local/embed-model"] = EmbedModelInfo(

2
package-lock.json generated
View File

@ -1,5 +1,5 @@
{
"name": "Yuxi-Know",
"name": "Yuxi",
"lockfileVersion": 3,
"requires": true,
"packages": {

View File

@ -6,11 +6,11 @@ from typing import Annotated, Any
import requests
from langgraph.types import interrupt
from src import config, graph_base
from src.agents.common.toolkits.registry import ToolExtraMetadata, _all_tool_instances, _extra_registry, tool
from src.storage.minio import aupload_file_to_minio
from src.utils import logger
from src.utils.question_utils import normalize_questions
from yuxi import config, graph_base
from yuxi.agents.common.toolkits.registry import ToolExtraMetadata, _all_tool_instances, _extra_registry, tool
from yuxi.storage.minio import aupload_file_to_minio
from yuxi.utils import logger
from yuxi.utils.question_utils import normalize_questions
# Lazy initialization for TavilySearch (only when API key is available)
_tavily_search_instance = None

View File

@ -9,17 +9,17 @@ from typing import Any
from langchain.messages import AIMessage, AIMessageChunk, HumanMessage
from langgraph.types import Command
from src import config as conf
from src.agents import agent_manager
from src.plugins.guard import content_guard
from src.repositories.agent_config_repository import AgentConfigRepository
from src.repositories.conversation_repository import ConversationRepository
from src.storage.postgres.manager import pg_manager
from src.utils.logging_config import logger
from src.utils.question_utils import (
from yuxi import config as conf
from yuxi.agents import agent_manager
from yuxi.plugins.guard import content_guard
from yuxi.repositories.agent_config_repository import AgentConfigRepository
from yuxi.repositories.conversation_repository import ConversationRepository
from yuxi.storage.postgres.manager import pg_manager
from yuxi.utils.logging_config import logger
from yuxi.utils.question_utils import (
normalize_options as _normalize_interrupt_options,
)
from src.utils.question_utils import (
from yuxi.utils.question_utils import (
normalize_questions as _normalize_interrupt_questions,
)

View File

@ -1,5 +1,5 @@
{
"name": "yuxi-know-web",
"name": "yuxi-web",
"version": "0.5.3.web",
"private": true,
"scripts": {

View File

@ -12,7 +12,7 @@
alt="logo"
class="brand-logo"
/>
<div class="header-title">{{ branding.name || organization.name || 'Yuxi-Know' }}</div>
<div class="header-title">{{ branding.name || organization.name || 'Yuxi' }}</div>
</div>
<div class="header-actions">
<div

View File

@ -271,7 +271,7 @@ const brandOrgName = computed(() => {
})
const brandName = computed(() => {
const orgName = brandOrgName.value
const brandNameRaw = infoStore.branding?.name?.trim() || 'Yuxi-Know'
const brandNameRaw = infoStore.branding?.name?.trim() || 'Yuxi'
if (orgName && brandNameRaw && orgName !== brandNameRaw) {
return brandNameRaw