改造Solution Agent for x86~~

淬火行动发的 Solution Agent 只有 ARM 版?笔者把它按 Dockerfile 魔改上了 Intel 笔记本:绕过 gitcode submodule 的坑、从 arm64 镜像里提取 banner.sh 和 Wiki 数据、端口重映射、重建索引顺手关掉 Flask debug——最终 58 个方案完整跑通。

改造Solution Agent for x86~~

环境:淬火行动培训 · Docker · arm64 (aarch64) → amd64 (x86_64) · 镜像 9.12GB → 15GB
本文首发于华为 O3 社区,2026-11-09 搬运至本站


一、缘起:给 SA 搬个家

借用一句人民的名义经典台词:Solution Agent好啊,Solution Agent得会玩啊~

在淬火行动培训的第一天,笔者就觉得Solution Agent(后文简称SA)是个好东西,要是自己的电脑上能启一个,那以后售前项目岂不是起飞了~

然而查阅SA项目链接,发现SA目前只有for ARM版本,想要在笔者的Intel笔记本上运行得根据Dockerfile略微进行魔改~在AI Coding已经相当成熟的今天,即便以前没有接触过容器的工程师,想要实现也是非常容易的吧~

  • ✓ 改造前架构:arm64 (aarch64)
  • ✓ 改造后架构:amd64 (x86_64)
  • ✓ 改造前镜像大小:9.12GB
  • ✓ 改造后镜像大小:15GB

二、改造路上的小阻碍

这里分享几个改造过程中遇到的【小阻碍】:

2.1 msmodeling submodule 拉取失败

现象:git submodule update --init --recursive 报 fatal: remote-curl: bad line length character: <CH,gitcode.com 访问异常。

原因:git submodule update 方式与 gitcode.com 不兼容。

解决:绕过 submodule 机制,直接 clone 指定分支:

cd /home/antares/solution-agent
rm -rf msmodeling
git clone --branch pr/serving-cast-mtp-support https://gitcode.com/yk77/msmodeling.git msmodeling

结果:成功检出 1723 个文件。

2.2 scripts/banner.sh 缺失

现象:Dockerfile 第 47 行 COPY scripts/banner.sh /usr/local/bin/banner.sh 报 not found,scripts 目录仅有 start_server.py。

原因:该文件在当前 Git 工作目录中缺失。

解决:从已有 arm64 镜像中提取。

结果:文件内容为入口横幅脚本(打印版权信息后 exec “$@”),与 Git HEAD 一致。


三、配置 TIPs:API KEY 换成自己的

培训课程导师提供的是DeepSeek的API KEY,无论是原生ARM版本还是魔改的x86版本,都需要使用自己的KEY:

docker exec solution-agent bash -c 'cat > /root/.config/opencode/opencode.jsonc << "EOF"
{
  "$schema": "https://opencode.ai/config.json",
  "skills": {
    "paths": ["skills/ascend"]
  },
  "provider": {
    "Ark": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ark",
      "options": {
        "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3",
        "apiKey": "ark-******这里不能告诉你********"
      },
      "models": {
        "ark-code-latest": { "name": "ark-code-latest" }
      }
    }
  },
  "model": "Ark/ark-code-latest"
}
EOF
'

四、端口适配与首次启动

4.1 端口对照

课堂老师提供的镜像使用的端口和项目本身使用的端口不一致,笔者为了避免麻烦,就改成了和课堂老师使用镜像一致的端口:

端口对照表

4.2 修改启动端口

docker exec solution-agent sed -i \
  's/^ANALYZE_PORT=5000/ANALYZE_PORT=8013/; s/^AGENT_PORT=5001/AGENT_PORT=8014/' \
  /app/plateform/backend/start.sh

4.3 wiki 目录报错

镜像构建完毕启动后出现报错:

  • ✓ 现象:Agent 服务(app_opencode.py)启动时报 FileNotFoundError: ‘/app/industry-solution-data/wiki’。
  • ✓ 原因:Wiki 知识库数据目录不入库(Docker 部署文档明确说明),需手动创建。
  • ✓ 解决:创建空目录后,WikiIndexManager.build_index() 遍历空目录返回空索引,服务正常启动(行业方案检索功能因无数据不可用,需挂载真实 Wiki 数据方可完整使用)。

五、启动服务与健康检查

