workplace-pua-cli 0.4.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 (112) hide show
  1. package/.env.example +4 -0
  2. package/.eslintrc.json +21 -0
  3. package/.prettierrc.json +9 -0
  4. package/CHANGELOG.md +107 -0
  5. package/README.md +240 -0
  6. package/bin/pua +2 -0
  7. package/dist/commands/chat.d.ts +15 -0
  8. package/dist/commands/chat.d.ts.map +1 -0
  9. package/dist/commands/chat.js +262 -0
  10. package/dist/commands/chat.js.map +1 -0
  11. package/dist/commands/config.d.ts +15 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +247 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/prompt.d.ts +14 -0
  16. package/dist/commands/prompt.d.ts.map +1 -0
  17. package/dist/commands/prompt.js +126 -0
  18. package/dist/commands/prompt.js.map +1 -0
  19. package/dist/config/providers.d.ts +37 -0
  20. package/dist/config/providers.d.ts.map +1 -0
  21. package/dist/config/providers.js +96 -0
  22. package/dist/config/providers.js.map +1 -0
  23. package/dist/config/session-storage.d.ts +29 -0
  24. package/dist/config/session-storage.d.ts.map +1 -0
  25. package/dist/config/session-storage.js +67 -0
  26. package/dist/config/session-storage.js.map +1 -0
  27. package/dist/config/settings.d.ts +55 -0
  28. package/dist/config/settings.d.ts.map +1 -0
  29. package/dist/config/settings.js +163 -0
  30. package/dist/config/settings.js.map +1 -0
  31. package/dist/config/storage.d.ts +69 -0
  32. package/dist/config/storage.d.ts.map +1 -0
  33. package/dist/config/storage.js +126 -0
  34. package/dist/config/storage.js.map +1 -0
  35. package/dist/history/session.d.ts +52 -0
  36. package/dist/history/session.d.ts.map +1 -0
  37. package/dist/history/session.js +122 -0
  38. package/dist/history/session.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +157 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/base.d.ts +38 -0
  44. package/dist/llm/base.d.ts.map +1 -0
  45. package/dist/llm/base.js +22 -0
  46. package/dist/llm/base.js.map +1 -0
  47. package/dist/llm/factory.d.ts +12 -0
  48. package/dist/llm/factory.d.ts.map +1 -0
  49. package/dist/llm/factory.js +26 -0
  50. package/dist/llm/factory.js.map +1 -0
  51. package/dist/llm/openai.d.ts +10 -0
  52. package/dist/llm/openai.d.ts.map +1 -0
  53. package/dist/llm/openai.js +97 -0
  54. package/dist/llm/openai.js.map +1 -0
  55. package/dist/llm/zhipu.d.ts +10 -0
  56. package/dist/llm/zhipu.d.ts.map +1 -0
  57. package/dist/llm/zhipu.js +91 -0
  58. package/dist/llm/zhipu.js.map +1 -0
  59. package/dist/prompts/boss.d.ts +6 -0
  60. package/dist/prompts/boss.d.ts.map +1 -0
  61. package/dist/prompts/boss.js +41 -0
  62. package/dist/prompts/boss.js.map +1 -0
  63. package/dist/prompts/employee.d.ts +6 -0
  64. package/dist/prompts/employee.d.ts.map +1 -0
  65. package/dist/prompts/employee.js +41 -0
  66. package/dist/prompts/employee.js.map +1 -0
  67. package/dist/prompts/index.d.ts +4 -0
  68. package/dist/prompts/index.d.ts.map +1 -0
  69. package/dist/prompts/index.js +9 -0
  70. package/dist/prompts/index.js.map +1 -0
  71. package/dist/utils/formatter.d.ts +25 -0
  72. package/dist/utils/formatter.d.ts.map +1 -0
  73. package/dist/utils/formatter.js +83 -0
  74. package/dist/utils/formatter.js.map +1 -0
  75. package/dist/utils/logger.d.ts +10 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +31 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/stream.d.ts +36 -0
  80. package/dist/utils/stream.d.ts.map +1 -0
  81. package/dist/utils/stream.js +74 -0
  82. package/dist/utils/stream.js.map +1 -0
  83. package/docs/OPTIMIZATION.md +772 -0
  84. package/docs/TECHNICAL_PRINCIPLES.md +663 -0
  85. package/package.json +52 -0
  86. package/sample/1.png +0 -0
  87. package/sample/2.png +0 -0
  88. package/screenshots/chat-dialogue.png +0 -0
  89. package/screenshots/chat-mode.png +0 -0
  90. package/src/__tests__/config/settings.test.ts +48 -0
  91. package/src/__tests__/prompts/boss.test.ts +35 -0
  92. package/src/commands/chat.ts +328 -0
  93. package/src/commands/config.ts +283 -0
  94. package/src/commands/prompt.ts +154 -0
  95. package/src/config/providers.ts +109 -0
  96. package/src/config/session-storage.ts +94 -0
  97. package/src/config/settings.ts +194 -0
  98. package/src/config/storage.ts +150 -0
  99. package/src/history/session.ts +141 -0
  100. package/src/index.ts +164 -0
  101. package/src/llm/base.ts +55 -0
  102. package/src/llm/factory.ts +24 -0
  103. package/src/llm/openai.ts +113 -0
  104. package/src/llm/zhipu.ts +101 -0
  105. package/src/prompts/boss.ts +43 -0
  106. package/src/prompts/employee.ts +43 -0
  107. package/src/prompts/index.ts +3 -0
  108. package/src/utils/formatter.ts +104 -0
  109. package/src/utils/logger.ts +31 -0
  110. package/src/utils/stream.ts +76 -0
  111. package/tsconfig.json +20 -0
  112. package/vitest.config.ts +18 -0
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionManager = exports.SessionManager = void 0;
4
+ class SessionManager {
5
+ sessions = new Map();
6
+ currentSessionId = null;
7
+ /**
8
+ * Create a new session
9
+ */
10
+ createSession(sessionId) {
11
+ this.sessions.set(sessionId, {
12
+ messages: [],
13
+ createdAt: new Date(),
14
+ lastUpdatedAt: new Date(),
15
+ });
16
+ this.currentSessionId = sessionId;
17
+ }
18
+ /**
19
+ * Get current session
20
+ */
21
+ getCurrentSession() {
22
+ if (!this.currentSessionId)
23
+ return null;
24
+ return this.sessions.get(this.currentSessionId) || null;
25
+ }
26
+ /**
27
+ * Add a message to current session
28
+ */
29
+ addMessage(message) {
30
+ const session = this.getCurrentSession();
31
+ if (session) {
32
+ session.messages.push(message);
33
+ session.lastUpdatedAt = new Date();
34
+ }
35
+ }
36
+ /**
37
+ * Get messages from current session
38
+ */
39
+ getMessages() {
40
+ const session = this.getCurrentSession();
41
+ return session ? session.messages : [];
42
+ }
43
+ /**
44
+ * Clear current session messages
45
+ */
46
+ clearCurrentSession() {
47
+ const session = this.getCurrentSession();
48
+ if (session) {
49
+ session.messages = [];
50
+ session.lastUpdatedAt = new Date();
51
+ }
52
+ }
53
+ /**
54
+ * Delete a session
55
+ */
56
+ deleteSession(sessionId) {
57
+ this.sessions.delete(sessionId);
58
+ if (this.currentSessionId === sessionId) {
59
+ this.currentSessionId = null;
60
+ }
61
+ }
62
+ /**
63
+ * Get session info as string
64
+ */
65
+ getSessionInfo() {
66
+ const session = this.getCurrentSession();
67
+ if (!session) {
68
+ return '当前没有活动会话';
69
+ }
70
+ const userMessages = session.messages.filter(m => m.role === 'user').length;
71
+ const assistantMessages = session.messages.filter(m => m.role === 'assistant').length;
72
+ const systemMessages = session.messages.filter(m => m.role === 'system').length;
73
+ return `会话信息:
74
+ 创建时间: ${session.createdAt.toLocaleString('zh-CN')}
75
+ 最后更新: ${session.lastUpdatedAt.toLocaleString('zh-CN')}
76
+ 消息统计:
77
+ - 用户消息: ${userMessages} 条
78
+ - 助手回复: ${assistantMessages} 条
79
+ - 系统消息: ${systemMessages} 条
80
+ - 总计: ${session.messages.length} 条`;
81
+ }
82
+ /**
83
+ * Get formatted history for display
84
+ */
85
+ getFormattedHistory() {
86
+ const session = this.getCurrentSession();
87
+ if (!session || session.messages.length === 0) {
88
+ return '会话历史为空';
89
+ }
90
+ const lines = ['\n━━━━━━━━━━━━━━━━━━ 会话历史 ━━━━━━━━━━━━━━━━━━'];
91
+ for (const msg of session.messages) {
92
+ if (msg.role === 'system')
93
+ continue; // Skip system messages
94
+ const label = msg.role === 'user' ? '你' : 'AI';
95
+ const prefix = msg.role === 'user' ? '>' : '<';
96
+ lines.push(`\n${prefix} ${label}: ${msg.content}`);
97
+ }
98
+ lines.push('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
99
+ return lines.join('');
100
+ }
101
+ /**
102
+ * Set current session
103
+ */
104
+ setCurrentSession(sessionId) {
105
+ if (this.sessions.has(sessionId)) {
106
+ this.currentSessionId = sessionId;
107
+ }
108
+ else {
109
+ throw new Error(`Session ${sessionId} not found`);
110
+ }
111
+ }
112
+ /**
113
+ * Check if current session has messages
114
+ */
115
+ hasMessages() {
116
+ const session = this.getCurrentSession();
117
+ return session ? session.messages.length > 0 : false;
118
+ }
119
+ }
120
+ exports.SessionManager = SessionManager;
121
+ // Global session manager instance
122
+ exports.sessionManager = new SessionManager();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/history/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const chat_1 = require("./commands/chat");
10
+ const prompt_1 = require("./commands/prompt");
11
+ const config_1 = require("./commands/config");
12
+ const settings_1 = require("./config/settings");
13
+ const logger_1 = require("./utils/logger");
14
+ const program = new commander_1.Command();
15
+ // CLI metadata
16
+ program
17
+ .name('pua')
18
+ .description('PUA CLI - 一个趣味性 AI CLI 工具,具有两种角色模式')
19
+ .version('0.4.0');
20
+ /**
21
+ * Wrap command action with onboarding check
22
+ */
23
+ async function withOnboardingCheck(fn) {
24
+ // Check if onboarding is needed
25
+ if ((0, settings_1.needsOnboarding)()) {
26
+ console.log();
27
+ console.log(chalk_1.default.cyan.bold('═══════════════════════════════════════════════════════════'));
28
+ console.log(chalk_1.default.cyan.bold(' 欢迎使用 PUA CLI!'));
29
+ console.log(chalk_1.default.cyan.bold('═══════════════════════════════════════════════════════════'));
30
+ console.log();
31
+ console.log(chalk_1.default.gray('在开始之前,让我们先配置一些基本信息。'));
32
+ console.log();
33
+ try {
34
+ await (0, config_1.configWizard)({ autoMode: true });
35
+ }
36
+ catch (error) {
37
+ if (error.message === '配置已取消') {
38
+ console.log();
39
+ logger_1.logger.info('配置已取消,退出程序');
40
+ process.exit(0);
41
+ }
42
+ throw error;
43
+ }
44
+ console.log();
45
+ console.log(chalk_1.default.green('✓ 配置完成!'));
46
+ console.log();
47
+ }
48
+ return fn();
49
+ }
50
+ // Config command
51
+ program
52
+ .command('config')
53
+ .description('配置 PUA CLI(选择 Provider、设置 API Key)')
54
+ .option('--show', '显示当前配置')
55
+ .action(async (options) => {
56
+ try {
57
+ if (options.show) {
58
+ await (0, config_1.showConfig)();
59
+ }
60
+ else {
61
+ await (0, config_1.configWizard)();
62
+ }
63
+ }
64
+ catch (error) {
65
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
66
+ process.exit(1);
67
+ }
68
+ });
69
+ // Chat command - interactive mode
70
+ program
71
+ .command('chat')
72
+ .description('启动交互式聊天模式(支持会话历史)')
73
+ .option('-r, --role <boss|employee>', '角色模式: boss (老板模式) 或 employee (员工模式)')
74
+ .option('-m, --model <model>', '模型名称')
75
+ .option('-s, --severity <mild|medium|extreme>', 'PUA 强度')
76
+ .option('-p, --provider <zhipu|openai>', 'AI 服务提供商')
77
+ .action(async (options) => {
78
+ await withOnboardingCheck(async () => {
79
+ try {
80
+ const config = (0, settings_1.loadConfig)(options);
81
+ const chatOptions = {
82
+ apiKey: config.apiKey,
83
+ provider: config.provider,
84
+ model: config.model,
85
+ role: config.role,
86
+ severity: config.severity,
87
+ };
88
+ await (0, chat_1.chatCommand)(chatOptions);
89
+ }
90
+ catch (error) {
91
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
92
+ process.exit(1);
93
+ }
94
+ });
95
+ });
96
+ // Prompt command - single-shot mode
97
+ program
98
+ .command('prompt')
99
+ .description('单次提示模式(适合 AI 工作流集成)')
100
+ .option('-r, --role <boss|employee>', '角色模式: boss (老板模式) 或 employee (员工模式)')
101
+ .option('-m, --model <model>', '模型名称')
102
+ .option('-s, --severity <mild|medium|extreme>', 'PUA 强度')
103
+ .option('-p, --provider <zhipu|openai>', 'AI 服务提供商')
104
+ .option('-f, --format <text|markdown|json>', '输出格式: text (文本), markdown (Markdown), json (JSON)')
105
+ .argument('[input...]', '输入内容(可选,也支持管道输入)')
106
+ .action(async (inputArgs, options) => {
107
+ await withOnboardingCheck(async () => {
108
+ try {
109
+ const config = (0, settings_1.loadConfig)(options);
110
+ const input = inputArgs.join(' ');
111
+ const promptOptions = {
112
+ apiKey: config.apiKey,
113
+ provider: config.provider,
114
+ model: config.model,
115
+ role: config.role,
116
+ severity: config.severity,
117
+ input,
118
+ format: options.format,
119
+ };
120
+ await (0, prompt_1.promptCommand)(promptOptions);
121
+ }
122
+ catch (error) {
123
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
124
+ process.exit(1);
125
+ }
126
+ });
127
+ });
128
+ // Default command - show help
129
+ program.action(() => {
130
+ console.log();
131
+ console.log(chalk_1.default.cyan.bold('╔═══════════════════════════════════════════════════════════╗'));
132
+ console.log(chalk_1.default.cyan.bold('║') + ' ' + chalk_1.default.white.bold('PUA CLI') + ' - 趣味 AI 职场角色扮演工具' + ' ' + chalk_1.default.cyan.bold('║'));
133
+ console.log(chalk_1.default.cyan.bold('╚═══════════════════════════════════════════════════════════╝'));
134
+ console.log();
135
+ console.log(chalk_1.default.gray('这是一个趣味性的 AI CLI 工具,提供两种角色模式:'));
136
+ console.log();
137
+ console.log(' ' + chalk_1.default.red.bold('老板模式') + ' - 用喜欢 PUA 员工的老板风格回应');
138
+ console.log(' ' + chalk_1.default.yellow.bold('员工模式') + ' - 用被老板 PUA 的员工风格回应');
139
+ console.log();
140
+ console.log(chalk_1.default.gray('─────────────────────────────────────────────────────────────'));
141
+ console.log();
142
+ console.log('使用示例:');
143
+ console.log();
144
+ console.log(' ' + chalk_1.default.white('pua chat') + chalk_1.default.gray(' # 启动交互模式'));
145
+ console.log(' ' + chalk_1.default.white('pua config') + chalk_1.default.gray(' # 配置 API Key'));
146
+ console.log(' ' + chalk_1.default.white('pua prompt --role boss "你好"') + chalk_1.default.gray(' # 单次提示'));
147
+ console.log();
148
+ console.log(chalk_1.default.gray('─────────────────────────────────────────────────────────────'));
149
+ console.log();
150
+ console.log(chalk_1.default.gray('运行 ') + chalk_1.default.white('pua --help') + chalk_1.default.gray(' 查看更多选项'));
151
+ console.log();
152
+ });
153
+ // Parse arguments
154
+ program.parseAsync(process.argv).catch((error) => {
155
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
156
+ process.exit(1);
157
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAe,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,eAAe;AACf,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,EAAK;IAEL,gCAAgC;IAChC,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAe,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,UAAU,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kCAAkC;AAClC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,4BAA4B,EAAE,qCAAqC,CAAC;KAC3E,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACrC,MAAM,CAAC,sCAAsC,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,+BAA+B,EAAE,UAAU,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,mBAAmB,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,WAAW,GAAgB;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;YACF,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,oCAAoC;AACpC,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,4BAA4B,EAAE,qCAAqC,CAAC;KAC3E,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACrC,MAAM,CAAC,sCAAsC,EAAE,QAAQ,CAAC;KACxD,MAAM,CAAC,+BAA+B,EAAE,UAAU,CAAC;KACnD,MAAM,CAAC,mCAAmC,EAAE,mDAAmD,CAAC;KAChG,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IACnC,MAAM,mBAAmB,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,aAAa,GAAkB;gBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK;gBACL,MAAM,EAAE,OAAO,CAAC,MAAa;aAC9B,CAAC;YACF,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,8BAA8B;AAC9B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,mBAAmB,GAAG,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,wBAAwB,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,qBAAqB,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ export interface Message {
2
+ role: 'system' | 'user' | 'assistant';
3
+ content: string;
4
+ }
5
+ export interface StreamChunk {
6
+ content: string;
7
+ done: boolean;
8
+ }
9
+ export interface LLMOptions {
10
+ apiKey: string;
11
+ model: string;
12
+ baseUrl?: string;
13
+ timeout?: number;
14
+ }
15
+ export declare abstract class LLMBase {
16
+ protected apiKey: string;
17
+ protected model: string;
18
+ protected baseUrl: string;
19
+ protected timeout: number;
20
+ constructor(options: LLMOptions);
21
+ /**
22
+ * Send a message and get the response
23
+ */
24
+ abstract chat(messages: Message[]): Promise<string>;
25
+ /**
26
+ * Send a message with streaming response
27
+ */
28
+ abstract chatStream(messages: Message[], onChunk: (chunk: StreamChunk) => void): Promise<void>;
29
+ /**
30
+ * Get available models for this provider
31
+ */
32
+ abstract getAvailableModels(): string[];
33
+ /**
34
+ * Check if a model is available
35
+ */
36
+ isModelAvailable(model: string): boolean;
37
+ }
38
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8BAAsB,OAAO;IAC3B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,UAAU;IAO/B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,UAAU,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GACpC,OAAO,CAAC,IAAI,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAEvC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGzC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLMBase = void 0;
4
+ class LLMBase {
5
+ apiKey;
6
+ model;
7
+ baseUrl;
8
+ timeout;
9
+ constructor(options) {
10
+ this.apiKey = options.apiKey;
11
+ this.model = options.model;
12
+ this.baseUrl = options.baseUrl || '';
13
+ this.timeout = options.timeout || 60000;
14
+ }
15
+ /**
16
+ * Check if a model is available
17
+ */
18
+ isModelAvailable(model) {
19
+ return this.getAvailableModels().includes(model);
20
+ }
21
+ }
22
+ exports.LLMBase = LLMBase;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAgB,OAAO;IACjB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,OAAO,CAAS;IAE1B,YAAY,OAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAC1C,CAAC;IAoBD;;OAEG;IACH,gBAAgB,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { LLMBase, LLMOptions } from './base';
2
+ import { type ProviderType } from '../config/providers';
3
+ /**
4
+ * Create an LLM instance based on provider type
5
+ */
6
+ export declare function createLLM(provider: ProviderType, options: LLMOptions): LLMBase;
7
+ /**
8
+ * Re-export LLM classes
9
+ */
10
+ export { ZhipuLLM } from './zhipu';
11
+ export { OpenAILLM } from './openai';
12
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG7C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAS9E;AAED;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAILLM = exports.ZhipuLLM = void 0;
4
+ exports.createLLM = createLLM;
5
+ const zhipu_1 = require("./zhipu");
6
+ const openai_1 = require("./openai");
7
+ /**
8
+ * Create an LLM instance based on provider type
9
+ */
10
+ function createLLM(provider, options) {
11
+ switch (provider) {
12
+ case 'zhipu':
13
+ return new zhipu_1.ZhipuLLM(options);
14
+ case 'openai':
15
+ return new openai_1.OpenAILLM(options);
16
+ default:
17
+ throw new Error(`Unsupported provider: ${provider}`);
18
+ }
19
+ }
20
+ /**
21
+ * Re-export LLM classes
22
+ */
23
+ var zhipu_2 = require("./zhipu");
24
+ Object.defineProperty(exports, "ZhipuLLM", { enumerable: true, get: function () { return zhipu_2.ZhipuLLM; } });
25
+ var openai_2 = require("./openai");
26
+ Object.defineProperty(exports, "OpenAILLM", { enumerable: true, get: function () { return openai_2.OpenAILLM; } });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAsB,EAAE,OAAmB;IACnE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,KAAK,QAAQ;YACX,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { LLMBase, Message, StreamChunk, LLMOptions } from './base';
2
+ export declare class OpenAILLM extends LLMBase {
3
+ constructor(options: LLMOptions);
4
+ chat(messages: Message[]): Promise<string>;
5
+ chatStream(messages: Message[], onChunk: (chunk: StreamChunk) => void): Promise<void>;
6
+ private fetchAPI;
7
+ getAvailableModels(): string[];
8
+ }
9
+ export declare function createOpenAILLM(options: LLMOptions): OpenAILLM;
10
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEnE,qBAAa,SAAU,SAAQ,OAAO;gBACxB,OAAO,EAAE,UAAU;IAIzB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1C,UAAU,CACd,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GACpC,OAAO,CAAC,IAAI,CAAC;YAwDF,QAAQ;IAqBtB,kBAAkB,IAAI,MAAM,EAAE;CAS/B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAE9D"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAILLM = void 0;
4
+ exports.createOpenAILLM = createOpenAILLM;
5
+ const base_1 = require("./base");
6
+ class OpenAILLM extends base_1.LLMBase {
7
+ constructor(options) {
8
+ super(options);
9
+ }
10
+ async chat(messages) {
11
+ const response = await this.fetchAPI(messages, false);
12
+ if (!response.ok) {
13
+ const error = await response.text();
14
+ throw new Error(`OpenAI API error (${response.status}): ${error}`);
15
+ }
16
+ const data = await response.json();
17
+ return data.choices[0]?.message?.content || '';
18
+ }
19
+ async chatStream(messages, onChunk) {
20
+ const response = await this.fetchAPI(messages, true);
21
+ if (!response.ok) {
22
+ const error = await response.text();
23
+ throw new Error(`OpenAI API error (${response.status}): ${error}`);
24
+ }
25
+ // Read stream
26
+ const reader = response.body?.getReader();
27
+ if (!reader) {
28
+ throw new Error('Failed to get response reader');
29
+ }
30
+ const decoder = new TextDecoder();
31
+ let buffer = '';
32
+ try {
33
+ while (true) {
34
+ const { done, value } = await reader.read();
35
+ if (done)
36
+ break;
37
+ buffer += decoder.decode(value, { stream: true });
38
+ const lines = buffer.split('\n');
39
+ buffer = lines.pop() || '';
40
+ for (const line of lines) {
41
+ if (line.startsWith('data: ')) {
42
+ const data = line.slice(6).trim();
43
+ if (data === '[DONE]') {
44
+ onChunk({ content: '', done: true });
45
+ return;
46
+ }
47
+ try {
48
+ const parsed = JSON.parse(data);
49
+ const content = parsed.choices[0]?.delta?.content || '';
50
+ if (content) {
51
+ onChunk({ content, done: false });
52
+ }
53
+ }
54
+ catch {
55
+ // Skip invalid JSON
56
+ }
57
+ }
58
+ }
59
+ }
60
+ onChunk({ content: '', done: true });
61
+ }
62
+ finally {
63
+ reader.releaseLock();
64
+ }
65
+ }
66
+ async fetchAPI(messages, stream) {
67
+ const baseUrl = this.baseUrl || 'https://api.openai.com/v1';
68
+ const url = `${baseUrl}/chat/completions`;
69
+ const response = await fetch(url, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Content-Type': 'application/json',
73
+ 'Authorization': `Bearer ${this.apiKey}`,
74
+ },
75
+ body: JSON.stringify({
76
+ model: this.model,
77
+ messages: messages,
78
+ stream,
79
+ }),
80
+ signal: AbortSignal.timeout(this.timeout),
81
+ });
82
+ return response;
83
+ }
84
+ getAvailableModels() {
85
+ return [
86
+ 'gpt-4o',
87
+ 'gpt-4o-mini',
88
+ 'gpt-4-turbo',
89
+ 'gpt-4',
90
+ 'gpt-3.5-turbo',
91
+ ];
92
+ }
93
+ }
94
+ exports.OpenAILLM = OpenAILLM;
95
+ function createOpenAILLM(options) {
96
+ return new OpenAILLM(options);
97
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,MAAM,QAAQ,CAAC;AAEnE,MAAM,OAAO,SAAU,SAAQ,OAAO;IACpC,YAAY,OAAmB;QAC7B,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAmB;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEtD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,QAAmB,EACnB,OAAqC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAErD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,cAAc;QACd,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAElC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACtB,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;4BACrC,OAAO;wBACT,CAAC;wBAED,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAQ,CAAC;4BACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;4BAExD,IAAI,OAAO,EAAE,CAAC;gCACZ,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;4BACpC,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,oBAAoB;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,QAAmB,EAAE,MAAe;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,2BAA2B,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,OAAO,mBAAmB,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,MAAM;aACP,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SAC1C,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB;QAChB,OAAO;YACL,QAAQ;YACR,aAAa;YACb,aAAa;YACb,OAAO;YACP,eAAe;SAChB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { LLMBase, Message, StreamChunk, LLMOptions } from './base';
2
+ export declare class ZhipuLLM extends LLMBase {
3
+ private client;
4
+ constructor(options: LLMOptions);
5
+ chat(messages: Message[]): Promise<string>;
6
+ chatStream(messages: Message[], onChunk: (chunk: StreamChunk) => void): Promise<void>;
7
+ getAvailableModels(): string[];
8
+ }
9
+ export declare function createZhipuLLM(options: LLMOptions): ZhipuLLM;
10
+ //# sourceMappingURL=zhipu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu.d.ts","sourceRoot":"","sources":["../../src/llm/zhipu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEnE,qBAAa,QAAS,SAAQ,OAAO;IACnC,OAAO,CAAC,MAAM,CAAU;gBAEZ,OAAO,EAAE,UAAU;IAOzB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1C,UAAU,CACd,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GACpC,OAAO,CAAC,IAAI,CAAC;IA+DhB,kBAAkB,IAAI,MAAM,EAAE;CAG/B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAE5D"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZhipuLLM = void 0;
4
+ exports.createZhipuLLM = createZhipuLLM;
5
+ const zhipuai_sdk_nodejs_v4_1 = require("zhipuai-sdk-nodejs-v4");
6
+ const base_1 = require("./base");
7
+ class ZhipuLLM extends base_1.LLMBase {
8
+ client;
9
+ constructor(options) {
10
+ super(options);
11
+ this.client = new zhipuai_sdk_nodejs_v4_1.ZhipuAI({
12
+ apiKey: options.apiKey,
13
+ });
14
+ }
15
+ async chat(messages) {
16
+ try {
17
+ const response = await this.client.createCompletions({
18
+ model: this.model,
19
+ messages: messages,
20
+ stream: false,
21
+ });
22
+ return response.choices[0]?.message?.content || '';
23
+ }
24
+ catch (error) {
25
+ throw new Error(`GLM API error: ${error instanceof Error ? error.message : String(error)}`);
26
+ }
27
+ }
28
+ async chatStream(messages, onChunk) {
29
+ try {
30
+ const response = await this.client.createCompletions({
31
+ model: this.model,
32
+ messages: messages,
33
+ stream: true,
34
+ });
35
+ // Check if response is a stream (IncomingMessage)
36
+ if (response && typeof response.on === 'function') {
37
+ // Handle streaming response
38
+ let buffer = '';
39
+ response.on('data', (chunk) => {
40
+ const lines = chunk.toString().split('\n').filter((line) => line.trim());
41
+ for (const line of lines) {
42
+ if (line.startsWith('data: ')) {
43
+ const data = line.slice(6).trim();
44
+ if (data === '[DONE]') {
45
+ onChunk({ content: '', done: true });
46
+ return;
47
+ }
48
+ try {
49
+ const parsed = JSON.parse(data);
50
+ const content = parsed.choices?.[0]?.delta?.content || '';
51
+ if (content) {
52
+ buffer += content;
53
+ onChunk({ content, done: false });
54
+ }
55
+ }
56
+ catch (e) {
57
+ // Skip invalid JSON
58
+ }
59
+ }
60
+ }
61
+ });
62
+ response.on('end', () => {
63
+ onChunk({ content: '', done: true });
64
+ });
65
+ response.on('error', (error) => {
66
+ throw new Error(`Stream error: ${error.message}`);
67
+ });
68
+ // Wait for stream to complete
69
+ await new Promise((resolve, reject) => {
70
+ response.on('end', resolve);
71
+ response.on('error', reject);
72
+ });
73
+ }
74
+ else {
75
+ // Fallback to non-streaming response
76
+ const content = response?.choices?.[0]?.message?.content || '';
77
+ onChunk({ content, done: true });
78
+ }
79
+ }
80
+ catch (error) {
81
+ throw new Error(`GLM API streaming error: ${error instanceof Error ? error.message : String(error)}`);
82
+ }
83
+ }
84
+ getAvailableModels() {
85
+ return ['glm-4.7', 'glm-4.7-flash', 'glm-4.5', 'glm-4-flash', 'glm-4'];
86
+ }
87
+ }
88
+ exports.ZhipuLLM = ZhipuLLM;
89
+ function createZhipuLLM(options) {
90
+ return new ZhipuLLM(options);
91
+ }