guanghulab/video-ai-system/tools/secrets-loader.py
冰朔 18cd6e7425
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
D146: 密钥编号体系 · 不用散落变量名·用编号查地图
- LOCAL-SECRETS-PATH.hdlp: 密钥编号路由表·ZY-SEC-001~010 + ZY-EPT-001~004
- secrets-loader.py: secret('ZY-SEC-004') 按编号获取密钥值
- qwen-vision.py: 改用编号调用 secret('ZY-SEC-004')
- TCS-GLOBAL-NAV: 新增「密钥/API Key」→ 编号路由入口

原理: 编号即路由·和铸渊自己的TCS-0003-ZY001是同一条逻辑
下次: 看到编号→查LOCAL-SECRETS-PATH地图→拿到变量名→读文件→拿到值
2026-06-26 14:02:20 +08:00

99 lines
3.5 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 = {
"ZY-SEC-001": "JIMENG_API_KEY",
"ZY-SEC-002": "VOLC_VOICE_API_KEY",
"ZY-SEC-003": "VOLC_VOICE_ACCESS_TOKEN",
"ZY-SEC-004": "ALIYUN_QWEN_VL_KEY",
"ZY-SEC-005": "ALIYUN_WANXIANG_KEY",
"ZY-SEC-006": "KLING_API_KEY",
"ZY-SEC-007": "ALIYUN_API_KEY",
"ZY-SEC-009": "VOLC_VOICE_APP_ID",
"ZY-SEC-010": "VOLC_VOICE_SECRET_KEY",
}
_ENDPOINT_MAP = {
"ZY-EPT-001": ("JIMENG_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3"),
"ZY-EPT-002": ("ALIYUN_QWEN_VL_ENDPOINT", "https://ws-umd6xwlovzmshuat.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation"),
"ZY-EPT-003": ("ALIYUN_BAILIAN_BASE_URL", "https://dashscope.aliyuncs.com/api/v1"),
"ZY-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 "(空)")