@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,34 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ /**
5
+ * 读取 Optima token
6
+ * 优先级: 环境变量 OPTIMA_TOKEN > ~/.optima/token.json
7
+ */
8
+ export function getToken() {
9
+ // 1. 环境变量
10
+ if (process.env.OPTIMA_TOKEN) {
11
+ return process.env.OPTIMA_TOKEN;
12
+ }
13
+ // 2. 文件
14
+ const tokenPath = path.join(os.homedir(), '.optima', 'token.json');
15
+ if (fs.existsSync(tokenPath)) {
16
+ try {
17
+ const data = JSON.parse(fs.readFileSync(tokenPath, 'utf-8'));
18
+ if (data.access_token) {
19
+ return data.access_token;
20
+ }
21
+ }
22
+ catch {
23
+ // fall through to error
24
+ }
25
+ }
26
+ throw new Error('未找到 Optima token。请确保 OPTIMA_TOKEN 环境变量已设置或 ~/.optima/token.json 存在。');
27
+ }
28
+ /**
29
+ * 获取 Generation API 的 base URL
30
+ */
31
+ export function getGenerationApiUrl() {
32
+ return process.env.GENERATION_API_URL || 'https://gen-api.optima.onl';
33
+ }
34
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,UAAU;IACV,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC;IAED,QAAQ;IACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,YAAY,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,4BAA4B,CAAC;AACxE,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(taskIdOrUrl: 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,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAoDpF;;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,108 @@
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.ai/v1',
9
+ headers: {
10
+ 'x-key': apiKey,
11
+ 'Content-Type': 'application/json',
12
+ },
13
+ timeout: 120000,
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(taskIdOrUrl, 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
+ // 获取状态 - 支持完整 URL 或 taskId
45
+ let result;
46
+ if (taskIdOrUrl.startsWith('http://') || taskIdOrUrl.startsWith('https://')) {
47
+ // 使用完整 URL
48
+ const response = await axios.get(taskIdOrUrl, { timeout: this.client.defaults.timeout });
49
+ result = response.data;
50
+ }
51
+ else {
52
+ // 使用 taskId
53
+ result = await this.getResult(taskIdOrUrl);
54
+ }
55
+ // 通知进度
56
+ onProgress?.(result.status, result.progress);
57
+ // 完成
58
+ if (result.status === 'Ready') {
59
+ return result;
60
+ }
61
+ // 失败
62
+ if (result.status === 'Error') {
63
+ throw new Error('BFL generation failed');
64
+ }
65
+ if (result.status === 'Request Moderated' || result.status === 'Content Moderated') {
66
+ throw new Error(`BFL content moderation: ${result.status}`);
67
+ }
68
+ if (result.status === 'Task not found') {
69
+ throw new Error('BFL task not found');
70
+ }
71
+ // 等待后继续轮询
72
+ await this.sleep(interval);
73
+ }
74
+ }
75
+ /**
76
+ * 将本地图像转换为 base64 data URL
77
+ */
78
+ async imageToBase64(filePath) {
79
+ const absolutePath = path.resolve(filePath);
80
+ const buffer = await fs.readFile(absolutePath);
81
+ const base64 = buffer.toString('base64');
82
+ const ext = path.extname(filePath).toLowerCase();
83
+ const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
84
+ return `data:${mimeType};base64,${base64}`;
85
+ }
86
+ /**
87
+ * 下载图像到本地
88
+ */
89
+ async downloadImage(url, outputDir, filename) {
90
+ // 确保输出目录存在
91
+ await fs.mkdir(outputDir, { recursive: true });
92
+ // 下载图像
93
+ const response = await axios.get(url, {
94
+ responseType: 'arraybuffer',
95
+ timeout: 120000, // 2 分钟
96
+ });
97
+ // 确定文件名
98
+ const finalFilename = filename || `bfl_${Date.now()}.png`;
99
+ const outputPath = path.join(outputDir, finalFilename);
100
+ // 写入文件
101
+ await fs.writeFile(outputPath, response.data);
102
+ return outputPath;
103
+ }
104
+ sleep(ms) {
105
+ return new Promise(resolve => setTimeout(resolve, ms));
106
+ }
107
+ }
108
+ //# 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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"}
@@ -0,0 +1,12 @@
1
+ import Conf from 'conf';
2
+ export interface GenConfig {
3
+ outputDir: string;
4
+ }
5
+ export declare const config: Conf<GenConfig>;
6
+ export declare function getConfig(): GenConfig;
7
+ export declare function setConfig(key: string, value: any): void;
8
+ export declare function getConfigValue(key: string): any;
9
+ export declare function deleteConfig(key: string): void;
10
+ export declare function resetConfig(): void;
11
+ export declare function isValidConfigKey(key: string): boolean;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,eAAO,MAAM,MAAM,iBAGjB,CAAC;AAEH,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAEvD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAE/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKrD"}
@@ -0,0 +1,30 @@
1
+ import Conf from 'conf';
2
+ const defaultConfig = {
3
+ outputDir: './gen-output',
4
+ };
5
+ export const config = new Conf({
6
+ projectName: 'gen-cli',
7
+ defaults: defaultConfig,
8
+ });
9
+ export function getConfig() {
10
+ return config.store;
11
+ }
12
+ export function setConfig(key, value) {
13
+ config.set(key, value);
14
+ }
15
+ export function getConfigValue(key) {
16
+ return config.get(key);
17
+ }
18
+ export function deleteConfig(key) {
19
+ config.delete(key);
20
+ }
21
+ export function resetConfig() {
22
+ config.clear();
23
+ }
24
+ export function isValidConfigKey(key) {
25
+ const validKeys = [
26
+ 'outputDir',
27
+ ];
28
+ return validKeys.includes(key);
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB,MAAM,aAAa,GAAc;IAC/B,SAAS,EAAE,cAAc;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAY;IACxC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,aAAa;CACxB,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAU;IAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,MAAM,CAAC,GAAsB,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,SAAS,GAAG;QAChB,WAAW;KACZ,CAAC;IACF,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,69 @@
1
+ export interface DashScopeSubmitParams {
2
+ prompt?: string;
3
+ negativePrompt?: string;
4
+ imgUrl: string;
5
+ audioUrl?: string;
6
+ resolution?: '720P' | '1080P';
7
+ duration?: 5 | 10 | 15;
8
+ promptExtend?: boolean;
9
+ audio?: boolean;
10
+ shotType?: 'single' | 'multi';
11
+ watermark?: boolean;
12
+ seed?: number;
13
+ }
14
+ export interface DashScopeSubmitResponse {
15
+ output: {
16
+ task_id: string;
17
+ task_status: string;
18
+ };
19
+ request_id: string;
20
+ }
21
+ export interface DashScopeTaskResult {
22
+ output: {
23
+ task_id: string;
24
+ task_status: 'PENDING' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'CANCELED' | 'UNKNOWN';
25
+ video_url?: string;
26
+ orig_prompt?: string;
27
+ actual_prompt?: string;
28
+ submit_time?: string;
29
+ end_time?: string;
30
+ };
31
+ usage?: {
32
+ duration?: number;
33
+ SR?: number;
34
+ video_count?: number;
35
+ };
36
+ request_id: string;
37
+ }
38
+ export interface PollOptions {
39
+ interval?: number;
40
+ timeout?: number;
41
+ onProgress?: (status: string) => void;
42
+ }
43
+ export declare class DashScopeClient {
44
+ private client;
45
+ private baseUrl;
46
+ constructor(apiKey: string);
47
+ /**
48
+ * 提交视频生成任务 (wan2.6-i2v)
49
+ */
50
+ submit(params: DashScopeSubmitParams): Promise<DashScopeSubmitResponse>;
51
+ /**
52
+ * 获取任务结果
53
+ */
54
+ getResult(taskId: string): Promise<DashScopeTaskResult>;
55
+ /**
56
+ * 轮询等待结果
57
+ */
58
+ poll(taskId: string, options?: PollOptions): Promise<DashScopeTaskResult>;
59
+ /**
60
+ * 将本地图像转换为 base64 data URL
61
+ */
62
+ imageToBase64(filePath: string): Promise<string>;
63
+ /**
64
+ * 下载视频到本地
65
+ */
66
+ downloadVideo(url: string, outputDir: string, filename?: string): Promise<string>;
67
+ private sleep;
68
+ }
69
+ //# sourceMappingURL=dashscope-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashscope-api.d.ts","sourceRoot":"","sources":["../../src/services/dashscope-api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;QACrF,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA2C;gBAE9C,MAAM,EAAE,MAAM;IAY1B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiC7E;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAW7D;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6CnF;;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,134 @@
1
+ import axios from 'axios';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ export class DashScopeClient {
5
+ client;
6
+ baseUrl = 'https://dashscope.aliyuncs.com/api/v1';
7
+ constructor(apiKey) {
8
+ this.client = axios.create({
9
+ baseURL: this.baseUrl,
10
+ headers: {
11
+ 'Authorization': `Bearer ${apiKey}`,
12
+ 'Content-Type': 'application/json',
13
+ 'X-DashScope-Async': 'enable',
14
+ },
15
+ timeout: 30000,
16
+ });
17
+ }
18
+ /**
19
+ * 提交视频生成任务 (wan2.6-i2v)
20
+ */
21
+ async submit(params) {
22
+ const requestBody = {
23
+ model: 'wan2.6-i2v',
24
+ input: {
25
+ prompt: params.prompt,
26
+ negative_prompt: params.negativePrompt,
27
+ img_url: params.imgUrl,
28
+ audio_url: params.audioUrl,
29
+ },
30
+ parameters: {
31
+ resolution: params.resolution || '1080P',
32
+ duration: params.duration || 5,
33
+ prompt_extend: params.promptExtend ?? true,
34
+ audio: params.audio ?? true,
35
+ shot_type: params.shotType || 'single',
36
+ watermark: params.watermark ?? false,
37
+ seed: params.seed,
38
+ },
39
+ };
40
+ // 移除 undefined 值
41
+ if (!requestBody.input.prompt)
42
+ delete requestBody.input.prompt;
43
+ if (!requestBody.input.negative_prompt)
44
+ delete requestBody.input.negative_prompt;
45
+ if (!requestBody.input.audio_url)
46
+ delete requestBody.input.audio_url;
47
+ if (requestBody.parameters.seed === undefined)
48
+ delete requestBody.parameters.seed;
49
+ const response = await this.client.post('/services/aigc/video-generation/video-synthesis', requestBody);
50
+ return response.data;
51
+ }
52
+ /**
53
+ * 获取任务结果
54
+ */
55
+ async getResult(taskId) {
56
+ // 查询任务不需要 X-DashScope-Async 头
57
+ const response = await axios.get(`${this.baseUrl}/tasks/${taskId}`, {
58
+ headers: {
59
+ 'Authorization': this.client.defaults.headers['Authorization'],
60
+ },
61
+ timeout: 30000,
62
+ });
63
+ return response.data;
64
+ }
65
+ /**
66
+ * 轮询等待结果
67
+ */
68
+ async poll(taskId, options = {}) {
69
+ const { interval = 15000, // DashScope 建议 15 秒轮询一次
70
+ timeout = 600000, // 10 分钟超时(视频生成较慢)
71
+ onProgress, } = options;
72
+ const startTime = Date.now();
73
+ while (true) {
74
+ // 检查超时
75
+ if (Date.now() - startTime > timeout) {
76
+ throw new Error('DashScope polling timeout exceeded');
77
+ }
78
+ // 获取状态
79
+ const result = await this.getResult(taskId);
80
+ const status = result.output.task_status;
81
+ // 通知进度
82
+ onProgress?.(status);
83
+ // 完成
84
+ if (status === 'SUCCEEDED') {
85
+ return result;
86
+ }
87
+ // 失败
88
+ if (status === 'FAILED') {
89
+ throw new Error('DashScope video generation failed');
90
+ }
91
+ if (status === 'CANCELED') {
92
+ throw new Error('DashScope task was canceled');
93
+ }
94
+ if (status === 'UNKNOWN') {
95
+ throw new Error('DashScope task status unknown');
96
+ }
97
+ // 等待后继续轮询
98
+ await this.sleep(interval);
99
+ }
100
+ }
101
+ /**
102
+ * 将本地图像转换为 base64 data URL
103
+ */
104
+ async imageToBase64(filePath) {
105
+ const absolutePath = path.resolve(filePath);
106
+ const buffer = await fs.readFile(absolutePath);
107
+ const base64 = buffer.toString('base64');
108
+ const ext = path.extname(filePath).toLowerCase();
109
+ const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
110
+ return `data:${mimeType};base64,${base64}`;
111
+ }
112
+ /**
113
+ * 下载视频到本地
114
+ */
115
+ async downloadVideo(url, outputDir, filename) {
116
+ // 确保输出目录存在
117
+ await fs.mkdir(outputDir, { recursive: true });
118
+ // 下载视频
119
+ const response = await axios.get(url, {
120
+ responseType: 'arraybuffer',
121
+ timeout: 300000, // 5 分钟(视频文件较大)
122
+ });
123
+ // 确定文件名
124
+ const finalFilename = filename || `dashscope_${Date.now()}.mp4`;
125
+ const outputPath = path.join(outputDir, finalFilename);
126
+ // 写入文件
127
+ await fs.writeFile(outputPath, response.data);
128
+ return outputPath;
129
+ }
130
+ sleep(ms) {
131
+ return new Promise(resolve => setTimeout(resolve, ms));
132
+ }
133
+ }
134
+ //# sourceMappingURL=dashscope-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashscope-api.js","sourceRoot":"","sources":["../../src/services/dashscope-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface TTSSynthesizeParams {
2
+ text: string;
3
+ voice?: string;
4
+ languageType?: string;
5
+ }
6
+ export interface TTSSynthesizeResult {
7
+ audioUrl: string;
8
+ }
9
+ export declare const TTS_VOICES: readonly ["Cherry", "Serena", "Chelsie", "Aria", "Bella", "Vivian", "Jennifer", "Katerina", "Breeze", "Maple", "Sakura", "Ethan", "Aiden", "Brandon", "Ryan", "Luke", "Leo"];
10
+ export declare class DashScopeTTSClient {
11
+ private client;
12
+ private baseUrl;
13
+ constructor(apiKey: string);
14
+ /**
15
+ * 文本转语音
16
+ */
17
+ synthesize(params: TTSSynthesizeParams): Promise<TTSSynthesizeResult>;
18
+ /**
19
+ * 下载音频到本地
20
+ */
21
+ downloadAudio(url: string, outputPath: string): Promise<string>;
22
+ }
23
+ //# sourceMappingURL=dashscope-tts-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashscope-tts-api.d.ts","sourceRoot":"","sources":["../../src/services/dashscope-tts-api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,eAAO,MAAM,UAAU,8KAMb,CAAC;AAEX,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA2C;gBAE9C,MAAM,EAAE,MAAM;IAW1B;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoB3E;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYtE"}
@@ -0,0 +1,56 @@
1
+ import axios from 'axios';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ // qwen3-tts-flash 支持的声音列表
5
+ export const TTS_VOICES = [
6
+ // 女声
7
+ 'Cherry', 'Serena', 'Chelsie', 'Aria', 'Bella', 'Vivian', 'Jennifer', 'Katerina',
8
+ 'Breeze', 'Maple', 'Sakura',
9
+ // 男声
10
+ 'Ethan', 'Aiden', 'Brandon', 'Ryan', 'Luke', 'Leo',
11
+ ];
12
+ export class DashScopeTTSClient {
13
+ client;
14
+ baseUrl = 'https://dashscope.aliyuncs.com/api/v1';
15
+ constructor(apiKey) {
16
+ this.client = axios.create({
17
+ baseURL: this.baseUrl,
18
+ headers: {
19
+ 'Authorization': `Bearer ${apiKey}`,
20
+ 'Content-Type': 'application/json',
21
+ },
22
+ timeout: 60000,
23
+ });
24
+ }
25
+ /**
26
+ * 文本转语音
27
+ */
28
+ async synthesize(params) {
29
+ const response = await this.client.post('/services/aigc/multimodal-generation/generation', {
30
+ model: 'qwen3-tts-flash',
31
+ input: {
32
+ text: params.text,
33
+ voice: params.voice || 'Cherry',
34
+ },
35
+ });
36
+ const audioUrl = response.data?.output?.audio?.url;
37
+ if (!audioUrl) {
38
+ throw new Error('DashScope TTS: 未返回音频 URL');
39
+ }
40
+ return { audioUrl };
41
+ }
42
+ /**
43
+ * 下载音频到本地
44
+ */
45
+ async downloadAudio(url, outputPath) {
46
+ const dir = path.dirname(outputPath);
47
+ await fs.mkdir(dir, { recursive: true });
48
+ const response = await axios.get(url, {
49
+ responseType: 'arraybuffer',
50
+ timeout: 60000,
51
+ });
52
+ await fs.writeFile(outputPath, response.data);
53
+ return outputPath;
54
+ }
55
+ }
56
+ //# sourceMappingURL=dashscope-tts-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashscope-tts-api.js","sourceRoot":"","sources":["../../src/services/dashscope-tts-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAY7B,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK;IACL,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU;IAChF,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAC3B,KAAK;IACL,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;CAC1C,CAAC;AAEX,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAgB;IACtB,OAAO,GAAG,uCAAuC,CAAC;IAE1D,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAA2B;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,iDAAiD,EACjD;YACE,KAAK,EAAE,iBAAiB;YACxB,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;aAChC;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,UAAkB;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACpC,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,57 @@
1
+ export type TryonCategory = 'auto' | 'tops' | 'bottoms' | 'one-pieces';
2
+ export type TryonMode = 'performance' | 'balanced' | 'quality';
3
+ export type TryonGarmentPhotoType = 'auto' | 'flat-lay' | 'model';
4
+ export interface TryonParams {
5
+ model_image: string;
6
+ garment_image: string;
7
+ category?: TryonCategory;
8
+ mode?: TryonMode;
9
+ garment_photo_type?: TryonGarmentPhotoType;
10
+ num_samples?: number;
11
+ output_format?: 'png' | 'jpeg';
12
+ seed?: number;
13
+ }
14
+ export interface FashnRunResponse {
15
+ id: string;
16
+ status: string;
17
+ }
18
+ export interface FashnStatusResponse {
19
+ id: string;
20
+ status: 'starting' | 'processing' | 'completed' | 'failed';
21
+ output?: string[];
22
+ error?: {
23
+ name: string;
24
+ message: string;
25
+ };
26
+ }
27
+ export interface PollOptions {
28
+ interval?: number;
29
+ timeout?: number;
30
+ onProgress?: (status: string) => void;
31
+ }
32
+ export declare class FashnClient {
33
+ private client;
34
+ constructor(apiKey: string);
35
+ /**
36
+ * 提交虚拟试穿任务
37
+ */
38
+ run(params: TryonParams): Promise<FashnRunResponse>;
39
+ /**
40
+ * 获取任务状态
41
+ */
42
+ getStatus(id: string): Promise<FashnStatusResponse>;
43
+ /**
44
+ * 轮询等待结果
45
+ */
46
+ poll(id: string, options?: PollOptions): Promise<FashnStatusResponse>;
47
+ /**
48
+ * 将本地图像转换为 base64 data URL
49
+ */
50
+ imageToBase64(filePath: string): Promise<string>;
51
+ /**
52
+ * 下载图像到本地
53
+ */
54
+ downloadImage(url: string, outputDir: string, filename?: string): Promise<string>;
55
+ private sleep;
56
+ }
57
+ //# sourceMappingURL=fashn-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fashn-api.d.ts","sourceRoot":"","sources":["../../src/services/fashn-api.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAC/D,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,MAAM;IAW1B;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQzD;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKzD;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8B/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;IAevF,OAAO,CAAC,KAAK;CAGd"}