#!/usr/bin/env bash set -euo pipefail PROJECT_ROOT="/225040511/project/Biomni-ReAct" PYTHON_BIN="${BIOMNI_REACT_PYTHON:-/225040511/miniconda3/envs/biomni_e1/bin/python}" RUNNER="${PROJECT_ROOT}/scripts/run_labbench_dbqa.py" OUTPUT_ROOT="${PROJECT_ROOT}/LAB-bench" LOCK_FILE="" DEV_SIZE="${LAB_BENCH_DEV_SIZE:-45}" TEST_SIZE="${LAB_BENCH_TEST_SIZE:-315}" SEED="${LAB_BENCH_SUBSET_SEED:-20260514}" SHARD_COUNT="${LAB_BENCH_TEST_SHARD_COUNT:-10}" SPLIT="${LAB_BENCH_SPLIT:-test}" BACKGROUND=1 RESUME=1 while [[ $# -gt 0 ]]; do case "$1" in --foreground) BACKGROUND=0 shift ;; --background) BACKGROUND=1 shift ;; --fresh) RESUME=0 shift ;; --resume) RESUME=1 shift ;; --output-root) OUTPUT_ROOT="$2" shift 2 ;; *) echo "Unknown argument: $1" >&2 exit 2 ;; esac done if [[ "${BACKGROUND}" -eq 1 ]]; then mkdir -p "${OUTPUT_ROOT}/logs" LOG="${OUTPUT_ROOT}/logs/dbqa_biomni_react_$(date -u +%Y%m%d_%H%M%S).log" SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" ARGS=(--foreground --output-root "${OUTPUT_ROOT}") if [[ "${RESUME}" -eq 1 ]]; then ARGS+=(--resume) else ARGS+=(--fresh) fi nohup "${SCRIPT}" "${ARGS[@]}" > "${LOG}" 2>&1 < /dev/null & echo "Started Biomni-ReAct LAB-Bench DbQA in background." echo "PID: $!" echo "Log: ${LOG}" echo "Results: ${OUTPUT_ROOT}/dbqa_results.jsonl" exit 0 fi for ENV_FILE in "${PROJECT_ROOT}/.env" "/225040511/project/LAB-Bench/.env" "/225040511/project/.env"; do if [[ -f "${ENV_FILE}" ]]; then set -a # shellcheck disable=SC1090 source "${ENV_FILE}" set +a fi done LOCK_FILE="${OUTPUT_ROOT}/dbqa_launcher.lock" mkdir -p "${OUTPUT_ROOT}" exec 9>"${LOCK_FILE}" if ! flock -n 9; then echo "Another DbQA launcher is already running for ${OUTPUT_ROOT}. Lock: ${LOCK_FILE}" >&2 exit 3 fi if [[ -z "${BIOMNI_REACT_API_KEY:-}" && -z "${DEEPSEEK_API_KEY:-}" && -z "${BIOMNI_CUSTOM_API_KEY:-}" && -z "${OPENAI_API_KEY:-}" ]]; then echo "No LLM API key found. Set DEEPSEEK_API_KEY, BIOMNI_REACT_API_KEY, BIOMNI_CUSTOM_API_KEY, or OPENAI_API_KEY." >&2 exit 2 fi export BIOMNI_REACT_MODEL="${BIOMNI_REACT_MODEL:-${DEEPSEEK_MODEL_NAME:-deepseek-chat}}" export BIOMNI_REACT_BASE_URL="${BIOMNI_REACT_BASE_URL:-${DEEPSEEK_BASE_URL:-https://api.deepseek.com/v1}}" mkdir -p "${OUTPUT_ROOT}/logs" "${OUTPUT_ROOT}/shard_logs" RESULT_FILE="${OUTPUT_ROOT}/dbqa_results.jsonl" REASONING_LOG="${OUTPUT_ROOT}/dbqa_reasoning.log" if [[ "${RESUME}" -eq 0 ]]; then : > "${RESULT_FILE}" : > "${REASONING_LOG}" fi touch "${RESULT_FILE}" "${REASONING_LOG}" declare -a PIDS=() for (( shard_index=0; shard_index "${SHARD_LOG}" 2>&1 & PIDS+=("$!") echo "[launcher] started shard $((shard_index + 1))/${SHARD_COUNT} pid=${PIDS[-1]} log=${SHARD_LOG}" done FAILED=0 for pid in "${PIDS[@]}"; do if ! wait "${pid}"; then FAILED=1 fi done COUNT=$(wc -l < "${RESULT_FILE}" || true) echo "[launcher] dbqa result lines=${COUNT}; file=${RESULT_FILE}" if [[ "${FAILED}" -ne 0 ]]; then echo "[launcher] one or more shards failed" >&2 exit 1 fi