@henjicc/ai-sdk 0.8.0 → 0.10.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.
Files changed (704) hide show
  1. package/CHANGELOG.md +275 -211
  2. package/README.md +580 -577
  3. package/dist/capabilities/speech-recognition/bailian/module.js +40 -26
  4. package/dist/capabilities/speech-recognition/bailian/parse.js +9 -2
  5. package/dist/capabilities/speech-recognition/bailian/presets.d.ts +9 -1
  6. package/dist/capabilities/speech-recognition/bailian/presets.js +7 -2
  7. package/dist/capabilities/speech-recognition/bailian/realtime/presets.d.ts +2 -1
  8. package/dist/capabilities/speech-recognition/bailian/realtime/presets.js +2 -0
  9. package/dist/capabilities/speech-recognition/bailian/types.d.ts +2 -0
  10. package/dist/capabilities/speech-recognition/bailian/upload.js +11 -58
  11. package/dist/capabilities/speech-recognition/index.d.ts +5 -0
  12. package/dist/capabilities/speech-recognition/siliconflow/presets.d.ts +2 -3
  13. package/dist/capabilities/speech-recognition/siliconflow/presets.js +0 -2
  14. package/dist/capabilities/translation/bailian/types.d.ts +3 -0
  15. package/dist/capabilities/translation/bailian/types.js +6 -4
  16. package/dist/catalog/apimart/flux-3-image.model.d.ts +3 -0
  17. package/dist/catalog/apimart/flux-3-image.model.js +62 -0
  18. package/dist/catalog/apimart/flux-3-video.model.d.ts +3 -0
  19. package/dist/catalog/apimart/flux-3-video.model.js +120 -0
  20. package/dist/catalog/apimart/gemini-omni-1.2-flash.model.d.ts +3 -0
  21. package/dist/catalog/apimart/gemini-omni-1.2-flash.model.js +175 -0
  22. package/dist/catalog/apimart/gemini-omni-flash.model.js +30 -37
  23. package/dist/catalog/apimart/gpt-image-2.5.model.js +1 -1
  24. package/dist/catalog/apimart/gpt-image-2.6.model.d.ts +3 -0
  25. package/dist/catalog/apimart/gpt-image-2.6.model.js +103 -0
  26. package/dist/catalog/apimart/gpt-image-2.model.js +1 -1
  27. package/dist/catalog/apimart/grok-imagine-2.0.model.js +1 -1
  28. package/dist/catalog/apimart/grok-imagine-video-1.5.model.d.ts +3 -0
  29. package/dist/catalog/apimart/grok-imagine-video-1.5.model.js +85 -0
  30. package/dist/catalog/apimart/happyhorse-1.1.model.d.ts +3 -0
  31. package/dist/catalog/apimart/happyhorse-1.1.model.js +78 -0
  32. package/dist/catalog/apimart/kling-3.0-omni.model.js +12 -2
  33. package/dist/catalog/apimart/kling-3.0-turbo.model.js +5 -2
  34. package/dist/catalog/apimart/kling-3.0.model.js +1 -1
  35. package/dist/catalog/apimart/kling-4.0.model.d.ts +3 -0
  36. package/dist/catalog/apimart/kling-4.0.model.js +149 -0
  37. package/dist/catalog/apimart/midjourney-video.model.js +31 -32
  38. package/dist/catalog/apimart/midjourney.model.js +11 -1
  39. package/dist/catalog/apimart/minimax-h3-max.model.d.ts +3 -0
  40. package/dist/catalog/apimart/minimax-h3-max.model.js +101 -0
  41. package/dist/catalog/apimart/minimax-h3.model.js +8 -3
  42. package/dist/catalog/apimart/nano-banana-2-lite.model.js +1 -1
  43. package/dist/catalog/apimart/nano-banana-2.1.model.d.ts +2 -0
  44. package/dist/catalog/apimart/nano-banana-2.1.model.js +49 -0
  45. package/dist/catalog/apimart/nano-banana-2.model.js +1 -1
  46. package/dist/catalog/apimart/nano-banana-pro.model.js +1 -1
  47. package/dist/catalog/apimart/qwen-image-3.0.model.js +1 -1
  48. package/dist/catalog/apimart/seedance-2.0-fast.model.js +1 -1
  49. package/dist/catalog/apimart/seedance-2.0-mini.model.js +4 -4
  50. package/dist/catalog/apimart/seedance-2.0.model.js +1 -1
  51. package/dist/catalog/apimart/seedance-2.5.model.js +27 -5
  52. package/dist/catalog/apimart/seedream-5.0-flash.model.d.ts +3 -0
  53. package/dist/catalog/apimart/seedream-5.0-flash.model.js +52 -0
  54. package/dist/catalog/apimart/seedream-5.0-lite.model.js +4 -4
  55. package/dist/catalog/apimart/seedream-5.0-pro.model.js +1 -1
  56. package/dist/catalog/apimart/veo-3.1.model.d.ts +3 -0
  57. package/dist/catalog/apimart/veo-3.1.model.js +132 -0
  58. package/dist/catalog/apimart/wan-2.7-image.model.d.ts +3 -0
  59. package/dist/catalog/apimart/wan-2.7-image.model.js +80 -0
  60. package/dist/catalog/apimart/wan-3.0.model.d.ts +3 -0
  61. package/dist/catalog/apimart/wan-3.0.model.js +101 -0
  62. package/dist/catalog/apimart/z-image-turbo.model.js +1 -1
  63. package/dist/catalog/audio/tts-common.d.ts +2 -1
  64. package/dist/catalog/audio/tts-common.js +5 -1
  65. package/dist/catalog/bailian/cosyvoice-v3.5.model.js +1 -1
  66. package/dist/catalog/bailian/minimax-h3.model.d.ts +3 -0
  67. package/dist/catalog/bailian/minimax-h3.model.js +95 -0
  68. package/dist/catalog/bailian/minimax-speech-2.8.model.js +1 -1
  69. package/dist/catalog/bailian/qwen-audio-3.1-tts-flash.model.js +14 -3
  70. package/dist/catalog/bailian/qwen-audio-3.1-tts-plus.model.d.ts +2 -0
  71. package/dist/catalog/bailian/qwen-audio-3.1-tts-plus.model.js +44 -0
  72. package/dist/catalog/bailian/qwen-image-3.0.model.js +1 -1
  73. package/dist/catalog/bailian/wan-3.0.model.d.ts +3 -0
  74. package/dist/catalog/bailian/wan-3.0.model.js +104 -0
  75. package/dist/catalog/bailian/z-image-turbo.model.js +1 -1
  76. package/dist/catalog/consumer-contract.d.ts +16 -1
  77. package/dist/catalog/consumer-contract.js +31 -0
  78. package/dist/catalog/continuation.d.ts +20 -0
  79. package/dist/catalog/continuation.js +41 -0
  80. package/dist/catalog/fal/bria-creative-upscale.model.js +1 -1
  81. package/dist/catalog/fal/eleven-v3-tts.model.js +1 -1
  82. package/dist/catalog/fal/eleven-v4-tts.model.d.ts +2 -0
  83. package/dist/catalog/fal/eleven-v4-tts.model.js +38 -0
  84. package/dist/catalog/fal/flux-3-video.model.d.ts +2 -0
  85. package/dist/catalog/fal/flux-3-video.model.js +187 -0
  86. package/dist/catalog/fal/flux-3.model.d.ts +2 -0
  87. package/dist/catalog/fal/flux-3.model.js +69 -0
  88. package/dist/catalog/fal/gemini-omni-1.2-flash.model.d.ts +2 -0
  89. package/dist/catalog/fal/gemini-omni-1.2-flash.model.js +129 -0
  90. package/dist/catalog/fal/gemini-omni-flash.model.js +1 -1
  91. package/dist/catalog/fal/gpt-image-2.5.model.js +1 -1
  92. package/dist/catalog/fal/gpt-image-2.6.model.d.ts +2 -0
  93. package/dist/catalog/fal/gpt-image-2.6.model.js +97 -0
  94. package/dist/catalog/fal/gpt-image-2.model.js +1 -1
  95. package/dist/catalog/fal/grok-imagine-2.0.model.js +1 -1
  96. package/dist/catalog/fal/grok-imagine-video-1.5.model.d.ts +2 -0
  97. package/dist/catalog/fal/grok-imagine-video-1.5.model.js +121 -0
  98. package/dist/catalog/fal/hailuo-02.model.js +8 -4
  99. package/dist/catalog/fal/hailuo-2.3.model.js +1 -1
  100. package/dist/catalog/fal/ic-light-v2.model.js +1 -1
  101. package/dist/catalog/fal/ideogram-upscale.model.js +1 -1
  102. package/dist/catalog/fal/kling-3.0-omni.model.js +1 -1
  103. package/dist/catalog/fal/kling-3.0-turbo.model.js +5 -2
  104. package/dist/catalog/fal/kling-3.0.model.js +4 -1
  105. package/dist/catalog/fal/kling-4.0-flash.model.d.ts +2 -0
  106. package/dist/catalog/fal/kling-4.0-flash.model.js +132 -0
  107. package/dist/catalog/fal/kling-4.0.model.d.ts +2 -0
  108. package/dist/catalog/fal/kling-4.0.model.js +169 -0
  109. package/dist/catalog/fal/kling-image-o1.model.js +1 -1
  110. package/dist/catalog/fal/kling-video-o1.model.js +18 -7
  111. package/dist/catalog/fal/kling-video-v2.6-pro.model.js +3 -2
  112. package/dist/catalog/fal/ltx-2.3.model.d.ts +2 -0
  113. package/dist/catalog/fal/ltx-2.3.model.js +223 -0
  114. package/dist/catalog/fal/ltx-2.model.js +2 -1
  115. package/dist/catalog/fal/minimax-h3-max.model.d.ts +2 -0
  116. package/dist/catalog/fal/minimax-h3-max.model.js +132 -0
  117. package/dist/catalog/fal/minimax-h3.model.js +3 -4
  118. package/dist/catalog/fal/minimax-speech-2.8.model.js +1 -1
  119. package/dist/catalog/fal/nano-banana-2.1.model.d.ts +2 -0
  120. package/dist/catalog/fal/nano-banana-2.1.model.js +68 -0
  121. package/dist/catalog/fal/nano-banana-2.model.js +1 -1
  122. package/dist/catalog/fal/nano-banana-pro.model.js +1 -1
  123. package/dist/catalog/fal/nano-banana.model.js +1 -1
  124. package/dist/catalog/fal/pixverse-v5.5.model.js +9 -4
  125. package/dist/catalog/fal/qwen-image-3.0.model.js +2 -2
  126. package/dist/catalog/fal/qwen3-tts-1.7b.model.js +4 -3
  127. package/dist/catalog/fal/seedance-2.0-fast.model.js +1 -1
  128. package/dist/catalog/fal/seedance-2.0-mini.model.js +1 -1
  129. package/dist/catalog/fal/seedance-2.0.model.js +1 -1
  130. package/dist/catalog/fal/seedance-2.5.model.js +5 -2
  131. package/dist/catalog/fal/seedance.model.js +3 -2
  132. package/dist/catalog/fal/seedream-5.0-lite.model.js +1 -1
  133. package/dist/catalog/fal/seedream-5.0-pro.model.js +1 -1
  134. package/dist/catalog/fal/seedream-v4.5.model.js +1 -1
  135. package/dist/catalog/fal/seedream-v4.model.js +1 -1
  136. package/dist/catalog/fal/seedvr2-image-upscale.model.js +1 -1
  137. package/dist/catalog/fal/topaz-image-upscale.model.js +1 -1
  138. package/dist/catalog/fal/topaz-transparent-upscale.model.js +1 -1
  139. package/dist/catalog/fal/utils/klingV4.d.ts +17 -0
  140. package/dist/catalog/fal/utils/klingV4.js +33 -0
  141. package/dist/catalog/fal/veo-3.1.model.js +5 -2
  142. package/dist/catalog/fal/vidu-q2.model.js +20 -8
  143. package/dist/catalog/fal/wan-2.5-preview.model.js +4 -1
  144. package/dist/catalog/fal/wan-3.0.model.d.ts +2 -0
  145. package/dist/catalog/fal/wan-3.0.model.js +135 -0
  146. package/dist/catalog/fal/z-image-turbo.model.js +10 -9
  147. package/dist/catalog/grsai/gpt-image-2.5.model.js +13 -31
  148. package/dist/catalog/grsai/gpt-image-2.6.model.d.ts +2 -0
  149. package/dist/catalog/grsai/gpt-image-2.6.model.js +37 -0
  150. package/dist/catalog/grsai/gpt-image-2.model.js +5 -2
  151. package/dist/catalog/grsai/nano-banana-2-lite.model.js +1 -1
  152. package/dist/catalog/grsai/nano-banana-2.1.model.d.ts +2 -0
  153. package/dist/catalog/grsai/nano-banana-2.1.model.js +29 -0
  154. package/dist/catalog/grsai/nano-banana-2.model.js +1 -1
  155. package/dist/catalog/grsai/nano-banana-pro.model.js +1 -1
  156. package/dist/catalog/grsai/wan-3.0.model.d.ts +2 -0
  157. package/dist/catalog/grsai/wan-3.0.model.js +78 -0
  158. package/dist/catalog/index.d.ts +1 -0
  159. package/dist/catalog/index.js +205 -124
  160. package/dist/catalog/kie/eleven-v3-dialogue.model.js +1 -1
  161. package/dist/catalog/kie/flux-3-klein.model.d.ts +2 -0
  162. package/dist/catalog/kie/flux-3-klein.model.js +58 -0
  163. package/dist/catalog/kie/gemini-3.1-flash-tts.model.js +7 -4
  164. package/dist/catalog/kie/gemini-3.8-flash-lite-tts.model.d.ts +2 -0
  165. package/dist/catalog/kie/gemini-3.8-flash-lite-tts.model.js +11 -0
  166. package/dist/catalog/kie/gemini-3.8-flash-tts.model.d.ts +2 -0
  167. package/dist/catalog/kie/gemini-3.8-flash-tts.model.js +11 -0
  168. package/dist/catalog/kie/gemini-omni-video.model.js +8 -30
  169. package/dist/catalog/kie/gemini38Tts.d.ts +3 -0
  170. package/dist/catalog/kie/gemini38Tts.js +40 -0
  171. package/dist/catalog/kie/gpt-image-2.5.model.js +1 -1
  172. package/dist/catalog/kie/gpt-image-2.6.model.d.ts +2 -0
  173. package/dist/catalog/kie/gpt-image-2.6.model.js +87 -0
  174. package/dist/catalog/kie/gpt-image-2.model.js +8 -12
  175. package/dist/catalog/kie/grok-imagine-2.0.model.js +1 -1
  176. package/dist/catalog/kie/grok-imagine-video-1.5.model.d.ts +2 -0
  177. package/dist/catalog/kie/grok-imagine-video-1.5.model.js +52 -0
  178. package/dist/catalog/kie/grok-imagine-video.model.js +7 -3
  179. package/dist/catalog/kie/grok-imagine.model.js +4 -2
  180. package/dist/catalog/kie/hailuo-02.model.js +6 -4
  181. package/dist/catalog/kie/hailuo-2-3.model.js +1 -1
  182. package/dist/catalog/kie/happyhorse-1.1.model.js +5 -2
  183. package/dist/catalog/kie/kling-3.0-omni.model.js +51 -23
  184. package/dist/catalog/kie/kling-3.0-turbo.model.js +1 -1
  185. package/dist/catalog/kie/kling-3.0.model.js +1 -8
  186. package/dist/catalog/kie/kling-4.0-flash.model.d.ts +2 -0
  187. package/dist/catalog/kie/kling-4.0-flash.model.js +16 -0
  188. package/dist/catalog/kie/kling-4.0.model.d.ts +2 -0
  189. package/dist/catalog/kie/kling-4.0.model.js +17 -0
  190. package/dist/catalog/kie/kling-v2-6.model.js +1 -1
  191. package/dist/catalog/kie/kling40.d.ts +21 -0
  192. package/dist/catalog/kie/kling40.js +129 -0
  193. package/dist/catalog/kie/minimax-h3.model.js +16 -21
  194. package/dist/catalog/kie/nano-banana-2-lite.model.js +1 -1
  195. package/dist/catalog/kie/nano-banana-2.1.model.d.ts +2 -0
  196. package/dist/catalog/kie/nano-banana-2.1.model.js +34 -0
  197. package/dist/catalog/kie/nano-banana-2.model.js +2 -2
  198. package/dist/catalog/kie/nano-banana-pro.model.js +1 -1
  199. package/dist/catalog/kie/qwen-image-3.0.model.js +2 -10
  200. package/dist/catalog/kie/seedance-1.5-pro.model.js +2 -1
  201. package/dist/catalog/kie/seedance-2.0-fast.model.js +5 -1
  202. package/dist/catalog/kie/seedance-2.0-mini.model.js +5 -1
  203. package/dist/catalog/kie/seedance-2.0.model.js +5 -1
  204. package/dist/catalog/kie/seedance-2.5.model.js +10 -20
  205. package/dist/catalog/kie/seedance-v1.model.js +8 -4
  206. package/dist/catalog/kie/seedream-4.0.model.js +1 -1
  207. package/dist/catalog/kie/seedream-4.5.model.js +1 -1
  208. package/dist/catalog/kie/seedream-5.0-lite.model.js +1 -1
  209. package/dist/catalog/kie/seedream-5.0-pro.model.js +1 -1
  210. package/dist/catalog/kie/wan-3.0-prime.model.d.ts +2 -0
  211. package/dist/catalog/kie/wan-3.0-prime.model.js +15 -0
  212. package/dist/catalog/kie/wan-3.0.model.d.ts +2 -0
  213. package/dist/catalog/kie/wan-3.0.model.js +15 -0
  214. package/dist/catalog/kie/wan30.d.ts +10 -0
  215. package/dist/catalog/kie/wan30.js +78 -0
  216. package/dist/catalog/kie/z-image.model.js +1 -1
  217. package/dist/catalog/modelscope/flux-1-krea-dev.model.js +4 -2
  218. package/dist/catalog/modelscope/majicmix-realistic.model.js +3 -2
  219. package/dist/catalog/modelscope/modelscope-custom.model.js +3 -2
  220. package/dist/catalog/modelscope/qwen-image-2512.model.d.ts +5 -0
  221. package/dist/catalog/modelscope/{qwen-image.model.js → qwen-image-2512.model.js} +11 -8
  222. package/dist/catalog/modelscope/qwen-image-edit-2511.model.d.ts +5 -0
  223. package/dist/catalog/modelscope/{qwen-image-edit-2509.model.js → qwen-image-edit-2511.model.js} +9 -7
  224. package/dist/catalog/modelscope/sdxl-14-ckpt.model.js +3 -2
  225. package/dist/catalog/modelscope/utils.js +2 -2
  226. package/dist/catalog/modelscope/z-image-turbo.model.js +3 -2
  227. package/dist/catalog/ppio/kling-3.0.model.js +4 -1
  228. package/dist/catalog/ppio/minimax-speech.model.js +2 -1
  229. package/dist/catalog/shared/mediaPresence.d.ts +8 -1
  230. package/dist/catalog/shared/mediaPresence.js +21 -1
  231. package/dist/catalog/shared/nanoBanana21.d.ts +11 -0
  232. package/dist/catalog/shared/nanoBanana21.js +30 -0
  233. package/dist/catalog/shared/shotList.d.ts +31 -0
  234. package/dist/catalog/shared/shotList.js +48 -0
  235. package/dist/catalog/shared/subjectElements.d.ts +36 -0
  236. package/dist/catalog/shared/subjectElements.js +93 -0
  237. package/dist/catalog/siliconflow/moss-ttsd-0.5.model.js +1 -1
  238. package/dist/catalog/validate.js +14 -1
  239. package/dist/catalog/volcengine/seedance-2.0-fast.model.d.ts +2 -0
  240. package/dist/catalog/volcengine/seedance-2.0-fast.model.js +11 -0
  241. package/dist/catalog/volcengine/seedance-2.0-mini.model.d.ts +2 -0
  242. package/dist/catalog/volcengine/seedance-2.0-mini.model.js +11 -0
  243. package/dist/catalog/volcengine/seedance-2.0.model.d.ts +2 -0
  244. package/dist/catalog/volcengine/seedance-2.0.model.js +11 -0
  245. package/dist/catalog/volcengine/seedance-2.5.model.d.ts +2 -0
  246. package/dist/catalog/volcengine/seedance-2.5.model.js +11 -0
  247. package/dist/catalog/volcengine/seedance.d.ts +17 -0
  248. package/dist/catalog/volcengine/seedance.js +192 -0
  249. package/dist/catalog/volcengine/seedream-5.0-lite.model.js +2 -1
  250. package/dist/catalog/volcengine/seedream-5.0.js +1 -1
  251. package/dist/catalog/volcengine-speech/seed-icl-2.0.model.d.ts +1 -0
  252. package/dist/catalog/volcengine-speech/seed-icl-2.0.model.js +52 -10
  253. package/dist/catalog/volcengine-speech/seed-tts-2.0-voices.d.ts +2 -0
  254. package/dist/catalog/volcengine-speech/seed-tts-2.0-voices.js +438 -0
  255. package/dist/catalog/volcengine-speech/seed-tts-2.0.model.js +4 -4
  256. package/dist/discovery/index.js +13 -6
  257. package/dist/generation/core.d.ts +6 -0
  258. package/dist/generation/core.js +10 -2
  259. package/dist/index.d.ts +8 -0
  260. package/dist/index.js +9 -0
  261. package/dist/llm/bigmodel/preset.js +2 -1
  262. package/dist/llm/bigmodel/profiles.js +0 -6
  263. package/dist/llm/chat.d.ts +8 -0
  264. package/dist/llm/chat.js +18 -2
  265. package/dist/llm/chatTypes.d.ts +6 -0
  266. package/dist/llm/defaults.d.ts +2 -2
  267. package/dist/llm/defaults.js +3 -3
  268. package/dist/llm/groq/preset.js +18 -2
  269. package/dist/llm/modelCatalog.d.ts +9 -2
  270. package/dist/llm/modelCatalog.js +17 -4
  271. package/dist/llm/modelCatalogEntries.d.ts +2 -0
  272. package/dist/llm/modelCatalogEntries.js +197 -42
  273. package/dist/llm/providerPresets.d.ts +3 -0
  274. package/dist/llm/providerPresets.js +145 -32
  275. package/dist/llm/providerReasoningRequest.js +28 -11
  276. package/dist/llm/siliconflow/index.js +1 -1
  277. package/dist/llm/siliconflow/preset.js +30 -0
  278. package/dist/llm/types.d.ts +6 -0
  279. package/dist/packs/models/{ppio/wan-2.5-preview.d.ts → apimart/flux-3-image.d.ts} +1 -1
  280. package/dist/packs/models/apimart/flux-3-image.js +7 -0
  281. package/dist/packs/models/apimart/flux-3-video.d.ts +6 -0
  282. package/dist/packs/models/apimart/flux-3-video.js +7 -0
  283. package/dist/packs/models/apimart/gemini-omni-1.2-flash.d.ts +6 -0
  284. package/dist/packs/models/apimart/gemini-omni-1.2-flash.js +7 -0
  285. package/dist/packs/models/{modelscope/qwen-image.d.ts → apimart/gpt-image-2.6.d.ts} +1 -1
  286. package/dist/packs/models/apimart/gpt-image-2.6.js +7 -0
  287. package/dist/packs/models/apimart/grok-imagine-video-1.5.d.ts +6 -0
  288. package/dist/packs/models/apimart/grok-imagine-video-1.5.js +7 -0
  289. package/dist/packs/models/apimart/happyhorse-1.1.d.ts +6 -0
  290. package/dist/packs/models/apimart/happyhorse-1.1.js +7 -0
  291. package/dist/packs/models/apimart/kling-4.0.d.ts +6 -0
  292. package/dist/packs/models/apimart/kling-4.0.js +7 -0
  293. package/dist/packs/models/apimart/minimax-h3-max.d.ts +6 -0
  294. package/dist/packs/models/apimart/minimax-h3-max.js +7 -0
  295. package/dist/packs/models/{ppio/minimax-hailuo-2.3.d.ts → apimart/nano-banana-2.1.d.ts} +1 -1
  296. package/dist/packs/models/{ppio/minimax-hailuo-2.3.js → apimart/nano-banana-2.1.js} +4 -4
  297. package/dist/packs/models/apimart/seedream-5.0-flash.d.ts +6 -0
  298. package/dist/packs/models/apimart/seedream-5.0-flash.js +7 -0
  299. package/dist/packs/models/apimart/veo-3.1.d.ts +6 -0
  300. package/dist/packs/models/apimart/veo-3.1.js +7 -0
  301. package/dist/packs/models/apimart/wan-2.7-image.d.ts +6 -0
  302. package/dist/packs/models/apimart/wan-2.7-image.js +7 -0
  303. package/dist/packs/models/apimart/wan-3.0.d.ts +6 -0
  304. package/dist/packs/models/apimart/wan-3.0.js +7 -0
  305. package/dist/packs/models/bailian/cosyvoice-v3.5.js +1 -1
  306. package/dist/packs/models/bailian/minimax-h3.d.ts +6 -0
  307. package/dist/packs/models/bailian/minimax-h3.js +7 -0
  308. package/dist/packs/models/bailian/minimax-speech-2.8.js +1 -1
  309. package/dist/packs/models/bailian/qwen-audio-3.1-tts-flash.js +1 -1
  310. package/dist/packs/models/bailian/qwen-audio-3.1-tts-plus.d.ts +6 -0
  311. package/dist/packs/models/bailian/qwen-audio-3.1-tts-plus.js +7 -0
  312. package/dist/packs/models/bailian/qwen-image-3.0.js +1 -1
  313. package/dist/packs/models/bailian/wan-3.0.d.ts +6 -0
  314. package/dist/packs/models/bailian/wan-3.0.js +7 -0
  315. package/dist/packs/models/bailian/z-image-turbo.js +1 -1
  316. package/dist/packs/models/fal/eleven-v4-tts.d.ts +6 -0
  317. package/dist/packs/models/{ppio/wan-2.5-preview.js → fal/eleven-v4-tts.js} +4 -4
  318. package/dist/packs/models/fal/flux-3-video.d.ts +6 -0
  319. package/dist/packs/models/fal/flux-3-video.js +7 -0
  320. package/dist/packs/models/{ppio/wan-2.6.d.ts → fal/flux-3.d.ts} +1 -1
  321. package/dist/packs/models/{ppio/wan-2.6.js → fal/flux-3.js} +4 -4
  322. package/dist/packs/models/fal/gemini-omni-1.2-flash.d.ts +6 -0
  323. package/dist/packs/models/fal/gemini-omni-1.2-flash.js +7 -0
  324. package/dist/packs/models/fal/gpt-image-2.6.d.ts +6 -0
  325. package/dist/packs/models/fal/gpt-image-2.6.js +7 -0
  326. package/dist/packs/models/fal/grok-imagine-video-1.5.d.ts +6 -0
  327. package/dist/packs/models/fal/grok-imagine-video-1.5.js +7 -0
  328. package/dist/packs/models/fal/kling-4.0-flash.d.ts +6 -0
  329. package/dist/packs/models/fal/kling-4.0-flash.js +7 -0
  330. package/dist/packs/models/fal/kling-4.0.d.ts +6 -0
  331. package/dist/packs/models/{ppio/wan-2.7.js → fal/kling-4.0.js} +4 -4
  332. package/dist/packs/models/{ppio/wan-2.7.d.ts → fal/ltx-2.3.d.ts} +1 -1
  333. package/dist/packs/models/fal/ltx-2.3.js +7 -0
  334. package/dist/packs/models/fal/minimax-h3-max.d.ts +6 -0
  335. package/dist/packs/models/fal/minimax-h3-max.js +7 -0
  336. package/dist/packs/models/fal/nano-banana-2.1.d.ts +6 -0
  337. package/dist/packs/models/fal/nano-banana-2.1.js +7 -0
  338. package/dist/packs/models/fal/wan-3.0.d.ts +6 -0
  339. package/dist/packs/models/fal/wan-3.0.js +7 -0
  340. package/dist/packs/models/grsai/gpt-image-2.6.d.ts +6 -0
  341. package/dist/packs/models/grsai/gpt-image-2.6.js +7 -0
  342. package/dist/packs/models/grsai/nano-banana-2.1.d.ts +6 -0
  343. package/dist/packs/models/grsai/nano-banana-2.1.js +7 -0
  344. package/dist/packs/models/grsai/wan-3.0.d.ts +6 -0
  345. package/dist/packs/models/grsai/wan-3.0.js +7 -0
  346. package/dist/packs/models/kie/flux-3-klein.d.ts +6 -0
  347. package/dist/packs/models/kie/flux-3-klein.js +7 -0
  348. package/dist/packs/models/kie/gemini-3.8-flash-lite-tts.d.ts +6 -0
  349. package/dist/packs/models/kie/gemini-3.8-flash-lite-tts.js +7 -0
  350. package/dist/packs/models/kie/{eleven-turbo-2.5-tts.d.ts → gemini-3.8-flash-tts.d.ts} +1 -1
  351. package/dist/packs/models/kie/{eleven-turbo-2.5-tts.js → gemini-3.8-flash-tts.js} +1 -1
  352. package/dist/packs/models/kie/gpt-image-2.6.d.ts +6 -0
  353. package/dist/packs/models/kie/gpt-image-2.6.js +7 -0
  354. package/dist/packs/models/kie/grok-imagine-video-1.5.d.ts +6 -0
  355. package/dist/packs/models/kie/grok-imagine-video-1.5.js +7 -0
  356. package/dist/packs/models/kie/kling-4.0-flash.d.ts +6 -0
  357. package/dist/packs/models/kie/kling-4.0-flash.js +7 -0
  358. package/dist/packs/models/kie/kling-4.0.d.ts +6 -0
  359. package/dist/packs/models/kie/kling-4.0.js +7 -0
  360. package/dist/packs/models/kie/nano-banana-2.1.d.ts +6 -0
  361. package/dist/packs/models/kie/nano-banana-2.1.js +7 -0
  362. package/dist/packs/models/kie/wan-3.0-prime.d.ts +6 -0
  363. package/dist/packs/models/kie/wan-3.0-prime.js +7 -0
  364. package/dist/packs/models/kie/wan-3.0.d.ts +6 -0
  365. package/dist/packs/models/kie/wan-3.0.js +7 -0
  366. package/dist/packs/models/modelscope/flux-1-krea-dev.js +1 -1
  367. package/dist/packs/models/modelscope/majicmix-realistic.js +1 -1
  368. package/dist/packs/models/modelscope/modelscope-custom.js +1 -1
  369. package/dist/packs/models/modelscope/qwen-image-2512.d.ts +6 -0
  370. package/dist/packs/models/modelscope/{qwen-image.js → qwen-image-2512.js} +2 -2
  371. package/dist/packs/models/modelscope/{qwen-image-edit-2509.d.ts → qwen-image-edit-2511.d.ts} +1 -1
  372. package/dist/packs/models/modelscope/{qwen-image-edit-2509.js → qwen-image-edit-2511.js} +2 -2
  373. package/dist/packs/models/modelscope/sdxl-14-ckpt.js +1 -1
  374. package/dist/packs/models/modelscope/z-image-turbo.js +1 -1
  375. package/dist/packs/models/volcengine/seedance-2.0-fast.d.ts +6 -0
  376. package/dist/packs/models/volcengine/seedance-2.0-fast.js +7 -0
  377. package/dist/packs/models/volcengine/seedance-2.0-mini.d.ts +6 -0
  378. package/dist/packs/models/volcengine/seedance-2.0-mini.js +7 -0
  379. package/dist/packs/models/volcengine/seedance-2.0.d.ts +6 -0
  380. package/dist/packs/models/volcengine/seedance-2.0.js +7 -0
  381. package/dist/packs/models/volcengine/seedance-2.5.d.ts +6 -0
  382. package/dist/packs/models/volcengine/seedance-2.5.js +7 -0
  383. package/dist/packs/models/volcengine/seedream-5.0-flash.js +1 -1
  384. package/dist/packs/models/volcengine/seedream-5.0-lite.js +1 -1
  385. package/dist/packs/models/volcengine/seedream-5.0-pro.js +1 -1
  386. package/dist/packs/provider-adapters/bailian.js +1 -1
  387. package/dist/packs/provider-adapters/modelscope.js +1 -1
  388. package/dist/packs/provider-adapters/volcengine.js +1 -1
  389. package/dist/packs/provider-packs/apimart.d.ts +1 -1
  390. package/dist/packs/provider-packs/apimart.js +35 -22
  391. package/dist/packs/provider-packs/bailian.d.ts +1 -1
  392. package/dist/packs/provider-packs/bailian.js +8 -5
  393. package/dist/packs/provider-packs/fal.d.ts +1 -1
  394. package/dist/packs/provider-packs/fal.js +52 -40
  395. package/dist/packs/provider-packs/grsai.d.ts +1 -1
  396. package/dist/packs/provider-packs/grsai.js +8 -5
  397. package/dist/packs/provider-packs/kie.d.ts +1 -1
  398. package/dist/packs/provider-packs/kie.js +41 -32
  399. package/dist/packs/provider-packs/modelscope.js +2 -2
  400. package/dist/packs/provider-packs/ppio.d.ts +1 -1
  401. package/dist/packs/provider-packs/ppio.js +2 -6
  402. package/dist/packs/provider-packs/volcengine.d.ts +1 -1
  403. package/dist/packs/provider-packs/volcengine.js +8 -4
  404. package/dist/pricing/index.d.ts +1 -0
  405. package/dist/pricing/index.js +1 -0
  406. package/dist/pricing/mediaContext.d.ts +6 -1
  407. package/dist/pricing/mediaContext.js +12 -5
  408. package/dist/pricing/tokenPricing.d.ts +36 -0
  409. package/dist/pricing/tokenPricing.js +26 -0
  410. package/dist/providers/bailian.d.ts +1 -1
  411. package/dist/providers/bailian.js +71 -4
  412. package/dist/providers/fal.js +11 -1
  413. package/dist/providers/helpers.d.ts +1 -1
  414. package/dist/providers/helpers.js +17 -5
  415. package/dist/providers/kie.js +16 -5
  416. package/dist/providers/metadata.js +2 -2
  417. package/dist/providers/openai-speech.d.ts +6 -0
  418. package/dist/providers/openai-speech.js +31 -0
  419. package/dist/providers/providerAccessErrors.d.ts +3 -0
  420. package/dist/providers/providerAccessErrors.js +73 -0
  421. package/dist/providers/siliconflow.js +2 -27
  422. package/dist/providers/volcengine-speech.d.ts +1 -1
  423. package/dist/providers/volcengine-speech.js +31 -8
  424. package/dist/providers/volcengine-voice-clone.d.ts +3 -0
  425. package/dist/providers/volcengine-voice-clone.js +138 -0
  426. package/dist/providers/volcengine.d.ts +1 -1
  427. package/dist/providers/volcengine.js +89 -11
  428. package/dist/runtime/retry.js +3 -0
  429. package/dist/tool-packs/fal-erase/models/bria-eraser.model.js +1 -1
  430. package/dist/tool-packs/fal-erase/models/finegrain-eraser.model.js +1 -1
  431. package/dist/tool-packs/fal-erase/models/flux-pro-erase.model.js +1 -1
  432. package/dist/tool-packs/fal-image-utilities/models/control-light.model.js +1 -1
  433. package/dist/tool-packs/fal-image-utilities/models/outpaint.model.js +1 -1
  434. package/dist/tool-packs/fal-image-utilities/models/photo-restoration.model.js +1 -1
  435. package/dist/tool-packs/fal-image-utilities/models/pixelcut-background-removal.model.js +1 -1
  436. package/dist/tool-packs/fal-image-utilities/models/product-photography.model.js +1 -1
  437. package/dist/tool-packs/fal-image-utilities/models/relighting.model.js +1 -1
  438. package/dist/tool-packs/fal-multi-angle/models/flux-2-multiple-angles.model.js +1 -1
  439. package/dist/tool-packs/fal-multi-angle/models/perspective-change.model.js +1 -1
  440. package/dist/tool-packs/fal-multi-angle/models/qwen-image-edit-2511-multiple-angles.model.js +1 -1
  441. package/dist/types/model.d.ts +68 -12
  442. package/dist/types/model.js +3 -0
  443. package/dist/types/modelTags.d.ts +142 -0
  444. package/dist/types/modelTags.js +44 -0
  445. package/dist/types/runtime.d.ts +3 -0
  446. package/dist/types/speechTimings.d.ts +15 -0
  447. package/dist/types/speechTimings.js +1 -0
  448. package/dist/upload/apimart-upload.d.ts +1 -1
  449. package/dist/upload/apimart-upload.js +37 -15
  450. package/dist/upload/bailian-oss-upload.d.ts +32 -0
  451. package/dist/upload/bailian-oss-upload.js +74 -0
  452. package/dist/upload/{fal-legacy.js → fal-host-fetch.js} +2 -2
  453. package/dist/upload/fal-transport.d.ts +6 -0
  454. package/dist/upload/fal-transport.js +2 -1
  455. package/dist/upload/index.d.ts +2 -2
  456. package/dist/upload/index.js +4 -7
  457. package/dist/upload/kie-upload.d.ts +1 -1
  458. package/dist/upload/kie-upload.js +34 -12
  459. package/dist/upload/media-binary.js +1 -0
  460. package/dist/upload/media-fields.js +7 -2
  461. package/dist/upload/preprocess-core.d.ts +2 -0
  462. package/dist/upload/preprocess-core.js +2 -0
  463. package/dist/upload/preprocess.d.ts +1 -1
  464. package/dist/upload/preprocess.js +12 -3
  465. package/dist/upload/provider-preprocessors/apimart.d.ts +1 -1
  466. package/dist/upload/provider-preprocessors/apimart.js +13 -5
  467. package/dist/upload/provider-preprocessors/bailian.d.ts +8 -0
  468. package/dist/upload/provider-preprocessors/bailian.js +45 -0
  469. package/dist/upload/provider-preprocessors/kie.d.ts +1 -1
  470. package/dist/upload/provider-preprocessors/kie.js +26 -9
  471. package/dist/upload/provider-preprocessors/ppio.d.ts +1 -2
  472. package/dist/upload/provider-preprocessors/ppio.js +2 -29
  473. package/dist/upload/provider-preprocessors/public-host.d.ts +5 -0
  474. package/dist/upload/provider-preprocessors/public-host.js +7 -0
  475. package/dist/upload/provider-preprocessors/volcengine.d.ts +5 -0
  476. package/dist/upload/provider-preprocessors/volcengine.js +10 -0
  477. package/dist/upload/public-host-upload.d.ts +7 -0
  478. package/dist/upload/public-host-upload.js +55 -0
  479. package/dist/upload/upload-response.js +12 -7
  480. package/docs/README.md +26 -26
  481. package/docs/consumers.md +150 -124
  482. package/docs/llm-adaptation/README.md +180 -166
  483. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/DeepSeek.md +108 -104
  484. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/Kimi.md +94 -76
  485. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/MiniMax.md +89 -84
  486. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//345/260/217/347/261/263MiMo.md +126 -126
  487. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//346/231/272/350/260/261GLM.md +238 -234
  488. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//347/201/253/345/261/261/345/274/225/346/223/216.md +131 -87
  489. package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//347/231/276/347/202/274Qwen.md +112 -84
  490. package/docs/llm-adaptation//346/226/207/346/241/243/351/207/207/351/233/206/346/211/213/345/206/214.md +88 -88
  491. package/docs/model-adaptation/Bria-Eraser/Bria-Eraser_Fal.md +32 -32
  492. package/docs/model-adaptation/Bria-/345/210/233/346/204/217/346/224/276/345/244/247/Bria-/345/210/233/346/204/217/346/224/276/345/244/247_Fal.md +31 -31
  493. package/docs/model-adaptation/ControlLight/ControlLight_Fal.md +85 -85
  494. package/docs/model-adaptation/Eleven-v4/Eleven-v4_Fal.md +49 -0
  495. package/docs/model-adaptation/FLUX-2-/345/244/232/350/247/222/345/272/246/FLUX-2-/345/244/232/350/247/222/345/272/246_Fal.md +107 -107
  496. package/docs/model-adaptation/FLUX-3/FLUX-3_APIMart.md +65 -0
  497. package/docs/model-adaptation/FLUX-3/FLUX-3_Fal.md +48 -0
  498. package/docs/model-adaptation/FLUX-3-Klein/FLUX-3-Klein_KIE.md +38 -0
  499. package/docs/model-adaptation/FLUX-3-Video/FLUX-3-Video_APIMart.md +84 -0
  500. package/docs/model-adaptation/FLUX-3-Video/FLUX-3-Video_Fal.md +80 -0
  501. package/docs/model-adaptation/Finegrain-Eraser/Finegrain-Eraser_Fal.md +31 -31
  502. package/docs/model-adaptation/Flux-Pro-Erase/Flux-Pro-Erase_Fal.md +34 -34
  503. package/docs/model-adaptation/Fun-ASR/Fun-ASR_/347/231/276/347/202/274.md +47 -47
  504. package/docs/model-adaptation/Fun-ASR-Flash-2026-06-15/Fun-ASR-Flash-2026-06-15_/347/231/276/347/202/274.md +45 -45
  505. package/docs/model-adaptation/Fun-ASR-Realtime/Fun-ASR-Realtime_/347/231/276/347/202/274.md +57 -57
  506. package/docs/model-adaptation/Fun-ASR-Realtime-2026-02-28/Fun-ASR-Realtime-2026-02-28_/347/231/276/347/202/274.md +39 -39
  507. package/docs/model-adaptation/GLM-5.3-Flash/GLM-5.3-Flash_/346/231/272/350/260/261.md +217 -213
  508. package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_APIMart.md +173 -173
  509. package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_Fal.md +94 -94
  510. package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_Grsai.md +138 -137
  511. package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_KIE.md +97 -93
  512. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_APIMart.md +66 -66
  513. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Fal.md +55 -55
  514. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Grsai.md +59 -53
  515. package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_KIE.md +55 -55
  516. package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_APIMart.md +101 -0
  517. package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_Fal.md +55 -0
  518. package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_Grsai.md +32 -0
  519. package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_KIE.md +51 -0
  520. package/docs/model-adaptation/GPT-OSS-20B/GPT-OSS-20B_Groq.md +62 -62
  521. package/docs/model-adaptation/Gemini-3.8-Flash-Lite-TTS/Gemini-3.8-Flash-Lite-TTS_KIE.md +22 -0
  522. package/docs/model-adaptation/Gemini-3.8-Flash-TTS/Gemini-3.8-Flash-TTS_KIE.md +38 -0
  523. package/docs/model-adaptation/Gemini-Omni-1.2-Flash/Gemini-Omni-1.2-Flash_APIMart.md +79 -0
  524. package/docs/model-adaptation/Gemini-Omni-1.2-Flash/Gemini-Omni-1.2-Flash_Fal.md +60 -0
  525. package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_APIMart.md +131 -124
  526. package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_Fal.md +84 -84
  527. package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_KIE.md +132 -129
  528. package/docs/model-adaptation/Grok-Imagine/Grok-Imagine_KIE.md +38 -36
  529. package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_APIMart.md +250 -250
  530. package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_Fal.md +84 -84
  531. package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_KIE.md +105 -105
  532. package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_APIMart.md +68 -0
  533. package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_Fal.md +47 -0
  534. package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_KIE.md +37 -0
  535. package/docs/model-adaptation/Hailuo-02/Hailuo-02_Fal.md +95 -93
  536. package/docs/model-adaptation/Hailuo-02/Hailuo-02_KIE.md +58 -56
  537. package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_Fal.md +88 -88
  538. package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_KIE.md +51 -51
  539. package/docs/model-adaptation/HappyHorse-1.1/HappyHorse-1.1_APIMart.md +66 -0
  540. package/docs/model-adaptation/HappyHorse-1.1/HappyHorse-1.1_KIE.md +31 -27
  541. package/docs/model-adaptation/IC-Light-v2/IC-Light-v2_Fal.md +99 -99
  542. package/docs/model-adaptation/Ideogram-/345/233/276/347/211/207/346/224/276/345/244/247/Ideogram-/345/233/276/347/211/207/346/224/276/345/244/247_Fal.md +41 -41
  543. package/docs/model-adaptation/Image-Apps-v2-/345/225/206/345/223/201/346/221/204/345/275/261/Image-Apps-v2-/345/225/206/345/223/201/346/221/204/345/275/261_Fal.md +72 -72
  544. package/docs/model-adaptation/Image-Apps-v2-/346/211/251/345/233/276/Image-Apps-v2-/346/211/251/345/233/276_Fal.md +93 -93
  545. package/docs/model-adaptation/Image-Apps-v2-/347/205/247/347/211/207/344/277/256/345/244/215/Image-Apps-v2-/347/205/247/347/211/207/344/277/256/345/244/215_Fal.md +86 -86
  546. package/docs/model-adaptation/Image-Apps-v2-/351/207/215/346/211/223/345/205/211/Image-Apps-v2-/351/207/215/346/211/223/345/205/211_Fal.md +84 -84
  547. package/docs/model-adaptation/Kling-3.0/Kling-3.0_APIMart.md +112 -112
  548. package/docs/model-adaptation/Kling-3.0/Kling-3.0_Fal.md +91 -89
  549. package/docs/model-adaptation/Kling-3.0/Kling-3.0_KIE.md +106 -106
  550. package/docs/model-adaptation/Kling-3.0/Kling-3.0_/346/264/276/346/254/247/344/272/221.md +120 -119
  551. package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_APIMart.md +130 -125
  552. package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_Fal.md +107 -107
  553. package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_KIE.md +148 -143
  554. package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_APIMart.md +88 -85
  555. package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_Fal.md +86 -83
  556. package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_KIE.md +84 -84
  557. package/docs/model-adaptation/Kling-4.0/Kling-4.0_APIMart.md +76 -0
  558. package/docs/model-adaptation/Kling-4.0/Kling-4.0_Fal.md +115 -0
  559. package/docs/model-adaptation/Kling-4.0/Kling-4.0_KIE.md +61 -0
  560. package/docs/model-adaptation/Kling-4.0-Flash/Kling-4.0-Flash_Fal.md +55 -0
  561. package/docs/model-adaptation/Kling-4.0-Flash/Kling-4.0-Flash_KIE.md +33 -0
  562. package/docs/model-adaptation/LTX-2.3/LTX-2.3_Fal.md +121 -0
  563. package/docs/model-adaptation/Midjourney/Midjourney_APIMart.md +402 -396
  564. package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_APIMart.md +237 -234
  565. package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_Fal.md +112 -108
  566. package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_KIE.md +118 -111
  567. package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_/347/231/276/347/202/274.md +65 -0
  568. package/docs/model-adaptation/MiniMax-H3-Max/MiniMax-H3-Max_APIMart.md +78 -0
  569. package/docs/model-adaptation/MiniMax-H3-Max/MiniMax-H3-Max_Fal.md +62 -0
  570. package/docs/model-adaptation/MiniMax-Speech/MiniMax-Speech_/346/264/276/346/254/247/344/272/221.md +170 -170
  571. package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_APIMart.md +89 -89
  572. package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_Fal.md +99 -99
  573. package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_Grsai.md +82 -82
  574. package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_KIE.md +72 -70
  575. package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_APIMart.md +79 -79
  576. package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_Grsai.md +65 -65
  577. package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_KIE.md +64 -64
  578. package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_APIMart.md +35 -0
  579. package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_Fal.md +37 -0
  580. package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_Grsai.md +35 -0
  581. package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_KIE.md +36 -0
  582. package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_APIMart.md +83 -83
  583. package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_Fal.md +89 -89
  584. package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_Grsai.md +82 -82
  585. package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_KIE.md +64 -64
  586. package/docs/model-adaptation/Pixelcut-/350/203/214/346/231/257/347/247/273/351/231/244/Pixelcut-/350/203/214/346/231/257/347/247/273/351/231/244_Fal.md +79 -79
  587. package/docs/model-adaptation/Qwen-Audio-3.1-TTS-Plus/Qwen-Audio-3.1-TTS-Plus_/347/231/276/347/202/274.md +59 -0
  588. package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_APIMart.md +117 -117
  589. package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_Fal.md +85 -84
  590. package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_KIE.md +103 -103
  591. package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_/347/231/276/347/202/274.md +138 -138
  592. package/docs/model-adaptation/Qwen-Image-Edit-2511-/345/244/232/350/247/222/345/272/246/Qwen-Image-Edit-2511-/345/244/232/350/247/222/345/272/246_Fal.md +57 -57
  593. package/docs/model-adaptation/Qwen-MT-Flash/Qwen-MT-Flash_/347/231/276/347/202/274.md +68 -68
  594. package/docs/model-adaptation/Qwen-MT-Lite/Qwen-MT-Lite_/347/231/276/347/202/274.md +40 -40
  595. package/docs/model-adaptation/Qwen-MT-Plus/Qwen-MT-Plus_/347/231/276/347/202/274.md +40 -40
  596. package/docs/model-adaptation/Qwen3-ASR-Flash/Qwen3-ASR-Flash_/347/231/276/347/202/274.md +44 -44
  597. package/docs/model-adaptation/Qwen3-ASR-Flash-2026-02-10/Qwen3-ASR-Flash-2026-02-10_/347/231/276/347/202/274.md +37 -37
  598. package/docs/model-adaptation/Qwen3-ASR-Flash-Filetrans/Qwen3-ASR-Flash-Filetrans_/347/231/276/347/202/274.md +45 -45
  599. package/docs/model-adaptation/Qwen3-ASR-Flash-Realtime/Qwen3-ASR-Flash-Realtime_/347/231/276/347/202/274.md +58 -58
  600. package/docs/model-adaptation/Qwen3-ASR-Flash-Realtime-2026-02-10/Qwen3-ASR-Flash-Realtime-2026-02-10_/347/231/276/347/202/274.md +37 -37
  601. package/docs/model-adaptation/README.md +371 -328
  602. package/docs/model-adaptation/Seed-ICL-2.0/Seed-ICL-2.0_/347/201/253/345/261/261/345/274/225/346/223/216.md +65 -0
  603. package/docs/model-adaptation/SeedASR-2.0-File/SeedASR-2.0-File_/347/201/253/345/261/261/345/274/225/346/223/216.md +115 -115
  604. package/docs/model-adaptation/SeedASR-2.0-Realtime/SeedASR-2.0-Realtime_/347/201/253/345/261/261/345/274/225/346/223/216.md +147 -147
  605. package/docs/model-adaptation/SeedVR2-/345/233/276/347/211/207/346/224/276/345/244/247/SeedVR2-/345/233/276/347/211/207/346/224/276/345/244/247_Fal.md +45 -45
  606. package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_APIMart.md +121 -121
  607. package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_Fal.md +97 -97
  608. package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_KIE.md +87 -86
  609. package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_/347/201/253/345/261/261/345/274/225/346/223/216.md +101 -0
  610. package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_APIMart.md +89 -89
  611. package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_Fal.md +95 -95
  612. package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_KIE.md +79 -78
  613. package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_/347/201/253/345/261/261/345/274/225/346/223/216.md +98 -0
  614. package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_APIMart.md +93 -89
  615. package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_Fal.md +96 -96
  616. package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_KIE.md +79 -78
  617. package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_/347/201/253/345/261/261/345/274/225/346/223/216.md +98 -0
  618. package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_APIMart.md +217 -212
  619. package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_Fal.md +98 -94
  620. package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_KIE.md +94 -89
  621. package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_/347/201/253/345/261/261/345/274/225/346/223/216.md +102 -0
  622. package/docs/model-adaptation/Seedream-5.0-Flash/Seedream-5.0-Flash_APIMart.md +64 -0
  623. package/docs/model-adaptation/Seedream-5.0-Flash/Seedream-5.0-Flash_/347/201/253/345/261/261/345/274/225/346/223/216.md +18 -18
  624. package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_APIMart.md +113 -106
  625. package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_Fal.md +91 -91
  626. package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_KIE.md +89 -89
  627. package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_/347/201/253/345/261/261/345/274/225/346/223/216.md +110 -108
  628. package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_APIMart.md +194 -194
  629. package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_Fal.md +100 -100
  630. package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_KIE.md +141 -141
  631. package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_/347/201/253/345/261/261/345/274/225/346/223/216.md +137 -137
  632. package/docs/model-adaptation/SenseVoiceSmall/SenseVoiceSmall_/347/241/205/345/237/272/346/265/201/345/212/250.md +73 -73
  633. package/docs/model-adaptation/TTS-/345/244/232/344/276/233/345/272/224/345/225/206-2026-09.md +52 -6
  634. package/docs/model-adaptation/TTS-/346/227/266/351/227/264/346/210/263-2026-10.md +36 -0
  635. package/docs/model-adaptation/Topaz-/345/233/276/347/211/207/346/224/276/345/244/247/Topaz-/345/233/276/347/211/207/346/224/276/345/244/247_Fal.md +87 -87
  636. package/docs/model-adaptation/Topaz-/351/200/217/346/230/216/345/233/276/346/224/276/345/244/247/Topaz-/351/200/217/346/230/216/345/233/276/346/224/276/345/244/247_Fal.md +34 -34
  637. package/docs/model-adaptation/Veo-3.1/Veo-3.1_APIMart.md +90 -0
  638. package/docs/model-adaptation/Wan-2.7-Image/Wan-2.7-Image_APIMart.md +81 -0
  639. package/docs/model-adaptation/Wan-3.0/Wan-3.0_APIMart.md +74 -0
  640. package/docs/model-adaptation/Wan-3.0/Wan-3.0_Fal.md +60 -0
  641. package/docs/model-adaptation/Wan-3.0/Wan-3.0_Grsai.md +35 -0
  642. package/docs/model-adaptation/Wan-3.0/Wan-3.0_KIE.md +38 -0
  643. package/docs/model-adaptation/Wan-3.0/Wan-3.0_/347/231/276/347/202/274.md +96 -0
  644. package/docs/model-adaptation/Wan-3.0-Prime/Wan-3.0-Prime_KIE.md +20 -0
  645. package/docs/model-adaptation/Whisper-Large-v3/Whisper-Large-v3_Groq.md +80 -80
  646. package/docs/model-adaptation/Whisper-Large-v3-Turbo/Whisper-Large-v3-Turbo_Groq.md +79 -79
  647. package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_APIMart.md +88 -88
  648. package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_Fal.md +103 -95
  649. package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_KIE.md +71 -71
  650. package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_/347/231/276/347/202/274.md +122 -122
  651. package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_/351/255/224/346/220/255.md +99 -97
  652. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/APIMart.md +240 -240
  653. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Fal.md +190 -172
  654. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Groq.md +136 -121
  655. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Grsai.md +217 -217
  656. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/KIE.md +159 -131
  657. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//345/200/231/351/200/211/344/276/233/345/272/224/345/225/206/350/260/203/347/240/224-/345/233/276/347/211/207/345/267/245/345/205/267.md +151 -151
  658. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//345/277/253/351/200/237/351/200/202/351/205/215/344/276/233/345/272/224/345/225/206.md +65 -65
  659. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//346/264/276/346/254/247/344/272/221.md +170 -147
  660. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/201/253/345/261/261/345/274/225/346/223/216.md +191 -183
  661. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/231/276/347/202/274.md +339 -282
  662. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/241/205/345/237/272/346/265/201/345/212/250.md +180 -153
  663. package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//351/255/224/346/220/255.md +205 -207
  664. package/docs/model-adaptation//346/226/207/346/241/243/351/207/207/351/233/206/346/211/213/345/206/214.md +339 -338
  665. package/docs/model-adaptation//351/200/217/350/247/206/345/217/230/346/215/242//351/200/217/350/247/206/345/217/230/346/215/242_Fal.md +59 -59
  666. package/docs//346/216/245/345/205/245/346/214/207/345/215/227/Electron.md +77 -77
  667. package/docs//346/216/245/345/205/245/346/214/207/345/215/227/Tauri.md +81 -81
  668. package/docs//346/216/245/345/205/245/346/214/207/345/215/227/UXP.md +169 -169
  669. package/docs//346/216/245/345/205/245/346/214/207/345/215/227//344/276/233/345/272/224/345/225/206/345/237/237/345/220/215.md +83 -83
  670. package/docs//346/216/245/345/205/245/346/214/207/345/215/227//351/224/231/350/257/257/345/244/204/347/220/206.md +72 -72
  671. package/examples/form-renderer/README.md +17 -17
  672. package/examples/form-renderer/cli.ts +32 -32
  673. package/examples/form-renderer/index.ts +144 -144
  674. package/examples/form-renderer/package.json +16 -16
  675. package/examples/form-renderer/tsconfig.json +14 -14
  676. package/examples/llm-chat/README.md +38 -38
  677. package/examples/llm-chat/index.ts +100 -100
  678. package/examples/llm-chat/package.json +19 -19
  679. package/examples/llm-chat/tsconfig.json +14 -14
  680. package/examples/minimal-node/README.md +31 -31
  681. package/examples/minimal-node/index.ts +138 -138
  682. package/examples/minimal-node/package.json +17 -17
  683. package/examples/minimal-node/tsconfig.json +14 -14
  684. package/package.json +259 -258
  685. package/dist/catalog/grsai/gptImage25Sizes.d.ts +0 -1
  686. package/dist/catalog/grsai/gptImage25Sizes.js +0 -76
  687. package/dist/catalog/kie/eleven-turbo-2.5-tts.model.d.ts +0 -2
  688. package/dist/catalog/kie/eleven-turbo-2.5-tts.model.js +0 -29
  689. package/dist/catalog/modelscope/qwen-image-edit-2509.model.d.ts +0 -5
  690. package/dist/catalog/modelscope/qwen-image.model.d.ts +0 -5
  691. package/dist/catalog/ppio/minimax-hailuo-2.3.model.d.ts +0 -7
  692. package/dist/catalog/ppio/minimax-hailuo-2.3.model.js +0 -114
  693. package/dist/catalog/ppio/wan-2.5-preview.model.d.ts +0 -7
  694. package/dist/catalog/ppio/wan-2.5-preview.model.js +0 -198
  695. package/dist/catalog/ppio/wan-2.6.model.d.ts +0 -7
  696. package/dist/catalog/ppio/wan-2.6.model.js +0 -206
  697. package/dist/catalog/ppio/wan-2.7.model.d.ts +0 -2
  698. package/dist/catalog/ppio/wan-2.7.model.js +0 -373
  699. package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_/346/264/276/346/254/247/344/272/221.md +0 -70
  700. package/docs/model-adaptation/TeleSpeechASR/TeleSpeechASR_/347/241/205/345/237/272/346/265/201/345/212/250.md +0 -76
  701. package/docs/model-adaptation/Wan-2.5-Preview/Wan-2.5-Preview_/346/264/276/346/254/247/344/272/221.md +0 -82
  702. package/docs/model-adaptation/Wan-2.6/Wan-2.6_/346/264/276/346/254/247/344/272/221.md +0 -84
  703. package/docs/model-adaptation/Wan-2.7/Wan-2.7_/346/264/276/346/254/247/344/272/221.md +0 -122
  704. /package/dist/upload/{fal-legacy.d.ts → fal-host-fetch.d.ts} +0 -0
