@optima-chat/gen-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/bfl.d.ts +18 -0
- package/dist/backends/bfl.d.ts.map +1 -0
- package/dist/backends/bfl.js +130 -0
- package/dist/backends/bfl.js.map +1 -0
- package/dist/backends/comfyui.d.ts +10 -0
- package/dist/backends/comfyui.d.ts.map +1 -0
- package/dist/backends/comfyui.js +121 -0
- package/dist/backends/comfyui.js.map +1 -0
- package/dist/backends/index.d.ts +24 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +59 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/types.d.ts +99 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +2 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/backends/video-dashscope.d.ts +10 -0
- package/dist/backends/video-dashscope.d.ts.map +1 -0
- package/dist/backends/video-dashscope.js +108 -0
- package/dist/backends/video-dashscope.js.map +1 -0
- package/dist/backends/video-index.d.ts +23 -0
- package/dist/backends/video-index.d.ts.map +1 -0
- package/dist/backends/video-index.js +57 -0
- package/dist/backends/video-index.js.map +1 -0
- package/dist/commands/asr.d.ts +3 -0
- package/dist/commands/asr.d.ts.map +1 -0
- package/dist/commands/asr.js +133 -0
- package/dist/commands/asr.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +105 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/download.d.ts +3 -0
- package/dist/commands/download.d.ts.map +1 -0
- package/dist/commands/download.js +169 -0
- package/dist/commands/download.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +155 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +135 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/image.d.ts +3 -0
- package/dist/commands/image.d.ts.map +1 -0
- package/dist/commands/image.js +139 -0
- package/dist/commands/image.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +144 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interrupt.d.ts +3 -0
- package/dist/commands/interrupt.d.ts.map +1 -0
- package/dist/commands/interrupt.js +54 -0
- package/dist/commands/interrupt.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +82 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/node.d.ts +3 -0
- package/dist/commands/node.d.ts.map +1 -0
- package/dist/commands/node.js +148 -0
- package/dist/commands/node.js.map +1 -0
- package/dist/commands/queue.d.ts +3 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +199 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/system.d.ts +3 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +85 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/task.d.ts +3 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +176 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tryon.d.ts +3 -0
- package/dist/commands/tryon.d.ts.map +1 -0
- package/dist/commands/tryon.js +178 -0
- package/dist/commands/tryon.js.map +1 -0
- package/dist/commands/tts.d.ts +3 -0
- package/dist/commands/tts.d.ts.map +1 -0
- package/dist/commands/tts.js +157 -0
- package/dist/commands/tts.js.map +1 -0
- package/dist/commands/video.d.ts +3 -0
- package/dist/commands/video.d.ts.map +1 -0
- package/dist/commands/video.js +137 -0
- package/dist/commands/video.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +244 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api.d.ts +23 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +108 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/auth.d.ts +10 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +34 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/bfl-api.d.ts +67 -0
- package/dist/services/bfl-api.d.ts.map +1 -0
- package/dist/services/bfl-api.js +108 -0
- package/dist/services/bfl-api.js.map +1 -0
- package/dist/services/config.d.ts +12 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +30 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/dashscope-api.d.ts +69 -0
- package/dist/services/dashscope-api.d.ts.map +1 -0
- package/dist/services/dashscope-api.js +134 -0
- package/dist/services/dashscope-api.js.map +1 -0
- package/dist/services/dashscope-tts-api.d.ts +23 -0
- package/dist/services/dashscope-tts-api.d.ts.map +1 -0
- package/dist/services/dashscope-tts-api.js +56 -0
- package/dist/services/dashscope-tts-api.js.map +1 -0
- package/dist/services/fashn-api.d.ts +57 -0
- package/dist/services/fashn-api.d.ts.map +1 -0
- package/dist/services/fashn-api.js +84 -0
- package/dist/services/fashn-api.js.map +1 -0
- package/dist/services/generation-api.d.ts +139 -0
- package/dist/services/generation-api.d.ts.map +1 -0
- package/dist/services/generation-api.js +236 -0
- package/dist/services/generation-api.js.map +1 -0
- package/dist/services/groq-api.d.ts +18 -0
- package/dist/services/groq-api.d.ts.map +1 -0
- package/dist/services/groq-api.js +30 -0
- package/dist/services/groq-api.js.map +1 -0
- package/dist/services/websocket.d.ts +33 -0
- package/dist/services/websocket.d.ts.map +1 -0
- package/dist/services/websocket.js +217 -0
- package/dist/services/websocket.js.map +1 -0
- package/dist/utils/helpText.d.ts +15 -0
- package/dist/utils/helpText.d.ts.map +1 -0
- package/dist/utils/helpText.js +37 -0
- package/dist/utils/helpText.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output.d.ts +54 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +76 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/workflow.d.ts +17 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +81 -0
- package/dist/utils/workflow.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
5
|
+
import { loadWorkflow, getBuiltinWorkflowPath, replaceVariables } from '../utils/workflow.js';
|
|
6
|
+
import { success, info } from '../utils/logger.js';
|
|
7
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
8
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
9
|
+
import { monitorProgress } from '../services/websocket.js';
|
|
10
|
+
export function registerEditCommand(program) {
|
|
11
|
+
const cmd = program
|
|
12
|
+
.command('edit')
|
|
13
|
+
.description('编辑图像(图生图)- 使用 FLUX 模型对现有图像进行编辑和修改')
|
|
14
|
+
.argument('<image>', '输入图像路径')
|
|
15
|
+
.argument('<prompt>', '编辑描述提示词')
|
|
16
|
+
.option('-o, --output <dir>', '输出目录 (默认: ./output)', './output')
|
|
17
|
+
.option('--no-wait', '提交任务后立即返回,不等待编辑完成')
|
|
18
|
+
.action(async (image, prompt, options) => {
|
|
19
|
+
const pretty = isPrettyMode(options);
|
|
20
|
+
try {
|
|
21
|
+
// 检查图像文件是否存在
|
|
22
|
+
const imagePath = path.resolve(image);
|
|
23
|
+
if (!fs.existsSync(imagePath)) {
|
|
24
|
+
outputError('IMAGE_NOT_FOUND', `图像文件不存在: ${imagePath}`, options);
|
|
25
|
+
}
|
|
26
|
+
if (pretty) {
|
|
27
|
+
info(`正在编辑图像: "${path.basename(image)}"`);
|
|
28
|
+
info(`提示词: "${prompt}"`);
|
|
29
|
+
}
|
|
30
|
+
// 先上传图像
|
|
31
|
+
const client = new ComfyAPIClient();
|
|
32
|
+
let uploadResult;
|
|
33
|
+
if (pretty) {
|
|
34
|
+
const uploadSpinner = ora('正在上传图像...').start();
|
|
35
|
+
try {
|
|
36
|
+
const imageBuffer = fs.readFileSync(imagePath);
|
|
37
|
+
uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
|
|
38
|
+
uploadSpinner.succeed('图像上传完成');
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
uploadSpinner.fail('图像上传失败');
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const imageBuffer = fs.readFileSync(imagePath);
|
|
47
|
+
uploadResult = await client.uploadImage(imageBuffer, path.basename(imagePath));
|
|
48
|
+
}
|
|
49
|
+
// 加载内置 workflow
|
|
50
|
+
const workflowPath = getBuiltinWorkflowPath('flux_image_to_image.json');
|
|
51
|
+
const workflow = loadWorkflow(workflowPath);
|
|
52
|
+
// 准备参数
|
|
53
|
+
const params = {
|
|
54
|
+
prompt,
|
|
55
|
+
input_image: uploadResult.name,
|
|
56
|
+
denoise: 1.0, // 固定最佳值
|
|
57
|
+
steps: 20, // 固定最佳值
|
|
58
|
+
cfg_scale: 1.0, // 固定最佳值
|
|
59
|
+
seed: Math.floor(Math.random() * 1000000), // 随机种子
|
|
60
|
+
filename_prefix: 'comfy-cli-edit',
|
|
61
|
+
model: 'flux1-dev-kontext_fp8_scaled.safetensors',
|
|
62
|
+
clip_l_model: 'clip_l.safetensors',
|
|
63
|
+
clip_t5_model: 't5xxl_fp8_e4m3fn_scaled.safetensors',
|
|
64
|
+
vae_model: 'ae.safetensors',
|
|
65
|
+
sampler: 'euler',
|
|
66
|
+
scheduler: 'simple',
|
|
67
|
+
guidance: 2.5,
|
|
68
|
+
};
|
|
69
|
+
// 替换变量
|
|
70
|
+
const processedWorkflow = replaceVariables(workflow, params);
|
|
71
|
+
// 提交到 ComfyUI
|
|
72
|
+
const result = await client.submitWorkflow(processedWorkflow);
|
|
73
|
+
if (pretty) {
|
|
74
|
+
success(`图像编辑任务已提交`);
|
|
75
|
+
info(`Prompt ID: ${result.prompt_id}`);
|
|
76
|
+
// 默认等待完成,除非指定了 --no-wait
|
|
77
|
+
if (options.wait !== false) {
|
|
78
|
+
const spinner = ora('正在连接 WebSocket...').start();
|
|
79
|
+
try {
|
|
80
|
+
await monitorProgress(result.prompt_id, (current, total, message) => {
|
|
81
|
+
if (total > 0) {
|
|
82
|
+
const percent = Math.round((current / total) * 100);
|
|
83
|
+
spinner.text = `编辑中: ${percent}% (${current}/${total})`;
|
|
84
|
+
spinner.render();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
spinner.text = message;
|
|
88
|
+
spinner.render();
|
|
89
|
+
}
|
|
90
|
+
}, () => {
|
|
91
|
+
spinner.succeed('图像编辑完成!');
|
|
92
|
+
});
|
|
93
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
spinner.fail(`进度监听失败: ${err?.message || err}`);
|
|
97
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
outputSuccess({
|
|
106
|
+
prompt_id: result.prompt_id,
|
|
107
|
+
image: path.basename(image),
|
|
108
|
+
prompt,
|
|
109
|
+
status: options.wait !== false ? 'submitted_waiting' : 'submitted',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
outputError('EDIT_FAILED', `编辑失败: ${err}`, options);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// Add enhanced help text
|
|
118
|
+
addEnhancedHelp(cmd, {
|
|
119
|
+
examples: [
|
|
120
|
+
'# 基础用法:编辑图像',
|
|
121
|
+
'$ comfy edit input.png "make it more colorful"',
|
|
122
|
+
'',
|
|
123
|
+
'# 添加元素到图像',
|
|
124
|
+
'$ comfy edit photo.jpg "add a rainbow in the sky"',
|
|
125
|
+
'',
|
|
126
|
+
'# 不等待完成(立即返回)',
|
|
127
|
+
'$ comfy edit image.png "remove background" --no-wait',
|
|
128
|
+
'',
|
|
129
|
+
'# Pretty 模式',
|
|
130
|
+
'$ comfy edit cat.png "add a hat" --pretty',
|
|
131
|
+
],
|
|
132
|
+
outputJson: `{
|
|
133
|
+
"success": true,
|
|
134
|
+
"data": {
|
|
135
|
+
"prompt_id": "abc-123-def",
|
|
136
|
+
"image": "input.png",
|
|
137
|
+
"prompt": "make it more colorful",
|
|
138
|
+
"status": "submitted_waiting"
|
|
139
|
+
}
|
|
140
|
+
}`,
|
|
141
|
+
relatedCommands: [
|
|
142
|
+
{ command: 'download <prompt_id>', description: '下载编辑后的图像' },
|
|
143
|
+
{ command: 'generate <prompt>', description: '从文本生成新图像' },
|
|
144
|
+
{ command: 'video <image>', description: '将图像转换为视频' },
|
|
145
|
+
],
|
|
146
|
+
notes: [
|
|
147
|
+
'图像会先上传到 ComfyUI 服务器',
|
|
148
|
+
'默认使用 FLUX 图生图模型',
|
|
149
|
+
'支持常见图像格式:PNG, JPG, JPEG',
|
|
150
|
+
'编辑完成后使用 "comfy download <prompt_id>" 下载结果',
|
|
151
|
+
'默认输出 JSON 格式,使用 --pretty 可显示上传和生成进度',
|
|
152
|
+
],
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAsIvD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { ComfyAPIClient } from '../services/api.js';
|
|
3
|
+
import { loadWorkflow, getBuiltinWorkflowPath, replaceVariables } from '../utils/workflow.js';
|
|
4
|
+
import { success, info } from '../utils/logger.js';
|
|
5
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
6
|
+
import { monitorProgress } from '../services/websocket.js';
|
|
7
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
8
|
+
export function registerGenerateCommand(program) {
|
|
9
|
+
const cmd = program
|
|
10
|
+
.command('generate')
|
|
11
|
+
.description('生成图像(文生图)- 使用 FLUX 模型从文本生成高质量图像')
|
|
12
|
+
.argument('<prompt>', '图像描述提示词')
|
|
13
|
+
.option('-o, --output <dir>', '输出目录 (默认: ./output)', './output')
|
|
14
|
+
.option('--width <number>', '图像宽度 (默认: 1024)', '1024')
|
|
15
|
+
.option('--height <number>', '图像高度 (默认: 1024)', '1024')
|
|
16
|
+
.option('--no-wait', '提交任务后立即返回,不等待生成完成')
|
|
17
|
+
.action(async (prompt, options) => {
|
|
18
|
+
const pretty = isPrettyMode(options);
|
|
19
|
+
try {
|
|
20
|
+
if (pretty) {
|
|
21
|
+
info(`正在生成图像: "${prompt}"`);
|
|
22
|
+
}
|
|
23
|
+
// 加载内置 workflow
|
|
24
|
+
const workflowPath = getBuiltinWorkflowPath('flux_text_to_image.json');
|
|
25
|
+
const workflow = loadWorkflow(workflowPath);
|
|
26
|
+
// 准备参数
|
|
27
|
+
const params = {
|
|
28
|
+
prompt,
|
|
29
|
+
width: parseInt(options.width),
|
|
30
|
+
height: parseInt(options.height),
|
|
31
|
+
steps: 20, // 固定最佳值
|
|
32
|
+
cfg_scale: 1.0, // 固定最佳值
|
|
33
|
+
seed: Math.floor(Math.random() * 1000000), // 随机种子
|
|
34
|
+
filename_prefix: 'comfy-cli',
|
|
35
|
+
model: 'FLUX1/flux1-dev-fp8.safetensors',
|
|
36
|
+
sampler: 'euler',
|
|
37
|
+
scheduler: 'simple',
|
|
38
|
+
negative_prompt: 'Blurry details, distorted shapes, unrealistic reflections, harsh lighting, excessive shadows, overly saturated colors, unnatural composition, poor rendering, low resolution, pixelation, artificial-looking textures, overly exaggerated contrast, cluttered background, unnecessary elements, random objects, plastic-like appearance.',
|
|
39
|
+
guidance: 3.5,
|
|
40
|
+
};
|
|
41
|
+
// 替换变量
|
|
42
|
+
const processedWorkflow = replaceVariables(workflow, params);
|
|
43
|
+
// 提交到 ComfyUI
|
|
44
|
+
const client = new ComfyAPIClient();
|
|
45
|
+
const result = await client.submitWorkflow(processedWorkflow);
|
|
46
|
+
if (pretty) {
|
|
47
|
+
success(`图像生成任务已提交`);
|
|
48
|
+
info(`Prompt ID: ${result.prompt_id}`);
|
|
49
|
+
// 默认等待完成,除非指定了 --no-wait
|
|
50
|
+
if (options.wait !== false) {
|
|
51
|
+
const spinner = ora('正在连接 WebSocket...').start();
|
|
52
|
+
try {
|
|
53
|
+
await monitorProgress(result.prompt_id, (current, total, message) => {
|
|
54
|
+
if (total > 0) {
|
|
55
|
+
const percent = Math.round((current / total) * 100);
|
|
56
|
+
spinner.text = `生成中: ${percent}% (${current}/${total})`;
|
|
57
|
+
spinner.render(); // 强制渲染
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
spinner.text = message;
|
|
61
|
+
spinner.render();
|
|
62
|
+
}
|
|
63
|
+
}, () => {
|
|
64
|
+
spinner.succeed('图像生成完成!');
|
|
65
|
+
});
|
|
66
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
spinner.fail(`进度监听失败: ${err?.message || err}`);
|
|
70
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
info(`使用 'comfy download ${result.prompt_id}' 下载结果`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// JSON 模式:输出简洁的结果
|
|
79
|
+
outputSuccess({
|
|
80
|
+
prompt_id: result.prompt_id,
|
|
81
|
+
prompt,
|
|
82
|
+
width: params.width,
|
|
83
|
+
height: params.height,
|
|
84
|
+
status: options.wait !== false ? 'submitted_waiting' : 'submitted',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
outputError('GENERATE_FAILED', `生成失败: ${err}`, options);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// Add enhanced help text
|
|
93
|
+
addEnhancedHelp(cmd, {
|
|
94
|
+
examples: [
|
|
95
|
+
'# 基础用法:生成图像(默认 JSON 输出)',
|
|
96
|
+
'$ comfy generate "a beautiful sunset over mountains"',
|
|
97
|
+
'',
|
|
98
|
+
'# 生成图像并等待完成',
|
|
99
|
+
'$ comfy generate "a cat wearing a hat"',
|
|
100
|
+
'',
|
|
101
|
+
'# 生成图像但不等待(立即返回 prompt_id)',
|
|
102
|
+
'$ comfy generate "a dog" --no-wait',
|
|
103
|
+
'',
|
|
104
|
+
'# 指定图像尺寸',
|
|
105
|
+
'$ comfy generate "a landscape" --width 1920 --height 1080',
|
|
106
|
+
'',
|
|
107
|
+
'# Pretty 模式(人类可读)',
|
|
108
|
+
'$ comfy generate "a sunset" --pretty',
|
|
109
|
+
],
|
|
110
|
+
outputJson: `{
|
|
111
|
+
"success": true,
|
|
112
|
+
"data": {
|
|
113
|
+
"prompt_id": "abc-123-def",
|
|
114
|
+
"prompt": "a beautiful sunset",
|
|
115
|
+
"width": 1024,
|
|
116
|
+
"height": 1024,
|
|
117
|
+
"status": "submitted_waiting"
|
|
118
|
+
}
|
|
119
|
+
}`,
|
|
120
|
+
relatedCommands: [
|
|
121
|
+
{ command: 'download <prompt_id>', description: '下载生成的图像' },
|
|
122
|
+
{ command: 'workflow list', description: '查看生成历史' },
|
|
123
|
+
{ command: 'queue status', description: '查看队列状态' },
|
|
124
|
+
{ command: 'edit <image> <prompt>', description: '编辑已有图像' },
|
|
125
|
+
],
|
|
126
|
+
notes: [
|
|
127
|
+
'默认使用 FLUX1-dev-fp8 模型,生成高质量图像',
|
|
128
|
+
'默认会等待生成完成,使用 --no-wait 可立即返回',
|
|
129
|
+
'生成完成后使用 "comfy download <prompt_id>" 下载图像',
|
|
130
|
+
'图像默认保存到 ./output 目录',
|
|
131
|
+
'默认输出 JSON 格式,使用 --pretty 可显示进度条',
|
|
132
|
+
],
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/commands/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAkIpD"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
3
|
+
import { info } from '../utils/logger.js';
|
|
4
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
5
|
+
import { getConfigValue } from '../services/config.js';
|
|
6
|
+
import { GenerationApiClient, GenerationApiError, validateImageParams, fileToBase64, downloadResult, } from '../services/generation-api.js';
|
|
7
|
+
// 收集多个 -i 参数
|
|
8
|
+
function collect(value, previous) {
|
|
9
|
+
return previous.concat([value]);
|
|
10
|
+
}
|
|
11
|
+
export function registerImageCommand(program) {
|
|
12
|
+
const cmd = program
|
|
13
|
+
.command('image')
|
|
14
|
+
.description('生成或编辑图像 - 通过 optima-generation 调用 BFL FLUX')
|
|
15
|
+
.argument('<prompt>', '图像描述提示词')
|
|
16
|
+
.option('-i, --input <path>', '输入图像路径(可多次使用,最多 8 个)', collect, [])
|
|
17
|
+
.option('-W, --width <px>', '输出宽度 (默认: 1024)')
|
|
18
|
+
.option('-H, --height <px>', '输出高度 (默认: 1024)')
|
|
19
|
+
.option('-s, --seed <number>', '随机种子')
|
|
20
|
+
.option('-f, --format <fmt>', '输出格式: jpeg | png (默认: png)')
|
|
21
|
+
.option('-o, --output <path>', '输出目录')
|
|
22
|
+
.option('--safety <level>', '安全等级 0-5')
|
|
23
|
+
.action(async (prompt, options) => {
|
|
24
|
+
const pretty = isPrettyMode(options);
|
|
25
|
+
try {
|
|
26
|
+
const width = options.width ? parseInt(options.width) : undefined;
|
|
27
|
+
const height = options.height ? parseInt(options.height) : undefined;
|
|
28
|
+
// CLI 层快速校验
|
|
29
|
+
validateImageParams({ prompt, width, height });
|
|
30
|
+
// 处理输入图像 → base64
|
|
31
|
+
const inputImages = [];
|
|
32
|
+
if (options.input?.length) {
|
|
33
|
+
for (const imgPath of options.input) {
|
|
34
|
+
inputImages.push(await fileToBase64(imgPath));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (inputImages.length > 8) {
|
|
38
|
+
throw new Error('最多支持 8 张输入图像');
|
|
39
|
+
}
|
|
40
|
+
const params = {
|
|
41
|
+
prompt,
|
|
42
|
+
input_images: inputImages.length > 0 ? inputImages : undefined,
|
|
43
|
+
width,
|
|
44
|
+
height,
|
|
45
|
+
seed: options.seed ? parseInt(options.seed) : undefined,
|
|
46
|
+
output_format: options.format,
|
|
47
|
+
safety_tolerance: options.safety ? parseInt(options.safety) : undefined,
|
|
48
|
+
};
|
|
49
|
+
const client = new GenerationApiClient();
|
|
50
|
+
const outputDir = options.output || getConfigValue('outputDir') || './gen-output';
|
|
51
|
+
const spinner = pretty ? ora('正在提交图像生成任务...').start() : null;
|
|
52
|
+
if (pretty)
|
|
53
|
+
spinner.text = '正在生成图像...';
|
|
54
|
+
const result = await client.submitAndPoll('image', params, {
|
|
55
|
+
onProgress: (status) => {
|
|
56
|
+
if (pretty)
|
|
57
|
+
spinner.text = `图像生成中 (${status})...`;
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
if (result.status === 'completed' && result.result_url) {
|
|
61
|
+
const ext = options.format || 'png';
|
|
62
|
+
const filename = `image_${result.task_id.slice(0, 8)}.${ext}`;
|
|
63
|
+
const outputPath = await downloadResult(result.result_url, outputDir, filename);
|
|
64
|
+
if (pretty) {
|
|
65
|
+
spinner.succeed('图像生成完成!');
|
|
66
|
+
info(`输出文件: ${outputPath}`);
|
|
67
|
+
info(`任务 ID: ${result.task_id}`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
outputSuccess({
|
|
71
|
+
task_id: result.task_id,
|
|
72
|
+
status: result.status,
|
|
73
|
+
output: outputPath,
|
|
74
|
+
result_url: result.result_url,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (pretty) {
|
|
80
|
+
spinner.info(`任务状态: ${result.status}`);
|
|
81
|
+
if (result.error_message)
|
|
82
|
+
info(`错误: ${result.error_message}`);
|
|
83
|
+
info(`使用 'gen task get ${result.task_id}' 查看最新状态`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
outputSuccess({
|
|
87
|
+
task_id: result.task_id,
|
|
88
|
+
status: result.status,
|
|
89
|
+
error_message: result.error_message,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (err instanceof GenerationApiError) {
|
|
96
|
+
outputError(err.code, err.message, options);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
100
|
+
outputError('IMAGE_ERROR', message, options);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
addEnhancedHelp(cmd, {
|
|
105
|
+
examples: [
|
|
106
|
+
'# 文生图',
|
|
107
|
+
'$ gen image "a cute cat sitting on a sofa"',
|
|
108
|
+
'',
|
|
109
|
+
'# 单图编辑',
|
|
110
|
+
'$ gen image "make it look like watercolor" -i photo.png',
|
|
111
|
+
'',
|
|
112
|
+
'# 多图风格融合',
|
|
113
|
+
'$ gen image "combine styles" -i style.png -i content.png',
|
|
114
|
+
'',
|
|
115
|
+
'# 指定尺寸',
|
|
116
|
+
'$ gen image "landscape" -W 1920 -H 1080',
|
|
117
|
+
],
|
|
118
|
+
outputJson: `{
|
|
119
|
+
"success": true,
|
|
120
|
+
"data": {
|
|
121
|
+
"task_id": "abc-123-xyz",
|
|
122
|
+
"status": "completed",
|
|
123
|
+
"output": "./gen-output/image_abc123.png",
|
|
124
|
+
"result_url": "https://..."
|
|
125
|
+
}
|
|
126
|
+
}`,
|
|
127
|
+
relatedCommands: [
|
|
128
|
+
{ command: 'task get <id>', description: '查看任务状态' },
|
|
129
|
+
{ command: 'task list --type image', description: '列出图片任务' },
|
|
130
|
+
],
|
|
131
|
+
notes: [
|
|
132
|
+
'通过 optima-generation 调用 BFL FLUX 模型',
|
|
133
|
+
'需要 Optima 账号(OPTIMA_TOKEN 或 ~/.optima/token.json)',
|
|
134
|
+
'支持最多 8 张输入图像用于风格融合和编辑',
|
|
135
|
+
'最大分辨率 2048x2048',
|
|
136
|
+
],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/commands/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAkInD"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { mkdir, writeFile, access, readFile } from 'fs/promises';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
|
|
5
|
+
import { success, info } from '../utils/logger.js';
|
|
6
|
+
import { addEnhancedHelp } from '../utils/helpText.js';
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
/**
|
|
9
|
+
* Load skill templates from package files
|
|
10
|
+
*/
|
|
11
|
+
async function loadSkillTemplates() {
|
|
12
|
+
try {
|
|
13
|
+
const skillTemplateDir = join(__dirname, '../../.claude/skills/comfy-cli');
|
|
14
|
+
const skillContent = await readFile(join(skillTemplateDir, 'SKILL.md'), 'utf-8');
|
|
15
|
+
return {
|
|
16
|
+
'comfy-cli.md': skillContent,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`Failed to load skill templates: ${error instanceof Error ? error.message : String(error)}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function registerInitCommand(program) {
|
|
24
|
+
const cmd = program
|
|
25
|
+
.command('init')
|
|
26
|
+
.description('初始化 Claude Code Skills - 在当前目录配置 ComfyUI CLI 技能')
|
|
27
|
+
.option('-f, --force', '覆盖已存在的技能文件', false)
|
|
28
|
+
.action(async (options) => {
|
|
29
|
+
const pretty = isPrettyMode(options);
|
|
30
|
+
try {
|
|
31
|
+
const skillsDir = join(process.cwd(), '.claude', 'skills');
|
|
32
|
+
// Check if .claude/skills already exists
|
|
33
|
+
let exists = false;
|
|
34
|
+
try {
|
|
35
|
+
await access(skillsDir);
|
|
36
|
+
exists = true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Directory doesn't exist, which is fine
|
|
40
|
+
}
|
|
41
|
+
if (exists && !options.force) {
|
|
42
|
+
if (pretty) {
|
|
43
|
+
info('✅ Claude Code Skills already configured in this directory.');
|
|
44
|
+
info(`\n📁 Skills directory: ${skillsDir}`);
|
|
45
|
+
info('\n💡 Use --force to overwrite existing skills.');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
outputSuccess({
|
|
49
|
+
message: 'Skills already configured',
|
|
50
|
+
skills_directory: skillsDir,
|
|
51
|
+
hint: 'Use --force to overwrite',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Create .claude/skills directory
|
|
57
|
+
await mkdir(skillsDir, { recursive: true });
|
|
58
|
+
// Load skill templates from package files
|
|
59
|
+
const skillTemplates = await loadSkillTemplates();
|
|
60
|
+
// Write skills files
|
|
61
|
+
const createdSkills = [];
|
|
62
|
+
for (const [skillName, content] of Object.entries(skillTemplates)) {
|
|
63
|
+
// Create skill directory (e.g., .claude/skills/comfy-cli/)
|
|
64
|
+
const skillDirName = skillName.replace('.md', '');
|
|
65
|
+
const skillDirPath = join(skillsDir, skillDirName);
|
|
66
|
+
await mkdir(skillDirPath, { recursive: true });
|
|
67
|
+
// Create SKILL.md file inside the directory
|
|
68
|
+
const skillFilePath = join(skillDirPath, 'SKILL.md');
|
|
69
|
+
await writeFile(skillFilePath, content);
|
|
70
|
+
createdSkills.push(skillDirName);
|
|
71
|
+
}
|
|
72
|
+
// Success message
|
|
73
|
+
if (pretty) {
|
|
74
|
+
success('✅ ComfyUI CLI Skills initialized successfully!\n');
|
|
75
|
+
info(`📁 Skills directory: ${skillsDir}`);
|
|
76
|
+
info('📦 Created skills:');
|
|
77
|
+
createdSkills.forEach((skill) => {
|
|
78
|
+
info(` - ${skill}/`);
|
|
79
|
+
});
|
|
80
|
+
info('\n🎯 Next steps:');
|
|
81
|
+
info(' 1. Open this project in Claude Code');
|
|
82
|
+
info(' 2. Claude will automatically discover the ComfyUI CLI skill');
|
|
83
|
+
info(' 3. Ask Claude questions like:');
|
|
84
|
+
info(' • "帮我生成一张猫的图片"');
|
|
85
|
+
info(' • "把这张图片改成动漫风格"');
|
|
86
|
+
info(' • "用这张图片生成一个视频"');
|
|
87
|
+
info('\n💡 Claude will use ComfyUI CLI automatically!');
|
|
88
|
+
info('\n📚 Learn more: https://github.com/Optima-Chat/comfy-cli');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
outputSuccess({
|
|
92
|
+
message: 'Skills initialized successfully',
|
|
93
|
+
skills_directory: skillsDir,
|
|
94
|
+
created_skills: createdSkills,
|
|
95
|
+
next_steps: [
|
|
96
|
+
'Open this project in Claude Code',
|
|
97
|
+
'Claude will auto-discover ComfyUI CLI skill',
|
|
98
|
+
'Ask Claude to generate/edit images or create videos',
|
|
99
|
+
],
|
|
100
|
+
docs: 'https://github.com/Optima-Chat/comfy-cli',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
outputError('INIT_FAILED', `初始化失败: ${error instanceof Error ? error.message : String(error)}`, options);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Add enhanced help
|
|
109
|
+
addEnhancedHelp(cmd, {
|
|
110
|
+
examples: [
|
|
111
|
+
'# 初始化 Claude Code Skills',
|
|
112
|
+
'$ comfy init',
|
|
113
|
+
'',
|
|
114
|
+
'# 强制覆盖已存在的技能文件',
|
|
115
|
+
'$ comfy init --force',
|
|
116
|
+
],
|
|
117
|
+
outputJson: `{
|
|
118
|
+
"success": true,
|
|
119
|
+
"data": {
|
|
120
|
+
"message": "Skills initialized successfully",
|
|
121
|
+
"skills_directory": "/path/to/project/.claude/skills",
|
|
122
|
+
"created_skills": ["comfy-cli"],
|
|
123
|
+
"next_steps": [
|
|
124
|
+
"Open this project in Claude Code",
|
|
125
|
+
"Claude will auto-discover ComfyUI CLI skill",
|
|
126
|
+
"Ask Claude to generate/edit images or create videos"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
}`,
|
|
130
|
+
relatedCommands: [
|
|
131
|
+
{ command: 'config set server <url>', description: '配置 ComfyUI 服务器地址' },
|
|
132
|
+
{ command: 'generate <prompt>', description: '生成图像' },
|
|
133
|
+
{ command: 'edit <image> <prompt>', description: '编辑图像' },
|
|
134
|
+
{ command: 'video <image>', description: '生成视频' },
|
|
135
|
+
],
|
|
136
|
+
notes: [
|
|
137
|
+
'在项目根目录运行,会创建 .claude/skills/comfy-cli/ 目录',
|
|
138
|
+
'Claude Code 会自动发现并加载该技能',
|
|
139
|
+
'初始化后可以用自然语言让 Claude 生成/编辑图像或视频',
|
|
140
|
+
'使用 --force 可覆盖已存在的技能文件',
|
|
141
|
+
],
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupt.d.ts","sourceRoot":"","sources":["../../src/commands/interrupt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,QAiDxD"}
|