OpenProgram · Provider reliability

Provider metadata 加载诊断

目标是在 provider 列表退化为空或缺少 endpoint 时,区分正常缺失与本地配置损坏。该改动只增加本地 warning,不改变 fallback、返回值或 provider 选择。

边界

输入状态返回行为日志行为
provider.json 不存在保持当前不存在/alias fallback不记录;部分 provider 本来就没有独立目录
provider.json 无法读取、JSON 损坏或顶层不是 object返回空 endpoint,调用方继续现有 fallbackwarning:source、path、error_type;不记录文件内容
models_dev.json 不存在返回空 cache不记录;首次运行和未成功获取过均正常
models_dev.json 无法读取、JSON 损坏或顶层不是 object返回空 cache,保留短失败 TTLwarning: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。损坏文件继续留在原路径,便于用户检查;本任务不删除、重写或隔离文件。

验收