@changw98ic/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 (163) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +57 -0
  3. package/dist/commands/adapt.d.ts +8 -0
  4. package/dist/commands/adapt.d.ts.map +1 -0
  5. package/dist/commands/adapt.js +108 -0
  6. package/dist/commands/adapt.js.map +1 -0
  7. package/dist/commands/archive.d.ts +6 -0
  8. package/dist/commands/archive.d.ts.map +1 -0
  9. package/dist/commands/archive.js +66 -0
  10. package/dist/commands/archive.js.map +1 -0
  11. package/dist/commands/backup.d.ts +6 -0
  12. package/dist/commands/backup.d.ts.map +1 -0
  13. package/dist/commands/backup.js +151 -0
  14. package/dist/commands/backup.js.map +1 -0
  15. package/dist/commands/context.d.ts +9 -0
  16. package/dist/commands/context.d.ts.map +1 -0
  17. package/dist/commands/context.js +203 -0
  18. package/dist/commands/context.js.map +1 -0
  19. package/dist/commands/dashboard.d.ts +6 -0
  20. package/dist/commands/dashboard.d.ts.map +1 -0
  21. package/dist/commands/dashboard.js +27 -0
  22. package/dist/commands/dashboard.js.map +1 -0
  23. package/dist/commands/entity.d.ts +6 -0
  24. package/dist/commands/entity.d.ts.map +1 -0
  25. package/dist/commands/entity.js +173 -0
  26. package/dist/commands/entity.js.map +1 -0
  27. package/dist/commands/extract-context.d.ts +9 -0
  28. package/dist/commands/extract-context.d.ts.map +1 -0
  29. package/dist/commands/extract-context.js +135 -0
  30. package/dist/commands/extract-context.js.map +1 -0
  31. package/dist/commands/index.d.ts +6 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +69 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/init.d.ts +8 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +37 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/migrate.d.ts +6 -0
  40. package/dist/commands/migrate.d.ts.map +1 -0
  41. package/dist/commands/migrate.js +67 -0
  42. package/dist/commands/migrate.js.map +1 -0
  43. package/dist/commands/plan.d.ts +6 -0
  44. package/dist/commands/plan.d.ts.map +1 -0
  45. package/dist/commands/plan.js +35 -0
  46. package/dist/commands/plan.js.map +1 -0
  47. package/dist/commands/preflight.d.ts +6 -0
  48. package/dist/commands/preflight.d.ts.map +1 -0
  49. package/dist/commands/preflight.js +80 -0
  50. package/dist/commands/preflight.js.map +1 -0
  51. package/dist/commands/query.d.ts +6 -0
  52. package/dist/commands/query.d.ts.map +1 -0
  53. package/dist/commands/query.js +82 -0
  54. package/dist/commands/query.js.map +1 -0
  55. package/dist/commands/rag.d.ts +6 -0
  56. package/dist/commands/rag.d.ts.map +1 -0
  57. package/dist/commands/rag.js +113 -0
  58. package/dist/commands/rag.js.map +1 -0
  59. package/dist/commands/review.d.ts +6 -0
  60. package/dist/commands/review.d.ts.map +1 -0
  61. package/dist/commands/review.js +38 -0
  62. package/dist/commands/review.js.map +1 -0
  63. package/dist/commands/state.d.ts +6 -0
  64. package/dist/commands/state.d.ts.map +1 -0
  65. package/dist/commands/state.js +64 -0
  66. package/dist/commands/state.js.map +1 -0
  67. package/dist/commands/status.d.ts +6 -0
  68. package/dist/commands/status.d.ts.map +1 -0
  69. package/dist/commands/status.js +49 -0
  70. package/dist/commands/status.js.map +1 -0
  71. package/dist/commands/style.d.ts +9 -0
  72. package/dist/commands/style.d.ts.map +1 -0
  73. package/dist/commands/style.js +120 -0
  74. package/dist/commands/style.js.map +1 -0
  75. package/dist/commands/update-state.d.ts +6 -0
  76. package/dist/commands/update-state.d.ts.map +1 -0
  77. package/dist/commands/update-state.js +92 -0
  78. package/dist/commands/update-state.js.map +1 -0
  79. package/dist/commands/use.d.ts +5 -0
  80. package/dist/commands/use.d.ts.map +1 -0
  81. package/dist/commands/use.js +33 -0
  82. package/dist/commands/use.js.map +1 -0
  83. package/dist/commands/where.d.ts +2 -0
  84. package/dist/commands/where.d.ts.map +1 -0
  85. package/dist/commands/where.js +13 -0
  86. package/dist/commands/where.js.map +1 -0
  87. package/dist/commands/workflow.d.ts +6 -0
  88. package/dist/commands/workflow.d.ts.map +1 -0
  89. package/dist/commands/workflow.js +155 -0
  90. package/dist/commands/workflow.js.map +1 -0
  91. package/dist/commands/write.d.ts +7 -0
  92. package/dist/commands/write.d.ts.map +1 -0
  93. package/dist/commands/write.js +33 -0
  94. package/dist/commands/write.js.map +1 -0
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +123 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/utils/api-client.d.ts +61 -0
  100. package/dist/utils/api-client.d.ts.map +1 -0
  101. package/dist/utils/api-client.js +390 -0
  102. package/dist/utils/api-client.js.map +1 -0
  103. package/dist/utils/api-client.types.d.ts +42 -0
  104. package/dist/utils/api-client.types.d.ts.map +1 -0
  105. package/dist/utils/api-client.types.js +5 -0
  106. package/dist/utils/api-client.types.js.map +1 -0
  107. package/dist/utils/archive-manager.d.ts +72 -0
  108. package/dist/utils/archive-manager.d.ts.map +1 -0
  109. package/dist/utils/archive-manager.js +449 -0
  110. package/dist/utils/archive-manager.js.map +1 -0
  111. package/dist/utils/backup-manager.d.ts +65 -0
  112. package/dist/utils/backup-manager.d.ts.map +1 -0
  113. package/dist/utils/backup-manager.js +266 -0
  114. package/dist/utils/backup-manager.js.map +1 -0
  115. package/dist/utils/chapter-context.d.ts +77 -0
  116. package/dist/utils/chapter-context.d.ts.map +1 -0
  117. package/dist/utils/chapter-context.js +280 -0
  118. package/dist/utils/chapter-context.js.map +1 -0
  119. package/dist/utils/entity-linker.d.ts +74 -0
  120. package/dist/utils/entity-linker.d.ts.map +1 -0
  121. package/dist/utils/entity-linker.js +208 -0
  122. package/dist/utils/entity-linker.js.map +1 -0
  123. package/dist/utils/index.d.ts +19 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +22 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/observability.d.ts +145 -0
  128. package/dist/utils/observability.d.ts.map +1 -0
  129. package/dist/utils/observability.js +298 -0
  130. package/dist/utils/observability.js.map +1 -0
  131. package/dist/utils/output.d.ts +45 -0
  132. package/dist/utils/output.d.ts.map +1 -0
  133. package/dist/utils/output.js +60 -0
  134. package/dist/utils/output.js.map +1 -0
  135. package/dist/utils/path-compat.d.ts +63 -0
  136. package/dist/utils/path-compat.d.ts.map +1 -0
  137. package/dist/utils/path-compat.js +128 -0
  138. package/dist/utils/path-compat.js.map +1 -0
  139. package/dist/utils/project-locator.d.ts +47 -0
  140. package/dist/utils/project-locator.d.ts.map +1 -0
  141. package/dist/utils/project-locator.js +372 -0
  142. package/dist/utils/project-locator.js.map +1 -0
  143. package/dist/utils/runtime-compat.d.ts +39 -0
  144. package/dist/utils/runtime-compat.d.ts.map +1 -0
  145. package/dist/utils/runtime-compat.js +113 -0
  146. package/dist/utils/runtime-compat.js.map +1 -0
  147. package/dist/utils/security.d.ts +74 -0
  148. package/dist/utils/security.d.ts.map +1 -0
  149. package/dist/utils/security.js +291 -0
  150. package/dist/utils/security.js.map +1 -0
  151. package/dist/utils/status-reporter.d.ts +66 -0
  152. package/dist/utils/status-reporter.d.ts.map +1 -0
  153. package/dist/utils/status-reporter.js +309 -0
  154. package/dist/utils/status-reporter.js.map +1 -0
  155. package/dist/utils/style-sampler.d.ts +69 -0
  156. package/dist/utils/style-sampler.d.ts.map +1 -0
  157. package/dist/utils/style-sampler.js +206 -0
  158. package/dist/utils/style-sampler.js.map +1 -0
  159. package/dist/utils/workflow-manager.d.ts +104 -0
  160. package/dist/utils/workflow-manager.d.ts.map +1 -0
  161. package/dist/utils/workflow-manager.js +462 -0
  162. package/dist/utils/workflow-manager.js.map +1 -0
  163. package/package.json +66 -0
