@optima-chat/comfy-cli 0.7.2 → 0.9.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 (50) hide show
  1. package/.claude/settings.local.json +5 -1
  2. package/dist/backends/bfl.d.ts +18 -0
  3. package/dist/backends/bfl.d.ts.map +1 -0
  4. package/dist/backends/bfl.js +115 -0
  5. package/dist/backends/bfl.js.map +1 -0
  6. package/dist/backends/comfyui.d.ts +10 -0
  7. package/dist/backends/comfyui.d.ts.map +1 -0
  8. package/dist/backends/comfyui.js +108 -0
  9. package/dist/backends/comfyui.js.map +1 -0
  10. package/dist/backends/index.d.ts +24 -0
  11. package/dist/backends/index.d.ts.map +1 -0
  12. package/dist/backends/index.js +59 -0
  13. package/dist/backends/index.js.map +1 -0
  14. package/dist/backends/types.d.ts +97 -0
  15. package/dist/backends/types.d.ts.map +1 -0
  16. package/dist/backends/types.js +2 -0
  17. package/dist/backends/types.js.map +1 -0
  18. package/dist/backends/video-dashscope.d.ts +10 -0
  19. package/dist/backends/video-dashscope.d.ts.map +1 -0
  20. package/dist/backends/video-dashscope.js +94 -0
  21. package/dist/backends/video-dashscope.js.map +1 -0
  22. package/dist/backends/video-index.d.ts +23 -0
  23. package/dist/backends/video-index.d.ts.map +1 -0
  24. package/dist/backends/video-index.js +57 -0
  25. package/dist/backends/video-index.js.map +1 -0
  26. package/dist/commands/config.d.ts.map +1 -1
  27. package/dist/commands/config.js +22 -17
  28. package/dist/commands/config.js.map +1 -1
  29. package/dist/commands/image.d.ts +3 -0
  30. package/dist/commands/image.d.ts.map +1 -0
  31. package/dist/commands/image.js +148 -0
  32. package/dist/commands/image.js.map +1 -0
  33. package/dist/commands/video.d.ts.map +1 -1
  34. package/dist/commands/video.js +205 -119
  35. package/dist/commands/video.js.map +1 -1
  36. package/dist/index.js +2 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/services/bfl-api.d.ts +67 -0
  39. package/dist/services/bfl-api.d.ts.map +1 -0
  40. package/dist/services/bfl-api.js +99 -0
  41. package/dist/services/bfl-api.js.map +1 -0
  42. package/dist/services/config.d.ts +21 -1
  43. package/dist/services/config.d.ts.map +1 -1
  44. package/dist/services/config.js +41 -0
  45. package/dist/services/config.js.map +1 -1
  46. package/dist/services/dashscope-api.d.ts +69 -0
  47. package/dist/services/dashscope-api.d.ts.map +1 -0
  48. package/dist/services/dashscope-api.js +134 -0
  49. package/dist/services/dashscope-api.js.map +1 -0
  50. package/package.json +1 -1
@@ -7,19 +7,35 @@ import { success, info } from '../utils/logger.js';
7
7
  import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
8
8
  import { addEnhancedHelp } from '../utils/helpText.js';
9
9
  import { monitorProgress } from '../services/websocket.js';
