ai-profile 0.1.3

AI 模型服务配置层:provider 预置、ai.profile 互通协议、端点拼接与连通性验证
Documentation
//! 视频(video)能力的 provider 预置。
//!
//! 数据来源:StoryLoom 2026-09-24 已发布的预置(生产在用)。视频必然是 submit + poll,
//! 且**每家的轮询协议都不同**,实现见 [`crate::media::video`];协议按地址识别
//! ([`crate::media::video::VideoProtocol::detect`]),所以这里的 `base_url` 决定走哪套协议。
//!
//! 🔴 视频不提供试运行:单次约 90 秒、约 ¥1–5,让用户在真实业务里验证。

use super::{ExtraField, ModelOption, ProviderPreset, GROUP_CHINA, GROUP_LOCAL};
use crate::kind::{Kind, Protocol};

const NO_EXTRA: &[ExtraField] = &[];

pub(super) const VIDEO_PRESETS: &[ProviderPreset] = &[
    ProviderPreset {
        key: "seedance",
        vendor_id: "volcengine",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.seedance.label",
        label: "即梦 Seedance(火山方舟)",
        hint_key: Some("providerTemplate.seedance.hint"),
        // 视频是 Seedance(doubao-seedance-*),生图才是 Seedream —— 最常见的填错
        hint: Some("图生视频,支持首尾帧;模型是 Seedance 不是 Seedream,ID 须与控制台「开通」一致。2.0 需先开通,1.0-pro 最稳"),
        base_url: Some("https://ark.cn-beijing.volces.com/api/v3"),
        model: "doubao-seedance-1-0-pro-250528",
        models: &[
            ModelOption::plain("doubao-seedance-1-0-pro-250528"),
            ModelOption::plain("doubao-seedance-1-0-pro-fast-251015"),
            ModelOption::plain("doubao-seedance-2-0-260128"),
            ModelOption::plain("doubao-seedance-2-0-fast-260128"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["ark.cn-beijing.volces.com"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "minimax_video",
        // 🔴 不与对话档 `minimax` 共用 vendor_id:那一档的 host 是 api.minimax.chat,
        //    视频用的是 api.minimaxi.com,两个 host 不能并成一张服务商卡
        vendor_id: "minimaxi",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.minimaxVideo.label",
        label: "海螺 MiniMax 视频",
        hint_key: Some("providerTemplate.minimaxVideo.hint"),
        hint: Some("I2V-01-live 偏动漫 / 插画风;Hailuo-02 新一代高质量,支持首尾帧"),
        base_url: Some("https://api.minimaxi.com/v1"),
        model: "MiniMax-Hailuo-02",
        models: &[
            ModelOption::plain("MiniMax-Hailuo-02"),
            ModelOption::plain("I2V-01-Director"),
            ModelOption::plain("I2V-01-live"),
            ModelOption::plain("I2V-01"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["api.minimaxi.com"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://platform.minimaxi.com/user-center/basic-information/interface-key"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "vidu_video",
        vendor_id: "aliyun",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.viduVideo.label",
        label: "Vidu 视频(阿里百炼)",
        hint_key: Some("providerTemplate.viduVideo.hint"),
        hint: Some("DashScope 异步任务;审核相对宽松,写实人脸被别家拒时可换它"),
        base_url: Some("https://dashscope.aliyuncs.com/api/v1"),
        model: "vidu/viduq3-turbo_img2video",
        models: &[
            ModelOption::plain("vidu/viduq3-pro_img2video"),
            ModelOption::plain("vidu/viduq3-turbo_img2video"),
            ModelOption::plain("vidu/viduq2-pro_img2video"),
            ModelOption::plain("vidu/viduq2-turbo_img2video"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["dashscope.aliyuncs.com"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://bailian.console.aliyun.com/?tab=model#/api-key"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "siliconflow_video",
        vendor_id: "siliconflow",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.siliconflowVideo.label",
        label: "硅基流动 视频 Wan",
        hint_key: Some("providerTemplate.siliconflowVideo.hint"),
        hint: Some("与对话 / 生图 / 配音同一个密钥"),
        base_url: Some("https://api.siliconflow.cn/v1"),
        model: "Wan-AI/Wan2.2-I2V-A14B",
        models: &[
            ModelOption::plain("Wan-AI/Wan2.2-I2V-A14B"),
            ModelOption::plain("Wan-AI/Wan2.1-I2V-14B-720P"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["api.siliconflow.cn"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://cloud.siliconflow.cn/account/ak"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "zhipu_video",
        vendor_id: "zhipu",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.zhipuVideo.label",
        label: "智谱 CogVideoX",
        hint_key: Some("providerTemplate.zhipuVideo.hint"),
        hint: Some("支持首尾帧;与智谱对话同一个密钥"),
        base_url: Some("https://open.bigmodel.cn/api/paas/v4"),
        model: "cogvideox-flash",
        models: &[
            ModelOption::plain("cogvideox-3"),
            ModelOption::plain("cogvideox-flash"),
            ModelOption::plain("cogvideox-2"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["open.bigmodel.cn"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://open.bigmodel.cn/usercenter/apikeys"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "ai302_minimax_video",
        vendor_id: "ai302",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.ai302MinimaxVideo.label",
        label: "302.AI 视频·海螺",
        hint_key: Some("providerTemplate.ai302MinimaxVideo.hint"),
        // 地址里的 /minimaxi 段让它按海螺协议走 —— 改地址时别删
        hint: Some("国内聚合,透传海螺原生协议;一个 302 密钥即可"),
        base_url: Some("https://api.302.ai/minimaxi/v1"),
        model: "MiniMax-Hailuo-02",
        models: &[
            ModelOption::plain("MiniMax-Hailuo-02"),
            ModelOption::plain("I2V-01-live"),
            ModelOption::plain("I2V-01-Director"),
            ModelOption::plain("I2V-01"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["api.302.ai/minimaxi"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://dash.302.ai/dashboard/apikey"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "ai302_zhipu_video",
        vendor_id: "ai302",
        kind: Kind::Video,
        group_key: GROUP_CHINA.0,
        group_label: GROUP_CHINA.1,
        label_key: "providerTemplate.ai302ZhipuVideo.label",
        label: "302.AI 视频·智谱",
        hint_key: Some("providerTemplate.ai302ZhipuVideo.hint"),
        hint: Some("国内聚合,透传智谱 CogVideoX 协议;一个 302 密钥即可"),
        base_url: Some("https://api.302.ai/zhipu/api/paas/v4"),
        model: "cogvideox-flash",
        models: &[
            ModelOption::plain("cogvideox-3"),
            ModelOption::plain("cogvideox-flash"),
        ],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &["api.302.ai/zhipu"],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: Some("https://dash.302.ai/dashboard/apikey"),
        is_local: false,
        verified_at: None,
    },
    ProviderPreset {
        key: "custom_video",
        vendor_id: "custom_video",
        kind: Kind::Video,
        group_key: GROUP_LOCAL.0,
        group_label: GROUP_LOCAL.1,
        label_key: "providerTemplate.customVideo.label",
        label: "自定义视频端点",
        hint_key: Some("providerTemplate.customVideo.hint"),
        // 识别不出协议时兜底走火山方舟;new-api / one-api 系聚合站在 extra 写 {"video_api":"newapi"}
        hint: Some("按地址识别协议,识别不出时按火山方舟处理;new-api 系聚合站请在额外配置里标 video_api=newapi"),
        base_url: None,
        model: "",
        models: &[],
        protocol: Protocol::OpenAiCompatible,
        match_hosts: &[],
        extra_fields: NO_EXTRA,
        default_extra: &[],
        apply_url: None,
        is_local: false,
        verified_at: None,
    },
];