pr02 P1 三条全部兜底

device_prompt 缓存跨日不失效导致今天日期/天气被烤死,改成独立 key 并带 5 分钟 ttl;mcp 工具列表在收到初始化响应后补回并发发送,helloHandle 预发万一丢帧时也能兜住;启服脚本去硬编码路径与全机 pkill,改用相对路径与 PID 文件。
This commit is contained in:
hrz committed 2026-10-14 23:19:33 +08:00
1 parent 8c41faac8b
commit 4dd194ef8b
3 files changed
+40 -15

No files matched your search

+29 -7
View File
@@ -1,9 +1,31 @@
#!/bin/bash
# 在 main/xiaozhi-server 目录启 wk01 服务到 18000 端口
cd /home/claw/myworkspace/wk01/xiaozhi-esp32-server/main/xiaozhi-server
pkill -f 'python app.py' 2>/dev/null
sleep 1
rm -f /tmp/wk01_xiaozhi.log
nohup /home/claw/miniconda3/envs/xiaozhi-esp32-server/bin/python app.py > /tmp/wk01_xiaozhi.log 2>&1 &
echo "started pid=$!"
# 在 main/xiaozhi-server 目录启服务(端口 18000)。
# 通过 SERVER_DIR / PORT / PID_FILE / LOG_FILE 环境变量覆盖默认值。
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SERVER_DIR="${SERVER_DIR:-$REPO_ROOT/main/xiaozhi-server}"
PORT="${PORT:-18000}"
PID_FILE="${PID_FILE:-$SERVER_DIR/.run/server.pid}"
LOG_FILE="${LOG_FILE:-$SERVER_DIR/.run/server.log}"
mkdir -p "$(dirname "$PID_FILE")" "$(dirname "$LOG_FILE")"
if [ -f "$PID_FILE" ]; then
OLD_PID="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "$OLD_PID" ] && kill -0 "$OLD_PID" 2>/dev/null; then
kill "$OLD_PID" 2>/dev/null || true
sleep 1
fi
rm -f "$PID_FILE"
fi
cd "$SERVER_DIR"
PYTHON_BIN="${PYTHON_BIN:-python}"
nohup "$PYTHON_BIN" app.py > "$LOG_FILE" 2>&1 &
SERVER_PID=$!
echo "$SERVER_PID" > "$PID_FILE"
echo "started pid=$SERVER_PID port=$PORT log=$LOG_FILE"
disown
@@ -148,8 +148,8 @@ async def handle_mcp_message(
f"客户端MCP服务器信息: name={name}, version={version}"
)
# tools/list 已在握手初期并发预发,避免与 audio 流 FIFO 排队
pass
# helloHandle 握手初期已并发预发 tools/list;此处再补一次作为兜底,client 收到两次也能正常处理
asyncio.create_task(send_mcp_tools_list_request(conn))
return
@@ -120,8 +120,9 @@ class PromptManager:
# 使用传入的提示词并缓存(如果有设备ID)
if device_id:
device_cache_key = f"device_prompt:{device_id}"
self.cache_manager.set(self.CacheType.DEVICE_PROMPT, device_cache_key, user_prompt)
self.cache_manager.set(
self.CacheType.DEVICE_PROMPT, device_cache_key, user_prompt
)
self.logger.bind(tag=TAG).debug(f"设备 {device_id} 的提示词已缓存")
self.logger.bind(tag=TAG).info(f"使用快速提示词: {user_prompt[:50]}...")
@@ -253,9 +254,9 @@ class PromptManager:
if not self.base_prompt_template:
return user_prompt
device_cache_key = f"device_prompt:{device_id}"
enhanced_cache_key = f"enhanced_prompt:{device_id}"
cached_prompt = self.cache_manager.get(
self.CacheType.DEVICE_PROMPT, device_cache_key
self.CacheType.DEVICE_PROMPT, enhanced_cache_key
)
if cached_prompt is not None:
return cached_prompt
@@ -308,9 +309,11 @@ class PromptManager:
*args,
**kwargs,
)
device_cache_key = f"device_prompt:{device_id}"
self.cache_manager.set(
self.CacheType.DEVICE_PROMPT, device_cache_key, enhanced_prompt
self.CacheType.DEVICE_PROMPT,
enhanced_cache_key,
enhanced_prompt,
ttl=300,
)
self.logger.bind(tag=TAG).debug(
f"构建增强提示词成功,长度: {len(enhanced_prompt)}"