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
+26 -11
View File
@@ -34,12 +34,21 @@ def set_input_file(path: str) -> None:
global INPUT_JSON
INPUT_JSON = path
# Secrets file (shared with workspace-document-analyzer)
# .openclaw/workspace/skills/ir_generation_new_skill -> .openclaw/workspace-document-analyzer
OPENCLAW_HOME = os.path.dirname(os.path.dirname(WORKSPACE_DIR))
SECRETS_YAML = os.path.join(
OPENCLAW_HOME, "workspace-document-analyzer", "config", "secrets.yaml",
)
# Secrets file — searched in order of priority:
# 1. IR_SECRETS_PATH env var
# 2. ~/.openclaw/config/secrets.yaml
# 3. ~/.openclaw/workspace-document-analyzer/config/secrets.yaml
_SECRETS_CANDIDATES = [
os.path.join(os.path.expanduser("~"), ".openclaw", "config", "secrets.yaml"),
os.path.join(os.path.expanduser("~"), ".openclaw", "workspace-document-analyzer",
"config", "secrets.yaml"),
]
_SECRETS_PATH = os.environ.get("IR_SECRETS_PATH", "")
if _SECRETS_PATH:
_SECRETS_CANDIDATES.insert(0, _SECRETS_PATH)
SECRETS_YAML = _SECRETS_CANDIDATES[0] # primary path (backward compat)
# Intermediate outputs (all under PROJECT_OUTPUT/ir/)
SEMANTIC_INDEX_R1_JSON = os.path.join(IR_OUTPUT, "semantic_index_r1.json")
@@ -84,11 +93,15 @@ ENSEMBLE_TEMPERATURES = [
def _load_secrets() -> dict[str, dict[str, str]]:
"""Load provider credentials from secrets.yaml.
Tries paths in order: IR_SECRETS_PATH env var → ~/.openclaw/config/ →
~/.openclaw/workspace-document-analyzer/config/.
Returns a dict like: {"deepseek": {"apiKey": "...", "baseUrl": "..."}, ...}
"""
if os.path.isfile(SECRETS_YAML):
with open(SECRETS_YAML, "r", encoding="utf-8") as f:
return yaml.safe_load(f) or {}
for p in _SECRETS_CANDIDATES:
if os.path.isfile(p):
with open(p, "r", encoding="utf-8") as f:
return yaml.safe_load(f) or {}
return {}
@@ -108,9 +121,11 @@ def _get_provider_config(provider: str) -> dict[str, str]:
)
if not api_key:
tried_paths = "\n ".join(_SECRETS_CANDIDATES)
raise RuntimeError(
f"No API key found for provider '{provider}'. "
f"Check {SECRETS_YAML} or set {env_prefix}_API_KEY."
f"No API key found for provider '{provider}'.\n"
f"Tried secrets.yaml paths:\n {tried_paths}\n"
f"Or set {env_prefix}_API_KEY environment variable."
)
return {"apiKey": api_key, "baseUrl": base_url}