5.1 启动命令

解决索引问题后启动服务:容器以 –net=host 模式运行,容器内端口即宿主机端口,三个服务均在后台运行:

# 后端(分析服务 :8013 + Agent 服务 :8014)
docker exec -d solution-agent bash -c 'cd /app/plateform/backend && bash start.sh > /tmp/backend.log 2>&1'

# 前端(:5002)
docker exec -d solution-agent bash -c 'cd /app/plateform && python -m http.server 5002 > /tmp/frontend.log 2>&1'

5.2 健康检查

# 分析服务
$ docker exec solution-agent curl -s http://localhost:8013/api/health
{"msmodeling_installed":true,"msmodeling_path":"/app/msmodeling","service":"plateform-backend (database + msmodeling)","status":"ok"}

# Agent 服务
$ docker exec solution-agent curl -s http://localhost:8014/health
{"backend":"claude-code","service":"昇腾行业Solution Agent (Claude Code + model-agent)","status":"healthy","version":"2.0.0"}

# 前端
$ docker exec solution-agent curl -s -o /dev/null -w "%{http_code}" http://localhost:5002/
200

5.3 一键启动脚本

下面提供一键启动脚本,傻瓜式使用才是王道~

一键脚本命令表

脚本参考(原文节选):

#!/bin/bash
# solution-agent 服务管理脚本(后台运行)
# 用法: ./start_solution_agent.sh [start|stop|status|health|restart|logs [backend|frontend]]
CONTAINER="solution-agent"
ANALYZE_PORT=8013
AGENT_PORT=8014
FRONTEND_PORT=5002

start() {
  echo "==> 确保 wiki 数据目录存在..."
  docker exec "$CONTAINER" mkdir -p /app/industry-solution-data/wiki
  echo "==> 启动后端(:${ANALYZE_PORT} 分析服务 / :${AGENT_PORT} Agent 服务)..."
  docker exec -d "$CONTAINER" bash -c 'cd /app/plateform/backend && bash start.sh > /tmp/backend.log 2>&1'
  echo "==> 启动前端(:${FRONTEND_PORT})..."
  docker exec -d "$CONTAINER" bash -c 'cd /app/plateform && python -m http.server '"$FRONTEND_PORT"' > /tmp/frontend.log 2>&1'
  echo "等待服务启动..."
  sleep 8
  status
  echo ""
  health
}

stop() {
  echo "==> 停止所有服务..."
  docker exec "$CONTAINER" bash -c '

六、改造项清单

本次改造涉及的全部改造项清单如下:

改造项清单

七、实战问题:「暂无方案,敬请期待」

最后讲一讲在改造后使用SA for x86遇到的小问题:x86 平台前端页面点击”生成方案设计”后,始终显示”暂无方案,敬请期待”,而 arm64 平台正常显示完整方案。

7.1 排查过程

第一步:确认前端调用链——通过阅读前端 index.html 代码,确认 generateSolution() 函数的调用流程。

第二步:逐个测试 API:

API 测试结果

第三步:定位根因——查看 app_opencode.py 第 679 行,generate-solution 的实现逻辑(原文此处有代码截图):方案生成依赖 Wiki 知识库索引,通过 wiki_index_manager.lookup() 查找匹配方案,索引为空时返回”暂无方案”。检查 Agent 服务日志,根因确认:Wiki 知识库索引为空(0 个方案)。

根因分析

7.2 修复步骤

  • ✓ 修复 1:从 arm64 镜像提取 Wiki 数据——Wiki 数据包含 10 个行业目录、17 个 .md 文件
  • ✓ 修复 2:重建 Wiki 索引
  • ✓ 修复 3:关闭 Flask debug 模式
  • ✓ 修复 4:清除 .pyc 缓存并重启
  • ✓ 第五步:验证结果——Agent 服务日志确认
  • ✓ 第六步:持久化更新——将修复持久化到宿主机,更新 docker run 命令新增挂载

7.3 持久化更新

新增挂载

start_all.sh 更新:启动时自动清理 __pycache__ 避免缓存问题。

7.4 修复后的最终状态

修复后服务状态

浏览器访问,方案生成恢复正常:

昇腾行业Solution Agent平台前端

本文由 奶莉小跟班 原创,首发于华为 O3 社区,哦对了,我就是奶莉小跟班~~~~

Antares

>_