#56 缺口:`_resolve_secret_ref` 此前只读 dev 环境映射 `HEICODE_SECRET_<name>`, 没有生产从 Azure Key Vault 取 key 的实现(原注释写"适配器在仓外",实际缺)。 本次在仓内补上,走刚建好的 Pod workload identity: - `_resolve_from_keyvault`:`DefaultAzureCredential` + `SecretClient` 读 azkv:// ref; **lazy import** azure SDK,任何失败(未启用/不可解析/SDK 缺/无凭证/网络/secret 不存在) 返回 None —— 不伪造、不抛。 - `_azkv_enabled`:**仅当** Pod 注入了 workload identity(`AZURE_FEDERATED_TOKEN_FILE`) 或显式 `SECRET_RESOLVER=azkv` 才真连 KV —— dev/CI/测试保持 hermetic、不碰网络。 - `_parse_azkv_ref`:解析 `azkv://<vault>/secrets/<name>[/<ver>]`(裸名→`https://<name>.vault.azure.net`, 全 host 保留,兼容短形式)。 - `_resolve_secret_ref` 顺序:dev 环境映射 → KV(workload identity),保持既有 dev 行为不变。 - requirements:加 `azure-keyvault-secrets`(lazy import;`azure-identity` 已在)。 测试 `test-agent-launcher.py` 新增:azkv 解析、gating(默认关、两种开关)、disabled→None。 `test-agent-launcher` / `test-key-injection-contract` 全绿。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
25 lines
881 B
Plaintext
25 lines
881 B
Plaintext
fastapi==0.115.0
|
|
uvicorn[standard]==0.32.0
|
|
websockets==13.1
|
|
redis==5.2.0
|
|
openai==1.55.3
|
|
pydantic==2.9.2
|
|
python-dotenv==1.0.1
|
|
prometheus-client==0.20.0
|
|
httpx==0.28.1
|
|
# dev/CI only: in-memory Redis emulator for the gated REDIS_FAKE/ALLOW_MEMORY_STORE fallback
|
|
fakeredis==2.26.1
|
|
opentelemetry-api==1.24.0
|
|
opentelemetry-sdk==1.24.0
|
|
opentelemetry-exporter-otlp==1.24.0
|
|
opentelemetry-instrumentation-redis==0.45b0
|
|
opentelemetry-instrumentation-requests==0.45b0
|
|
opentelemetry-instrumentation-logging==0.45b0
|
|
# benchmark metrics export targets (lazy-imported; only used when BENCHMARK_EXPORT_TARGET set)
|
|
azure-cosmos==4.7.0
|
|
azure-storage-blob==12.23.1
|
|
azure-identity==1.19.0
|
|
# model-key resolution from Key Vault via Pod workload identity (lazy-imported in
|
|
# agent_launcher._resolve_from_keyvault; only when AZURE_FEDERATED_TOKEN_FILE / SECRET_RESOLVER=azkv)
|
|
azure-keyvault-secrets==4.9.0
|