guanghulab/video-ai-system/tools/secrets-loader.py
冰朔 2b2819bc60
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
D146: 编号路由器 code-router · 大脑说编号=手脚直接拿路径
- scripts/code-router: 编号→路径即时翻译器·支持--list/--cat
  例: code-router TC-001 → 输出完整路径 → Read直接读
  例: code-router SC-004 → 输出secrets_loader调用指令
- 编号前缀统一: ZY-SEC→SC, ZY-EPT→EPT
- secrets-loader/qwen-vision/LOCAL-SECRETS同步更新

运作方式:
  大脑: 我要读 TC-001
  手脚: code-router TC-001 → /path/to/file ✓
  手脚: Read /path/to/file → 装脑完成
  零翻译损耗。不再问'文件在哪'。
2026-06-26 14:09:18 +08:00

103 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""视频AI系统 · 统一密钥加载器 · 编号路由版
编号→变量名→路径→密钥值,全部路由见 LOCAL-SECRETS-PATH.hdlp。
用法:
from tools.secrets_loader import secret, endpoint
key = secret("ZY-SEC-004") # 阿里千问VL视觉密钥
url = endpoint("ZY-EPT-002") # QWEN VL端点
"""
import os, json
# === 编号→变量名映射表(与 LOCAL-SECRETS-PATH.hdlp 同步)===
_SECRET_MAP = {
"SC-001": "JIMENG_API_KEY",
"SC-002": "VOLC_VOICE_API_KEY",
"SC-003": "VOLC_VOICE_ACCESS_TOKEN",
"SC-004": "ALIYUN_QWEN_VL_KEY",
"SC-005": "ALIYUN_WANXIANG_KEY",
"SC-006": "KLING_API_KEY",
"SC-007": "ALIYUN_API_KEY",
"SC-008": "WORKRALLY_API_KEY",
"SC-009": "VOLC_VOICE_APP_ID",
"SC-010": "VOLC_VOICE_SECRET_KEY",
# 旧编号兼容
"ZY-SEC-001": "JIMENG_API_KEY",
"ZY-SEC-004": "ALIYUN_QWEN_VL_KEY",
}
_ENDPOINT_MAP = {
"EPT-001": ("JIMENG_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3"),
"EPT-002": ("ALIYUN_QWEN_VL_ENDPOINT", "https://ws-umd6xwlovzmshuat.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation"),
"EPT-003": ("ALIYUN_BAILIAN_BASE_URL", "https://dashscope.aliyuncs.com/api/v1"),
"EPT-004": ("WORKRALLY_ENDPOINT", "https://workrally.qq.com/zenstudio/api/mcp"),
}
# 密钥文件路径(按优先级: 低→高,后面覆盖前面)
_SECRET_FILES = [
os.path.expanduser("~/guanghulab/video-ai-system/.env"),
"/Users/bingshuolingdianyuanhe/Documents/guanghulab-local-secrets/video-ai-system.env",
]
# === WorkRally 特殊处理 ===
_WORKRALLY_CONFIG = os.path.expanduser("~/.workrally/config.json")
# === 加载 ===
_raw = {}
def _load_all():
global _raw
if _raw:
return
for path in _SECRET_FILES:
if os.path.exists(path):
with open(path) as f:
for line in f:
line = line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
k, v = line.split("=", 1)
k, v = k.strip(), v.strip()
_raw[k] = v
# 环境变量最高优先级
for k in list(_raw.keys()):
env_val = os.environ.get(k)
if env_val:
_raw[k] = env_val
# WorkRally
if os.path.exists(_WORKRALLY_CONFIG):
try:
wr = json.load(open(_WORKRALLY_CONFIG))
_raw["WORKRALLY_API_KEY"] = wr.get("api_key", "")
_raw["WORKRALLY_ENDPOINT"] = wr.get("endpoint", "")
except:
pass
def secret(code_or_var, default=None):
"""按编号或变量名获取密钥值"""
_load_all()
var_name = _SECRET_MAP.get(code_or_var, code_or_var) # 查编号映射,或直接当变量名
if code_or_var == "ZY-SEC-008":
return _raw.get("WORKRALLY_API_KEY", default)
return _raw.get(var_name, default)
def endpoint(code_or_var, default=None):
"""按编号或变量名获取端点"""
_load_all()
var_name, fallback = _ENDPOINT_MAP.get(code_or_var, (code_or_var, ""))
val = _raw.get(var_name, "")
return val if val else (fallback if fallback else default)
if __name__ == "__main__":
_load_all()
print("=== 密钥编号 → 变量名 → 值(脱敏)===")
for code, var in _SECRET_MAP.items():
val = _raw.get(var, "")
masked = val[:6] + "..." + val[-4:] if len(val) > 10 else ("***" if val else "(空)")
print(f" {code}{var} = {masked}")
print(" ZY-SEC-008 → WORKRALLY = ", end="")
wr = _raw.get("WORKRALLY_API_KEY", "")
print(f"{wr[:6]}...{wr[-4:]}" if len(wr) > 10 else "(空)")