# module: llm 职责: LLM 实例:自定义模型名 → 四元绑定(Provider 枚举 / URL / API-Key / Model); `ModelGateway` —— **两条缝之一**,支持 live / record / replay;系统用途模型的选取; 安装静态审的「模型名已绑定」核对 不负责: LLM 工具(是 `toolbox` 的一类工具,与基座的 LLM 调用不同物,OS 07)、 凭证主密钥的持有(见 app 的 `SecretBox` 实现,ADR-009)、预算扣减(见 task 的 Harness) 公开出口: index.ts - 类型:`ModelGateway` `ModelCall` `ModelResult` `ModelUsage` `GatewayMode` `LlmService` `UpsertLlmInstance` `ModelBinding` `LlmInstanceView` - 错误:`ModelNotBoundError` `ModelDisabledError` `ReplayMissError` - 端口类型:`LlmInstanceRepository` `ReplayStore` `ProviderInvoker` `SecretBox` `Clock` `IdGenerator` - 用例工厂:`createLlmService` `createModelGateway` - 纯函数:`validateBinding` `isBound` `toPublicView` `pickSystemUse` `replayKey` `callFingerprint` `stableStringify` - adapter:`createLlmInstanceRepository` `createReplayStore` `createProviderInvoker` `parseJsonLoose` - Drizzle 表:`llmInstanceTable` `replayModelTable` 层级: L1(编码规范 §4) 依赖: @contracts;@shared/db;port:`SecretBox`(app 注入)、`ProviderInvoker`、`ReplayStore` 被依赖: toolbox, memory, loop-engine, flow-engine, skill-engine, task, activity-registry, report(叙述性小结)、app(治理台 · 系统管理路由) 不变量: - **一切模型调用经 `ModelGateway`** —— 绕过它,回放审就对它失明(§12.5#10) - `replay` 模式**绝不回退实调**:缺录即 `ReplayMissError` - 明文 API-Key **永不进 domain**:domain 只见密文串,开封在 usecase 调 `SecretBox.open` - 对外读模型 `LlmInstanceView` **结构上没有密钥字段** —— 只回 `apiKeyBound: boolean`(ADR-009) - 录制不含凭证:录的是语义层(model / system / prompt / 参数 / 出参),不是 HTTP 层 - `upsert` 的 `apiKey` 留空 = 保持原密文(只写不读) - 四元缺一即未绑定;未绑定 / 已停用的实例调用一律抛错,不静默降级 影响半径: index/contract/port 未变 → 对外零影响