package/dist/index.js ADDED
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env node
2
+ import { Command, InvalidArgumentError } from 'commander';
3
+ import ora from 'ora';
4
+ import { initCommand } from './commands/init.js';
5
+ import { planCommand } from './commands/plan.js';
6
+ import { writeCommand } from './commands/write.js';
7
+ import { reviewCommand } from './commands/review.js';
8
+ import { queryCommand } from './commands/query.js';
9
+ import { adaptCommand } from './commands/adapt.js';
10
+ import { dashboardCommand } from './commands/dashboard.js';
11
+ import { whereCommand } from './commands/where.js';
12
+ import { preflightCommand } from './commands/preflight.js';
13
+ import { useCommand } from './commands/use.js';
14
+ import { statusCommand } from './commands/status.js';
15
+ import { backupCommand } from './commands/backup.js';
16
+ import { archiveCommand } from './commands/archive.js';
17
+ import { indexCommand } from './commands/index.js';
18
+ import { stateCommand } from './commands/state.js';
19
+ import { ragCommand } from './commands/rag.js';
20
+ import { styleCommand } from './commands/style.js';
21
+ import { entityCommand } from './commands/entity.js';
22
+ import { contextCommand } from './commands/context.js';
23
+ import { migrateCommand } from './commands/migrate.js';
24
+ import { workflowCommand } from './commands/workflow.js';
25
+ import { updateStateCommand } from './commands/update-state.js';
26
+ import { extractContextCommand } from './commands/extract-context.js';
27
+ const VERSION = '1.0.0';
28
+ const program = new Command();
29
+ function parseIntegerOption(value, optionName) {
30
+ const parsed = Number.parseInt(value, 10);
31
+ if (!Number.isFinite(parsed)) {
32
+ throw new InvalidArgumentError(`${optionName} 必须是整数`);
33
+ }
34
+ return parsed;
35
+ }
36
+ program
37
+ .name('webnovel')
38
+ .description('通用网文创作 Skill 框架')
39
+ .version(VERSION)
40
+ .option('-p, --project-root <path>', '项目根目录或工作区根目录');
41
+ // 注册命令
42
+ program
43
+ .command('init <title>')
44
+ .description('初始化新小说项目')
45
+ .option('-g, --genre <genre>', '题材类型')
46
+ .option('-t, --target-words <number>', '目标字数', (value) => parseIntegerOption(value, 'target-words'))
47
+ .option('-c, --chapters <number>', '目标章数', (value) => parseIntegerOption(value, 'chapters'))
48
+ .action(initCommand);
49
+ program
50
+ .command('plan <chapter>')
51
+ .description('规划章节大纲')
52
+ .option('-d --detailed', '生成详细大纲')
53
+ .action(planCommand);
54
+ program
55
+ .command('write <chapter>')
56
+ .description('写作章节')
57
+ .option('-f, --fast', '快速模式(跳过风格适配)')
58
+ .option('-m, --minimal', '极简模式(仅核心审查)')
59
+ .action(writeCommand);
60
+ program
61
+ .command('review <range>')
62
+ .description('审查章节质量')
63
+ .option('-d, --detailed', '详细审查报告')
64
+ .action(reviewCommand);
65
+ program
66
+ .command('query <keyword>')
67
+ .description('查询项目状态')
68
+ .option('-t, --type <type>', '查询类型 (entity|foreshadowing|debt)')
69
+ .action(queryCommand);
70
+ program
71
+ .command('adapt')
72
+ .description('生成平台适配文件')
73
+ .requiredOption('-p, --platform <platform>', '目标平台 (claude-code|cursor|openai|openclaw)')
74
+ .requiredOption('-o, --output <dir>', '输出目录')
75
+ .action(adaptCommand);
76
+ program
77
+ .command('dashboard')
78
+ .description('启动可视化面板')
79
+ .option('-p, --port <number>', '端口号', (value) => parseIntegerOption(value, 'port'), 3000)
80
+ .action(dashboardCommand);
81
+ program
82
+ .command('resume')
83
+ .description('恢复中断的任务')
84
+ .action(async () => {
85
+ const spinner = ora('恢复任务中...').start();
86
+ // TODO: 实现恢复逻辑
87
+ spinner.succeed('任务已恢复');
88
+ });
89
+ // P0 迁移:基础命令
90
+ // 注意:这些命令使用全局的 --project-root 选项,不再单独定义
91
+ program
92
+ .command('where')
93
+ .description('打印解析出的 project_root')
94
+ .action(whereCommand);
95
+ program
96
+ .command('preflight')
97
+ .description('校验运行环境与 project_root')
98
+ .option('-f, --format <format>', '输出格式 (text|json)', 'text')
99
+ .action(preflightCommand);
100
+ program
101
+ .command('use <project-root>')
102
+ .description('绑定当前工作区使用的书项目')
103
+ .option('-w, --workspace-root <path>', '工作区根目录')
104
+ .action(useCommand);
105
+ // P2 迁移:工作流命令
106
+ program.addCommand(statusCommand);
107
+ program.addCommand(backupCommand);
108
+ program.addCommand(archiveCommand);
109
+ // P4 迁移:数据管理命令
110
+ program.addCommand(indexCommand);
111
+ program.addCommand(stateCommand);
112
+ program.addCommand(ragCommand);
113
+ program.addCommand(styleCommand);
114
+ program.addCommand(entityCommand);
115
+ program.addCommand(contextCommand);
116
+ program.addCommand(migrateCommand);
117
+ program.addCommand(workflowCommand);
118
+ program.addCommand(updateStateCommand);
119
+ program.addCommand(extractContextCommand);
120
+ // 解析命令
121
+ program.parse();
122
+ export default program;
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * API 客户端 - Embedding 和 Rerank 服务封装
3
+ *
4
+ * 迁移自 Python api_client.py,支持两种 API 类型:
5
+ * 1. openai: OpenAI 兼容接口 (/v1/embeddings, /v1/rerank)
6
+ * 2. modal: Modal 自定义接口
7
+ */
8
+ import type { ApiType, EmbeddingConfig, RerankConfig, ApiStats, RerankResult, UnifiedApiConfig } from './api-client.types.js';
9
+ export type { ApiType, EmbeddingConfig, RerankConfig, ApiStats, RerankResult, UnifiedApiConfig };
10
+ export declare class EmbeddingClient {
11
+ private config;
12
+ private stats;
13
+ private warmedUp;
14
+ private lastErrorStatus?;
15
+ private lastErrorMessage;
16
+ constructor(config: EmbeddingConfig);
17
+ private buildHeaders;
18
+ private buildUrl;
19
+ private buildPayload;
20
+ private parseResponse;
21
+ embed(texts: string[]): Promise<number[][] | null>;
22
+ embedBatch(texts: string[], skipFailures?: boolean): Promise<(number[] | null)[]>;
23
+ warmup(): Promise<void>;
24
+ getStats(): ApiStats;
25
+ getLastError(): {
26
+ status?: number;
27
+ message: string;
28
+ };
29
+ }
30
+ export declare class RerankClient {
31
+ private config;
32
+ private stats;
33
+ private warmedUp;
34
+ constructor(config: RerankConfig);
35
+ private buildHeaders;
36
+ private buildUrl;
37
+ private buildPayload;
38
+ rerank(query: string, documents: string[], topN?: number): Promise<RerankResult[] | null>;
39
+ warmup(): Promise<void>;
40
+ getStats(): ApiStats;
41
+ }
42
+ export declare class UnifiedApiClient {
43
+ private embedClient?;
44
+ private rerankClient?;
45
+ private warmedUp;
46
+ constructor(config: UnifiedApiConfig);
47
+ embed(texts: string[]): Promise<number[][] | null>;
48
+ embedBatch(texts: string[], skipFailures?: boolean): Promise<(number[] | null)[]>;
49
+ rerank(query: string, documents: string[], topN?: number): Promise<RerankResult[] | null>;
50
+ warmup(): Promise<void>;
51
+ private warmupEmbed;
52
+ private warmupRerank;
53
+ getStats(): {
54
+ embed?: ApiStats;
55
+ rerank?: ApiStats;
56
+ };
57
+ printStats(): void;
58
+ }
59
+ export declare function getApiClient(config?: UnifiedApiConfig): UnifiedApiClient;
60
+ export declare function resetApiClient(): void;
61
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9H,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAcjG,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,KAAK,CAAwD;IACrE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,gBAAgB,CAAM;gBAElB,MAAM,EAAE,eAAe;IAenC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAYf,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;IAyElD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAyB9E,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,QAAQ,IAAI,QAAQ;IAIpB,YAAY,IAAI;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAGrD;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAAwD;IACrE,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,YAAY;IAchC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,YAAY;IAYd,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC;IAiEzF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,QAAQ,IAAI,QAAQ;CAGrB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAmC;gBAEvC,MAAM,EAAE,gBAAgB;IAW9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;IAOlD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAS9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC;IASzF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAiCf,WAAW;YAOX,YAAY;IAS1B,QAAQ,IAAI;QAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,CAAA;KAAE;IAOnD,UAAU,IAAI,IAAI;CAcnB;AAQD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAKxE;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,390 @@
1
+ // ============================================================================
2
+ // Utility Functions
3
+ // ============================================================================
4
+ function sleep(ms) {
5
+ return new Promise(resolve => setTimeout(resolve, ms));
6
+ }
7
+ // ============================================================================
8
+ // Embedding Client
9
+ // ============================================================================
10
+ export class EmbeddingClient {
11
+ config;
12
+ stats = { totalCalls: 0, totalTime: 0, errors: 0 };
13
+ warmedUp = false;
14
+ lastErrorStatus;
15
+ lastErrorMessage = '';
16
+ constructor(config) {
17
+ this.config = {
18
+ apiType: config.apiType ?? 'openai',
19
+ baseUrl: config.baseUrl,
20
+ model: config.model,
21
+ apiKey: config.apiKey ?? '',
22
+ timeout: config.timeout ?? 30000,
23
+ coldStartTimeout: config.coldStartTimeout ?? 60000,
24
+ batchSize: config.batchSize ?? 32,
25
+ concurrency: config.concurrency ?? 10,
26
+ maxRetries: config.maxRetries ?? 3,
27
+ retryDelay: config.retryDelay ?? 1000,
28
+ };
29
+ }
30
+ buildHeaders() {
31
+ const headers = {
32
+ 'Content-Type': 'application/json',
33
+ };
34
+ if (this.config.apiKey) {
35
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
36
+ }
37
+ return headers;
38
+ }
39
+ buildUrl() {
40
+ let baseUrl = this.config.baseUrl.replace(/\/+$/, '');
41
+ if (this.config.apiType === 'openai') {
42
+ if (!baseUrl.endsWith('/embeddings')) {
43
+ if (baseUrl.endsWith('/v1')) {
44
+ return `${baseUrl}/embeddings`;
45
+ }
46
+ return `${baseUrl}/v1/embeddings`;
47
+ }
48
+ }
49
+ return baseUrl;
50
+ }
51
+ buildPayload(texts) {
52
+ if (this.config.apiType === 'openai') {
53
+ return {
54
+ input: texts,
55
+ model: this.config.model,
56
+ encoding_format: 'float',
57
+ };
58
+ }
59
+ return {
60
+ input: texts,
61
+ model: this.config.model,
62
+ };
63
+ }
64
+ parseResponse(data) {
65
+ if (!data.data)
66
+ return null;
67
+ if (this.config.apiType === 'openai') {
68
+ // 按 index 排序确保顺序正确
69
+ const sorted = [...data.data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
70
+ return sorted.map(item => item.embedding).filter((e) => e !== undefined);
71
+ }
72
+ return data.data.map(item => item.embedding).filter((e) => e !== undefined);
73
+ }
74
+ async embed(texts) {
75
+ if (texts.length === 0)
76
+ return [];
77
+ const timeout = this.warmedUp ? this.config.timeout : this.config.coldStartTimeout;
78
+ const startTime = Date.now();
79
+ for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
80
+ try {
81
+ const url = this.buildUrl();
82
+ const headers = this.buildHeaders();
83
+ const payload = JSON.stringify(this.buildPayload(texts));
84
+ const controller = new AbortController();
85
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
86
+ const response = await fetch(url, {
87
+ method: 'POST',
88
+ headers,
89
+ body: payload,
90
+ signal: controller.signal,
91
+ });
92
+ clearTimeout(timeoutId);
93
+ if (response.status === 200) {
94
+ const data = await response.json();
95
+ const embeddings = this.parseResponse(data);
96
+ if (embeddings && embeddings.length > 0) {
97
+ this.stats.totalCalls++;
98
+ this.stats.totalTime += (Date.now() - startTime) / 1000;
99
+ this.warmedUp = true;
100
+ this.lastErrorStatus = undefined;
101
+ this.lastErrorMessage = '';
102
+ return embeddings;
103
+ }
104
+ }
105
+ // 可重试的状态码
106
+ if ([429, 500, 502, 503, 504].includes(response.status) && attempt < this.config.maxRetries - 1) {
107
+ const delay = this.config.retryDelay * Math.pow(2, attempt);
108
+ console.warn(`[WARN] Embed ${response.status}, retrying in ${delay}ms (${attempt + 1}/${this.config.maxRetries})`);
109
+ await sleep(delay);
110
+ continue;
111
+ }
112
+ this.stats.errors++;
113
+ const errorBody = await response.text();
114
+ this.lastErrorStatus = response.status;
115
+ this.lastErrorMessage = errorBody.slice(0, 200);
116
+ console.error(`[ERR] Embed ${response.status}: ${errorBody.slice(0, 200)}`);
117
+ return null;
118
+ }
119
+ catch (error) {
120
+ if (attempt < this.config.maxRetries - 1) {
121
+ const delay = this.config.retryDelay * Math.pow(2, attempt);
122
+ const isTimeout = error instanceof Error && error.name === 'AbortError';
123
+ console.warn(`[WARN] Embed ${isTimeout ? 'timeout' : 'error'}: ${error}, retrying in ${delay}ms (${attempt + 1}/${this.config.maxRetries})`);
124
+ await sleep(delay);
125
+ continue;
126
+ }
127
+ this.stats.errors++;
128
+ this.lastErrorStatus = undefined;
129
+ this.lastErrorMessage = String(error);
130
+ console.error(`[ERR] Embed: ${error}`);
131
+ return null;
132
+ }
133
+ }
134
+ return null;
135
+ }
136
+ async embedBatch(texts, skipFailures = true) {
137
+ if (texts.length === 0)
138
+ return [];
139
+ const results = [];
140
+ const batchSize = this.config.batchSize;
141
+ for (let i = 0; i < texts.length; i += batchSize) {
142
+ const batch = texts.slice(i, i + batchSize);
143
+ const embeddings = await this.embed(batch);
144
+ if (embeddings && embeddings.length === batch.length) {
145
+ results.push(...embeddings);
146
+ }
147
+ else {
148
+ if (!skipFailures) {
149
+ console.warn(`[WARN] Embed batch ${Math.floor(i / batchSize)} failed, aborting all`);
150
+ return [];
151
+ }
152
+ console.warn(`[WARN] Embed batch ${Math.floor(i / batchSize)} failed, marking ${batch.length} items as null`);
153
+ results.push(...new Array(batch.length).fill(null));
154
+ }
155
+ }
156
+ return results.slice(0, texts.length);
157
+ }
158
+ async warmup() {
159
+ await this.embed(['test']);
160
+ this.warmedUp = true;
161
+ }
162
+ getStats() {
163
+ return { ...this.stats };
164
+ }
165
+ getLastError() {
166
+ return { status: this.lastErrorStatus, message: this.lastErrorMessage };
167
+ }
168
+ }
169
+ // ============================================================================
170
+ // Rerank Client
171
+ // ============================================================================
172
+ export class RerankClient {
173
+ config;
174
+ stats = { totalCalls: 0, totalTime: 0, errors: 0 };
175
+ warmedUp = false;
176
+ constructor(config) {
177
+ this.config = {
178
+ apiType: config.apiType ?? 'openai',
179
+ baseUrl: config.baseUrl,
180
+ model: config.model,
181
+ apiKey: config.apiKey ?? '',
182
+ timeout: config.timeout ?? 30000,
183
+ coldStartTimeout: config.coldStartTimeout ?? 60000,
184
+ concurrency: config.concurrency ?? 10,
185
+ maxRetries: config.maxRetries ?? 3,
186
+ retryDelay: config.retryDelay ?? 1000,
187
+ };
188
+ }
189
+ buildHeaders() {
190
+ const headers = {
191
+ 'Content-Type': 'application/json',
192
+ };
193
+ if (this.config.apiKey) {
194
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
195
+ }
196
+ return headers;
197
+ }
198
+ buildUrl() {
199
+ let baseUrl = this.config.baseUrl.replace(/\/+$/, '');
200
+ if (this.config.apiType === 'openai') {
201
+ if (!baseUrl.endsWith('/rerank')) {
202
+ if (baseUrl.endsWith('/v1')) {
203
+ return `${baseUrl}/rerank`;
204
+ }
205
+ return `${baseUrl}/v1/rerank`;
206
+ }
207
+ }
208
+ return baseUrl;
209
+ }
210
+ buildPayload(query, documents, topN) {
211
+ const payload = {
212
+ query,
213
+ documents,
214
+ model: this.config.model,
215
+ };
216
+ if (topN !== undefined) {
217
+ payload.top_n = topN;
218
+ }
219
+ return payload;
220
+ }
221
+ async rerank(query, documents, topN) {
222
+ if (documents.length === 0)
223
+ return [];
224
+ const timeout = this.warmedUp ? this.config.timeout : this.config.coldStartTimeout;
225
+ const startTime = Date.now();
226
+ for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
227
+ try {
228
+ const url = this.buildUrl();
229
+ const headers = this.buildHeaders();
230
+ const payload = JSON.stringify(this.buildPayload(query, documents, topN));
231
+ const controller = new AbortController();
232
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
233
+ const response = await fetch(url, {
234
+ method: 'POST',
235
+ headers,
236
+ body: payload,
237
+ signal: controller.signal,
238
+ });
239
+ clearTimeout(timeoutId);
240
+ if (response.status === 200) {
241
+ const data = await response.json();
242
+ this.stats.totalCalls++;
243
+ this.stats.totalTime += (Date.now() - startTime) / 1000;
244
+ this.warmedUp = true;
245
+ return data.results ?? [];
246
+ }
247
+ // 可重试的状态码
248
+ if ([429, 500, 502, 503, 504].includes(response.status) && attempt < this.config.maxRetries - 1) {
249
+ const delay = this.config.retryDelay * Math.pow(2, attempt);
250
+ console.warn(`[WARN] Rerank ${response.status}, retrying in ${delay}ms (${attempt + 1}/${this.config.maxRetries})`);
251
+ await sleep(delay);
252
+ continue;
253
+ }
254
+ this.stats.errors++;
255
+ const errorBody = await response.text();
256
+ console.error(`[ERR] Rerank ${response.status}: ${errorBody.slice(0, 200)}`);
257
+ return null;
258
+ }
259
+ catch (error) {
260
+ if (attempt < this.config.maxRetries - 1) {
261
+ const delay = this.config.retryDelay * Math.pow(2, attempt);
262
+ const isTimeout = error instanceof Error && error.name === 'AbortError';
263
+ console.warn(`[WARN] Rerank ${isTimeout ? 'timeout' : 'error'}: ${error}, retrying in ${delay}ms (${attempt + 1}/${this.config.maxRetries})`);
264
+ await sleep(delay);
265
+ continue;
266
+ }
267
+ this.stats.errors++;
268
+ console.error(`[ERR] Rerank: ${error}`);
269
+ return null;
270
+ }
271
+ }
272
+ return null;
273
+ }
274
+ async warmup() {
275
+ await this.rerank('test', ['doc1', 'doc2']);
276
+ this.warmedUp = true;
277
+ }
278
+ getStats() {
279
+ return { ...this.stats };
280
+ }
281
+ }
282
+ // ============================================================================
283
+ // Unified API Client
284
+ // ============================================================================
285
+ export class UnifiedApiClient {
286
+ embedClient;
287
+ rerankClient;
288
+ warmedUp = { embed: false, rerank: false };
289
+ constructor(config) {
290
+ if (config.embed) {
291
+ this.embedClient = new EmbeddingClient(config.embed);
292
+ }
293
+ if (config.rerank) {
294
+ this.rerankClient = new RerankClient(config.rerank);
295
+ }
296
+ }
297
+ // ==================== Embedding ====================
298
+ async embed(texts) {
299
+ if (!this.embedClient) {
300
+ throw new Error('Embedding client not configured');
301
+ }
302
+ return this.embedClient.embed(texts);
303
+ }
304
+ async embedBatch(texts, skipFailures = true) {
305
+ if (!this.embedClient) {
306
+ throw new Error('Embedding client not configured');
307
+ }
308
+ return this.embedClient.embedBatch(texts, skipFailures);
309
+ }
310
+ // ==================== Rerank ====================
311
+ async rerank(query, documents, topN) {
312
+ if (!this.rerankClient) {
313
+ throw new Error('Rerank client not configured');
314
+ }
315
+ return this.rerankClient.rerank(query, documents, topN);
316
+ }
317
+ // ==================== Warmup ====================
318
+ async warmup() {
319
+ console.log('[WARMUP] Warming up Embed + Rerank...');
320
+ const startTime = Date.now();
321
+ const tasks = [];
322
+ if (this.embedClient) {
323
+ tasks.push(this.warmupEmbed());
324
+ }
325
+ if (this.rerankClient) {
326
+ tasks.push(this.warmupRerank());
327
+ }
328
+ const results = await Promise.allSettled(tasks);
329
+ const names = [
330
+ this.embedClient ? 'Embed' : null,
331
+ this.rerankClient ? 'Rerank' : null,
332
+ ].filter((n) => n !== null);
333
+ for (let i = 0; i < results.length; i++) {
334
+ const result = results[i];
335
+ const name = names[i];
336
+ if (result.status === 'rejected') {
337
+ console.warn(` [FAIL] ${name}: ${result.reason}`);
338
+ }
339
+ else {
340
+ console.log(` [OK] ${name} ready`);
341
+ }
342
+ }
343
+ console.log(`[WARMUP] Done in ${(Date.now() - startTime) / 1000}s`);
344
+ }
345
+ async warmupEmbed() {
346
+ if (this.embedClient) {
347
+ await this.embedClient.warmup();
348
+ this.warmedUp.embed = true;
349
+ }
350
+ }
351
+ async warmupRerank() {
352
+ if (this.rerankClient) {
353
+ await this.rerankClient.warmup();
354
+ this.warmedUp.rerank = true;
355
+ }
356
+ }
357
+ // ==================== Stats ====================
358
+ getStats() {
359
+ return {
360
+ embed: this.embedClient?.getStats(),
361
+ rerank: this.rerankClient?.getStats(),
362
+ };
363
+ }
364
+ printStats() {
365
+ console.log('\n[API STATS]');
366
+ const stats = this.getStats();
367
+ if (stats.embed && stats.embed.totalCalls > 0) {
368
+ const avgTime = stats.embed.totalTime / stats.embed.totalCalls;
369
+ console.log(` EMBED: ${stats.embed.totalCalls} calls, ${stats.embed.totalTime.toFixed(1)}s total, ${avgTime.toFixed(2)}s avg, ${stats.embed.errors} errors`);
370
+ }
371
+ if (stats.rerank && stats.rerank.totalCalls > 0) {
372
+ const avgTime = stats.rerank.totalTime / stats.rerank.totalCalls;
373
+ console.log(` RERANK: ${stats.rerank.totalCalls} calls, ${stats.rerank.totalTime.toFixed(1)}s total, ${avgTime.toFixed(2)}s avg, ${stats.rerank.errors} errors`);
374
+ }
375
+ }
376
+ }
377
+ // ============================================================================
378
+ // Factory Functions
379
+ // ============================================================================
380
+ let globalClient = null;
381
+ export function getApiClient(config) {
382
+ if (!globalClient || config) {
383
+ globalClient = new UnifiedApiClient(config ?? {});
384
+ }
385
+ return globalClient;
386
+ }
387
+ export function resetApiClient() {
388
+ globalClient = null;
389
+ }
390
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * API 客户端类型定义
3
+ */
4
+ export type ApiType = 'openai' | 'modal';
5
+ export interface EmbeddingConfig {
6
+ apiType?: ApiType;
7
+ baseUrl: string;
8
+ model: string;
9
+ apiKey?: string;
10
+ timeout?: number;
11
+ coldStartTimeout?: number;
12
+ batchSize?: number;
13
+ concurrency?: number;
14
+ maxRetries?: number;
15
+ retryDelay?: number;
16
+ }
17
+ export interface RerankConfig {
18
+ apiType?: ApiType;
19
+ baseUrl: string;
20
+ model: string;
21
+ apiKey?: string;
22
+ timeout?: number;
23
+ coldStartTimeout?: number;
24
+ concurrency?: number;
25
+ maxRetries?: number;
26
+ retryDelay?: number;
27
+ }
28
+ export interface ApiStats {
29
+ totalCalls: number;
30
+ totalTime: number;
31
+ errors: number;
32
+ }
33
+ export interface RerankResult {
34
+ index: number;
35
+ relevance_score: number;
36
+ document?: string;
37
+ }
38
+ export interface UnifiedApiConfig {
39
+ embed?: EmbeddingConfig;
40
+ rerank?: RerankConfig;
41
+ }
42
+ //# sourceMappingURL=api-client.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.types.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB"}