模型网关仓库
oceanway-media-gateway 实施计划
OceanWay 图片与视频 Provider 直连、任务编排与不可变 Evidence 服务的实施计划
仓库:Oceanway-AI/oceanway-media-gateway。该仓已有独立实现基础,正式 Core 接入排在 Text Gateway 最小链路之后。
目标结果与当前基线
Media Gateway 是图片/视频 Provider 直连的单一服务边界。Task/Attempt Registry、Dispatcher、Adapter、Poller、Reconciler、结果处理与可选 Callback 都是同一服务内模块,不继续拆仓。
它与 Text Gateway 同级,不经过 new-api 级联,也不承担 OceanWay Developer Platform 或客户控制面的任何职责。
明确不提供
- 本地客户用户、Customer Group、Customer Session 或 DeveloperCredential;
- 客户 API Key、模型广场、Surface Offering、用户售价、订阅或钱包;
- OceanWay 产品 Run、规范 MeterEvent/ProviderCostFact、正式 Asset 或产品项目;
- 面向浏览器的 Provider Secret、Channel/Supply 和原始 Payload;
- 绕过 Core 的 Studio、Drama、Commerce 或 API Edge 接口。
仓库里程碑
- MEDIA-1 代码与数据盘点:冻结现有模块、Provider Adapter、Task 状态、数据库、对象存储、Secret 与部署来源。
- MEDIA-2 私有服务边界:删除/关闭本地用户、客户 Key、模型市场和用户价格;只接受 Workload Identity。
- MEDIA-3 统一 Gateway Contract:实现与 Text Gateway 同级的 Attempt、Dispatch Slot、Binding、Route、Availability 与错误语义。
- MEDIA-4 Provider Adapter:为每个 Provider 明确提交确定性、幂等、查询、取消、Callback 和结果获取能力。
- MEDIA-5 Evidence 与结果引用:保存不可变 Usage/Cost Evidence、Provider Task/Result Ref 和安全媒体获取边界。
- MEDIA-6 首个媒体 Canary:在 B5 接入一个图片或视频路径,再扩展多结果、首尾帧和长任务能力。
内部状态机原则
- 一个 Core Attempt 只对应一个冻结的 Gateway Invocation/Task/Route。
- Poller、Callback 和 Reconciler 竞争时使用同一版本/CAS 规则,不能各自产生不同终态。
- Unknown Submission 保留原 Task 并查询;只有可证明无 Provider Side Effect 才能 Terminal Reject。
- Provider 返回多份成功结果时全部保留;正式 Asset 由 Core Asset 模块登记。
- 上游临时错误不写确定性 Conflict Fact;确定性 Repository/摘要冲突按 Gateway Owner Contract 隔离。
验收与切换
- 每个 Adapter 都有提交响应丢失、重复 Poll、Callback 乱序、取消竞态、凭据轮换和结果重复的测试。
- 原始媒体和签名 URL 不进入事件/普通日志;跨服务只使用不透明 Ref 与短期授权读取。
- Usage 与 Cost Evidence 分离,缺失/不可得/不适用状态显式表达,不用零值代替。
- 迁移期只有一个 Provider Task Writer;旧 Worktree/部署在 Remote、镜像和在途任务可恢复前不清理。
- Media 接入不能提前于 Metering/Billing 终局,也不能复用文本 Canary 的验收声明。
详细拓扑与授权读链见调度、执行与模型网关池。