10
+ import { getVideoBackend, getCurrentVideoBackendName } from '../backends/video-index.js';
10
11
  export function registerVideoCommand(program) {
11
12
  const cmd = program
12
13
  .command('video')
13
- .description('生成视频(图生视频)- 使用 Wan2.1 模型将静态图像转换为动态视频')
14
+ .description('生成视频(图生视频)- 支持 DashScope (wan2.6) 和 ComfyUI (wan2.1) 后端')
14
15
  .argument('<image>', '输入图像路径')
15
- .option('-p, --prompt <text>', '运动描述提示词(如 "camera zoom in")', '')
16
+ .option('-p, --prompt <text>', '运动描述提示词', '')
16
17
  .option('-n, --negative <text>', '负向提示词', '')
17
- .option('-o, --output <dir>', '输出目录 (默认: ./output)', './output')
18
- .option('--width <number>', '视频宽度 (默认: 512)', '512')
19
- .option('--height <number>', '视频高度 (默认: 512)', '512')
18
+ .option('-b, --backend <type>', '后端选择: auto | dashscope | comfyui', 'auto')
19
+ // DashScope 选项
20
+ .option('-r, --resolution <res>', '分辨率: 720P | 1080P (DashScope)', '1080P')
21
+ .option('-d, --duration <seconds>', '视频时长: 5 | 10 | 15 秒 (DashScope)', '5')
22
+ .option('--prompt-extend', '启用智能改写 prompt (DashScope, 默认开启)')
23
+ .option('--no-prompt-extend', '禁用智能改写 prompt')
24
+ .option('--audio', '启用自动配音 (DashScope, 默认开启)')
25
+ .option('--no-audio', '禁用自动配音')
26
+ .option('--audio-url <url>', '自定义音频 URL (DashScope)')
27
+ .option('--shot-type <type>', '镜头类型: single | multi (DashScope)', 'single')
28
+ .option('--watermark', '添加 AI 生成水印 (DashScope)')
29
+ .option('--seed <number>', '随机种子')
30
+ // ComfyUI 选项
31
+ .option('-o, --output <dir>', '输出目录 (ComfyUI)', './output')
32
+ .option('--width <number>', '视频宽度 (ComfyUI)', '512')
33
+ .option('--height <number>', '视频高度 (ComfyUI)', '512')
20
34
  .option('--no-wait', '提交任务后立即返回,不等待生成完成')
21
35
  .action(async (image, options) => {
22
36
  const pretty = isPrettyMode(options);
37
+ const backendType = options.backend;
38
+ const actualBackend = getCurrentVideoBackendName(backendType);
23
39
  try {
24
40
  // 检查图像文件是否存在
25
41
  const imagePath = path.resolve(image);
@@ -27,98 +43,14 @@ export function registerVideoCommand(program) {
27
43
  outputError('IMAGE_NOT_FOUND', `图像文件不存在: ${imagePath}`, options);
28
44
  }
29
45
  if (pretty) {
30
- info(`正在生成视频: "${path.basename(image)}"`);
46
+ info(`正在生成视频: "${path.basename(image)}" (后端: ${actualBackend})`);
31
47
  }
32
- // 先上传图像
33
- const client = new ComfyAPIClient();
34
- let uploadResult;
35
- if (pretty) {
36
- const uploadSpinner = ora('正在上传图像...').start();
37
- try {
38
- const imageBuffer = fs.readFileSync(imagePath);
39
- uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
40
- uploadSpinner.succeed('图像上传完成');
41
- }
42
- catch (err) {
43
- uploadSpinner.fail('图像上传失败');
44
- throw err;
45
- }
46
- }
47
- else {
48
- const imageBuffer = fs.readFileSync(imagePath);
49
- uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
50
- }
51
- // 加载内置 workflow
52
- const workflowPath = getBuiltinWorkflowPath('wan_image_to_video.json');
53
- const workflow = loadWorkflow(workflowPath);
54
- // 准备参数
55
- const params = {
56
- input_image: uploadResult.name,
57
- prompt: options.prompt,
58
- negative_prompt: options.negative || '色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走',
59
- width: parseInt(options.width),
60
- height: parseInt(options.height),
61
- frames: 33, // 固定最佳值
62
- fps: 8, // 固定最佳值
63
- steps: 20, // 固定最佳值
64
- cfg_scale: 6.0, // 固定最佳值
65
- seed: Math.floor(Math.random() * 1000000), // 随机种子
66
- sampler: 'uni_pc',
67
- scheduler: 'simple',
68
- unet_model: 'Wan2.1/wan2.1_i2v_720p_14B_fp8_scaled.safetensors',
69
- clip_model: 'umt5_xxl_fp8_e4m3fn_scaled.safetensors',
70
- clip_vision_model: 'clip_vision_h.safetensors',
71
- vae_model: 'wan_2.1_vae.safetensors',
72
- shift: 8.0,
73
- filename_prefix: 'comfy-cli-video',
74
- };
75
- // 替换变量
76
- const processedWorkflow = replaceVariables(workflow, params);
77
- // 提交到 ComfyUI
78
- const result = await client.submitWorkflow(processedWorkflow);
79
- if (pretty) {
80
- success(`视频生成任务已提交`);
81
- info(`Prompt ID: ${result.prompt_id}`);
82
- info(`帧数: ${params.frames}, FPS: ${params.fps}, 时长: ${(params.frames / params.fps).toFixed(1)}秒`);
83
- // 默认等待完成,除非指定了 --no-wait
84
- if (options.wait !== false) {
85
- const spinner = ora('正在连接 WebSocket...').start();
86
- try {
87
- await monitorProgress(result.prompt_id, (current, total, message) => {
88
- if (total > 0) {
89
- const percent = Math.round((current / total) * 100);
90
- spinner.text = `生成中: ${percent}% (${current}/${total})`;
91
- spinner.render();
92
- }
93
- else {
94
- spinner.text = message;
95
- spinner.render();
96
- }
97
- }, () => {
98
- spinner.succeed('视频生成完成!');
99
- });
100
- info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
101
- }
102
- catch (err) {
103
- spinner.fail(`进度监听失败: ${err?.message || err}`);
104
- info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
105
- }
106
- }
107
- else {
108
- info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
109
- }
48
+ // 根据后端选择不同的生成逻辑
49
+ if (actualBackend === 'dashscope') {
50
+ await generateWithDashScope(imagePath, options, pretty);
110
51
  }
111
52
  else {
112
- outputSuccess({
113
- prompt_id: result.prompt_id,
114
- image: path.basename(image),
115
- width: params.width,
116
- height: params.height,
117
- frames: params.frames,
118
- fps: params.fps,
119
- duration: parseFloat((params.frames / params.fps).toFixed(1)),
120
- status: options.wait !== false ? 'submitted_waiting' : 'submitted',
121
- });
53
+ await generateWithComfyUI(imagePath, options, pretty);
122
54
  }
123
55
  }
124
56
  catch (err) {
@@ -128,46 +60,200 @@ export function registerVideoCommand(program) {
128
60
  // Add enhanced help text
129
61
  addEnhancedHelp(cmd, {
130
62
  examples: [
131
- '# 基础用法:图像转视频',
132
- '$ comfy video landscape.png',
63
+ '# 自动选择后端(有 API Key 用 DashScope,否则用 ComfyUI)',
64
+ '$ comfy video cat.png --prompt "cat walking"',
133
65
  '',
134
- '# 添加运动提示词',
135
- '$ comfy video photo.jpg --prompt "camera zoom in"',
66
+ '# 使用 DashScope (wan2.6) - 云端 API',
67
+ '$ comfy video cat.png --backend dashscope --duration 10 --resolution 1080P',
136
68
  '',
137
- '# 指定视频尺寸',
138
- '$ comfy video image.png --width 720 --height 480',
69
+ '# 多镜头叙事模式',
70
+ '$ comfy video scene.png --backend dashscope --shot-type multi --duration 15',
139
71
  '',
140
- '# 不等待完成',
141
- '$ comfy video sunset.png --no-wait',
72
+ '# 禁用自动配音',
73
+ '$ comfy video cat.png --backend dashscope --no-audio',
74
+ '',
75
+ '# 使用 ComfyUI (wan2.1) - 本地服务',
76
+ '$ comfy video cat.png --backend comfyui --width 720 --height 480',
142
77
  '',
143
- '# Pretty 模式',
144
- '$ comfy video cat.png --prompt "cat walking" --pretty',
78
+ '# 不等待完成',
79
+ '$ comfy video cat.png --no-wait',
145
80
  ],
146
81
  outputJson: `{
147
82
  "success": true,
148
83
  "data": {
149
- "prompt_id": "abc-123-def",
150
- "image": "landscape.png",
151
- "width": 512,
152
- "height": 512,
153
- "frames": 33,
154
- "fps": 8,
155
- "duration": 4.1,
156
- "status": "submitted_waiting"
84
+ "id": "abc-123-def",
85
+ "backend": "dashscope",
86
+ "status": "completed",
87
+ "output": "./comfy-output/dashscope_abc123.mp4",
88
+ "duration": 5,
89
+ "resolution": "1080P"
157
90
  }
158
91
  }`,
159
92
  relatedCommands: [
160
- { command: 'download <prompt_id>', description: '下载生成的视频' },
93
+ { command: 'download <prompt_id>', description: '下载生成的视频 (ComfyUI)' },
161
94
  { command: 'generate <prompt>', description: '生成新图像' },
162
- { command: 'edit <image> <prompt>', description: '编辑现有图像' },
95
+ { command: 'config set dashscope.apiKey <key>', description: '设置 DashScope API Key' },
163
96
  ],
164
97
  notes: [
165
- '默认使用 Wan2.1 模型,生成 4.1 秒视频(33 @ 8 FPS)',
166
- '图像会先上传到 ComfyUI 服务器',
167
- '支持常见图像格式:PNG, JPG, JPEG',
168
- '建议图像尺寸为 512x512 以获得最佳效果',
169
- '视频生成时间较长,建议使用 --no-wait 立即返回',
98
+ 'DashScope 后端使用 wan2.6-i2v 模型,支持 720P/1080P,5/10/15 ',
99
+ 'ComfyUI 后端使用 wan2.1 模型,需要本地部署',
100
+ '设置 DASHSCOPE_API_KEY 环境变量或 comfy config set dashscope.apiKey 启用云端',
101
+ 'DashScope 视频 URL 24 小时后失效,会自动下载到本地',
170
102
  ],
171
103
  });
172
104
  }
105
+ /**
106
+ * 使用 DashScope 后端生成视频
107
+ */
108
+ async function generateWithDashScope(imagePath, options, pretty) {
109
+ const backend = getVideoBackend('dashscope');
110
+ const params = {
111
+ inputImage: imagePath,
112
+ prompt: options.prompt || undefined,
113
+ negativePrompt: options.negative || undefined,
114
+ resolution: options.resolution,
115
+ duration: parseInt(options.duration),
116
+ promptExtend: options.promptExtend,
117
+ audio: options.audio,
118
+ audioUrl: options.audioUrl,
119
+ shotType: options.shotType,
120
+ watermark: options.watermark || false,
121
+ seed: options.seed ? parseInt(options.seed) : undefined,
122
+ wait: options.wait !== false,
123
+ };
124
+ if (pretty) {
125
+ const spinner = ora('正在提交视频生成任务...').start();
126
+ try {
127
+ if (params.wait) {
128
+ spinner.text = '正在生成视频(预计 1-5 分钟)...';
129
+ }
130
+ const result = await backend.generate(params);
131
+ if (result.status === 'completed') {
132
+ spinner.succeed('视频生成完成!');
133
+ success(`输出文件: ${result.output}`);
134
+ info(`时长: ${result.duration}s, 分辨率: ${result.resolution}`);
135
+ info(`生成耗时: ${((result.durationMs || 0) / 1000).toFixed(1)}s`);
136
+ }
137
+ else {
138
+ spinner.succeed('任务已提交');
139
+ info(`任务 ID: ${result.id}`);
140
+ info(`状态: ${result.status}`);
141
+ }
142
+ }
143
+ catch (err) {
144
+ spinner.fail(`生成失败: ${err?.message || err}`);
145
+ throw err;
146
+ }
147
+ }
148
+ else {
149
+ const result = await backend.generate(params);
150
+ outputSuccess({
151
+ id: result.id,
152
+ backend: result.backend,
153
+ status: result.status,
154
+ output: result.output,
155
+ outputUrl: result.outputUrl,
156
+ duration: result.duration,
157
+ resolution: result.resolution,
158
+ durationMs: result.durationMs,
159
+ });
160
+ }
161
+ }
162
+ /**
163
+ * 使用 ComfyUI 后端生成视频(原有逻辑)
164
+ */
165
+ async function generateWithComfyUI(imagePath, options, pretty) {
166
+ // 先上传图像
167
+ const client = new ComfyAPIClient();
168
+ let uploadResult;
169
+ if (pretty) {
170
+ const uploadSpinner = ora('正在上传图像...').start();
171
+ try {
172
+ const imageBuffer = fs.readFileSync(imagePath);
173
+ uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
174
+ uploadSpinner.succeed('图像上传完成');
175
+ }
176
+ catch (err) {
177
+ uploadSpinner.fail('图像上传失败');
178
+ throw err;
179
+ }
180
+ }
181
+ else {
182
+ const imageBuffer = fs.readFileSync(imagePath);
183
+ uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
184
+ }
185
+ // 加载内置 workflow
186
+ const workflowPath = getBuiltinWorkflowPath('wan_image_to_video.json');
187
+ const workflow = loadWorkflow(workflowPath);
188
+ // 准备参数
189
+ const params = {
190
+ input_image: uploadResult.name,
191
+ prompt: options.prompt,
192
+ negative_prompt: options.negative || '色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走',
193
+ width: parseInt(options.width),
194
+ height: parseInt(options.height),
195
+ frames: 33,
196
+ fps: 8,
197
+ steps: 20,
198
+ cfg_scale: 6.0,
199
+ seed: options.seed ? parseInt(options.seed) : Math.floor(Math.random() * 1000000),
200
+ sampler: 'uni_pc',
201
+ scheduler: 'simple',
202
+ unet_model: 'Wan2.1/wan2.1_i2v_720p_14B_fp8_scaled.safetensors',
203
+ clip_model: 'umt5_xxl_fp8_e4m3fn_scaled.safetensors',
204
+ clip_vision_model: 'clip_vision_h.safetensors',
205
+ vae_model: 'wan_2.1_vae.safetensors',
206
+ shift: 8.0,
207
+ filename_prefix: 'comfy-cli-video',
208
+ };
209
+ // 替换变量
210
+ const processedWorkflow = replaceVariables(workflow, params);
211
+ // 提交到 ComfyUI
212
+ const result = await client.submitWorkflow(processedWorkflow);
213
+ if (pretty) {
214
+ success(`视频生成任务已提交`);
215
+ info(`Prompt ID: ${result.prompt_id}`);
216
+ info(`帧数: ${params.frames}, FPS: ${params.fps}, 时长: ${(params.frames / params.fps).toFixed(1)}秒`);
217
+ // 默认等待完成,除非指定了 --no-wait
218
+ if (options.wait !== false) {
219
+ const spinner = ora('正在连接 WebSocket...').start();
220
+ try {
221
+ await monitorProgress(result.prompt_id, (current, total, message) => {
222
+ if (total > 0) {
223
+ const percent = Math.round((current / total) * 100);
224
+ spinner.text = `生成中: ${percent}% (${current}/${total})`;
225
+ spinner.render();
226
+ }
227
+ else {
228
+ spinner.text = message;
229
+ spinner.render();
230
+ }
231
+ }, () => {
232
+ spinner.succeed('视频生成完成!');
233
+ });
234
+ info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
235
+ }
236
+ catch (err) {
237
+ spinner.fail(`进度监听失败: ${err?.message || err}`);
238
+ info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
239
+ }
240
+ }
241
+ else {
242
+ info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
243
+ }
244
+ }
245
+ else {
246
+ outputSuccess({
247
+ id: result.prompt_id,
248
+ backend: 'comfyui',
249
+ image: path.basename(imagePath),
250
+ width: params.width,
251
+ height: params.height,
252
+ frames: params.frames,
253
+ fps: params.fps,
254
+ duration: parseFloat((params.frames / params.fps).toFixed(1)),
255
+ status: options.wait !== false ? 'submitted_waiting' : 'submitted',
256
+ });
257
+ }
258
+ }
173
259
  //# sourceMappingURL=video.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { readFileSync } from 'fs';
4
4
  import { fileURLToPath } from 'url';
5
5
  import { dirname, join } from 'path';
6
6
  import { setGlobalPrettyMode } from './utils/output.js';
7
+ import { registerImageCommand } from './commands/image.js';
7
8
  import { registerGenerateCommand } from './commands/generate.js';
8
9
  import { registerEditCommand } from './commands/edit.js';
9
10
  import { registerVideoCommand } from './commands/video.js';
@@ -57,6 +58,7 @@ Output Formats:
57
58
  Issues: https://github.com/Optima-Chat/comfy-cli/issues
58
59
  `);
59
60
  // 注册功能命令
61
+ registerImageCommand(program); // 统一图像命令(推荐)
60
62
  registerGenerateCommand(program);
61
63
  registerEditCommand(program);
62
64
  registerVideoCommand(program);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;KAC7C,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,6BAA6B;IAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;KACD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBvB,CAAC,CAAC;AAEH,SAAS;AACT,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,SAAS;AACT,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;KAC7C,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,6BAA6B;IAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;KACD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBvB,CAAC,CAAC;AAEH,SAAS;AACT,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAE,aAAa;AAC7C,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,SAAS;AACT,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,67 @@
1
+ export interface BFLSubmitParams {
2
+ prompt: string;
3
+ input_image?: string;
4
+ input_image_2?: string;
5
+ input_image_3?: string;
6
+ input_image_4?: string;
7
+ input_image_5?: string;
8
+ input_image_6?: string;
9
+ input_image_7?: string;
10
+ input_image_8?: string;
11
+ width?: number;
12
+ height?: number;
13
+ seed?: number;
14
+ safety_tolerance?: number;
15
+ output_format?: 'jpeg' | 'png';
16
+ }
17
+ export interface BFLSubmitResponse {
18
+ id: string;
19
+ polling_url: string;
20
+ status?: string;
21
+ cost?: number;
22
+ input_mp?: number;
23
+ output_mp?: number;
24
+ }
25
+ export interface BFLPollResponse {
26
+ status: 'Pending' | 'Ready' | 'Error' | 'Request Moderated' | 'Content Moderated' | 'Task not found';
27
+ result?: {
28
+ sample?: string;
29
+ prompt?: string;
30
+ seed?: number;
31
+ start_time?: number;
32
+ end_time?: number;
33
+ duration?: number;
34
+ };
35
+ progress?: number;
36
+ }
37
+ export interface PollOptions {
38
+ interval?: number;
39
+ timeout?: number;
40
+ onProgress?: (status: string, progress?: number) => void;
41
+ }
42
+ export declare class BFLClient {
43
+ private client;
44
+ constructor(apiKey: string);
45
+ /**
46
+ * 提交图像生成/编辑任务 (FLUX.2 Pro)
47
+ */
48
+ submit(params: BFLSubmitParams): Promise<BFLSubmitResponse>;
49
+ /**
50
+ * 获取任务结果
51
+ */
52
+ getResult(taskId: string): Promise<BFLPollResponse>;
53
+ /**
54
+ * 轮询等待结果
55
+ */
56
+ poll(taskId: string, options?: PollOptions): Promise<BFLPollResponse>;
57
+ /**
58
+ * 将本地图像转换为 base64 data URL
59
+ */
60
+ imageToBase64(filePath: string): Promise<string>;
61
+ /**
62
+ * 下载图像到本地
63
+ */
64
+ downloadImage(url: string, outputDir: string, filename?: string): Promise<string>;
65
+ private sleep;
66
+ }
67
+ //# sourceMappingURL=bfl-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bfl-api.d.ts","sourceRoot":"","sources":["../../src/services/bfl-api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;IACrG,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,MAAM;IAW1B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAKjE;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOzD;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4C/E;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvF,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,99 @@
1
+ import axios from 'axios';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ export class BFLClient {
5
+ client;
6
+ constructor(apiKey) {
7
+ this.client = axios.create({
8
+ baseURL: 'https://api.bfl.ml/v1',
9
+ headers: {
10
+ 'X-Key': apiKey,
11
+ 'Content-Type': 'application/json',
12
+ },
13
+ timeout: 30000,
14
+ });
15
+ }
16
+ /**
17
+ * 提交图像生成/编辑任务 (FLUX.2 Pro)
18
+ */
19
+ async submit(params) {
20
+ const response = await this.client.post('/flux-2-pro', params);
21
+ return response.data;
22
+ }
23
+ /**
24
+ * 获取任务结果
25
+ */
26
+ async getResult(taskId) {
27
+ const response = await this.client.get('/get_result', {
28
+ params: { id: taskId },
29
+ });
30
+ return response.data;
31
+ }
32
+ /**
33
+ * 轮询等待结果
34
+ */
35
+ async poll(taskId, options = {}) {
36
+ const { interval = 1000, timeout = 300000, // 5 分钟
37
+ onProgress, } = options;
38
+ const startTime = Date.now();
39
+ while (true) {
40
+ // 检查超时
41
+ if (Date.now() - startTime > timeout) {
42
+ throw new Error('BFL polling timeout exceeded');
43
+ }
44
+ // 获取状态
45
+ const result = await this.getResult(taskId);
46
+ // 通知进度
47
+ onProgress?.(result.status, result.progress);
48
+ // 完成
49
+ if (result.status === 'Ready') {
50
+ return result;
51
+ }
52
+ // 失败
53
+ if (result.status === 'Error') {
54
+ throw new Error('BFL generation failed');
55
+ }
56
+ if (result.status === 'Request Moderated' || result.status === 'Content Moderated') {
57
+ throw new Error(`BFL content moderation: ${result.status}`);
58
+ }
59
+ if (result.status === 'Task not found') {
60
+ throw new Error('BFL task not found');
61
+ }
62
+ // 等待后继续轮询
63
+ await this.sleep(interval);
64
+ }
65
+ }
66
+ /**
67
+ * 将本地图像转换为 base64 data URL
68
+ */
69
+ async imageToBase64(filePath) {
70
+ const absolutePath = path.resolve(filePath);
71
+ const buffer = await fs.readFile(absolutePath);
72
+ const base64 = buffer.toString('base64');
73
+ const ext = path.extname(filePath).toLowerCase();
74
+ const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
75
+ return `data:${mimeType};base64,${base64}`;
76
+ }
77
+ /**
78
+ * 下载图像到本地
79
+ */
80
+ async downloadImage(url, outputDir, filename) {
81
+ // 确保输出目录存在
82
+ await fs.mkdir(outputDir, { recursive: true });
83
+ // 下载图像
84
+ const response = await axios.get(url, {
85
+ responseType: 'arraybuffer',
86
+ timeout: 120000, // 2 分钟
87
+ });
88
+ // 确定文件名
89
+ const finalFilename = filename || `bfl_${Date.now()}.png`;
90
+ const outputPath = path.join(outputDir, finalFilename);
91
+ // 写入文件
92
+ await fs.writeFile(outputPath, response.data);
93
+ return outputPath;
94
+ }
95
+ sleep(ms) {
96
+ return new Promise(resolve => setTimeout(resolve, ms));
97
+ }
98
+ }
99
+ //# sourceMappingURL=bfl-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bfl-api.js","sourceRoot":"","sources":["../../src/services/bfl-api.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,32 @@
1
1
  import Conf from 'conf';
2
+ export interface BFLConfig {
3
+ apiKey?: string;
4
+ safetyTolerance: number;
5
+ outputFormat: 'jpeg' | 'png';
6
+ }
7
+ export interface DashScopeConfig {
8
+ apiKey?: string;
9
+ resolution: '720P' | '1080P';
10
+ duration: 5 | 10 | 15;
11
+ promptExtend: boolean;
12
+ audio: boolean;
13
+ shotType: 'single' | 'multi';
14
+ }
2
15
  export interface ComfyConfig {
3
16
  server: string;
4
17
  timeout: number;
5
18
  autoConnect: boolean;
6
19
  outputDir: string;
20
+ bfl: BFLConfig;
21
+ dashscope: DashScopeConfig;
22
+ preferBackend: 'auto' | 'bfl' | 'comfyui';
23
+ preferVideoBackend: 'auto' | 'dashscope' | 'comfyui';
7
24
  }
8
25
  export declare const config: Conf<ComfyConfig>;
9
26
  export declare function getConfig(): ComfyConfig;
10
- export declare function setConfig(key: keyof ComfyConfig, value: any): void;
27
+ export declare function setConfig(key: string, value: any): void;
28
+ export declare function getConfigValue(key: string): any;
29
+ export declare function deleteConfig(key: string): void;
11
30
  export declare function resetConfig(): void;
31
+ export declare function isValidConfigKey(key: string): boolean;
12
32
  //# sourceMappingURL=config.d.ts.map