增加即梦图片5.0和视频2.5的能力
This commit is contained in:
1 parent
542246e4ce
commit
88a4268d40
55 files changed
+1412
-200
No files matched your search
@@ -78,7 +78,7 @@ func applicationID(prefix string) string {
|
||||
|
||||
func imageEngine(getenv postgres.Getenv) string {
|
||||
engine := strings.ToLower(firstNonEmpty(getenv("IMAGE_GENERATE_ENGINE"), getenv("IMAGE_CREATION_ENGINE"), getenv("IMAGE_PROVIDER"), "jimeng"))
|
||||
if engine != "evolink" && engine != "bailian" {
|
||||
if engine != "evolink" && engine != "bailian" && engine != "seedream" {
|
||||
return "jimeng"
|
||||
}
|
||||
return engine
|
||||
@@ -97,6 +97,8 @@ func imageProvider(getenv postgres.Getenv) string {
|
||||
return "evolink"
|
||||
case "bailian":
|
||||
return "bailian"
|
||||
case "seedream":
|
||||
return "seedream"
|
||||
default:
|
||||
return "volcengine-visual"
|
||||
}
|
||||
@@ -115,6 +117,8 @@ func imageModel(getenv postgres.Getenv) string {
|
||||
return firstNonEmpty(getenv("EVOLINK_IMAGE_MODEL"), "gpt-image-2")
|
||||
case "bailian":
|
||||
return firstNonEmpty(getenv("BAILIAN_IMAGE_MODEL"), "wan2.7-image-pro")
|
||||
case "seedream":
|
||||
return providers.Seedream50ProModel
|
||||
default:
|
||||
return firstNonEmpty(getenv("JIMENG_IMAGE_GENERATE_46_REQ_KEY"), "jimeng_seedream46_cvtob")
|
||||
}
|
||||
@@ -157,6 +161,7 @@ func buildProviderRegistryWithClient(getenv postgres.Getenv, client *http.Client
|
||||
"evolink": providers.NewEvoLink(providers.Config{BaseURL: firstNonEmpty(getenv("EVOLINK_BASE_URL"), "https://api.evolink.ai"), APIKey: getenv("EVOLINK_API_KEY"), Model: firstNonEmpty(getenv("EVOLINK_IMAGE_MODEL"), "gpt-image-2"), MaxResponseBytes: maximum}, client),
|
||||
"bailian": providers.NewBailian(providers.Config{BaseURL: bailianNativeBaseURL(getenv), APIKey: bailianAPIKey(getenv), Model: firstNonEmpty(getenv("BAILIAN_IMAGE_MODEL"), "wan2.7-image-pro"), MaxResponseBytes: maximum}, client),
|
||||
"seedance": providers.NewSeedance(providers.Config{BaseURL: firstNonEmpty(getenv("SEEDANCE_BASE_URL"), "https://ark.cn-beijing.volces.com/api/v3"), APIKey: getenv("SEEDANCE_API_KEY"), Model: firstNonEmpty(getenv("SEEDANCE_MODEL"), "doubao-seedance-2-0-260128"), MaxResponseBytes: maximum}, client),
|
||||
"seedream": providers.NewSeedream(providers.Config{BaseURL: firstNonEmpty(getenv("SEEDANCE_BASE_URL"), "https://ark.cn-beijing.volces.com/api/v3"), APIKey: getenv("SEEDANCE_API_KEY"), Model: providers.Seedream50ProModel, MaxResponseBytes: maximum}, client),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,19 +180,21 @@ func providerImageTargets(getenv postgres.Getenv) map[string]jobs.ProviderTarget
|
||||
Provider: "bailian",
|
||||
Model: firstNonEmpty(getenv("BAILIAN_IMAGE_MODEL"), "wan2.7-image-pro"),
|
||||
},
|
||||
"seedream": {
|
||||
Provider: "seedream",
|
||||
Model: providers.Seedream50ProModel,
|
||||
Settings: map[string]any{"size": "1.5K", "outputFormat": "png", "optimizeMode": "standard", "imageCount": float64(1)},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func providerVideoTargets(getenv postgres.Getenv) map[string]jobs.ProviderTarget {
|
||||
seedanceModel := firstNonEmpty(getenv("SEEDANCE_MODEL"), "doubao-seedance-2-0-260128")
|
||||
return map[string]jobs.ProviderTarget{
|
||||
"seedance": {
|
||||
Provider: "seedance",
|
||||
Model: firstNonEmpty(getenv("SEEDANCE_MODEL"), "doubao-seedance-2-0-260128"),
|
||||
Settings: map[string]any{
|
||||
"ratio": firstNonEmpty(getenv("SEEDANCE_RATIO"), getenv("SEEDANCE_DEFAULT_RATIO"), "9:16"),
|
||||
"duration": float64(positiveInt64Value(firstNonEmpty(getenv("SEEDANCE_DURATION"), getenv("SEEDANCE_DEFAULT_DURATION")), 5)),
|
||||
"resolution": firstNonEmpty(getenv("SEEDANCE_RESOLUTION"), getenv("SEEDANCE_DEFAULT_RESOLUTION"), "720p"),
|
||||
},
|
||||
Model: seedanceModel,
|
||||
Settings: seedanceDefaultSettings(getenv, seedanceModel),
|
||||
},
|
||||
"bailian": {
|
||||
Provider: "bailian",
|
||||
@@ -196,6 +203,37 @@ func providerVideoTargets(getenv postgres.Getenv) map[string]jobs.ProviderTarget
|
||||
}
|
||||
}
|
||||
|
||||
func providerVideoModels(getenv postgres.Getenv) map[string]jobs.ProviderTarget {
|
||||
models := []string{
|
||||
"doubao-seedance-2-0-260128",
|
||||
"doubao-seedance-2-5-260628",
|
||||
firstNonEmpty(getenv("SEEDANCE_MODEL"), "doubao-seedance-2-0-260128"),
|
||||
}
|
||||
targets := make(map[string]jobs.ProviderTarget, len(models))
|
||||
for _, model := range models {
|
||||
targets[model] = jobs.ProviderTarget{Provider: "seedance", Model: model, Settings: seedanceDefaultSettings(getenv, model)}
|
||||
}
|
||||
return targets
|
||||
}
|
||||
|
||||
func seedanceDefaultSettings(getenv postgres.Getenv, model string) map[string]any {
|
||||
duration := positiveInt64Value(firstNonEmpty(getenv("SEEDANCE_DURATION"), getenv("SEEDANCE_DEFAULT_DURATION")), 5)
|
||||
maximum := int64(15)
|
||||
if model == "doubao-seedance-2-5-260628" {
|
||||
maximum = 30
|
||||
}
|
||||
if duration < 4 {
|
||||
duration = 4
|
||||
} else if duration > maximum {
|
||||
duration = maximum
|
||||
}
|
||||
return map[string]any{
|
||||
"ratio": firstNonEmpty(getenv("SEEDANCE_RATIO"), getenv("SEEDANCE_DEFAULT_RATIO"), "9:16"),
|
||||
"duration": float64(duration),
|
||||
"resolution": firstNonEmpty(getenv("SEEDANCE_RESOLUTION"), getenv("SEEDANCE_DEFAULT_RESOLUTION"), "720p"),
|
||||
}
|
||||
}
|
||||
|
||||
func providerUnavailableMessages(getenv postgres.Getenv) map[string]string {
|
||||
missing := map[string]string{}
|
||||
if strings.TrimSpace(getenv("VOLCENGINE_ACCESS_KEY_ID")) == "" || strings.TrimSpace(getenv("VOLCENGINE_SECRET_ACCESS_KEY")) == "" {
|
||||
@@ -209,6 +247,7 @@ func providerUnavailableMessages(getenv postgres.Getenv) map[string]string {
|
||||
}
|
||||
if strings.TrimSpace(getenv("SEEDANCE_API_KEY")) == "" {
|
||||
missing["seedance"] = "Seedance 服务商未配置,请先配置 SEEDANCE_API_KEY。"
|
||||
missing["seedream"] = "Seedream 服务商未配置,请先配置火山方舟 API Key(SEEDANCE_API_KEY)。"
|
||||
}
|
||||
return missing
|
||||
}
|
||||
@@ -223,7 +262,7 @@ func defaultWebhookSender(getenv postgres.Getenv) (*webhook.HTTPSender, error) {
|
||||
func capabilitySummary(getenv postgres.Getenv) func(context.Context) (any, error) {
|
||||
return func(context.Context) (any, error) {
|
||||
engine := imageEngine(getenv)
|
||||
provider := map[string]string{"jimeng": "volcengine-visual", "evolink": "evolink", "bailian": "bailian"}[engine]
|
||||
provider := map[string]string{"jimeng": "volcengine-visual", "evolink": "evolink", "bailian": "bailian", "seedream": "seedream"}[engine]
|
||||
primaryVideoEngine := videoEngine(getenv)
|
||||
primaryVideo := map[string]any{
|
||||
"id": "video.generate", "kind": "video", "engine": primaryVideoEngine,
|
||||
@@ -231,21 +270,33 @@ func capabilitySummary(getenv postgres.Getenv) func(context.Context) (any, error
|
||||
}
|
||||
if primaryVideoEngine == "seedance" {
|
||||
primaryVideo["label"] = "Seedance 视频生成"
|
||||
primaryVideo["limits"] = seedanceCapabilityLimits()
|
||||
primaryVideo["limits"] = seedanceCapabilityLimits(videoModel(getenv))
|
||||
primaryVideo["models"] = seedanceModelOptions()
|
||||
} else {
|
||||
primaryVideo["label"] = "百炼图生视频"
|
||||
primaryVideo["limits"] = bailianVideoCapabilityLimits()
|
||||
}
|
||||
return []any{
|
||||
map[string]any{"id": "image.generate", "label": "图片生成 4.6", "kind": "image", "engine": engine, "provider": provider, "reqKey": imageModel(getenv)},
|
||||
map[string]any{"id": "image.generate", "label": imageCapabilityLabel(engine), "kind": "image", "engine": engine, "provider": provider, "reqKey": imageModel(getenv)},
|
||||
primaryVideo,
|
||||
map[string]any{"id": "video.generate.bailian", "label": "百炼图生视频", "kind": "video", "engine": "bailian", "provider": "bailian", "reqKey": firstNonEmpty(getenv("BAILIAN_VIDEO_MODEL"), "wan2.7-i2v-2026-04-25"), "limits": bailianVideoCapabilityLimits()},
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func seedanceCapabilityLimits() map[string]any {
|
||||
return map[string]any{"durationSeconds": map[string]int{"min": 4, "max": 15}, "ratios": []string{"16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"}, "resolutions": []string{"480p", "720p", "1080p"}}
|
||||
func seedanceCapabilityLimits(model string) map[string]any {
|
||||
maximum := 15
|
||||
if model == "doubao-seedance-2-5-260628" {
|
||||
maximum = 30
|
||||
}
|
||||
return map[string]any{"durationSeconds": map[string]int{"min": 4, "max": maximum}, "ratios": []string{"16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"}, "resolutions": []string{"480p", "720p", "1080p"}}
|
||||
}
|
||||
|
||||
func seedanceModelOptions() []any {
|
||||
return []any{
|
||||
map[string]any{"id": "doubao-seedance-2-0-260128", "label": "Seedance 2.0", "limits": seedanceCapabilityLimits("doubao-seedance-2-0-260128")},
|
||||
map[string]any{"id": "doubao-seedance-2-5-260628", "label": "Seedance 2.5", "limits": seedanceCapabilityLimits("doubao-seedance-2-5-260628")},
|
||||
}
|
||||
}
|
||||
|
||||
func bailianVideoCapabilityLimits() map[string]any {
|
||||
@@ -254,7 +305,7 @@ func bailianVideoCapabilityLimits() map[string]any {
|
||||
|
||||
func runtimeHealthDetails(getenv postgres.Getenv) httpapi.HealthDetails {
|
||||
image := imageEngine(getenv)
|
||||
imageLabel := map[string]string{"jimeng": "即梦", "evolink": "EvoLink", "bailian": "阿里云百炼"}[image]
|
||||
imageLabel := map[string]string{"jimeng": "即梦", "evolink": "EvoLink", "bailian": "阿里云百炼", "seedream": "Seedream 5.0 Pro"}[image]
|
||||
video := videoEngine(getenv)
|
||||
videoLabel := map[string]string{"seedance": "Seedance", "bailian": "阿里云百炼"}[video]
|
||||
visualConfigured := strings.TrimSpace(getenv("VOLCENGINE_ACCESS_KEY_ID")) != "" && strings.TrimSpace(getenv("VOLCENGINE_SECRET_ACCESS_KEY")) != ""
|
||||
@@ -274,12 +325,19 @@ func runtimeHealthDetails(getenv postgres.Getenv) httpapi.HealthDetails {
|
||||
BailianMode: providerMode(bailianKey != "", "bailian"),
|
||||
AuthMode: authMode,
|
||||
Capabilities: []any{
|
||||
map[string]any{"id": "image.generate", "label": "图片生成 4.6", "engine": image, "engineLabel": imageLabel, "reqKey": imageModel(getenv)},
|
||||
map[string]any{"id": "video.generate", "label": "视频生成", "engine": video, "engineLabel": videoLabel, "reqKey": videoModel(getenv)},
|
||||
map[string]any{"id": "image.generate", "label": imageCapabilityLabel(image), "engine": image, "engineLabel": imageLabel, "reqKey": imageModel(getenv)},
|
||||
map[string]any{"id": "video.generate", "label": "视频生成", "engine": video, "engineLabel": videoLabel, "reqKey": videoModel(getenv), "models": seedanceModelOptions()},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func imageCapabilityLabel(engine string) string {
|
||||
if engine == "seedream" {
|
||||
return "Seedream 5.0 Pro 图片生成"
|
||||
}
|
||||
return "图片生成 4.6"
|
||||
}
|
||||
|
||||
func providerMode(configured bool, live string) string {
|
||||
if !configured {
|
||||
return "missing"
|
||||
@@ -386,7 +444,7 @@ func configuredProviderJobBuilder(getenv postgres.Getenv, enforceAvailability bo
|
||||
return jobs.ProviderJobBuilder{
|
||||
ImageProvider: imageProvider(getenv), VideoProvider: videoProvider(getenv),
|
||||
ImageModel: imageModel(getenv), VideoModel: videoModel(getenv), ImageEngine: imageEngine(getenv), VideoEngine: videoEngine(getenv),
|
||||
ImageEngines: providerImageTargets(getenv), VideoEngines: providerVideoTargets(getenv), UnavailableProviders: unavailable, NewID: applicationJobID,
|
||||
ImageEngines: providerImageTargets(getenv), VideoEngines: providerVideoTargets(getenv), VideoModels: providerVideoModels(getenv), UnavailableProviders: unavailable, NewID: applicationJobID,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user