@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.
Files changed (153) hide show
  1. package/dist/backends/bfl.d.ts +18 -0
  2. package/dist/backends/bfl.d.ts.map +1 -0
  3. package/dist/backends/bfl.js +130 -0
  4. package/dist/backends/bfl.js.map +1 -0
  5. package/dist/backends/comfyui.d.ts +10 -0
  6. package/dist/backends/comfyui.d.ts.map +1 -0
  7. package/dist/backends/comfyui.js +121 -0
  8. package/dist/backends/comfyui.js.map +1 -0
  9. package/dist/backends/index.d.ts +24 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +59 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/types.d.ts +99 -0
  14. package/dist/backends/types.d.ts.map +1 -0
  15. package/dist/backends/types.js +2 -0
  16. package/dist/backends/types.js.map +1 -0
  17. package/dist/backends/video-dashscope.d.ts +10 -0
  18. package/dist/backends/video-dashscope.d.ts.map +1 -0
  19. package/dist/backends/video-dashscope.js +108 -0
  20. package/dist/backends/video-dashscope.js.map +1 -0
  21. package/dist/backends/video-index.d.ts +23 -0
  22. package/dist/backends/video-index.d.ts.map +1 -0
  23. package/dist/backends/video-index.js +57 -0
  24. package/dist/backends/video-index.js.map +1 -0
  25. package/dist/commands/asr.d.ts +3 -0
  26. package/dist/commands/asr.d.ts.map +1 -0
  27. package/dist/commands/asr.js +133 -0
  28. package/dist/commands/asr.js.map +1 -0
  29. package/dist/commands/config.d.ts +3 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +105 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/download.d.ts +3 -0
  34. package/dist/commands/download.d.ts.map +1 -0
  35. package/dist/commands/download.js +169 -0
  36. package/dist/commands/download.js.map +1 -0
  37. package/dist/commands/edit.d.ts +3 -0
  38. package/dist/commands/edit.d.ts.map +1 -0
  39. package/dist/commands/edit.js +155 -0
  40. package/dist/commands/edit.js.map +1 -0
  41. package/dist/commands/generate.d.ts +3 -0
  42. package/dist/commands/generate.d.ts.map +1 -0
  43. package/dist/commands/generate.js +135 -0
  44. package/dist/commands/generate.js.map +1 -0
  45. package/dist/commands/image.d.ts +3 -0
  46. package/dist/commands/image.d.ts.map +1 -0
  47. package/dist/commands/image.js +139 -0
  48. package/dist/commands/image.js.map +1 -0
  49. package/dist/commands/init.d.ts +3 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +144 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/interrupt.d.ts +3 -0
  54. package/dist/commands/interrupt.d.ts.map +1 -0
  55. package/dist/commands/interrupt.js +54 -0
  56. package/dist/commands/interrupt.js.map +1 -0
  57. package/dist/commands/model.d.ts +3 -0
  58. package/dist/commands/model.d.ts.map +1 -0
  59. package/dist/commands/model.js +82 -0
  60. package/dist/commands/model.js.map +1 -0
  61. package/dist/commands/node.d.ts +3 -0
  62. package/dist/commands/node.d.ts.map +1 -0
  63. package/dist/commands/node.js +148 -0
  64. package/dist/commands/node.js.map +1 -0
  65. package/dist/commands/queue.d.ts +3 -0
  66. package/dist/commands/queue.d.ts.map +1 -0
  67. package/dist/commands/queue.js +199 -0
  68. package/dist/commands/queue.js.map +1 -0
  69. package/dist/commands/system.d.ts +3 -0
  70. package/dist/commands/system.d.ts.map +1 -0
  71. package/dist/commands/system.js +85 -0
  72. package/dist/commands/system.js.map +1 -0
  73. package/dist/commands/task.d.ts +3 -0
  74. package/dist/commands/task.d.ts.map +1 -0
  75. package/dist/commands/task.js +176 -0
  76. package/dist/commands/task.js.map +1 -0
  77. package/dist/commands/tryon.d.ts +3 -0
  78. package/dist/commands/tryon.d.ts.map +1 -0
  79. package/dist/commands/tryon.js +178 -0
  80. package/dist/commands/tryon.js.map +1 -0
  81. package/dist/commands/tts.d.ts +3 -0
  82. package/dist/commands/tts.d.ts.map +1 -0
  83. package/dist/commands/tts.js +157 -0
  84. package/dist/commands/tts.js.map +1 -0
  85. package/dist/commands/video.d.ts +3 -0
  86. package/dist/commands/video.d.ts.map +1 -0
  87. package/dist/commands/video.js +137 -0
  88. package/dist/commands/video.js.map +1 -0
  89. package/dist/commands/workflow.d.ts +3 -0
  90. package/dist/commands/workflow.d.ts.map +1 -0
  91. package/dist/commands/workflow.js +244 -0
  92. package/dist/commands/workflow.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +58 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/services/api.d.ts +23 -0
  98. package/dist/services/api.d.ts.map +1 -0
  99. package/dist/services/api.js +108 -0
  100. package/dist/services/api.js.map +1 -0
  101. package/dist/services/auth.d.ts +10 -0
  102. package/dist/services/auth.d.ts.map +1 -0
  103. package/dist/services/auth.js +34 -0
  104. package/dist/services/auth.js.map +1 -0
  105. package/dist/services/bfl-api.d.ts +67 -0
  106. package/dist/services/bfl-api.d.ts.map +1 -0
  107. package/dist/services/bfl-api.js +108 -0
  108. package/dist/services/bfl-api.js.map +1 -0
  109. package/dist/services/config.d.ts +12 -0
  110. package/dist/services/config.d.ts.map +1 -0
  111. package/dist/services/config.js +30 -0
  112. package/dist/services/config.js.map +1 -0
  113. package/dist/services/dashscope-api.d.ts +69 -0
  114. package/dist/services/dashscope-api.d.ts.map +1 -0
  115. package/dist/services/dashscope-api.js +134 -0
  116. package/dist/services/dashscope-api.js.map +1 -0
  117. package/dist/services/dashscope-tts-api.d.ts +23 -0
  118. package/dist/services/dashscope-tts-api.d.ts.map +1 -0
  119. package/dist/services/dashscope-tts-api.js +56 -0
  120. package/dist/services/dashscope-tts-api.js.map +1 -0
  121. package/dist/services/fashn-api.d.ts +57 -0
  122. package/dist/services/fashn-api.d.ts.map +1 -0
  123. package/dist/services/fashn-api.js +84 -0
  124. package/dist/services/fashn-api.js.map +1 -0
  125. package/dist/services/generation-api.d.ts +139 -0
  126. package/dist/services/generation-api.d.ts.map +1 -0
  127. package/dist/services/generation-api.js +236 -0
  128. package/dist/services/generation-api.js.map +1 -0
  129. package/dist/services/groq-api.d.ts +18 -0
  130. package/dist/services/groq-api.d.ts.map +1 -0
  131. package/dist/services/groq-api.js +30 -0
  132. package/dist/services/groq-api.js.map +1 -0
  133. package/dist/services/websocket.d.ts +33 -0
  134. package/dist/services/websocket.d.ts.map +1 -0
  135. package/dist/services/websocket.js +217 -0
  136. package/dist/services/websocket.js.map +1 -0
  137. package/dist/utils/helpText.d.ts +15 -0
  138. package/dist/utils/helpText.d.ts.map +1 -0
  139. package/dist/utils/helpText.js +37 -0
  140. package/dist/utils/helpText.js.map +1 -0
  141. package/dist/utils/logger.d.ts +5 -0
  142. package/dist/utils/logger.d.ts.map +1 -0
  143. package/dist/utils/logger.js +14 -0
  144. package/dist/utils/logger.js.map +1 -0
  145. package/dist/utils/output.d.ts +54 -0
  146. package/dist/utils/output.d.ts.map +1 -0
  147. package/dist/utils/output.js +76 -0
  148. package/dist/utils/output.js.map +1 -0
  149. package/dist/utils/workflow.d.ts +17 -0
  150. package/dist/utils/workflow.d.ts.map +1 -0
  151. package/dist/utils/workflow.js +81 -0
  152. package/dist/utils/workflow.js.map +1 -0
  153. package/package.json +61 -0
