@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.
- package/CHANGELOG.md +275 -211
- package/README.md +580 -577
- package/dist/capabilities/speech-recognition/bailian/module.js +40 -26
- package/dist/capabilities/speech-recognition/bailian/parse.js +9 -2
- package/dist/capabilities/speech-recognition/bailian/presets.d.ts +9 -1
- package/dist/capabilities/speech-recognition/bailian/presets.js +7 -2
- package/dist/capabilities/speech-recognition/bailian/realtime/presets.d.ts +2 -1
- package/dist/capabilities/speech-recognition/bailian/realtime/presets.js +2 -0
- package/dist/capabilities/speech-recognition/bailian/types.d.ts +2 -0
- package/dist/capabilities/speech-recognition/bailian/upload.js +11 -58
- package/dist/capabilities/speech-recognition/index.d.ts +5 -0
- package/dist/capabilities/speech-recognition/siliconflow/presets.d.ts +2 -3
- package/dist/capabilities/speech-recognition/siliconflow/presets.js +0 -2
- package/dist/capabilities/translation/bailian/types.d.ts +3 -0
- package/dist/capabilities/translation/bailian/types.js +6 -4
- package/dist/catalog/apimart/flux-3-image.model.d.ts +3 -0
- package/dist/catalog/apimart/flux-3-image.model.js +62 -0
- package/dist/catalog/apimart/flux-3-video.model.d.ts +3 -0
- package/dist/catalog/apimart/flux-3-video.model.js +120 -0
- package/dist/catalog/apimart/gemini-omni-1.2-flash.model.d.ts +3 -0
- package/dist/catalog/apimart/gemini-omni-1.2-flash.model.js +175 -0
- package/dist/catalog/apimart/gemini-omni-flash.model.js +30 -37
- package/dist/catalog/apimart/gpt-image-2.5.model.js +1 -1
- package/dist/catalog/apimart/gpt-image-2.6.model.d.ts +3 -0
- package/dist/catalog/apimart/gpt-image-2.6.model.js +103 -0
- package/dist/catalog/apimart/gpt-image-2.model.js +1 -1
- package/dist/catalog/apimart/grok-imagine-2.0.model.js +1 -1
- package/dist/catalog/apimart/grok-imagine-video-1.5.model.d.ts +3 -0
- package/dist/catalog/apimart/grok-imagine-video-1.5.model.js +85 -0
- package/dist/catalog/apimart/happyhorse-1.1.model.d.ts +3 -0
- package/dist/catalog/apimart/happyhorse-1.1.model.js +78 -0
- package/dist/catalog/apimart/kling-3.0-omni.model.js +12 -2
- package/dist/catalog/apimart/kling-3.0-turbo.model.js +5 -2
- package/dist/catalog/apimart/kling-3.0.model.js +1 -1
- package/dist/catalog/apimart/kling-4.0.model.d.ts +3 -0
- package/dist/catalog/apimart/kling-4.0.model.js +149 -0
- package/dist/catalog/apimart/midjourney-video.model.js +31 -32
- package/dist/catalog/apimart/midjourney.model.js +11 -1
- package/dist/catalog/apimart/minimax-h3-max.model.d.ts +3 -0
- package/dist/catalog/apimart/minimax-h3-max.model.js +101 -0
- package/dist/catalog/apimart/minimax-h3.model.js +8 -3
- package/dist/catalog/apimart/nano-banana-2-lite.model.js +1 -1
- package/dist/catalog/apimart/nano-banana-2.1.model.d.ts +2 -0
- package/dist/catalog/apimart/nano-banana-2.1.model.js +49 -0
- package/dist/catalog/apimart/nano-banana-2.model.js +1 -1
- package/dist/catalog/apimart/nano-banana-pro.model.js +1 -1
- package/dist/catalog/apimart/qwen-image-3.0.model.js +1 -1
- package/dist/catalog/apimart/seedance-2.0-fast.model.js +1 -1
- package/dist/catalog/apimart/seedance-2.0-mini.model.js +4 -4
- package/dist/catalog/apimart/seedance-2.0.model.js +1 -1
- package/dist/catalog/apimart/seedance-2.5.model.js +27 -5
- package/dist/catalog/apimart/seedream-5.0-flash.model.d.ts +3 -0
- package/dist/catalog/apimart/seedream-5.0-flash.model.js +52 -0
- package/dist/catalog/apimart/seedream-5.0-lite.model.js +4 -4
- package/dist/catalog/apimart/seedream-5.0-pro.model.js +1 -1
- package/dist/catalog/apimart/veo-3.1.model.d.ts +3 -0
- package/dist/catalog/apimart/veo-3.1.model.js +132 -0
- package/dist/catalog/apimart/wan-2.7-image.model.d.ts +3 -0
- package/dist/catalog/apimart/wan-2.7-image.model.js +80 -0
- package/dist/catalog/apimart/wan-3.0.model.d.ts +3 -0
- package/dist/catalog/apimart/wan-3.0.model.js +101 -0
- package/dist/catalog/apimart/z-image-turbo.model.js +1 -1
- package/dist/catalog/audio/tts-common.d.ts +2 -1
- package/dist/catalog/audio/tts-common.js +5 -1
- package/dist/catalog/bailian/cosyvoice-v3.5.model.js +1 -1
- package/dist/catalog/bailian/minimax-h3.model.d.ts +3 -0
- package/dist/catalog/bailian/minimax-h3.model.js +95 -0
- package/dist/catalog/bailian/minimax-speech-2.8.model.js +1 -1
- package/dist/catalog/bailian/qwen-audio-3.1-tts-flash.model.js +14 -3
- package/dist/catalog/bailian/qwen-audio-3.1-tts-plus.model.d.ts +2 -0
- package/dist/catalog/bailian/qwen-audio-3.1-tts-plus.model.js +44 -0
- package/dist/catalog/bailian/qwen-image-3.0.model.js +1 -1
- package/dist/catalog/bailian/wan-3.0.model.d.ts +3 -0
- package/dist/catalog/bailian/wan-3.0.model.js +104 -0
- package/dist/catalog/bailian/z-image-turbo.model.js +1 -1
- package/dist/catalog/consumer-contract.d.ts +16 -1
- package/dist/catalog/consumer-contract.js +31 -0
- package/dist/catalog/continuation.d.ts +20 -0
- package/dist/catalog/continuation.js +41 -0
- package/dist/catalog/fal/bria-creative-upscale.model.js +1 -1
- package/dist/catalog/fal/eleven-v3-tts.model.js +1 -1
- package/dist/catalog/fal/eleven-v4-tts.model.d.ts +2 -0
- package/dist/catalog/fal/eleven-v4-tts.model.js +38 -0
- package/dist/catalog/fal/flux-3-video.model.d.ts +2 -0
- package/dist/catalog/fal/flux-3-video.model.js +187 -0
- package/dist/catalog/fal/flux-3.model.d.ts +2 -0
- package/dist/catalog/fal/flux-3.model.js +69 -0
- package/dist/catalog/fal/gemini-omni-1.2-flash.model.d.ts +2 -0
- package/dist/catalog/fal/gemini-omni-1.2-flash.model.js +129 -0
- package/dist/catalog/fal/gemini-omni-flash.model.js +1 -1
- package/dist/catalog/fal/gpt-image-2.5.model.js +1 -1
- package/dist/catalog/fal/gpt-image-2.6.model.d.ts +2 -0
- package/dist/catalog/fal/gpt-image-2.6.model.js +97 -0
- package/dist/catalog/fal/gpt-image-2.model.js +1 -1
- package/dist/catalog/fal/grok-imagine-2.0.model.js +1 -1
- package/dist/catalog/fal/grok-imagine-video-1.5.model.d.ts +2 -0
- package/dist/catalog/fal/grok-imagine-video-1.5.model.js +121 -0
- package/dist/catalog/fal/hailuo-02.model.js +8 -4
- package/dist/catalog/fal/hailuo-2.3.model.js +1 -1
- package/dist/catalog/fal/ic-light-v2.model.js +1 -1
- package/dist/catalog/fal/ideogram-upscale.model.js +1 -1
- package/dist/catalog/fal/kling-3.0-omni.model.js +1 -1
- package/dist/catalog/fal/kling-3.0-turbo.model.js +5 -2
- package/dist/catalog/fal/kling-3.0.model.js +4 -1
- package/dist/catalog/fal/kling-4.0-flash.model.d.ts +2 -0
- package/dist/catalog/fal/kling-4.0-flash.model.js +132 -0
- package/dist/catalog/fal/kling-4.0.model.d.ts +2 -0
- package/dist/catalog/fal/kling-4.0.model.js +169 -0
- package/dist/catalog/fal/kling-image-o1.model.js +1 -1
- package/dist/catalog/fal/kling-video-o1.model.js +18 -7
- package/dist/catalog/fal/kling-video-v2.6-pro.model.js +3 -2
- package/dist/catalog/fal/ltx-2.3.model.d.ts +2 -0
- package/dist/catalog/fal/ltx-2.3.model.js +223 -0
- package/dist/catalog/fal/ltx-2.model.js +2 -1
- package/dist/catalog/fal/minimax-h3-max.model.d.ts +2 -0
- package/dist/catalog/fal/minimax-h3-max.model.js +132 -0
- package/dist/catalog/fal/minimax-h3.model.js +3 -4
- package/dist/catalog/fal/minimax-speech-2.8.model.js +1 -1
- package/dist/catalog/fal/nano-banana-2.1.model.d.ts +2 -0
- package/dist/catalog/fal/nano-banana-2.1.model.js +68 -0
- package/dist/catalog/fal/nano-banana-2.model.js +1 -1
- package/dist/catalog/fal/nano-banana-pro.model.js +1 -1
- package/dist/catalog/fal/nano-banana.model.js +1 -1
- package/dist/catalog/fal/pixverse-v5.5.model.js +9 -4
- package/dist/catalog/fal/qwen-image-3.0.model.js +2 -2
- package/dist/catalog/fal/qwen3-tts-1.7b.model.js +4 -3
- package/dist/catalog/fal/seedance-2.0-fast.model.js +1 -1
- package/dist/catalog/fal/seedance-2.0-mini.model.js +1 -1
- package/dist/catalog/fal/seedance-2.0.model.js +1 -1
- package/dist/catalog/fal/seedance-2.5.model.js +5 -2
- package/dist/catalog/fal/seedance.model.js +3 -2
- package/dist/catalog/fal/seedream-5.0-lite.model.js +1 -1
- package/dist/catalog/fal/seedream-5.0-pro.model.js +1 -1
- package/dist/catalog/fal/seedream-v4.5.model.js +1 -1
- package/dist/catalog/fal/seedream-v4.model.js +1 -1
- package/dist/catalog/fal/seedvr2-image-upscale.model.js +1 -1
- package/dist/catalog/fal/topaz-image-upscale.model.js +1 -1
- package/dist/catalog/fal/topaz-transparent-upscale.model.js +1 -1
- package/dist/catalog/fal/utils/klingV4.d.ts +17 -0
- package/dist/catalog/fal/utils/klingV4.js +33 -0
- package/dist/catalog/fal/veo-3.1.model.js +5 -2
- package/dist/catalog/fal/vidu-q2.model.js +20 -8
- package/dist/catalog/fal/wan-2.5-preview.model.js +4 -1
- package/dist/catalog/fal/wan-3.0.model.d.ts +2 -0
- package/dist/catalog/fal/wan-3.0.model.js +135 -0
- package/dist/catalog/fal/z-image-turbo.model.js +10 -9
- package/dist/catalog/grsai/gpt-image-2.5.model.js +13 -31
- package/dist/catalog/grsai/gpt-image-2.6.model.d.ts +2 -0
- package/dist/catalog/grsai/gpt-image-2.6.model.js +37 -0
- package/dist/catalog/grsai/gpt-image-2.model.js +5 -2
- package/dist/catalog/grsai/nano-banana-2-lite.model.js +1 -1
- package/dist/catalog/grsai/nano-banana-2.1.model.d.ts +2 -0
- package/dist/catalog/grsai/nano-banana-2.1.model.js +29 -0
- package/dist/catalog/grsai/nano-banana-2.model.js +1 -1
- package/dist/catalog/grsai/nano-banana-pro.model.js +1 -1
- package/dist/catalog/grsai/wan-3.0.model.d.ts +2 -0
- package/dist/catalog/grsai/wan-3.0.model.js +78 -0
- package/dist/catalog/index.d.ts +1 -0
- package/dist/catalog/index.js +205 -124
- package/dist/catalog/kie/eleven-v3-dialogue.model.js +1 -1
- package/dist/catalog/kie/flux-3-klein.model.d.ts +2 -0
- package/dist/catalog/kie/flux-3-klein.model.js +58 -0
- package/dist/catalog/kie/gemini-3.1-flash-tts.model.js +7 -4
- package/dist/catalog/kie/gemini-3.8-flash-lite-tts.model.d.ts +2 -0
- package/dist/catalog/kie/gemini-3.8-flash-lite-tts.model.js +11 -0
- package/dist/catalog/kie/gemini-3.8-flash-tts.model.d.ts +2 -0
- package/dist/catalog/kie/gemini-3.8-flash-tts.model.js +11 -0
- package/dist/catalog/kie/gemini-omni-video.model.js +8 -30
- package/dist/catalog/kie/gemini38Tts.d.ts +3 -0
- package/dist/catalog/kie/gemini38Tts.js +40 -0
- package/dist/catalog/kie/gpt-image-2.5.model.js +1 -1
- package/dist/catalog/kie/gpt-image-2.6.model.d.ts +2 -0
- package/dist/catalog/kie/gpt-image-2.6.model.js +87 -0
- package/dist/catalog/kie/gpt-image-2.model.js +8 -12
- package/dist/catalog/kie/grok-imagine-2.0.model.js +1 -1
- package/dist/catalog/kie/grok-imagine-video-1.5.model.d.ts +2 -0
- package/dist/catalog/kie/grok-imagine-video-1.5.model.js +52 -0
- package/dist/catalog/kie/grok-imagine-video.model.js +7 -3
- package/dist/catalog/kie/grok-imagine.model.js +4 -2
- package/dist/catalog/kie/hailuo-02.model.js +6 -4
- package/dist/catalog/kie/hailuo-2-3.model.js +1 -1
- package/dist/catalog/kie/happyhorse-1.1.model.js +5 -2
- package/dist/catalog/kie/kling-3.0-omni.model.js +51 -23
- package/dist/catalog/kie/kling-3.0-turbo.model.js +1 -1
- package/dist/catalog/kie/kling-3.0.model.js +1 -8
- package/dist/catalog/kie/kling-4.0-flash.model.d.ts +2 -0
- package/dist/catalog/kie/kling-4.0-flash.model.js +16 -0
- package/dist/catalog/kie/kling-4.0.model.d.ts +2 -0
- package/dist/catalog/kie/kling-4.0.model.js +17 -0
- package/dist/catalog/kie/kling-v2-6.model.js +1 -1
- package/dist/catalog/kie/kling40.d.ts +21 -0
- package/dist/catalog/kie/kling40.js +129 -0
- package/dist/catalog/kie/minimax-h3.model.js +16 -21
- package/dist/catalog/kie/nano-banana-2-lite.model.js +1 -1
- package/dist/catalog/kie/nano-banana-2.1.model.d.ts +2 -0
- package/dist/catalog/kie/nano-banana-2.1.model.js +34 -0
- package/dist/catalog/kie/nano-banana-2.model.js +2 -2
- package/dist/catalog/kie/nano-banana-pro.model.js +1 -1
- package/dist/catalog/kie/qwen-image-3.0.model.js +2 -10
- package/dist/catalog/kie/seedance-1.5-pro.model.js +2 -1
- package/dist/catalog/kie/seedance-2.0-fast.model.js +5 -1
- package/dist/catalog/kie/seedance-2.0-mini.model.js +5 -1
- package/dist/catalog/kie/seedance-2.0.model.js +5 -1
- package/dist/catalog/kie/seedance-2.5.model.js +10 -20
- package/dist/catalog/kie/seedance-v1.model.js +8 -4
- package/dist/catalog/kie/seedream-4.0.model.js +1 -1
- package/dist/catalog/kie/seedream-4.5.model.js +1 -1
- package/dist/catalog/kie/seedream-5.0-lite.model.js +1 -1
- package/dist/catalog/kie/seedream-5.0-pro.model.js +1 -1
- package/dist/catalog/kie/wan-3.0-prime.model.d.ts +2 -0
- package/dist/catalog/kie/wan-3.0-prime.model.js +15 -0
- package/dist/catalog/kie/wan-3.0.model.d.ts +2 -0
- package/dist/catalog/kie/wan-3.0.model.js +15 -0
- package/dist/catalog/kie/wan30.d.ts +10 -0
- package/dist/catalog/kie/wan30.js +78 -0
- package/dist/catalog/kie/z-image.model.js +1 -1
- package/dist/catalog/modelscope/flux-1-krea-dev.model.js +4 -2
- package/dist/catalog/modelscope/majicmix-realistic.model.js +3 -2
- package/dist/catalog/modelscope/modelscope-custom.model.js +3 -2
- package/dist/catalog/modelscope/qwen-image-2512.model.d.ts +5 -0
- package/dist/catalog/modelscope/{qwen-image.model.js → qwen-image-2512.model.js} +11 -8
- package/dist/catalog/modelscope/qwen-image-edit-2511.model.d.ts +5 -0
- package/dist/catalog/modelscope/{qwen-image-edit-2509.model.js → qwen-image-edit-2511.model.js} +9 -7
- package/dist/catalog/modelscope/sdxl-14-ckpt.model.js +3 -2
- package/dist/catalog/modelscope/utils.js +2 -2
- package/dist/catalog/modelscope/z-image-turbo.model.js +3 -2
- package/dist/catalog/ppio/kling-3.0.model.js +4 -1
- package/dist/catalog/ppio/minimax-speech.model.js +2 -1
- package/dist/catalog/shared/mediaPresence.d.ts +8 -1
- package/dist/catalog/shared/mediaPresence.js +21 -1
- package/dist/catalog/shared/nanoBanana21.d.ts +11 -0
- package/dist/catalog/shared/nanoBanana21.js +30 -0
- package/dist/catalog/shared/shotList.d.ts +31 -0
- package/dist/catalog/shared/shotList.js +48 -0
- package/dist/catalog/shared/subjectElements.d.ts +36 -0
- package/dist/catalog/shared/subjectElements.js +93 -0
- package/dist/catalog/siliconflow/moss-ttsd-0.5.model.js +1 -1
- package/dist/catalog/validate.js +14 -1
- package/dist/catalog/volcengine/seedance-2.0-fast.model.d.ts +2 -0
- package/dist/catalog/volcengine/seedance-2.0-fast.model.js +11 -0
- package/dist/catalog/volcengine/seedance-2.0-mini.model.d.ts +2 -0
- package/dist/catalog/volcengine/seedance-2.0-mini.model.js +11 -0
- package/dist/catalog/volcengine/seedance-2.0.model.d.ts +2 -0
- package/dist/catalog/volcengine/seedance-2.0.model.js +11 -0
- package/dist/catalog/volcengine/seedance-2.5.model.d.ts +2 -0
- package/dist/catalog/volcengine/seedance-2.5.model.js +11 -0
- package/dist/catalog/volcengine/seedance.d.ts +17 -0
- package/dist/catalog/volcengine/seedance.js +192 -0
- package/dist/catalog/volcengine/seedream-5.0-lite.model.js +2 -1
- package/dist/catalog/volcengine/seedream-5.0.js +1 -1
- package/dist/catalog/volcengine-speech/seed-icl-2.0.model.d.ts +1 -0
- package/dist/catalog/volcengine-speech/seed-icl-2.0.model.js +52 -10
- package/dist/catalog/volcengine-speech/seed-tts-2.0-voices.d.ts +2 -0
- package/dist/catalog/volcengine-speech/seed-tts-2.0-voices.js +438 -0
- package/dist/catalog/volcengine-speech/seed-tts-2.0.model.js +4 -4
- package/dist/discovery/index.js +13 -6
- package/dist/generation/core.d.ts +6 -0
- package/dist/generation/core.js +10 -2
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/llm/bigmodel/preset.js +2 -1
- package/dist/llm/bigmodel/profiles.js +0 -6
- package/dist/llm/chat.d.ts +8 -0
- package/dist/llm/chat.js +18 -2
- package/dist/llm/chatTypes.d.ts +6 -0
- package/dist/llm/defaults.d.ts +2 -2
- package/dist/llm/defaults.js +3 -3
- package/dist/llm/groq/preset.js +18 -2
- package/dist/llm/modelCatalog.d.ts +9 -2
- package/dist/llm/modelCatalog.js +17 -4
- package/dist/llm/modelCatalogEntries.d.ts +2 -0
- package/dist/llm/modelCatalogEntries.js +197 -42
- package/dist/llm/providerPresets.d.ts +3 -0
- package/dist/llm/providerPresets.js +145 -32
- package/dist/llm/providerReasoningRequest.js +28 -11
- package/dist/llm/siliconflow/index.js +1 -1
- package/dist/llm/siliconflow/preset.js +30 -0
- package/dist/llm/types.d.ts +6 -0
- package/dist/packs/models/{ppio/wan-2.5-preview.d.ts → apimart/flux-3-image.d.ts} +1 -1
- package/dist/packs/models/apimart/flux-3-image.js +7 -0
- package/dist/packs/models/apimart/flux-3-video.d.ts +6 -0
- package/dist/packs/models/apimart/flux-3-video.js +7 -0
- package/dist/packs/models/apimart/gemini-omni-1.2-flash.d.ts +6 -0
- package/dist/packs/models/apimart/gemini-omni-1.2-flash.js +7 -0
- package/dist/packs/models/{modelscope/qwen-image.d.ts → apimart/gpt-image-2.6.d.ts} +1 -1
- package/dist/packs/models/apimart/gpt-image-2.6.js +7 -0
- package/dist/packs/models/apimart/grok-imagine-video-1.5.d.ts +6 -0
- package/dist/packs/models/apimart/grok-imagine-video-1.5.js +7 -0
- package/dist/packs/models/apimart/happyhorse-1.1.d.ts +6 -0
- package/dist/packs/models/apimart/happyhorse-1.1.js +7 -0
- package/dist/packs/models/apimart/kling-4.0.d.ts +6 -0
- package/dist/packs/models/apimart/kling-4.0.js +7 -0
- package/dist/packs/models/apimart/minimax-h3-max.d.ts +6 -0
- package/dist/packs/models/apimart/minimax-h3-max.js +7 -0
- package/dist/packs/models/{ppio/minimax-hailuo-2.3.d.ts → apimart/nano-banana-2.1.d.ts} +1 -1
- package/dist/packs/models/{ppio/minimax-hailuo-2.3.js → apimart/nano-banana-2.1.js} +4 -4
- package/dist/packs/models/apimart/seedream-5.0-flash.d.ts +6 -0
- package/dist/packs/models/apimart/seedream-5.0-flash.js +7 -0
- package/dist/packs/models/apimart/veo-3.1.d.ts +6 -0
- package/dist/packs/models/apimart/veo-3.1.js +7 -0
- package/dist/packs/models/apimart/wan-2.7-image.d.ts +6 -0
- package/dist/packs/models/apimart/wan-2.7-image.js +7 -0
- package/dist/packs/models/apimart/wan-3.0.d.ts +6 -0
- package/dist/packs/models/apimart/wan-3.0.js +7 -0
- package/dist/packs/models/bailian/cosyvoice-v3.5.js +1 -1
- package/dist/packs/models/bailian/minimax-h3.d.ts +6 -0
- package/dist/packs/models/bailian/minimax-h3.js +7 -0
- package/dist/packs/models/bailian/minimax-speech-2.8.js +1 -1
- package/dist/packs/models/bailian/qwen-audio-3.1-tts-flash.js +1 -1
- package/dist/packs/models/bailian/qwen-audio-3.1-tts-plus.d.ts +6 -0
- package/dist/packs/models/bailian/qwen-audio-3.1-tts-plus.js +7 -0
- package/dist/packs/models/bailian/qwen-image-3.0.js +1 -1
- package/dist/packs/models/bailian/wan-3.0.d.ts +6 -0
- package/dist/packs/models/bailian/wan-3.0.js +7 -0
- package/dist/packs/models/bailian/z-image-turbo.js +1 -1
- package/dist/packs/models/fal/eleven-v4-tts.d.ts +6 -0
- package/dist/packs/models/{ppio/wan-2.5-preview.js → fal/eleven-v4-tts.js} +4 -4
- package/dist/packs/models/fal/flux-3-video.d.ts +6 -0
- package/dist/packs/models/fal/flux-3-video.js +7 -0
- package/dist/packs/models/{ppio/wan-2.6.d.ts → fal/flux-3.d.ts} +1 -1
- package/dist/packs/models/{ppio/wan-2.6.js → fal/flux-3.js} +4 -4
- package/dist/packs/models/fal/gemini-omni-1.2-flash.d.ts +6 -0
- package/dist/packs/models/fal/gemini-omni-1.2-flash.js +7 -0
- package/dist/packs/models/fal/gpt-image-2.6.d.ts +6 -0
- package/dist/packs/models/fal/gpt-image-2.6.js +7 -0
- package/dist/packs/models/fal/grok-imagine-video-1.5.d.ts +6 -0
- package/dist/packs/models/fal/grok-imagine-video-1.5.js +7 -0
- package/dist/packs/models/fal/kling-4.0-flash.d.ts +6 -0
- package/dist/packs/models/fal/kling-4.0-flash.js +7 -0
- package/dist/packs/models/fal/kling-4.0.d.ts +6 -0
- package/dist/packs/models/{ppio/wan-2.7.js → fal/kling-4.0.js} +4 -4
- package/dist/packs/models/{ppio/wan-2.7.d.ts → fal/ltx-2.3.d.ts} +1 -1
- package/dist/packs/models/fal/ltx-2.3.js +7 -0
- package/dist/packs/models/fal/minimax-h3-max.d.ts +6 -0
- package/dist/packs/models/fal/minimax-h3-max.js +7 -0
- package/dist/packs/models/fal/nano-banana-2.1.d.ts +6 -0
- package/dist/packs/models/fal/nano-banana-2.1.js +7 -0
- package/dist/packs/models/fal/wan-3.0.d.ts +6 -0
- package/dist/packs/models/fal/wan-3.0.js +7 -0
- package/dist/packs/models/grsai/gpt-image-2.6.d.ts +6 -0
- package/dist/packs/models/grsai/gpt-image-2.6.js +7 -0
- package/dist/packs/models/grsai/nano-banana-2.1.d.ts +6 -0
- package/dist/packs/models/grsai/nano-banana-2.1.js +7 -0
- package/dist/packs/models/grsai/wan-3.0.d.ts +6 -0
- package/dist/packs/models/grsai/wan-3.0.js +7 -0
- package/dist/packs/models/kie/flux-3-klein.d.ts +6 -0
- package/dist/packs/models/kie/flux-3-klein.js +7 -0
- package/dist/packs/models/kie/gemini-3.8-flash-lite-tts.d.ts +6 -0
- package/dist/packs/models/kie/gemini-3.8-flash-lite-tts.js +7 -0
- package/dist/packs/models/kie/{eleven-turbo-2.5-tts.d.ts → gemini-3.8-flash-tts.d.ts} +1 -1
- package/dist/packs/models/kie/{eleven-turbo-2.5-tts.js → gemini-3.8-flash-tts.js} +1 -1
- package/dist/packs/models/kie/gpt-image-2.6.d.ts +6 -0
- package/dist/packs/models/kie/gpt-image-2.6.js +7 -0
- package/dist/packs/models/kie/grok-imagine-video-1.5.d.ts +6 -0
- package/dist/packs/models/kie/grok-imagine-video-1.5.js +7 -0
- package/dist/packs/models/kie/kling-4.0-flash.d.ts +6 -0
- package/dist/packs/models/kie/kling-4.0-flash.js +7 -0
- package/dist/packs/models/kie/kling-4.0.d.ts +6 -0
- package/dist/packs/models/kie/kling-4.0.js +7 -0
- package/dist/packs/models/kie/nano-banana-2.1.d.ts +6 -0
- package/dist/packs/models/kie/nano-banana-2.1.js +7 -0
- package/dist/packs/models/kie/wan-3.0-prime.d.ts +6 -0
- package/dist/packs/models/kie/wan-3.0-prime.js +7 -0
- package/dist/packs/models/kie/wan-3.0.d.ts +6 -0
- package/dist/packs/models/kie/wan-3.0.js +7 -0
- package/dist/packs/models/modelscope/flux-1-krea-dev.js +1 -1
- package/dist/packs/models/modelscope/majicmix-realistic.js +1 -1
- package/dist/packs/models/modelscope/modelscope-custom.js +1 -1
- package/dist/packs/models/modelscope/qwen-image-2512.d.ts +6 -0
- package/dist/packs/models/modelscope/{qwen-image.js → qwen-image-2512.js} +2 -2
- package/dist/packs/models/modelscope/{qwen-image-edit-2509.d.ts → qwen-image-edit-2511.d.ts} +1 -1
- package/dist/packs/models/modelscope/{qwen-image-edit-2509.js → qwen-image-edit-2511.js} +2 -2
- package/dist/packs/models/modelscope/sdxl-14-ckpt.js +1 -1
- package/dist/packs/models/modelscope/z-image-turbo.js +1 -1
- package/dist/packs/models/volcengine/seedance-2.0-fast.d.ts +6 -0
- package/dist/packs/models/volcengine/seedance-2.0-fast.js +7 -0
- package/dist/packs/models/volcengine/seedance-2.0-mini.d.ts +6 -0
- package/dist/packs/models/volcengine/seedance-2.0-mini.js +7 -0
- package/dist/packs/models/volcengine/seedance-2.0.d.ts +6 -0
- package/dist/packs/models/volcengine/seedance-2.0.js +7 -0
- package/dist/packs/models/volcengine/seedance-2.5.d.ts +6 -0
- package/dist/packs/models/volcengine/seedance-2.5.js +7 -0
- package/dist/packs/models/volcengine/seedream-5.0-flash.js +1 -1
- package/dist/packs/models/volcengine/seedream-5.0-lite.js +1 -1
- package/dist/packs/models/volcengine/seedream-5.0-pro.js +1 -1
- package/dist/packs/provider-adapters/bailian.js +1 -1
- package/dist/packs/provider-adapters/modelscope.js +1 -1
- package/dist/packs/provider-adapters/volcengine.js +1 -1
- package/dist/packs/provider-packs/apimart.d.ts +1 -1
- package/dist/packs/provider-packs/apimart.js +35 -22
- package/dist/packs/provider-packs/bailian.d.ts +1 -1
- package/dist/packs/provider-packs/bailian.js +8 -5
- package/dist/packs/provider-packs/fal.d.ts +1 -1
- package/dist/packs/provider-packs/fal.js +52 -40
- package/dist/packs/provider-packs/grsai.d.ts +1 -1
- package/dist/packs/provider-packs/grsai.js +8 -5
- package/dist/packs/provider-packs/kie.d.ts +1 -1
- package/dist/packs/provider-packs/kie.js +41 -32
- package/dist/packs/provider-packs/modelscope.js +2 -2
- package/dist/packs/provider-packs/ppio.d.ts +1 -1
- package/dist/packs/provider-packs/ppio.js +2 -6
- package/dist/packs/provider-packs/volcengine.d.ts +1 -1
- package/dist/packs/provider-packs/volcengine.js +8 -4
- package/dist/pricing/index.d.ts +1 -0
- package/dist/pricing/index.js +1 -0
- package/dist/pricing/mediaContext.d.ts +6 -1
- package/dist/pricing/mediaContext.js +12 -5
- package/dist/pricing/tokenPricing.d.ts +36 -0
- package/dist/pricing/tokenPricing.js +26 -0
- package/dist/providers/bailian.d.ts +1 -1
- package/dist/providers/bailian.js +71 -4
- package/dist/providers/fal.js +11 -1
- package/dist/providers/helpers.d.ts +1 -1
- package/dist/providers/helpers.js +17 -5
- package/dist/providers/kie.js +16 -5
- package/dist/providers/metadata.js +2 -2
- package/dist/providers/openai-speech.d.ts +6 -0
- package/dist/providers/openai-speech.js +31 -0
- package/dist/providers/providerAccessErrors.d.ts +3 -0
- package/dist/providers/providerAccessErrors.js +73 -0
- package/dist/providers/siliconflow.js +2 -27
- package/dist/providers/volcengine-speech.d.ts +1 -1
- package/dist/providers/volcengine-speech.js +31 -8
- package/dist/providers/volcengine-voice-clone.d.ts +3 -0
- package/dist/providers/volcengine-voice-clone.js +138 -0
- package/dist/providers/volcengine.d.ts +1 -1
- package/dist/providers/volcengine.js +89 -11
- package/dist/runtime/retry.js +3 -0
- package/dist/tool-packs/fal-erase/models/bria-eraser.model.js +1 -1
- package/dist/tool-packs/fal-erase/models/finegrain-eraser.model.js +1 -1
- package/dist/tool-packs/fal-erase/models/flux-pro-erase.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/control-light.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/outpaint.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/photo-restoration.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/pixelcut-background-removal.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/product-photography.model.js +1 -1
- package/dist/tool-packs/fal-image-utilities/models/relighting.model.js +1 -1
- package/dist/tool-packs/fal-multi-angle/models/flux-2-multiple-angles.model.js +1 -1
- package/dist/tool-packs/fal-multi-angle/models/perspective-change.model.js +1 -1
- package/dist/tool-packs/fal-multi-angle/models/qwen-image-edit-2511-multiple-angles.model.js +1 -1
- package/dist/types/model.d.ts +68 -12
- package/dist/types/model.js +3 -0
- package/dist/types/modelTags.d.ts +142 -0
- package/dist/types/modelTags.js +44 -0
- package/dist/types/runtime.d.ts +3 -0
- package/dist/types/speechTimings.d.ts +15 -0
- package/dist/types/speechTimings.js +1 -0
- package/dist/upload/apimart-upload.d.ts +1 -1
- package/dist/upload/apimart-upload.js +37 -15
- package/dist/upload/bailian-oss-upload.d.ts +32 -0
- package/dist/upload/bailian-oss-upload.js +74 -0
- package/dist/upload/{fal-legacy.js → fal-host-fetch.js} +2 -2
- package/dist/upload/fal-transport.d.ts +6 -0
- package/dist/upload/fal-transport.js +2 -1
- package/dist/upload/index.d.ts +2 -2
- package/dist/upload/index.js +4 -7
- package/dist/upload/kie-upload.d.ts +1 -1
- package/dist/upload/kie-upload.js +34 -12
- package/dist/upload/media-binary.js +1 -0
- package/dist/upload/media-fields.js +7 -2
- package/dist/upload/preprocess-core.d.ts +2 -0
- package/dist/upload/preprocess-core.js +2 -0
- package/dist/upload/preprocess.d.ts +1 -1
- package/dist/upload/preprocess.js +12 -3
- package/dist/upload/provider-preprocessors/apimart.d.ts +1 -1
- package/dist/upload/provider-preprocessors/apimart.js +13 -5
- package/dist/upload/provider-preprocessors/bailian.d.ts +8 -0
- package/dist/upload/provider-preprocessors/bailian.js +45 -0
- package/dist/upload/provider-preprocessors/kie.d.ts +1 -1
- package/dist/upload/provider-preprocessors/kie.js +26 -9
- package/dist/upload/provider-preprocessors/ppio.d.ts +1 -2
- package/dist/upload/provider-preprocessors/ppio.js +2 -29
- package/dist/upload/provider-preprocessors/public-host.d.ts +5 -0
- package/dist/upload/provider-preprocessors/public-host.js +7 -0
- package/dist/upload/provider-preprocessors/volcengine.d.ts +5 -0
- package/dist/upload/provider-preprocessors/volcengine.js +10 -0
- package/dist/upload/public-host-upload.d.ts +7 -0
- package/dist/upload/public-host-upload.js +55 -0
- package/dist/upload/upload-response.js +12 -7
- package/docs/README.md +26 -26
- package/docs/consumers.md +150 -124
- package/docs/llm-adaptation/README.md +180 -166
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/DeepSeek.md +108 -104
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/Kimi.md +94 -76
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206/MiniMax.md +89 -84
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//345/260/217/347/261/263MiMo.md +126 -126
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//346/231/272/350/260/261GLM.md +238 -234
- 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
- package/docs/llm-adaptation//344/276/233/345/272/224/345/225/206//347/231/276/347/202/274Qwen.md +112 -84
- 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
- package/docs/model-adaptation/Bria-Eraser/Bria-Eraser_Fal.md +32 -32
- 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
- package/docs/model-adaptation/ControlLight/ControlLight_Fal.md +85 -85
- package/docs/model-adaptation/Eleven-v4/Eleven-v4_Fal.md +49 -0
- 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
- package/docs/model-adaptation/FLUX-3/FLUX-3_APIMart.md +65 -0
- package/docs/model-adaptation/FLUX-3/FLUX-3_Fal.md +48 -0
- package/docs/model-adaptation/FLUX-3-Klein/FLUX-3-Klein_KIE.md +38 -0
- package/docs/model-adaptation/FLUX-3-Video/FLUX-3-Video_APIMart.md +84 -0
- package/docs/model-adaptation/FLUX-3-Video/FLUX-3-Video_Fal.md +80 -0
- package/docs/model-adaptation/Finegrain-Eraser/Finegrain-Eraser_Fal.md +31 -31
- package/docs/model-adaptation/Flux-Pro-Erase/Flux-Pro-Erase_Fal.md +34 -34
- package/docs/model-adaptation/Fun-ASR/Fun-ASR_/347/231/276/347/202/274.md +47 -47
- 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
- package/docs/model-adaptation/Fun-ASR-Realtime/Fun-ASR-Realtime_/347/231/276/347/202/274.md +57 -57
- 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
- package/docs/model-adaptation/GLM-5.3-Flash/GLM-5.3-Flash_/346/231/272/350/260/261.md +217 -213
- package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_APIMart.md +173 -173
- package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_Fal.md +94 -94
- package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_Grsai.md +138 -137
- package/docs/model-adaptation/GPT-Image-2/GPT-Image-2_KIE.md +97 -93
- package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_APIMart.md +66 -66
- package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Fal.md +55 -55
- package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_Grsai.md +59 -53
- package/docs/model-adaptation/GPT-Image-2.5/GPT-Image-2.5_KIE.md +55 -55
- package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_APIMart.md +101 -0
- package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_Fal.md +55 -0
- package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_Grsai.md +32 -0
- package/docs/model-adaptation/GPT-Image-2.6/GPT-Image-2.6_KIE.md +51 -0
- package/docs/model-adaptation/GPT-OSS-20B/GPT-OSS-20B_Groq.md +62 -62
- package/docs/model-adaptation/Gemini-3.8-Flash-Lite-TTS/Gemini-3.8-Flash-Lite-TTS_KIE.md +22 -0
- package/docs/model-adaptation/Gemini-3.8-Flash-TTS/Gemini-3.8-Flash-TTS_KIE.md +38 -0
- package/docs/model-adaptation/Gemini-Omni-1.2-Flash/Gemini-Omni-1.2-Flash_APIMart.md +79 -0
- package/docs/model-adaptation/Gemini-Omni-1.2-Flash/Gemini-Omni-1.2-Flash_Fal.md +60 -0
- package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_APIMart.md +131 -124
- package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_Fal.md +84 -84
- package/docs/model-adaptation/Gemini-Omni-Flash/Gemini-Omni-Flash_KIE.md +132 -129
- package/docs/model-adaptation/Grok-Imagine/Grok-Imagine_KIE.md +38 -36
- package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_APIMart.md +250 -250
- package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_Fal.md +84 -84
- package/docs/model-adaptation/Grok-Imagine-2.0/Grok-Imagine-2.0_KIE.md +105 -105
- package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_APIMart.md +68 -0
- package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_Fal.md +47 -0
- package/docs/model-adaptation/Grok-Imagine-Video-1.5/Grok-Imagine-Video-1.5_KIE.md +37 -0
- package/docs/model-adaptation/Hailuo-02/Hailuo-02_Fal.md +95 -93
- package/docs/model-adaptation/Hailuo-02/Hailuo-02_KIE.md +58 -56
- package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_Fal.md +88 -88
- package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_KIE.md +51 -51
- package/docs/model-adaptation/HappyHorse-1.1/HappyHorse-1.1_APIMart.md +66 -0
- package/docs/model-adaptation/HappyHorse-1.1/HappyHorse-1.1_KIE.md +31 -27
- package/docs/model-adaptation/IC-Light-v2/IC-Light-v2_Fal.md +99 -99
- 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
- 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
- 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
- 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
- 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
- package/docs/model-adaptation/Kling-3.0/Kling-3.0_APIMart.md +112 -112
- package/docs/model-adaptation/Kling-3.0/Kling-3.0_Fal.md +91 -89
- package/docs/model-adaptation/Kling-3.0/Kling-3.0_KIE.md +106 -106
- package/docs/model-adaptation/Kling-3.0/Kling-3.0_/346/264/276/346/254/247/344/272/221.md +120 -119
- package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_APIMart.md +130 -125
- package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_Fal.md +107 -107
- package/docs/model-adaptation/Kling-3.0-Omni/Kling-3.0-Omni_KIE.md +148 -143
- package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_APIMart.md +88 -85
- package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_Fal.md +86 -83
- package/docs/model-adaptation/Kling-3.0-Turbo/Kling-3.0-Turbo_KIE.md +84 -84
- package/docs/model-adaptation/Kling-4.0/Kling-4.0_APIMart.md +76 -0
- package/docs/model-adaptation/Kling-4.0/Kling-4.0_Fal.md +115 -0
- package/docs/model-adaptation/Kling-4.0/Kling-4.0_KIE.md +61 -0
- package/docs/model-adaptation/Kling-4.0-Flash/Kling-4.0-Flash_Fal.md +55 -0
- package/docs/model-adaptation/Kling-4.0-Flash/Kling-4.0-Flash_KIE.md +33 -0
- package/docs/model-adaptation/LTX-2.3/LTX-2.3_Fal.md +121 -0
- package/docs/model-adaptation/Midjourney/Midjourney_APIMart.md +402 -396
- package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_APIMart.md +237 -234
- package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_Fal.md +112 -108
- package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_KIE.md +118 -111
- package/docs/model-adaptation/MiniMax-H3/MiniMax-H3_/347/231/276/347/202/274.md +65 -0
- package/docs/model-adaptation/MiniMax-H3-Max/MiniMax-H3-Max_APIMart.md +78 -0
- package/docs/model-adaptation/MiniMax-H3-Max/MiniMax-H3-Max_Fal.md +62 -0
- package/docs/model-adaptation/MiniMax-Speech/MiniMax-Speech_/346/264/276/346/254/247/344/272/221.md +170 -170
- package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_APIMart.md +89 -89
- package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_Fal.md +99 -99
- package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_Grsai.md +82 -82
- package/docs/model-adaptation/Nano-Banana-2/Nano-Banana-2_KIE.md +72 -70
- package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_APIMart.md +79 -79
- package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_Grsai.md +65 -65
- package/docs/model-adaptation/Nano-Banana-2-Lite/Nano-Banana-2-Lite_KIE.md +64 -64
- package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_APIMart.md +35 -0
- package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_Fal.md +37 -0
- package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_Grsai.md +35 -0
- package/docs/model-adaptation/Nano-Banana-2.1/Nano-Banana-2.1_KIE.md +36 -0
- package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_APIMart.md +83 -83
- package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_Fal.md +89 -89
- package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_Grsai.md +82 -82
- package/docs/model-adaptation/Nano-Banana-Pro/Nano-Banana-Pro_KIE.md +64 -64
- 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
- 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
- package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_APIMart.md +117 -117
- package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_Fal.md +85 -84
- package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_KIE.md +103 -103
- package/docs/model-adaptation/Qwen-Image-3.0/Qwen-Image-3.0_/347/231/276/347/202/274.md +138 -138
- 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
- package/docs/model-adaptation/Qwen-MT-Flash/Qwen-MT-Flash_/347/231/276/347/202/274.md +68 -68
- package/docs/model-adaptation/Qwen-MT-Lite/Qwen-MT-Lite_/347/231/276/347/202/274.md +40 -40
- package/docs/model-adaptation/Qwen-MT-Plus/Qwen-MT-Plus_/347/231/276/347/202/274.md +40 -40
- package/docs/model-adaptation/Qwen3-ASR-Flash/Qwen3-ASR-Flash_/347/231/276/347/202/274.md +44 -44
- 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
- package/docs/model-adaptation/Qwen3-ASR-Flash-Filetrans/Qwen3-ASR-Flash-Filetrans_/347/231/276/347/202/274.md +45 -45
- package/docs/model-adaptation/Qwen3-ASR-Flash-Realtime/Qwen3-ASR-Flash-Realtime_/347/231/276/347/202/274.md +58 -58
- 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
- package/docs/model-adaptation/README.md +371 -328
- 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
- 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
- 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
- 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
- package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_APIMart.md +121 -121
- package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_Fal.md +97 -97
- package/docs/model-adaptation/Seedance-2.0/Seedance-2.0_KIE.md +87 -86
- 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
- package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_APIMart.md +89 -89
- package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_Fal.md +95 -95
- package/docs/model-adaptation/Seedance-2.0-Fast/Seedance-2.0-Fast_KIE.md +79 -78
- 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
- package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_APIMart.md +93 -89
- package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_Fal.md +96 -96
- package/docs/model-adaptation/Seedance-2.0-Mini/Seedance-2.0-Mini_KIE.md +79 -78
- 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
- package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_APIMart.md +217 -212
- package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_Fal.md +98 -94
- package/docs/model-adaptation/Seedance-2.5/Seedance-2.5_KIE.md +94 -89
- 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
- package/docs/model-adaptation/Seedream-5.0-Flash/Seedream-5.0-Flash_APIMart.md +64 -0
- 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
- package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_APIMart.md +113 -106
- package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_Fal.md +91 -91
- package/docs/model-adaptation/Seedream-5.0-Lite/Seedream-5.0-Lite_KIE.md +89 -89
- 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
- package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_APIMart.md +194 -194
- package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_Fal.md +100 -100
- package/docs/model-adaptation/Seedream-5.0-Pro/Seedream-5.0-Pro_KIE.md +141 -141
- 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
- package/docs/model-adaptation/SenseVoiceSmall/SenseVoiceSmall_/347/241/205/345/237/272/346/265/201/345/212/250.md +73 -73
- package/docs/model-adaptation/TTS-/345/244/232/344/276/233/345/272/224/345/225/206-2026-09.md +52 -6
- package/docs/model-adaptation/TTS-/346/227/266/351/227/264/346/210/263-2026-10.md +36 -0
- 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
- 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
- package/docs/model-adaptation/Veo-3.1/Veo-3.1_APIMart.md +90 -0
- package/docs/model-adaptation/Wan-2.7-Image/Wan-2.7-Image_APIMart.md +81 -0
- package/docs/model-adaptation/Wan-3.0/Wan-3.0_APIMart.md +74 -0
- package/docs/model-adaptation/Wan-3.0/Wan-3.0_Fal.md +60 -0
- package/docs/model-adaptation/Wan-3.0/Wan-3.0_Grsai.md +35 -0
- package/docs/model-adaptation/Wan-3.0/Wan-3.0_KIE.md +38 -0
- package/docs/model-adaptation/Wan-3.0/Wan-3.0_/347/231/276/347/202/274.md +96 -0
- package/docs/model-adaptation/Wan-3.0-Prime/Wan-3.0-Prime_KIE.md +20 -0
- package/docs/model-adaptation/Whisper-Large-v3/Whisper-Large-v3_Groq.md +80 -80
- package/docs/model-adaptation/Whisper-Large-v3-Turbo/Whisper-Large-v3-Turbo_Groq.md +79 -79
- package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_APIMart.md +88 -88
- package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_Fal.md +103 -95
- package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_KIE.md +71 -71
- package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_/347/231/276/347/202/274.md +122 -122
- package/docs/model-adaptation/Z-Image-Turbo/Z-Image-Turbo_/351/255/224/346/220/255.md +99 -97
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/APIMart.md +240 -240
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Fal.md +190 -172
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Groq.md +136 -121
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/Grsai.md +217 -217
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206/KIE.md +159 -131
- 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
- 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
- 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
- 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
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//347/231/276/347/202/274.md +339 -282
- 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
- package/docs/model-adaptation//344/276/233/345/272/224/345/225/206//351/255/224/346/220/255.md +205 -207
- 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
- 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
- package/docs//346/216/245/345/205/245/346/214/207/345/215/227/Electron.md +77 -77
- package/docs//346/216/245/345/205/245/346/214/207/345/215/227/Tauri.md +81 -81
- package/docs//346/216/245/345/205/245/346/214/207/345/215/227/UXP.md +169 -169
- 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
- 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
- package/examples/form-renderer/README.md +17 -17
- package/examples/form-renderer/cli.ts +32 -32
- package/examples/form-renderer/index.ts +144 -144
- package/examples/form-renderer/package.json +16 -16
- package/examples/form-renderer/tsconfig.json +14 -14
- package/examples/llm-chat/README.md +38 -38
- package/examples/llm-chat/index.ts +100 -100
- package/examples/llm-chat/package.json +19 -19
- package/examples/llm-chat/tsconfig.json +14 -14
- package/examples/minimal-node/README.md +31 -31
- package/examples/minimal-node/index.ts +138 -138
- package/examples/minimal-node/package.json +17 -17
- package/examples/minimal-node/tsconfig.json +14 -14
- package/package.json +259 -258
- package/dist/catalog/grsai/gptImage25Sizes.d.ts +0 -1
- package/dist/catalog/grsai/gptImage25Sizes.js +0 -76
- package/dist/catalog/kie/eleven-turbo-2.5-tts.model.d.ts +0 -2
- package/dist/catalog/kie/eleven-turbo-2.5-tts.model.js +0 -29
- package/dist/catalog/modelscope/qwen-image-edit-2509.model.d.ts +0 -5
- package/dist/catalog/modelscope/qwen-image.model.d.ts +0 -5
- package/dist/catalog/ppio/minimax-hailuo-2.3.model.d.ts +0 -7
- package/dist/catalog/ppio/minimax-hailuo-2.3.model.js +0 -114
- package/dist/catalog/ppio/wan-2.5-preview.model.d.ts +0 -7
- package/dist/catalog/ppio/wan-2.5-preview.model.js +0 -198
- package/dist/catalog/ppio/wan-2.6.model.d.ts +0 -7
- package/dist/catalog/ppio/wan-2.6.model.js +0 -206
- package/dist/catalog/ppio/wan-2.7.model.d.ts +0 -2
- package/dist/catalog/ppio/wan-2.7.model.js +0 -373
- package/docs/model-adaptation/Hailuo-2.3/Hailuo-2.3_/346/264/276/346/254/247/344/272/221.md +0 -70
- package/docs/model-adaptation/TeleSpeechASR/TeleSpeechASR_/347/241/205/345/237/272/346/265/201/345/212/250.md +0 -76
- package/docs/model-adaptation/Wan-2.5-Preview/Wan-2.5-Preview_/346/264/276/346/254/247/344/272/221.md +0 -82
- package/docs/model-adaptation/Wan-2.6/Wan-2.6_/346/264/276/346/254/247/344/272/221.md +0 -84
- package/docs/model-adaptation/Wan-2.7/Wan-2.7_/346/264/276/346/254/247/344/272/221.md +0 -122
- /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
|
|
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
|
|
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(
|
|
58
|
-
|
|
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 = [];
|
package/dist/providers/fal.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
}
|
package/dist/providers/kie.js
CHANGED
|
@@ -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
|
-
//
|
|
63
|
-
|
|
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.
|
|
86
|
-
apiKeyUrl: 'https://platform.
|
|
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,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 {
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
142
|
-
|
|
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
|
+
}
|