@felores/kie-ai-mcp-server 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, ListResources
5
5
  import { KieAiClient } from "./kie-ai-client.js";
6
6
  import { TaskDatabase } from "./database.js";
7
7
  import { z } from "zod";
8
- import { NanoBananaImageSchema, Veo3GenerateSchema, SunoGenerateSchema, ElevenLabsTTSSchema, ElevenLabsSoundEffectsSchema, ByteDanceSeedanceVideoSchema, ByteDanceSeedreamImageSchema, QwenImageSchema, RunwayAlephVideoSchema, WanVideoSchema, MidjourneyGenerateSchema, OpenAI4oImageSchema, FluxKontextImageSchema, RecraftRemoveBackgroundSchema, IdeogramReframeSchema, KlingVideoSchema, HailuoVideoSchema, SoraVideoSchema, Flux2ImageSchema, WanAnimateSchema, ZImageSchema, GrokImagineSchema, InfiniTalkSchema, KlingAvatarSchema, TopazUpscaleImageSchema, } from "./types.js";
8
+ import { NanoBananaImageSchema, Veo3GenerateSchema, SunoGenerateSchema, ElevenLabsTTSSchema, ElevenLabsSoundEffectsSchema, ByteDanceSeedanceVideoSchema, ByteDanceSeedreamImageSchema, QwenImageSchema, RunwayAlephVideoSchema, Wan27VideoSchema, MidjourneyGenerateSchema, GptImage2Schema, FluxKontextImageSchema, RecraftRemoveBackgroundSchema, IdeogramReframeSchema, KlingVideoSchema, HailuoVideoSchema, SoraVideoSchema, Flux2ImageSchema, WanAnimateSchema, ZImageSchema, GrokImagineSchema, InfiniTalkSchema, KlingAvatarSchema, TopazUpscaleImageSchema, HappyHorseVideoSchema, } from "./types.js";
9
9
  class KieAiMcpServer {
10
10
  server;
11
11
  client;
@@ -17,7 +17,7 @@ class KieAiMcpServer {
17
17
  "nano_banana_image",
18
18
  "bytedance_seedream_image",
19
19
  "qwen_image",
20
- "openai_4o_image",
20
+ "gpt_image_2",
21
21
  "flux_kontext_image",
22
22
  "flux2_image",
23
23
  "z_image",
@@ -33,6 +33,7 @@ class KieAiMcpServer {
33
33
  "bytedance_seedance_video",
34
34
  "wan_video",
35
35
  "wan_animate",
36
+ "happyhorse_video",
36
37
  "hailuo_video",
37
38
  "kling_video",
38
39
  "runway_aleph_video",
@@ -53,7 +54,7 @@ class KieAiMcpServer {
53
54
  constructor() {
54
55
  this.server = new Server({
55
56
  name: "kie-ai-mcp-server",
56
- version: "3.0.1",
57
+ version: "3.2.0",
57
58
  });
58
59
  // Initialize client with config from environment
59
60
  this.config = {
@@ -614,66 +615,92 @@ class KieAiMcpServer {
614
615
  },
615
616
  {
616
617
  name: "bytedance_seedance_video",
617
- description: "Generate videos using ByteDance Seedance models (unified tool for both text-to-video and image-to-video)",
618
+ description: "Generate videos with ByteDance Seedance 2.0 — multimodal inputs (image/video/audio references), native audio generation, standard and fast modes",
618
619
  inputSchema: {
619
620
  type: "object",
620
621
  properties: {
621
622
  prompt: {
622
623
  type: "string",
623
- description: "Text prompt for video generation (max 10000 characters)",
624
- minLength: 1,
625
- maxLength: 10000,
624
+ description: "Text prompt for video generation (3-20000 characters)",
625
+ minLength: 3,
626
+ maxLength: 20000,
626
627
  },
627
- image_url: {
628
+ mode: {
629
+ type: "string",
630
+ description: "Generation mode — standard (seedance-2, higher quality) or fast (seedance-2-fast, iterative workflows)",
631
+ enum: ["standard", "fast"],
632
+ default: "standard",
633
+ },
634
+ first_frame_url: {
628
635
  type: "string",
629
- description: "URL of input image for image-to-video generation (optional - if not provided, uses text-to-video)",
636
+ description: "URL of image to use as the first frame (optional)",
630
637
  format: "uri",
631
638
  },
632
- quality: {
639
+ last_frame_url: {
633
640
  type: "string",
634
- description: "Model quality level - lite for faster generation, pro for higher quality",
635
- enum: ["lite", "pro"],
636
- default: "lite",
641
+ description: "URL of image to use as the last frame (optional)",
642
+ format: "uri",
643
+ },
644
+ reference_image_urls: {
645
+ type: "array",
646
+ description: "Reference images for style/subject guidance (up to 9)",
647
+ items: { type: "string", format: "uri" },
648
+ maxItems: 9,
649
+ },
650
+ reference_video_urls: {
651
+ type: "array",
652
+ description: "Reference videos for motion/style guidance (up to 3)",
653
+ items: { type: "string", format: "uri" },
654
+ maxItems: 3,
655
+ },
656
+ reference_audio_urls: {
657
+ type: "array",
658
+ description: "Reference audio for sound-guided generation (up to 3)",
659
+ items: { type: "string", format: "uri" },
660
+ maxItems: 3,
637
661
  },
638
662
  aspect_ratio: {
639
663
  type: "string",
640
664
  description: "Aspect ratio of the generated video",
641
- enum: ["1:1", "9:16", "16:9", "4:3", "3:4", "21:9", "9:21"],
665
+ enum: [
666
+ "1:1",
667
+ "9:16",
668
+ "16:9",
669
+ "4:3",
670
+ "3:4",
671
+ "21:9",
672
+ "9:21",
673
+ "adaptive",
674
+ ],
642
675
  default: "16:9",
643
676
  },
644
677
  resolution: {
645
678
  type: "string",
646
- description: "Video resolution - 480p for faster generation, 720p for balance, 1080p for higher quality",
647
- enum: ["480p", "720p", "1080p"],
679
+ description: "Video resolution 480p for faster, 720p for balance",
680
+ enum: ["480p", "720p"],
648
681
  default: "720p",
649
682
  },
650
683
  duration: {
651
- type: "string",
652
- description: "Duration of video in seconds (2-12)",
653
- pattern: "^[2-9]|1[0-2]$",
654
- default: "5",
655
- },
656
- camera_fixed: {
657
- type: "boolean",
658
- description: "Whether to fix the camera position",
659
- default: false,
660
- },
661
- seed: {
662
684
  type: "integer",
663
- description: "Random seed to control video generation. Use -1 for random",
664
- minimum: -1,
665
- maximum: 2147483647,
666
- default: -1,
685
+ description: "Duration of video in seconds (4-15)",
686
+ minimum: 4,
687
+ maximum: 15,
688
+ default: 5,
667
689
  },
668
- enable_safety_checker: {
690
+ generate_audio: {
669
691
  type: "boolean",
670
- description: "Enable content safety checking",
692
+ description: "Generate native audio for the video",
671
693
  default: true,
672
694
  },
673
- end_image_url: {
674
- type: "string",
675
- description: "URL of image the video should end with (image-to-video only)",
676
- format: "uri",
695
+ web_search: {
696
+ type: "boolean",
697
+ description: "Enable web search to enhance prompt understanding",
698
+ default: false,
699
+ },
700
+ nsfw_checker: {
701
+ type: "boolean",
702
+ description: "Enable NSFW content filtering",
703
+ default: false,
677
704
  },
678
705
  callBackUrl: {
679
706
  type: "string",
@@ -1211,70 +1238,41 @@ class KieAiMcpServer {
1211
1238
  },
1212
1239
  },
1213
1240
  {
1214
- name: "openai_4o_image",
1215
- description: "Generate images using OpenAI GPT-4o models (unified tool for text-to-image, image editing, and image variants)",
1241
+ name: "gpt_image_2",
1242
+ description: "Generate images using GPT Image 2 (text-to-image and image-to-image with up to 16 reference images)",
1216
1243
  inputSchema: {
1217
1244
  type: "object",
1218
1245
  properties: {
1219
1246
  prompt: {
1220
1247
  type: "string",
1221
- description: "Text prompt describing the desired image (max 5000 characters)",
1222
- maxLength: 5000,
1248
+ description: "Text prompt describing the desired image (max 20000 characters)",
1249
+ maxLength: 20000,
1223
1250
  },
1224
- filesUrl: {
1251
+ input_urls: {
1225
1252
  type: "array",
1226
- description: "Array of up to 5 image URLs for editing or variants",
1227
- items: {
1228
- type: "string",
1229
- format: "uri",
1230
- },
1231
- maxItems: 5,
1253
+ description: "Array of up to 16 image URLs for image-to-image mode. Omit for text-to-image.",
1254
+ items: { type: "string", format: "uri" },
1255
+ maxItems: 16,
1232
1256
  },
1233
- size: {
1257
+ aspect_ratio: {
1234
1258
  type: "string",
1235
1259
  description: "Image aspect ratio",
1236
- enum: ["1:1", "3:2", "2:3"],
1237
- default: "1:1",
1238
- },
1239
- nVariants: {
1240
- type: "string",
1241
- description: "Number of image variations to generate",
1242
- enum: ["1", "2", "4"],
1243
- default: "4",
1260
+ enum: ["auto", "1:1", "9:16", "16:9", "4:3", "3:4"],
1261
+ default: "auto",
1244
1262
  },
1245
- maskUrl: {
1263
+ resolution: {
1246
1264
  type: "string",
1247
- description: "Mask image URL for precise editing (black areas will be modified, white areas preserved)",
1248
- format: "uri",
1265
+ description: "Output resolution",
1266
+ enum: ["1K", "2K", "4K"],
1267
+ default: "1K",
1249
1268
  },
1250
1269
  callBackUrl: {
1251
1270
  type: "string",
1252
1271
  description: "Optional: URL for task completion notifications (uses KIE_AI_CALLBACK_URL env var if not provided)",
1253
1272
  format: "uri",
1254
1273
  },
1255
- isEnhance: {
1256
- type: "boolean",
1257
- description: "Enable prompt enhancement for specialized scenarios like 3D renders",
1258
- default: false,
1259
- },
1260
- uploadCn: {
1261
- type: "boolean",
1262
- description: "Route uploads via China servers",
1263
- default: false,
1264
- },
1265
- enableFallback: {
1266
- type: "boolean",
1267
- description: "Enable automatic fallback to backup models if GPT-4o is unavailable",
1268
- default: true,
1269
- },
1270
- fallbackModel: {
1271
- type: "string",
1272
- description: "Backup model to use when fallback is enabled",
1273
- enum: ["GPT_IMAGE_1", "FLUX_MAX"],
1274
- default: "FLUX_MAX",
1275
- },
1276
1274
  },
1277
- required: [],
1275
+ required: ["prompt"],
1278
1276
  },
1279
1277
  },
1280
1278
  {
@@ -1349,57 +1347,135 @@ class KieAiMcpServer {
1349
1347
  },
1350
1348
  {
1351
1349
  name: "wan_video",
1352
- description: "Generate videos using Alibaba Wan 2.5 models (unified tool for both text-to-video and image-to-video)",
1350
+ description: "Generate videos using Alibaba Wan 2.7 (text-to-video, image-to-video, reference-to-video, video-edit with native audio support)",
1353
1351
  inputSchema: {
1354
1352
  type: "object",
1355
1353
  properties: {
1354
+ mode: {
1355
+ type: "string",
1356
+ description: "Generation mode: text-to-video (default), image-to-video, reference-to-video, or video-edit. Auto-detected from parameters if omitted.",
1357
+ enum: [
1358
+ "text-to-video",
1359
+ "image-to-video",
1360
+ "reference-to-video",
1361
+ "video-edit",
1362
+ ],
1363
+ },
1356
1364
  prompt: {
1357
1365
  type: "string",
1358
- description: "Text prompt for video generation (max 800 characters)",
1366
+ description: "Text prompt for video generation (max 5000 characters)",
1359
1367
  minLength: 1,
1360
- maxLength: 800,
1368
+ maxLength: 5000,
1361
1369
  },
1362
- image_url: {
1370
+ negative_prompt: {
1371
+ type: "string",
1372
+ description: "Negative prompt to describe content to avoid (max 500 characters)",
1373
+ maxLength: 500,
1374
+ },
1375
+ audio_url: {
1363
1376
  type: "string",
1364
- description: "URL of input image for image-to-video generation (optional - if not provided, uses text-to-video)",
1377
+ description: "Audio URL for text-to-video with audio (T2V mode only)",
1365
1378
  format: "uri",
1366
1379
  },
1367
- aspect_ratio: {
1380
+ first_frame_url: {
1368
1381
  type: "string",
1369
- description: "Aspect ratio of the generated video (text-to-video only)",
1370
- enum: ["16:9", "9:16", "1:1"],
1371
- default: "16:9",
1382
+ description: "URL of first frame image for image-to-video mode",
1383
+ format: "uri",
1384
+ },
1385
+ last_frame_url: {
1386
+ type: "string",
1387
+ description: "URL of last frame image for image-to-video mode",
1388
+ format: "uri",
1389
+ },
1390
+ first_clip_url: {
1391
+ type: "string",
1392
+ description: "URL of first video clip for image-to-video mode",
1393
+ format: "uri",
1394
+ },
1395
+ driving_audio_url: {
1396
+ type: "string",
1397
+ description: "Audio URL to drive facial expressions (I2V mode)",
1398
+ format: "uri",
1399
+ },
1400
+ reference_image: {
1401
+ type: "array",
1402
+ description: "Reference images for reference-to-video mode (up to 5)",
1403
+ items: { type: "string", format: "uri" },
1404
+ maxItems: 5,
1405
+ },
1406
+ reference_video: {
1407
+ type: "array",
1408
+ description: "Reference videos for reference-to-video mode (up to 5)",
1409
+ items: { type: "string", format: "uri" },
1410
+ maxItems: 5,
1411
+ },
1412
+ reference_voice: {
1413
+ type: "string",
1414
+ description: "Voice reference URL for R2V mode",
1415
+ format: "uri",
1416
+ },
1417
+ first_frame: {
1418
+ type: "string",
1419
+ description: "First frame image URL for R2V mode",
1420
+ format: "uri",
1421
+ },
1422
+ video_url_edit: {
1423
+ type: "string",
1424
+ description: "Video URL to edit (video-edit mode)",
1425
+ format: "uri",
1426
+ },
1427
+ reference_image_edit: {
1428
+ type: "string",
1429
+ description: "Reference image URL for video-edit mode",
1430
+ format: "uri",
1431
+ },
1432
+ audio_setting: {
1433
+ type: "string",
1434
+ description: "Audio handling for video-edit: auto or origin",
1435
+ enum: ["auto", "origin"],
1372
1436
  },
1373
1437
  resolution: {
1374
1438
  type: "string",
1375
- description: "Video resolution - 720p for faster generation, 1080p for higher quality",
1439
+ description: "Video resolution",
1376
1440
  enum: ["720p", "1080p"],
1377
1441
  default: "1080p",
1378
1442
  },
1379
- duration: {
1443
+ ratio: {
1380
1444
  type: "string",
1381
- description: "Duration of video in seconds (image-to-video only)",
1382
- enum: ["5", "10"],
1383
- default: "5",
1445
+ description: "Aspect ratio of the generated video",
1446
+ enum: ["16:9", "9:16", "1:1", "4:3", "3:4"],
1447
+ default: "16:9",
1384
1448
  },
1385
- negative_prompt: {
1386
- type: "string",
1387
- description: "Negative prompt to describe content to avoid (max 500 characters)",
1388
- maxLength: 500,
1389
- default: "",
1449
+ duration: {
1450
+ type: "integer",
1451
+ description: "Duration in seconds (2-15)",
1452
+ minimum: 2,
1453
+ maximum: 15,
1454
+ default: 5,
1390
1455
  },
1391
- enable_prompt_expansion: {
1456
+ prompt_extend: {
1392
1457
  type: "boolean",
1393
- description: "Whether to enable prompt rewriting using LLM (improves short prompts but increases processing time)",
1458
+ description: "Enable prompt rewriting using LLM for better results",
1394
1459
  default: true,
1395
1460
  },
1461
+ watermark: {
1462
+ type: "boolean",
1463
+ description: "Add watermark to generated video",
1464
+ default: false,
1465
+ },
1396
1466
  seed: {
1397
1467
  type: "integer",
1398
- description: "Random seed for reproducible results",
1468
+ description: "Random seed for reproducible results (0-2147483647)",
1469
+ minimum: 0,
1470
+ },
1471
+ nsfw_checker: {
1472
+ type: "boolean",
1473
+ description: "Enable NSFW content filter",
1474
+ default: false,
1399
1475
  },
1400
1476
  callBackUrl: {
1401
1477
  type: "string",
1402
- description: "Optional: URL for task completion notifications (uses KIE_AI_CALLBACK_URL env var if not provided)",
1478
+ description: "Optional: URL for task completion notifications",
1403
1479
  format: "uri",
1404
1480
  },
1405
1481
  },
@@ -1762,6 +1838,89 @@ class KieAiMcpServer {
1762
1838
  required: ["video_url", "image_url"],
1763
1839
  },
1764
1840
  },
1841
+ {
1842
+ name: "happyhorse_video",
1843
+ description: "Generate videos using Alibaba HappyHorse 1.0 (text-to-video, image-to-video, reference-to-video with up to 9 images, video-edit with native audio)",
1844
+ inputSchema: {
1845
+ type: "object",
1846
+ properties: {
1847
+ mode: {
1848
+ type: "string",
1849
+ description: "Generation mode: text-to-video (default), image-to-video, reference-to-video, or video-edit. Auto-detected from parameters if omitted.",
1850
+ enum: [
1851
+ "text-to-video",
1852
+ "image-to-video",
1853
+ "reference-to-video",
1854
+ "video-edit",
1855
+ ],
1856
+ },
1857
+ prompt: {
1858
+ type: "string",
1859
+ description: "Text prompt for video generation (max 5000 characters)",
1860
+ minLength: 1,
1861
+ maxLength: 5000,
1862
+ },
1863
+ image_urls: {
1864
+ type: "array",
1865
+ description: "Input image URL for image-to-video mode (max 1)",
1866
+ items: { type: "string", format: "uri" },
1867
+ maxItems: 1,
1868
+ },
1869
+ reference_image: {
1870
+ type: "array",
1871
+ description: "Reference images for reference-to-video mode (up to 9)",
1872
+ items: { type: "string", format: "uri" },
1873
+ maxItems: 9,
1874
+ },
1875
+ video_url: {
1876
+ type: "string",
1877
+ description: "Video URL to edit (video-edit mode)",
1878
+ format: "uri",
1879
+ },
1880
+ reference_image_edit: {
1881
+ type: "array",
1882
+ description: "Reference images for video-edit mode (up to 5)",
1883
+ items: { type: "string", format: "uri" },
1884
+ maxItems: 5,
1885
+ },
1886
+ audio_setting: {
1887
+ type: "string",
1888
+ description: "Audio handling for video-edit: auto or origin",
1889
+ enum: ["auto", "origin"],
1890
+ },
1891
+ resolution: {
1892
+ type: "string",
1893
+ description: "Video resolution",
1894
+ enum: ["720p", "1080p"],
1895
+ default: "1080p",
1896
+ },
1897
+ aspect_ratio: {
1898
+ type: "string",
1899
+ description: "Aspect ratio of the generated video",
1900
+ enum: ["16:9", "9:16", "1:1", "4:3", "3:4"],
1901
+ default: "16:9",
1902
+ },
1903
+ duration: {
1904
+ type: "integer",
1905
+ description: "Duration in seconds (3-15)",
1906
+ minimum: 3,
1907
+ maximum: 15,
1908
+ default: 5,
1909
+ },
1910
+ seed: {
1911
+ type: "integer",
1912
+ description: "Random seed for reproducible results (0-2147483647)",
1913
+ minimum: 0,
1914
+ },
1915
+ callBackUrl: {
1916
+ type: "string",
1917
+ description: "Optional: URL for task completion notifications",
1918
+ format: "uri",
1919
+ },
1920
+ },
1921
+ required: ["prompt"],
1922
+ },
1923
+ },
1765
1924
  {
1766
1925
  name: "sora_video",
1767
1926
  description: "Generate videos using OpenAI's Sora 2 models (unified tool for text-to-video, image-to-video, and storyboard generation with standard/high quality)",
@@ -1856,14 +2015,16 @@ class KieAiMcpServer {
1856
2015
  return await this.handleKlingAvatar(args);
1857
2016
  case "midjourney_generate":
1858
2017
  return await this.handleMidjourneyGenerate(args);
1859
- case "openai_4o_image":
1860
- return await this.handleOpenAI4oImage(args);
2018
+ case "gpt_image_2":
2019
+ return await this.handleGptImage2(args);
1861
2020
  case "flux_kontext_image":
1862
2021
  return await this.handleFluxKontextImage(args);
1863
2022
  case "runway_aleph_video":
1864
2023
  return await this.handleRunwayAlephVideo(args);
1865
2024
  case "wan_video":
1866
2025
  return await this.handleWanVideo(args);
2026
+ case "happyhorse_video":
2027
+ return await this.handleHappyHorseVideo(args);
1867
2028
  case "topaz_upscale_image":
1868
2029
  return await this.handleTopazUpscaleImage(args);
1869
2030
  case "recraft_remove_background":
@@ -1928,9 +2089,9 @@ class KieAiMcpServer {
1928
2089
  },
1929
2090
  },
1930
2091
  {
1931
- uri: "kie://models/openai-4o-image",
1932
- name: "OpenAI GPT-4o Image",
1933
- description: "Creative variants (up to 4), mask editing, limited aspect ratios",
2092
+ uri: "kie://models/gpt-image-2",
2093
+ name: "GPT Image 2",
2094
+ description: "Text-to-image and image-to-image with up to 16 reference images",
1934
2095
  mimeType: "text/markdown",
1935
2096
  annotations: {
1936
2097
  audience: ["assistant"],
@@ -1960,8 +2121,8 @@ class KieAiMcpServer {
1960
2121
  },
1961
2122
  {
1962
2123
  uri: "kie://models/bytedance-seedance",
1963
- name: "ByteDance Seedance",
1964
- description: "Professional video generation with lite/pro quality modes",
2124
+ name: "ByteDance Seedance 2.0",
2125
+ description: "Multimodal video generation with native audio, image/video/audio references, standard and fast modes",
1965
2126
  mimeType: "text/markdown",
1966
2127
  annotations: {
1967
2128
  audience: ["assistant"],
@@ -1970,8 +2131,18 @@ class KieAiMcpServer {
1970
2131
  },
1971
2132
  {
1972
2133
  uri: "kie://models/wan-video",
1973
- name: "Wan Video 2.5",
1974
- description: "Fast video generation for social media content",
2134
+ name: "Wan 2.7 Video",
2135
+ description: "Multi-mode video generation: T2V, I2V, R2V, video-edit with audio",
2136
+ mimeType: "text/markdown",
2137
+ annotations: {
2138
+ audience: ["assistant"],
2139
+ priority: 0.6,
2140
+ },
2141
+ },
2142
+ {
2143
+ uri: "kie://models/happyhorse-video",
2144
+ name: "HappyHorse 1.0 Video",
2145
+ description: "Multi-mode video: T2V, I2V, R2V (up to 9 refs), video-edit with audio",
1975
2146
  mimeType: "text/markdown",
1976
2147
  annotations: {
1977
2148
  audience: ["assistant"],
@@ -2431,25 +2602,6 @@ class KieAiMcpServer {
2431
2602
  errorMessage = apiData.failMsg;
2432
2603
  }
2433
2604
  }
2434
- else if (localTask?.api_type === "openai-4o-image") {
2435
- // OpenAI 4o Image-specific status mapping
2436
- const successFlag = apiData.successFlag;
2437
- if (successFlag === 1)
2438
- status = "completed";
2439
- else if (successFlag === 2)
2440
- status = "failed";
2441
- else if (successFlag === 0)
2442
- status = "processing";
2443
- // Extract result URLs from OpenAI 4o response
2444
- if (apiData.response?.result_urls &&
2445
- apiData.response.result_urls.length > 0) {
2446
- resultUrl = apiData.response.result_urls[0]; // Use first image URL
2447
- }
2448
- // Extract error message for OpenAI 4o
2449
- if (apiData.errorMessage) {
2450
- errorMessage = apiData.errorMessage;
2451
- }
2452
- }
2453
2605
  else if (localTask?.api_type === "flux-kontext-image") {
2454
2606
  // Flux Kontext Image-specific status mapping
2455
2607
  const successFlag = apiData.successFlag;
@@ -2594,7 +2746,7 @@ class KieAiMcpServer {
2594
2746
  "nano-banana-image",
2595
2747
  "bytedance-seedream-image",
2596
2748
  "qwen-image",
2597
- "openai-4o-image",
2749
+ "gpt-image-2",
2598
2750
  "flux-kontext-image",
2599
2751
  "topaz-upscale",
2600
2752
  "recraft-remove-background",
@@ -2612,6 +2764,7 @@ class KieAiMcpServer {
2612
2764
  "kling-3.0-video",
2613
2765
  "bytedance-seedance-video",
2614
2766
  "wan-video",
2767
+ "happyhorse-video",
2615
2768
  "hailuo",
2616
2769
  "runway-aleph-video",
2617
2770
  ];
@@ -3029,10 +3182,8 @@ class KieAiMcpServer {
3029
3182
  request.callBackUrl = this.getCallbackUrl(request.callBackUrl);
3030
3183
  const response = await this.client.generateByteDanceSeedanceVideo(request);
3031
3184
  if (response.code === 200 && response.data?.taskId) {
3032
- // Determine mode for user feedback
3033
- const isImageToVideo = !!request.image_url;
3034
- const mode = isImageToVideo ? "Image-to-Video" : "Text-to-Video";
3035
- const quality = request.quality || "lite";
3185
+ const mode = request.mode || "standard";
3186
+ const hasFrameInput = !!request.first_frame_url;
3036
3187
  // Store task in database
3037
3188
  await this.db.createTask({
3038
3189
  task_id: response.data.taskId,
@@ -3046,24 +3197,35 @@ class KieAiMcpServer {
3046
3197
  text: JSON.stringify({
3047
3198
  success: true,
3048
3199
  task_id: response.data.taskId,
3049
- message: `ByteDance Seedance ${mode} generation task created successfully`,
3200
+ message: `ByteDance Seedance 2.0 ${mode} generation task created successfully`,
3050
3201
  parameters: {
3051
- mode: mode,
3052
- quality: quality,
3202
+ mode,
3053
3203
  prompt: request.prompt.substring(0, 100) +
3054
3204
  (request.prompt.length > 100 ? "..." : ""),
3055
3205
  aspect_ratio: request.aspect_ratio || "16:9",
3056
3206
  resolution: request.resolution || "720p",
3057
- duration: request.duration || "5",
3058
- ...(isImageToVideo && { image_url: request.image_url }),
3059
- ...(request.end_image_url && {
3060
- end_image_url: request.end_image_url,
3207
+ duration: request.duration || 5,
3208
+ generate_audio: request.generate_audio !== false,
3209
+ ...(hasFrameInput && {
3210
+ first_frame_url: request.first_frame_url,
3211
+ }),
3212
+ ...(request.last_frame_url && {
3213
+ last_frame_url: request.last_frame_url,
3214
+ }),
3215
+ ...(request.reference_image_urls?.length && {
3216
+ reference_images: request.reference_image_urls.length,
3217
+ }),
3218
+ ...(request.reference_video_urls?.length && {
3219
+ reference_videos: request.reference_video_urls.length,
3220
+ }),
3221
+ ...(request.reference_audio_urls?.length && {
3222
+ reference_audios: request.reference_audio_urls.length,
3061
3223
  }),
3062
3224
  },
3063
3225
  next_steps: [
3064
3226
  "Use get_task_status to check generation progress",
3065
3227
  "Task completion will be sent to the provided callback URL",
3066
- `${mode} generation typically takes 2-5 minutes depending on quality and complexity`,
3228
+ `${mode} mode generation typically takes 2-5 minutes depending on duration and complexity`,
3067
3229
  ],
3068
3230
  }, null, 2),
3069
3231
  },
@@ -3078,26 +3240,28 @@ class KieAiMcpServer {
3078
3240
  catch (error) {
3079
3241
  if (error instanceof z.ZodError) {
3080
3242
  return this.formatError("bytedance_seedance_video", error, {
3081
- prompt: "Required: Text prompt for video generation (max 10000 characters)",
3082
- image_url: "Optional: URL of input image for image-to-video mode",
3083
- quality: "Optional: Model quality - lite (faster) or pro (higher quality, default: lite)",
3243
+ prompt: "Required: Text prompt for video generation (3-20000 characters)",
3244
+ mode: 'Optional: Generation mode "standard" or "fast" (default: standard)',
3245
+ first_frame_url: "Optional: URL of image to use as first frame",
3246
+ last_frame_url: "Optional: URL of image to use as last frame",
3247
+ reference_image_urls: "Optional: Reference images for style guidance (up to 9)",
3248
+ reference_video_urls: "Optional: Reference videos for motion guidance (up to 3)",
3249
+ reference_audio_urls: "Optional: Reference audio for sound-guided generation (up to 3)",
3084
3250
  aspect_ratio: "Optional: Video aspect ratio (default: 16:9)",
3085
- resolution: "Optional: Video resolution - 480p/720p/1080p (default: 720p)",
3086
- duration: "Optional: Video duration in seconds 2-12 (default: 5)",
3087
- camera_fixed: "Optional: Fix camera position (default: false)",
3088
- seed: "Optional: Random seed for reproducible results (default: -1 for random)",
3089
- enable_safety_checker: "Optional: Enable content safety checking (default: true)",
3090
- end_image_url: "Optional: URL of ending image (image-to-video only)",
3091
- callBackUrl: "Optional: URL for task completion notifications (uses KIE_AI_CALLBACK_URL env var if not provided)",
3251
+ resolution: 'Optional: Video resolution "480p" or "720p" (default: 720p)',
3252
+ duration: "Optional: Video duration in seconds 4-15 (default: 5)",
3253
+ generate_audio: "Optional: Generate native audio (default: true)",
3254
+ web_search: "Optional: Enable web search for prompt enhancement (default: false)",
3255
+ nsfw_checker: "Optional: Enable NSFW content filtering (default: false)",
3256
+ callBackUrl: "Optional: URL for task completion notifications",
3092
3257
  });
3093
3258
  }
3094
3259
  return this.formatError("bytedance_seedance_video", error, {
3095
- prompt: "Required: Text prompt for video generation (max 10000 characters)",
3096
- image_url: "Optional: URL of input image for image-to-video mode",
3097
- quality: "Optional: Model quality - lite or pro",
3260
+ prompt: "Required: Text prompt for video generation",
3261
+ mode: 'Optional: "standard" or "fast"',
3098
3262
  aspect_ratio: "Optional: Video aspect ratio",
3099
- resolution: "Optional: Video resolution",
3100
- duration: "Optional: Video duration in seconds 2-12",
3263
+ resolution: 'Optional: "480p" or "720p"',
3264
+ duration: "Optional: Duration in seconds 4-15",
3101
3265
  callBackUrl: "Optional: URL for task completion notifications",
3102
3266
  });
3103
3267
  }
@@ -3653,28 +3817,18 @@ class KieAiMcpServer {
3653
3817
  });
3654
3818
  }
3655
3819
  }
3656
- async handleOpenAI4oImage(args) {
3820
+ async handleGptImage2(args) {
3657
3821
  try {
3658
- const request = OpenAI4oImageSchema.parse(args);
3659
- // Use intelligent callback URL fallback
3822
+ const request = GptImage2Schema.parse(args);
3660
3823
  request.callBackUrl = this.getCallbackUrl(request.callBackUrl);
3661
- const response = await this.client.generateOpenAI4oImage(request);
3824
+ const response = await this.client.generateGptImage2(request);
3662
3825
  if (response.code === 200 && response.data?.taskId) {
3663
- // Determine mode for user feedback
3664
- const hasPrompt = !!request.prompt;
3665
- const hasImages = request.filesUrl && request.filesUrl.length > 0;
3666
- const hasMask = !!request.maskUrl;
3667
- let modeDisplay = "Text-to-Image";
3668
- if (hasMask && hasImages) {
3669
- modeDisplay = "Image Editing";
3670
- }
3671
- else if (hasImages && !hasMask) {
3672
- modeDisplay = "Image Variants";
3673
- }
3674
- // Store task in database
3826
+ const mode = request.input_urls?.length
3827
+ ? "Image-to-Image"
3828
+ : "Text-to-Image";
3675
3829
  await this.db.createTask({
3676
3830
  task_id: response.data.taskId,
3677
- api_type: "openai-4o-image",
3831
+ api_type: "gpt-image-2",
3678
3832
  status: "pending",
3679
3833
  });
3680
3834
  return {
@@ -3684,32 +3838,85 @@ class KieAiMcpServer {
3684
3838
  text: JSON.stringify({
3685
3839
  success: true,
3686
3840
  task_id: response.data.taskId,
3687
- message: `OpenAI 4o Image ${modeDisplay} task created successfully`,
3841
+ message: `GPT Image 2 ${mode} task created successfully`,
3688
3842
  parameters: {
3689
- mode: modeDisplay,
3690
- prompt: request.prompt
3691
- ? request.prompt.substring(0, 100) +
3692
- (request.prompt.length > 100 ? "..." : "")
3693
- : undefined,
3694
- size: request.size || "1:1",
3695
- n_variants: request.nVariants || "4",
3696
- is_enhance: request.isEnhance || false,
3697
- enable_fallback: request.enableFallback !== false,
3698
- fallback_model: request.fallbackModel || "FLUX_MAX",
3699
- ...(hasImages && {
3700
- files_url: request.filesUrl,
3701
- }),
3702
- ...(hasMask && {
3703
- mask_url: request.maskUrl,
3843
+ mode,
3844
+ prompt: request.prompt.substring(0, 100) +
3845
+ (request.prompt.length > 100 ? "..." : ""),
3846
+ aspect_ratio: request.aspect_ratio || "auto",
3847
+ resolution: request.resolution || "1K",
3848
+ ...(request.input_urls && {
3849
+ input_urls: request.input_urls,
3704
3850
  }),
3705
3851
  },
3706
3852
  next_steps: [
3707
3853
  `Use get_task_status with task_id: ${response.data.taskId} to check progress`,
3708
3854
  'Generated images will be available when status is "completed"',
3709
3855
  ],
3710
- usage_examples: [
3711
- `get_task_status: {"task_id": "${response.data.taskId}"}`,
3712
- `list_tasks: {"limit": 10}`,
3856
+ }, null, 2),
3857
+ },
3858
+ ],
3859
+ };
3860
+ }
3861
+ else {
3862
+ throw new Error(response.msg || "Failed to create GPT Image 2 task");
3863
+ }
3864
+ }
3865
+ catch (error) {
3866
+ if (error instanceof z.ZodError) {
3867
+ return this.formatError("gpt_image_2", error, {
3868
+ prompt: "Required: Text prompt describing the desired image (max 20000 chars)",
3869
+ input_urls: "Optional: Array of up to 16 image URLs for image-to-image mode",
3870
+ aspect_ratio: "Optional: auto, 1:1, 9:16, 16:9, 4:3, 3:4 (default: auto)",
3871
+ resolution: "Optional: 1K, 2K, 4K (default: 1K)",
3872
+ });
3873
+ }
3874
+ return this.formatError("gpt_image_2", error, {
3875
+ prompt: "Required: Text prompt describing the desired image (max 20000 chars)",
3876
+ input_urls: "Optional: Array of up to 16 image URLs for image-to-image mode",
3877
+ aspect_ratio: "Optional: auto, 1:1, 9:16, 16:9, 4:3, 3:4 (default: auto)",
3878
+ resolution: "Optional: 1K, 2K, 4K (default: 1K)",
3879
+ });
3880
+ }
3881
+ }
3882
+ async handleHappyHorseVideo(args) {
3883
+ try {
3884
+ const request = HappyHorseVideoSchema.parse(args);
3885
+ request.callBackUrl = this.getCallbackUrl(request.callBackUrl);
3886
+ const response = await this.client.generateHappyHorseVideo(request);
3887
+ if (response.code === 200 && response.data?.taskId) {
3888
+ const mode = request.mode ||
3889
+ (request.video_url
3890
+ ? "video-edit"
3891
+ : request.reference_image?.length
3892
+ ? "reference-to-video"
3893
+ : request.image_urls?.length
3894
+ ? "image-to-video"
3895
+ : "text-to-video");
3896
+ await this.db.createTask({
3897
+ task_id: response.data.taskId,
3898
+ api_type: "happyhorse-video",
3899
+ status: "pending",
3900
+ });
3901
+ return {
3902
+ content: [
3903
+ {
3904
+ type: "text",
3905
+ text: JSON.stringify({
3906
+ success: true,
3907
+ task_id: response.data.taskId,
3908
+ message: `HappyHorse 1.0 ${mode} task created successfully`,
3909
+ parameters: {
3910
+ mode,
3911
+ prompt: request.prompt.substring(0, 100) +
3912
+ (request.prompt.length > 100 ? "..." : ""),
3913
+ resolution: request.resolution || "1080p",
3914
+ aspect_ratio: request.aspect_ratio || "16:9",
3915
+ duration: request.duration || 5,
3916
+ },
3917
+ next_steps: [
3918
+ `Use get_task_status with task_id: ${response.data.taskId} to check progress`,
3919
+ 'Video will be available when status is "completed"',
3713
3920
  ],
3714
3921
  }, null, 2),
3715
3922
  },
@@ -3717,35 +3924,22 @@ class KieAiMcpServer {
3717
3924
  };
3718
3925
  }
3719
3926
  else {
3720
- throw new Error(response.msg || "Failed to create OpenAI 4o Image task");
3927
+ throw new Error(response.msg || "Failed to create HappyHorse task");
3721
3928
  }
3722
3929
  }
3723
3930
  catch (error) {
3724
3931
  if (error instanceof z.ZodError) {
3725
- return this.formatError("openai_4o_image", error, {
3726
- prompt: "Optional: Text prompt describing the desired image (max 5000 chars)",
3727
- filesUrl: "Optional: Array of up to 5 image URLs for editing or variants",
3728
- size: "Required: Image aspect ratio (1:1, 3:2, 2:3, default: 1:1)",
3729
- nVariants: "Optional: Number of image variations (1, 2, 4, default: 4)",
3730
- maskUrl: "Optional: Mask image URL for precise editing (black=edit, white=preserve)",
3731
- callBackUrl: "Optional: Webhook URL for completion notifications",
3732
- isEnhance: "Optional: Enable prompt enhancement for specialized scenarios (default: false)",
3733
- uploadCn: "Optional: Route uploads via China servers (default: false)",
3734
- enableFallback: "Optional: Enable automatic fallback to backup models (default: true)",
3735
- fallbackModel: "Optional: Backup model choice (GPT_IMAGE_1, FLUX_MAX, default: FLUX_MAX)",
3932
+ return this.formatError("happyhorse_video", error, {
3933
+ prompt: "Required: Text prompt for video generation (max 5000 chars)",
3934
+ mode: "Optional: text-to-video, image-to-video, reference-to-video, video-edit",
3935
+ image_urls: "I2V: Single image URL",
3936
+ reference_image: "R2V: Up to 9 reference image URLs",
3937
+ video_url: "Video Edit: Video URL to edit",
3736
3938
  });
3737
3939
  }
3738
- return this.formatError("openai_4o_image", error, {
3739
- prompt: "Optional: Text prompt describing the desired image (max 5000 chars)",
3740
- filesUrl: "Optional: Array of up to 5 image URLs for editing or variants",
3741
- size: "Required: Image aspect ratio (1:1, 3:2, 2:3, default: 1:1)",
3742
- nVariants: "Optional: Number of image variations (1, 2, 4, default: 4)",
3743
- maskUrl: "Optional: Mask image URL for precise editing (black=edit, white=preserve)",
3744
- callBackUrl: "Optional: Webhook URL for completion notifications",
3745
- isEnhance: "Optional: Enable prompt enhancement for specialized scenarios (default: false)",
3746
- uploadCn: "Optional: Route uploads via China servers (default: false)",
3747
- enableFallback: "Optional: Enable automatic fallback to backup models (default: true)",
3748
- fallbackModel: "Optional: Backup model choice (GPT_IMAGE_1, FLUX_MAX, default: FLUX_MAX)",
3940
+ return this.formatError("happyhorse_video", error, {
3941
+ prompt: "Required: Text prompt for video generation (max 5000 chars)",
3942
+ mode: "Optional: text-to-video, image-to-video, reference-to-video, video-edit",
3749
3943
  });
3750
3944
  }
3751
3945
  }
@@ -3915,16 +4109,20 @@ class KieAiMcpServer {
3915
4109
  }
3916
4110
  async handleWanVideo(args) {
3917
4111
  try {
3918
- const request = WanVideoSchema.parse(args);
3919
- // Use intelligent callback URL fallback
4112
+ const request = Wan27VideoSchema.parse(args);
3920
4113
  request.callBackUrl = this.getCallbackUrl(request.callBackUrl);
3921
4114
  const response = await this.client.generateWanVideo(request);
3922
4115
  if (response.code === 200 && response.data?.taskId) {
3923
- // Determine mode for user feedback
3924
- const isImageToVideo = !!request.image_url;
3925
- const mode = isImageToVideo ? "Image-to-Video" : "Text-to-Video";
3926
- const resolution = request.resolution || "1080p";
3927
- // Store task in database
4116
+ const mode = request.mode ||
4117
+ (request.video_url_edit
4118
+ ? "video-edit"
4119
+ : request.reference_image?.length || request.reference_video?.length
4120
+ ? "reference-to-video"
4121
+ : request.first_frame_url ||
4122
+ request.last_frame_url ||
4123
+ request.first_clip_url
4124
+ ? "image-to-video"
4125
+ : "text-to-video");
3928
4126
  await this.db.createTask({
3929
4127
  task_id: response.data.taskId,
3930
4128
  api_type: "wan-video",
@@ -3937,27 +4135,18 @@ class KieAiMcpServer {
3937
4135
  text: JSON.stringify({
3938
4136
  success: true,
3939
4137
  task_id: response.data.taskId,
3940
- message: `Alibaba Wan 2.5 ${mode} generation task created successfully`,
4138
+ message: `Wan 2.7 ${mode} task created successfully`,
3941
4139
  parameters: {
3942
- mode: mode,
4140
+ mode,
3943
4141
  prompt: request.prompt.substring(0, 100) +
3944
4142
  (request.prompt.length > 100 ? "..." : ""),
3945
- resolution: resolution,
3946
- negative_prompt: request.negative_prompt || "",
3947
- enable_prompt_expansion: request.enable_prompt_expansion !== false,
3948
- ...(request.seed !== undefined && { seed: request.seed }),
3949
- ...(isImageToVideo && {
3950
- image_url: request.image_url,
3951
- duration: request.duration || "5",
3952
- }),
3953
- ...(!isImageToVideo && {
3954
- aspect_ratio: request.aspect_ratio || "16:9",
3955
- }),
4143
+ resolution: request.resolution || "1080p",
4144
+ ratio: request.ratio || "16:9",
4145
+ duration: request.duration || 5,
3956
4146
  },
3957
4147
  next_steps: [
3958
- "Use get_task_status to check generation progress",
3959
- "Task completion will be sent to the provided callback URL",
3960
- `${mode} generation typically takes 2-6 minutes depending on resolution and complexity`,
4148
+ `Use get_task_status with task_id: ${response.data.taskId} to check progress`,
4149
+ 'Video will be available when status is "completed"',
3961
4150
  ],
3962
4151
  }, null, 2),
3963
4152
  },
@@ -3965,29 +4154,23 @@ class KieAiMcpServer {
3965
4154
  };
3966
4155
  }
3967
4156
  else {
3968
- throw new Error(response.msg || "Failed to create Wan 2.5 video generation task");
4157
+ throw new Error(response.msg || "Failed to create Wan 2.7 video task");
3969
4158
  }
3970
4159
  }
3971
4160
  catch (error) {
3972
4161
  if (error instanceof z.ZodError) {
3973
4162
  return this.formatError("wan_video", error, {
3974
- prompt: "Required: Text prompt for video generation (max 800 characters)",
3975
- image_url: "Optional: URL of input image for image-to-video mode",
3976
- aspect_ratio: "Optional: Video aspect ratio for text-to-video (16:9, 9:16, 1:1, default: 16:9)",
3977
- resolution: "Optional: Video resolution - 720p or 1080p (default: 1080p)",
3978
- duration: "Optional: Video duration for image-to-video - 5 or 10 seconds (default: 5)",
3979
- negative_prompt: "Optional: Negative prompt to describe content to avoid (max 500 characters)",
3980
- enable_prompt_expansion: "Optional: Enable prompt rewriting using LLM (default: true)",
3981
- seed: "Optional: Random seed for reproducible results",
3982
- callBackUrl: "Optional: URL for task completion notifications (uses KIE_AI_CALLBACK_URL env var if not provided)",
4163
+ prompt: "Required: Text prompt for video generation (max 5000 chars)",
4164
+ mode: "Optional: text-to-video, image-to-video, reference-to-video, video-edit",
4165
+ first_frame_url: "I2V: First frame image URL",
4166
+ last_frame_url: "I2V: Last frame image URL",
4167
+ reference_image: "R2V: Up to 5 reference image URLs",
4168
+ video_url_edit: "Video Edit: Video URL to edit",
3983
4169
  });
3984
4170
  }
3985
4171
  return this.formatError("wan_video", error, {
3986
4172
  prompt: "Required: Text prompt for video generation",
3987
- image_url: "Optional: URL of input image",
3988
- aspect_ratio: "Optional: Video aspect ratio",
3989
- resolution: "Optional: Video resolution",
3990
- callBackUrl: "Optional: URL for task completion notifications",
4173
+ mode: "Optional: text-to-video, image-to-video, reference-to-video, video-edit",
3991
4174
  });
3992
4175
  }
3993
4176
  }
@@ -4617,6 +4800,12 @@ class KieAiMcpServer {
4617
4800
  category: "video",
4618
4801
  quality: "standard",
4619
4802
  },
4803
+ {
4804
+ name: "happyhorse_video",
4805
+ status: "available",
4806
+ category: "video",
4807
+ quality: "standard",
4808
+ },
4620
4809
  {
4621
4810
  name: "runway_aleph",
4622
4811
  status: "available",
@@ -4636,7 +4825,7 @@ class KieAiMcpServer {
4636
4825
  quality: "professional",
4637
4826
  },
4638
4827
  {
4639
- name: "openai_4o_image",
4828
+ name: "gpt_image_2",
4640
4829
  status: "available",
4641
4830
  category: "image",
4642
4831
  quality: "professional",
@@ -4850,10 +5039,10 @@ The system automatically detects user intent:
4850
5039
  ## 🔧 Intelligent Parameter Selection
4851
5040
 
4852
5041
  ### **Video Parameters**
4853
- - **ByteDance Seedance**:
4854
- - Default: \`quality: "lite"\`, \`resolution: "720p"\`
4855
- - High Quality: \`quality: "pro"\`, \`resolution: "1080p"\`
4856
- - Professional 720p: \`quality: "pro"\`, \`resolution: "720p"\`
5042
+ - **ByteDance Seedance 2.0**:
5043
+ - Default: \`mode: "standard"\`, \`resolution: "720p"\`, \`generate_audio: true\`
5044
+ - Fast/Iterative: \`mode: "fast"\`, \`resolution: "480p"\`
5045
+ - Higher Quality: \`mode: "standard"\`, \`resolution: "720p"\`
4857
5046
 
4858
5047
  - **Veo3**:
4859
5048
  - Default: \`model: "veo3_fast"\`
@@ -5001,7 +5190,7 @@ These guidelines ensure optimal balance between quality requirements and cost ma
5001
5190
  | Model | Max Resolution | Quality Modes | Duration | Speed | Key Strengths |
5002
5191
  |-------|---------------|---------------|----------|-------|---------------|
5003
5192
  | **Google Veo3** | 1080p | veo3/veo3_fast | Default | Medium | Premium cinematic quality, 1080p support |
5004
- | **ByteDance Seedance** | 1080p | lite/pro | 2-12s | Medium | Professional standard, quality modes |
5193
+ | **ByteDance Seedance 2.0** | 720p | standard/fast | 4-15s | Medium | Multimodal refs, native audio, adaptive aspect |
5005
5194
  | **Wan Video 2.5** | 1080p | Single | 5-10s | Fast | Quick generation, social media |
5006
5195
  | **Runway Aleph** | 1080p | Single | Source | Medium | Video-to-video editing, style transfer |
5007
5196
 
@@ -5009,32 +5198,33 @@ These guidelines ensure optimal balance between quality requirements and cost ma
5009
5198
 
5010
5199
  ### Default Settings (Cost-Effective)
5011
5200
  - **Resolution**: 720p (unless user requests high quality)
5012
- - **Quality Mode**: lite/fast (unless user requests high quality)
5013
- - **Model**: ByteDance Seedance lite as default
5201
+ - **Quality Mode**: standard/fast (unless user requests "fast" explicitly)
5202
+ - **Model**: ByteDance Seedance 2.0 standard as default
5014
5203
 
5015
5204
  ### High Quality Upgrades
5016
- - **User says "high quality"**: Pro models + 1080p
5017
- - **User says "high quality in 720p"**: Pro models + 720p
5205
+ - **User says "high quality"**: Standard mode + 720p (already default)
5018
5206
  - **User says "cinematic"**: Veo3 model
5019
- - **User says "fast/quick"**: Lite models + 720p (already default)
5207
+ - **User says "fast/quick"**: Seedance fast mode + 480p
5020
5208
 
5021
5209
  ## Use Case Recommendations
5022
5210
 
5023
5211
  - **Cinematic/Premium Content**: Veo3 (model: "veo3")
5024
- - **Professional/Commercial**: ByteDance Seedance (quality: "pro")
5025
- - **Social Media/Fast**: Wan Video 2.5 or ByteDance lite
5212
+ - **Professional/Commercial**: ByteDance Seedance 2.0 (mode: "standard")
5213
+ - **Social Media/Fast**: ByteDance Seedance 2.0 fast or Wan Video 2.5
5214
+ - **Multimodal (refs + audio)**: ByteDance Seedance 2.0 with reference URLs
5026
5215
  - **Video Editing**: Runway Aleph (existing video transformation)
5027
5216
 
5028
5217
  ## Parameter Mapping
5029
5218
 
5030
5219
  ### Input Methods
5031
5220
  - **Text-to-Video**: All models (prompt only)
5032
- - **Image-to-Video**: Veo3 (imageUrls), ByteDance (image_url), Wan (image_url)
5221
+ - **Image-to-Video**: Veo3 (imageUrls), Seedance (first_frame_url), Wan (image_url)
5033
5222
  - **Video-to-Video**: Runway Aleph (videoUrl)
5223
+ - **Multimodal Refs**: Seedance 2.0 (reference_image/video/audio_urls)
5034
5224
 
5035
5225
  ### Quality Control
5036
5226
  - **Veo3**: model selection (veo3 vs veo3_fast)
5037
- - **ByteDance**: quality parameter (lite vs pro) + resolution
5227
+ - **Seedance 2.0**: mode (standard vs fast) + resolution
5038
5228
  - **Wan**: resolution parameter only
5039
5229
  - **Runway**: implicit (no quality settings)
5040
5230
 
@@ -5053,7 +5243,7 @@ These guidelines ensure optimal balance between quality requirements and cost ma
5053
5243
  ### **CRITICAL COST CONTROL RULES**
5054
5244
  - **Resolution**: ALWAYS use \`"720p"\` unless user explicitly requests high quality
5055
5245
  - **Quality Level**: ALWAYS use **lite/fast** versions unless user requests "high quality"
5056
- - **Model Selection**: bytedance_seedance_video with \`quality: "lite"\` as default
5246
+ - **Model Selection**: bytedance_seedance_video with \`mode: "standard"\` as default
5057
5247
 
5058
5248
  ### **Quality Upgrade Logic**
5059
5249
 
@@ -5151,15 +5341,16 @@ These guidelines ensure optimal balance between quality requirements and cost ma
5151
5341
  "bytedance-seedream": "bytedance_seedream-v4-text-to-image.md",
5152
5342
  "qwen-image": "qwen_text-to-image.md",
5153
5343
  "flux-kontext": "flux_kontext_image.md",
5154
- "openai-4o-image": "openai_4o-image.md",
5344
+ "gpt-image-2": "gpt_image-2.md",
5155
5345
  "nano-banana": "google_nano-banana.md",
5156
5346
  "topaz-upscale": "topaz_image-upscale.md",
5157
5347
  "recraft-bg-removal": "recraft_remove_background.md",
5158
5348
  "ideogram-reframe": "ideogram_reframe_image.md",
5159
5349
  // Video models
5160
5350
  veo3: "google_veo3-text-to-image.md",
5161
- "bytedance-seedance": "bytedance_seedance-v1-lite-text-to-video.md",
5162
- "wan-video": "wan_2-5-text-to-video.md",
5351
+ "bytedance-seedance": "bytedance_seedance-2.md",
5352
+ "wan-video": "wan_2-7-text-to-video.md",
5353
+ "happyhorse-video": "happyhorse_text-to-video.md",
5163
5354
  "runway-aleph": "runway_aleph_video.md",
5164
5355
  "kling-v2-1": "kling_v2-1-pro.md",
5165
5356
  "kling-v2-5": "kling_v2-5-turbo-text-to-video-pro.md",