diff --git a/.gitignore b/.gitignore index 1229be8b..1c2acc13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.yuxi/ + ### python gitignore __pycache__/ *.pyc diff --git a/README.md b/README.md index 3fd40062..d0183fd9 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@
-[2026/03/26] v0.6.0.beta3 版本发布 +[2026/04/01] v0.6.0 版本发布 ### 新增 @@ -74,44 +74,21 @@
[2026/03/01] v0.5.0 版本发布 -### 新增 - -- 优化 OCR 体验并新增对 Deepseek OCR 的支持 -- 优化 RAG 检索,支持根据文件 pattern 来检索(Agentic Mode) -- 重构智能体对于“工具变更/模型变更”的处理逻辑,无需导入更复杂的中间件 -- 重构知识库的 Agentic 配置逻辑,与 Tools 解耦 -- 将工具与知识库解耦,在 context 中就完成解耦,虽然最终都是在 Agent 中的 get_tools 中获取 -- 优化chunk逻辑,移除 QA 分割,集成到普通分块中,并优化可视化逻辑 -- 重构知识库处理逻辑,分为 上传—解析—入库 三个阶段 -- 重构 MCP 相关配置,使用数据库来控制 [#469](https://github.com/xerrors/Yuxi/pull/469) -- 使用 docling 解析 office 文件(docx/xlsx/pptx) -- 优化后端的依赖,减少镜像体积 [#428](https://github.com/xerrors/Yuxi/issues/428) -- 优化 liaghtrag 的知识库调用结果,提供 content/graph/both 多个选项 -- 优化数据库查询工具,可通过设计环境变量添加描述,让模型更好的调用 -- 优化任务组件,改用 postgresql 存储,并新增删除任务的接口 -- 重构知识库文件系统,将附件与文件系统整合,文件系统使用 StateStore 存储 - -### 修复 - -- 修复知识图谱上传的向量配置错误,并新增模型选择以及 batch size 选择 -- 修复部分场景下获取工具列表报错 [#470](https://github.com/xerrors/Yuxi/pull/470) -- 修改方法备注信息 [#478](https://github.com/xerrors/Yuxi/pull/478) -- 修复多次 human-in-the-loop 的渲染解析问题 [#453](https://github.com/xerrors/Yuxi/issues/453) [#475](https://github.com/xerrors/Yuxi/pull/475) -- 修复消息加载逻辑导致的前端消息渲染延迟问题 +详见 [changelog](docs/develop-guides/changelog.md)
[2025/12/19] v0.4.0 版本发布 -详见 roadmap 更新记录 +详见 [changelog](docs/develop-guides/changelog.md)
[2025/11/05] v0.3.0 版本发布 -详见 roadmap 更新记录 +详见 [changelog](docs/develop-guides/changelog.md)
@@ -122,7 +99,7 @@ 克隆代码,并初始化 ``` -git clone --branch v0.6.0.beta3 --depth 1 https://github.com/xerrors/Yuxi.git +git clone --branch v0.6.0 --depth 1 https://github.com/xerrors/Yuxi.git cd Yuxi # Linux/macOS diff --git a/backend/package/yuxi/__init__.py b/backend/package/yuxi/__init__.py index 78f0952b..c70f7444 100644 --- a/backend/package/yuxi/__init__.py +++ b/backend/package/yuxi/__init__.py @@ -6,7 +6,7 @@ from concurrent.futures import ThreadPoolExecutor # noqa: E402 from yuxi.config import config as config # noqa: E402 -__version__ = "0.6.0.beta3" +__version__ = "0.6.0" from yuxi.knowledge import graph_base as graph_base # noqa: E402 from yuxi.knowledge import knowledge_base as knowledge_base # noqa: E402 diff --git a/backend/package/yuxi/pyproject.toml b/backend/package/yuxi/pyproject.toml index 1a0e37f7..c412b5e2 100644 --- a/backend/package/yuxi/pyproject.toml +++ b/backend/package/yuxi/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "yuxi" -version = "0.6.0.beta3" +version = "0.6.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 9aa93b52..321cdd3b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "yuxi-workspace" -version = "0.6.0.beta3" +version = "0.6.0" description = "基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建" readme = "README.md" requires-python = ">=3.12,<3.14" @@ -111,7 +111,7 @@ members = [ [tool.pytest.ini_options] addopts = "-v --tb=short" testpaths = ["test/unit", "test/integration", "test/e2e"] -pythonpath = ["."] +pythonpath = [".", "package"] markers = [ "unit: marks tests that run without live services", "auth: marks tests that require authentication", diff --git a/backend/server/routers/system_router.py b/backend/server/routers/system_router.py index 08386e12..cd007a33 100644 --- a/backend/server/routers/system_router.py +++ b/backend/server/routers/system_router.py @@ -7,7 +7,7 @@ from fastapi import APIRouter, Body, Depends, HTTPException from yuxi.storage.postgres.models_business import User from server.utils.auth_middleware import get_admin_user -from yuxi import config +from yuxi import config, get_version from yuxi.models.chat import test_chat_model_status, test_all_chat_models_status from yuxi.utils.logging_config import logger @@ -21,7 +21,7 @@ system = APIRouter(prefix="/system", tags=["system"]) @system.get("/health") async def health_check(): """系统健康检查接口(公开接口)""" - return {"status": "ok", "message": "服务正常运行"} + return {"status": "ok", "message": "服务正常运行", "version": get_version()} # ============================================================================= diff --git a/backend/test/integration/conftest.py b/backend/test/integration/conftest.py index c1b79cfa..457c1f26 100644 --- a/backend/test/integration/conftest.py +++ b/backend/test/integration/conftest.py @@ -30,7 +30,7 @@ ADMIN_LOGIN = os.getenv("TEST_USERNAME") ADMIN_PASSWORD = os.getenv("TEST_PASSWORD") _ADMIN_TOKEN_CACHE: str | None = None -HTTP_TIMEOUT = httpx.Timeout(30.0, connect=5.0) +HTTP_TIMEOUT = httpx.Timeout(60.0, connect=5.0) SANDBOX_CONTAINER_PREFIX = os.getenv("YUXI_SANDBOX_CONTAINER_PREFIX", "yuxi-sandbox") @@ -235,8 +235,18 @@ async def standard_user(test_client: httpx.AsyncClient, admin_headers: dict[str, "headers": {"Authorization": f"Bearer {access_token}"}, } finally: - response = await test_client.delete(f"/api/auth/users/{user_payload['id']}", headers=admin_headers) - assert response.status_code == 200, f"Failed to cleanup test user {user_payload['user_id']}: {response.text}" + cleanup_error = None + for _ in range(3): + response = await test_client.delete(f"/api/auth/users/{user_payload['id']}", headers=admin_headers) + if response.status_code in (200, 404): + cleanup_error = None + break + cleanup_error = response + await anyio.sleep(0.3) + if cleanup_error is not None: + assert cleanup_error.status_code == 200, ( + f"Failed to cleanup test user {user_payload['user_id']}: {cleanup_error.text}" + ) @pytest_asyncio.fixture(scope="function") diff --git a/backend/uv.lock b/backend/uv.lock index 8e2de2d9..5e7f47b7 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -5705,12 +5705,12 @@ wheels = [ [[package]] name = "yuxi" -version = "0.6.0b3" +version = "0.6.0" source = { virtual = "package/yuxi" } [[package]] name = "yuxi-workspace" -version = "0.6.0b3" +version = "0.6.0" source = { virtual = "." } dependencies = [ { name = "agent-sandbox" }, diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8df698b0..d711e841 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -23,15 +23,15 @@ x-api-worker-env: &api-worker-env SANDBOX_VIRTUAL_PATH_PREFIX: ${SANDBOX_VIRTUAL_PATH_PREFIX:-/home/gem/user-data} SANDBOX_EXEC_TIMEOUT_SECONDS: ${SANDBOX_EXEC_TIMEOUT_SECONDS:-180} SANDBOX_MAX_OUTPUT_BYTES: ${SANDBOX_MAX_OUTPUT_BYTES:-262144} - NO_PROXY: localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,minio,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn - no_proxy: localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,minio,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn + NO_PROXY: localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn + no_proxy: localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn services: api: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.prod + image: yuxi-api:0.6.0 container_name: api-prod working_dir: /app networks: @@ -68,7 +68,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.prod + image: yuxi-api:0.6.0 container_name: worker-prod working_dir: /app networks: @@ -143,7 +143,7 @@ services: context: . dockerfile: docker/web.Dockerfile target: production - image: yuxi-web:0.6.prod + image: yuxi-web:0.6.0 container_name: web-prod ports: - "80:80" diff --git a/docker-compose.yml b/docker-compose.yml index 0a7f2d6e..ca2373fc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,7 +40,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.dev + image: yuxi-api:0.6.0 container_name: api-dev working_dir: /app volumes: @@ -87,7 +87,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.dev + image: yuxi-api:0.6.0 container_name: worker-dev working_dir: /app volumes: @@ -126,7 +126,7 @@ services: build: context: ./docker/sandbox_provisioner dockerfile: Dockerfile - image: yuxi-sandbox-provisioner:0.6.dev + image: yuxi-sandbox-provisioner:0.6.0 container_name: sandbox-provisioner volumes: - ./saves:/app/saves @@ -179,7 +179,7 @@ services: context: . dockerfile: docker/web.Dockerfile target: development - image: yuxi-web:0.6.dev + image: yuxi-web:0.6.0 container_name: web-dev volumes: - ./web/src:/app/src diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 811e1985..93cb262b 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -66,6 +66,7 @@ export default defineConfig({ items: [ { text: '参与贡献', link: '/develop-guides/contributing' }, { text: '开发路线图', link: '/develop-guides/roadmap' }, + { text: '版本变更记录', link: '/develop-guides/changelog' }, { text: '界面设计规范', link: '/develop-guides/design' }, { text: '测试规范', link: '/develop-guides/testing-guidelines' }, ] diff --git a/docs/develop-guides/changelog.md b/docs/develop-guides/changelog.md new file mode 100644 index 00000000..b41926bd --- /dev/null +++ b/docs/develop-guides/changelog.md @@ -0,0 +1,152 @@ +# 版本变更记录 + +本页用于记录各版本发布说明(新增、修复与破坏性变更)。 + +## v0.6 (2026-04-01) + + +### 新增 +- 重构后端代码 src -> backend/package/yuxi +- 重构文档解析,统一文档解析体验,并新增 Parser 类 +- 新增 LITE 模式启动,启动时不加载知识库、知识图谱相关模块,可以使用 make up-lite 快捷启动 +- 新增沙盒环境,详见后续文档更新,统一沙盒虚拟路径前缀默认值为 `/home/gem/user-data` +- 新增基于沙盒的文件系统,前端工作台可以查看文件系统,支持预览(文本、图片、PDF、HTML)、下载文件 +- 新增 `present_artifacts` 内置工具:Agent 可将 `/home/gem/user-data/outputs/` 下的结果文件显式写入 LangGraph state 的 `artifacts` 字段,前端支持在输入框顶部以默认折叠的堆叠卡片展示本轮交付物文件,并保持可下载、可预览能力 +- 交付物卡片新增“保存到工作区”能力:支持将单个交付物复制到共享目录 `workspace/saved_artifacts/`,并复用现有文件树/预览/mention 体系立即可见 +- 新增基于沙盒的知识库只读映射,按“用户可访问知识库 ∩ 当前 Agent 已启用知识库”暴露原始文件与解析后的 Markdown +- 重构附件系统,直接集成在了沙盒文件系统中,附件上传后直接落盘到沙盒挂载目录 +- 优化前端流式消息体验:新增通用 `useStreamSmoother` 调度层,统一平滑 Agent runs SSE、普通聊天流与审批恢复流中的 `loading` chunk +- 优化项目文档说明,并添加贡献指南 +- 重构前端 Agent 路由结构,体验更加顺畅,切换更加自然(类 chatgpt 体验) +- 新增 API Key 认证功能,支持外部系统通过 API Key 调用系统服务 +- 新增 subagents 的支持,支持在 web 中添加 subagents,以及两个内置的子智能体 +- 新增内置Skills reporter,并移除内置 Agent reporter,数据库报表将由 Skills 完成 +- 新增内置 Skills `deep-reporter`,用于指导生成科研报告、行业调研和其他深度分析类长报告 +- 重构内置 Skills/MCP/Subagents 安装/添加/移除机制:内置 skill 支持按需安装、基于 `version + content_hash` 的更新提示与覆盖确认,不再使用服务器级开关切换 +- 新增知识库 PDF、图片的预览功能 +- 重构后端测试目录结构:按 `unit / integration / e2e` 分层迁移现有测试,拆分全局 `conftest.py`,统一测试入口为 `uv run --group test pytest`,并新增独立测试规范文档 `docs/vibe/testing-guidelines.md` +- 新增工具元数据 `config_guide` 字段:后端工具列表接口现在可返回“给人看的配置说明”,前端工具详情页会展示该说明,用于提示工具使用前需要配置的环境变量或入口;首批为 MySQL 工具和 `Qwen-Image` 补充了配置指引 +- 补充 Langfuse 集成方案文档:明确采用“云端优先、先 tracing 后 feedback”的接入路径,并约定 Yuxi 的 `user/thread` 到 Langfuse `user_id/session_id` 的映射关系 +- 新增面向用户的 Langfuse 集成文档:在“智能体开发”分组中说明 Langfuse 的定位、能力、配置方式与查看路径,并与当前 `LANGFUSE_BASE_URL` 配置保持一致 + + + +### 修复 + +- 发布前一致性修复:统一 0.6.0 版本号(backend/package/web)、更新 dev/prod 镜像标签语义(`0.6.0.dev` / `0.6.0`),并为 `/api/system/health` 补充 `version` 字段,提升部署可观测性与发版追溯能力 +- 收敛“状态工作台”自动弹出规则:前端不再因为共享 `workspace` 或文件系统天然存在内容而默认展开,改为仅在 `/home/gem/user-data/uploads` 或 `/home/gem/user-data/outputs` 下检测到实际文件时自动弹出;手动打开、关闭、刷新和伸缩交互保持不变 +- 调整智能体 todo 展示语义:待办状态不再作为 `capabilities` 前端开关,而是直接根据运行态 `agent_state.todos` 渲染;同时将 todo 入口从 Agent Panel 移到输入框内的轻量浮层,并让右侧“状态工作台”收敛为文件系统视图,输入框按钮文案同步由“状态”调整为“文件” +- 优化 Agent 输入框 mention 行为:在保留附件 mention 的同时,将共享 `workspace` 文件纳入候选范围;并将 `@` 空查询时的候选列表改为空,仅在继续输入后再执行筛选,避免工作区文件过多时直接铺满下拉面板 +- 为前端工作台文件树补齐文件删除能力:`/api/viewer/filesystem/file` 新增删除接口,`AgentPanel` 文件节点新增删除按钮与确认交互,删除后会同步刷新树与预览状态 +- 扩展 Agent Panel 状态工作台删除能力:继续复用 `DELETE /api/viewer/filesystem/file`,在保持接口不变的前提下支持删除文件夹;空目录与非空目录现在都会递归删除,`workspace` 下目录也可直接清理,前端目录节点同步新增删除入口与对应确认文案 +- 调整前端工作台文件预览交互:恢复默认侧边/弹窗预览,并新增显式“全屏预览”入口;全屏模式下由预览内容直接覆盖整页,仅保留右上角悬浮关闭按钮;同时修复 HTML 文件首次在弹窗中预览偶现白屏的问题,改为在内容更新后强制重建 `iframe` +- 统一 Agent Panel 文件预览与消息区交付物预览组件:两处改为复用同一套 `AgentFilePreview` 预览实现,并为交付物预览补齐与工作台一致的“全屏预览”入口 +- 兼容旧版已安装的内置 `reporter` 技能记录:`update_builtin_skill` 现在会识别由 `system` 或 `builtin-system` 管理的历史记录,避免更新时误报“技能 `reporter` 不是内置 skill” +- 调整沙盒 user-data 目录隔离策略:`workspace` 改为共享目录 `saves/threads/shared/workspace`,`uploads/outputs` 继续保持 thread 级隔离;同时更新 thread artifact 权限校验、viewer 文件系统列举逻辑,以及对应的 router/E2E 测试 +- 重构聊天接口请求模型:流式与非流式聊天统一使用 `query + agent_config_id` 请求体,并移除路径中的 `agent_id`;同时修复非流式接口实际误走流式执行链路的问题,改为调用 `invoke_messages` 一次性执行,并补充对应测试 +- 修复对话线程与 Agent 配置错位的问题:发送消息时将当前 `agent_config_id` 绑定到 thread 的 `extra_metadata`,线程列表接口返回该绑定值,前端切换历史 thread 时会自动恢复对应配置 +- 为沙盒与 viewer 文件系统补齐知识库只读映射:新增 `/home/gem/kbs` 命名空间,按“用户可访问知识库 ∩ 当前 Agent 已启用知识库”暴露原始文件与解析后的 Markdown,并补充对应后端与 viewer 路由测试 +- 优化 viewer 文件系统目录树加载:根目录与 `/home/gem/user-data` 改为直接读取本地线程挂载目录,不再为只读树视图触发 sandbox 冷启动,并补充对应后端测试 +- 修复 `/home/gem/user-data` 根目录文件不可见的问题:根目录现在会同时展示 thread 目录下的真实文件和 `workspace` 入口,不再只保留固定命名空间目录 +- 修复前端工具图标与渲染匹配不准确的问题:工具管理列表与工具调用结果统一改为基于工具 `id` 的精确映射,避免模糊匹配导致的误渲染,未命中的工具不再显示默认扳手图标 +- 修复 GitHub Pages 文档部署工作流失败:移除 `actions/setup-node@v4` 对不存在 `docs/package-lock.json` 的缓存依赖,并将 `docs` 目录安装命令从 `npm ci` 调整为 `npm install`,避免因未提交锁文件导致 CI 在依赖缓存和安装阶段直接失败 +- 修正沙盒 provisioner backend 命名与配置说明:统一对外使用 `docker` / `kubernetes`,保留 `local` 作为兼容别名;同步清理 compose 中未生效的 provisioner 环境变量、补齐 K8s 相关变量注释,并更新沙盒架构文档中的默认模式与 backend 描述 +- 修复智能体配置列表接口在“无配置自动创建默认配置”路径下的参数缺失:补齐 `get_or_create_default` 的 `agent_id` 入参,避免 `/api/chat/agent/{agent_id}/configs` 返回 500 +- 修复 LightRAG 同库写入并发导致的入库失败:为 `index_file` / `update_content` 增加按知识库维度的串行锁,并补齐 `documents` 接口 `auto_index` 阶段对最新解析状态的回写与回归测试,避免长时间入库任务进行中再次选择同库文件时直接并发写入报错 + + + + +--- + + +## v0.5 + +### 新增 + +- 优化 OCR 体验并新增对 Deepseek OCR 的支持 +- 优化 RAG 检索,支持根据文件 pattern 来检索(Agentic Mode) +- 重构智能体对于“工具变更/模型变更”的处理逻辑,无需导入更复杂的中间件 +- 重构知识库的 Agentic 配置逻辑,与 Tools 解耦 +- 将工具与知识库解耦,在 context 中就完成解耦,虽然最终都是在 Agent 中的 get_tools 中获取 +- 优化chunk逻辑,移除 QA 分割,集成到普通分块中,并优化可视化逻辑 +- 重构知识库处理逻辑,分为 上传—解析—入库 三个阶段 +- 重构 MCP 相关配置,使用数据库来控制 [#469](https://github.com/xerrors/Yuxi/pull/469) +- 使用 docling 解析 office 文件(docx/xlsx/pptx) +- 优化后端的依赖,减少镜像体积 [#428](https://github.com/xerrors/Yuxi/issues/428) +- 优化 liaghtrag 的知识库调用结果,提供 content/graph/both 多个选项 +- 优化数据库查询工具,可通过设计环境变量添加描述,让模型更好的调用 +- 优化任务组件,改用 postgresql 存储,并新增删除任务的接口 +- 支持更多类型的文档源的导入功能(支持后端配置的白名单的 URL 导入) + +### 修复 + +- 修复文件上传弹窗中 OCR 下拉选项展开时不会自动检查服务状态的问题 +- 修复知识图谱上传的向量配置错误,并新增模型选择以及 batch size 选择 +- 修复部分场景下获取工具列表报错 [#470](https://github.com/xerrors/Yuxi/pull/470) +- 修改方法备注信息 [#478](https://github.com/xerrors/Yuxi/pull/478) +- 修复多次 human-in-the-loop 的渲染解析问题 [#453](https://github.com/xerrors/Yuxi/issues/453) [#475](https://github.com/xerrors/Yuxi/pull/475) +- 修复沙盒后端接入回归:补齐 composite backend 的 `sandbox_backend` 参数、限制 `/api/sandbox/prepare` 仅允许访问当前用户线程、确保 `release()` 之后的 `destroy()` 会真正停止热池容器,并恢复 docker-compose 的完整模式默认值 +- 重构沙盒为 deer-flow 风格的 AIO provider:切换为 thread-local sandbox、统一 `/home/gem/user-data/{workspace,uploads,outputs}` 固定路径、移除公开 `/api/sandbox/*` 生命周期接口,并补充 lite 模式下的 provider 生命周期、filesystem API 与 sandbox 复用/隔离 E2E 验证 +- 调整聊天附件存储链路:线程附件改为直接落盘到 `saves/threads//user-data/uploads`,解析成功后额外生成 `uploads/attachments/*.md`,不再依赖 MinIO 或显式上传到 sandbox +- 修复知识库文件列表包体异常膨胀:上传阶段不再把批次级 `content_hashes` 写入每个文件的 `processing_params`,并从数据库详情列表接口中移除该字段,改为按需读取单文件详情 + +## v0.4 + +### 新增 +- 新增对于上传附件的智能体中间件,详见[文档](https://xerrors.github.io/Yuxi/advanced/agents-config.html#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%AD%E9%97%B4%E4%BB%B6) +- 新增多模态模型支持(当前仅支持图片),详见[文档](https://xerrors.github.io/Yuxi/advanced/agents-config.html#%E5%A4%9A%E6%A8%A1%E6%80%81%E5%9B%BE%E7%89%87%E6%94%AF%E6%8C%81) +- 新建 DeepAgents 智能体(深度分析智能体),支持 todo,files 等渲染,支持文件的下载。 +- 新增基于知识库文件生成思维导图功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) +- 新增基于知识库文件生成示例问题功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) +- 新增知识库支持文件夹/压缩包上传的功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) +- 新增自定义模型支持、新增 dashscope rerank/embeddings 模型的支持 +- 新增文档解析的图片支持,已支持 MinerU Officical、Docs、Markdown Zip格式 +- 新增暗色模式支持并调整整体 UI([#343](https://github.com/xerrors/Yuxi/pull/343)) +- 新增知识库评估功能,支持导入评估基准或者自动构建评估基准(目前仅支持Milvus类型知识库)详见[文档](https://xerrors.github.io/Yuxi/intro/evaluation.html) +- 新增同名文件处理逻辑:遇到同名文件则在上传区域提示,是否删除旧文件 +- 新增生产环境部署脚本,固定 python 依赖版本,提升部署稳定性 +- 优化图谱可视化方式,统一图谱数据结构,统一使用基于 G6 的可视化方式,同时支持上传带属性的图谱文件,详见[文档](https://xerrors.github.io/Yuxi/intro/knowledge-base.html#_1-%E4%BB%A5%E4%B8%89%E5%85%83%E7%BB%84%E5%BD%A2%E5%BC%8F%E5%AF%BC%E5%85%A5) +- 优化 DBManager / ConversationManager,支持异步操作 +- 优化 知识库详情页面,更加简洁清晰,增强文件下载功能 + +### 修复 +- 修复 GitHub Actions 的 Ruff CI 在仓库根目录执行 `uv sync` 导致找不到 `backend/pyproject.toml` 的问题,同时统一检查路径为 `backend/package` +- 修复重排序模型实际未生效的问题 +- 修复消息中断后消息消失的问题,并改善异常效果 +- 修复当前版本如果调用结果为空的时候,工具调用状态会一直处于调用状态,尽管调用是成功的 +- 修复检索配置实际未生效的问题 +- 修复 sandbox 文件系统 `ls` 在异常输出下触发 `KeyError: 'path'` 的问题,并将工具调用异常降级为错误消息,避免直接中断聊天 stream +- 修复智能体状态面板中文件树仍依赖 `agent_state.files` 的问题,改为通过真实 `/api/filesystem/*` 接口按层懒加载后端可见文件系统,并让输入框下方状态按钮常态化打开工作区视图 +- 为工作台新增 viewer-oriented filesystem service 与 `/api/viewer/filesystem/*` 接口,解耦 agent backend 语义,支持真实目录浏览、原始文件读取与下载 +- 重写沙盒技术文档,明确 thread-local sandbox、viewer-oriented filesystem service、`/mnt` 命名空间、skills 可见性与当前实现边界,替换过时的 `/api/sandbox/*` 与 user-level 设计描述 +- 收紧沙盒遗留代码:修复未注册 `sandbox_router` 中残留的 user/thread 参数错位,改进宿主机挂载路径映射逻辑,并为 remote sandbox provisioner 增加基础 URL 校验与销毁失败日志 +- 修复 builtin skill 内容哈希计算对单文件使用 `read_bytes()` 的无上限内存读取问题,改为分块计算并补充回归测试 + +### 破坏性更新 + +- 移除 Chroma 的支持,当前版本标记为移除 +- 移除模型配置预设的 TogetherAI + + +## v0.3 +### Added +- 添加测试脚本,覆盖最常见的功能(已覆盖API) +- 新建 tasker 模块,用来管理所有的后台任务,UI 上使用侧边栏管理。Tasker 中获取历史任务的时候,仅获取 top100 个 task。 +- 优化对文档信息的检索展示(检索结果页、详情页) +- 优化全局配置的管理模型,优化配置管理 +- 支持 MinerU 2.5 的解析方法 +- 修改现有的智能体Demo,并尽量将默认助手的特性兼容到 LangGraph 的 [`create_agent`](https://docs.langchain.com/oss/python/langchain/agents) 中 +- 基于 create_agent 创建 SQL Viewer 智能体 +- 优化 MCP 逻辑,支持 common + special 创建方式 +- LightRAG 知识库应该可以支持修改 LLM + +### Fixed +- 修复本地知识库的 metadata 和 向量数据库中不一致的情况。 +- v1 版本的 LangGraph 的工具渲染有问题 +- upload 接口会阻塞主进程 +- LightRAG 知识库查看不了解析后的文本,偶然出现,未复现 +- 智能体的加载状态有问题:(1)智能体加载没有动画;(2)切换对话和加载中,使用同一个loading状态。 +- 前端工具调用渲染出现问题 +- 当前 ReAct 智能体有消息顺序错乱的 bug,且不会默认调用工具 +- 修复文件管理:(1)文件选择的时候会跨数据库;(2)文件校验会算上失败的文件; diff --git a/docs/develop-guides/roadmap.md b/docs/develop-guides/roadmap.md index 8ccd9e98..b6b7ba5e 100644 --- a/docs/develop-guides/roadmap.md +++ b/docs/develop-guides/roadmap.md @@ -27,150 +27,17 @@ - 目前的知识库的图片存在公开访问风险 - 生成基准测试会把所有的向量都计算一遍不合理 -## v0.6 -### 新增 -- 重构后端代码 src -> backend/package/yuxi -- 重构文档解析,统一文档解析体验,并新增 Parser 类 -- 新增 LITE 模式启动,启动时不加载知识库、知识图谱相关模块,可以使用 make up-lite 快捷启动 -- 新增沙盒环境,详见后续文档更新,统一沙盒虚拟路径前缀默认值为 `/home/gem/user-data` -- 新增基于沙盒的文件系统,前端工作台可以查看文件系统,支持预览(文本、图片、PDF、HTML)、下载文件 -- 新增 `present_artifacts` 内置工具:Agent 可将 `/home/gem/user-data/outputs/` 下的结果文件显式写入 LangGraph state 的 `artifacts` 字段,前端支持在输入框顶部以默认折叠的堆叠卡片展示本轮交付物文件,并保持可下载、可预览能力 -- 交付物卡片新增“保存到工作区”能力:支持将单个交付物复制到共享目录 `workspace/saved_artifacts/`,并复用现有文件树/预览/mention 体系立即可见 -- 新增基于沙盒的知识库只读映射,按“用户可访问知识库 ∩ 当前 Agent 已启用知识库”暴露原始文件与解析后的 Markdown -- 重构附件系统,直接集成在了沙盒文件系统中,附件上传后直接落盘到沙盒挂载目录 -- 优化前端流式消息体验:新增通用 `useStreamSmoother` 调度层,统一平滑 Agent runs SSE、普通聊天流与审批恢复流中的 `loading` chunk -- 优化项目文档说明,并添加贡献指南 -- 重构前端 Agent 路由结构,体验更加顺畅,切换更加自然(类 chatgpt 体验) -- 新增 API Key 认证功能,支持外部系统通过 API Key 调用系统服务 -- 新增 subagents 的支持,支持在 web 中添加 subagents,以及两个内置的子智能体 -- 新增内置Skills reporter,并移除内置 Agent reporter,数据库报表将由 Skills 完成 -- 新增内置 Skills `deep-reporter`,用于指导生成科研报告、行业调研和其他深度分析类长报告 -- 重构内置 Skills/MCP/Subagents 安装/添加/移除机制:内置 skill 支持按需安装、基于 `version + content_hash` 的更新提示与覆盖确认,不再使用服务器级开关切换 -- 新增知识库 PDF、图片的预览功能 -- 重构后端测试目录结构:按 `unit / integration / e2e` 分层迁移现有测试,拆分全局 `conftest.py`,统一测试入口为 `uv run --group test pytest`,并新增独立测试规范文档 `docs/vibe/testing-guidelines.md` -- 新增工具元数据 `config_guide` 字段:后端工具列表接口现在可返回“给人看的配置说明”,前端工具详情页会展示该说明,用于提示工具使用前需要配置的环境变量或入口;首批为 MySQL 工具和 `Qwen-Image` 补充了配置指引 -- 补充 Langfuse 集成方案文档:明确采用“云端优先、先 tracing 后 feedback”的接入路径,并约定 Yuxi 的 `user/thread` 到 Langfuse `user_id/session_id` 的映射关系 -- 新增面向用户的 Langfuse 集成文档:在“智能体开发”分组中说明 Langfuse 的定位、能力、配置方式与查看路径,并与当前 `LANGFUSE_BASE_URL` 配置保持一致 +## 版本记录 - +### 0.6.1 -### 修复 - -- 收敛“状态工作台”自动弹出规则:前端不再因为共享 `workspace` 或文件系统天然存在内容而默认展开,改为仅在 `/home/gem/user-data/uploads` 或 `/home/gem/user-data/outputs` 下检测到实际文件时自动弹出;手动打开、关闭、刷新和伸缩交互保持不变 -- 调整智能体 todo 展示语义:待办状态不再作为 `capabilities` 前端开关,而是直接根据运行态 `agent_state.todos` 渲染;同时将 todo 入口从 Agent Panel 移到输入框内的轻量浮层,并让右侧“状态工作台”收敛为文件系统视图,输入框按钮文案同步由“状态”调整为“文件” -- 优化 Agent 输入框 mention 行为:在保留附件 mention 的同时,将共享 `workspace` 文件纳入候选范围;并将 `@` 空查询时的候选列表改为空,仅在继续输入后再执行筛选,避免工作区文件过多时直接铺满下拉面板 -- 为前端工作台文件树补齐文件删除能力:`/api/viewer/filesystem/file` 新增删除接口,`AgentPanel` 文件节点新增删除按钮与确认交互,删除后会同步刷新树与预览状态 -- 扩展 Agent Panel 状态工作台删除能力:继续复用 `DELETE /api/viewer/filesystem/file`,在保持接口不变的前提下支持删除文件夹;空目录与非空目录现在都会递归删除,`workspace` 下目录也可直接清理,前端目录节点同步新增删除入口与对应确认文案 -- 调整前端工作台文件预览交互:恢复默认侧边/弹窗预览,并新增显式“全屏预览”入口;全屏模式下由预览内容直接覆盖整页,仅保留右上角悬浮关闭按钮;同时修复 HTML 文件首次在弹窗中预览偶现白屏的问题,改为在内容更新后强制重建 `iframe` -- 统一 Agent Panel 文件预览与消息区交付物预览组件:两处改为复用同一套 `AgentFilePreview` 预览实现,并为交付物预览补齐与工作台一致的“全屏预览”入口 -- 兼容旧版已安装的内置 `reporter` 技能记录:`update_builtin_skill` 现在会识别由 `system` 或 `builtin-system` 管理的历史记录,避免更新时误报“技能 `reporter` 不是内置 skill” -- 调整沙盒 user-data 目录隔离策略:`workspace` 改为共享目录 `saves/threads/shared/workspace`,`uploads/outputs` 继续保持 thread 级隔离;同时更新 thread artifact 权限校验、viewer 文件系统列举逻辑,以及对应的 router/E2E 测试 -- 重构聊天接口请求模型:流式与非流式聊天统一使用 `query + agent_config_id` 请求体,并移除路径中的 `agent_id`;同时修复非流式接口实际误走流式执行链路的问题,改为调用 `invoke_messages` 一次性执行,并补充对应测试 -- 修复对话线程与 Agent 配置错位的问题:发送消息时将当前 `agent_config_id` 绑定到 thread 的 `extra_metadata`,线程列表接口返回该绑定值,前端切换历史 thread 时会自动恢复对应配置 -- 为沙盒与 viewer 文件系统补齐知识库只读映射:新增 `/home/gem/kbs` 命名空间,按“用户可访问知识库 ∩ 当前 Agent 已启用知识库”暴露原始文件与解析后的 Markdown,并补充对应后端与 viewer 路由测试 -- 优化 viewer 文件系统目录树加载:根目录与 `/home/gem/user-data` 改为直接读取本地线程挂载目录,不再为只读树视图触发 sandbox 冷启动,并补充对应后端测试 -- 修复 `/home/gem/user-data` 根目录文件不可见的问题:根目录现在会同时展示 thread 目录下的真实文件和 `workspace` 入口,不再只保留固定命名空间目录 -- 修复前端工具图标与渲染匹配不准确的问题:工具管理列表与工具调用结果统一改为基于工具 `id` 的精确映射,避免模糊匹配导致的误渲染,未命中的工具不再显示默认扳手图标 -- 修复 GitHub Pages 文档部署工作流失败:移除 `actions/setup-node@v4` 对不存在 `docs/package-lock.json` 的缓存依赖,并将 `docs` 目录安装命令从 `npm ci` 调整为 `npm install`,避免因未提交锁文件导致 CI 在依赖缓存和安装阶段直接失败 -- 修正沙盒 provisioner backend 命名与配置说明:统一对外使用 `docker` / `kubernetes`,保留 `local` 作为兼容别名;同步清理 compose 中未生效的 provisioner 环境变量、补齐 K8s 相关变量注释,并更新沙盒架构文档中的默认模式与 backend 描述 -- 修复智能体配置列表接口在“无配置自动创建默认配置”路径下的参数缺失:补齐 `get_or_create_default` 的 `agent_id` 入参,避免 `/api/chat/agent/{agent_id}/configs` 返回 500 -- 修复 LightRAG 同库写入并发导致的入库失败:为 `index_file` / `update_content` 增加按知识库维度的串行锁,并补齐 `documents` 接口 `auto_index` 阶段对最新解析状态的回写与回归测试,避免长时间入库任务进行中再次选择同库文件时直接并发写入报错 - - + ---- +历史版本发布记录已迁移到 [版本变更记录](./changelog.md)。 - -## v0.5 - -### 新增 - -- 优化 OCR 体验并新增对 Deepseek OCR 的支持 -- 优化 RAG 检索,支持根据文件 pattern 来检索(Agentic Mode) -- 重构智能体对于“工具变更/模型变更”的处理逻辑,无需导入更复杂的中间件 -- 重构知识库的 Agentic 配置逻辑,与 Tools 解耦 -- 将工具与知识库解耦,在 context 中就完成解耦,虽然最终都是在 Agent 中的 get_tools 中获取 -- 优化chunk逻辑,移除 QA 分割,集成到普通分块中,并优化可视化逻辑 -- 重构知识库处理逻辑,分为 上传—解析—入库 三个阶段 -- 重构 MCP 相关配置,使用数据库来控制 [#469](https://github.com/xerrors/Yuxi/pull/469) -- 使用 docling 解析 office 文件(docx/xlsx/pptx) -- 优化后端的依赖,减少镜像体积 [#428](https://github.com/xerrors/Yuxi/issues/428) -- 优化 liaghtrag 的知识库调用结果,提供 content/graph/both 多个选项 -- 优化数据库查询工具,可通过设计环境变量添加描述,让模型更好的调用 -- 优化任务组件,改用 postgresql 存储,并新增删除任务的接口 -- 支持更多类型的文档源的导入功能(支持后端配置的白名单的 URL 导入) - -### 修复 - -- 修复文件上传弹窗中 OCR 下拉选项展开时不会自动检查服务状态的问题 -- 修复知识图谱上传的向量配置错误,并新增模型选择以及 batch size 选择 -- 修复部分场景下获取工具列表报错 [#470](https://github.com/xerrors/Yuxi/pull/470) -- 修改方法备注信息 [#478](https://github.com/xerrors/Yuxi/pull/478) -- 修复多次 human-in-the-loop 的渲染解析问题 [#453](https://github.com/xerrors/Yuxi/issues/453) [#475](https://github.com/xerrors/Yuxi/pull/475) -- 修复沙盒后端接入回归:补齐 composite backend 的 `sandbox_backend` 参数、限制 `/api/sandbox/prepare` 仅允许访问当前用户线程、确保 `release()` 之后的 `destroy()` 会真正停止热池容器,并恢复 docker-compose 的完整模式默认值 -- 重构沙盒为 deer-flow 风格的 AIO provider:切换为 thread-local sandbox、统一 `/home/gem/user-data/{workspace,uploads,outputs}` 固定路径、移除公开 `/api/sandbox/*` 生命周期接口,并补充 lite 模式下的 provider 生命周期、filesystem API 与 sandbox 复用/隔离 E2E 验证 -- 调整聊天附件存储链路:线程附件改为直接落盘到 `saves/threads//user-data/uploads`,解析成功后额外生成 `uploads/attachments/*.md`,不再依赖 MinIO 或显式上传到 sandbox -- 修复知识库文件列表包体异常膨胀:上传阶段不再把批次级 `content_hashes` 写入每个文件的 `processing_params`,并从数据库详情列表接口中移除该字段,改为按需读取单文件详情 - -## v0.4 - -### 新增 -- 新增对于上传附件的智能体中间件,详见[文档](https://xerrors.github.io/Yuxi/advanced/agents-config.html#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%AD%E9%97%B4%E4%BB%B6) -- 新增多模态模型支持(当前仅支持图片),详见[文档](https://xerrors.github.io/Yuxi/advanced/agents-config.html#%E5%A4%9A%E6%A8%A1%E6%80%81%E5%9B%BE%E7%89%87%E6%94%AF%E6%8C%81) -- 新建 DeepAgents 智能体(深度分析智能体),支持 todo,files 等渲染,支持文件的下载。 -- 新增基于知识库文件生成思维导图功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) -- 新增基于知识库文件生成示例问题功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) -- 新增知识库支持文件夹/压缩包上传的功能([#335](https://github.com/xerrors/Yuxi/pull/335#issuecomment-3530976425)) -- 新增自定义模型支持、新增 dashscope rerank/embeddings 模型的支持 -- 新增文档解析的图片支持,已支持 MinerU Officical、Docs、Markdown Zip格式 -- 新增暗色模式支持并调整整体 UI([#343](https://github.com/xerrors/Yuxi/pull/343)) -- 新增知识库评估功能,支持导入评估基准或者自动构建评估基准(目前仅支持Milvus类型知识库)详见[文档](https://xerrors.github.io/Yuxi/intro/evaluation.html) -- 新增同名文件处理逻辑:遇到同名文件则在上传区域提示,是否删除旧文件 -- 新增生产环境部署脚本,固定 python 依赖版本,提升部署稳定性 -- 优化图谱可视化方式,统一图谱数据结构,统一使用基于 G6 的可视化方式,同时支持上传带属性的图谱文件,详见[文档](https://xerrors.github.io/Yuxi/intro/knowledge-base.html#_1-%E4%BB%A5%E4%B8%89%E5%85%83%E7%BB%84%E5%BD%A2%E5%BC%8F%E5%AF%BC%E5%85%A5) -- 优化 DBManager / ConversationManager,支持异步操作 -- 优化 知识库详情页面,更加简洁清晰,增强文件下载功能 - -### 修复 -- 修复 GitHub Actions 的 Ruff CI 在仓库根目录执行 `uv sync` 导致找不到 `backend/pyproject.toml` 的问题,同时统一检查路径为 `backend/package` -- 修复重排序模型实际未生效的问题 -- 修复消息中断后消息消失的问题,并改善异常效果 -- 修复当前版本如果调用结果为空的时候,工具调用状态会一直处于调用状态,尽管调用是成功的 -- 修复检索配置实际未生效的问题 -- 修复 sandbox 文件系统 `ls` 在异常输出下触发 `KeyError: 'path'` 的问题,并将工具调用异常降级为错误消息,避免直接中断聊天 stream -- 修复智能体状态面板中文件树仍依赖 `agent_state.files` 的问题,改为通过真实 `/api/filesystem/*` 接口按层懒加载后端可见文件系统,并让输入框下方状态按钮常态化打开工作区视图 -- 为工作台新增 viewer-oriented filesystem service 与 `/api/viewer/filesystem/*` 接口,解耦 agent backend 语义,支持真实目录浏览、原始文件读取与下载 -- 重写沙盒技术文档,明确 thread-local sandbox、viewer-oriented filesystem service、`/mnt` 命名空间、skills 可见性与当前实现边界,替换过时的 `/api/sandbox/*` 与 user-level 设计描述 -- 收紧沙盒遗留代码:修复未注册 `sandbox_router` 中残留的 user/thread 参数错位,改进宿主机挂载路径映射逻辑,并为 remote sandbox provisioner 增加基础 URL 校验与销毁失败日志 -- 修复 builtin skill 内容哈希计算对单文件使用 `read_bytes()` 的无上限内存读取问题,改为分块计算并补充回归测试 - -### 破坏性更新 - -- 移除 Chroma 的支持,当前版本标记为移除 -- 移除模型配置预设的 TogetherAI - - -## v0.3 -### Added -- 添加测试脚本,覆盖最常见的功能(已覆盖API) -- 新建 tasker 模块,用来管理所有的后台任务,UI 上使用侧边栏管理。Tasker 中获取历史任务的时候,仅获取 top100 个 task。 -- 优化对文档信息的检索展示(检索结果页、详情页) -- 优化全局配置的管理模型,优化配置管理 -- 支持 MinerU 2.5 的解析方法 -- 修改现有的智能体Demo,并尽量将默认助手的特性兼容到 LangGraph 的 [`create_agent`](https://docs.langchain.com/oss/python/langchain/agents) 中 -- 基于 create_agent 创建 SQL Viewer 智能体 -- 优化 MCP 逻辑,支持 common + special 创建方式 -- LightRAG 知识库应该可以支持修改 LLM - -### Fixed -- 修复本地知识库的 metadata 和 向量数据库中不一致的情况。 -- v1 版本的 LangGraph 的工具渲染有问题 -- upload 接口会阻塞主进程 -- LightRAG 知识库查看不了解析后的文本,偶然出现,未复现 -- 智能体的加载状态有问题:(1)智能体加载没有动画;(2)切换对话和加载中,使用同一个loading状态。 -- 前端工具调用渲染出现问题 -- 当前 ReAct 智能体有消息顺序错乱的 bug,且不会默认调用工具 -- 修复文件管理:(1)文件选择的时候会跨数据库;(2)文件校验会算上失败的文件; +维护说明: +- roadmap 仅保留未来规划(看板/Bugs/里程碑方向)。 +- 具体版本发布内容统一维护在 changelog。 diff --git a/web/package.json b/web/package.json index be8aae0f..95ebead4 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "yuxi-web", - "version": "0.6.0.beta3", + "version": "0.6.0", "private": true, "scripts": { "dev": "vite", diff --git a/web/src/apis/knowledge_api.js b/web/src/apis/knowledge_api.js index 9fda90f9..96ceca75 100644 --- a/web/src/apis/knowledge_api.js +++ b/web/src/apis/knowledge_api.js @@ -423,15 +423,6 @@ export const evaluationApi = { formData.append('name', metadata.name || '') formData.append('description', metadata.description || '') - // 调试:打印 FormData 内容 - console.log('FormData 内容:') - for (let [key, value] of formData.entries()) { - console.log(key, value) - } - console.log('file type:', file ? file.type : 'undefined') - console.log('file name:', file ? file.name : 'undefined') - - // 直接传递 FormData,apiAdminPost 会正确处理 return apiAdminPost(`/api/evaluation/databases/${dbId}/benchmarks/upload`, formData) }, diff --git a/web/src/components/AgentInputArea.vue b/web/src/components/AgentInputArea.vue index fbddd9a1..942230b1 100644 --- a/web/src/components/AgentInputArea.vue +++ b/web/src/components/AgentInputArea.vue @@ -233,6 +233,7 @@ const getTodoStatusLabel = (status) => { display: flex; align-items: center; margin-right: 8px; + gap: 2px; } .input-top-stack { diff --git a/web/src/components/ProjectOverview.vue b/web/src/components/ProjectOverview.vue deleted file mode 100644 index 68f78070..00000000 --- a/web/src/components/ProjectOverview.vue +++ /dev/null @@ -1,3 +0,0 @@ -