refactor: 重构:将项目重命名为 Yuxi 并更新模块路径
- 在所有文档和配置中将品牌从 "Yuxi-Know" 重命名为 "Yuxi" - 将 Python 导入路径从 `src.*` 更新为 `yuxi.*` 以保持后端包的一致性 - 将 Web 包名称从 `yuxi-know-web` 更新为 `yuxi-web` 此更改与后端代码迁移至 backend/ 目录保持一致。
This commit is contained in:
parent
410dd47c14
commit
90bfd20d8d
@ -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 进行管理,支持热重载开发。
|
||||
|
||||
## 开发准则
|
||||
|
||||
|
||||
@ -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 进行管理,支持热重载开发。
|
||||
|
||||
## 开发准则
|
||||
|
||||
|
||||
@ -17,5 +17,5 @@ executor = ThreadPoolExecutor() # noqa: E402
|
||||
|
||||
|
||||
def get_version():
|
||||
"""Return the Yuxi-Know version."""
|
||||
"""Return the Yuxi version."""
|
||||
return __version__
|
||||
|
||||
@ -18,5 +18,5 @@ __all__ = [
|
||||
|
||||
# 模块元数据
|
||||
__version__ = "1.0.0"
|
||||
__author__ = "Yuxi-Know Team"
|
||||
__author__ = "Yuxi Team"
|
||||
__description__ = "基于 create_deep_agent 的深度分析智能体"
|
||||
|
||||
@ -10,8 +10,8 @@ organization:
|
||||
|
||||
# 项目信息
|
||||
branding:
|
||||
name: "Yuxi-Know"
|
||||
title: "Yuxi-Know: 更智能的知识库智能体平台" # 系统标题
|
||||
name: "Yuxi"
|
||||
title: "Yuxi: 更智能的知识库智能体平台" # 系统标题
|
||||
subtitle: "大模型驱动的知识库智能体平台" # 副标题
|
||||
|
||||
features:
|
||||
|
||||
@ -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]")
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# 测试脚本运行器
|
||||
# 提供快速运行不同类型测试的方法
|
||||
|
||||
echo "Yuxi-Know API 测试运行器"
|
||||
echo "Yuxi API 测试运行器"
|
||||
echo "========================"
|
||||
|
||||
# 检查测试服务是否运行
|
||||
|
||||
@ -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),
|
||||
)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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' },
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: "Yuxi-Know"
|
||||
name: "Yuxi"
|
||||
text: "智能知识库与知识图谱问答系统"
|
||||
tagline: 基于 LangGraph + Vue.js + FastAPI + LightRAG 架构构建的智能问答平台
|
||||
image:
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 生产部署指南
|
||||
|
||||
本文档介绍如何在生产环境中部署 Yuxi-Know。
|
||||
本文档介绍如何在生产环境中部署 Yuxi。
|
||||
|
||||
## 前置要求
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 文档处理与 OCR
|
||||
|
||||
Yuxi-Know 支持多种文档格式的智能解析,从简单的文本文件到复杂的 PDF 文档,都能自动提取内容并转换为可检索的格式。
|
||||
Yuxi 支持多种文档格式的智能解析,从简单的文本文件到复杂的 PDF 文档,都能自动提取内容并转换为可检索的格式。
|
||||
|
||||
## 支持的文件类型
|
||||
|
||||
|
||||
@ -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 检测**
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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` 列表中引用即可。
|
||||
|
||||
@ -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 复用这些能力,极大地提升了系统的可维护性和复用性。
|
||||
|
||||
@ -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"])
|
||||
```
|
||||
|
||||
@ -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="贡献者名单">
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 常见问题
|
||||
|
||||
以下是 Yuxi-Know 在安装和使用过程中最常见的问题及其解决方案。
|
||||
以下是 Yuxi 在安装和使用过程中最常见的问题及其解决方案。
|
||||
|
||||
## Docker 与启动问题
|
||||
|
||||
|
||||
@ -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`
|
||||
|
||||
### 前端
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 知识库与知识图谱
|
||||
|
||||
Yuxi-Know 提供了强大的知识管理能力,将知识以向量和图谱两种形式存储,既支持传统的语义检索,又能构建结构化的知识关系网络。
|
||||
Yuxi 提供了强大的知识管理能力,将知识以向量和图谱两种形式存储,既支持传统的语义检索,又能构建结构化的知识关系网络。
|
||||
|
||||
## 为什么需要知识库
|
||||
|
||||
@ -161,4 +161,4 @@ POST /api/knowledge/databases/{db_id}/documents
|
||||
|
||||
---
|
||||
|
||||
知识库是 Yuxi-Know 的核心能力之一,通过本文档的介绍,你应该能够掌握创建和使用知识库的基本方法。对于更高级的用法,如评估基准构建、图增强检索优化等,可以进一步探索系统的其他功能。
|
||||
知识库是 Yuxi 的核心能力之一,通过本文档的介绍,你应该能够掌握创建和使用知识库的基本方法。对于更高级的用法,如评估基准构建、图增强检索优化等,可以进一步探索系统的其他功能。
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 项目简介
|
||||
|
||||
Yuxi-Know(语析)是一个基于大模型的智能知识库与知识图谱智能体开发平台。它融合了 RAG(检索增强生成)技术与知识图谱技术,为用户提供智能问答和知识管理服务。
|
||||
Yuxi(语析)是一个基于大模型的智能知识库与知识图谱智能体开发平台。它融合了 RAG(检索增强生成)技术与知识图谱技术,为用户提供智能问答和知识管理服务。
|
||||
|
||||
## 设计理念
|
||||
|
||||
@ -62,7 +62,7 @@ Yuxi-Know(语析)是一个基于大模型的智能知识库与知识图谱
|
||||
|
||||
## 适用场景
|
||||
|
||||
Yuxi-Know 适用于以下场景:
|
||||
Yuxi 适用于以下场景:
|
||||
|
||||
- **企业知识库**:构建私有知识问答系统
|
||||
- **智能客服**:基于文档的自动问答
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 快速开始指南
|
||||
|
||||
Yuxi-Know(语析)是一个基于知识图谱和向量数据库的智能知识库系统。通过本文档,你可以在几分钟内完成环境搭建并开始使用。
|
||||
Yuxi(语析)是一个基于知识图谱和向量数据库的智能知识库系统。通过本文档,你可以在几分钟内完成环境搭建并开始使用。
|
||||
|
||||
::: tip 提示
|
||||
除了此文档网站外,你还可以访问 [Zread](https://zread.ai/xerrors/Yuxi-Know) 或 [DeepWiki](https://deepwiki.com/xerrors/Yuxi-Know) 查看自动生成的详细项目文档。
|
||||
|
||||
@ -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/`
|
||||
|
||||
### 多模态图片支持
|
||||
|
||||
|
||||
@ -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 配置优先级
|
||||
|
||||
@ -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():
|
||||
|
||||
@ -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
|
||||
|
||||
## 网页搜索
|
||||
|
||||
|
||||
@ -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
2
package-lock.json
generated
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "Yuxi-Know",
|
||||
"name": "Yuxi",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
)
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "yuxi-know-web",
|
||||
"name": "yuxi-web",
|
||||
"version": "0.5.3.web",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user