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.
Files changed (60) hide show
  1. package/dist/cmd/index.js +56 -8
  2. package/dist/cmd/index.js.map +1 -1
  3. package/dist/config/index.d.ts +5 -1
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +22 -4
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/providers.d.ts +5 -10
  8. package/dist/config/providers.d.ts.map +1 -1
  9. package/dist/config/providers.js +152 -78
  10. package/dist/config/providers.js.map +1 -1
  11. package/dist/config/types.d.ts +1 -1
  12. package/dist/config/types.d.ts.map +1 -1
  13. package/dist/llm/anthropic.d.ts +24 -6
  14. package/dist/llm/anthropic.d.ts.map +1 -1
  15. package/dist/llm/anthropic.js +136 -46
  16. package/dist/llm/anthropic.js.map +1 -1
  17. package/dist/llm/gemini.d.ts +4 -4
  18. package/dist/llm/gemini.d.ts.map +1 -1
  19. package/dist/llm/gemini.js +67 -30
  20. package/dist/llm/gemini.js.map +1 -1
  21. package/dist/llm/index.d.ts +10 -23
  22. package/dist/llm/index.d.ts.map +1 -1
  23. package/dist/llm/index.js +73 -78
  24. package/dist/llm/index.js.map +1 -1
  25. package/dist/llm/openai.d.ts +19 -6
  26. package/dist/llm/openai.d.ts.map +1 -1
  27. package/dist/llm/openai.js +86 -35
  28. package/dist/llm/openai.js.map +1 -1
  29. package/dist/llm/provider.d.ts +11 -16
  30. package/dist/llm/provider.d.ts.map +1 -1
  31. package/dist/tui/input.d.ts +0 -1
  32. package/dist/tui/input.d.ts.map +1 -1
  33. package/dist/tui/input.js +2 -5
  34. package/dist/tui/input.js.map +1 -1
  35. package/dist/tui/output.d.ts +27 -12
  36. package/dist/tui/output.d.ts.map +1 -1
  37. package/dist/tui/output.js +176 -40
  38. package/dist/tui/output.js.map +1 -1
  39. package/dist/tui/repl.d.ts +0 -10
  40. package/dist/tui/repl.d.ts.map +1 -1
  41. package/dist/tui/repl.js +76 -42
  42. package/dist/tui/repl.js.map +1 -1
  43. package/dist/tui/welcome.d.ts +2 -8
  44. package/dist/tui/welcome.d.ts.map +1 -1
  45. package/dist/tui/welcome.js +101 -51
  46. package/dist/tui/welcome.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/cmd/index.ts +49 -8
  49. package/src/config/index.ts +21 -4
  50. package/src/config/providers.ts +153 -79
  51. package/src/config/types.ts +11 -5
  52. package/src/llm/anthropic.ts +148 -51
  53. package/src/llm/gemini.ts +81 -39
  54. package/src/llm/index.ts +75 -83
  55. package/src/llm/openai.ts +96 -41
  56. package/src/llm/provider.ts +12 -16
  57. package/src/tui/input.ts +2 -5
  58. package/src/tui/output.ts +193 -40
  59. package/src/tui/repl.ts +82 -43
  60. 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
- * Replaces the monolithic AIEngine with a clean provider abstraction
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
- constructor(provider) {
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
- * Get provider name
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
- return this.getMockResponse(messages);
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
- const mock = this.getMockResponse(messages);
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 providerTools = toolsArray.length > 0 ? this.provider.buildTools(toolsArray) : [];
86
- // Stream the response
69
+ const hasTools = toolsArray.length > 0;
87
70
  let fullContent = '';
88
- const streamOptions = { ...options };
89
- // Add tools to the request if available
90
- if (providerTools.length > 0) {
91
- // We need to pass tools differently depending on provider
92
- // For now, inject into messages context
93
- }
94
- for await (const chunk of this.provider.chatStream(currentMessages, streamOptions)) {
95
- fullContent += chunk;
96
- yield chunk;
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
- // Check for tool calls in the response
99
- const response = await this.provider.chat(currentMessages, { ...streamOptions, stream: false });
100
- const toolCalls = response.tool_calls;
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: toolCalls,
88
+ content: fullContent || '',
89
+ tool_calls: detectedToolCalls,
107
90
  });
