easyai-ai-gateway/apps/api/migrations/0057_volces_seedance20_mini.sql

192 lines
8.1 KiB
SQL

WITH seedance_mini_model AS (
SELECT
'volces:doubao-seedance-2-0-mini-260615' AS canonical_model_key,
'doubao-seedance-2-0-mini-260615' AS provider_model_name,
'豆包Seedance-2.0-mini' AS display_name,
'["video_generate","image_to_video","omni_video"]'::jsonb AS model_type,
'{
"video_generate": {
"output_resolutions": ["720p", "480p"],
"aspect_ratio_allowed": ["16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"],
"duration_range": [4, 15],
"input_audio": true,
"output_audio": true,
"supportWebSearch": true,
"output_support_return_last_frame": true,
"output_video_continuation": true,
"max_images": 9,
"max_videos": 3
},
"image_to_video": {
"output_resolutions": ["720p", "480p"],
"input_first_frame": true,
"input_first_last_frame": true,
"input_last_frame": false,
"input_reference_generate_single": true,
"input_reference_generate_multiple": true,
"aspect_ratio_allowed": ["16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"],
"duration_range": [4, 15],
"input_audio": true,
"support_video_effect_template": false,
"output_audio": true,
"supportWebSearch": true,
"output_support_return_last_frame": true,
"output_video_continuation": true,
"max_images": 9,
"max_videos": 3,
"max_images_for_last_frame": 2
},
"omni_video": {
"supported_modes": ["element_reference", "text_to_video", "image_reference", "first_last_frame", "video_reference", "video_edit", "multi_shot"],
"output_resolutions": ["720p", "480p"],
"aspect_ratio_allowed": ["16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"],
"duration_options": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
"output_audio": true,
"input_audio": true,
"supportWebSearch": true,
"output_support_return_last_frame": true,
"output_video_continuation": true,
"max_videos": 3,
"max_audios": 3,
"max_images": 9,
"max_elements": 9,
"max_images_and_elements": 9,
"max_images_for_last_frame": 2,
"support_instruction_edit": true,
"supports_portrait_asset_reference": true
},
"originalTypes": ["video_generate", "image_to_video", "omni_video"]
}'::jsonb AS capabilities,
'{"video":{"basePrice":100,"baseWeight":1,"dynamicWeight":{"480p":0.75,"720p":1,"1080p":1.5,"2160p":2,"audio-true":2,"audio-false":1,"reference-video-true":1.5,"reference-video-false":1,"voice-specified-true":1.2,"voice-specified-false":1}},"currency":"resource"}'::jsonb AS base_billing_config,
'{"rules":[{"metric":"rpm","limit":600,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb AS default_rate_limit_policy,
'{
"source": "server-main.integration-platform",
"sourceProviderCode": "volces",
"sourceProviderName": "火山引擎(豆包)",
"sourceSpecType": "volces",
"originalTypes": ["video_generate", "image_to_video", "omni_video"],
"alias": "豆包Seedance-2.0-mini",
"description": "Seedance 2.0 轻量低成本视频生成模型,支持 480p/720p",
"iconPath": "https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg",
"billingType": "external-api",
"billingMode": "",
"referenceModel": "",
"modelWeight": null,
"selectable": true,
"rawModel": {
"name": "doubao-seedance-2-0-mini-260615",
"types": ["video_generate", "image_to_video", "omni_video"],
"alias": "豆包Seedance-2.0-mini",
"description": "Seedance 2.0 轻量低成本视频生成模型,支持 480p/720p",
"icon_path": "https://ecmb.bdimg.com/tam-ogel/1801637412_-164881388_88_88.jpg",
"model_limits": {
"max_request_per_minute": 600,
"max_concurrent_requests": 10
}
}
}'::jsonb AS metadata
)
INSERT INTO base_model_catalog (
provider_id,
provider_key,
canonical_model_key,
provider_model_name,
model_type,
display_name,
capabilities,
base_billing_config,
default_rate_limit_policy,
metadata,
catalog_type,
default_snapshot,
status
)
SELECT
(SELECT id FROM model_catalog_providers WHERE provider_key = 'volces' OR provider_code = 'volces' LIMIT 1),
'volces',
model.canonical_model_key,
model.provider_model_name,
model.model_type,
model.display_name,
model.capabilities,
model.base_billing_config,
model.default_rate_limit_policy,
jsonb_set(model.metadata, '{rawModel,capabilities}', model.capabilities, true),
'system',
jsonb_build_object(
'providerKey', 'volces',
'canonicalModelKey', model.canonical_model_key,
'providerModelName', model.provider_model_name,
'modelType', model.model_type,
'modelAlias', model.display_name,
'displayName', model.display_name,
'capabilities', model.capabilities,
'baseBillingConfig', model.base_billing_config,
'defaultRateLimitPolicy', model.default_rate_limit_policy,
'metadata', jsonb_set(model.metadata, '{rawModel,capabilities}', model.capabilities, true),
'status', 'active'
),
'active'
FROM seedance_mini_model model
ON CONFLICT (canonical_model_key) DO UPDATE
SET provider_id = EXCLUDED.provider_id,
provider_key = EXCLUDED.provider_key,
provider_model_name = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.provider_model_name ELSE base_model_catalog.provider_model_name END,
model_type = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.model_type ELSE base_model_catalog.model_type END,
display_name = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.display_name ELSE base_model_catalog.display_name END,
capabilities = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.capabilities ELSE base_model_catalog.capabilities END,
base_billing_config = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.base_billing_config ELSE base_model_catalog.base_billing_config END,
default_rate_limit_policy = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.default_rate_limit_policy ELSE base_model_catalog.default_rate_limit_policy END,
metadata = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.metadata ELSE base_model_catalog.metadata END,
catalog_type = CASE WHEN base_model_catalog.customized_at IS NULL THEN 'system' ELSE base_model_catalog.catalog_type END,
default_snapshot = CASE WHEN base_model_catalog.customized_at IS NULL THEN EXCLUDED.default_snapshot ELSE base_model_catalog.default_snapshot END,
status = CASE WHEN base_model_catalog.customized_at IS NULL THEN 'active' ELSE base_model_catalog.status END,
updated_at = now();
INSERT INTO platform_models (
platform_id,
base_model_id,
model_name,
provider_model_name,
model_alias,
model_type,
display_name,
capabilities,
pricing_mode,
billing_config,
retry_policy,
rate_limit_policy,
enabled
)
SELECT
platform.id,
base_model.id,
base_model.provider_model_name,
base_model.provider_model_name,
base_model.display_name,
base_model.model_type,
base_model.display_name,
base_model.capabilities,
'inherit_discount',
base_model.base_billing_config,
'{"enabled":true,"maxAttempts":1}'::jsonb,
base_model.default_rate_limit_policy,
true
FROM integration_platforms platform
JOIN base_model_catalog base_model ON base_model.canonical_model_key = 'volces:doubao-seedance-2-0-mini-260615'
WHERE platform.provider = 'volces'
AND platform.deleted_at IS NULL
ON CONFLICT (platform_id, model_name) DO UPDATE
SET base_model_id = EXCLUDED.base_model_id,
provider_model_name = EXCLUDED.provider_model_name,
model_alias = EXCLUDED.model_alias,
display_name = EXCLUDED.display_name,
model_type = EXCLUDED.model_type,
capabilities = EXCLUDED.capabilities,
pricing_mode = EXCLUDED.pricing_mode,
billing_config = EXCLUDED.billing_config,
retry_policy = EXCLUDED.retry_policy,
rate_limit_policy = EXCLUDED.rate_limit_policy,
enabled = EXCLUDED.enabled,
updated_at = now();