@@ -0,0 +1,84 @@
1
+ import axios from 'axios';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ export class FashnClient {
5
+ client;
6
+ constructor(apiKey) {
7
+ this.client = axios.create({
8
+ baseURL: 'https://api.fashn.ai/v1',
9
+ headers: {
10
+ 'Authorization': `Bearer ${apiKey}`,
11
+ 'Content-Type': 'application/json',
12
+ },
13
+ timeout: 120000,
14
+ });
15
+ }
16
+ /**
17
+ * 提交虚拟试穿任务
18
+ */
19
+ async run(params) {
20
+ const response = await this.client.post('/run', {
21
+ model_name: 'tryon-v1.6',
22
+ inputs: params,
23
+ });
24
+ return response.data;
25
+ }
26
+ /**
27
+ * 获取任务状态
28
+ */
29
+ async getStatus(id) {
30
+ const response = await this.client.get(`/status/${id}`);
31
+ return response.data;
32
+ }
33
+ /**
34
+ * 轮询等待结果
35
+ */
36
+ async poll(id, options = {}) {
37
+ const { interval = 2000, timeout = 300000, onProgress, } = options;
38
+ const startTime = Date.now();
39
+ while (true) {
40
+ if (Date.now() - startTime > timeout) {
41
+ throw new Error('FASHN polling timeout exceeded');
42
+ }
43
+ const result = await this.getStatus(id);
44
+ onProgress?.(result.status);
45
+ if (result.status === 'completed') {
46
+ return result;
47
+ }
48
+ if (result.status === 'failed') {
49
+ const errMsg = result.error ? `${result.error.name}: ${result.error.message}` : 'Unknown error';
50
+ throw new Error(`FASHN try-on failed: ${errMsg}`);
51
+ }
52
+ await this.sleep(interval);
53
+ }
54
+ }
55
+ /**
56
+ * 将本地图像转换为 base64 data URL
57
+ */
58
+ async imageToBase64(filePath) {
59
+ const absolutePath = path.resolve(filePath);
60
+ const buffer = await fs.readFile(absolutePath);
61
+ const base64 = buffer.toString('base64');
62
+ const ext = path.extname(filePath).toLowerCase();
63
+ const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
64
+ return `data:${mimeType};base64,${base64}`;
65
+ }
66
+ /**
67
+ * 下载图像到本地
68
+ */
69
+ async downloadImage(url, outputDir, filename) {
70
+ await fs.mkdir(outputDir, { recursive: true });
71
+ const response = await axios.get(url, {
72
+ responseType: 'arraybuffer',
73
+ timeout: 120000,
74
+ });
75
+ const finalFilename = filename || `tryon_${Date.now()}.png`;
76
+ const outputPath = path.join(outputDir, finalFilename);
77
+ await fs.writeFile(outputPath, response.data);
78
+ return outputPath;
79
+ }
80
+ sleep(ms) {
81
+ return new Promise(resolve => setTimeout(resolve, ms));
82
+ }
83
+ }
84
+ //# sourceMappingURL=fashn-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fashn-api.js","sourceRoot":"","sources":["../../src/services/fashn-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsC7B,MAAM,OAAO,WAAW;IACd,MAAM,CAAgB;IAE9B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,MAAmB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;YAC9C,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,EAAU,EAAE,UAAuB,EAAE;QAC9C,MAAM,EACJ,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,MAAM,EAChB,UAAU,GACX,GAAG,OAAO,CAAC;QAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxC,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE5B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;gBAChG,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC7D,OAAO,QAAQ,QAAQ,WAAW,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,SAAiB,EAAE,QAAiB;QACnE,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACpC,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,139 @@
1
+ export type TaskType = 'image' | 'video' | 'tts' | 'asr' | 'tryon';
2
+ export type TaskStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' | 'expired';
3
+ export interface TaskResponse {
4
+ task_id: string;
5
+ status: TaskStatus;
6
+ type?: TaskType;
7
+ result_url?: string;
8
+ result_meta?: Record<string, any>;
9
+ error_message?: string;
10
+ created_at?: string;
11
+ started_at?: string;
12
+ completed_at?: string;
13
+ }
14
+ export interface TaskListResponse {
15
+ tasks: TaskResponse[];
16
+ total: number;
17
+ }
18
+ export interface ApiErrorResponse {
19
+ error: {
20
+ code: string;
21
+ message: string;
22
+ retry_after?: number;
23
+ details?: Record<string, any>;
24
+ };
25
+ }
26
+ export interface GenImageParams {
27
+ prompt: string;
28
+ input_images?: string[];
29
+ width?: number;
30
+ height?: number;
31
+ seed?: number;
32
+ output_format?: 'jpeg' | 'png';
33
+ safety_tolerance?: number;
34
+ }
35
+ export interface GenVideoParams {
36
+ image: string;
37
+ prompt?: string;
38
+ negative_prompt?: string;
39
+ resolution?: '720P' | '1080P';
40
+ duration?: number;
41
+ prompt_extend?: boolean;
42
+ audio?: boolean;
43
+ audio_url?: string;
44
+ shot_type?: 'single' | 'multi';
45
+ watermark?: boolean;
46
+ seed?: number;
47
+ }
48
+ export interface GenTTSParams {
49
+ text: string;
50
+ voice?: string;
51
+ }
52
+ export interface GenASRParams {
53
+ file: string;
54
+ filename: string;
55
+ language?: string;
56
+ model?: string;
57
+ }
58
+ export interface GenTryonParams {
59
+ model_image: string;
60
+ garment_image: string;
61
+ category?: 'auto' | 'tops' | 'bottoms' | 'one-pieces';
62
+ mode?: 'performance' | 'balanced' | 'quality';
63
+ garment_photo_type?: 'auto' | 'flat-lay' | 'model';
64
+ num_samples?: number;
65
+ output_format?: 'png' | 'jpeg';
66
+ seed?: number;
67
+ }
68
+ export declare class GenerationApiError extends Error {
69
+ code: string;
70
+ retryAfter?: number;
71
+ httpStatus?: number;
72
+ constructor(code: string, message: string, httpStatus?: number, retryAfter?: number);
73
+ }
74
+ export declare class GenerationApiClient {
75
+ private client;
76
+ constructor();
77
+ submitImage(params: GenImageParams): Promise<TaskResponse>;
78
+ submitVideo(params: GenVideoParams): Promise<TaskResponse>;
79
+ submitTTS(params: GenTTSParams): Promise<TaskResponse>;
80
+ submitASR(params: GenASRParams): Promise<TaskResponse>;
81
+ submitTryon(params: GenTryonParams): Promise<TaskResponse>;
82
+ getTask(taskId: string): Promise<TaskResponse>;
83
+ listTasks(options?: {
84
+ status?: TaskStatus;
85
+ type?: TaskType;
86
+ limit?: number;
87
+ }): Promise<TaskListResponse>;
88
+ cancelTask(taskId: string): Promise<TaskResponse>;
89
+ retryTask(taskId: string): Promise<TaskResponse>;
90
+ /**
91
+ * 轮询任务直到完成或超时
92
+ * 超时不视为失败,返回当前状态让调用方决定
93
+ */
94
+ pollTask(taskId: string, options?: {
95
+ timeout?: number;
96
+ interval?: number;
97
+ onProgress?: (status: TaskStatus) => void;
98
+ }): Promise<TaskResponse>;
99
+ /**
100
+ * 提交任务并轮询等待结果,一站式调用
101
+ */
102
+ submitAndPoll(type: TaskType, params: GenImageParams | GenVideoParams | GenTTSParams | GenASRParams | GenTryonParams, pollOptions?: {
103
+ timeout?: number;
104
+ interval?: number;
105
+ onProgress?: (status: TaskStatus) => void;
106
+ }): Promise<TaskResponse>;
107
+ private submit;
108
+ }
109
+ /**
110
+ * 将本地文件读取为 base64 字符串
111
+ */
112
+ export declare function fileToBase64(filePath: string): Promise<string>;
113
+ /**
114
+ * 将本地图像读取为 base64 data URL
115
+ */
116
+ export declare function imageToBase64DataUrl(filePath: string): Promise<string>;
117
+ /**
118
+ * 下载结果文件到本地
119
+ */
120
+ export declare function downloadResult(url: string, outputDir: string, filename: string): Promise<string>;
121
+ /**
122
+ * CLI 层参数校验 - 快速失败
123
+ */
124
+ export declare function validateImageParams(params: {
125
+ width?: number;
126
+ height?: number;
127
+ prompt: string;
128
+ }): void;
129
+ export declare function validateVideoParams(params: {
130
+ duration?: number;
131
+ resolution?: string;
132
+ }): void;
133
+ export declare function validateTTSParams(params: {
134
+ text: string;
135
+ }): void;
136
+ export declare function validateASRParams(params: {
137
+ fileSize: number;
138
+ }): void;
139
+ //# sourceMappingURL=generation-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-api.d.ts","sourceRoot":"","sources":["../../src/services/generation-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ import axios from 'axios';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ import { getToken, getGenerationApiUrl } from './auth.js';
5
+ // ==================== Error Handling ====================
6
+ export class GenerationApiError extends Error {
7
+ code;
8
+ retryAfter;
9
+ httpStatus;
10
+ constructor(code, message, httpStatus, retryAfter) {
11
+ super(message);
12
+ this.name = 'GenerationApiError';
13
+ this.code = code;
14
+ this.httpStatus = httpStatus;
15
+ this.retryAfter = retryAfter;
16
+ }
17
+ }
18
+ function handleApiError(err) {
19
+ if (err.response?.data?.error) {
20
+ const { code, message, retry_after } = err.response.data.error;
21
+ throw new GenerationApiError(code, message, err.response.status, retry_after);
22
+ }
23
+ if (err.response) {
24
+ throw new GenerationApiError('UNKNOWN_ERROR', `HTTP ${err.response.status}: ${err.response.statusText}`, err.response.status);
25
+ }
26
+ throw new GenerationApiError('NETWORK_ERROR', `网络请求失败: ${err.message}`);
27
+ }
28
+ // ==================== Client ====================
29
+ export class GenerationApiClient {
30
+ client;
31
+ constructor() {
32
+ const token = getToken();
33
+ const baseURL = getGenerationApiUrl();
34
+ this.client = axios.create({
35
+ baseURL,
36
+ headers: {
37
+ 'Authorization': `Bearer ${token}`,
38
+ 'Content-Type': 'application/json',
39
+ },
40
+ timeout: 30000,
41
+ maxBodyLength: 30 * 1024 * 1024,
42
+ maxContentLength: 30 * 1024 * 1024,
43
+ });
44
+ }
45
+ // ==================== Submit Tasks ====================
46
+ async submitImage(params) {
47
+ return this.submit('/api/image/generate', params);
48
+ }
49
+ async submitVideo(params) {
50
+ return this.submit('/api/video/generate', params);
51
+ }
52
+ async submitTTS(params) {
53
+ return this.submit('/api/tts/generate', params);
54
+ }
55
+ async submitASR(params) {
56
+ return this.submit('/api/asr/generate', params);
57
+ }
58
+ async submitTryon(params) {
59
+ return this.submit('/api/tryon/generate', params);
60
+ }
61
+ // ==================== Task Management ====================
62
+ async getTask(taskId) {
63
+ try {
64
+ const response = await this.client.get(`/api/task/${taskId}`);
65
+ return response.data;
66
+ }
67
+ catch (err) {
68
+ handleApiError(err);
69
+ }
70
+ }
71
+ async listTasks(options) {
72
+ try {
73
+ const params = {};
74
+ if (options?.status)
75
+ params.status = options.status;
76
+ if (options?.type)
77
+ params.type = options.type;
78
+ if (options?.limit)
79
+ params.limit = options.limit;
80
+ const response = await this.client.get('/api/task/list', { params });
81
+ return response.data;
82
+ }
83
+ catch (err) {
84
+ handleApiError(err);
85
+ }
86
+ }
87
+ async cancelTask(taskId) {
88
+ try {
89
+ const response = await this.client.post(`/api/task/${taskId}/cancel`, {});
90
+ return response.data;
91
+ }
92
+ catch (err) {
93
+ handleApiError(err);
94
+ }
95
+ }
96
+ async retryTask(taskId) {
97
+ try {
98
+ const response = await this.client.post(`/api/task/${taskId}/retry`, {});
99
+ return response.data;
100
+ }
101
+ catch (err) {
102
+ handleApiError(err);
103
+ }
104
+ }
105
+ // ==================== Polling ====================
106
+ /**
107
+ * 轮询任务直到完成或超时
108
+ * 超时不视为失败,返回当前状态让调用方决定
109
+ */
110
+ async pollTask(taskId, options) {
111
+ const timeout = options?.timeout || 600000; // 默认 10 分钟
112
+ const interval = options?.interval || 3000; // 默认 3 秒
113
+ const startTime = Date.now();
114
+ while (true) {
115
+ if (Date.now() - startTime > timeout) {
116
+ // 超时时再查一次获取真实状态
117
+ try {
118
+ const latest = await this.getTask(taskId);
119
+ latest.error_message = latest.error_message || '轮询超时。使用 gen task get 查看最新状态。';
120
+ return latest;
121
+ }
122
+ catch {
123
+ return {
124
+ task_id: taskId,
125
+ status: 'processing',
126
+ error_message: '轮询超时。使用 gen task get 查看最新状态。',
127
+ };
128
+ }
129
+ }
130
+ const result = await this.getTask(taskId);
131
+ options?.onProgress?.(result.status);
132
+ if (result.status === 'completed' || result.status === 'failed' || result.status === 'cancelled') {
133
+ return result;
134
+ }
135
+ await sleep(interval);
136
+ }
137
+ }
138
+ // ==================== Helpers ====================
139
+ /**
140
+ * 提交任务并轮询等待结果,一站式调用
141
+ */
142
+ async submitAndPoll(type, params, pollOptions) {
143
+ let submitResult;
144
+ switch (type) {
145
+ case 'image':
146
+ submitResult = await this.submitImage(params);
147
+ break;
148
+ case 'video':
149
+ submitResult = await this.submitVideo(params);
150
+ break;
151
+ case 'tts':
152
+ submitResult = await this.submitTTS(params);
153
+ break;
154
+ case 'asr':
155
+ submitResult = await this.submitASR(params);
156
+ break;
157
+ case 'tryon':
158
+ submitResult = await this.submitTryon(params);
159
+ break;
160
+ }
161
+ return this.pollTask(submitResult.task_id, pollOptions);
162
+ }
163
+ // ==================== Private ====================
164
+ async submit(endpoint, params) {
165
+ try {
166
+ const response = await this.client.post(endpoint, params);
167
+ return response.data;
168
+ }
169
+ catch (err) {
170
+ handleApiError(err);
171
+ }
172
+ }
173
+ }
174
+ // ==================== Utilities ====================
175
+ function sleep(ms) {
176
+ return new Promise(resolve => setTimeout(resolve, ms));
177
+ }
178
+ /**
179
+ * 将本地文件读取为 base64 字符串
180
+ */
181
+ export async function fileToBase64(filePath) {
182
+ const absolutePath = path.resolve(filePath);
183
+ const buffer = await fs.readFile(absolutePath);
184
+ return buffer.toString('base64');
185
+ }
186
+ /**
187
+ * 将本地图像读取为 base64 data URL
188
+ */
189
+ export async function imageToBase64DataUrl(filePath) {
190
+ const absolutePath = path.resolve(filePath);
191
+ const buffer = await fs.readFile(absolutePath);
192
+ const base64 = buffer.toString('base64');
193
+ const ext = path.extname(filePath).toLowerCase();
194
+ const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
195
+ return `data:${mimeType};base64,${base64}`;
196
+ }
197
+ /**
198
+ * 下载结果文件到本地
199
+ */
200
+ export async function downloadResult(url, outputDir, filename) {
201
+ await fs.mkdir(outputDir, { recursive: true });
202
+ const response = await axios.get(url, {
203
+ responseType: 'arraybuffer',
204
+ timeout: 300000, // 5 分钟,视频文件可能较大
205
+ });
206
+ const outputPath = path.join(outputDir, filename);
207
+ await fs.writeFile(outputPath, response.data);
208
+ return outputPath;
209
+ }
210
+ /**
211
+ * CLI 层参数校验 - 快速失败
212
+ */
213
+ export function validateImageParams(params) {
214
+ if (params.width && params.width > 2048)
215
+ throw new Error('图片宽度不能超过 2048');
216
+ if (params.height && params.height > 2048)
217
+ throw new Error('图片高度不能超过 2048');
218
+ if (params.prompt.length > 10000)
219
+ throw new Error('prompt 不能超过 10000 字符');
220
+ }
221
+ export function validateVideoParams(params) {
222
+ if (params.duration && params.duration > 10)
223
+ throw new Error('视频时长不能超过 10 秒');
224
+ if (params.resolution && !['720P', '1080P'].includes(params.resolution)) {
225
+ throw new Error('分辨率仅支持 720P 或 1080P');
226
+ }
227
+ }
228
+ export function validateTTSParams(params) {
229
+ if (params.text.length > 5000)
230
+ throw new Error('文本长度不能超过 5000 字符');
231
+ }
232
+ export function validateASRParams(params) {
233
+ if (params.fileSize > 25 * 1024 * 1024)
234
+ throw new Error('音频文件不能超过 25MB');
235
+ }
236
+ //# sourceMappingURL=generation-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-api.js","sourceRoot":"","sources":["../../src/services/generation-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface TranscribeParams {
2
+ filePath: string;
3
+ model?: string;
4
+ language?: string;
5
+ }
6
+ export interface TranscribeResult {
7
+ text: string;
8
+ }
9
+ export declare class GroqClient {
10
+ private apiKey;
11
+ private baseUrl;
12
+ constructor(apiKey: string);
13
+ /**
14
+ * 语音识别(ASR)
15
+ */
16
+ transcribe(params: TranscribeParams): Promise<TranscribeResult>;
17
+ }
18
+ //# sourceMappingURL=groq-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq-api.d.ts","sourceRoot":"","sources":["../../src/services/groq-api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAoC;gBAEvC,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsBtE"}
@@ -0,0 +1,30 @@
1
+ import axios from 'axios';
2
+ import FormData from 'form-data';
3
+ import * as fs from 'fs';
4
+ export class GroqClient {
5
+ apiKey;
6
+ baseUrl = 'https://api.groq.com/openai/v1';
7
+ constructor(apiKey) {
8
+ this.apiKey = apiKey;
9
+ }
10
+ /**
11
+ * 语音识别(ASR)
12
+ */
13
+ async transcribe(params) {
14
+ const form = new FormData();
15
+ form.append('file', fs.createReadStream(params.filePath));
16
+ form.append('model', params.model || 'whisper-large-v3-turbo');
17
+ if (params.language) {
18
+ form.append('language', params.language);
19
+ }
20
+ const response = await axios.post(`${this.baseUrl}/audio/transcriptions`, form, {
21
+ headers: {
22
+ 'Authorization': `Bearer ${this.apiKey}`,
23
+ ...form.getHeaders(),
24
+ },
25
+ timeout: 60000,
26
+ });
27
+ return { text: response.data.text };
28
+ }
29
+ }
30
+ //# sourceMappingURL=groq-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq-api.js","sourceRoot":"","sources":["../../src/services/groq-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAYzB,MAAM,OAAO,UAAU;IACb,MAAM,CAAS;IACf,OAAO,GAAG,gCAAgC,CAAC;IAEnD,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAwB;QACvC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,uBAAuB,EACtC,IAAI,EACJ;YACE,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,GAAG,IAAI,CAAC,UAAU,EAAE;aACrB;YACD,OAAO,EAAE,KAAK;SACf,CACF,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface ProgressData {
3
+ value: number;
4
+ max: number;
5
+ node?: string | null;
6
+ prompt_id?: string;
7
+ }
8
+ export interface ExecutingData {
9
+ node: string | null;
10
+ prompt_id: string;
11
+ }
12
+ export interface ExecutedData {
13
+ node: string;
14
+ output: any;
15
+ prompt_id: string;
16
+ }
17
+ export declare class ComfyWebSocket extends EventEmitter {
18
+ private ws;
19
+ private clientId;
20
+ private reconnectAttempts;
21
+ private maxReconnectAttempts;
22
+ constructor(clientId?: string);
23
+ connect(): Promise<void>;
24
+ private handleMessage;
25
+ disconnect(): void;
26
+ isConnected(): boolean;
27
+ getClientId(): string;
28
+ }
29
+ /**
30
+ * 监听特定 prompt_id 的执行进度
31
+ */
32
+ export declare function monitorProgress(promptId: string, onProgress?: (current: number, total: number, message: string) => void, onComplete?: () => void): Promise<void>;
33
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;gBAErB,QAAQ,CAAC,EAAE,MAAM;IAKvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD9B,OAAO,CAAC,aAAa;IAiCrB,UAAU;IAOV,WAAW,IAAI,OAAO;IAItB,WAAW,IAAI,MAAM;CAGtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,EACtE,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAmHf"}