tianxincode 1.0.2 → 1.0.4
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 +164 -21
- package/dist/api/chat.routes.js +14 -8
- package/dist/api/chat.routes.js.map +1 -1
- package/dist/api/session.routes.js +1 -1
- package/dist/api/session.routes.js.map +1 -1
- package/dist/cli/commands.js +1 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +109 -70
- package/dist/components/App.js.map +1 -1
- package/dist/modules/ai/ai.service.d.ts.map +1 -1
- package/dist/modules/ai/ai.service.js +4 -19
- package/dist/modules/ai/ai.service.js.map +1 -1
- package/dist/modules/ai/ai.types.d.ts +4 -2
- package/dist/modules/ai/ai.types.d.ts.map +1 -1
- package/dist/modules/ai/openai.provider.d.ts +2 -124
- package/dist/modules/ai/openai.provider.d.ts.map +1 -1
- package/dist/modules/ai/openai.provider.js +47 -212
- package/dist/modules/ai/openai.provider.js.map +1 -1
- package/dist/modules/ai/react/react.parser.d.ts +12 -7
- package/dist/modules/ai/react/react.parser.d.ts.map +1 -1
- package/dist/modules/ai/react/react.parser.js +170 -83
- package/dist/modules/ai/react/react.parser.js.map +1 -1
- package/dist/modules/ai/react/react.prompts.d.ts.map +1 -1
- package/dist/modules/ai/react/react.prompts.js +23 -33
- package/dist/modules/ai/react/react.prompts.js.map +1 -1
- package/dist/modules/ai/react/react.types.d.ts +5 -2
- package/dist/modules/ai/react/react.types.d.ts.map +1 -1
- package/dist/modules/ai/react/react.validator.d.ts +14 -0
- package/dist/modules/ai/react/react.validator.d.ts.map +1 -0
- package/dist/modules/ai/react/react.validator.js +53 -0
- package/dist/modules/ai/react/react.validator.js.map +1 -0
- package/dist/modules/ai/react.agent.d.ts +41 -0
- package/dist/modules/ai/react.agent.d.ts.map +1 -1
- package/dist/modules/ai/react.agent.js +81 -10
- package/dist/modules/ai/react.agent.js.map +1 -1
- package/dist/modules/ai/summarizer/summarizer.service.d.ts +1 -1
- package/dist/modules/ai/summarizer/summarizer.service.d.ts.map +1 -1
- package/dist/modules/ai/summarizer/summarizer.service.js +9 -22
- package/dist/modules/ai/summarizer/summarizer.service.js.map +1 -1
- package/dist/modules/ai/summarizer/summarizer.types.d.ts +1 -1
- package/dist/modules/ai/summarizer/summarizer.types.d.ts.map +1 -1
- package/dist/modules/db/db.service.js +1 -1
- package/dist/modules/db/db.service.js.map +1 -1
- package/dist/modules/memory/memory.service.js +1 -1
- package/dist/modules/memory/memory.service.js.map +1 -1
- package/dist/modules/skill/skill.tool.d.ts.map +1 -1
- package/dist/modules/skill/skill.tool.js +1 -0
- package/dist/modules/skill/skill.tool.js.map +1 -1
- package/dist/modules/skill/skill.txt +20 -2
- package/dist/modules/tools/builtin/bash.d.ts.map +1 -1
- package/dist/modules/tools/builtin/bash.js +2 -1
- package/dist/modules/tools/builtin/bash.js.map +1 -1
- package/dist/modules/tools/builtin/bash.txt +30 -42
- package/dist/modules/tools/builtin/code_search.d.ts.map +1 -1
- package/dist/modules/tools/builtin/code_search.js +1 -0
- package/dist/modules/tools/builtin/code_search.js.map +1 -1
- package/dist/modules/tools/builtin/code_search.txt +23 -0
- package/dist/modules/tools/builtin/edit_file.d.ts.map +1 -1
- package/dist/modules/tools/builtin/edit_file.js +44 -8
- package/dist/modules/tools/builtin/edit_file.js.map +1 -1
- package/dist/modules/tools/builtin/edit_file.txt +56 -5
- package/dist/modules/tools/builtin/glob.d.ts.map +1 -1
- package/dist/modules/tools/builtin/glob.js +1 -0
- package/dist/modules/tools/builtin/glob.js.map +1 -1
- package/dist/modules/tools/builtin/glob.txt +23 -0
- package/dist/modules/tools/builtin/grep.d.ts.map +1 -1
- package/dist/modules/tools/builtin/grep.js +1 -0
- package/dist/modules/tools/builtin/grep.js.map +1 -1
- package/dist/modules/tools/builtin/grep.txt +25 -0
- package/dist/modules/tools/builtin/index.d.ts.map +1 -1
- package/dist/modules/tools/builtin/index.js +27 -35
- package/dist/modules/tools/builtin/index.js.map +1 -1
- package/dist/modules/tools/builtin/lsp.d.ts.map +1 -1
- package/dist/modules/tools/builtin/lsp.js +2 -1
- package/dist/modules/tools/builtin/lsp.js.map +1 -1
- package/dist/modules/tools/builtin/lsp.txt +31 -5
- package/dist/modules/tools/builtin/memory.d.ts.map +1 -1
- package/dist/modules/tools/builtin/memory.js +1 -0
- package/dist/modules/tools/builtin/memory.js.map +1 -1
- package/dist/modules/tools/builtin/memory.txt +23 -1
- package/dist/modules/tools/builtin/read_file.d.ts.map +1 -1
- package/dist/modules/tools/builtin/read_file.js +11 -3
- package/dist/modules/tools/builtin/read_file.js.map +1 -1
- package/dist/modules/tools/builtin/read_file.txt +25 -2
- package/dist/modules/tools/builtin/todo_read.d.ts.map +1 -1
- package/dist/modules/tools/builtin/todo_read.js +1 -0
- package/dist/modules/tools/builtin/todo_read.js.map +1 -1
- package/dist/modules/tools/builtin/todo_read.txt +20 -0
- package/dist/modules/tools/builtin/todo_write.d.ts.map +1 -1
- package/dist/modules/tools/builtin/todo_write.js +1 -0
- package/dist/modules/tools/builtin/todo_write.js.map +1 -1
- package/dist/modules/tools/builtin/todo_write.txt +21 -0
- package/dist/modules/tools/builtin/web_fetch.d.ts.map +1 -1
- package/dist/modules/tools/builtin/web_fetch.js +1 -0
- package/dist/modules/tools/builtin/web_fetch.js.map +1 -1
- package/dist/modules/tools/builtin/web_fetch.txt +23 -0
- package/dist/modules/tools/builtin/web_search.d.ts.map +1 -1
- package/dist/modules/tools/builtin/web_search.js +1 -0
- package/dist/modules/tools/builtin/web_search.js.map +1 -1
- package/dist/modules/tools/builtin/web_search.txt +28 -1
- package/dist/modules/tools/builtin/write_file.d.ts.map +1 -1
- package/dist/modules/tools/builtin/write_file.js +16 -1
- package/dist/modules/tools/builtin/write_file.js.map +1 -1
- package/dist/modules/tools/builtin/write_file.txt +50 -1
- package/dist/modules/tools/tool.service.d.ts.map +1 -1
- package/dist/modules/tools/tool.service.js +3 -0
- package/dist/modules/tools/tool.service.js.map +1 -1
- package/dist/modules/tools/tool.types.d.ts +1 -0
- package/dist/modules/tools/tool.types.d.ts.map +1 -1
- package/dist/web/web.service.d.ts.map +1 -1
- package/dist/web/web.service.js +8 -5
- package/dist/web/web.service.js.map +1 -1
- package/package.json +9 -6
- package/web/dist/assets/{Layout-Bb76CGAL.js → Layout-Pvn6DBHZ.js} +1 -1
- package/web/dist/assets/{index-KTH-myBB.css → index-BnpKQafm.css} +1 -1
- package/web/dist/assets/{index-DQRR0ggU.js → index-CEHMSOel.js} +64 -64
- package/web/dist/index.html +2 -2
|
@@ -1,236 +1,83 @@
|
|
|
1
|
-
|
|
2
|
-
* OpenAI Provider 模块
|
|
3
|
-
*
|
|
4
|
-
* 本模块负责与 OpenAI API (及兼容 API) 进行交互
|
|
5
|
-
*
|
|
6
|
-
* 核心功能:
|
|
7
|
-
* 1. chat() - 发送聊天请求,获取完整响应
|
|
8
|
-
* 2. chatStream() - 流式聊天,逐块获取响应
|
|
9
|
-
* 3. Tool Calls - 支持 AI 调用工具 (Function Calling)
|
|
10
|
-
*
|
|
11
|
-
* 支持的 AI 提供商:
|
|
12
|
-
* - OpenAI (GPT-4, GPT-3.5)
|
|
13
|
-
* - 兼容 OpenAI API 的其他提供商 (如 Anthropic Claude 通过适配器)
|
|
14
|
-
* - 自定义 API 端点 (通过 baseUrl 配置)
|
|
15
|
-
*
|
|
16
|
-
* 使用方式:
|
|
17
|
-
* const provider = new OpenAIProvider({
|
|
18
|
-
* apiKey: 'your-api-key',
|
|
19
|
-
* baseUrl: 'https://api.openai.com/v1',
|
|
20
|
-
* defaultModel: 'gpt-4'
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* const response = await provider.chat([
|
|
24
|
-
* { role: 'user', content: '你好' }
|
|
25
|
-
* ]);
|
|
26
|
-
*/
|
|
1
|
+
import OpenAI from 'openai';
|
|
27
2
|
import { logger } from '../logger/index.js';
|
|
28
|
-
/**
|
|
29
|
-
* OpenAIProvider 类
|
|
30
|
-
*
|
|
31
|
-
* 封装与 OpenAI API 的所有交互逻辑
|
|
32
|
-
* 使用原生 fetch API 发送请求
|
|
33
|
-
*
|
|
34
|
-
* API 端点:
|
|
35
|
-
* - POST /chat/completions - 聊天完成
|
|
36
|
-
*
|
|
37
|
-
* 请求格式:
|
|
38
|
-
* - model: 模型名称
|
|
39
|
-
* - messages: 消息数组
|
|
40
|
-
* - temperature: 温度参数 (0-2)
|
|
41
|
-
* - max_tokens: 最大 Token 数
|
|
42
|
-
* - tools: 工具定义数组 (可选)
|
|
43
|
-
* - tool_choice: 工具选择策略 (可选)
|
|
44
|
-
* - stream: 是否流式响应 (可选)
|
|
45
|
-
*/
|
|
46
3
|
export class OpenAIProvider {
|
|
47
|
-
/**
|
|
48
|
-
* 构造函数
|
|
49
|
-
*
|
|
50
|
-
* @param config - 配置对象
|
|
51
|
-
*
|
|
52
|
-
* baseUrl 默认值说明:
|
|
53
|
-
* - OpenAI: https://api.openai.com/v1
|
|
54
|
-
* - 本地部署: http://localhost:11434/v1 (Ollama)
|
|
55
|
-
* - 自定义: 用户配置的任意兼容 API 地址
|
|
56
|
-
*/
|
|
57
4
|
constructor(config) {
|
|
58
|
-
this.
|
|
59
|
-
|
|
5
|
+
this.client = new OpenAI({
|
|
6
|
+
apiKey: config.apiKey,
|
|
7
|
+
baseURL: config.baseUrl || 'https://api.openai.com/v1',
|
|
8
|
+
defaultHeaders: {
|
|
9
|
+
'HTTP-Referer': 'https://www.npmjs.com/package/tianxincode',
|
|
10
|
+
'X-Title': 'txcode',
|
|
11
|
+
'X-OpenRouter-Title': 'txcode',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
60
14
|
this.defaultModel = config.defaultModel || 'gpt-4';
|
|
61
15
|
}
|
|
62
|
-
/**
|
|
63
|
-
* 发送聊天请求 (非流式)
|
|
64
|
-
*
|
|
65
|
-
* 将消息数组发送给 AI,获取完整的响应
|
|
66
|
-
* 支持 Tool Calls 功能
|
|
67
|
-
*
|
|
68
|
-
* 执行流程:
|
|
69
|
-
* 1. 构建请求体 (model, messages, temperature 等)
|
|
70
|
-
* 2. 如果有工具定义,添加到请求体
|
|
71
|
-
* 3. 发送 POST 请求到 /chat/completions
|
|
72
|
-
* 4. 解析响应,返回 ChatResponse
|
|
73
|
-
*
|
|
74
|
-
* @param messages - 消息数组,包含角色和内容
|
|
75
|
-
* @param options - 可选配置 (temperature, maxTokens, model, tools)
|
|
76
|
-
* @returns {Promise<ChatResponse>} AI 响应对象
|
|
77
|
-
*
|
|
78
|
-
* @example
|
|
79
|
-
* const response = await provider.chat([
|
|
80
|
-
* { role: 'system', content: '你是一个助手' },
|
|
81
|
-
* { role: 'user', content: '你好' }
|
|
82
|
-
* ]);
|
|
83
|
-
*
|
|
84
|
-
* console.log(response.content); // AI 的回复
|
|
85
|
-
* console.log(response.usage); // Token 使用量
|
|
86
|
-
*/
|
|
87
16
|
async chat(messages, options = {}) {
|
|
88
|
-
|
|
89
|
-
// 使用提供的值或默认值
|
|
90
|
-
const { temperature = 0.7, // 温度:控制生成随机性,0-2 之间
|
|
91
|
-
maxTokens = 2000, // 最大 Token 数
|
|
92
|
-
model = this.defaultModel, // 模型名称
|
|
93
|
-
tools, // 工具定义数组 (可选)
|
|
94
|
-
} = options;
|
|
95
|
-
// ========== 构建请求体 ==========
|
|
17
|
+
const { temperature = 0.7, maxTokens = 8192, model = this.defaultModel, tools, } = options;
|
|
96
18
|
const requestBody = {
|
|
97
19
|
model,
|
|
98
|
-
messages: messages.map(m => this.formatMessage(m)),
|
|
20
|
+
messages: messages.map(m => this.formatMessage(m)),
|
|
99
21
|
temperature,
|
|
100
22
|
max_tokens: maxTokens,
|
|
101
23
|
};
|
|
102
|
-
// ========== 添加工具定义 ==========
|
|
103
|
-
// 如果提供了工具,AI 可以选择调用工具
|
|
104
24
|
if (tools && tools.length > 0) {
|
|
105
25
|
requestBody.tools = tools;
|
|
106
|
-
requestBody.tool_choice = 'auto';
|
|
26
|
+
requestBody.tool_choice = 'auto';
|
|
107
27
|
}
|
|
108
|
-
|
|
109
|
-
// 完整的 API 端点: {baseUrl}/chat/completions
|
|
110
|
-
const url = `${this.baseUrl}/chat/completions`;
|
|
111
|
-
// 记录请求日志 (调试用)
|
|
28
|
+
const url = `${this.client.baseURL}/chat/completions`;
|
|
112
29
|
logger.logRequest(url, requestBody);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
headers: {
|
|
117
|
-
'Content-Type': 'application/json',
|
|
118
|
-
Authorization: `Bearer ${this.apiKey}`, // Bearer Token 认证
|
|
119
|
-
},
|
|
120
|
-
body: JSON.stringify(requestBody),
|
|
121
|
-
});
|
|
122
|
-
// ========== 错误处理 ==========
|
|
123
|
-
if (!response.ok) {
|
|
124
|
-
const error = await response.text();
|
|
125
|
-
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
126
|
-
}
|
|
127
|
-
// ========== 解析响应 ==========
|
|
128
|
-
const data = (await response.json());
|
|
129
|
-
// 记录响应日志
|
|
130
|
-
logger.logResponse(url, data);
|
|
131
|
-
// 转换为内部格式并返回
|
|
132
|
-
return this.parseResponse(data);
|
|
30
|
+
const response = await this.client.chat.completions.create(requestBody);
|
|
31
|
+
logger.logResponse(url, response);
|
|
32
|
+
return this.parseResponse(response);
|
|
133
33
|
}
|
|
134
|
-
/**
|
|
135
|
-
* 流式聊天
|
|
136
|
-
*
|
|
137
|
-
* 使用 Server-Sent Events (SSE) 流式获取 AI 响应
|
|
138
|
-
* 适用于需要实时展示 AI 回复的场景
|
|
139
|
-
*
|
|
140
|
-
* 实现原理:
|
|
141
|
-
* 1. 发送请求时设置 stream: true
|
|
142
|
-
* 2. 逐块读取响应体
|
|
143
|
-
* 3. 解析每个 SSE 消息块
|
|
144
|
-
* 4. yield 每个内容块给调用者
|
|
145
|
-
* 5. 直到收到 [DONE] 标记结束
|
|
146
|
-
*
|
|
147
|
-
* @param messages - 消息数组
|
|
148
|
-
* @param options - 可选配置
|
|
149
|
-
* @returns {AsyncGenerator<string>} 异步生成器,逐块返回内容
|
|
150
|
-
*/
|
|
151
34
|
async *chatStream(messages, options = {}) {
|
|
152
35
|
const { temperature = 0.7, maxTokens = 2000, model = this.defaultModel, } = options;
|
|
153
|
-
|
|
154
|
-
const url = `${this.baseUrl}/chat/completions`;
|
|
36
|
+
const url = `${this.client.baseURL}/chat/completions`;
|
|
155
37
|
const requestBody = {
|
|
156
38
|
model,
|
|
157
39
|
messages: messages.map(m => this.formatMessage(m)),
|
|
158
40
|
temperature,
|
|
159
41
|
max_tokens: maxTokens,
|
|
160
|
-
stream: true,
|
|
42
|
+
stream: true,
|
|
161
43
|
};
|
|
162
44
|
logger.logRequest(url, requestBody);
|
|
163
|
-
const response = await
|
|
164
|
-
|
|
165
|
-
headers: {
|
|
166
|
-
'Content-Type': 'application/json',
|
|
167
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
168
|
-
},
|
|
169
|
-
body: JSON.stringify(requestBody),
|
|
170
|
-
});
|
|
171
|
-
if (!response.ok) {
|
|
172
|
-
throw new Error(`OpenAI API error: ${response.status}`);
|
|
173
|
-
}
|
|
174
|
-
// ========== 获取响应流 ==========
|
|
175
|
-
// response.body 是一个 ReadableStream
|
|
176
|
-
const reader = response.body?.getReader();
|
|
177
|
-
if (!reader)
|
|
45
|
+
const response = await this.client.chat.completions.create(requestBody);
|
|
46
|
+
if (!response.body) {
|
|
178
47
|
throw new Error('No response body');
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
|
|
48
|
+
}
|
|
49
|
+
const reader = response.body.getReader();
|
|
50
|
+
const decoder = new TextDecoder();
|
|
51
|
+
let buffer = '';
|
|
183
52
|
while (true) {
|
|
184
|
-
// 读取一块数据
|
|
185
53
|
const { done, value } = await reader.read();
|
|
186
54
|
if (done)
|
|
187
|
-
break;
|
|
188
|
-
// 解码并追加到缓冲区
|
|
55
|
+
break;
|
|
189
56
|
buffer += decoder.decode(value, { stream: true });
|
|
190
|
-
// 按行分割
|
|
191
57
|
const lines = buffer.split('\n');
|
|
192
|
-
buffer = lines.pop() || '';
|
|
193
|
-
// ========== 处理每一行 ==========
|
|
58
|
+
buffer = lines.pop() || '';
|
|
194
59
|
for (const line of lines) {
|
|
195
60
|
const trimmed = line.trim();
|
|
196
|
-
// SSE 格式: data: {...}
|
|
197
61
|
if (trimmed.startsWith('data: ')) {
|
|
198
|
-
const data = trimmed.slice(6);
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (data === '[DONE]') {
|
|
202
|
-
logger.logResponse(url, streamData);
|
|
203
|
-
return; // 流式响应结束
|
|
204
|
-
}
|
|
205
|
-
// ========== 解析并 yield 内容 ==========
|
|
62
|
+
const data = trimmed.slice(6);
|
|
63
|
+
if (data === '[DONE]')
|
|
64
|
+
return;
|
|
206
65
|
try {
|
|
207
66
|
const parsed = JSON.parse(data);
|
|
208
|
-
// OpenAI 流式响应的格式: choices[0].delta.content
|
|
209
67
|
const content = parsed.choices?.[0]?.delta?.content;
|
|
210
|
-
if (content)
|
|
211
|
-
yield content;
|
|
212
|
-
}
|
|
68
|
+
if (content)
|
|
69
|
+
yield content;
|
|
213
70
|
}
|
|
214
71
|
catch { }
|
|
215
72
|
}
|
|
216
73
|
}
|
|
217
74
|
}
|
|
218
|
-
logger.logResponse(url, streamData);
|
|
219
75
|
}
|
|
220
|
-
/**
|
|
221
|
-
* 格式化消息
|
|
222
|
-
*
|
|
223
|
-
* 将内部 ChatMessage 格式转换为 OpenAI API 格式
|
|
224
|
-
*
|
|
225
|
-
* @param message - 内部消息格式
|
|
226
|
-
* @returns {Record<string, any>} OpenAPI API 消息格式
|
|
227
|
-
*/
|
|
228
76
|
formatMessage(message) {
|
|
229
77
|
const formatted = {
|
|
230
78
|
role: message.role,
|
|
231
79
|
content: message.content,
|
|
232
80
|
};
|
|
233
|
-
// 添加可选字段
|
|
234
81
|
if (message.name)
|
|
235
82
|
formatted.name = message.name;
|
|
236
83
|
if (message.toolCallId)
|
|
@@ -239,41 +86,29 @@ export class OpenAIProvider {
|
|
|
239
86
|
formatted.tool_calls = message.toolCalls;
|
|
240
87
|
return formatted;
|
|
241
88
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
*
|
|
245
|
-
* 将 OpenAI API 响应转换为内部 ChatResponse 格式
|
|
246
|
-
*
|
|
247
|
-
* @param data - OpenAI API 响应数据
|
|
248
|
-
* @returns {ChatResponse} 内部响应格式
|
|
249
|
-
*/
|
|
250
|
-
parseResponse(data) {
|
|
251
|
-
// 获取第一个 choice (通常只有一个)
|
|
252
|
-
const choice = data.choices[0];
|
|
89
|
+
parseResponse(response) {
|
|
90
|
+
const choice = response.choices[0];
|
|
253
91
|
const message = choice.message;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
totalTokens: data.usage.total_tokens,
|
|
92
|
+
const responseData = {
|
|
93
|
+
content: message.content || '',
|
|
94
|
+
finishReason: choice.finish_reason,
|
|
95
|
+
usage: response.usage ? {
|
|
96
|
+
promptTokens: response.usage.prompt_tokens,
|
|
97
|
+
completionTokens: response.usage.completion_tokens,
|
|
98
|
+
totalTokens: response.usage.total_tokens,
|
|
262
99
|
} : undefined,
|
|
263
100
|
};
|
|
264
|
-
// ========== 处理工具调用 ==========
|
|
265
|
-
// 如果 AI 调用了工具,解析工具调用信息
|
|
266
101
|
if (message.tool_calls && message.tool_calls.length > 0) {
|
|
267
|
-
|
|
268
|
-
id: tc.id,
|
|
269
|
-
type: 'function',
|
|
102
|
+
responseData.toolCalls = message.tool_calls.map((tc) => ({
|
|
103
|
+
id: tc.id,
|
|
104
|
+
type: 'function',
|
|
270
105
|
function: {
|
|
271
|
-
name: tc.function.name,
|
|
272
|
-
arguments: tc.function.arguments,
|
|
106
|
+
name: tc.function.name,
|
|
107
|
+
arguments: tc.function.arguments,
|
|
273
108
|
},
|
|
274
109
|
}));
|
|
275
110
|
}
|
|
276
|
-
return
|
|
111
|
+
return responseData;
|
|
277
112
|
}
|
|
278
113
|
}
|
|
279
114
|
//# sourceMappingURL=openai.provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../../../src/modules/ai/openai.provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../../../src/modules/ai/openai.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* <thought>我需要读取文件</thought>
|
|
21
21
|
* <action>readFile</action>
|
|
22
22
|
* <action_input>
|
|
23
|
-
* <
|
|
23
|
+
* <file_path>/path/to/file</file_path>
|
|
24
24
|
* </action_input>
|
|
25
25
|
* <keep_context>true</keep_context>
|
|
26
26
|
* </react>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* <thought>需要创建一个组件</thought>
|
|
30
30
|
* <action>write_file</action>
|
|
31
31
|
* <action_input>
|
|
32
|
-
* <
|
|
32
|
+
* <file_path>src/Hello.tsx</file_path>
|
|
33
33
|
* <content><![CDATA[import React from 'react';]]></content>
|
|
34
34
|
* </action_input>
|
|
35
35
|
* </react>
|
|
@@ -40,24 +40,29 @@
|
|
|
40
40
|
* ---
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
import { ReActStep } from './react.types.js';
|
|
43
|
+
import { ReActStep, ParsedBlock } from './react.types.js';
|
|
44
44
|
/**
|
|
45
45
|
* ReActParser 类
|
|
46
46
|
*
|
|
47
47
|
* 将 AI 返回的文本解析为结构化的 ReActStep 数组
|
|
48
48
|
*/
|
|
49
49
|
export declare class ReActParser {
|
|
50
|
-
parse(content: string): {
|
|
50
|
+
parse(content: string): Promise<{
|
|
51
51
|
steps: ReActStep[];
|
|
52
52
|
finalAnswer: string;
|
|
53
|
-
}
|
|
53
|
+
}>;
|
|
54
54
|
private splitBlocks;
|
|
55
55
|
/**
|
|
56
56
|
* 解析 XML 格式的块
|
|
57
57
|
*/
|
|
58
|
-
|
|
58
|
+
parseXMLBlock(content: string): Promise<ParsedBlock | null>;
|
|
59
59
|
/**
|
|
60
|
-
*
|
|
60
|
+
* 用正则表达式解析 XML 格式的块(后备解析器)
|
|
61
|
+
*/
|
|
62
|
+
private parseByRegex;
|
|
63
|
+
private extractValue;
|
|
64
|
+
/**
|
|
65
|
+
* 解析 action_input 参数节点
|
|
61
66
|
*/
|
|
62
67
|
private parseXMLParams;
|
|
63
68
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.parser.d.ts","sourceRoot":"","sources":["../../../../src/modules/ai/react/react.parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"react.parser.d.ts","sourceRoot":"","sources":["../../../../src/modules/ai/react/react.parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAItE;;;;GAIG;AACH,qBAAa,WAAW;IAChB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;YAgDpE,WAAW;IAuDzB;;OAEG;IACU,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA8DxE;;OAEG;IACH,OAAO,CAAC,YAAY;IA8CpB,OAAO,CAAC,YAAY;IASpB;;OAEG;YACW,cAAc;IA0B5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,aAAa;IAUrB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO;IAI3C,iBAAiB,CAAC,WAAW,EAAE,GAAG,GAAG,MAAM;IAO3C,wBAAwB,CAAC,WAAW,EAAE,GAAG,GAAG,MAAM;CAUnD;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|