# 渠道、模型与调度后台页面草图 这份文档是目标页面规格,不代表页面已经实现。当前只用于确认信息架构和控件职责,画布代码不在范围内。 ## 页面总数 最终建议 8 个后台页面。模型发现不是独立页面,而是渠道管理页面中的主动操作。 ```text 后台 | |-- 01 渠道管理 连接、凭证、主动发现、供应商模型映射 |-- 02 模型管理 公开模型目录、分辨率、能力、上架状态 |-- 03 分组管理 模型与渠道绑定、渠道优先级、路由策略 |-- 04 渠道健康 探活、成功率、延迟、容量、熔断 |-- 05 任务中心 任务状态、每次尝试、取消、重试、结果 |-- 06 人工对账 处理供应商结果未知的任务 |-- 07 价格与套餐 价格规则、金币套餐、数量和并发权益 `-- 08 审计日志 配置变更、调度决策、任务和结算记录 ``` 其中 01-06、08 是运行闭环;07 是计费闭环。价格、数量上限、并发上限不再放在“新增模型产品”里。 ## 总体关系 ```text 渠道管理 | 点击“拉取模型” v 模型发现候选 --勾选并加入--> 模型管理 | | 管理公开参数并主动上架 v 分组管理 | | 选择渠道并排序 v 路由策略 | 用户选择公开模型 ------------+ v 智能调度 | 过滤 -> 排序 -> 选路 | 任务队列 -> 任务执行 | | 可确认失败 结果未知 | | 故障切换 人工对账 ``` 核心数据边界: - 公开模型 ID 是平台对用户展示和匹配的 ID。 - 供应商请求模型 ID 只在渠道请求时使用,不能和公开模型 ID 合并。 - 分组 ID 由系统生成,管理员不手填“渠道组 ID”。 - 模型发现只产生候选,不自动建模型、不自动上架、不自动进分组。 ## 01 渠道管理 职责保持现有页面范围不变:管理连接、凭证、渠道内模型和供应商请求映射。 ### 列表 ```text +--------------------------------------------------------------------------------+ | 渠道管理 [搜索渠道] [状态 v] [+ 新增渠道] | +--------------------------------------------------------------------------------+ | 渠道名称 | 类型 | 地址 | 启用 | 模型数 | 健康 | 最近拉取 | 操作 | |----------|------|------|------|--------|------|----------|-------------------| | 渠道 A | 兼容 | ... | 开 | 12 | 正常 | 10:20 | [详情] [探活] [...] | +--------------------------------------------------------------------------------+ | 说明:模型发现必须由管理员点击“拉取模型”,保存渠道时不得隐式请求上游。 | +--------------------------------------------------------------------------------+ ``` ### 新增/编辑渠道抽屉 ```text +----------------------------------+ | 新增渠道 X | +----------------------------------+ | 渠道名称 [________________] | 输入框,管理员自定义名称 | 接口类型 [OpenAI 兼容 v] | 下拉框 | 请求地址 [https://... ] | 完整 URL,例如 https://example.com/v1 | API Key [****************] | 密码框;编辑留空表示沿用原凭证 | 启用状态 [开关 ] | 是否允许调度使用 | 请求超时 [______] 秒 | 数字框,正整数 | | | [保存] [取消] | +----------------------------------+ ``` ### 渠道详情中的模型发现 ```text +--------------------------------------------------------------------------------+ | 渠道 A / 模型 [拉取模型列表] | +--------------------------------------------------------------------------------+ | 上次请求:10:20 请求路径:/v1/models 状态:已发起 / 成功 | | | | [ ] 供应商模型 ID 状态 已加入渠道模型数 操作 | | [ ] vendor-model-a 新候选 - [加入渠道] | | [x] vendor-model-b 已加入 1 [查看映射] | +--------------------------------------------------------------------------------+ | 只有点击“拉取模型列表”才请求上游。勾选结果只加入该渠道,不自动创建公开模型。 | +--------------------------------------------------------------------------------+ ``` ### 渠道模型映射 ```text +----------------------------------------------------------------+ | 渠道内模型 / 请求映射 | +----------------------------------------------------------------+ | 平台公开模型 ID [选择公开模型 v] | | 供应商请求模型 ID [________________] | | 说明:公开 ID 与请求 ID 相同也要明确保存;不同则只转换请求值。 | | [保存] [取消] | +----------------------------------------------------------------+ ``` 控件规则:地址和 API Key 是输入框;类型和状态是下拉/开关;模型发现是独立按钮;候选模型是复选框;映射中的公开模型使用下拉框,供应商请求 ID 使用输入框。 ## 02 模型管理 模型页面不再叫“新增模型产品”。它管理平台公开模型目录,不管理渠道连接、不管理价格套餐、不管理渠道组。 ### 列表 ```text +--------------------------------------------------------------------------------+ | 模型管理 [搜索公开 ID/名称] [状态 v] [能力 v] [从候选导入] | +--------------------------------------------------------------------------------+ | 公开模型 ID | 展示名称 | 能力 | 分辨率 | 支持渠道 | 状态 | 最近发现 | 操作 | |-------------|----------|------|--------|----------|------|----------|-----------| | image-pro | 图像专业 | 图像 | 1K/2K | 3 | 上架 | 10:20 | [编辑] [...]| +--------------------------------------------------------------------------------+ | 注意:列表展示“支持渠道数”,不在此处填写渠道组 ID、基础价格或并发上限。 | +--------------------------------------------------------------------------------+ ``` ### 导入候选 ```text +----------------------------------------------------------------+ | 从发现候选导入 X | +----------------------------------------------------------------+ | 来源渠道 [全部渠道 v] | | [ ] vendor-model-a 供应商 A 最近发现:今天 10:20 | | [ ] vendor-model-b 供应商 B 最近发现:今天 10:18 | | | | [导入为草稿] [取消] | +----------------------------------------------------------------+ ``` 导入后是草稿;管理员必须在编辑抽屉中确认参数,再点击“上架”。 ### 模型编辑抽屉 ```text +--------------------------------------------+ | 编辑公开模型 X | +--------------------------------------------+ | 公开模型 ID [image-pro ] | 只读,来自发现候选 | 展示名称 [图像专业 ] | 输入框 | 能力 [图像 v] [编辑 v] | 多选框/标签选择 | | | 分辨率配置 [+ 添加] | | # 名称 支持比例 操作 | | 1 [1024x1024 ] [1:1 v] [删除] | | 2 [1536x1024 ] [1:1 v] [删除] | | 3 [2048x1152 ] [16:9 v] [删除] | | | | 上架状态 [草稿 v] | 草稿 / 上架 / 下架 | | | [保存草稿] [上架] [取消] | +--------------------------------------------+ ``` 分辨率的“支持比例”必须是主题化多选控件,选项例如 `1:1`、`16:9`、`9:16`、`4:3`、`3:4`;不要使用逗号分隔字符串输入。每一行使用稳定 key,新增、删除和编辑时不能丢失焦点。 此页面明确不出现:基础价格、数量上限、并发上限、渠道组 ID、创建后自动上架、供应商请求模型 ID。 ## 03 分组管理 分组是路由池。它决定“一个公开模型可以由哪些渠道承载,以及渠道按什么顺序尝试”。 ### 分组列表 ```text +--------------------------------------------------------------------------------+ | 分组管理 [搜索分组] [+ 新建分组] | +--------------------------------------------------------------------------------+ | 分组名称 | 状态 | 公开模型数 | 路由渠道数 | 策略 | 更新时间 | 操作 | |----------|------|------------|------------|------|----------|------------------| | 默认图像 | 启用 | 4 | 6 | 优先级| 10:25 | [编辑] [停用] [...]| +--------------------------------------------------------------------------------+ ``` ### 新建/编辑分组 ```text +----------------------------------------------------------------+ | 编辑分组 X | +----------------------------------------------------------------+ | 分组名称 [默认图像 ] | | 分组 ID [group_xxx ] 只读,系统生成 | | 状态 [启用 v] | | 调度策略 [优先级优先 + 健康兜底 v] | | | | 支持的公开模型 [+ 添加模型] | | [image-pro v] | | | | 渠道候选顺序 | | 排序 渠道 请求模型 ID 健康 负载 启用 | | [=]1 渠道 A vendor-model-a 正常 32% [开] | | [=]2 渠道 B vendor-model-b 正常 18% [开] | | [=]3 渠道 C vendor-model-c 熔断 -- [关] | | | | [保存] [取消] | +----------------------------------------------------------------+ ``` “支持的公开模型”使用多选下拉;每个模型下面显示可用渠道。渠道使用复选框加入候选池,再用拖拽排序或优先级数字框排序;请求模型 ID、健康、负载是只读信息。一个渠道可以出现在多个分组中,并且在不同分组中有不同顺序。 推荐策略含义: - 第一级:过滤模型上架、分组启用、能力/分辨率、渠道启用、映射存在、容量、熔断。 - 第二级:按这里的渠道顺序选首选渠道。 - 第三级:同级或首选不可用时参考健康状态、并发负载、失败率、延迟。 ## 04 渠道健康 ```text +--------------------------------------------------------------------------------+ | 渠道健康 [渠道 v] [健康状态 v] [刷新] | +--------------------------------------------------------------------------------+ | 渠道 | 状态 | 成功率 | P95 延迟 | 当前并发 | 容量 | 熔断 | 最近探活 | 操作 | |------|------|--------|----------|----------|------|------|----------|----------| | A | 正常 | 99.2% | 840ms | 2/10 | 80% | 关闭 | 10:26 | [探活] | | B | 降级 | 91.4% | 2.1s | 8/8 | 100% | 半开 | 10:25 | [详情] | +--------------------------------------------------------------------------------+ ``` 探活按钮必须显示实际请求是否发起、请求路径,以及中文化的失败原因:地址解析、网络连接、HTTP 权限/状态、返回内容。健康配置可以放在详情抽屉:失败阈值、冷却时间、半开探测数量;保存不触发模型拉取。 ## 05 任务中心 ```text +--------------------------------------------------------------------------------+ | 任务中心 [任务 ID/模型] [分组 v] [状态 v] [时间范围] [查询] | +--------------------------------------------------------------------------------+ | 任务 ID | 公开模型 | 分组 | 状态 | 当前渠道 | 尝试次数 | 创建时间 | 操作 | |---------|----------|------|------|----------|----------|----------|------------| | task_001| image-pro| 默认 | 执行中| 渠道 A | 1/3 | 10:27 | [详情] | | task_002| image-pro| 默认 | 未知 | 渠道 B | 1/3 | 10:20 | [去对账] | +--------------------------------------------------------------------------------+ ``` 详情页显示:用户提交的公开模型和参数、当时的分组、候选渠道顺序、策略版本快照、每次请求的开始/结束时间、供应商请求模型 ID、HTTP 结果、结算状态。 按钮规则:排队中可取消;确认失败的任务可按失败预算重试;结果未知的任务只能进入人工对账,不能直接盲重试或重复扣费。 ## 06 人工对账 ```text +--------------------------------------------------------------------------------+ | 人工对账 [任务 ID] [供应商 v] [未知原因 v] [查询] | +--------------------------------------------------------------------------------+ | 任务 ID | 模型 | 渠道 | 发起时间 | 未知原因 | 金币状态 | 等待时长 | 操作 | |---------|------|------|----------|----------|----------|----------|--------------| | task_002| ... | B | 10:20 | 超时 | 已冻结 | 8m | [查看] | +--------------------------------------------------------------------------------+ ``` ```text +--------------------------------------------+ | 对账 task_002 X | +--------------------------------------------+ | 本地状态 结果未知 | | 供应商请求 已发起,未收到最终响应 | | 请求路径/ID /v1/... / req_xxx | | 供应商证据 [查看原始响应/回调记录] | | 当前结算 待确认 | | 管理员备注 [________________________] | | | | [确认成功] [确认失败] [取消] | +--------------------------------------------+ ``` 确认成功后只结算一次;确认失败后释放或退回对应费用,并根据策略决定是否允许下一候选渠道继续执行。所有确认动作写入审计日志。 ## 07 价格与套餐 这个页面是计费配置,不参与模型发现和渠道选择。 ```text +--------------------------------------------------------------------------------+ | 价格与套餐 [价格规则] [套餐] [+ 新增] | +--------------------------------------------------------------------------------+ | 价格规则:公开模型 | 分辨率 | 计费单位 | 单价 | 生效状态 | 更新时间 | 操作 | | image-pro | 1K | 次 | 10 | 生效 | 10:00 | [编辑] | +--------------------------------------------------------------------------------+ | 套餐:名称 | 金币数 | 单任务数量上限 | 并发上限 | 状态 | 操作 | | 基础套餐 | 1000 | 20 | 2 | 生效 | [编辑] | +--------------------------------------------------------------------------------+ ``` 价格规则表单:公开模型下拉、分辨率下拉、计费单位下拉、单价数字框、生效状态开关。 套餐表单:套餐名称输入框、金币数量数字框、单任务数量上限数字框、并发上限数字框、状态开关。这里不出现渠道地址、API Key、渠道组 ID、供应商请求模型 ID。 ## 08 审计日志 ```text +--------------------------------------------------------------------------------+ | 审计日志 [对象类型 v] [操作者] [时间范围] [查询] | +--------------------------------------------------------------------------------+ | 时间 | 操作者 | 对象 | 动作 | 结果 | 摘要 | 详情 | |------|--------|------|------|------|------|---------------------------------------| | 10:27| admin | 分组 | 修改 | 成功 | 渠道 B 优先级 2 -> 1 | [查看] | | 10:20| system | 任务 | 调度 | 成功 | task_001 选择渠道 A | [查看] | +--------------------------------------------------------------------------------+ ``` 详情必须字段化展示:对象、前值、后值、策略版本、候选渠道、最终渠道、任务尝试、结算动作。禁止直接把原始 JSON 当页面主体;原始内容只能作为可展开的辅助信息。 ## 明确删除的旧逻辑 ```text 删除:新增模型产品 删除:模型表单中的渠道组 ID 删除:模型表单中的基础价格 删除:模型表单中的数量上限 删除:模型表单中的并发上限 删除:保存模型时隐式拉取供应商 删除:发现模型后自动创建映射、自动上架、自动加入分组 保留:分辨率名称和支持比例配置 ``` ## 一期实现顺序 ```text 01 渠道管理中的主动发现与映射 -> 02 模型目录与分辨率配置 -> 03 分组路由池与渠道优先级 -> 04 健康、容量、熔断数据 -> 05 任务中心与路由快照 -> 06 未知结果人工对账 -> 08 审计日志 -> 07 价格与套餐(有计费需求时启用) ```