108
91
  // Execute each tool
109
- for (const toolCall of toolCalls) {
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: `Tool "${toolCall.function.name}" not found`,
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: result.success ? (result.output || JSON.stringify(result.data)) : (result.error || 'Tool failed'),
113
+ content: output,
126
114
  tool_call_id: toolCall.id,
127
115
  name: toolCall.function.name,
128
116
  });
129
- yield `\n${chalk.gray(`[tool: ${toolCall.function.name}]`)}`;
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: `Tool execution error: ${error.message}`,
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
- continue; // Loop back for next iteration
130
+ yield '\n';
131
+ continue;
141
132
  }
142
- // No tool calls - we're done
143
- return response;
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
- * Check if API key is available
149
- */
150
- hasApiKey() {
151
- return !!this.provider.config?.apiKey;
152
- }
153
- /**
154
- * Mock response when no API key is set
155
- */
156
- getMockResponse(messages) {
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
- else if (last.toLowerCase().includes('who are you')) {
163
- content = 'I am Thatgfsj Code, an AI coding assistant.';
149
+ catch {
150
+ return args.length > 80 ? args.slice(0, 80) + '...' : args;
164
151
  }
165
- else {
166
- content = `I understand you said: "${last.slice(0, 50)}..."\n\nThis is a demo response. Configure an API key for full AI capabilities.\nRun: gfcode init`;
167
- }
168
- return { content, role: 'assistant' };
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,30 @@
1
1
  /**
2
2
  * OpenAI-compatible Provider
3
- * Works with: OpenAI, SiliconFlow, MiniMax (OpenAI mode), DeepSeek, Kimi, ERNIE, Ollama
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
- private config;
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<string, ChatResponse>;
15
- private buildRequest;
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
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,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,GAAG,OAAO,CAAC,YAAY,CAAC;IA4B1E,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;IAsDvG,OAAO,CAAC,YAAY;CAerB"}
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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * OpenAI-compatible Provider
3
- * Works with: OpenAI, SiliconFlow, MiniMax (OpenAI mode), DeepSeek, Kimi, ERNIE, Ollama
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 fetch(`${this.config.baseUrl}/chat/completions`, {
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 fetch(`${this.config.baseUrl}/chat/completions`, {
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(`OpenAI API error ${response.status}: ${text}`);
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 || !trimmed.startsWith('data: ') || trimmed === 'data: [DONE]')
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 content = data.choices?.[0]?.delta?.content;
81
- if (content) {
82
- fullContent += content;
83
- yield content;
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
- return { content: fullContent, role: 'assistant' };
96
- }
97
- buildRequest(messages, stream, options) {
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
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
@@ -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
- * Non-streaming chat completion
12
- */
13
- chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
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;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5E;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEjG;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,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"}
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"}
@@ -1,6 +1,5 @@
1
1
  /**
2
2
  * REPL Input Handler
3
- * Migrated from old src/repl/input.ts
4
3
  */
5
4
  export declare class REPLInput {
6
5
  private rl;
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAc;;IA2B5B,MAAM,CAAC,MAAM,GAAE,MAA4B,GAAG,OAAO,CAAC,MAAM,CAAC;IAQnE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;CAKlB"}
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\n👋 Exiting...\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.green('\n> ')) {
31
+ async prompt(prefix = chalk.cyan(' ')) {
35
32
  return new Promise((resolve) => {
36
33
  this.rl.question(prefix, (answer) => {
37
34
  resolve(answer);
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAAA;;;GAGG;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,gBAAgB;QAChB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,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,KAAK,CAAC,MAAM,CAAC;QAC/C,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"}
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"}