diff --git a/distribution/linux/euler-copilot-shell.spec b/distribution/linux/euler-copilot-shell.spec index c1f8d0195e2f22a2e142faaf8f693fc044165afb..086e82deb12979900aac79d1ab39438446366836 100644 --- a/distribution/linux/euler-copilot-shell.spec +++ b/distribution/linux/euler-copilot-shell.spec @@ -3,15 +3,14 @@ %global debug_package %{nil} Name: euler-copilot-shell -Version: 1.0.0 -Release: 1%{?dist} +Version: 0.10.0 +Release: 3%{?dist} Summary: openEuler Intelligence 智能命令行工具集 License: MulanPSL-2.0 URL: https://gitee.com/openeuler/euler-copilot-shell Source0: %{name}-%{version}.tar.gz -# 支持x86_64和aarch64双架构 -ExclusiveArch: x86_64 aarch64 +ExclusiveArch: x86_64 aarch64 riscv64 loongarch64 BuildRequires: python3-devel BuildRequires: python3-virtualenv @@ -99,10 +98,13 @@ ln -sf /usr/lib/openeuler-intelligence/scripts/deploy %{buildroot}%{_bindir}/ope %{_bindir}/openeuler-intelligence-installer %changelog -* Thu Aug 28 2025 openEuler - 1.0.0-1 +* Thu Sep 04 2025 openEuler - 0.10.0-3 +- 部署功能新增支持全量部署(含 RAG、Web) +- 允许构建 riscv64 loongarch64 版本 + +* Thu Aug 28 2025 openEuler - 0.10.0-2 - 新增 openEuler Intelligence 部署功能 TUI - 新增选择默认 Agent 功能 -- 版本号升级至 1.0.0 * Wed Aug 13 2025 openEuler - 0.10.0-1 - 重构为子包形式:openeuler-intelligence-cli 和 openeuler-intelligence-installer diff --git a/scripts/deploy/1-check-env/check_env.sh b/scripts/deploy/1-check-env/check_env.sh index c3877142fca179fac9151aa78a9a5da1c9dc62b7..718ea4b44fc6b63a27b08c26a41c4c3e0eb85519 100644 --- a/scripts/deploy/1-check-env/check_env.sh +++ b/scripts/deploy/1-check-env/check_env.sh @@ -102,9 +102,10 @@ check_url_accessibility() { fi local all_success=true - local timeout_seconds=15 # 设置超时时间 - local temp_file=$(mktemp) # 创建临时文件 - local failed_urls=() # 存储失败的URL + local timeout_seconds=15 # 设置超时时间 + local failed_urls=() # 存储失败的URL + local temp_file # 创建临时文件 + temp_file=$(mktemp) echo -e "${COLOR_INFO}开始检测URL可达性...${COLOR_RESET}" echo -e "${COLOR_INFO}超时时间: ${timeout_seconds}秒${COLOR_RESET}" @@ -185,10 +186,26 @@ function check_version { echo -e "${COLOR_INFO}[Info] 当前操作系统版本为:$current_version_id LTS-$sp${COLOR_RESET}" for version_id in "${supported_versions[@]}"; do if [[ "$current_version_id" == "$version_id" ]]; then - if [[ "$sp" == "SP2" ]]; then - echo -e "${COLOR_SUCCESS}[Success] 操作系统满足兼容性要求${COLOR_RESET}" - return 0 - fi + case "$current_version_id" in + "22.03") + if [[ "$sp" == "SP4" ]]; then + echo -e "${COLOR_SUCCESS}[Success] 操作系统满足兼容性要求${COLOR_RESET}" + return 0 + fi + ;; + "24.03") + if [[ "$sp" == "SP2" || "$sp" == "SP3" ]]; then + echo -e "${COLOR_SUCCESS}[Success] 操作系统满足兼容性要求${COLOR_RESET}" + return 0 + fi + ;; + "25.03" | "25.09") + if [[ -z "$sp" ]]; then + echo -e "${COLOR_SUCCESS}[Success] 操作系统满足兼容性要求${COLOR_RESET}" + return 0 + fi + ;; + esac fi done @@ -197,15 +214,18 @@ function check_version { } function check_os_version { - local id=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"') - local version=$(grep -E "^VERSION_ID=" /etc/os-release | cut -d '"' -f 2) - local sp=$(grep -E "^VERSION=" /etc/os-release | grep -oP 'SP\d+') + local id + local version + local sp + id=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"') + version=$(grep -E "^VERSION_ID=" /etc/os-release | cut -d '"' -f 2) + sp=$(grep -E "^VERSION=" /etc/os-release | grep -oP 'SP\d+') echo -e "${COLOR_INFO}[Info] 当前发行版为:$id${COLOR_RESET}" case $id in "openEuler") - local supported_versions=("24.03") + local supported_versions=("22.03" "24.03" "25.03" "25.09") check_version "$version" "${supported_versions[@]}" "$sp" ;; "hce") @@ -221,7 +241,8 @@ function check_os_version { } function check_hostname { - local current_hostname=$(cat /etc/hostname) + local current_hostname + current_hostname=$(cat /etc/hostname) if [[ -z "$current_hostname" ]]; then echo -e "${COLOR_WARNING}[Warning] 未设置主机名,自动设置为localhost${COLOR_RESET}" set_hostname "localhost" @@ -292,13 +313,15 @@ check_all_packages() { local PACKAGES=("$@") local timeout_seconds=30 - local start_time=$(date +%s) + local start_time + start_time=$(date +%s) echo -e "${COLOR_INFO}--------------------------------${COLOR_RESET}" for pkg in "${PACKAGES[@]}"; do # 检查是否超时 - local current_time=$(date +%s) + local current_time + current_time=$(date +%s) local elapsed=$((current_time - start_time)) if [ $elapsed -ge $timeout_seconds ]; then @@ -389,7 +412,8 @@ function check_dns { function check_ram { local RAM_THRESHOLD=1024 - local current_mem=$(free -m | awk '/Mem/{print $2}') + local current_mem + current_mem=$(free -m | awk '/Mem/{print $2}') echo -e "${COLOR_INFO}[Info] 当前内存:$current_mem MB${COLOR_RESET}" if ((current_mem < RAM_THRESHOLD)); then @@ -404,7 +428,8 @@ check_disk_space() { local DIR="$1" local THRESHOLD="$2" - local USAGE=$(df --output=pcent "$DIR" | tail -n 1 | sed 's/%//g' | tr -d ' ') + local USAGE + USAGE=$(df --output=pcent "$DIR" | tail -n 1 | sed 's/%//g' | tr -d ' ') if [ "$USAGE" -ge "$THRESHOLD" ]; then echo -e "${COLOR_WARNING}[Warning] $DIR 的磁盘使用率已达到 ${USAGE}%,超过阈值 ${THRESHOLD}%${COLOR_RESET}" @@ -465,7 +490,7 @@ setup_firewall() { echo -e "${COLOR_INFO}[Info]防火墙已运行,开放端口${COLOR_RESET}" for port in "${PORTS[@]}"; do echo -e "${COLOR_INFO}[Info]开放端口 $port/tcp...${COLOR_RESET}" - firewall-cmd --permanent --add-port=${port}/tcp || { + firewall-cmd --permanent --add-port="${port}"/tcp || { echo -e "${COLOR_ERROR}[Error]开放端口 $port 失败!${COLOR_RESET}" return 1 } @@ -488,8 +513,10 @@ read_install_mode() { fi # 从文件读取配置(格式:key=value) - local web_install=$(grep "web_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) - local rag_install=$(grep "rag_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) + local web_install + local rag_install + web_install=$(grep "web_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) + rag_install=$(grep "rag_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) # 验证读取结果 if [ -z "$web_install" ] || [ -z "$rag_install" ]; then diff --git a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh index a8295364eea2f386c8b11eb9cedab519fb8fafe9..761f4e0a77b96aca40c31098a0ab6fd8ea884b69 100644 --- a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh +++ b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh @@ -56,28 +56,28 @@ install_minio() { return 1 fi ! is_x86_architecture || { - local minio_url="https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_src="../5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm" - local minio_file="/opt/minio/minio-20250524170830.0.0-1.x86_64.rpm" + local minio_url="https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250524170830.0.0-1.x86_64.rpm" + local minio_src="../5-resource/rpm/minio-20250524170830.0.0-1.x86_64.rpm" + local minio_file="/opt/minio/minio-20250524170830.0.0-1.x86_64.rpm" - if [ -f "$minio_src" ]; then - cp -r "$minio_src" "$minio_file" - sleep 1 - fi - if [ ! -f "$minio_file" ]; then - echo -e "${COLOR_INFO}[Info] 正在下载MinIO软件包...${COLOR_RESET}" - if ! wget "$minio_url" --no-check-certificate -O "$minio_file"; then - echo -e "${COLOR_ERROR}[Error] MinIO下载失败${COLOR_RESET}" - return 1 + if [ -f "$minio_src" ]; then + cp -r "$minio_src" "$minio_file" + sleep 1 + fi + if [ ! -f "$minio_file" ]; then + echo -e "${COLOR_INFO}[Info] 正在下载MinIO软件包...${COLOR_RESET}" + if ! wget "$minio_url" --no-check-certificate -O "$minio_file"; then + echo -e "${COLOR_ERROR}[Error] MinIO下载失败${COLOR_RESET}" + return 1 + fi fi - fi - dnf install -y $minio_file || { - echo -e "${COLOR_ERROR}[Error] MinIO安装失败${COLOR_RESET}" - return 1 - } - echo -e "${COLOR_SUCCESS}[Success] MinIO安装成功...${COLOR_RESET}" - return 0 + dnf install -y $minio_file || { + echo -e "${COLOR_ERROR}[Error] MinIO安装失败${COLOR_RESET}" + return 1 + } + echo -e "${COLOR_SUCCESS}[Success] MinIO安装成功...${COLOR_RESET}" + return 0 } echo -e "${COLOR_INFO}[Info] 下载MinIO二进制文件(aarch64)...${COLOR_RESET}" local minio_url="https://dl.min.io/server/minio/release/linux-arm64/minio" @@ -114,7 +114,8 @@ smart_install() { # 本地安装模式(仅在本地仓库可用时尝试) if [[ "$use_local" == true ]]; then # 检查本地是否存在包(支持模糊匹配) - local local_pkg=$(find "$LOCAL_REPO_DIR" -name "${pkg}-*.rpm" | head -1) + local local_pkg + local_pkg=$(find "$LOCAL_REPO_DIR" -name "${pkg}-*.rpm" | head -1) if [[ -n "$local_pkg" ]]; then if dnf --disablerepo='*' --enablerepo=local-rpms install -y "$pkg"; then @@ -146,7 +147,7 @@ install_and_verify() { local pkgs=("$@") # 检查并安装每个包 for pkg in "${pkgs[@]}"; do - smart_install $pkg + smart_install "$pkg" sleep 1 done # 检查安装结果 @@ -480,8 +481,10 @@ check_pip_rag() { # 检查每个包是否需要安装 for pkg in "${!REQUIRED_PACKAGES[@]}"; do - local required_ver="${REQUIRED_PACKAGES[$pkg]}" - local installed_ver=$(pip show "$pkg" 2>/dev/null | grep '^Version:' | awk '{print $2}') + local required_ver + local installed_ver + required_ver="${REQUIRED_PACKAGES[$pkg]}" + installed_ver=$(pip show "$pkg" 2>/dev/null | grep '^Version:' | awk '{print $2}') if [[ -z "$installed_ver" ]]; then echo -e "${COLOR_WARNING}[Warning] 未安装包: $pkg${COLOR_RESET}" @@ -514,14 +517,76 @@ check_pip_rag() { return 0 } -check_pip() { - # 定义需要检查的包和版本 - declare -A REQUIRED_PACKAGES=( - ["pymongo"]="" - ["requests"]="" - ["pydantic"]="" - ["aiohttp"]="" - ) + +check_pip_framework() { + # 获取 Python 版本 + local python_version + python_version=$(python3 --version 2>&1 | grep -oP '\d+\.\d+' | head -1) + + # 根据 Python 版本选择包列表 + declare -A REQUIRED_PACKAGES + if [[ "$python_version" =~ ^3\.(11|[2-9][0-9])$ ]]; then + # Python 3.11 或更新版本,使用当前列表 + REQUIRED_PACKAGES=( + ["pymongo"]="" + ["requests"]="" + ["pydantic"]="" + ["aiohttp"]="" + ) + elif [[ "$python_version" =~ ^3\.(9|10)$ ]]; then + # Python 3.9 或 3.10,使用完整列表 + REQUIRED_PACKAGES=( + ["requests"]="" + ["aiohttp"]="" + ["aiofiles"]="24.1.0" + ["asyncer"]="0.0.8" + ["asyncpg"]="0.30.0" + ["cryptography"]="44.0.2" + ["fastapi"]="0.115.12" + ["httpx"]="0.28.1" + ["httpx-sse"]="0.4.0" + ["jinja2"]="3.1.6" + ["jionlp"]="1.5.20" + ["jsonschema"]="4.23.0" + ["lancedb"]="0.21.2" + ["minio"]="7.2.15" + ["ollama"]="0.5.1" + ["openai"]="1.91.0" + ["pandas"]="2.2.3" + ["pgvector"]="0.4.1" + ["pillow"]="10.3.0" + ["pydantic"]="2.11.7" + ["pymongo"]="4.12.1" + ["python-jsonpath"]="1.3.0" + ["python-magic"]="0.4.27" + ["python-multipart"]="0.0.20" + ["pytz"]="2025.2" + ["pyyaml"]="6.0.2" + ["rich"]="13.9.4" + ["sqids"]="0.5.1" + ["sqlalchemy"]="2.0.41" + ["tiktoken"]="0.9.0" + ["toml"]="0.10.2" + ["uvicorn"]="0.34.0" + ) + # 对于 Python 3.9,单独安装 MCP 的 wheel 包 + local wheel_path="../5-resource/pip/mcp-1.6.0-py3-none-any.whl" + if [ -f "$wheel_path" ]; then + echo -e "${COLOR_INFO}[Info] 为 Python 3.9 安装 wheel 包: $wheel_path${COLOR_RESET}" + install_list+=("$wheel_path") + need_install=1 + else + echo -e "${COLOR_WARNING}[Warning] Wheel 文件不存在: $wheel_path${COLOR_RESET}" + fi + else + echo -e "${COLOR_WARNING}[Warning] 不支持的 Python 版本: $python_version,使用默认列表${COLOR_RESET}" + REQUIRED_PACKAGES=( + ["pymongo"]="" + ["requests"]="" + ["pydantic"]="" + ["aiohttp"]="" + ) + fi local need_install=0 local install_list=() @@ -530,8 +595,10 @@ check_pip() { # 检查每个包是否需要安装 for pkg in "${!REQUIRED_PACKAGES[@]}"; do - local required_ver="${REQUIRED_PACKAGES[$pkg]}" - local installed_ver=$(pip show "$pkg" 2>/dev/null | grep '^Version:' | awk '{print $2}') + local required_ver + local installed_ver + required_ver="${REQUIRED_PACKAGES[$pkg]}" + installed_ver=$(pip show "$pkg" 2>/dev/null | grep '^Version:' | awk '{print $2}') if [[ -z "$installed_ver" ]]; then echo -e "${COLOR_WARNING}[Warning] 未安装包: $pkg${COLOR_RESET}" @@ -564,6 +631,7 @@ check_pip() { return 0 } + install_framework() { echo -e "\n${COLOR_INFO}[Info] 开始安装框架服务...${COLOR_RESET}" local pkgs=( @@ -580,10 +648,11 @@ install_framework() { return 1 fi cd "$SCRIPT_DIR" || return 1 - cd "$SCRIPT_DIR" || return 1 install_mongodb || return 1 - check_pip || return 1 + cd "$SCRIPT_DIR" || return 1 + check_pip_framework || return 1 } + install_rag() { local pkgs=( "euler-copilot-rag" @@ -610,6 +679,7 @@ install_rag() { cd "$SCRIPT_DIR" || return 1 check_pip_rag || return 1 } + install_web() { local pkgs=( "nginx" @@ -626,6 +696,7 @@ install_web() { return 1 fi } + # 读取安装模式的方法 read_install_mode() { if [ ! -f "$INSTALL_MODE_FILE" ]; then @@ -634,8 +705,10 @@ read_install_mode() { fi # 从文件读取配置(格式:key=value) - local web_install=$(grep "web_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) - local rag_install=$(grep "rag_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) + local web_install + local rag_install + web_install=$(grep "web_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) + rag_install=$(grep "rag_install=" "$INSTALL_MODE_FILE" | cut -d'=' -f2) # 验证读取结果 if [ -z "$web_install" ] || [ -z "$rag_install" ]; then @@ -653,6 +726,7 @@ read_install_mode() { RAG_INSTALL=$rag_install return 0 } + # 示例:根据安装模式执行对应操作(可根据实际需求扩展) install_components() { # 读取安装模式 @@ -677,7 +751,8 @@ install_components() { main() { echo -e "${COLOR_INFO}[Info] === 开始服务安装===${COLOR_RESET}" # 获取脚本所在的绝对路径 - declare SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + local SCRIPT_DIR + SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 切换到脚本所在目录 cd "$SCRIPT_DIR" || return 1 #查看当前脚本执行的模式 diff --git a/scripts/deploy/5-resource/mcp-servers.rpmlist b/scripts/deploy/5-resource/mcp-servers.rpmlist index cc3226ed92ff373d02e335fbf4ea63bef93fff1d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/scripts/deploy/5-resource/mcp-servers.rpmlist +++ b/scripts/deploy/5-resource/mcp-servers.rpmlist @@ -1,2 +0,0 @@ -mcp-servers-perf -mcp-servers-remote-shell diff --git a/scripts/deploy/5-resource/pip/mcp-1.6.0-py3-none-any.whl b/scripts/deploy/5-resource/pip/mcp-1.6.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c095abdac4795d3284c163da05c2aac7d838d20f Binary files /dev/null and b/scripts/deploy/5-resource/pip/mcp-1.6.0-py3-none-any.whl differ diff --git a/setup.py b/setup.py index 5fec4d776e50c63d35076a9fcefd9af41ca0e06a..0fd4721f54fa891e524a3799cf2de654d3efadab 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ from setuptools import find_packages, setup setup( name="oi-cli", - version="1.0.0", + version="0.10.0", description="智能 Shell 命令行工具", author="openEuler", author_email="contact@openeuler.org", diff --git a/src/app/deployment/service.py b/src/app/deployment/service.py index 830787edbcef8296ffecc25527bec532b5de1f2f..1bb3580a5912e6b94eb3b6e023ba723a76b324b5 100644 --- a/src/app/deployment/service.py +++ b/src/app/deployment/service.py @@ -10,6 +10,7 @@ import asyncio import contextlib import platform import re +import sys from pathlib import Path from typing import TYPE_CHECKING @@ -192,6 +193,13 @@ class DeploymentService: errors.append("仅支持 openEuler 操作系统") return False, errors + # 检查 Python 版本兼容性 + python_version = sys.version_info + current_version = f"{python_version.major}.{python_version.minor}" + if python_version < (3, 10) and progress_callback: + temp_state.add_log(f"⚠ 检测到 Python {current_version},低于 3.10 版本将不支持全量部署模式") + progress_callback(temp_state) + # 检查并安装 openeuler-intelligence-installer if not self.resource_manager.check_installer_available(): if progress_callback: @@ -238,6 +246,35 @@ class DeploymentService: system_info = platform.platform().lower() return "openeuler" in system_info + def check_python_version_for_deployment(self, deployment_mode: str) -> tuple[bool, str]: + """ + 检查 Python 版本是否支持指定的部署模式 + + Args: + deployment_mode: 部署模式 ("light" 或 "full") + + Returns: + tuple[bool, str]: (是否支持, 错误信息) + + """ + try: + python_version = sys.version_info + current_version = f"{python_version.major}.{python_version.minor}" + + # 检查是否低于 3.10 + if python_version < (3, 10) and deployment_mode == "full": + return False, ( + "当前 openEuler 版本低于 24.03 LTS," + "不支持全量部署模式。请使用轻量部署模式或升级到 openEuler 24.03+ 版本" + ) + + except Exception as e: + logger.exception("检查 Python 环境版本时发生错误") + return False, f"无法检查 Python 环境: {e}" + else: + # Python 版本符合要求 + return True, f"Python 环境版本 {current_version} 符合要求" + async def check_sudo_privileges(self) -> bool: """检查 sudo 权限""" try: @@ -279,8 +316,8 @@ class DeploymentService: # 重置状态 self.state.reset() self.state.is_running = True - # 根据部署模式设置总步数:轻量模式7步,全量模式6步 - self.state.total_steps = 7 if config.deployment_mode == "light" else 6 + # 根据部署模式设置总步数:轻量模式5步,全量模式4步 + self.state.total_steps = 5 if config.deployment_mode == "light" else 4 # 执行部署步骤 success = await self._execute_deployment_steps(config, progress_callback) @@ -383,8 +420,8 @@ class DeploymentService: # 定义基础部署步骤 steps = [ - self._check_environment, self._setup_deploy_mode, + self._check_environment, self._run_env_check_script, self._run_install_dependency_script, self._generate_config_files, @@ -453,6 +490,12 @@ class DeploymentService: return False self.state.add_log("✓ 检测到 openEuler 操作系统") + # 检查 openEuler & Python 版本是否支持指定的部署模式 + python_check_ok, python_msg = self.check_python_version_for_deployment(config.deployment_mode) + if not python_check_ok: + self.state.add_log(f"✗ 错误: {python_msg}") + return False + # 检查安装器资源 if not self.resource_manager.check_installer_available(): self.state.add_log("✗ 错误: openeuler-intelligence-installer 包未安装或资源缺失") @@ -474,8 +517,8 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """设置部署模式""" - self.state.current_step = 2 - self.state.current_step_name = "设置部署模式" + self.state.current_step = 0 + self.state.current_step_name = "初始化部署配置" self.state.add_log("正在设置部署模式...") if progress_callback: @@ -523,8 +566,8 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """运行环境检查脚本""" - self.state.current_step = 3 - self.state.current_step_name = "环境检查" + self.state.current_step = 1 + self.state.current_step_name = "检查系统环境" self.state.add_log("正在执行系统环境检查...") if progress_callback: @@ -544,7 +587,7 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """运行依赖安装脚本""" - self.state.current_step = 4 + self.state.current_step = 2 self.state.current_step_name = "安装依赖组件" self.state.add_log("正在安装 openEuler Intelligence 依赖组件...") @@ -567,7 +610,7 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """运行配置初始化脚本""" - self.state.current_step = 6 + self.state.current_step = 4 self.state.current_step_name = "初始化配置和服务" self.state.add_log("正在初始化配置和启动服务...") @@ -657,7 +700,7 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """生成配置文件""" - self.state.current_step = 5 + self.state.current_step = 3 self.state.current_step_name = "更新配置文件" self.state.add_log("正在更新配置文件...") @@ -899,7 +942,7 @@ class DeploymentService: progress_callback: Callable[[DeploymentState], None] | None, ) -> bool: """运行 Agent 初始化脚本""" - self.state.current_step = 7 + self.state.current_step = 5 self.state.current_step_name = "初始化 Agent 服务" self.state.add_log("正在检查 openEuler Intelligence 后端服务状态...")