forked from admin/PlantAI-rag-new
- 生信进度:后端新增 stage_progress 事件帧+进度解析白名单(rnaseq_qc/sample_qc), kernel 日志流式落盘(20行/1s flush+fsync),logs 分页端点(offset/limit/eof), 事件 seq 跨重启扫描续增(2026-09-17 断流修复);前端 FlowProgressCard 确定性/ 不确定两态进度条+点击定位到生信任务 TAB,BioJobsPane DAG 行展开滚动日志区 (3s 轮询),log_tail 4000 截断,重跑 stage_started 清零进度 - 图片注入:figures 三源重构(标准DOI图库主路径/遗留体系兜底/PMC兜底), [[FIG:]] 宽松归一化识别 PMC/PMID/DOI 三种形态,引文兜底扩展至 [PMCID:]/[DOI:] 且标记未满配额继续注入,注入预算 90s/10篇(175 实测校准), PMC graphic 无 content-type 宽松正则,空结果不缓存(176 冷连接三连败修复) - QA 启动自愈:start.sh 启动前等 Qdrant readyz(30min)+Neo4j TCP(10min); backend_guard 标签校验改子集判定 - 样本配对:同 inode 去重优先真实文件,R1/R2 归一配对一对一认领 - gitignore 新增 *.bak-*/*.before-*/bioflow_service/bioflow.db 测试:bioflow_service pytest 358/358,前端 bioflow vitest 205/205
69 lines
2.5 KiB
Bash
Executable File
69 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# agent/qa/scripts/start.sh —— QA V1.1.73 服务唯一启动接口
|
||
# 用法:bash scripts/start.sh [port] (默认 8091 终态;浸泡期影子用 7921)
|
||
set -euo pipefail
|
||
AGENT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
PORT="${1:-8091}" # 终态端口
|
||
ENV_FILE="${QA_ENV_FILE:-$AGENT_ROOT/env/prod.env}"
|
||
LOG_FILE="${QA_LOG_FILE:-/tmp/plantai-agent-qa-$PORT.log}"
|
||
PID_FILE="$AGENT_ROOT/run/qa-$PORT.pid"
|
||
PYTHON="${QA_PYTHON:-$AGENT_ROOT/../venv/bin/python}"
|
||
[[ -x "$PYTHON" ]] || PYTHON="/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python"
|
||
|
||
mkdir -p "$AGENT_ROOT/run"
|
||
[[ -x "$PYTHON" ]] || { echo "QA Python 不可执行: $PYTHON" >&2; exit 1; }
|
||
[[ -f "$ENV_FILE" ]] || { echo "缺少 env 文件: $ENV_FILE" >&2; exit 1; }
|
||
|
||
if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
|
||
echo "QA 已在运行 pid=$(cat "$PID_FILE")" >&2
|
||
exit 1
|
||
fi
|
||
|
||
set -a
|
||
# shellcheck disable=SC1090
|
||
. "$ENV_FILE"
|
||
set +a
|
||
|
||
if [[ -f "$AGENT_ROOT/env/active_library.env" ]]; then
|
||
set -a; . "$AGENT_ROOT/env/active_library.env"; set +a
|
||
fi
|
||
|
||
|
||
# ---- 开机自愈:后端校验(Qdrant/Neo4j)失败即崩且零重试,启动前必须等依赖就绪(2026-09-23) ----
|
||
QD_READYZ="${QDRANT_URL:-http://127.0.0.1:27433}/readyz"
|
||
QD_DEADLINE=$(( $(date +%s) + 1800 ))
|
||
until curl -sf --max-time 3 "$QD_READYZ" >/dev/null 2>&1; do
|
||
[ "$(date +%s)" -ge "$QD_DEADLINE" ] && { echo "[qa] Qdrant 30 分钟未就绪,放弃启动" >&2; exit 1; }
|
||
sleep 5
|
||
done
|
||
N4_HP="${NEO4J_URI#bolt://}"; N4_H="${N4_HP%:*}"; N4_P="${N4_HP##*:}"
|
||
N4_DEADLINE=$(( $(date +%s) + 600 ))
|
||
until timeout 3 bash -c "echo > /dev/tcp/$N4_H/$N4_P" 2>/dev/null; do
|
||
[ "$(date +%s)" -ge "$N4_DEADLINE" ] && { echo "[qa] Neo4j 10 分钟未就绪,放弃启动" >&2; exit 1; }
|
||
sleep 5
|
||
done
|
||
# ---- 就绪等待结束 ----
|
||
|
||
# reranker 模型路径回退:env 未指定时用安装包内模型(install/models/bge-reranker-base)
|
||
if [[ -z "${QA_V1_BGE_RERANKER_MODEL:-}" && -d "$AGENT_ROOT/../models/bge-reranker-base" ]]; then
|
||
export QA_V1_BGE_RERANKER_MODEL="$AGENT_ROOT/../models/bge-reranker-base"
|
||
fi
|
||
|
||
cd "$AGENT_ROOT"
|
||
setsid "$PYTHON" -m uvicorn scripts.qa_v1_1_73_server:app \
|
||
--host 127.0.0.1 --port "$PORT" \
|
||
> "$LOG_FILE" 2>&1 < /dev/null &
|
||
echo $! > "$PID_FILE"
|
||
disown
|
||
|
||
for _ in $(seq 1 30); do
|
||
if curl -sf --max-time 3 "http://127.0.0.1:$PORT/health" >/dev/null 2>&1; then
|
||
echo "QA UP (127.0.0.1:$PORT, pid=$(cat "$PID_FILE"))"
|
||
exit 0
|
||
fi
|
||
sleep 2
|
||
done
|
||
echo "QA FAIL —— 日志尾部:" >&2
|
||
tail -30 "$LOG_FILE" >&2
|
||
exit 1
|