@@ -1,26 +1,60 @@
1
1
  import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
+ import { POLL_QUERY_FAILED, pollUntilResult } from '../protocols/polling.js';
2
3
  import { getPointer, isJsonObject, normalizeEndpoint, pushUniqueUrl, readJsonResponse, stringAt } from './helpers.js';
3
4
  import { fetchProvider } from './provider-fetch.js';
4
5
  import { hexAudioToDataUri } from './audio-data.js';
5
6
  const BAILIAN_BASE_URL = 'https://dashscope.aliyuncs.com';
7
+ /** 只支持异步调用的 DashScope 路由:提交必须带 `X-DashScope-Async: enable`,结果按 `/api/v1/tasks/{task_id}` 查询。 */
8
+ const ASYNC_ROUTES = new Set(['/api/v1/services/aigc/video-generation/video-synthesis']);
9
+ function isAsyncRoute(route) {
10
+ return ASYNC_ROUTES.has(route.replace(/\/+$/, ''));
11
+ }
12
+ async function readBailianJson(response, model) {
13
+ return await readJsonResponse(response, 'Bailian', (body) => {
14
+ const message = ['/message', '/error/message', '/output/base_resp/status_msg']
15
+ .map((pointer) => stringAt(body, pointer))
16
+ .find((value) => value && /product is not activated|model.*(?:not activated|not authorized)|产品未开通|模型未开通/i.test(value));
17
+ if (message) {
18
+ throw new AiRuntimeError('provider_product_not_activated', `百炼账号未开通该模型(${model ?? '当前模型'}),请到百炼控制台 https://bailian.console.aliyun.com/ 开通后重试;开通前不要重复提交。`, {
19
+ retryable: false, category: 'authentication', status: response.status,
20
+ providerCode: stringAt(body, '/code') ?? stringAt(body, '/error/code') ?? getPointer(body, '/output/base_resp/status_code'),
21
+ providerMessage: message,
22
+ });
23
+ }
24
+ });
25
+ }
6
26
  export async function execute(input) {
27
+ const asyncTask = isAsyncRoute(input.route);
28
+ const body = JSON.stringify(input.body);
7
29
  const response = await fetchProvider('Bailian', normalizeEndpoint(BAILIAN_BASE_URL, input.route), {
8
30
  method: input.method,
9
31
  headers: {
10
32
  Authorization: `Bearer ${input.apiKey}`,
11
33
  'Content-Type': 'application/json',
34
+ ...(asyncTask ? { 'X-DashScope-Async': 'enable' } : {}),
35
+ // 本地素材经临时存储上传成 oss:// 后,官方要求带这个头才会解析。
36
+ ...(body.includes('"oss://') ? { 'X-DashScope-OssResourceResolve': 'enable' } : {}),
12
37
  },
13
- body: JSON.stringify(input.body),
38
+ body,
14
39
  signal: input.signal,
15
40
  }, {
16
41
  transport: input.runtime.transport,
17
42
  retryPreconnectOnce: true,
18
43
  });
19
- const payload = await readJsonResponse(response, 'Bailian');
44
+ const payload = await readBailianJson(response, stringAt(input.body, '/model'));
20
45
  const errorCode = stringAt(payload, '/code');
21
46
  if (errorCode) {
22
47
  throw new AiRuntimeError('provider_task_failed', stringAt(payload, '/message') ?? errorCode);
23
48
  }
49
+ if (asyncTask) {
50
+ const taskStatus = stringAt(payload, '/output/task_status');
51
+ if (taskStatus === 'FAILED' || taskStatus === 'CANCELED')
52
+ throw taskFailure(payload, taskStatus);
53
+ const taskId = stringAt(payload, '/output/task_id')?.trim();
54
+ if (!taskId)
55
+ throw new AiRuntimeError('invalid_response', 'Bailian async task response has no task_id');
56
+ return { status: 'pending', url: '', taskId, metadata: payload };
57
+ }
24
58
  const speechStatus = getPointer(payload, '/output/base_resp/status_code');
25
59
  if (typeof speechStatus === 'number' && speechStatus !== 0) {
26
60
  throw new AiRuntimeError('provider_task_failed', stringAt(payload, '/output/base_resp/status_msg') ?? `MiniMax status ${speechStatus}`);
@@ -54,8 +88,41 @@ export async function execute(input) {
54
88
  }
55
89
  return { status: 'completed', url: urls.join('|||'), metadata: payload };
56
90
  }
57
- export async function continuePolling(_input) {
58
- throw new AiRuntimeError('unsupported_provider', 'Bailian official image models use synchronous generation');
91
+ export async function continuePolling(input) {
92
+ if (!isAsyncRoute(input.route)) {
93
+ throw new AiRuntimeError('unsupported_provider', 'Bailian official image models use synchronous generation');
94
+ }
95
+ const payload = await pollUntilResult(input, async () => {
96
+ const response = await fetchProvider('Bailian', `${BAILIAN_BASE_URL}/api/v1/tasks/${encodeURIComponent(input.taskId)}`, {
97
+ headers: { Authorization: `Bearer ${input.apiKey}` },
98
+ signal: input.signal,
99
+ }, {
100
+ transport: input.runtime.transport,
101
+ retryPreconnectOnce: true,
102
+ });
103
+ const result = await readBailianJson(response, undefined);
104
+ const status = stringAt(result, '/output/task_status');
105
+ if (status === 'SUCCEEDED')
106
+ return result;
107
+ if (status === 'PENDING' || status === 'RUNNING')
108
+ return undefined;
109
+ if (status === 'FAILED' || status === 'CANCELED')
110
+ throw taskFailure(result, status);
111
+ // UNKNOWN 表示任务不存在或已过 24 小时查询期;与缺状态一样计入连续查询失败,不立刻判死。
112
+ return POLL_QUERY_FAILED;
113
+ });
114
+ const videoUrl = stringAt(payload, '/output/video_url');
115
+ if (!videoUrl || !/^https?:\/\//i.test(videoUrl)) {
116
+ throw new AiRuntimeError('empty_result', `Bailian task has no video_url (task_id=${input.taskId})`);
117
+ }
118
+ return { status: 'completed', url: videoUrl, taskId: input.taskId, metadata: payload };
119
+ }
120
+ function taskFailure(payload, status) {
121
+ const code = stringAt(payload, '/output/code');
122
+ const message = stringAt(payload, '/output/message') ?? (status === 'CANCELED' ? '任务已取消' : 'Bailian task failed');
123
+ return new AiRuntimeError('provider_task_failed', code ? `${code}: ${message}` : message, {
124
+ providerCode: code, providerMessage: message,
125
+ });
59
126
  }
60
127
  function extractImageUrls(value) {
61
128
  const urls = [];
@@ -121,9 +121,19 @@ function requireFalQueueUrl(value, field) {
121
121
  }
122
122
  return parsed.toString();
123
123
  }
124
+ /**
125
+ * `draft_cache` 是 FLUX 3 草稿端点返回的加密缓存包,只用于转正片,不是生成结果;
126
+ * 收进媒体地址会被宿主当成第二段视频下载。它仍原样留在 metadata 里供续接读取。
127
+ */
124
128
  function extractUrls(payload) {
125
129
  const urls = [];
126
- collectDeepUrls(payload, urls);
130
+ if (isJsonObject(payload) && 'draft_cache' in payload) {
131
+ const { draft_cache: _draftCache, ...media } = payload;
132
+ collectDeepUrls(media, urls);
133
+ }
134
+ else {
135
+ collectDeepUrls(payload, urls);
136
+ }
127
137
  return urls;
128
138
  }
129
139
  function enrichRequestId(value, requestId) {
@@ -1,6 +1,6 @@
1
1
  import type { JsonObject, JsonValue } from '../types/runtime.js';
2
2
  export declare function normalizeEndpoint(base: string, route: string): string;
3
- export declare function readJsonResponse(response: Response, provider: string): Promise<JsonValue>;
3
+ export declare function readJsonResponse(response: Response, provider: string, inspect?: (payload: JsonValue) => void): Promise<JsonValue>;
4
4
  export declare function asObject(value: JsonValue): JsonObject;
5
5
  export declare function getPointer(value: JsonValue, pointer: string): JsonValue | undefined;
6
6
  export declare function stringAt(value: JsonValue, pointer: string): string | undefined;
@@ -1,4 +1,5 @@
1
1
  import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
+ import { assertProviderAccess } from './providerAccessErrors.js';
2
3
  export function normalizeEndpoint(base, route) {
3
4
  if (route.startsWith('http://') || route.startsWith('https://')) {
4
5
  return route;
@@ -8,13 +9,24 @@ export function normalizeEndpoint(base, route) {
8
9
  }
9
10
  return `${base}/${route}`;
10
11
  }
11
- export async function readJsonResponse(response, provider) {
12
- const payload = await response.json().catch((error) => {
12
+ export async function readJsonResponse(response, provider, inspect) {
13
+ const text = await response.text();
14
+ let payload;
15
+ try {
16
+ payload = JSON.parse(text);
17
+ }
18
+ catch (error) {
19
+ if (!response.ok) {
20
+ assertProviderAccess(provider, {}, response.status);
21
+ throw new AiRuntimeError('provider_http_error', `${provider} HTTP ${response.status}: ${text.slice(0, 500)}`, { status: response.status });
22
+ }
13
23
  const message = error instanceof Error ? error.message : String(error);
14
- throw new AiRuntimeError('invalid_json', message);
15
- });
24
+ throw new AiRuntimeError('invalid_json', message, { status: response.status });
25
+ }
26
+ inspect?.(payload);
27
+ assertProviderAccess(provider, payload, response.status);
16
28
  if (!response.ok) {
17
- throw new AiRuntimeError('provider_http_error', `${provider} HTTP ${response.status}: ${JSON.stringify(payload)}`);
29
+ throw new AiRuntimeError('provider_http_error', `${provider} HTTP ${response.status}: ${JSON.stringify(payload)}`, { status: response.status });
18
30
  }
19
31
  return payload;
20
32
  }
@@ -42,6 +42,7 @@ async function sendCreateTask(input, endpoint) {
42
42
  const code = getPointer(payload, '/code');
43
43
  const success = getPointer(payload, '/success');
44
44
  if ((typeof code === 'number' && code !== 200) || success === false) {
45
+ assertKieTaskFailure(code, stringAt(payload, '/msg') ?? '');
45
46
  throw new AiRuntimeError('provider_task_failed', stringAt(payload, '/msg') ?? 'KIE create task failed');
46
47
  }
47
48
  return payload;
@@ -58,16 +59,18 @@ async function pollTask(input) {
58
59
  });
59
60
  const payload = await readJsonResponse(response, 'KIE');
60
61
  const code = getPointer(payload, '/code');
61
- if (typeof code === 'number' && code !== 200) {
62
- // 查询本身没成功(含 taskId 已被清理的情况),不是"任务还在跑"
63
- return POLL_QUERY_FAILED;
62
+ if ((typeof code === 'number' && code !== 200) || getPointer(payload, '/success') === false) {
63
+ // 查询失败保留供应商事实;鉴权/余额错误已由 readJsonResponse 立即终止。
64
+ const message = stringAt(payload, '/msg') ?? stringAt(payload, '/message') ?? 'provider reported a non-success status';
65
+ throw new AiRuntimeError('provider_http_error', `KIE recordInfo code=${code ?? 'unknown'}: ${message}`, {
66
+ status: response.status, providerCode: code, providerMessage: message,
67
+ });
64
68
  }
65
- if (getPointer(payload, '/success') === false)
66
- return POLL_QUERY_FAILED;
67
69
  const state = (stringAt(payload, '/data/state') ?? '').trim().toLowerCase();
68
70
  if (state === 'success')
69
71
  return payload;
70
72
  if (state === 'fail') {
73
+ assertKieTaskFailure(getPointer(payload, '/data/failCode'), stringAt(payload, '/data/failMsg') ?? '');
71
74
  throw new AiRuntimeError('provider_task_failed', stringAt(payload, '/data/failMsg') ?? 'KIE task failed');
72
75
  }
73
76
  if (['waiting', 'queuing', 'generating'].includes(state))
@@ -75,6 +78,14 @@ async function pollTask(input) {
75
78
  return POLL_QUERY_FAILED;
76
79
  });
77
80
  }
81
+ function assertKieTaskFailure(code, message) {
82
+ if (/^Internal Error(?:,|\.|$)/i.test(message.trim())) {
83
+ throw new AiRuntimeError('provider_internal_error', 'KIE 服务内部错误,可稍后手动重试。', { retryable: true, terminal: true, providerCode: code, providerMessage: message });
84
+ }
85
+ if (String(code) === '422') {
86
+ throw new AiRuntimeError('provider_invalid_request', `KIE 拒绝了请求参数,请修改后重试:${message}`, { retryable: false, providerCode: code, providerMessage: message });
87
+ }
88
+ }
78
89
  function extractTaskId(payload) {
79
90
  return stringAt(payload, '/data/taskId');
80
91
  }
@@ -82,8 +82,8 @@ export const PROVIDER_METADATA = [
82
82
  {
83
83
  providerId: 'minimax',
84
84
  displayName: 'MiniMax',
85
- websiteUrl: 'https://platform.minimaxi.com/',
86
- apiKeyUrl: 'https://platform.minimaxi.com/console/access?tab=api-keys',
85
+ websiteUrl: 'https://platform.minimax.cn/',
86
+ apiKeyUrl: 'https://platform.minimax.cn/console/access?tab=api-keys',
87
87
  websiteUrlKind: 'official',
88
88
  docs: 'docs/llm-adaptation/供应商/MiniMax.md',
89
89
  },
@@ -0,0 +1,6 @@
1
+ import type { ProviderExecutionInput, ProviderExecutionResult } from '../types/runtime.js';
2
+ /**
3
+ * OpenAI 兼容 `/audio/speech`:同步返回音频二进制,错误时返回 JSON 错误体。
4
+ * 返回的音频转成 data URI,由宿主按普通媒体结果落盘。
5
+ */
6
+ export declare function executeOpenAiCompatibleSpeech(providerName: string, baseUrl: string, input: ProviderExecutionInput, defaultFormat: string): Promise<ProviderExecutionResult>;
@@ -0,0 +1,31 @@
1
+ import { audioBytesToDataUri } from './audio-data.js';
2
+ import { isJsonObject, normalizeEndpoint, readJsonResponse } from './helpers.js';
3
+ import { fetchProvider } from './provider-fetch.js';
4
+ /**
5
+ * OpenAI 兼容 `/audio/speech`:同步返回音频二进制,错误时返回 JSON 错误体。
6
+ * 返回的音频转成 data URI,由宿主按普通媒体结果落盘。
7
+ */
8
+ export async function executeOpenAiCompatibleSpeech(providerName, baseUrl, input, defaultFormat) {
9
+ const response = await fetchProvider(providerName, normalizeEndpoint(baseUrl, input.route), {
10
+ method: 'POST',
11
+ headers: {
12
+ Authorization: `Bearer ${input.apiKey}`,
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ body: JSON.stringify(input.body),
16
+ signal: input.signal,
17
+ }, {
18
+ transport: input.runtime.transport,
19
+ retryPreconnectOnce: true,
20
+ });
21
+ if (!response.ok) {
22
+ await readJsonResponse(response, providerName);
23
+ }
24
+ const bytes = new Uint8Array(await response.arrayBuffer());
25
+ const format = isJsonObject(input.body) && typeof input.body.response_format === 'string' ? input.body.response_format : defaultFormat;
26
+ return {
27
+ status: 'completed',
28
+ url: audioBytesToDataUri(bytes, format),
29
+ metadata: { contentType: response.headers.get('content-type'), byteLength: bytes.byteLength },
30
+ };
31
+ }
@@ -0,0 +1,3 @@
1
+ import type { JsonValue } from '../types/runtime.js';
2
+ /** 仅按供应商官方错误契约识别;未知 403/500 保留原分类,禁止猜测余额或模型开通状态。 */
3
+ export declare function assertProviderAccess(provider: string, payload: JsonValue, status: number): void;
@@ -0,0 +1,73 @@
1
+ import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
+ const object = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : {};
3
+ /** 仅按供应商官方错误契约识别;未知 403/500 保留原分类,禁止猜测余额或模型开通状态。 */
4
+ export function assertProviderAccess(provider, payload, status) {
5
+ const body = object(payload);
6
+ const error = object(body.error ?? body.errors);
7
+ const code = String(error.code ?? body.code ?? '');
8
+ const providerMessage = String(error.message ?? body.message ?? body.msg ?? '');
9
+ if (provider === 'KIE' && (['401', '403'].includes(code) || status === 401 || status === 403)) {
10
+ throw new AiRuntimeError('provider_authentication_failed', 'KIE 鉴权失败,请检查 API Key 与账号权限。控制台:https://kie.ai/api-key', {
11
+ retryable: false, category: 'authentication', providerCode: code || String(status), status,
12
+ providerMessage: String(error.message ?? body.message ?? body.msg ?? ''),
13
+ });
14
+ }
15
+ let kind;
16
+ let accountNotVerified = false;
17
+ if (provider === 'Bailian') {
18
+ if (code === 'Arrearage')
19
+ kind = 'insufficient_balance';
20
+ else if (code === 'AccessDenied.Unpurchased')
21
+ kind = 'product_not_activated';
22
+ else if (code === 'Model.AccessDenied')
23
+ kind = 'model_access_denied';
24
+ }
25
+ else if (provider === 'KIE' && (code === '402' || status === 402))
26
+ kind = 'insufficient_balance';
27
+ else if (provider === 'PPIO') {
28
+ if (['BILLING_BALANCE_NOT_ENOUGH', 'NOT_ENOUGH_BALANCE'].includes(code))
29
+ kind = 'insufficient_balance';
30
+ else if (['API_NOT_ALLOWED', 'ACCESS_DENY'].includes(code))
31
+ kind = 'model_access_denied';
32
+ }
33
+ else if (provider === 'SiliconFlow') {
34
+ if (status === 402)
35
+ kind = 'insufficient_balance';
36
+ else if (status === 403)
37
+ kind = 'model_access_denied';
38
+ }
39
+ else if (provider === 'APIMart') {
40
+ if (code === '402' || status === 402)
41
+ kind = 'insufficient_balance';
42
+ else if (code === '403' || status === 403)
43
+ kind = 'model_access_denied';
44
+ }
45
+ else if (provider === 'ModelScope') {
46
+ // 魔搭 API 推理只对完成邮箱验证的账号开放;这个 403 只有英文 message,没有错误码。
47
+ if (status === 403 && /verified accounts|email verification/i.test(providerMessage)) {
48
+ kind = 'product_not_activated';
49
+ accountNotVerified = true;
50
+ }
51
+ }
52
+ else if (provider === 'Volcengine Ark') {
53
+ if (code === 'AccountOverdueError')
54
+ kind = 'insufficient_balance';
55
+ else if (['ModelNotOpen', 'OperationDenied.ServiceNotOpen'].includes(code))
56
+ kind = 'product_not_activated';
57
+ else if (['AccessDenied', 'OperationDenied.PermissionDenied'].includes(code))
58
+ kind = 'model_access_denied';
59
+ }
60
+ if (!kind)
61
+ return;
62
+ const name = provider === 'Bailian' ? '百炼' : provider === 'SiliconFlow' ? '硅基流动' : provider === 'Volcengine Ark' ? '火山方舟' : provider === 'ModelScope' ? '魔搭' : provider;
63
+ const destination = { Bailian: 'https://bailian.console.aliyun.com/', KIE: 'https://kie.ai/', PPIO: 'https://ppio.com/console', SiliconFlow: 'https://cloud.siliconflow.cn/', APIMart: 'https://apimart.ai/', 'Volcengine Ark': 'https://console.volcengine.com/ark/', ModelScope: 'https://modelscope.cn/my/settings/account' };
64
+ const action = accountNotVerified ? '账号需先完成邮箱验证才能调用 API 推理,请到账号设置完成验证后重试'
65
+ : kind === 'insufficient_balance' ? '账户余额不足或已欠费,请充值后重试'
66
+ : kind === 'product_not_activated' ? '账号未开通该模型,请先开通模型服务'
67
+ : '账号没有该模型的调用权限,请检查模型授权和实名认证';
68
+ throw new AiRuntimeError(`provider_${kind}`, `${name}${action}。控制台:${destination[provider]}`, {
69
+ retryable: false, category: 'authentication', providerCode: code, status,
70
+ providerMessage,
71
+ scope: kind === 'insufficient_balance' || accountNotVerified ? 'account' : 'model',
72
+ });
73
+ }
@@ -1,33 +1,8 @@
1
1
  import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
- import { audioBytesToDataUri } from './audio-data.js';
3
- import { normalizeEndpoint } from './helpers.js';
4
- import { isJsonObject } from './helpers.js';
5
- import { fetchProvider } from './provider-fetch.js';
2
+ import { executeOpenAiCompatibleSpeech } from './openai-speech.js';
6
3
  const BASE_URL = 'https://api.siliconflow.cn';
7
4
  export async function execute(input) {
8
- const response = await fetchProvider('SiliconFlow', normalizeEndpoint(BASE_URL, input.route), {
9
- method: 'POST',
10
- headers: {
11
- Authorization: `Bearer ${input.apiKey}`,
12
- 'Content-Type': 'application/json',
13
- },
14
- body: JSON.stringify(input.body),
15
- signal: input.signal,
16
- }, {
17
- transport: input.runtime.transport,
18
- retryPreconnectOnce: true,
19
- });
20
- if (!response.ok) {
21
- await response.body?.cancel().catch(() => undefined);
22
- throw new AiRuntimeError('provider_task_failed', `SiliconFlow speech request failed (HTTP ${response.status})`);
23
- }
24
- const bytes = new Uint8Array(await response.arrayBuffer());
25
- const requestedFormat = isJsonObject(input.body) && typeof input.body.response_format === 'string' ? input.body.response_format : 'mp3';
26
- const url = audioBytesToDataUri(bytes, requestedFormat);
27
- return {
28
- status: 'completed', url,
29
- metadata: { contentType: response.headers.get('content-type'), byteLength: bytes.byteLength },
30
- };
5
+ return executeOpenAiCompatibleSpeech('SiliconFlow', BASE_URL, input, 'mp3');
31
6
  }
32
7
  export async function continuePolling(_input) {
33
8
  throw new AiRuntimeError('unsupported_provider', 'SiliconFlow speech response is synchronous');
@@ -1,3 +1,3 @@
1
1
  import type { ProviderContinuePollingInput, ProviderExecutionInput, ProviderExecutionResult } from '../types/runtime.js';
2
2
  export declare function execute(input: ProviderExecutionInput): Promise<ProviderExecutionResult>;
3
- export declare function continuePolling(_input: ProviderContinuePollingInput): Promise<ProviderExecutionResult>;
3
+ export declare function continuePolling(input: ProviderContinuePollingInput): Promise<ProviderExecutionResult>;
@@ -5,6 +5,7 @@ import { fromBase64 } from '../upload/base64.js';
5
5
  import { audioBytesToDataUri } from './audio-data.js';
6
6
  import { isJsonObject, normalizeEndpoint } from './helpers.js';
7
7
  import { fetchProvider } from './provider-fetch.js';
8
+ import { executeVoiceClone, pollVoiceClone } from './volcengine-voice-clone.js';
8
9
  const BASE_URL = 'https://openspeech.bytedance.com';
9
10
  const ENDPOINT = '/api/v3/tts/unidirectional';
10
11
  function decodeChunk(encoded) {
@@ -15,7 +16,7 @@ function decodeChunk(encoded) {
15
16
  throw new AiRuntimeError('invalid_response', 'Volcengine speech returned invalid base64 audio');
16
17
  }
17
18
  }
18
- function parseFrame(payload, audio, usage) {
19
+ function parseFrame(payload, audio, usage, items) {
19
20
  if (!payload)
20
21
  return;
21
22
  let value;
@@ -32,8 +33,19 @@ function parseFrame(payload, audio, usage) {
32
33
  audio.push(decodeChunk(value.data));
33
34
  if (isJsonObject(value.usage) && typeof value.usage.text_words === 'number')
34
35
  usage.textWords = value.usage.text_words;
36
+ if (isJsonObject(value.sentence) && Array.isArray(value.sentence.words)) {
37
+ for (const word of value.sentence.words) {
38
+ if (!isJsonObject(word) || typeof word.word !== 'string' || typeof word.startTime !== 'number' || typeof word.endTime !== 'number'
39
+ || !Number.isFinite(word.startTime) || !Number.isFinite(word.endTime) || word.startTime < 0 || word.endTime < word.startTime) {
40
+ throw new AiRuntimeError('invalid_response', 'Volcengine speech returned invalid subtitle timing');
41
+ }
42
+ items.push({ text: word.word, startMs: word.startTime * 1000, endMs: word.endTime * 1000,
43
+ ...(typeof word.confidence === 'number' && word.confidence >= 0 && word.confidence <= 1 ? { confidence: word.confidence } : {}),
44
+ });
45
+ }
46
+ }
35
47
  }
36
- function consumeFrames(buffer, audio, usage) {
48
+ function consumeFrames(buffer, audio, usage, items) {
37
49
  let start = -1;
38
50
  let depth = 0;
39
51
  let quoted = false;
@@ -67,7 +79,7 @@ function consumeFrames(buffer, audio, usage) {
67
79
  else if (character === '}') {
68
80
  depth -= 1;
69
81
  if (depth === 0) {
70
- parseFrame(buffer.slice(start, index + 1), audio, usage);
82
+ parseFrame(buffer.slice(start, index + 1), audio, usage, items);
71
83
  start = -1;
72
84
  consumed = index + 1;
73
85
  }
@@ -76,6 +88,8 @@ function consumeFrames(buffer, audio, usage) {
76
88
  return buffer.slice(start < 0 ? consumed : start);
77
89
  }
78
90
  export async function execute(input) {
91
+ if (input.route === '/api/v3/tts/voice_clone')
92
+ return executeVoiceClone(input);
79
93
  if (!isJsonObject(input.body) || !isJsonObject(input.body.req_params)) {
80
94
  throw new AiRuntimeError('invalid_request', 'Volcengine speech requires req_params');
81
95
  }
@@ -105,22 +119,27 @@ export async function execute(input) {
105
119
  const decoder = createUtf8StreamDecoder();
106
120
  const audio = [];
107
121
  const usage = {};
122
+ const items = [];
108
123
  let pending = '';
109
124
  const cancelReader = () => { void reader.cancel(input.signal?.reason).catch(() => undefined); };
110
125
  input.signal?.addEventListener('abort', cancelReader, { once: true });
111
126
  try {
112
- while (true) {
127
+ for (;;) {
113
128
  input.signal?.throwIfAborted();
114
129
  const { done, value } = await reader.read();
115
130
  input.signal?.throwIfAborted();
116
131
  pending += done ? decoder.decode() : decoder.decode(value, { stream: true });
117
- pending = consumeFrames(pending, audio, usage);
132
+ pending = consumeFrames(pending, audio, usage, items);
118
133
  if (done)
119
134
  break;
120
135
  }
121
136
  if (pending.trim())
122
137
  throw new AiRuntimeError('invalid_response', 'Volcengine speech returned incomplete JSON frame');
123
138
  }
139
+ catch (error) {
140
+ await reader.cancel(error).catch(() => undefined);
141
+ throw error;
142
+ }
124
143
  finally {
125
144
  input.signal?.removeEventListener('abort', cancelReader);
126
145
  reader.releaseLock();
@@ -135,9 +154,13 @@ export async function execute(input) {
135
154
  return {
136
155
  status: 'completed',
137
156
  url: audioBytesToDataUri(joined, 'mp3'),
138
- metadata: { byteLength: total, ...(usage.textWords === undefined ? {} : { textWords: usage.textWords }) },
157
+ metadata: { byteLength: total, ...(usage.textWords === undefined ? {} : { textWords: usage.textWords }),
158
+ ...(items.length ? { outputTimings: [{ outputIndex: 0, timings: { granularity: 'char', items } }] } : {}),
159
+ ...(resourceId === 'seed-icl-2.0' && typeof input.body.req_params.speaker === 'string'
160
+ ? { activatedVoiceId: input.body.req_params.speaker } : {}),
161
+ },
139
162
  };
140
163
  }
141
- export async function continuePolling(_input) {
142
- throw new AiRuntimeError('unsupported_provider', 'Volcengine speech uses one HTTP stream');
164
+ export async function continuePolling(input) {
165
+ return pollVoiceClone(input);
143
166
  }
@@ -0,0 +1,3 @@
1
+ import type { ProviderExecutionInput, ProviderContinuePollingInput, ProviderExecutionResult } from '../types/runtime.js';
2
+ export declare function executeVoiceClone(input: ProviderExecutionInput): Promise<ProviderExecutionResult>;
3
+ export declare function pollVoiceClone(input: ProviderContinuePollingInput): Promise<ProviderExecutionResult>;
@@ -0,0 +1,138 @@
1
+ import { AiRuntimeError } from '../runtime/AiRuntimeError.js';
2
+ import { volcengineRequestId } from '../capabilities/speech-recognition/volcengine/request-id.js';
3
+ import { pollUntilResult } from '../protocols/polling.js';
4
+ import { parseDataUri } from '../upload/media-binary.js';
5
+ import { toBase64 } from '../upload/base64.js';
6
+ import { isJsonObject } from './helpers.js';
7
+ import { fetchProvider } from './provider-fetch.js';
8
+ const TASK_PREFIX = 'volc-voice:';
9
+ const MAX_AUDIO_BYTES = 10_000_000;
10
+ function taskId(identity) { return TASK_PREFIX + encodeURIComponent(JSON.stringify(identity)); }
11
+ function decodeTask(value) {
12
+ try {
13
+ if (!value.startsWith(TASK_PREFIX))
14
+ throw new Error('prefix');
15
+ const data = JSON.parse(decodeURIComponent(value.slice(TASK_PREFIX.length)));
16
+ if (!isJsonObject(data) || typeof data.speaker !== 'string' || !data.speaker.trim()
17
+ || typeof data.name !== 'string' || !data.name.trim() || typeof data.postpaid !== 'boolean'
18
+ || typeof data.submission !== 'string' || !data.submission.trim())
19
+ throw new Error('identity');
20
+ return { speaker: data.speaker, name: data.name, postpaid: data.postpaid, submission: data.submission };
21
+ }
22
+ catch {
23
+ throw new AiRuntimeError('invalid_task_id', '无效的音色训练任务');
24
+ }
25
+ }
26
+ function speakerBody(identity) {
27
+ return identity.postpaid
28
+ ? { speaker_id: 'custom_speaker_id', custom_speaker_id: identity.speaker }
29
+ : { speaker_id: identity.speaker };
30
+ }
31
+ async function request(input, route, body) {
32
+ input.signal?.throwIfAborted();
33
+ const response = await fetchProvider('Volcengine Speech', `https://openspeech.bytedance.com${route}`, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json', 'X-Api-Key': input.apiKey, 'X-Api-Request-Id': volcengineRequestId(input.requestId, undefined) },
36
+ body: JSON.stringify(body), signal: input.signal,
37
+ }, { transport: input.runtime.transport, retryPreconnectOnce: false });
38
+ const text = await response.text();
39
+ let payload;
40
+ try {
41
+ payload = JSON.parse(text);
42
+ }
43
+ catch {
44
+ throw new AiRuntimeError(response.ok ? 'invalid_json' : 'provider_http_error', `Volcengine Speech HTTP ${response.status}: 音色训练返回了非 JSON 响应`, { status: response.status });
45
+ }
46
+ if (!isJsonObject(payload))
47
+ throw new AiRuntimeError('invalid_response', '音色训练返回了无效响应');
48
+ if (!response.ok || (payload.code !== undefined && payload.code !== 0)) {
49
+ throw new AiRuntimeError('provider_task_failed', typeof payload.message === 'string' ? payload.message : `音色训练请求失败(HTTP ${response.status})`, { status: response.status });
50
+ }
51
+ return payload;
52
+ }
53
+ function parseResult(payload, identity) {
54
+ if (typeof payload.speaker_id !== 'string' || !payload.speaker_id.trim()
55
+ || ![0, 1, 2, 3, 4].includes(payload.status)) {
56
+ throw new AiRuntimeError('invalid_response', '音色训练响应缺少有效音色或状态');
57
+ }
58
+ // 后付费响应可返回固定代号;实际自定义代号来自已提交任务身份。
59
+ if (payload.speaker_id !== identity.speaker && !(identity.postpaid && payload.speaker_id === 'custom_speaker_id')) {
60
+ throw new AiRuntimeError('invalid_response', '音色查询返回了其他音色');
61
+ }
62
+ if (payload.status === 0 || payload.status === 3) {
63
+ throw new AiRuntimeError(payload.status === 0 ? 'voice_not_found' : 'voice_training_failed', typeof payload.message === 'string' ? payload.message : payload.status === 0 ? '音色不存在或尚未训练' : '音色训练失败', { retryable: false });
64
+ }
65
+ const ready = payload.status === 2 || payload.status === 4;
66
+ const samples = Array.isArray(payload.speaker_status) ? payload.speaker_status : [];
67
+ const sample = samples.find(item => isJsonObject(item) && item.model_type === 5);
68
+ const demo = isJsonObject(sample) && typeof sample.demo_audio === 'string' ? sample.demo_audio : '';
69
+ if (demo && !/^https:\/\//i.test(demo))
70
+ throw new AiRuntimeError('invalid_response', '音色试听地址无效');
71
+ return {
72
+ status: ready ? 'completed' : 'pending', url: ready ? demo : '', taskId: taskId(identity),
73
+ metadata: {
74
+ ...payload,
75
+ clonedVoice: { id: identity.speaker, name: identity.name, status: ready ? 'ready' : 'training',
76
+ postpaid: identity.postpaid, activated: payload.status === 4,
77
+ ...(typeof payload.create_time === 'number' ? { createdAt: payload.create_time } : {}) },
78
+ },
79
+ };
80
+ }
81
+ export async function executeVoiceClone(input) {
82
+ if (!isJsonObject(input.body))
83
+ throw new AiRuntimeError('invalid_request', '音色克隆参数无效');
84
+ const body = input.body;
85
+ if (typeof body.clone_audio !== 'string' || typeof body.voice_name !== 'string' || !body.voice_name.trim()) {
86
+ throw new AiRuntimeError('invalid_request', '请填写音色名称并上传声音样本');
87
+ }
88
+ const existing = typeof body.speaker_id === 'string' ? body.speaker_id.trim() : '';
89
+ const custom = typeof body.custom_speaker_id === 'string' ? body.custom_speaker_id.trim() : '';
90
+ const identity = {
91
+ speaker: existing || custom || `henji${volcengineRequestId(input.requestId, undefined).replaceAll('-', '')}`,
92
+ name: body.voice_name.trim(), postpaid: !existing,
93
+ submission: volcengineRequestId(input.requestId, undefined),
94
+ };
95
+ const audio = parseDataUri(body.clone_audio) ?? await input.runtime.media.read(body.clone_audio);
96
+ if (!audio.bytes.length || audio.bytes.length > MAX_AUDIO_BYTES)
97
+ throw new AiRuntimeError('invalid_media', '声音样本必须非空且不超过 10 MB');
98
+ const formats = { 'audio/wav': 'wav', 'audio/x-wav': 'wav', 'audio/wave': 'wav', 'audio/mpeg': 'mp3', 'audio/mp3': 'mp3', 'audio/ogg': 'ogg', 'audio/mp4': 'm4a', 'audio/x-m4a': 'm4a', 'audio/aac': 'aac' };
99
+ const format = formats[audio.mimeType];
100
+ if (!format)
101
+ throw new AiRuntimeError('invalid_media', '请上传 WAV、MP3、OGG、M4A 或 AAC 音频');
102
+ const payload = {
103
+ ...speakerBody(identity), audio: { data: toBase64(audio.bytes), format },
104
+ language: body.language ?? 0, extra_params: body.extra_params ?? {},
105
+ ...(typeof body.text === 'string' && body.text.trim() ? { text: body.text } : {}),
106
+ };
107
+ // Existing slots are never overwritten blindly (activation makes training unavailable).
108
+ if (existing) {
109
+ const current = await request(input, '/api/v3/tts/get_voice', speakerBody(identity));
110
+ if (current.speaker_id !== existing || ![0, 1, 2, 3, 4].includes(current.status)) {
111
+ throw new AiRuntimeError('invalid_response', '无法确认已有音色的训练状态');
112
+ }
113
+ if (current.status === 4 || current.status === 1 || current.available_training_times === 0) {
114
+ throw new AiRuntimeError('invalid_request', '该音色已锁定、正在训练或没有剩余训练次数,请选择其他音色');
115
+ }
116
+ }
117
+ try {
118
+ return parseResult(await request(input, '/api/v3/tts/voice_clone', payload), identity);
119
+ }
120
+ catch (error) {
121
+ // A connection loss after sending is ambiguous. Keep a queryable identity;
122
+ // never send a second training request to guess whether the first succeeded.
123
+ if (error instanceof AiRuntimeError && error.code === 'provider_network_error' && error.details?.submissionState === 'unknown') {
124
+ return { status: 'pending', url: '', taskId: taskId(identity), metadata: {
125
+ submissionUnconfirmed: true,
126
+ clonedVoice: { id: identity.speaker, name: identity.name, status: 'training', postpaid: identity.postpaid, activated: false },
127
+ } };
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ export async function pollVoiceClone(input) {
133
+ const identity = decodeTask(input.taskId);
134
+ return pollUntilResult(input, async () => {
135
+ const result = parseResult(await request(input, '/api/v3/tts/get_voice', speakerBody(identity)), identity);
136
+ return result.status === 'pending' ? undefined : result;
137
+ });
138
+ }