diff --git a/README.en.md b/README.en.md index 37fd7037..96847319 100644 --- a/README.en.md +++ b/README.en.md @@ -30,7 +30,7 @@ Clone the repository and initialize the project: ```bash -git clone --branch v0.6.1 --depth 1 https://github.com/xerrors/Yuxi.git +git clone --branch v0.6.2 --depth 1 https://github.com/xerrors/Yuxi.git cd Yuxi # Linux/macOS diff --git a/README.md b/README.md index 4842a55d..d7139bab 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ 克隆代码,并初始化 ``` -git clone --branch v0.6.1 --depth 1 https://github.com/xerrors/Yuxi.git +git clone --branch v0.6.2 --depth 1 https://github.com/xerrors/Yuxi.git cd Yuxi # Linux/macOS diff --git a/backend/package/pyproject.toml b/backend/package/pyproject.toml index f5322c3b..2fd4086b 100644 --- a/backend/package/pyproject.toml +++ b/backend/package/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "yuxi" -version = "0.6.2.beta" +version = "0.6.2" description = "Yuxi 智能知识库与知识图谱平台核心后端包" readme = "README.md" requires-python = ">=3.12,<3.14" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index cb4eeb27..38f29ed0 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "yuxi-workspace" -version = "0.6.2.beta" +version = "0.6.2" description = "基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建" readme = "README.md" requires-python = ">=3.12,<3.14" diff --git a/backend/uv.lock b/backend/uv.lock index ec6390d4..824fd35e 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -5659,7 +5659,7 @@ wheels = [ [[package]] name = "yuxi" -version = "0.6.2.beta" +version = "0.6.2" source = { editable = "package" } dependencies = [ { name = "agent-sandbox" }, @@ -5816,7 +5816,7 @@ requires-dist = [ [[package]] name = "yuxi-workspace" -version = "0.6.2.beta" +version = "0.6.2" source = { virtual = "." } dependencies = [ { name = "arq" }, diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 2faaf290..e8f6929c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -32,7 +32,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-api:${YUXI_VERSION:-0.6.2} container_name: api-prod working_dir: /app networks: @@ -69,7 +69,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-api:${YUXI_VERSION:-0.6.2} 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.6.2.beta} + image: yuxi-web:${YUXI_VERSION:-0.6.2} container_name: web-prod ports: - "80:80" diff --git a/docker-compose.yml b/docker-compose.yml index 045ee12f..d9b14589 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,7 +40,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-api:${YUXI_VERSION:-0.6.2} container_name: api-dev working_dir: /app volumes: @@ -88,7 +88,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-api:${YUXI_VERSION:-0.6.2} container_name: worker-dev working_dir: /app volumes: @@ -127,7 +127,7 @@ services: build: context: ./docker/sandbox_provisioner dockerfile: Dockerfile - image: yuxi-sandbox-provisioner:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-sandbox-provisioner:${YUXI_VERSION:-0.6.2} container_name: sandbox-provisioner volumes: - ./saves:/app/saves @@ -181,7 +181,7 @@ services: context: . dockerfile: docker/web.Dockerfile target: development - image: yuxi-web:${YUXI_VERSION:-0.6.2.beta} + image: yuxi-web:${YUXI_VERSION:-0.6.2} container_name: web-dev volumes: - ./web/src:/app/src diff --git a/docs/develop-guides/changelog.md b/docs/develop-guides/changelog.md index d1bd0c01..e416efdb 100644 --- a/docs/develop-guides/changelog.md +++ b/docs/develop-guides/changelog.md @@ -2,6 +2,36 @@ 本页用于记录各版本发布说明(新增、修复与破坏性变更)。 +## v0.6.2 (2026-05-22) + +### 新增 + +- 新增个人工作区预览与管理:提供独立于对话 thread 的用户级 workspace API,并增加“工作区”页面,用于浏览、预览、编辑、上传、下载、删除个人 workspace 文件;默认创建 `agents/AGENTS.md`,并在 Agent 执行时将其内容追加到系统提示词。 +- 新增独立模型配置模块:增加 `model_providers` 表、独立管理接口和“模型配置”页面,支持 provider 基础信息、远端候选模型、enabled models 配置和手动添加模型能力。 +- 新增远程 Skill 批量安装能力:后端新增 `install_remote_skills_batch()` 与 `POST /remote/install-batch`,前端补充批处理安装 API 和 UI 逻辑。 + +### 优化 + +- 下放扩展管理权限:普通管理员现在可进入扩展管理并完整管理 Tools、MCP、SubAgent、Skills;同步放开 Skill 管理接口权限并补充权限测试。 +- 调整 Agent 知识库默认选择:未显式配置知识库时默认启用当前用户可访问的全部知识库,显式保存空列表仍表示不启用知识库。 +- 优化评估基准自动生成:仅支持 commonrag/Milvus 知识库,默认参考 chunks 数量改为 1;多 chunk 场景复用知识库向量检索选择相似 chunks,不再对全量 chunks 重新计算 embedding。 +- 优化 Agent 输入框文件 mention:用户级 workspace 文件候选改为从独立 workspace API 递归加载,不再依赖 active thread;插入时仍转换为 `/home/gem/user-data/workspace/` 沙盒虚拟路径。 +- 调整知识库思维导图后端结构:将思维导图路由文件重命名为知识库语义更明确的 router,并把文件列表整理、提示词构建、AI JSON 解析等纯逻辑下沉到知识库 utils。 +- 收敛知识库评估后端结构:将评估指标、单题评估、答案生成提示词和自动基准生成算法下沉到 `knowledge/eval`,`EvaluationService` 保留任务、文件和持久化编排职责。 +- 扩展管理界面交互逻辑重构:MCP / Subagents / Skills 从“左侧边栏 + 右侧详情面板”调整为“卡片式网格布局 + 路由跳转二级页面”,工具标签页改为卡片网格布局 + 弹窗详情。 +- 统一卡片样式:`ExtensionCard` 新增 `tags` prop 并复用于知识库列表页,知识库列表改用 `ExtensionCard` + `ExtensionCardGrid` 替代原有自定义卡片。 +- 调整应用主导航:`AppLayout` 升级为默认展开的侧边栏,保留折叠态图标导航,并统一导航项、任务中心、GitHub、用户信息的图标与文字对齐。 +- 合并智能体对话导航:移除 `AgentChatComponent` 内部聊天侧边栏,将新建对话入口和对话历史移动到 `AppLayout` 主侧边栏,并通过共享线程 store 统一管理。 +- 统一前端 Markdown 预览渲染:新增共享 `MarkdownPreview` 组件与 `markdown_preview` 渲染工具,替换 Agent 消息、文件预览、知识库 chunk、任务工具结果、聊天导出等场景中的旧预览实现。 + +### 修复 + +- 修复聊天中普通用户 `@` 提及出不来技能和 MCP 列表的问题:放宽技能列表与 MCP 服务器列表读取接口至已登录用户,并对普通用户请求的 MCP 列表进行敏感连接参数脱敏。 +- 修复知识库文档入库状态回退:当已解析文件缺失 `markdown_file` 解析产物时,索引流程会将文件状态恢复为未解析,便于重新解析。 +- 修复附件上传后未立即刷新 mention 候选的问题。 +- 加固 JWT 鉴权安全:移除历史默认密钥回退,初始化脚本支持生成并持久化 `JWT_SECRET_KEY` 与 `YUXI_INSTANCE_ID`,签发和验证令牌时校验 `iss/aud`,并拒绝已删除或登录锁定用户继续使用旧令牌访问系统。 +- 修复模型配置路由请求模型未接收 `embedding_base_url` / `rerank_base_url` 导致前端已填写仍被后端校验拦截的问题。 + ## v0.6.1 (2026-04-24) ### 新增 diff --git a/docs/develop-guides/roadmap.md b/docs/develop-guides/roadmap.md index ab920a4e..ad329a3f 100644 --- a/docs/develop-guides/roadmap.md +++ b/docs/develop-guides/roadmap.md @@ -35,26 +35,9 @@ ## 版本记录 -### 0.6.2 开发记录 +### 0.6.3 开发记录 - -- 下放扩展管理权限:普通管理员现在可进入扩展管理并完整管理 Tools、MCP、SubAgent、Skills;同步放开 Skill 管理接口权限并补充权限测试。 -- 修复聊天中普通用户 `@` 提及出不来技能和 MCP 列表的 Bug:将获取技能列表 `GET /api/system/skills` 与获取 MCP 服务器列表 `GET /api/system/mcp-servers` 的鉴权要求放宽至已登录的普通用户(`get_required_user`);同时为了确保敏感配置的安全性,当普通用户请求 MCP 列表时,后端会自动进行脱敏,剔除 `url`、`command`、`args`、`env` 和 `headers` 等敏感连接参数,并新增了对应的角色鉴权及脱敏剔除测试用例。 -- 调整 Agent 知识库默认选择:未显式配置知识库时默认启用当前用户可访问的全部知识库,显式保存空列表仍表示不启用知识库。 -- 优化评估基准自动生成:仅支持 commonrag/Milvus 知识库,默认参考 chunks 数量改为 1;多 chunk 场景复用知识库向量检索选择相似 chunks,不再对全量 chunks 重新计算 embedding,并移除前端 Embedding 模型选择。 -- 修复知识库文档入库状态回退:当已解析文件缺失 `markdown_file` 解析产物时,索引流程会将文件状态恢复为未解析,便于重新解析而不是停留在索引失败。 -- 优化 Agent 输入框文件 mention:用户级 workspace 文件候选改为从独立 workspace API 递归加载,不再依赖 active thread;插入时仍转换为 `/home/gem/user-data/workspace/` 沙盒虚拟路径,并修复附件上传后未立即刷新 mention 候选的问题。 -- 调整知识库思维导图后端结构:将思维导图路由文件重命名为知识库语义更明确的 router,并把文件列表整理、提示词构建、AI JSON 解析等纯逻辑下沉到知识库 utils。 -- 收敛知识库评估后端结构:将评估指标、单题评估、答案生成提示词和自动基准生成算法下沉到 `knowledge/eval`,`EvaluationService` 保留任务、文件和持久化编排职责。 -- 新增个人工作区预览与管理:提供独立于对话 thread 的用户级 workspace API,并增加“工作区”页面,用于浏览个人 workspace 文件、预览 Markdown/文本/代码/图片/PDF;支持新建文件夹、上传文件、下载文件、删除文件/文件夹和多选删除;工作区预览支持 Markdown/TXT 在右侧预览框内切换编辑并保存,其他格式和非工作区预览默认只读;知识库与团队空间入口先展示到占位层级;默认创建 `agents/AGENTS.md`,并在 Agent 执行时将其内容追加到系统提示词。 -- 加固 JWT 鉴权安全:移除历史默认密钥回退,初始化脚本支持生成并持久化 `JWT_SECRET_KEY` 与 `YUXI_INSTANCE_ID`,签发和验证令牌时校验 `iss/aud`,并在鉴权阶段拒绝已删除或登录锁定用户继续使用旧令牌访问系统。 -- 扩展管理界面交互逻辑重构:将 MCP / Subagents / Skills 三个标签页从「左侧边栏 + 右侧详情面板」布局重构为「卡片式网格布局 + 路由跳转二级页面」布局,工具标签页改为卡片网格布局 + 弹窗详情(保持弹窗内容不变)。新增共享组件 `ExtensionCard`、`ExtensionCardGrid`、`ExtensionToolbar`、`ExtensionDetailLayout`,详情页(`McpDetailView`、`SubagentDetailView`、`SkillDetailView`)使用居中宽度限制,路由规划为 `/extensions/mcp/:name`、`/extensions/subagent/:name`、`/extensions/skill/:slug`。 -- 统一卡片样式:`ExtensionCard` 新增 `tags` prop 支持传入 `[{label, color}]` 数组,内部使用 `` 渲染,与知识库卡片标签风格统一;知识库列表页 `DataBaseView` 改用 `ExtensionCard` + `ExtensionCardGrid` 替代原有自定义卡片,移除冗余 card 样式。 -- 调整应用主导航:`AppLayout` 从默认窄栏升级为默认展开的侧边栏,保留折叠态图标导航;侧边栏样式收敛为 14px 文本 + 18px 图标的标准紧凑密度,并统一导航项、任务中心、GitHub、用户信息的图标与文字对齐。折叠态改为仅通过显式按钮展开,避免空白区域误触发。 -- 合并智能体对话导航:移除 `AgentChatComponent` 内部聊天侧边栏,将新建对话入口和对话历史移动到 `AppLayout` 主侧边栏,并通过共享线程 store 统一管理历史列表、当前线程、重命名、删除、置顶和分页加载。 -- 新增独立模型配置模块:增加 `model_providers` 表、独立管理接口和”模型配置”页面,支持 provider 基础信息、可配置模型列表端点、远端候选模型、`enabled_models` 的早期配置验证;启动时会补齐内置 provider 模板,`provider_type` 暂统一默认为 `openai`,该模块暂不接入现有运行时模型选择逻辑。远端模型加载默认使用 `/models` 获取 chat/通用模型,provider 声明 `embedding` 能力时使用 `/embeddings/models` 获取 embedding 候选,rerank 模型列表端点按供应商文档显式配置后加载;修复路由请求模型未接收 `embedding_base_url`/`rerank_base_url` 导致前端已填写仍被后端校验拦截的问题。补充手动添加模型能力:`enabled_models[i]` 新增可选 `source: "manual"|"remote"` 字段(默认 `remote`),管理员可通过”+ 手动添加”入口录入远端清单未覆盖的模型(典型:自部署 embedding/rerank),手动模型在前端跳过”远端不存在”的 stale 警告并显示「手动」标签;type 选项受 `provider.capabilities` 约束,后端在 `_normalize_payload` 与 `update_provider_config` 双层一致性校验中拦截越权写入。 -- 统一前端 Markdown 预览渲染:新增共享 `MarkdownPreview` 组件与 `markdown_preview` 渲染工具,替换 Agent 消息、文件预览、知识库 chunk、任务工具结果、聊天导出等场景中的旧 `md-editor-v3/marked` 预览;支持 KaTeX、任务列表、frontmatter 卡片、Shiki 代码高亮、DOMPurify 清洗和浅层渲染缓存,并抽取 HTML 转义与代码语言归一化工具。Skill 详情页复用 `AgentFilePreview`,统一文件预览、编辑、保存和全屏交互。 -- 优化远程 Skill 批量安装:`remote_skill_install_service.py` 新增 `install_remote_skills_batch()`,利用 `npx skills add --skill A --skill B --skill C` 原生多 skill 支持,将安装 N 个 skill 的仓库克隆次数从 2N 降至 1;配套新增路由 `POST /remote/install-batch`、前端 `installRemoteSkillsBatch()` API 方法和批处理 UI 逻辑 + --- diff --git a/docs/intro/quick-start.md b/docs/intro/quick-start.md index 4d1efacc..afe7117b 100644 --- a/docs/intro/quick-start.md +++ b/docs/intro/quick-start.md @@ -20,7 +20,7 @@ ```bash # 克隆最新版本 -git clone --branch v0.6.1 --depth 1 https://github.com/xerrors/Yuxi.git +git clone --branch v0.6.2 --depth 1 https://github.com/xerrors/Yuxi.git cd Yuxi ``` diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh index e8afea1c..893c681e 100755 --- a/scripts/bump-version.sh +++ b/scripts/bump-version.sh @@ -45,7 +45,7 @@ if [ ! -f "$PYPROJECT_FILE" ]; then exit 1 fi -CURRENT_VERSION=$(grep -E '^version\s*=\s*"' "$PYPROJECT_FILE" | head -1 | sed -E 's/^version\s*=\s*"([^"]+)".*/\1/') +CURRENT_VERSION=$(grep -E '^version[[:space:]]*=[[:space:]]*"' "$PYPROJECT_FILE" | head -1 | sed -E 's/^version[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/') if [ -z "$CURRENT_VERSION" ]; then echo "错误: 无法从 ${PYPROJECT_FILE} 读取当前版本号" @@ -67,6 +67,7 @@ echo " - docker-compose.prod.yml" echo " - backend/uv.lock" if [ "$DEV_MODE" = false ]; then echo " - README.md" + echo " - README.en.md" echo " - docs/intro/quick-start.md" fi echo "" @@ -80,32 +81,32 @@ fi # 1. 更新 Python 包版本 (backend/package/pyproject.toml) # ----------------------------------------------------------------------------- echo "→ 更新 backend/package/pyproject.toml" -sed -i -E "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \ +perl -pi -e "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \ "${PROJECT_ROOT}/backend/package/pyproject.toml" # ----------------------------------------------------------------------------- # 2. 更新后端工作区版本 (backend/pyproject.toml) # ----------------------------------------------------------------------------- echo "→ 更新 backend/pyproject.toml" -sed -i -E "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \ +perl -pi -e "s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/" \ "${PROJECT_ROOT}/backend/pyproject.toml" # ----------------------------------------------------------------------------- # 3. 更新前端版本 (web/package.json) # ----------------------------------------------------------------------------- echo "→ 更新 web/package.json" -sed -i -E "s/\"version\": \"[^\"]+\"/\"version\": \"${NEW_VERSION}\"/" \ +perl -pi -e "s/\"version\": \"[^\"]+\"/\"version\": \"${NEW_VERSION}\"/" \ "${PROJECT_ROOT}/web/package.json" # ----------------------------------------------------------------------------- # 4. 更新 Docker Compose 镜像标签默认值 # ----------------------------------------------------------------------------- echo "→ 更新 docker-compose.yml" -sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \ +perl -pi -e "s/\\\$\\{YUXI_VERSION:-[^}]+\\}/\\\${YUXI_VERSION:-${NEW_VERSION}}/g" \ "${PROJECT_ROOT}/docker-compose.yml" echo "→ 更新 docker-compose.prod.yml" -sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \ +perl -pi -e "s/\\\$\\{YUXI_VERSION:-[^}]+\\}/\\\${YUXI_VERSION:-${NEW_VERSION}}/g" \ "${PROJECT_ROOT}/docker-compose.prod.yml" # ----------------------------------------------------------------------------- @@ -113,10 +114,10 @@ sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \ # ----------------------------------------------------------------------------- echo "→ 更新 backend/uv.lock" # yuxi 包版本 -sed -i -E "/^name = \"yuxi\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \ +perl -0pi -e "s/(^name = \"yuxi\"\nversion = \")[^\"]+/\${1}${NEW_VERSION}/m" \ "${PROJECT_ROOT}/backend/uv.lock" # yuxi-workspace 版本 -sed -i -E "/^name = \"yuxi-workspace\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \ +perl -0pi -e "s/(^name = \"yuxi-workspace\"\nversion = \")[^\"]+/\${1}${NEW_VERSION}/m" \ "${PROJECT_ROOT}/backend/uv.lock" # ----------------------------------------------------------------------------- @@ -126,14 +127,18 @@ sed -i -E "/^name = \"yuxi-workspace\"$/{n;s/^version = \"[^\"]+\"/version = \"$ # 发布历史记录(如 [2026/04/01] v0.6.1 版本发布)不修改,保持为历史版本记录 if [ "$DEV_MODE" = false ]; then echo "→ 更新 README.md" - sed -i -E "s/(git clone --branch v)[0-9]+\.[0-9]+\.[0-9]+/\1${NEW_VERSION}/g" \ + perl -pi -e "s/(git clone --branch v)[0-9]+\\.[0-9]+\\.[0-9]+/\${1}${NEW_VERSION}/g" \ "${PROJECT_ROOT}/README.md" + echo "→ 更新 README.en.md" + perl -pi -e "s/(git clone --branch v)[0-9]+\\.[0-9]+\\.[0-9]+/\${1}${NEW_VERSION}/g" \ + "${PROJECT_ROOT}/README.en.md" + echo "→ 更新 docs/intro/quick-start.md" - sed -i -E "s/(git clone --branch v)[0-9]+\.[0-9]+\.[0-9]+/\1${NEW_VERSION}/g" \ + perl -pi -e "s/(git clone --branch v)[0-9]+\\.[0-9]+\\.[0-9]+/\${1}${NEW_VERSION}/g" \ "${PROJECT_ROOT}/docs/intro/quick-start.md" else - echo "→ dev 模式,跳过 README.md 和 docs/intro/quick-start.md 的分支版本更新" + echo "→ dev 模式,跳过 README.md、README.en.md 和 docs/intro/quick-start.md 的分支版本更新" fi # ----------------------------------------------------------------------------- diff --git a/web/package.json b/web/package.json index 7e7a39b4..e3b8b5fb 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "yuxi-web", - "version": "0.6.2.beta", + "version": "0.6.2", "private": true, "type": "module", "scripts": {