OpenProgram · Provider reliability
Provider metadata 加载诊断
目标是在 provider 列表退化为空或缺少 endpoint 时,区分正常缺失与本地配置损坏。该改动只增加本地 warning,不改变 fallback、返回值或 provider 选择。
边界
| 输入状态 | 返回行为 | 日志行为 |
|---|---|---|
provider.json 不存在 | 保持当前不存在/alias fallback | 不记录;部分 provider 本来就没有独立目录 |
provider.json 无法读取、JSON 损坏或顶层不是 object | 返回空 endpoint,调用方继续现有 fallback | warning:source、path、error_type;不记录文件内容 |
models_dev.json 不存在 | 返回空 cache | 不记录;首次运行和未成功获取过均正常 |
models_dev.json 无法读取、JSON 损坏或顶层不是 object | 返回空 cache,保留短失败 TTL | warning:source、path、error_type;不记录文件内容 |
| models.dev 网络请求失败 | 继续尝试磁盘 cache | 本任务不增加网络 warning,避免重复记录预期离线状态 |
实现位置
openprogram/providers/metadata.py 的共享 provider.json 读取边界负责结构验证和 warning;_endpoints() 与 shipped_provider_ids() 复用它,避免两个 catch 分支产生不同诊断。openprogram/providers/sources/models_dev.py::_read_disk_cache() 负责 cache 诊断。
warning("provider metadata load failed", extra={
"source": "provider_json" | "models_dev_cache",
"path": str(path) | "<unresolved>",
"error_type": type(error).__name__,
})
只有 cache 路径计算本身失败时使用稳定值
<unresolved>。日志不得包含 traceback、JSON 内容、provider credential、HTTP response body 或异常 message。损坏文件继续留在原路径,便于用户检查;本任务不删除、重写或隔离文件。验收
- 损坏 JSON、不可读文件和错误顶层类型各返回既有空值,并产生一次 warning。
- 不存在文件不产生 warning。
- warning 只包含稳定事件名、source、path 和 error_type,不包含 traceback、异常 message 或文件内容。
- 正常 provider endpoint、shipped provider 枚举和 models.dev cache 行为保持。