thatgfsj-code 0.3.0 → 0.4.1
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/dist/cmd/index.js +56 -8
- package/dist/cmd/index.js.map +1 -1
- package/dist/config/index.d.ts +5 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +22 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/providers.d.ts +5 -10
- package/dist/config/providers.d.ts.map +1 -1
- package/dist/config/providers.js +152 -78
- package/dist/config/providers.js.map +1 -1
- package/dist/config/types.d.ts +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/llm/anthropic.d.ts +24 -6
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +136 -46
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/gemini.d.ts +4 -4
- package/dist/llm/gemini.d.ts.map +1 -1
- package/dist/llm/gemini.js +67 -30
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/index.d.ts +10 -23
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +73 -78
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/openai.d.ts +19 -6
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +86 -35
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/provider.d.ts +11 -16
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/tui/input.d.ts +0 -1
- package/dist/tui/input.d.ts.map +1 -1
- package/dist/tui/input.js +2 -5
- package/dist/tui/input.js.map +1 -1
- package/dist/tui/output.d.ts +27 -12
- package/dist/tui/output.d.ts.map +1 -1
- package/dist/tui/output.js +176 -40
- package/dist/tui/output.js.map +1 -1
- package/dist/tui/repl.d.ts +0 -10
- package/dist/tui/repl.d.ts.map +1 -1
- package/dist/tui/repl.js +76 -42
- package/dist/tui/repl.js.map +1 -1
- package/dist/tui/welcome.d.ts +2 -8
- package/dist/tui/welcome.d.ts.map +1 -1
- package/dist/tui/welcome.js +101 -51
- package/dist/tui/welcome.js.map +1 -1
- package/package.json +1 -1
- package/src/cmd/index.ts +49 -8
- package/src/config/index.ts +21 -4
- package/src/config/providers.ts +153 -79
- package/src/config/types.ts +11 -5
- package/src/llm/anthropic.ts +148 -51
- package/src/llm/gemini.ts +81 -39
- package/src/llm/index.ts +75 -83
- package/src/llm/openai.ts +96 -41
- package/src/llm/provider.ts +12 -16
- package/src/tui/input.ts +2 -5
- package/src/tui/output.ts +193 -40
- package/src/tui/repl.ts +82 -43
- package/src/tui/welcome.ts +110 -53
package/dist/llm/index.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LLM Service - Factory for creating providers
|
|
3
|
-
*
|
|
3
|
+
* Supports all providers + custom relay stations (中转站)
|
|
4
4
|
*/
|
|
5
|
-
import chalk from 'chalk';
|
|
6
5
|
import { PROVIDERS } from '../config/providers.js';
|
|
7
6
|
import { OpenAIProvider } from './openai.js';
|
|
8
7
|
import { AnthropicProvider } from './anthropic.js';
|
|
@@ -10,12 +9,11 @@ import { GeminiProvider } from './gemini.js';
|
|
|
10
9
|
export class LLMService {
|
|
11
10
|
provider;
|
|
12
11
|
tools = new Map();
|
|
13
|
-
|
|
12
|
+
apiKey;
|
|
13
|
+
constructor(provider, apiKey) {
|
|
14
14
|
this.provider = provider;
|
|
15
|
+
this.apiKey = apiKey;
|
|
15
16
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Create LLMService from AIConfig
|
|
18
|
-
*/
|
|
19
17
|
static fromConfig(config) {
|
|
20
18
|
const providerName = config.provider || 'siliconflow';
|
|
21
19
|
const providerConfig = PROVIDERS[providerName];
|
|
@@ -38,134 +36,131 @@ export class LLMService {
|
|
|
38
36
|
default:
|
|
39
37
|
provider = new OpenAIProvider(providerCfg);
|
|
40
38
|
}
|
|
41
|
-
return new LLMService(provider);
|
|
39
|
+
return new LLMService(provider, providerCfg.apiKey);
|
|
42
40
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Register tools for function calling
|
|
45
|
-
*/
|
|
46
41
|
registerTools(tools) {
|
|
47
42
|
for (const tool of tools) {
|
|
48
43
|
this.tools.set(tool.name, tool);
|
|
49
44
|
}
|
|
50
45
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
*/
|
|
54
|
-
getProviderName() {
|
|
55
|
-
return this.provider.name;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Non-streaming chat
|
|
59
|
-
*/
|
|
46
|
+
getProviderName() { return this.provider.name; }
|
|
47
|
+
hasApiKey() { return !!this.apiKey; }
|
|
60
48
|
async chat(messages, options) {
|
|
61
|
-
if (!this.hasApiKey())
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return this.provider.chat(messages, options);
|
|
49
|
+
if (!this.hasApiKey())
|
|
50
|
+
throw new Error(this.getNoKeyMessage());
|
|
51
|
+
const toolsArray = [...this.tools.values()];
|
|
52
|
+
return this.provider.chat(messages, options, toolsArray.length > 0 ? toolsArray : undefined);
|
|
65
53
|
}
|
|
66
54
|
/**
|
|
67
55
|
* Streaming chat with agent loop (tool call support)
|
|
56
|
+
* - Streams text to the user
|
|
57
|
+
* - Detects structured tool calls from the API
|
|
58
|
+
* - Executes tools and loops back for more
|
|
68
59
|
*/
|
|
69
60
|
async *chatStream(messages, options) {
|
|
70
|
-
if (!this.hasApiKey())
|
|
71
|
-
|
|
72
|
-
for (const char of mock.content) {
|
|
73
|
-
await new Promise(r => setTimeout(r, 10));
|
|
74
|
-
yield char;
|
|
75
|
-
}
|
|
76
|
-
return mock;
|
|
77
|
-
}
|
|
61
|
+
if (!this.hasApiKey())
|
|
62
|
+
throw new Error(this.getNoKeyMessage());
|
|
78
63
|
const maxIterations = options?.maxIterations ?? 10;
|
|
79
64
|
let currentMessages = [...messages];
|
|
80
65
|
let iterations = 0;
|
|
81
66
|
while (iterations < maxIterations) {
|
|
82
67
|
iterations++;
|
|
83
|
-
// Get tools in provider format
|
|
84
68
|
const toolsArray = [...this.tools.values()];
|
|
85
|
-
const
|
|
86
|
-
// Stream the response
|
|
69
|
+
const hasTools = toolsArray.length > 0;
|
|
87
70
|
let fullContent = '';
|
|
88
|
-
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
71
|
+
let detectedToolCalls;
|
|
72
|
+
// Stream the response, passing tools so the API knows about them
|
|
73
|
+
const stream = this.provider.chatStream(currentMessages, options, hasTools ? toolsArray : undefined);
|
|
74
|
+
for await (const chunk of stream) {
|
|
75
|
+
if (chunk.type === 'text' && chunk.content) {
|
|
76
|
+
fullContent += chunk.content;
|
|
77
|
+
yield chunk.content;
|
|
78
|
+
}
|
|
79
|
+
else if (chunk.type === 'tool_calls' && chunk.toolCalls) {
|
|
80
|
+
detectedToolCalls = chunk.toolCalls;
|
|
81
|
+
}
|
|
97
82
|
}
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (toolCalls && toolCalls.length > 0) {
|
|
102
|
-
// Append assistant message with tool calls
|
|
83
|
+
// If we got tool calls, execute them and loop
|
|
84
|
+
if (detectedToolCalls && detectedToolCalls.length > 0) {
|
|
85
|
+
// Add assistant message with tool calls
|
|
103
86
|
currentMessages.push({
|
|
104
87
|
role: 'assistant',
|
|
105
|
-
content: fullContent,
|
|
106
|
-
tool_calls:
|
|
88
|
+
content: fullContent || '',
|
|
89
|
+
tool_calls: detectedToolCalls,
|
|
107
90
|
});
|
|
108
91
|
// Execute each tool
|
|
109
|
-
for (const toolCall of
|
|
92
|
+
for (const toolCall of detectedToolCalls) {
|
|
110
93
|
const tool = this.tools.get(toolCall.function.name);
|
|
94
|
+
// Yield structured tool call as JSON line
|
|
95
|
+
yield `\n@@TOOL@@${JSON.stringify({ action: 'call', name: toolCall.function.name, args: toolCall.function.arguments })}\n`;
|
|
111
96
|
if (!tool) {
|
|
97
|
+
const errMsg = `Tool "${toolCall.function.name}" not found`;
|
|
112
98
|
currentMessages.push({
|
|
113
99
|
role: 'tool',
|
|
114
|
-
content:
|
|
100
|
+
content: errMsg,
|
|
115
101
|
tool_call_id: toolCall.id,
|
|
116
102
|
name: toolCall.function.name,
|
|
117
103
|
});
|
|
104
|
+
yield `@@TOOL@@${JSON.stringify({ action: 'result', error: errMsg })}\n`;
|
|
118
105
|
continue;
|
|
119
106
|
}
|
|
120
107
|
try {
|
|
121
108
|
const params = JSON.parse(toolCall.function.arguments || '{}');
|
|
122
109
|
const result = await tool.execute(params);
|
|
110
|
+
const output = result.success ? (result.output || JSON.stringify(result.data)) : (result.error || 'Tool failed');
|
|
123
111
|
currentMessages.push({
|
|
124
112
|
role: 'tool',
|
|
125
|
-
content:
|
|
113
|
+
content: output,
|
|
126
114
|
tool_call_id: toolCall.id,
|
|
127
115
|
name: toolCall.function.name,
|
|
128
116
|
});
|
|
129
|
-
yield
|
|
117
|
+
yield `@@TOOL@@${JSON.stringify({ action: 'result', output })}\n`;
|
|
130
118
|
}
|
|
131
119
|
catch (error) {
|
|
120
|
+
const errMsg = `Error: ${error.message}`;
|
|
132
121
|
currentMessages.push({
|
|
133
122
|
role: 'tool',
|
|
134
|
-
content:
|
|
123
|
+
content: errMsg,
|
|
135
124
|
tool_call_id: toolCall.id,
|
|
136
125
|
name: toolCall.function.name,
|
|
137
126
|
});
|
|
127
|
+
yield `@@TOOL@@${JSON.stringify({ action: 'result', error: errMsg })}\n`;
|
|
138
128
|
}
|
|
139
129
|
}
|
|
140
|
-
|
|
130
|
+
yield '\n';
|
|
131
|
+
continue;
|
|
141
132
|
}
|
|
142
|
-
// No tool calls -
|
|
143
|
-
return
|
|
133
|
+
// No tool calls - done
|
|
134
|
+
return { content: fullContent, role: 'assistant' };
|
|
144
135
|
}
|
|
145
136
|
return { content: '[Agent loop exceeded maximum iterations]', role: 'assistant' };
|
|
146
137
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const last = messages[messages.length - 1]?.content || '';
|
|
158
|
-
let content;
|
|
159
|
-
if (/^(hi|hello|hey)/i.test(last)) {
|
|
160
|
-
content = 'Hi there! How can I help you today?';
|
|
138
|
+
truncateArgs(args) {
|
|
139
|
+
try {
|
|
140
|
+
const obj = JSON.parse(args || '{}');
|
|
141
|
+
const entries = Object.entries(obj);
|
|
142
|
+
if (entries.length === 0)
|
|
143
|
+
return '';
|
|
144
|
+
return entries.map(([k, v]) => {
|
|
145
|
+
const val = typeof v === 'string' && v.length > 50 ? v.slice(0, 50) + '...' : v;
|
|
146
|
+
return `${k}: ${JSON.stringify(val)}`;
|
|
147
|
+
}).join(', ');
|
|
161
148
|
}
|
|
162
|
-
|
|
163
|
-
|
|
149
|
+
catch {
|
|
150
|
+
return args.length > 80 ? args.slice(0, 80) + '...' : args;
|
|
164
151
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
152
|
+
}
|
|
153
|
+
getNoKeyMessage() {
|
|
154
|
+
return [
|
|
155
|
+
'❌ 未配置 API Key,无法调用 AI。',
|
|
156
|
+
'',
|
|
157
|
+
'请先运行: gfcode init',
|
|
158
|
+
'',
|
|
159
|
+
'或设置环境变量:',
|
|
160
|
+
' export SILICONFLOW_API_KEY="sk-..."',
|
|
161
|
+
' export OPENAI_API_KEY="sk-..."',
|
|
162
|
+
' export DEEPSEEK_API_KEY="sk-..."',
|
|
163
|
+
].join('\n');
|
|
169
164
|
}
|
|
170
165
|
}
|
|
171
166
|
export { OpenAIProvider } from './openai.js';
|
package/dist/llm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/openai.d.ts
CHANGED
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenAI-compatible Provider
|
|
3
|
-
* Works with: OpenAI, SiliconFlow,
|
|
3
|
+
* Works with: OpenAI, SiliconFlow, DeepSeek, Kimi, Zhipu, MiniMax, Baichuan, Stepfun, Doubao, Ollama, ERNIE
|
|
4
|
+
* Also works with any OpenAI-compatible relay station (中转站)
|
|
4
5
|
*/
|
|
5
|
-
import type { ChatMessage, ChatResponse, ChatOptions } from '../types.js';
|
|
6
|
+
import type { ChatMessage, ChatResponse, ChatOptions, ToolCall } from '../types.js';
|
|
6
7
|
import type { Tool } from '../tools/types.js';
|
|
7
8
|
import type { LLMProvider, ProviderConfig } from './provider.js';
|
|
9
|
+
export interface StreamChunk {
|
|
10
|
+
type: 'text' | 'tool_calls';
|
|
11
|
+
content?: string;
|
|
12
|
+
toolCalls?: ToolCall[];
|
|
13
|
+
}
|
|
8
14
|
export declare class OpenAIProvider implements LLMProvider {
|
|
9
15
|
readonly name = "openai";
|
|
10
|
-
|
|
16
|
+
protected config: ProviderConfig;
|
|
11
17
|
constructor(config: ProviderConfig);
|
|
12
18
|
buildTools(tools: Tool[]): any[];
|
|
13
|
-
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
14
|
-
chatStream(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<
|
|
15
|
-
|
|
19
|
+
chat(messages: ChatMessage[], options?: ChatOptions, tools?: Tool[]): Promise<ChatResponse>;
|
|
20
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions, tools?: Tool[]): AsyncGenerator<StreamChunk, ChatResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Build the request body for OpenAI-compatible API
|
|
23
|
+
*/
|
|
24
|
+
protected buildRequest(messages: ChatMessage[], stream: boolean, options?: ChatOptions, tools?: Tool[]): any;
|
|
25
|
+
/**
|
|
26
|
+
* Execute the HTTP request
|
|
27
|
+
*/
|
|
28
|
+
protected doRequest(body: any): Promise<Response>;
|
|
16
29
|
}
|
|
17
30
|
//# sourceMappingURL=openai.d.ts.map
|
package/dist/llm/openai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;gBAErB,MAAM,EAAE,cAAc;IAIlC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE;IAiB1B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB1F,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC;IAsF5H;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;IAwBtG;;OAEG;cACa,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAWxD"}
|
package/dist/llm/openai.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenAI-compatible Provider
|
|
3
|
-
* Works with: OpenAI, SiliconFlow,
|
|
3
|
+
* Works with: OpenAI, SiliconFlow, DeepSeek, Kimi, Zhipu, MiniMax, Baichuan, Stepfun, Doubao, Ollama, ERNIE
|
|
4
|
+
* Also works with any OpenAI-compatible relay station (中转站)
|
|
4
5
|
*/
|
|
5
6
|
export class OpenAIProvider {
|
|
6
7
|
name = 'openai';
|
|
@@ -22,47 +23,35 @@ export class OpenAIProvider {
|
|
|
22
23
|
},
|
|
23
24
|
}));
|
|
24
25
|
}
|
|
25
|
-
async chat(messages, options) {
|
|
26
|
-
const body = this.buildRequest(messages, false, options);
|
|
27
|
-
const response = await
|
|
28
|
-
method: 'POST',
|
|
29
|
-
headers: {
|
|
30
|
-
'Content-Type': 'application/json',
|
|
31
|
-
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
32
|
-
},
|
|
33
|
-
body: JSON.stringify(body),
|
|
34
|
-
});
|
|
35
|
-
if (!response.ok) {
|
|
36
|
-
const text = await response.text().catch(() => '');
|
|
37
|
-
throw new Error(`OpenAI API error ${response.status}: ${text}`);
|
|
38
|
-
}
|
|
26
|
+
async chat(messages, options, tools) {
|
|
27
|
+
const body = this.buildRequest(messages, false, options, tools);
|
|
28
|
+
const response = await this.doRequest(body);
|
|
39
29
|
const data = await response.json();
|
|
40
30
|
const choice = data.choices?.[0];
|
|
41
31
|
return {
|
|
42
32
|
content: choice?.message?.content || '',
|
|
43
33
|
role: 'assistant',
|
|
44
|
-
usage: data.usage
|
|
34
|
+
usage: data.usage ? {
|
|
35
|
+
prompt_tokens: data.usage.prompt_tokens || 0,
|
|
36
|
+
completion_tokens: data.usage.completion_tokens || 0,
|
|
37
|
+
total_tokens: data.usage.total_tokens || 0,
|
|
38
|
+
} : undefined,
|
|
45
39
|
tool_calls: choice?.message?.tool_calls,
|
|
46
40
|
};
|
|
47
41
|
}
|
|
48
|
-
async *chatStream(messages, options) {
|
|
49
|
-
const body = this.buildRequest(messages, true, options);
|
|
50
|
-
const response = await
|
|
51
|
-
method: 'POST',
|
|
52
|
-
headers: {
|
|
53
|
-
'Content-Type': 'application/json',
|
|
54
|
-
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
55
|
-
},
|
|
56
|
-
body: JSON.stringify(body),
|
|
57
|
-
});
|
|
42
|
+
async *chatStream(messages, options, tools) {
|
|
43
|
+
const body = this.buildRequest(messages, true, options, tools);
|
|
44
|
+
const response = await this.doRequest(body);
|
|
58
45
|
if (!response.ok || !response.body) {
|
|
59
46
|
const text = await response.text().catch(() => '');
|
|
60
|
-
throw new Error(`
|
|
47
|
+
throw new Error(`API error ${response.status}: ${text}`);
|
|
61
48
|
}
|
|
62
49
|
const reader = response.body.getReader();
|
|
63
50
|
const decoder = new TextDecoder();
|
|
64
51
|
let fullContent = '';
|
|
65
52
|
let buffer = '';
|
|
53
|
+
// Accumulate streaming tool call chunks
|
|
54
|
+
const toolCallBuffers = new Map();
|
|
66
55
|
try {
|
|
67
56
|
while (true) {
|
|
68
57
|
const { done, value } = await reader.read();
|
|
@@ -73,14 +62,35 @@ export class OpenAIProvider {
|
|
|
73
62
|
buffer = lines.pop() || '';
|
|
74
63
|
for (const line of lines) {
|
|
75
64
|
const trimmed = line.trim();
|
|
76
|
-
if (!trimmed
|
|
65
|
+
if (!trimmed)
|
|
66
|
+
continue;
|
|
67
|
+
if (trimmed === 'data: [DONE]')
|
|
68
|
+
continue;
|
|
69
|
+
if (!trimmed.startsWith('data: '))
|
|
77
70
|
continue;
|
|
78
71
|
try {
|
|
79
72
|
const data = JSON.parse(trimmed.slice(6));
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
const delta = data.choices?.[0]?.delta;
|
|
74
|
+
// Text content
|
|
75
|
+
if (delta?.content) {
|
|
76
|
+
fullContent += delta.content;
|
|
77
|
+
yield { type: 'text', content: delta.content };
|
|
78
|
+
}
|
|
79
|
+
// Streaming tool calls - accumulate chunks
|
|
80
|
+
if (delta?.tool_calls) {
|
|
81
|
+
for (const tc of delta.tool_calls) {
|
|
82
|
+
const idx = tc.index ?? 0;
|
|
83
|
+
if (!toolCallBuffers.has(idx)) {
|
|
84
|
+
toolCallBuffers.set(idx, { id: '', name: '', arguments: '' });
|
|
85
|
+
}
|
|
86
|
+
const buf = toolCallBuffers.get(idx);
|
|
87
|
+
if (tc.id)
|
|
88
|
+
buf.id = tc.id;
|
|
89
|
+
if (tc.function?.name)
|
|
90
|
+
buf.name += tc.function.name;
|
|
91
|
+
if (tc.function?.arguments)
|
|
92
|
+
buf.arguments += tc.function.arguments;
|
|
93
|
+
}
|
|
84
94
|
}
|
|
85
95
|
}
|
|
86
96
|
catch {
|
|
@@ -92,10 +102,31 @@ export class OpenAIProvider {
|
|
|
92
102
|
finally {
|
|
93
103
|
reader.releaseLock();
|
|
94
104
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
// Convert accumulated tool call buffers to ToolCall[]
|
|
106
|
+
const toolCalls = [];
|
|
107
|
+
for (const [, buf] of toolCallBuffers) {
|
|
108
|
+
if (buf.id && buf.name) {
|
|
109
|
+
toolCalls.push({
|
|
110
|
+
id: buf.id,
|
|
111
|
+
type: 'function',
|
|
112
|
+
function: { name: buf.name, arguments: buf.arguments },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (toolCalls.length > 0) {
|
|
117
|
+
yield { type: 'tool_calls', toolCalls };
|
|
118
|
+
}
|
|
98
119
|
return {
|
|
120
|
+
content: fullContent,
|
|
121
|
+
role: 'assistant',
|
|
122
|
+
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build the request body for OpenAI-compatible API
|
|
127
|
+
*/
|
|
128
|
+
buildRequest(messages, stream, options, tools) {
|
|
129
|
+
const body = {
|
|
99
130
|
model: this.config.model,
|
|
100
131
|
messages: messages.map(m => ({
|
|
101
132
|
role: m.role,
|
|
@@ -107,7 +138,27 @@ export class OpenAIProvider {
|
|
|
107
138
|
temperature: options?.temperature ?? this.config.temperature,
|
|
108
139
|
max_tokens: options?.maxTokens ?? this.config.maxTokens,
|
|
109
140
|
stream,
|
|
141
|
+
...(stream && { stream_options: { include_usage: true } }),
|
|
110
142
|
};
|
|
143
|
+
// Add tools if provided - this is critical for structured tool calling
|
|
144
|
+
if (tools && tools.length > 0) {
|
|
145
|
+
body.tools = this.buildTools(tools);
|
|
146
|
+
}
|
|
147
|
+
return body;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Execute the HTTP request
|
|
151
|
+
*/
|
|
152
|
+
async doRequest(body) {
|
|
153
|
+
const url = `${this.config.baseUrl}/chat/completions`;
|
|
154
|
+
return fetch(url, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: {
|
|
157
|
+
'Content-Type': 'application/json',
|
|
158
|
+
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
159
|
+
},
|
|
160
|
+
body: JSON.stringify(body),
|
|
161
|
+
});
|
|
111
162
|
}
|
|
112
163
|
}
|
|
113
164
|
//# sourceMappingURL=openai.js.map
|
package/dist/llm/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/provider.d.ts
CHANGED
|
@@ -2,27 +2,22 @@
|
|
|
2
2
|
* Abstract LLM Provider interface
|
|
3
3
|
* All providers implement this interface
|
|
4
4
|
*/
|
|
5
|
-
import type { ChatMessage, ChatResponse, ChatOptions } from '../types.js';
|
|
5
|
+
import type { ChatMessage, ChatResponse, ChatOptions, ToolCall } from '../types.js';
|
|
6
6
|
import type { Tool } from '../tools/types.js';
|
|
7
|
+
export interface StreamChunk {
|
|
8
|
+
type: 'text' | 'tool_calls';
|
|
9
|
+
content?: string;
|
|
10
|
+
toolCalls?: ToolCall[];
|
|
11
|
+
}
|
|
7
12
|
export interface LLMProvider {
|
|
8
|
-
/** Provider name for logging */
|
|
9
13
|
readonly name: string;
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Streaming chat completion - yields text chunks
|
|
16
|
-
*/
|
|
17
|
-
chatStream(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<string, ChatResponse>;
|
|
18
|
-
/**
|
|
19
|
-
* Convert Tool[] to provider-specific format
|
|
20
|
-
*/
|
|
14
|
+
/** Non-streaming chat with optional tools */
|
|
15
|
+
chat(messages: ChatMessage[], options?: ChatOptions, tools?: Tool[]): Promise<ChatResponse>;
|
|
16
|
+
/** Streaming chat with optional tools - yields StreamChunks */
|
|
17
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions, tools?: Tool[]): AsyncGenerator<StreamChunk, ChatResponse>;
|
|
18
|
+
/** Convert Tool[] to provider-specific format */
|
|
21
19
|
buildTools(tools: Tool[]): any[];
|
|
22
20
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Provider configuration passed to each provider
|
|
25
|
-
*/
|
|
26
21
|
export interface ProviderConfig {
|
|
27
22
|
apiKey: string;
|
|
28
23
|
model: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5F,+DAA+D;IAC/D,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEtH,iDAAiD;IACjD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/tui/input.d.ts
CHANGED
package/dist/tui/input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAc;;IAyB5B,MAAM,CAAC,MAAM,GAAE,MAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQhE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;CAKlB"}
|
package/dist/tui/input.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* REPL Input Handler
|
|
3
|
-
* Migrated from old src/repl/input.ts
|
|
4
3
|
*/
|
|
5
4
|
import readline from 'readline';
|
|
6
5
|
import chalk from 'chalk';
|
|
@@ -16,12 +15,10 @@ export class REPLInput {
|
|
|
16
15
|
historySize: 100,
|
|
17
16
|
tabSize: 4,
|
|
18
17
|
});
|
|
19
|
-
// Handle Ctrl+C
|
|
20
18
|
this.rl.on('SIGINT', () => {
|
|
21
|
-
process.stdout.write(chalk.gray('\n
|
|
19
|
+
process.stdout.write(chalk.gray('\n Goodbye! 👋\n'));
|
|
22
20
|
process.exit(0);
|
|
23
21
|
});
|
|
24
|
-
// Track history
|
|
25
22
|
this.rl.on('line', (line) => {
|
|
26
23
|
if (line.trim()) {
|
|
27
24
|
this.history.push(line);
|
|
@@ -31,7 +28,7 @@ export class REPLInput {
|
|
|
31
28
|
this.historyIndex = this.history.length;
|
|
32
29
|
});
|
|
33
30
|
}
|
|
34
|
-
async prompt(prefix = chalk.
|
|
31
|
+
async prompt(prefix = chalk.cyan('❯ ')) {
|
|
35
32
|
return new Promise((resolve) => {
|
|
36
33
|
this.rl.question(prefix, (answer) => {
|
|
37
34
|
resolve(answer);
|
package/dist/tui/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,SAAS;IACZ,EAAE,CAAqB;IACvB,OAAO,GAAa,EAAE,CAAC;IACvB,YAAY,GAAW,CAAC,CAAC,CAAC;IAElC;QACE,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;oBAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;gBAClC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;CACF"}
|