@seandong/seno 0.1.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/README.md +70 -0
- package/dist/agent/conversation.d.ts +39 -0
- package/dist/agent/conversation.js +60 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/loop.d.ts +41 -0
- package/dist/agent/loop.js +203 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session.d.ts +63 -0
- package/dist/agent/session.js +135 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/cli/commands.d.ts +52 -0
- package/dist/cli/commands.js +667 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/logger.d.ts +38 -0
- package/dist/cli/logger.js +79 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/output.d.ts +75 -0
- package/dist/cli/output.js +305 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +30 -0
- package/dist/cli/prompt.js +196 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/repl.d.ts +27 -0
- package/dist/cli/repl.js +485 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +170 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/model.d.ts +10 -0
- package/dist/commands/model.js +270 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/config/manager.d.ts +67 -0
- package/dist/config/manager.js +194 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +98 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +185 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +27 -0
- package/dist/llm/anthropic.js +189 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +47 -0
- package/dist/llm/factory.js +163 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai-codex.d.ts +45 -0
- package/dist/llm/openai-codex.js +398 -0
- package/dist/llm/openai-codex.js.map +1 -0
- package/dist/llm/openai.d.ts +16 -0
- package/dist/llm/openai.js +288 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +19 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/types.d.ts +102 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +30 -0
- package/dist/mcp/bridge.js +73 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/config.d.ts +6 -0
- package/dist/mcp/config.js +26 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/manager.d.ts +54 -0
- package/dist/mcp/manager.js +171 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/prompts/system.d.ts +14 -0
- package/dist/prompts/system.js +194 -0
- package/dist/prompts/system.js.map +1 -0
- package/dist/skills/loader.d.ts +7 -0
- package/dist/skills/loader.js +81 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +48 -0
- package/dist/skills/registry.js +104 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/sync.d.ts +34 -0
- package/dist/skills/sync.js +179 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/types.d.ts +29 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/ask.d.ts +16 -0
- package/dist/tools/ask.js +57 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/registry.d.ts +54 -0
- package/dist/tools/registry.js +114 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/shell.d.ts +10 -0
- package/dist/tools/shell.js +131 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/ssh.d.ts +40 -0
- package/dist/tools/ssh.js +302 -0
- package/dist/tools/ssh.js.map +1 -0
- package/dist/tools/types.d.ts +20 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/retry.d.ts +20 -0
- package/dist/utils/retry.js +33 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { execSync, spawn } from 'node:child_process';
|
|
5
|
+
import OpenAI from 'openai';
|
|
6
|
+
import { logger } from '../cli/logger.js';
|
|
7
|
+
import { LLMError } from '../errors.js';
|
|
8
|
+
import { withRetry } from '../utils/retry.js';
|
|
9
|
+
// ─── Codex OAuth Auth ──────────────────────────────────────
|
|
10
|
+
const CODEX_AUTH_FILE = join(homedir(), '.codex', 'auth.json');
|
|
11
|
+
const CODEX_TOKEN_URL = 'https://auth.openai.com/oauth/token';
|
|
12
|
+
const CODEX_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
13
|
+
/** Token 过期阈值(55 分钟) */
|
|
14
|
+
const TOKEN_EXPIRY_MS = 55 * 60 * 1000;
|
|
15
|
+
/** Codex ChatGPT 后端 URL(OAuth 模式的默认 API 端点) */
|
|
16
|
+
const CODEX_BASE_URL = 'https://chatgpt.com/backend-api/codex';
|
|
17
|
+
/**
|
|
18
|
+
* 检查 codex CLI 是否已安装
|
|
19
|
+
*/
|
|
20
|
+
export function isCodexInstalled() {
|
|
21
|
+
try {
|
|
22
|
+
execSync('command -v codex', { stdio: 'ignore' });
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 通过 Codex CLI 执行 Device Code Flow OAuth
|
|
31
|
+
*
|
|
32
|
+
* 调用 `codex login --device-auth` 子进程(继承 stdio 以展示 URL 和用户码)。
|
|
33
|
+
* 授权完成后 token 由 Codex 存储到 ~/.codex/auth.json。
|
|
34
|
+
*/
|
|
35
|
+
export async function codexOAuthLogin() {
|
|
36
|
+
if (!isCodexInstalled()) {
|
|
37
|
+
throw new Error('Codex CLI 未安装。请先运行: npm install -g @openai/codex');
|
|
38
|
+
}
|
|
39
|
+
// 执行 codex login --device-auth,继承 stdio 让用户看到授权 URL
|
|
40
|
+
await new Promise((resolve, reject) => {
|
|
41
|
+
const child = spawn('codex', ['login', '--device-auth'], {
|
|
42
|
+
stdio: 'inherit',
|
|
43
|
+
});
|
|
44
|
+
child.on('close', (code) => {
|
|
45
|
+
if (code === 0) {
|
|
46
|
+
resolve();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
reject(new Error(`codex login 退出码: ${code}`));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
child.on('error', (err) => {
|
|
53
|
+
reject(new Error(`codex login 执行失败: ${err.message}`));
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// 验证 auth.json 已写入
|
|
57
|
+
try {
|
|
58
|
+
const authData = await readAuthFile();
|
|
59
|
+
if (!authData.tokens?.access_token) {
|
|
60
|
+
throw new Error('auth.json 中缺少 access_token');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`OAuth 登录后验证失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 从 ~/.codex/auth.json 读取认证信息(access_token + account_id)
|
|
69
|
+
*
|
|
70
|
+
* 若 token 可能过期(last_refresh > 55 分钟前),自动刷新。
|
|
71
|
+
*/
|
|
72
|
+
export async function getCodexAuthInfo() {
|
|
73
|
+
const authData = await readAuthFile();
|
|
74
|
+
// 检查 token 是否过期
|
|
75
|
+
const lastRefresh = new Date(authData.last_refresh).getTime();
|
|
76
|
+
const elapsed = Date.now() - lastRefresh;
|
|
77
|
+
let accessToken;
|
|
78
|
+
if (elapsed > TOKEN_EXPIRY_MS) {
|
|
79
|
+
accessToken = await refreshCodexToken(authData);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
accessToken = authData.tokens.access_token;
|
|
83
|
+
}
|
|
84
|
+
return { accessToken, accountId: authData.tokens.account_id };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 从 ~/.codex/auth.json 读取当前 access_token
|
|
88
|
+
*
|
|
89
|
+
* 若 token 可能过期(last_refresh > 55 分钟前),自动刷新。
|
|
90
|
+
*/
|
|
91
|
+
export async function getCodexAccessToken() {
|
|
92
|
+
const { accessToken } = await getCodexAuthInfo();
|
|
93
|
+
return accessToken;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 使用 refresh_token 刷新 access_token
|
|
97
|
+
*/
|
|
98
|
+
async function refreshCodexToken(authData) {
|
|
99
|
+
const response = await fetch(CODEX_TOKEN_URL, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: { 'Content-Type': 'application/json' },
|
|
102
|
+
body: JSON.stringify({
|
|
103
|
+
client_id: CODEX_CLIENT_ID,
|
|
104
|
+
grant_type: 'refresh_token',
|
|
105
|
+
refresh_token: authData.tokens.refresh_token,
|
|
106
|
+
}),
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error(`Token 刷新失败 (${response.status}): ${await response.text()}`);
|
|
110
|
+
}
|
|
111
|
+
const data = (await response.json());
|
|
112
|
+
// 更新 auth.json
|
|
113
|
+
const updated = {
|
|
114
|
+
...authData,
|
|
115
|
+
tokens: {
|
|
116
|
+
access_token: data.access_token,
|
|
117
|
+
id_token: data.id_token || authData.tokens.id_token,
|
|
118
|
+
refresh_token: data.refresh_token || authData.tokens.refresh_token,
|
|
119
|
+
account_id: authData.tokens.account_id,
|
|
120
|
+
},
|
|
121
|
+
last_refresh: new Date().toISOString(),
|
|
122
|
+
};
|
|
123
|
+
await writeFile(CODEX_AUTH_FILE, JSON.stringify(updated, null, 2) + '\n', 'utf-8');
|
|
124
|
+
return data.access_token;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 读取 ~/.codex/auth.json
|
|
128
|
+
*/
|
|
129
|
+
async function readAuthFile() {
|
|
130
|
+
try {
|
|
131
|
+
const content = await readFile(CODEX_AUTH_FILE, 'utf-8');
|
|
132
|
+
return JSON.parse(content);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
throw new Error(`无法读取 ${CODEX_AUTH_FILE},请先运行 codex login --device-auth`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ─── OpenAI Codex Provider (ChatGPT Backend Responses API) ──
|
|
139
|
+
const DEFAULT_MODEL = 'gpt-5.4';
|
|
140
|
+
/**
|
|
141
|
+
* OpenAI Codex LLM Provider
|
|
142
|
+
*
|
|
143
|
+
* 使用 ChatGPT 后端的 Responses API (`chatgpt.com/backend-api/codex/responses`)。
|
|
144
|
+
* Codex OAuth Token 绑定 ChatGPT/Codex 订阅,需要通过 ChatGPT 后端代理调用。
|
|
145
|
+
* 标准 OpenAI API (`api.openai.com`) 不接受 Codex OAuth Token。
|
|
146
|
+
*/
|
|
147
|
+
export class OpenAICodexProvider {
|
|
148
|
+
name = 'openai-codex';
|
|
149
|
+
client;
|
|
150
|
+
constructor(accessToken, accountId) {
|
|
151
|
+
this.client = new OpenAI({
|
|
152
|
+
apiKey: accessToken,
|
|
153
|
+
baseURL: CODEX_BASE_URL,
|
|
154
|
+
defaultHeaders: {
|
|
155
|
+
'chatgpt-account-id': accountId,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async *chat(messages, tools, options) {
|
|
160
|
+
const model = options?.model || DEFAULT_MODEL;
|
|
161
|
+
// 构造请求参数
|
|
162
|
+
// ChatGPT 后端要求: instructions 独立字段, store=false, 不支持 max_output_tokens
|
|
163
|
+
const input = convertToResponseInput(messages);
|
|
164
|
+
const params = {
|
|
165
|
+
model,
|
|
166
|
+
input,
|
|
167
|
+
stream: true,
|
|
168
|
+
store: false,
|
|
169
|
+
};
|
|
170
|
+
// system prompt → instructions 字段(ChatGPT 后端要求用此字段)
|
|
171
|
+
if (options?.system) {
|
|
172
|
+
params.instructions = options.system;
|
|
173
|
+
}
|
|
174
|
+
if (options?.temperature !== undefined) {
|
|
175
|
+
params.temperature = options.temperature;
|
|
176
|
+
}
|
|
177
|
+
if (tools.length > 0) {
|
|
178
|
+
params.tools = convertToResponseTools(tools);
|
|
179
|
+
}
|
|
180
|
+
logger.debug('llm', `→ Request: model=${model}, tools=${tools.length}, messages=${messages.length}`);
|
|
181
|
+
// 创建流(带重试)
|
|
182
|
+
let stream;
|
|
183
|
+
try {
|
|
184
|
+
stream = await withRetry(() => this.client.responses.create(params), {
|
|
185
|
+
maxRetries: 3,
|
|
186
|
+
baseDelayMs: 1000,
|
|
187
|
+
maxDelayMs: 8000,
|
|
188
|
+
shouldRetry: (e) => isRetryableError(e),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
yield { type: 'error', error: classifyError(error) };
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// 处理流式事件
|
|
196
|
+
try {
|
|
197
|
+
let inputTokens = 0;
|
|
198
|
+
let outputTokens = 0;
|
|
199
|
+
for await (const event of stream) {
|
|
200
|
+
switch (event.type) {
|
|
201
|
+
case 'response.output_text.delta':
|
|
202
|
+
yield { type: 'text_delta', text: event.delta };
|
|
203
|
+
break;
|
|
204
|
+
case 'response.output_item.added':
|
|
205
|
+
if (event.item.type === 'function_call') {
|
|
206
|
+
yield {
|
|
207
|
+
type: 'tool_use_start',
|
|
208
|
+
id: event.item.call_id,
|
|
209
|
+
name: event.item.name,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case 'response.function_call_arguments.delta':
|
|
214
|
+
yield { type: 'tool_use_delta', input_json: event.delta };
|
|
215
|
+
break;
|
|
216
|
+
case 'response.output_item.done':
|
|
217
|
+
if (event.item.type === 'function_call') {
|
|
218
|
+
yield { type: 'tool_use_end' };
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
case 'response.completed': {
|
|
222
|
+
const usage = event.response.usage;
|
|
223
|
+
inputTokens = usage?.input_tokens || 0;
|
|
224
|
+
outputTokens = usage?.output_tokens || 0;
|
|
225
|
+
// 判断 stop_reason
|
|
226
|
+
const hasToolCalls = event.response.output.some((item) => item.type === 'function_call');
|
|
227
|
+
const stopReason = hasToolCalls ? 'tool_use' : 'end_turn';
|
|
228
|
+
logger.debug('llm', `← Response: stop=${stopReason}, in=${inputTokens}, out=${outputTokens}`);
|
|
229
|
+
yield {
|
|
230
|
+
type: 'message_end',
|
|
231
|
+
stop_reason: stopReason,
|
|
232
|
+
usage: { inputTokens, outputTokens },
|
|
233
|
+
};
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case 'response.failed': {
|
|
237
|
+
const err = event.response.error;
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
239
|
+
const code = err?.code || '';
|
|
240
|
+
const message = err?.message || 'Responses API 请求失败';
|
|
241
|
+
// server_error 类型标记为可重试,提示用户重新输入
|
|
242
|
+
const isServerError = code === 'server_error' ||
|
|
243
|
+
message.includes('An error occurred while processing');
|
|
244
|
+
yield {
|
|
245
|
+
type: 'error',
|
|
246
|
+
error: new LLMError(message, isServerError ? 500 : undefined, isServerError),
|
|
247
|
+
};
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
yield {
|
|
255
|
+
type: 'error',
|
|
256
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* 将内部 Message[] 格式转换为 Responses API 的 input 格式
|
|
263
|
+
*
|
|
264
|
+
* system prompt 通过 params.instructions 传入,不放在 input 中。
|
|
265
|
+
*/
|
|
266
|
+
function convertToResponseInput(messages) {
|
|
267
|
+
const input = [];
|
|
268
|
+
for (const msg of messages) {
|
|
269
|
+
// 简单字符串消息
|
|
270
|
+
if (typeof msg.content === 'string') {
|
|
271
|
+
input.push({
|
|
272
|
+
role: msg.role === 'assistant' ? 'assistant' : 'user',
|
|
273
|
+
content: msg.content,
|
|
274
|
+
type: 'message',
|
|
275
|
+
});
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
// ContentBlock[] 消息需要拆分处理
|
|
279
|
+
if (msg.role === 'assistant') {
|
|
280
|
+
// 提取文本内容
|
|
281
|
+
const textParts = msg.content
|
|
282
|
+
.filter((b) => b.type === 'text')
|
|
283
|
+
.map((b) => b.text);
|
|
284
|
+
if (textParts.length > 0) {
|
|
285
|
+
input.push({
|
|
286
|
+
role: 'assistant',
|
|
287
|
+
content: textParts.join(''),
|
|
288
|
+
type: 'message',
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
// 提取 tool_use blocks → ResponseFunctionToolCall items
|
|
292
|
+
for (const block of msg.content) {
|
|
293
|
+
if (block.type === 'tool_use') {
|
|
294
|
+
const toolUse = block;
|
|
295
|
+
input.push({
|
|
296
|
+
type: 'function_call',
|
|
297
|
+
call_id: toolUse.id,
|
|
298
|
+
name: toolUse.name,
|
|
299
|
+
arguments: JSON.stringify(toolUse.input),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
// user 消息
|
|
306
|
+
const toolResults = msg.content.filter((b) => b.type === 'tool_result');
|
|
307
|
+
const nonToolBlocks = msg.content.filter((b) => b.type !== 'tool_result');
|
|
308
|
+
// 普通 user 文本
|
|
309
|
+
if (nonToolBlocks.length > 0) {
|
|
310
|
+
const text = nonToolBlocks
|
|
311
|
+
.filter((b) => b.type === 'text')
|
|
312
|
+
.map((b) => b.text)
|
|
313
|
+
.join('');
|
|
314
|
+
if (text) {
|
|
315
|
+
input.push({ role: 'user', content: text, type: 'message' });
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// tool_result → function_call_output
|
|
319
|
+
for (const tr of toolResults) {
|
|
320
|
+
input.push({
|
|
321
|
+
type: 'function_call_output',
|
|
322
|
+
call_id: tr.tool_use_id,
|
|
323
|
+
output: tr.content,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return input;
|
|
329
|
+
}
|
|
330
|
+
// ─── Tool Conversion ────────────────────────────────────────
|
|
331
|
+
/**
|
|
332
|
+
* 将内部 ToolDefinition[] 转换为 Responses API 的 FunctionTool[] 格式
|
|
333
|
+
*/
|
|
334
|
+
function convertToResponseTools(tools) {
|
|
335
|
+
return tools.map((tool) => ({
|
|
336
|
+
type: 'function',
|
|
337
|
+
name: tool.name,
|
|
338
|
+
description: tool.description,
|
|
339
|
+
parameters: tool.input_schema,
|
|
340
|
+
strict: false,
|
|
341
|
+
}));
|
|
342
|
+
}
|
|
343
|
+
// ─── Error Handling ─────────────────────────────────────────
|
|
344
|
+
/**
|
|
345
|
+
* 判断 API 错误是否可重试
|
|
346
|
+
*/
|
|
347
|
+
function isRetryableError(error) {
|
|
348
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
349
|
+
const status = error?.status;
|
|
350
|
+
if (status === 429 || status === 500 || status === 502 || status === 503) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
354
|
+
if (message.includes('fetch') ||
|
|
355
|
+
message.includes('network') ||
|
|
356
|
+
message.includes('ECONNREFUSED') ||
|
|
357
|
+
message.includes('ETIMEDOUT')) {
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* 将原始错误转换为 LLMError
|
|
364
|
+
*/
|
|
365
|
+
function classifyError(error) {
|
|
366
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
367
|
+
const status = error?.status;
|
|
368
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
369
|
+
switch (status) {
|
|
370
|
+
case 401:
|
|
371
|
+
return new LLMError('OAuth Token 认证失败,请运行 /model auth 重新授权', 401, false);
|
|
372
|
+
case 400: {
|
|
373
|
+
if (message.includes('context') ||
|
|
374
|
+
message.includes('too long') ||
|
|
375
|
+
message.includes('max tokens') ||
|
|
376
|
+
message.includes('too many')) {
|
|
377
|
+
return new LLMError(message, 400, false);
|
|
378
|
+
}
|
|
379
|
+
return new LLMError(`请求参数错误: ${message}`, 400, false);
|
|
380
|
+
}
|
|
381
|
+
case 429:
|
|
382
|
+
return new LLMError('API 请求频率超限,已重试仍失败', 429, true);
|
|
383
|
+
case 500:
|
|
384
|
+
case 502:
|
|
385
|
+
case 503:
|
|
386
|
+
return new LLMError(`OpenAI API 服务暂时不可用 (${status}),已重试仍失败`, status, true);
|
|
387
|
+
default: {
|
|
388
|
+
if (message.includes('fetch') ||
|
|
389
|
+
message.includes('network') ||
|
|
390
|
+
message.includes('ECONNREFUSED') ||
|
|
391
|
+
message.includes('ETIMEDOUT')) {
|
|
392
|
+
return new LLMError('网络连接失败,请检查网络', undefined, true);
|
|
393
|
+
}
|
|
394
|
+
return new LLMError(message, status);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=openai-codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-codex.js","sourceRoot":"","sources":["../../src/llm/openai-codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LLMProvider } from './provider.js';
|
|
2
|
+
import type { Message, ToolDefinition, ChatOptions, StreamEvent } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* OpenAI LLM Provider
|
|
5
|
+
*
|
|
6
|
+
* 实现统一 LLMProvider 接口,内部将 Anthropic 格式的消息/工具转换为 OpenAI 格式,
|
|
7
|
+
* 并将 OpenAI 流式响应转换回统一的 StreamEvent。
|
|
8
|
+
*
|
|
9
|
+
* 同时支持 API Key 和 OAuth access_token(OpenAI SDK 的 apiKey 参数兼容两者)。
|
|
10
|
+
*/
|
|
11
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
12
|
+
readonly name = "openai";
|
|
13
|
+
private client;
|
|
14
|
+
constructor(apiKeyOrToken: string, baseUrl?: string);
|
|
15
|
+
chat(messages: Message[], tools: ToolDefinition[], options?: ChatOptions): AsyncGenerator<StreamEvent>;
|
|
16
|
+
}
|