fix: 修复 secrets.yaml 路径错误导致 LLM 无法认证 - Closes #15
CI / test (pull_request) Successful in 7s

根因: SECRETS_YAML 指向不存在的路径 (projects/workspace-document-analyzer/...)
修复: 改为多路径搜索 ~/.openclaw/config/secrets.yaml 等。
配套: call_llm 增加响应内容诊断日志。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-31 19:16:27 +08:00
parent 92d3e76d44
commit 087ad77f39
2 changed files with 55 additions and 17 deletions
@@ -548,11 +548,20 @@ def call_llm(prompt: str, max_retries: int = 2,
Args:
temperature: Override config.TEMPERATURE. If None, uses config default.
"""
client = config.llm_client()
import sys as _sys
try:
client = config.llm_client()
except Exception as e:
print(f" LLM 客户端初始化失败: {e}", file=_sys.stderr)
print(f" 请检查: IR_PROVIDER={config.LLM_PROVIDER}, secrets.yaml 或环境变量", file=_sys.stderr)
raise
temp = temperature if temperature is not None else config.TEMPERATURE
for attempt in range(max_retries + 1):
print(f" LLM 调用 T={temp} (尝试 {attempt + 1}/{max_retries + 1})...", flush=True)
print(f" LLM 调用 model={config.MODEL_NAME} T={temp} "
f"(尝试 {attempt + 1}/{max_retries + 1})...", flush=True)
try:
resp = client.chat.completions.create(
model=config.MODEL_NAME,
@@ -568,17 +577,31 @@ def call_llm(prompt: str, max_retries: int = 2,
)
content = resp.choices[0].message.content
if content is None:
raise RuntimeError("LLM returned empty response")
raise RuntimeError(
"LLM 返回空响应 (content=None)。可能是 API 配额不足或模型不可用。"
)
# Log response length and first characters for diagnostics
print(f" 响应长度: {len(content)} 字符", flush=True)
json_str = extract_json_from_response(content)
return json.loads(json_str)
result = json.loads(json_str)
n_units = len(result.get("function_units", []))
n_concepts = len(result.get("concepts", []))
print(f" 提取: {n_concepts} 概念, {n_units} 功能单元", flush=True)
return result
except (json.JSONDecodeError, ValueError) as e:
print(f" JSON 解析失败: {e}")
print(f" JSON 解析失败: {e}", file=_sys.stderr)
# Show a snippet of what the LLM returned for diagnosis
print(f" LLM 返回内容前 500 字符: {content[:500] if content else '(None)'}", file=_sys.stderr)
if attempt < max_retries:
time.sleep(2)
raise RuntimeError("无法从 LLM 响应中解析 JSON")
raise RuntimeError(
f"无法从 LLM 响应中解析 JSON{max_retries + 1} 次尝试均失败)。"
f"最后返回内容前 500 字符: {content[:500] if content else '(None)'}"
)
# ---- Ensemble Orchestration ----