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.
- package/.env.example +4 -0
- package/.eslintrc.json +21 -0
- package/.prettierrc.json +9 -0
- package/CHANGELOG.md +107 -0
- package/README.md +240 -0
- package/bin/pua +2 -0
- package/dist/commands/chat.d.ts +15 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +262 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +247 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/prompt.d.ts +14 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +126 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config/providers.d.ts +37 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +96 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/session-storage.d.ts +29 -0
- package/dist/config/session-storage.d.ts.map +1 -0
- package/dist/config/session-storage.js +67 -0
- package/dist/config/session-storage.js.map +1 -0
- package/dist/config/settings.d.ts +55 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +163 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/storage.d.ts +69 -0
- package/dist/config/storage.d.ts.map +1 -0
- package/dist/config/storage.js +126 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/history/session.d.ts +52 -0
- package/dist/history/session.d.ts.map +1 -0
- package/dist/history/session.js +122 -0
- package/dist/history/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base.d.ts +38 -0
- package/dist/llm/base.d.ts.map +1 -0
- package/dist/llm/base.js +22 -0
- package/dist/llm/base.js.map +1 -0
- package/dist/llm/factory.d.ts +12 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +26 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai.d.ts +10 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +97 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/zhipu.d.ts +10 -0
- package/dist/llm/zhipu.d.ts.map +1 -0
- package/dist/llm/zhipu.js +91 -0
- package/dist/llm/zhipu.js.map +1 -0
- package/dist/prompts/boss.d.ts +6 -0
- package/dist/prompts/boss.d.ts.map +1 -0
- package/dist/prompts/boss.js +41 -0
- package/dist/prompts/boss.js.map +1 -0
- package/dist/prompts/employee.d.ts +6 -0
- package/dist/prompts/employee.d.ts.map +1 -0
- package/dist/prompts/employee.js +41 -0
- package/dist/prompts/employee.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/utils/formatter.d.ts +25 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +83 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/stream.d.ts +36 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +74 -0
- package/dist/utils/stream.js.map +1 -0
- package/docs/OPTIMIZATION.md +772 -0
- package/docs/TECHNICAL_PRINCIPLES.md +663 -0
- package/package.json +52 -0
- package/sample/1.png +0 -0
- package/sample/2.png +0 -0
- package/screenshots/chat-dialogue.png +0 -0
- package/screenshots/chat-mode.png +0 -0
- package/src/__tests__/config/settings.test.ts +48 -0
- package/src/__tests__/prompts/boss.test.ts +35 -0
- package/src/commands/chat.ts +328 -0
- package/src/commands/config.ts +283 -0
- package/src/commands/prompt.ts +154 -0
- package/src/config/providers.ts +109 -0
- package/src/config/session-storage.ts +94 -0
- package/src/config/settings.ts +194 -0
- package/src/config/storage.ts +150 -0
- package/src/history/session.ts +141 -0
- package/src/index.ts +164 -0
- package/src/llm/base.ts +55 -0
- package/src/llm/factory.ts +24 -0
- package/src/llm/openai.ts +113 -0
- package/src/llm/zhipu.ts +101 -0
- package/src/prompts/boss.ts +43 -0
- package/src/prompts/employee.ts +43 -0
- package/src/prompts/index.ts +3 -0
- package/src/utils/formatter.ts +104 -0
- package/src/utils/logger.ts +31 -0
- package/src/utils/stream.ts +76 -0
- package/tsconfig.json +20 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/llm/base.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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
|
+
}
|