Merge remote-tracking branch 'upstream/main' into fix/oidc-cross-system-login
This commit is contained in:
commit
60d82e6a9b
@ -24,6 +24,8 @@
|
||||
|
||||
Yuxi is an LLM-powered platform for building knowledge-base and knowledge-graph agents. It unifies **RAG retrieval**, **Milvus-backed in-knowledge-base graphs**, and **LangGraph multi-agent orchestration** into a single multi-tenant workspace: administrators configure knowledge bases, models, and permissions, while users chat — in a ChatGPT-like interface — with agents that can mount Skills, MCPs, sub-agents, and sandbox tools, and receive answers with cited sources, graph-based reasoning, and deliverable artifacts.
|
||||
|
||||
Navigation: [Introduction](https://xerrors.github.io/Yuxi/) | [Quick Start](https://xerrors.github.io/Yuxi/intro/quick-start) | [Roadmap](https://xerrors.github.io/Yuxi/develop-guides/roadmap); for the latest updates, see the [changelog](https://xerrors.github.io/Yuxi/develop-guides/changelog).
|
||||
|
||||
## Core Features
|
||||
|
||||
- 🤖 **Agent development** — Built on LangGraph, with sub-agents (SubAgents), Skills, MCPs, Tools, and middleware; long-running tasks run asynchronously on a background worker, backed by a sandbox file system for persisting, previewing, and downloading tool artifacts.
|
||||
@ -52,7 +54,7 @@ Yuxi is an LLM-powered platform for building knowledge-base and knowledge-graph
|
||||
**1. Clone and initialize**
|
||||
|
||||
```bash
|
||||
git clone --branch v0.7.0.beta2 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
git clone --branch v0.7.0.beta3 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
cd Yuxi
|
||||
|
||||
# Linux/macOS
|
||||
|
||||
109
README.md
109
README.md
@ -7,31 +7,25 @@
|
||||
[](https://github.com/xerrors/Yuxi/issues)
|
||||
[](https://github.com/xerrors/Yuxi/blob/main/LICENSE)
|
||||
[](https://deepwiki.com/xerrors/Yuxi)
|
||||
[](https://www.bilibili.com/video/BV1TZEx6NEit/)
|
||||
|
||||
|
||||
<a href="https://trendshift.io/repositories/24335" target="_blank"><img src="https://trendshift.io/api/badge/repositories/24335" alt="xerrors%2FYuxi | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
|
||||
[[文档]](https://xerrors.github.io/Yuxi) · [[English]](README.en.md)
|
||||
[[项目文档]](https://xerrors.github.io/Yuxi) · [[English]](README.en.md)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
**图由 GPT-Image-2 生成*
|
||||
|
||||
## 简介
|
||||
|
||||
语析(Yuxi)是一个基于大模型的智能知识库与知识图谱智能体开发平台。它把 **RAG 检索**、**Milvus 知识库内知识图谱** 与 **LangGraph 多智能体编排** 整合进统一的多租户工作台:管理员配置知识库、模型与权限,用户在类 ChatGPT 的界面中与可挂载 Skills、MCP、子智能体和沙盒工具的智能体对话,并获得带引用来源、知识图谱推理与可交付产物的回答。
|
||||
|
||||
## 核心特性
|
||||
导航:[项目介绍](https://xerrors.github.io/Yuxi/) | [快速开始](https://xerrors.github.io/Yuxi/intro/quick-start) | [开发路线图](https://xerrors.github.io/Yuxi/develop-guides/roadmap);最新开发动态,详见 [changelog](https://xerrors.github.io/Yuxi/develop-guides/changelog)。
|
||||
|
||||
- 🤖 **智能体开发** —— 基于 LangGraph 构建,支持子智能体(SubAgents)、Skills、MCP、Tools 与中间件机制;长耗时任务由后台 worker 异步执行,配套沙盒文件系统支持工具产物落盘、预览与下载。
|
||||
- 📚 **知识库(RAG)** —— 多格式文档解析(MinerU / PaddleX / OCR),可配置 Embedding 与 Rerank 模型,支持知识库评估与 PDF / 图片在线预览,检索来源回填到对话引用。
|
||||
- 🕸️ **知识图谱** —— 在 Milvus 知识库内构建、展示和检索实体关系图谱,并与 chunk 检索结果融合参与智能体推理。
|
||||
- 🏢 **多租户与权限** —— 用户 / 部门级权限管理,模型供应商统一配置,支持 API Key 认证供外部系统集成调用。
|
||||
- ⚙️ **平台与工程化** —— Vue + FastAPI 架构,开箱即用的 Docker Compose 部署,支持暗黑模式、LITE 轻量启动与生产级编排。
|
||||
|
||||

|
||||
|
||||
## 技术栈
|
||||
|
||||
@ -42,56 +36,6 @@
|
||||
| 存储 | PostgreSQL · Redis · MinIO · Milvus · Neo4j |
|
||||
| 文档解析 | MinerU · PaddleX · RapidOCR |
|
||||
| 部署 | Docker Compose |
|
||||
|
||||

|
||||
|
||||
## 最新动态
|
||||
|
||||
|
||||
<details>
|
||||
<summary>[2026/06] v0.7.0 开发中(重要不兼容变更)</summary>
|
||||
|
||||
**重大变更**
|
||||
|
||||
- **模型配置收敛**:移除旧版 v1 模型配置与 Ollama 支持,运行时统一使用 `provider_id:model_id` 与独立 provider 模块,自定义 provider 迁移到数据库
|
||||
- **智能体运行时收敛**:用户可见的 `AgentConfig` 收敛为数据库持久化的一级 `Agent`,新增 `/api/agent` 管理与运行接口,前端只提交 `agent_id`
|
||||
- **知识库能力收敛**:以 Yuxi 的知识库增强图谱构建、展示、检索链路替换历史 LightRAG 集成,并移除 Upload 类型;知识库类型收敛为单个类型与只读连接器(**Dify**、**Notion**),减少历史集成带来的兼容性问题
|
||||
- **Skill 安装与权限收敛**:以 `source_type / share_config / enabled` 表达来源、生效范围与启用状态;内置 Skill 启动自动入库并默认全局启用,上传/远程统一改为「解析草稿 → 确认安装」
|
||||
|
||||
|
||||
|
||||
详见 [changelog](docs/develop-guides/changelog.md)。
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>[2026/04/01] v0.6.0 版本发布</summary>
|
||||
|
||||
详见 [changelog](docs/develop-guides/changelog.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>[2026/03/01] v0.5.0 版本发布</summary>
|
||||
|
||||
详见 [changelog](docs/develop-guides/changelog.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>[2025/12/19] v0.4.0 版本发布</summary>
|
||||
|
||||
详见 [changelog](docs/develop-guides/changelog.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>[2025/11/05] v0.3.0 版本发布</summary>
|
||||
|
||||
详见 [changelog](docs/develop-guides/changelog.md)
|
||||
|
||||
</details>
|
||||
|
||||
## 快速开始
|
||||
|
||||
**前置要求**:已安装 [Docker](https://docs.docker.com/get-docker/) 与 Docker Compose,并准备至少一个兼容 OpenAI 接口的大模型 API。
|
||||
@ -99,7 +43,7 @@
|
||||
**1. 克隆代码并初始化**
|
||||
|
||||
```bash
|
||||
git clone --branch v0.7.0.beta2 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
git clone --branch v0.7.0.beta3 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
cd Yuxi
|
||||
|
||||
# Linux/macOS
|
||||
@ -121,49 +65,6 @@ docker compose up --build
|
||||
|
||||
> 💡 不需要知识库 / 知识图谱等重依赖时,可使用 `make up-lite` 以 LITE 轻量模式启动,加快冷启动速度。更多部署说明见 [项目文档](https://xerrors.github.io/Yuxi)。
|
||||
|
||||
## 示例与演示
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604203514048.png" width="100%" alt="对话工作台"/>
|
||||
<br/>
|
||||
<strong>对话工作台</strong>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604203704426.png" width="100%" alt="沙盒文件系统"/>
|
||||
<br/>
|
||||
<strong>沙盒文件系统</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604205342546.png" width="100%" alt="Agentic RAG"/>
|
||||
<br/>
|
||||
<strong>Agentic RAG</strong>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604204056298.png" width="100%" alt="知识图谱"/>
|
||||
<br/>
|
||||
<strong>知识图谱</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604210111977.png" width="100%" alt="检索评估"/>
|
||||
<br/>
|
||||
<strong>检索评估</strong>
|
||||
</td>
|
||||
<td align="center">
|
||||
<img src="https://xerrors.oss-cn-shanghai.aliyuncs.com/github/image-20260604205611168.png" width="100%" alt="多知识源接入"/>
|
||||
<br/>
|
||||
<strong>多知识源接入</strong>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
## 致谢
|
||||
|
||||
本项目参考并引用了以下优秀开源项目,在此致以诚挚的感谢:
|
||||
|
||||
@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "yuxi"
|
||||
version = "0.7.0.beta2"
|
||||
version = "0.7.0.beta3"
|
||||
description = "Yuxi 智能知识库与知识图谱平台核心后端包"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12,<3.14"
|
||||
|
||||
@ -5264,7 +5264,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "yuxi"
|
||||
version = "0.7.0.beta2"
|
||||
version = "0.7.0.beta3"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "agent-sandbox" },
|
||||
|
||||
@ -6,6 +6,10 @@ from yuxi.utils import get_docker_safe_url
|
||||
from yuxi.utils.logging_config import logger
|
||||
|
||||
|
||||
def _requires_non_streaming_tool_calls(provider_id: str, model_id: str) -> bool:
|
||||
return provider_id.startswith("siliconflow")
|
||||
|
||||
|
||||
def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel:
|
||||
if not fully_specified_name:
|
||||
raise ValueError("model spec 不能为空")
|
||||
@ -47,10 +51,14 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel:
|
||||
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
openai_kwargs = dict(kwargs)
|
||||
if _requires_non_streaming_tool_calls(info.provider_id, info.model_id):
|
||||
openai_kwargs.setdefault("disable_streaming", "tool_calling")
|
||||
|
||||
return ChatOpenAI(
|
||||
model=info.model_id,
|
||||
api_key=SecretStr(api_key),
|
||||
base_url=base_url,
|
||||
stream_usage=True,
|
||||
**kwargs,
|
||||
**openai_kwargs,
|
||||
)
|
||||
|
||||
@ -24,12 +24,6 @@ BUILTIN_PROVIDERS: list[dict[str, Any]] = [
|
||||
# "api_key_env": "GEMINI_API_KEY",
|
||||
# "models_endpoint": "https://generativelanguage.googleapis.com/v1beta/models",
|
||||
# },
|
||||
# {
|
||||
# "provider_id": "lmstudio",
|
||||
# "display_name": "LM Studio",
|
||||
# "base_url": "http://localhost:1234/v1",
|
||||
# "models_endpoint": "http://localhost:1234/v1/models",
|
||||
# },
|
||||
{
|
||||
"provider_id": "deepseek",
|
||||
"display_name": "DeepSeek",
|
||||
|
||||
@ -33,7 +33,7 @@ class ModelInfo:
|
||||
# 运行时配置
|
||||
api_key: str
|
||||
base_url: str
|
||||
provider_type: str # openai / anthropic / gemini / openrouter / lmstudio
|
||||
provider_type: str # openai / anthropic / gemini / openrouter
|
||||
|
||||
# 可选配置
|
||||
headers: dict[str, str] = field(default_factory=dict)
|
||||
|
||||
@ -20,7 +20,7 @@ from yuxi.storage.postgres.models_business import ModelProvider
|
||||
|
||||
VALID_MODEL_TYPES = {"chat", "embedding", "rerank"}
|
||||
VALID_MODEL_SOURCES = {"manual", "remote"}
|
||||
VALID_PROVIDER_TYPES = {"openai", "anthropic", "gemini", "openrouter", "lmstudio"}
|
||||
VALID_PROVIDER_TYPES = {"openai", "anthropic", "gemini", "openrouter"}
|
||||
_PROVIDER_ID_RE = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_-]{1,99}$")
|
||||
|
||||
|
||||
|
||||
@ -231,7 +231,7 @@ def _message_chunk_yuxi_events(
|
||||
"type": "tool_call_delta",
|
||||
"message_id": message_id,
|
||||
"tool_call_id": tool_call_chunk.get("id"),
|
||||
"name": tool_call_chunk.get("name"),
|
||||
"name": tool_call_chunk.get("name") or None,
|
||||
"args_delta": args_delta,
|
||||
"index": tool_call_chunk.get("index") if tool_call_chunk.get("index") is not None else 0,
|
||||
**route,
|
||||
@ -377,7 +377,7 @@ async def _save_ai_message(
|
||||
for tc in tool_calls_data:
|
||||
await conv_repo.add_tool_call(
|
||||
message_id=ai_msg.id,
|
||||
tool_name=tc.get("name", "unknown"),
|
||||
tool_name=tc.get("name") or "unknown",
|
||||
tool_input=tc.get("args", {}),
|
||||
status="pending",
|
||||
langgraph_tool_call_id=tc.get("id"),
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "yuxi-workspace"
|
||||
version = "0.7.0.beta2"
|
||||
version = "0.7.0.beta3"
|
||||
description = "基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12,<3.14"
|
||||
|
||||
@ -5489,7 +5489,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "yuxi"
|
||||
version = "0.7.0.beta2"
|
||||
version = "0.7.0.beta3"
|
||||
source = { editable = "package" }
|
||||
dependencies = [
|
||||
{ name = "agent-sandbox" },
|
||||
@ -5646,7 +5646,7 @@ requires-dist = [
|
||||
|
||||
[[package]]
|
||||
name = "yuxi-workspace"
|
||||
version = "0.7.0.beta2"
|
||||
version = "0.7.0.beta3"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "arq" },
|
||||
|
||||
@ -30,7 +30,7 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/api.Dockerfile
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: api-prod
|
||||
working_dir: /app
|
||||
networks:
|
||||
@ -68,7 +68,7 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/api.Dockerfile
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: worker-prod
|
||||
working_dir: /app
|
||||
networks:
|
||||
@ -145,7 +145,7 @@ services:
|
||||
context: .
|
||||
dockerfile: docker/web.Dockerfile
|
||||
target: production
|
||||
image: yuxi-web:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-web:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: web-prod
|
||||
ports:
|
||||
- "80:80"
|
||||
|
||||
@ -38,7 +38,7 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/api.Dockerfile
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: api-dev
|
||||
working_dir: /app
|
||||
volumes:
|
||||
@ -86,7 +86,7 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/api.Dockerfile
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-api:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: worker-dev
|
||||
working_dir: /app
|
||||
volumes:
|
||||
@ -125,7 +125,7 @@ services:
|
||||
build:
|
||||
context: ./docker/sandbox_provisioner
|
||||
dockerfile: Dockerfile
|
||||
image: yuxi-sandbox-provisioner:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-sandbox-provisioner:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: sandbox-provisioner
|
||||
volumes:
|
||||
- ./docker/volumes/yuxi:/app/saves
|
||||
@ -179,7 +179,7 @@ services:
|
||||
context: .
|
||||
dockerfile: docker/web.Dockerfile
|
||||
target: development
|
||||
image: yuxi-web:${YUXI_VERSION:-0.7.0.beta2}
|
||||
image: yuxi-web:${YUXI_VERSION:-0.7.0.beta3}
|
||||
container_name: web-dev
|
||||
volumes:
|
||||
- ./web/src:/app/src
|
||||
|
||||
@ -453,7 +453,7 @@ const vReveal = {
|
||||
</header>
|
||||
<div v-reveal class="yx-quick">
|
||||
<pre class="yx-code"><code><span class="yx-c-cmt"># 1. 克隆并初始化</span>
|
||||
git clone --branch v0.7.0.dev0 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
git clone --branch v0.7.0.beta3 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
cd Yuxi && ./scripts/init.sh
|
||||
|
||||
<span class="yx-c-cmt"># 2. 使用 Docker 启动</span>
|
||||
|
||||
@ -43,6 +43,7 @@
|
||||
- 收敛知识库文件解析参数:文件级 `processing_params` 统一保存 `ocr_engine` 与 `ocr_engine_config`,解析阶段直接使用该结构并保留分块参数快照。
|
||||
- 修复知识库文件大小显示为 0 的问题:文件上传时 `file_sizes` 参数未正确传播或历史数据缺失导致 DB 中 `file_size` 为 `None`;新增 `MinIOClient.stat_file/astat_file` 获取文件大小方法,`add_file_record` 在 `size` 缺失时从 MinIO 回补,`_load_metadata` 加载元数据后自动为缺少 `size` 的文件从 MinIO 补全并持久化。
|
||||
- 优化评估基准自动生成:生成任务支持配置队列并发数,默认 10,范围 1-20。
|
||||
- 完善模型供应商类型:普通聊天模型运行时新增 Anthropic provider type 适配,并清理不再支持的旧 provider type 入口。
|
||||
- 重梳理知识库评估存储:评估数据集、题目、评估运行和逐题结果统一入库,JSONL 仅作为导入/导出格式;后端和前端 API 统一使用 dataset/run 语义;评估运行支持用户命名,历史记录按名称展示,综合评分只聚合检索指标。
|
||||
- 扩展知识库上传来源:添加“从工作区上传”模式,后端将当前用户工作区文件预处理上传到 MinIO,前端沿用现有 `addDocuments` 入库链路提交 MinIO URL、内容哈希和文件大小。
|
||||
- 重构知识库详情页布局:`DatabaseInfo` 改为顶部详情 header + 左侧功能 tab 侧边栏 + 右侧内容区,Milvus 默认进入文件管理,并将检索测试、知识图谱、知识导图、检索配置、RAG 评估和评估基准统一纳入侧边栏导航;只读连接器保留检索测试与检索配置。
|
||||
@ -57,6 +58,7 @@
|
||||
- 优化智能体对话页细节:状态面板隐藏空 section,待办名称限制为 20 个中文汉字以内,模型选择器展示供应商名称,并收紧附件状态标签与文件编辑浮动操作样式。
|
||||
- 标准化 Agent run/SSE 执行链路:run 创建时持久化输入消息并提交后入队,worker 统一写入 Redis Stream envelope,SSE 输出 `event/data/id`、心跳注释、`Last-Event-ID` 回放和终止 `end` 事件;前端强制使用 run API 并支持 ask_user_question 中断后以 resume run 恢复;事件 envelope 构造收敛到统一 helper,前端优先使用 envelope 一级 `thread_id` 路由。
|
||||
- Agent run SSE 新增 `verbose=false` 精简模式:默认仍返回完整事件载荷;精简模式仅在 SSE 输出前重建最小 payload,跳过 `metadata` 和空 `yuxi.agent_state`,将同一 data 内的 `request_id` 外提为单个字段,移除 chunk 中重复的 `meta`、`metadata`、`thread_id`、`response`、空 `namespace` 和图片 base64 等调试字段,保留消息增量、工具调用、工具结果、非空 Agent state、终止状态和 SSE 游标,前端订阅默认使用精简模式。
|
||||
- 修复 SiliconFlow MiniMax 工具调用流式兼容:MiniMax 在 OpenAI 兼容流中会在参数增量 chunk 返回空 `function.name`,LangGraph v3 event stream 会将空名称写入最终工具调用并导致工具执行失败;该模型默认对工具调用禁用流式模型响应,保留 LangGraph v3 运行事件并避免 agent-chat 中出现空工具名。
|
||||
- 收敛后端模块边界:文档解析从 `plugins.parser` 移动到 `knowledge.parser`,内容审查从 `plugins.guard` 移动到 `services.guard`。
|
||||
- 收敛文件服务边界:文件预览判断抽为独立服务,Viewer 文件系统的 workspace 分支复用用户 workspace 服务,线程运行时上下文解析从泛化 `filesystem_service` 拆出为 agent runtime helper。
|
||||
- 升级 DeepAgents 到 0.6.7 并适配新版文件系统协议:SubAgentMiddleware 改为显式 subagent spec,Skills prompt 补齐新版占位符;sandbox/skills backend 复用新版 `ReadResult`、`GlobResult`、`GrepResult` 等协议类型,文件权限在 backend 层明确区分 skills、uploads、outputs 与 workspace,保留最小 `CustomCompositeBackend` 以避免非 route glob 误扫其他 route;Agent 上下文压缩改为复用 DeepAgents SummarizationMiddleware,历史摘要与大工具结果统一 offload 到 outputs。
|
||||
|
||||
@ -8,38 +8,42 @@
|
||||
### 看板
|
||||
|
||||
**知识库**
|
||||
- [ ] office 组件预览,docx/pptx 可以转PDF,然后前端预览
|
||||
- [ ] 知识库工具新增 query_keywords 工具,专门用于基于关键词命中的排序
|
||||
- [ ] office 组件预览,docx/pptx 可以转PDF,然后前端预览 <Badge text="v0.7.1" />
|
||||
- [ ] 知识库工具新增 query_keywords 工具,专门用于基于关键词命中的排序 <Badge text="v0.7.1" />
|
||||
- [ ] 调研将当前知识库映射为虚拟文件系统的可行性,先明确文件树映射、权限边界、内容读取与 Agent 工具调用形态,再决定是否实现
|
||||
- [ ] 增强知识库检索体验:增强 metadata、标签等
|
||||
- [ ] 优化思维导图构建的接口设计,支持增量构建和更新
|
||||
- [ ] 个人工作区增加可检索能力(但是不做向量化)
|
||||
- [ ] 个人工作区增加可检索能力(但是不做向量化) <Badge text="v0.7.1" />
|
||||
|
||||
|
||||
**智能体**
|
||||
- [ ] 子智能体缺少异步的机制
|
||||
- [ ] 子智能体缺少 steer 机制
|
||||
- [ ] 子智能体缺少异步的机制 <Badge text="v0.7.1" />
|
||||
- [ ] 子智能体缺少 steer 机制 <Badge text="v0.7.1" />
|
||||
- [ ] 子智能体的双向通信,缺少 ask_for_main_agent 的机制
|
||||
- [ ] 子智能体与子智能体的通信机制
|
||||
- [ ] 如何停掉一个子智能体、查看智能体的进度
|
||||
- [ ] RAG 评估支持 Agent 模式
|
||||
- [ ] RAG 评估支持 Agent 模式 <Badge text="v0.7.1" />
|
||||
- [ ] 添加 Agent 独立调用接口,方便后续评估使用
|
||||
- [ ] 任务队列 <Badge text="v0.7.2" />
|
||||
|
||||
**并发与分布式**
|
||||
- [ ] 提高 FastAPI 的并发能力
|
||||
|
||||
**其他**
|
||||
- [ ] 历史对话新增分组(或者叫做项目)
|
||||
- [ ] 集成 Memory,基于 deepagents 的文件后端实现,需要考虑定位
|
||||
- [ ] 模型供应商类型继续补齐非 OpenAI 兼容适配,并清理不再支持的 provider type 字样 <Badge text="v0.7.1" />
|
||||
|
||||
**仅设想**
|
||||
- [ ] Yuxi-cli 相关的功能,放在后续版本中实现(不是类似于编程助手,而是管理平台的工,等各个 router 接口优化之后)
|
||||
|
||||
|
||||
|
||||
- [ ] Yuxi-cli 支持 `yuxi upload <DIR_NAME>`,将本地文件夹上传到系统中
|
||||
|
||||
|
||||
### Bugs
|
||||
- [ ] 目前的知识库的图片存在公开访问风险
|
||||
- [ ] 点开对话的时候要能够自动定位到尾部,而不是最开始。
|
||||
- [ ] HTML 渲染侧边模式底部有部分无法渲染,全屏情况下下面有白边
|
||||
- [ ] Summary 无法正常触发
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
欢迎使用 Yuxi(语析),这是一个智能知识库和知识图谱 Agent 开发平台。
|
||||
本指南将帮助你在几分钟内启动并运行系统,使你能够利用 LangGraph、RAG 技术和知识图谱构建 AI 驱动的知识应用。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
::: tip 提示
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
```bash
|
||||
# 克隆最新版本
|
||||
git clone --branch v0.7.0.beta2 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
git clone --branch v0.7.0.beta3 --depth 1 https://github.com/xerrors/Yuxi.git
|
||||
cd Yuxi
|
||||
```
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ set -euo pipefail
|
||||
#
|
||||
# 该脚本从 backend/package/pyproject.toml 读取当前版本,
|
||||
# 自动同步所有需要硬编码版本号的位置。
|
||||
# --dev 模式不会更新 README.md 和 docs/intro/quick-start.md 中 git clone --branch 的版本号。
|
||||
# --dev 模式不会更新 README.md、docs/intro/quick-start.md 和文档首页中 git clone --branch 的版本号。
|
||||
# =============================================================================
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
@ -70,6 +70,7 @@ if [ "$DEV_MODE" = false ]; then
|
||||
echo " - README.md"
|
||||
echo " - README.en.md"
|
||||
echo " - docs/intro/quick-start.md"
|
||||
echo " - docs/.vitepress/theme/components/YuxiHome.vue"
|
||||
fi
|
||||
echo ""
|
||||
read -rp "确认继续? [y/N] " confirm
|
||||
@ -142,8 +143,12 @@ if [ "$DEV_MODE" = false ]; then
|
||||
echo "→ 更新 docs/intro/quick-start.md"
|
||||
perl -pi -e "s/(git clone --branch v)[0-9]+\\.[0-9]+\\.[0-9]+(\\.[a-zA-Z0-9]+)?/\${1}${NEW_VERSION}/g" \
|
||||
"${PROJECT_ROOT}/docs/intro/quick-start.md"
|
||||
|
||||
echo "→ 更新 docs/.vitepress/theme/components/YuxiHome.vue"
|
||||
perl -pi -e "s/(git clone --branch v)[0-9]+\\.[0-9]+\\.[0-9]+(\\.[a-zA-Z0-9]+)?/\${1}${NEW_VERSION}/g" \
|
||||
"${PROJECT_ROOT}/docs/.vitepress/theme/components/YuxiHome.vue"
|
||||
else
|
||||
echo "→ dev 模式,跳过 README.md、README.en.md 和 docs/intro/quick-start.md 的分支版本更新"
|
||||
echo "→ dev 模式,跳过 README.md、README.en.md、docs/intro/quick-start.md 和文档首页的分支版本更新"
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "yuxi-web",
|
||||
"version": "0.7.0.beta2",
|
||||
"version": "0.7.0.beta3",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
</a-menu-item>
|
||||
<a-menu-item
|
||||
key="rename"
|
||||
:icon="h(Pencil, { size: 14 })"
|
||||
:icon="h(SquarePen, { size: 14 })"
|
||||
@click.stop="renameChat(chat.id)"
|
||||
>
|
||||
重命名
|
||||
@ -74,7 +74,7 @@
|
||||
<script setup>
|
||||
import { computed, h, ref } from 'vue'
|
||||
import { message, Modal } from 'ant-design-vue'
|
||||
import { ChevronDown, MoreVertical, Pencil, Pin, PinOff, Trash2 } from 'lucide-vue-next'
|
||||
import { ChevronDown, MoreVertical, Pin, PinOff, SquarePen, Trash2 } from 'lucide-vue-next'
|
||||
import { parseToShanghai } from '@/utils/time'
|
||||
|
||||
const props = defineProps({
|
||||
|
||||
@ -60,7 +60,7 @@
|
||||
@click="showEditDepartmentModal(record)"
|
||||
class="action-btn lucide-icon-btn"
|
||||
>
|
||||
<Pencil :size="14" />
|
||||
<SquarePen :size="14" />
|
||||
</a-button>
|
||||
</a-tooltip>
|
||||
<a-tooltip title="删除部门">
|
||||
@ -178,7 +178,7 @@
|
||||
import { reactive, onMounted, watch } from 'vue'
|
||||
import { notification, message, Modal } from 'ant-design-vue'
|
||||
import { departmentApi, apiSuperAdminGet } from '@/apis'
|
||||
import { Delete as Trash2, Edit3 as Pencil, Plus, RefreshCw } from 'lucide-vue-next'
|
||||
import { Plus, RefreshCw, SquarePen, Trash2 } from 'lucide-vue-next'
|
||||
|
||||
// 表格列定义
|
||||
const columns = [
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<a-modal
|
||||
v-model:open="visible"
|
||||
width="1200px"
|
||||
width="800px"
|
||||
:footer="null"
|
||||
:closable="false"
|
||||
wrap-class-name="file-detail"
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
<a-menu>
|
||||
<a-menu-item key="edit" @click.stop="showEditUserModal(user)">
|
||||
<span class="user-card-menu-item">
|
||||
<Pencil :size="14" />
|
||||
<SquarePen :size="14" />
|
||||
编辑用户
|
||||
</span>
|
||||
</a-menu-item>
|
||||
@ -261,7 +261,7 @@ import { useUserStore } from '@/stores/user'
|
||||
import { departmentApi } from '@/apis'
|
||||
import {
|
||||
Plus,
|
||||
Pencil,
|
||||
SquarePen,
|
||||
Trash2,
|
||||
User,
|
||||
UserLock,
|
||||
|
||||
@ -5,7 +5,7 @@ import {
|
||||
Plus,
|
||||
RefreshCw,
|
||||
Trash2,
|
||||
Edit3,
|
||||
SquarePen,
|
||||
Bot,
|
||||
Microscope,
|
||||
MoreVertical,
|
||||
@ -438,7 +438,7 @@ defineExpose({
|
||||
<a-menu>
|
||||
<a-menu-item key="edit" @click.stop="openEditAgentModal(agent)">
|
||||
<span class="agent-card-menu-item">
|
||||
<Edit3 :size="14" />
|
||||
<SquarePen :size="14" />
|
||||
编辑智能体
|
||||
</span>
|
||||
</a-menu-item>
|
||||
|
||||
@ -741,10 +741,9 @@ defineExpose({
|
||||
<span>Provider Type</span>
|
||||
<a-select v-model:value="providerForm.provider_type">
|
||||
<a-select-option value="openai">openai</a-select-option>
|
||||
<a-select-option value="anthropic">anthropic</a-select-option>
|
||||
<!-- <a-select-option value="anthropic">anthropic</a-select-option>
|
||||
<a-select-option value="gemini">gemini</a-select-option>
|
||||
<a-select-option value="openrouter">openrouter</a-select-option>
|
||||
<a-select-option value="lmstudio">lmstudio</a-select-option>
|
||||
<a-select-option value="openrouter">openrouter</a-select-option> -->
|
||||
</a-select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@ -72,15 +72,6 @@
|
||||
<section v-else-if="!databases.length" class="sidebar-section">
|
||||
<div class="sidebar-muted">暂无可访问知识库</div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section">
|
||||
<div class="section-title">共享空间</div>
|
||||
<button type="button" class="workspace-nav-item secondary disabled" disabled>
|
||||
<FileTypeIcon is-dir folder-variant="enterprise" :size="18" />
|
||||
<span>团队工作区</span>
|
||||
<span class="soon-tag">即将支持</span>
|
||||
</button>
|
||||
</section>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
@ -184,23 +175,6 @@ const sharedDatabases = computed(() =>
|
||||
min-height: 32px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: var(--gray-400);
|
||||
cursor: not-allowed;
|
||||
|
||||
:deep(.file-type-icon) {
|
||||
opacity: 0.45;
|
||||
filter: grayscale(0.25);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.soon-tag {
|
||||
flex: 0 0 auto;
|
||||
margin-left: auto;
|
||||
color: var(--gray-400);
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.sidebar-muted {
|
||||
|
||||
@ -10,7 +10,6 @@ export const modelIcons = {
|
||||
dashscope: `${ICON_BASE}/bailian-color.svg`,
|
||||
deepseek: `${ICON_BASE}/deepseek-color.svg`,
|
||||
google: `${ICON_BASE}/google-color.svg`,
|
||||
lmstudio: `${ICON_BASE}/lmstudio.svg`,
|
||||
minimax: `${ICON_BASE}/minimax-color.svg`,
|
||||
'minimax-cn': `${ICON_BASE}/minimax-color.svg`,
|
||||
modelscope: `${ICON_BASE}/modelscope-color.svg`,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user