Files
ttstd-infinite-canvas/backend/internal/provider/bailian/discovery.go

360 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package bailian
import (
"net/url"
"strings"
"infinite-canvas/backend/internal/provider"
)
// Discovery 阿里云百炼插件
type Discovery struct{}
// New 创建百炼插件实例
func New() *Discovery {
return &Discovery{}
}
// GetProviderID 返回服务商标识
func (d *Discovery) GetProviderID() string {
return "bailian"
}
// Match 判断是否匹配阿里云百炼
func (d *Discovery) Match(baseURL string, headers map[string]string) bool {
parsed, err := url.Parse(strings.TrimSpace(baseURL))
if err != nil {
return false
}
host := strings.ToLower(parsed.Hostname())
dashscopeHost := host == "dashscope.aliyuncs.com" || strings.HasSuffix(host, ".dashscope.aliyuncs.com") || (strings.HasPrefix(host, "dashscope-") && strings.HasSuffix(host, ".aliyuncs.com"))
return dashscopeHost || host == "maas.aliyuncs.com" || strings.HasSuffix(host, ".maas.aliyuncs.com")
}
// AdditionalModels 只返回百炼标准 /models 未暴露的补充目录。
func (d *Discovery) AdditionalModels(_ provider.DiscoveryConfig) []provider.Model {
return d.deduplicate(d.getExtendedModels())
}
// GetMetadata 返回插件元数据
func (d *Discovery) GetMetadata() provider.ProviderMetadata {
return provider.ProviderMetadata{
Name: "bailian",
Version: "1.0.0",
Description: "Alibaba Cloud Bailian (DashScope) extended model discovery",
Author: "infinite-canvas",
SupportedRegions: []string{"cn-beijing", "ap-southeast-1", "us-east-1"},
}
}
// getExtendedModels 获取百炼特有的扩展模型列表
func (d *Discovery) getExtendedModels() []provider.Model {
models := []provider.Model{
// === 视频生成模型 ===
{
ID: "happyhorse-1.1-t2v",
DisplayName: "HappyHorse 1.1 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
},
},
{
ID: "happyhorse-1.1-i2v",
DisplayName: "HappyHorse 1.1 图生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "image_to_video",
},
},
{
ID: "happyhorse-1.1-r2v",
DisplayName: "HappyHorse 1.1 参考视频生成",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "reference_to_video",
},
},
{
ID: "happyhorse-1.0-video-edit",
DisplayName: "HappyHorse 1.0 视频编辑",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "video_edit",
},
},
// Wan 系列视频生成模型
{
ID: "wan2.7-t2v-2026-06-12",
DisplayName: "万相 2.7 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
},
},
{
ID: "wan2.7-i2v-2026-04-25",
DisplayName: "万相 2.7 图生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "image_to_video",
},
},
{
ID: "wan2.7-r2v-2026-06-12",
DisplayName: "万相 2.7 参考视频生成",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "reference_to_video",
},
},
// Kling(可灵)系列视频生成模型
{
ID: "kling/kling-v3-omni-video-generation",
DisplayName: "可灵 V3 Omni 视频生成",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"resolution": "up to 4K",
"duration": "3-15s",
"generation_modes": []string{"text_to_video", "image_to_video", "reference_to_video", "video_edit"},
},
},
{
ID: "kling/kling-v3-video-generation",
DisplayName: "可灵 V3 视频生成",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"resolution": "720P-4K",
"duration": "3-15s",
"generation_modes": []string{"text_to_video", "image_to_video"},
},
},
// PixVerse(爱诗)系列 - 文生视频
{
ID: "pixverse/pixverse-c1-t2v",
DisplayName: "爱诗 C1 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"recommended": "action scenes, effects",
"duration": "1-15s",
},
},
{
ID: "pixverse/pixverse-v6-t2v",
DisplayName: "爱诗 V6 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"recommended": "general purpose",
"duration": "1-15s",
},
},
{
ID: "pixverse/pixverse-v5.6-t2v",
DisplayName: "爱诗 V5.6 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"deprecated": "recommend upgrade to v6",
},
},
// PixVerse(爱诗)系列 - 图生视频
{
ID: "pixverse/pixverse-c1-it2v",
DisplayName: "爱诗 C1 图生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "image_to_video",
"duration": "1-15s",
},
},
{
ID: "pixverse/pixverse-v6-it2v",
DisplayName: "爱诗 V6 图生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "image_to_video",
"duration": "1-15s",
},
},
{
ID: "pixverse/pixverse-v5.6-it2v",
DisplayName: "爱诗 V5.6 图生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "image_to_video",
},
},
// Vidu 系列视频生成模型
{
ID: "vidu/viduq3-pro_text2video",
DisplayName: "Vidu Q3 Pro 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"resolution": "540P-1080P",
"duration": "1-16s",
},
},
{
ID: "vidu/viduq3-turbo_text2video",
DisplayName: "Vidu Q3 Turbo 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"resolution": "540P-1080P",
"duration": "1-16s",
},
},
{
ID: "vidu/viduq2_text2video",
DisplayName: "Vidu Q2 文生视频",
Provider: "bailian",
Capability: []string{"video"},
SupportedEndpointTypes: []string{"video"},
APIPath: "/api/v1/services/aigc/video-generation/video-synthesis",
Metadata: map[string]any{
"source": "extended",
"model_type": "video_generation",
"generation_mode": "text_to_video",
"resolution": "540P-1080P",
"duration": "1-10s",
},
},
// === 图像生成模型(补充)===
{
ID: "qwen-image-3.0-pro",
DisplayName: "通义千问图像 3.0 Pro",
Provider: "bailian",
Capability: []string{"image"},
SupportedEndpointTypes: []string{"image"},
APIPath: "/api/v1/services/aigc/multimodal-generation/generation",
Metadata: map[string]any{
"source": "extended",
"model_type": "image_generation",
},
},
{
ID: "wan2.7-image-pro",
DisplayName: "万相图像 2.7 Pro",
Provider: "bailian",
Capability: []string{"image"},
SupportedEndpointTypes: []string{"image"},
APIPath: "/api/v1/services/aigc/multimodal-generation/generation",
Metadata: map[string]any{
"source": "extended",
"model_type": "image_generation",
},
},
}
return models
}
// deduplicate 去重模型列表
func (d *Discovery) deduplicate(models []provider.Model) []provider.Model {
seen := make(map[string]bool)
result := make([]provider.Model, 0, len(models))
for _, model := range models {
if !seen[model.ID] {
seen[model.ID] = true
result = append(result, model)
}
}
return result
}