From be39d118fdaaab9cdb140a17818bed89897bd636 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 24 Apr 2026 19:32:16 +0800 Subject: [PATCH] chore(release): bump version to 0.6.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 单一版本来源:__version__ 改为从 pyproject.toml 动态读取 - Docker Compose 镜像标签环境变量化 (${YUXI_VERSION:-0.6.1}) - info.template.yaml 版权信息支持版本号动态注入 - 测试断言改为动态比较,不再硬编码版本号 - 新增 bump-version.sh 发版脚本,一键同步所有版本位置 - 更新 changelog.md,记录 v0.6.1 变更内容 --- README.md | 2 +- backend/package/pyproject.toml | 2 +- backend/package/yuxi/__init__.py | 7 +- .../yuxi/config/static/info.template.yaml | 2 +- backend/pyproject.toml | 2 +- backend/server/routers/system_router.py | 6 +- backend/test/unit/test_package_import.py | 2 +- backend/uv.lock | 4 +- docker-compose.prod.yml | 6 +- docker-compose.yml | 8 +- docs/develop-guides/changelog.md | 32 +++- scripts/bump-version.sh | 152 ++++++++++++++++++ web/package.json | 2 +- 13 files changed, 209 insertions(+), 18 deletions(-) create mode 100755 scripts/bump-version.sh diff --git a/README.md b/README.md index 0c430ea0..9cc31954 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ 克隆代码,并初始化 ``` -git clone --branch v0.6.0 --depth 1 https://github.com/xerrors/Yuxi.git +git clone --branch v0.6.1 --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 c2983862..d422184f 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.0" +version = "0.6.1" description = "Yuxi 智能知识库与知识图谱平台核心后端包" readme = "README.md" requires-python = ">=3.12,<3.14" diff --git a/backend/package/yuxi/__init__.py b/backend/package/yuxi/__init__.py index 5d3db434..b343dde3 100644 --- a/backend/package/yuxi/__init__.py +++ b/backend/package/yuxi/__init__.py @@ -7,7 +7,12 @@ from importlib import import_module # noqa: E402 from yuxi.config import config as config # noqa: E402 -__version__ = "0.6.0" +try: + from importlib.metadata import version + + __version__ = version("yuxi") +except Exception: + __version__ = "unknown" executor = ThreadPoolExecutor() # noqa: E402 diff --git a/backend/package/yuxi/config/static/info.template.yaml b/backend/package/yuxi/config/static/info.template.yaml index bcba29aa..191a945b 100644 --- a/backend/package/yuxi/config/static/info.template.yaml +++ b/backend/package/yuxi/config/static/info.template.yaml @@ -56,6 +56,6 @@ actions: # 页脚信息 footer: - copyright: "© 江南语析 2026 v0.6.0" + copyright: "© 江南语析 2026 v{{YUXI_VERSION}}" user_agreement_url: "/protocols/user-agreement.template.html" privacy_policy_url: "/protocols/privacy-policy.template.html" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index aed85353..4737c12f 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "yuxi-workspace" -version = "0.6.0" +version = "0.6.1" description = "基于大模型的智能知识库与知识图谱智能体开发平台,融合了 RAG 技术与知识图谱技术,基于 LangGraph v1 + Vue.js + FastAPI + LightRAG 架构构建" readme = "README.md" requires-python = ">=3.12,<3.14" diff --git a/backend/server/routers/system_router.py b/backend/server/routers/system_router.py index cd007a33..8fa4ed24 100644 --- a/backend/server/routers/system_router.py +++ b/backend/server/routers/system_router.py @@ -113,7 +113,11 @@ async def load_info_config(): # 异步读取配置文件 async with aiofiles.open(config_path, encoding="utf-8") as file: content = await file.read() - config = yaml.safe_load(content) + + # 注入版本号占位符 + content = content.replace("{{YUXI_VERSION}}", get_version()) + + config = yaml.safe_load(content) return config diff --git a/backend/test/unit/test_package_import.py b/backend/test/unit/test_package_import.py index 821c44cd..d7e7b278 100644 --- a/backend/test/unit/test_package_import.py +++ b/backend/test/unit/test_package_import.py @@ -8,5 +8,5 @@ def test_import_yuxi_does_not_eagerly_import_knowledge(monkeypatch): import yuxi - assert yuxi.get_version() == "0.6.0" + assert yuxi.get_version() == yuxi.__version__ assert "yuxi.knowledge" not in sys.modules diff --git a/backend/uv.lock b/backend/uv.lock index f1bd375b..545804cf 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -5606,7 +5606,7 @@ wheels = [ [[package]] name = "yuxi" -version = "0.6.0" +version = "0.6.1" source = { editable = "package" } dependencies = [ { name = "agent-sandbox" }, @@ -5753,7 +5753,7 @@ requires-dist = [ [[package]] name = "yuxi-workspace" -version = "0.6.0" +version = "0.6.1" source = { virtual = "." } dependencies = [ { name = "arq" }, diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index d711e841..e1a3b29b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -31,7 +31,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.0 + image: yuxi-api:${YUXI_VERSION:-0.6.1} container_name: api-prod working_dir: /app networks: @@ -68,7 +68,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.0 + image: yuxi-api:${YUXI_VERSION:-0.6.1} 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.0 + image: yuxi-web:${YUXI_VERSION:-0.6.1} container_name: web-prod ports: - "80:80" diff --git a/docker-compose.yml b/docker-compose.yml index 39242efd..1f382df4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,7 +39,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.0 + image: yuxi-api:${YUXI_VERSION:-0.6.1} container_name: api-dev working_dir: /app volumes: @@ -86,7 +86,7 @@ services: build: context: . dockerfile: docker/api.Dockerfile - image: yuxi-api:0.6.0 + image: yuxi-api:${YUXI_VERSION:-0.6.1} container_name: worker-dev working_dir: /app volumes: @@ -125,7 +125,7 @@ services: build: context: ./docker/sandbox_provisioner dockerfile: Dockerfile - image: yuxi-sandbox-provisioner:0.6.0 + image: yuxi-sandbox-provisioner:${YUXI_VERSION:-0.6.1} container_name: sandbox-provisioner volumes: - ./saves:/app/saves @@ -178,7 +178,7 @@ services: context: . dockerfile: docker/web.Dockerfile target: development - image: yuxi-web:0.6.0 + image: yuxi-web:${YUXI_VERSION:-0.6.1} container_name: web-dev volumes: - ./web/src:/app/src diff --git a/docs/develop-guides/changelog.md b/docs/develop-guides/changelog.md index def1aeac..d1bd0c01 100644 --- a/docs/develop-guides/changelog.md +++ b/docs/develop-guides/changelog.md @@ -2,7 +2,37 @@ 本页用于记录各版本发布说明(新增、修复与破坏性变更)。 -## v0.6 (2026-04-01) +## v0.6.1 (2026-04-24) + +### 新增 + +- 合并知识库导航入口:左侧导航仅保留"知识库",文档知识库与图知识库在页面 header 中通过同一组轻量切换入口切换 +- 抽象页面轻量切换 header:知识库与扩展管理页直接共用 `ViewSwitchHeader`,收敛文档知识库、知识图谱、Tools、MCP、Subagents、Skills 等入口的信息层级 +- 调整任务中心交互:入口移动到 GitHub 按钮下方,并将右侧抽屉展示改为居中弹窗 +- 将 `yuxi` 从 uv workspace 成员调整为 `backend/package` 下可独立构建的本地 Python 包,backend 通过 path dependency 以已安装包形式发现依赖 +- 新增 Skills 远程安装能力:Skills 管理页支持填写 `owner/repo` 或 GitHub URL,后端通过隔离的临时 `HOME` 调用 `npx skills add` 下载指定 skill +- 调整部门删除语义:删除部门时不再要求用户数为 0,而是将部门下用户迁移到默认部门 +- 扩展 viewer 工作区文件操作:`/home/gem/user-data/workspace` 支持从文件系统面板新建文件夹和上传文件 +- 为历史线程补充前端本地配置变更提示:当已有历史消息的对话中切换 Agent、切换配置或编辑配置项时,插入非持久化的信息提示 +- 调整 Worker run 模式下的消息首屏反馈:前端发送消息时先乐观渲染用户消息,再将前端生成的 `request_id` 透传给 `/api/chat/runs` 与服务端 `init` 对账 +- 调整聊天首页的智能体切换入口:当智能体数量 `>= 4` 或内容区宽度小于 `380px` 时自动收敛为"当前智能体 + 下拉按钮"形式 +- 调整智能体对话中的工具调用展示:连续工具调用默认折叠为"调用了 N 个工具"的轻量摘要 +- 调整输入框配置入口与侧边栏头尾交互:输入区配置按钮改为轻量 dropdown 触发器 + +### 修复 + +- 修复沙盒 `workspace` 隔离粒度:宿主机目录从共享 `saves/threads/shared/workspace` 收敛为用户级 `saves/threads/shared//workspace` +- 收紧文件系统安全边界:viewer/chat 下载与删除路径统一基于解析后的真实路径做允许目录校验,阻止通过软链接逃逸工作区/线程目录 +- 修复 OIDC 原始用户名绑定中的占位用户解析:解析目标用户 ID 时改为从右侧拆分,避免 `sub` 中包含冒号时把已绑定账号误判成冲突账号 +- 修复 DOCX 解析中的图片回插顺序:Docling 导出的多个 `` 占位符现在按文档图片顺序替换 +- 修复前端依赖安全告警:通过 `pnpm.overrides` 将传递依赖 `flatted` 锁定到 `3.4.2`、`lodash-es` 锁定到 `4.18.1` +- 修复对话摘要中间件的工具结果卸载链路:摘要触发时改为将大体积 `ToolMessage` 写入当前 agent 可见的 sandbox outputs 路径 +- 修复 agents 页对话侧边栏在 `keep-alive` 路由切换后的误关闭问题 +- 调整 Milvus 混合检索实现:集合 schema 增加 BM25 稀疏向量字段、BM25 函数和中文 analyzer 配置 +- 重构 MCP 运行时配置加载模型:移除 `MCP_SERVERS` 作为运行正确性前提的设计,改为每次直接从数据库读取最新 MCP 配置 +- 为知识库检索工具补充 `metadata.filepath` 注入:在 `query_kb` 统一出口基于会话可见知识库构建 `file_id -> /home/gem/kbs/...` 映射并回填 Milvus 检索结果 + +## v0.6.0 (2026-04-01) ### 新增 diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh new file mode 100755 index 00000000..ce528c5f --- /dev/null +++ b/scripts/bump-version.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================= +# Yuxi 版本号升级脚本 +# ============================================================================= +# 用法: ./scripts/bump-version.sh <新版本号> +# 示例: ./scripts/bump-version.sh 0.6.2 +# +# 该脚本从 backend/package/pyproject.toml 读取当前版本, +# 自动同步所有需要硬编码版本号的位置。 +# ============================================================================= + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +# 检查参数 +if [ $# -ne 1 ]; then + echo "用法: $0 <新版本号>" + echo "示例: $0 0.6.2" + exit 1 +fi + +NEW_VERSION="$1" + +# 验证版本号格式(支持 x.y.z 或 x.y.z.devN) +if [[ ! "$NEW_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(\.[a-zA-Z0-9]+)?$ ]]; then + echo "错误: 版本号格式无效,期望格式如 0.6.2 或 0.6.2.dev1" + exit 1 +fi + +# 读取当前版本号(以 backend/package/pyproject.toml 为 SSOT) +PYPROJECT_FILE="${PROJECT_ROOT}/backend/package/pyproject.toml" +if [ ! -f "$PYPROJECT_FILE" ]; then + echo "错误: 找不到 ${PYPROJECT_FILE}" + exit 1 +fi + +CURRENT_VERSION=$(grep -E '^version\s*=\s*"' "$PYPROJECT_FILE" | head -1 | sed -E 's/^version\s*=\s*"([^"]+)".*/\1/') + +if [ -z "$CURRENT_VERSION" ]; then + echo "错误: 无法从 ${PYPROJECT_FILE} 读取当前版本号" + exit 1 +fi + +if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then + echo "当前版本已经是 ${NEW_VERSION},无需更新" + exit 0 +fi + +echo "准备将版本号从 ${CURRENT_VERSION} 升级到 ${NEW_VERSION}" +echo "受影响的文件:" +echo " - backend/package/pyproject.toml" +echo " - backend/pyproject.toml" +echo " - web/package.json" +echo " - docker-compose.yml" +echo " - docker-compose.prod.yml" +echo " - backend/uv.lock" +echo " - README.md" +echo " - docs/intro/quick-start.md" +echo "" +read -rp "确认继续? [y/N] " confirm +if [[ ! "$confirm" =~ ^[Yy]$ ]]; then + echo "已取消" + exit 0 +fi + +# ----------------------------------------------------------------------------- +# 1. 更新 Python 包版本 (backend/package/pyproject.toml) +# ----------------------------------------------------------------------------- +echo "→ 更新 backend/package/pyproject.toml" +sed -i -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}\"/" \ + "${PROJECT_ROOT}/backend/pyproject.toml" + +# ----------------------------------------------------------------------------- +# 3. 更新前端版本 (web/package.json) +# ----------------------------------------------------------------------------- +echo "→ 更新 web/package.json" +sed -i -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" \ + "${PROJECT_ROOT}/docker-compose.yml" + +echo "→ 更新 docker-compose.prod.yml" +sed -i -E "s/\\\$\{YUXI_VERSION:-[^}]+\}/\${YUXI_VERSION:-${NEW_VERSION}}/g" \ + "${PROJECT_ROOT}/docker-compose.prod.yml" + +# ----------------------------------------------------------------------------- +# 5. 更新 uv.lock 中的项目版本号 +# ----------------------------------------------------------------------------- +echo "→ 更新 backend/uv.lock" +# yuxi 包版本 +sed -i -E "/^name = \"yuxi\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \ + "${PROJECT_ROOT}/backend/uv.lock" +# yuxi-workspace 版本 +sed -i -E "/^name = \"yuxi-workspace\"$/{n;s/^version = \"[^\"]+\"/version = \"${NEW_VERSION}\"/;}" \ + "${PROJECT_ROOT}/backend/uv.lock" + +# ----------------------------------------------------------------------------- +# 6. 更新文档中的版本引用 +# ----------------------------------------------------------------------------- +# 只替换 git clone 命令中的版本标签(确保总是指向最新版本) +# 发布历史记录(如 [2026/04/01] v0.6.1 版本发布)不修改,保持为历史版本记录 +echo "→ 更新 README.md" +sed -i -E "s/(git clone --branch v)[0-9]+\.[0-9]+\.[0-9]+/\1${NEW_VERSION}/g" \ + "${PROJECT_ROOT}/README.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" \ + "${PROJECT_ROOT}/docs/intro/quick-start.md" + +# ----------------------------------------------------------------------------- +# 7. 验证 +# ----------------------------------------------------------------------------- +echo "" +echo "版本号升级完成,验证结果:" +echo "" + +echo " backend/package/pyproject.toml:" +grep -E "^version = \"" "${PROJECT_ROOT}/backend/package/pyproject.toml" | head -1 | sed 's/^/ /' + +echo " backend/pyproject.toml:" +grep -E "^version = \"" "${PROJECT_ROOT}/backend/pyproject.toml" | head -1 | sed 's/^/ /' + +echo " web/package.json:" +grep -E '"version"' "${PROJECT_ROOT}/web/package.json" | head -1 | sed 's/^/ /' + +echo " docker-compose.yml (api):" +grep -E "image: yuxi-api:" "${PROJECT_ROOT}/docker-compose.yml" | head -1 | sed 's/^/ /' + +echo " docker-compose.prod.yml (web):" +grep -E "image: yuxi-web:" "${PROJECT_ROOT}/docker-compose.prod.yml" | head -1 | sed 's/^/ /' + +echo "" +echo "后续步骤:" +echo " 1. 检查 git diff 确认修改无误" +echo " 2. 基于 [Roadmap](docs/develop-guides/roadmap.md) 整理后,更新到 docs/develop-guides/changelog.md" +echo " 3. git add . && git commit -m 'chore(release): bump version to ${NEW_VERSION}'" +echo " 4. git tag v${NEW_VERSION}" +echo " 5. git push origin main --tags" diff --git a/web/package.json b/web/package.json index 4d64cec5..bb8b62bc 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "yuxi-web", - "version": "0.6.0", + "version": "0.6.1", "private": true, "scripts": { "dev": "vite",