feat(gateway): add Seedream 5.0 Pro

This commit is contained in:
2026-07-13 12:53:48 +08:00
parent 03abc0eab7
commit 9c300de72c
8 changed files with 460 additions and 5 deletions
@@ -125,6 +125,7 @@ func TestCoreLocalFlow(t *testing.T) {
t.Fatalf("connect test pool: %v", err)
}
defer testPool.Close()
assertSeedreamProCatalogMigration(t, ctx, testPool)
if _, err := testPool.Exec(ctx, `UPDATE gateway_users SET roles = '["admin"]'::jsonb WHERE username = $1`, username); err != nil {
t.Fatalf("promote smoke user: %v", err)
}
@@ -1794,6 +1795,42 @@ CREATE TABLE IF NOT EXISTS schema_migrations (
}
}
func assertSeedreamProCatalogMigration(t *testing.T, ctx context.Context, pool *pgxpool.Pool) {
t.Helper()
var valid bool
if err := pool.QueryRow(ctx, `
SELECT EXISTS (
SELECT 1
FROM base_model_catalog model
WHERE model.provider_key = 'volces'
AND model.canonical_model_key = 'volces:doubao-seedream-5-0-pro-260628'
AND model.provider_model_name = 'doubao-seedream-5-0-pro-260628'
AND model.display_name = 'Seedream-5.0-Pro'
AND model.display_name !~ '[[:space:]]'
AND model.model_type = '["image_edit","image_generate"]'::jsonb
AND model.capabilities->'image_edit'->>'input_multiple_images' = 'true'
AND model.capabilities->'image_edit'->>'input_max_images_count' = '10'
AND model.capabilities->'image_edit'->>'input_max_file_size_bytes' = '31457280'
AND model.capabilities->'image_edit'->'output_resolutions' = '["1K","2K"]'::jsonb
AND model.capabilities->'image_edit'->'output_size_range' = '[921600,4624220]'::jsonb
AND model.capabilities->'image_edit'->'aspect_ratio_range' = '[0.0625,16]'::jsonb
AND model.capabilities->'image_edit'->>'output_multiple_images' = 'false'
AND model.capabilities->'image_edit'->>'output_max_images_count' = '1'
AND model.capabilities->'image_generate'->>'allow_custom_width_height_size' = 'true'
AND model.capabilities->'image_generate'->>'output_multiple_images' = 'false'
AND model.capabilities->>'stream' = 'false'
AND model.capabilities->>'supportWebSearch' = 'false'
AND model.default_rate_limit_policy->'rules'->0->>'limit' = '500'
AND model.default_snapshot->>'modelAlias' = 'Seedream-5.0-Pro'
AND model.default_snapshot->>'displayName' = 'Seedream 5.0 Pro'
)`).Scan(&valid); err != nil {
t.Fatalf("query Seedream 5.0 Pro catalog migration: %v", err)
}
if !valid {
t.Fatal("Seedream 5.0 Pro catalog migration does not match the expected alias, upstream model, capabilities, or rate limit")
}
}
func doJSON(t *testing.T, baseURL string, method string, path string, token string, payload any, expectedStatus int, out any) {
t.Helper()
doJSONWithHeaders(t, baseURL, method, path, token, payload, nil, expectedStatus, out)
+1 -1
View File
@@ -238,7 +238,7 @@ func buildModelCatalog(
current = &catalogGroup{
key: key,
alias: firstNonEmpty(model.ModelAlias, model.DisplayName, model.ModelName),
displayName: firstNonEmpty(model.ModelAlias, model.DisplayName, model.ModelName),
displayName: firstNonEmpty(model.DisplayName, model.ModelAlias, model.ModelName),
modelName: model.ModelName,
modelType: cloneStringSlice(model.ModelType),
capabilities: cloneObject(model.Capabilities),
@@ -1,6 +1,7 @@
package httpapi
import (
"strings"
"testing"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
@@ -114,6 +115,36 @@ func TestBuildModelCatalogAggregatesSources(t *testing.T) {
}
}
func TestBuildModelCatalogKeepsDisplayNameSeparateFromCallAlias(t *testing.T) {
models := []store.PlatformModel{
{
ID: "seedream-pro",
PlatformID: "platform-volces",
ModelName: "Seedream-5.0-Pro",
ProviderModelName: "doubao-seedream-5-0-pro-260628",
ModelAlias: "Seedream-5.0-Pro",
ModelType: store.StringList{"image_edit", "image_generate"},
DisplayName: "Seedream 5.0 Pro",
Enabled: true,
},
}
platforms := []store.Platform{
{ID: "platform-volces", Provider: "volces", Name: "火山引擎", Status: "enabled"},
}
response := buildModelCatalog(models, platforms, nil, nil, nil, nil, nil)
if len(response.Items) != 1 {
t.Fatalf("expected one Seedream Pro catalog item, got %+v", response.Items)
}
item := response.Items[0]
if item.Alias != "Seedream-5.0-Pro" || item.DisplayName != "Seedream 5.0 Pro" || item.ModelName != "Seedream-5.0-Pro" {
t.Fatalf("catalog should separate the call alias from the display name, got %+v", item)
}
if strings.Contains(item.Alias, " ") {
t.Fatalf("Seedream Pro call alias must not contain spaces, got %q", item.Alias)
}
}
func TestBuildModelCatalogUsesBaseModelProviderForProviderFilters(t *testing.T) {
models := []store.PlatformModel{
{