#!/usr/bin/env bash set -euo pipefail if [[ $# -lt 1 ]]; then echo "用法: bash scripts/verify-via-backends.sh \"你的消息\"" exit 1 fi PROMPT="$1" BACKEND_URL="${BACKEND_URL:-http://127.0.0.1:7080}" MYSQL_CONTAINER="${MYSQL_CONTAINER:-ai-chat-mysql}" PG_CONTAINER="${PG_CONTAINER:-ai-chat-pgvector}" REDIS_HOST="${REDIS_HOST:-127.0.0.1}" REDIS_PORT="${REDIS_PORT:-8888}" REDIS_PASSWORD="${REDIS_PASSWORD:-123456}" REQUEST_TIMEOUT="${REQUEST_TIMEOUT:-120}" tmp_response="$(mktemp)" tmp_stderr="$(mktemp)" json_payload="$(python3 - "${PROMPT}" <<'PY' import json, sys print(json.dumps({"prompt": sys.argv[1], "options": {}}, ensure_ascii=False)) PY )" echo "[1/4] 通过 backend 发送消息" if ! curl -sS -N \ -H 'Content-Type: application/json' \ --max-time "${REQUEST_TIMEOUT}" \ -X POST "${BACKEND_URL}/api/chat-process" \ -d "${json_payload}" \ > "${tmp_response}" 2> "${tmp_stderr}"; then echo "backend 请求失败" cat "${tmp_stderr}" echo echo "请求地址: ${BACKEND_URL}/api/chat-process" echo "请求体: ${json_payload}" exit 1 fi first_line="$(head -n1 "${tmp_response}")" if [[ -z "${first_line}" ]]; then echo "未收到任何流式响应" echo "响应文件: ${tmp_response}" echo "响应内容:" cat "${tmp_response}" exit 1 fi echo "响应首行:" echo "${first_line}" parsed_meta="$(python3 - "${tmp_response}" <<'PY' import json, sys path = sys.argv[1] first = None last = None with open(path, 'r', encoding='utf-8', errors='ignore') as f: for line in f: line = line.strip() if not line: continue try: obj = json.loads(line) except Exception: continue if first is None: first = obj last = obj if first is None: print("") sys.exit(0) status = first.get("status", "") error_message = first.get("message", "") assistant_id = first.get("id", "") parent_message_id = first.get("parentMessageId", "") reply_text = "" if last is not None: reply_text = last.get("text", "") print(status) print(error_message) print(assistant_id) print(parent_message_id) print(reply_text) PY )" response_status="$(printf '%s\n' "${parsed_meta}" | sed -n '1p')" response_error_message="$(printf '%s\n' "${parsed_meta}" | sed -n '2p')" assistant_id="$(printf '%s\n' "${parsed_meta}" | sed -n '3p')" parent_message_id="$(printf '%s\n' "${parsed_meta}" | sed -n '4p')" reply_text="$(printf '%s\n' "${parsed_meta}" | sed -n '5,$p')" if [[ "${response_status}" == "Fail" ]]; then echo "backend 返回错误:" echo "${response_error_message}" echo echo "响应文件: ${tmp_response}" exit 1 fi if [[ -z "${parent_message_id}" || -z "${assistant_id}" ]]; then echo "未能解析 assistant_id 或 parentMessageId" echo "响应文件: ${tmp_response}" exit 1 fi echo "assistant_id=${assistant_id}" echo "request_parent_message_id=${parent_message_id}" echo echo "回复内容:" echo "${reply_text}" echo echo "[2/4] 查询 MySQL chat_records" docker exec "${MYSQL_CONTAINER}" mysql -t -uroot -proot -D ai_chat -e \ "select id,user_msg,user_msg_tokens,user_msg_keywords,create_at from chat_records order by id desc limit 5;" echo echo "[3/4] 查询 PostgreSQL chat_record_vectors" docker exec "${PG_CONTAINER}" psql -U postgres -d ai_chat -c \ "select record_id, keywords_text, created_at from chat_record_vectors order by created_at desc limit 5;" echo echo "[4/4] 查询 Redis 上下文" redis_response="$(printf 'AUTH %s\r\nSCANPREFIX ai_chat_service_\r\n' \ "${REDIS_PASSWORD}" | nc -w 1 "${REDIS_HOST}" "${REDIS_PORT}")" echo "${redis_response}" echo echo "用户消息 Redis Key: ai_chat_service_${parent_message_id}" echo "AI回复 Redis Key: ai_chat_service_${assistant_id}" echo echo "原始响应保存在: ${tmp_response}"