按用户指示做**一包提交**,不按工作流拆分。本提交刻意混合了多条并行线:
· 本地 ASR 接管:audio 成为与 chat/embed/image/video 同等的路由类别
(IsLocalRoute 单一判据、audio 健康探测、default_audio_route、
auto 占位、GET /api/ai/routes/audio、回退云端时界面明示「音频已出网」)
· LLM 调用层:ctx 贯穿、ToolCall/ToolSchema、EmptyCompletionError /
TransientUpstreamError(按错误类型而非文案判重试)
· 编排 Agent:general_assistant orchestrate/persistence/spec_driver
· 联网搜索:internal/search(playwright)
· 网盘:backend + 前端
· 前端 UI:导航/路由/工作台若干页
· 交付文档:DELIVERY.md / AR04 / 部署文档的「无 Python」表述据实改写,
新增 eai_agentplatform-asr.service、asr.env、clonezilla-cleanup 清 ~/asr-poc
不分拆的原因:dev 早期,粒度不该打断工作节奏。且实测过——这些改动
**在编译上是同一个单元**(llm.go 的 ctx 签名变更牵动 12 个调用点,
chat_message.go 的 ctx 改动又与编排重写同处一个 hunk),拆出来的中间态编不过。
详见 TOP_CODING_RULES.md G14.5 与 bugs_and_errors.md E09。
Co-Authored-By: Claude Code <noreply@anthropic.com>
119 lines
5.3 KiB
Bash
119 lines
5.3 KiB
Bash
#!/usr/bin/env bash
|
||
# ============================================================
|
||
# eai_agentplatform — Clonezilla 整盘克隆前的清理脚本
|
||
# 目标:交付给客户的设备上「无源代码、无开发痕迹、无测试数据、无默认口令」。
|
||
#
|
||
# 用法(在交付原型机上以 root 执行):
|
||
# sudo bash clonezilla-cleanup.sh
|
||
#
|
||
# 脚本只做「可逆的清理」;删除源代码属于不可逆动作,默认 DRY-RUN,
|
||
# 确认无误后加 --confirm 才真正执行删除。
|
||
# ============================================================
|
||
set -euo pipefail
|
||
|
||
APP_DIR="/opt/eai_agentplatform"
|
||
CONFIRM="${1:-}"
|
||
|
||
log() { echo -e "\033[1;32m[OK]\033[0m $*"; }
|
||
warn() { echo -e "\033[1;33m[!!]\033[0m $*"; }
|
||
step() { echo -e "\n\033[1;36m==>\033[0m $*"; }
|
||
|
||
DRY=1
|
||
if [[ "$CONFIRM" == "--confirm" ]]; then DRY=0; warn "已确认,执行真实清理。"; else warn "DRY-RUN 模式:只列出将执行的动作,不实际修改。加 --confirm 真正执行。"; fi
|
||
|
||
step "1. 删除 Go 源代码(二进制保留,源代码不复原)"
|
||
for p in \
|
||
"$APP_DIR/cmd" "$APP_DIR/internal" \
|
||
"$APP_DIR/go.mod" "$APP_DIR/go.sum" \
|
||
"$APP_DIR/*.go"; do
|
||
if compgen -G "$p" >/dev/null 2>&1; then
|
||
echo " 将删除: $p"
|
||
[[ $DRY -eq 0 ]] && rm -rf $p
|
||
fi
|
||
done
|
||
|
||
step "2. 清除版本控制痕迹"
|
||
for p in "$APP_DIR/.git" "$APP_DIR/.gitignore" "$APP_DIR/.github" "$APP_DIR/.gitlab"; do
|
||
if [[ -e "$p" ]]; then
|
||
echo " 将删除: $p"
|
||
[[ $DRY -eq 0 ]] && rm -rf "$p"
|
||
fi
|
||
done
|
||
|
||
step "3. 清理测试/演示数据(保留生产库结构,清空内容)"
|
||
echo " - 提示:测试用户 zhangsan / 演示素材 / 演示考试记录等由管理员在 Web 界面手动清理,"
|
||
echo " 或在克隆前用 sqlite3 执行(见 DELIVERY.md 第 4 节)。脚本不自动清库,避免误删正式数据。"
|
||
echo " - 别漏了 $APP_DIR/data/backups/ :里面是原型机自己的历史快照,含同一批测试数据,"
|
||
echo " 整盘克隆会一起带到客户机器上。确认无用后手工清空该目录(见 DELIVERY.md 第 7 节)。"
|
||
|
||
step "4. 清理本地 ASR 工作区的原型机数据(录音与逐字稿)"
|
||
ASR_DIR="/opt/eai_agentplatform-asr"
|
||
|
||
# 为什么这一步必须做,而不是「顺手清个缓存」:
|
||
# 原型机的 ~/asr-poc/audio/ 里是**真实会议录音**,~/asr-poc/out/ 里是它的完整逐字稿
|
||
# 与说话人分离结果(还有一份云端转写的对照稿)。整盘克隆会把它们原样带到客户机器上。
|
||
# 与 data/backups/ 同一类问题:不是程序数据,是原型机自己的业务内容。
|
||
for ws in /home/*/asr-poc; do
|
||
[[ -d "$ws" ]] || continue
|
||
echo " 工作区: $ws"
|
||
for sub in out audio __pycache__; do
|
||
[[ -e "$ws/$sub" ]] || continue
|
||
echo " 将删除: $ws/$sub(录音 / 逐字稿 / 缓存)"
|
||
[[ $DRY -eq 0 ]] && rm -rf "$ws/$sub"
|
||
done
|
||
# requirements.lock.txt 留着:它是这套环境精确版本的唯一记录,
|
||
# 属于离线重建的工具件,不是开发痕迹(venv 里 pip freeze 也能再生成)。
|
||
for f in "$ws"/*.log; do
|
||
[[ -e "$f" ]] || continue
|
||
echo " 将删除: $f"
|
||
[[ $DRY -eq 0 ]] && rm -f "$f"
|
||
done
|
||
done
|
||
|
||
# 工作区本身能不能删,取决于它是否已经**装到**交付位置。
|
||
# 删早了服务就起不来,而且没有源码可以重建 —— 所以只提示,不自动删。
|
||
if [[ -d "$ASR_DIR" ]]; then
|
||
echo " 已安装到交付位置:$ASR_DIR"
|
||
echo " 确认下面这些都在,就可以删掉 ~/asr-poc(其中 venv 有 9G,别在两处各留一份):"
|
||
echo " $ASR_DIR/serve.py $ASR_DIR/asr_core.py $ASR_DIR/venv/ $ASR_DIR/models/ $ASR_DIR/asr.env"
|
||
echo " 删之前先确认服务能起来:systemctl restart eai_agentplatform-asr && curl -sI http://127.0.0.1:8090/v1/models"
|
||
else
|
||
warn " 未发现 $ASR_DIR —— 本地 ASR 还没装到交付位置,先别动 ~/asr-poc。"
|
||
fi
|
||
|
||
step "5. 清空日志与 shell 历史"
|
||
for f in "$APP_DIR/logs" "$APP_DIR"/*.log /var/log/eai_agentplatform*.log; do
|
||
if compgen -G "$f" >/dev/null 2>&1; then
|
||
echo " 将清空: $f"
|
||
[[ $DRY -eq 0 ]] && find "$f" -type f -name '*.log' -exec truncate -s 0 {} \; 2>/dev/null || true
|
||
fi
|
||
done
|
||
for h in /root/.bash_history /home/*/.bash_history; do
|
||
if [[ -f "$h" ]]; then
|
||
echo " 将清空: $h"
|
||
[[ $DRY -eq 0 ]] && truncate -s 0 "$h"
|
||
fi
|
||
done
|
||
|
||
step "6. 提示:以下必须手工完成(脚本无法替你决定口令)"
|
||
cat <<'EOF'
|
||
[A] 重置管理员密码:
|
||
sudo -u eai_agentplatform /opt/eai_agentplatform/eai_agentplatform-server -reset-admin '<新强密码>'
|
||
[B] 重新生成 JWT 密钥(写回 /opt/eai_agentplatform/.env):
|
||
python3 -c "import secrets; print('JWT_SECRET='+secrets.token_urlsafe(48))"
|
||
[C] 确认 .env 内无 __CHANGE_ME__ 占位符:
|
||
grep -n '__CHANGE_ME__' /opt/eai_agentplatform/.env && echo '!! 存在未替换占位符' || echo '无占位符'
|
||
EOF
|
||
|
||
step "7. 移除本清理脚本自身(交付物不含脚本)"
|
||
echo " 将删除: $0"
|
||
[[ $DRY -eq 0 ]] && rm -f "$0"
|
||
|
||
echo
|
||
if [[ $DRY -eq 0 ]]; then
|
||
log "清理完成。请复核 [A][B][C] 三项,再执行 Clonezilla 整盘克隆。"
|
||
warn "本地 ASR 工作区(~/asr-poc)是否已删、是否只剩一份 venv,请手工确认(见上面第 4 步的提示)。"
|
||
else
|
||
warn "DRY-RUN 结束,未做任何修改。确认后:sudo bash $0 --confirm"
|
||
fi
|