@alexnetrebskii/hive-agent 2.40.0 → 2.42.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 +17 -1
- package/dist/providers/llm/openai.d.ts +46 -1
- package/dist/providers/llm/openai.d.ts.map +1 -1
- package/dist/providers/llm/openai.js +159 -21
- package/dist/providers/llm/openai.js.map +1 -1
- package/dist/providers/llm/openai.test.d.ts +2 -0
- package/dist/providers/llm/openai.test.d.ts.map +1 -0
- package/dist/providers/llm/openai.test.js +507 -0
- package/dist/providers/llm/openai.test.js.map +1 -0
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +46 -8
- package/dist/tools/tasks.js.map +1 -1
- package/dist/trace/pricing.d.ts.map +1 -1
- package/dist/trace/pricing.js +9 -0
- package/dist/trace/pricing.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { OpenAIProvider } from './openai.js';
|
|
3
|
+
import { isTransientError } from './fallback.js';
|
|
4
|
+
function jsonResponse(body, status = 200) {
|
|
5
|
+
return new Response(JSON.stringify(body), {
|
|
6
|
+
status,
|
|
7
|
+
headers: { 'Content-Type': 'application/json' }
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function textResponse(body, status, statusText = '') {
|
|
11
|
+
return new Response(body, {
|
|
12
|
+
status,
|
|
13
|
+
statusText,
|
|
14
|
+
headers: { 'Content-Type': 'text/plain' }
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function okChoice(opts = {}) {
|
|
18
|
+
const promptTokens = opts.prompt_tokens ?? 100;
|
|
19
|
+
const completionTokens = opts.completion_tokens ?? 20;
|
|
20
|
+
const usage = {
|
|
21
|
+
prompt_tokens: promptTokens,
|
|
22
|
+
completion_tokens: completionTokens,
|
|
23
|
+
total_tokens: promptTokens + completionTokens
|
|
24
|
+
};
|
|
25
|
+
if (opts.cached_tokens !== undefined || opts.cache_write_tokens !== undefined) {
|
|
26
|
+
usage.prompt_tokens_details = {
|
|
27
|
+
cached_tokens: opts.cached_tokens ?? 0,
|
|
28
|
+
cache_write_tokens: opts.cache_write_tokens ?? 0
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
id: 'resp',
|
|
33
|
+
choices: [
|
|
34
|
+
{
|
|
35
|
+
message: {
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
content: opts.content ?? null,
|
|
38
|
+
tool_calls: opts.tool_calls?.map(tc => ({
|
|
39
|
+
id: tc.id,
|
|
40
|
+
type: 'function',
|
|
41
|
+
function: { name: tc.name, arguments: JSON.stringify(tc.args ?? {}) }
|
|
42
|
+
}))
|
|
43
|
+
},
|
|
44
|
+
finish_reason: opts.finish_reason
|
|
45
|
+
?? (opts.tool_calls && opts.tool_calls.length > 0 ? 'tool_calls' : 'stop')
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
usage
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const dummyTool = {
|
|
52
|
+
name: 'search',
|
|
53
|
+
description: 'search things',
|
|
54
|
+
input_schema: { type: 'object', properties: { q: { type: 'string' } } }
|
|
55
|
+
};
|
|
56
|
+
describe('OpenAIProvider — construction', () => {
|
|
57
|
+
it('throws when apiKey is missing and OPENAI_API_KEY is unset', () => {
|
|
58
|
+
const prev = process.env.OPENAI_API_KEY;
|
|
59
|
+
delete process.env.OPENAI_API_KEY;
|
|
60
|
+
try {
|
|
61
|
+
expect(() => new OpenAIProvider()).toThrow(/openai API key is required/);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (prev !== undefined)
|
|
65
|
+
process.env.OPENAI_API_KEY = prev;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
it('error message includes the vendor name', () => {
|
|
69
|
+
expect(() => new OpenAIProvider({ vendor: 'groq' })).toThrow(/groq API key is required/);
|
|
70
|
+
});
|
|
71
|
+
it('reads apiKey from process.env.OPENAI_API_KEY', () => {
|
|
72
|
+
const prev = process.env.OPENAI_API_KEY;
|
|
73
|
+
process.env.OPENAI_API_KEY = 'env-key';
|
|
74
|
+
try {
|
|
75
|
+
const p = new OpenAIProvider();
|
|
76
|
+
expect(p.getModelId()).toBe('openai:gpt-4o');
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
if (prev !== undefined)
|
|
80
|
+
process.env.OPENAI_API_KEY = prev;
|
|
81
|
+
else
|
|
82
|
+
delete process.env.OPENAI_API_KEY;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('OpenAIProvider — getModelId', () => {
|
|
87
|
+
it('default vendor is openai', () => {
|
|
88
|
+
const p = new OpenAIProvider({ apiKey: 'k', model: 'gpt-4o-mini' });
|
|
89
|
+
expect(p.getModelId()).toBe('openai:gpt-4o-mini');
|
|
90
|
+
});
|
|
91
|
+
it('returns ${vendor}:${model}', () => {
|
|
92
|
+
const p = new OpenAIProvider({ apiKey: 'k', model: 'm', vendor: 'groq' });
|
|
93
|
+
expect(p.getModelId()).toBe('groq:m');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('OpenAIProvider — vendor presets', () => {
|
|
97
|
+
it('groq preset sets baseURL, vendor, default model', () => {
|
|
98
|
+
const p = OpenAIProvider.groq({ apiKey: 'k' });
|
|
99
|
+
expect(p.getModelId()).toBe('groq:llama-3.3-70b-versatile');
|
|
100
|
+
});
|
|
101
|
+
it('together preset', () => {
|
|
102
|
+
const p = OpenAIProvider.together({ apiKey: 'k' });
|
|
103
|
+
expect(p.getModelId()).toMatch(/^together:/);
|
|
104
|
+
});
|
|
105
|
+
it('fireworks preset', () => {
|
|
106
|
+
const p = OpenAIProvider.fireworks({ apiKey: 'k' });
|
|
107
|
+
expect(p.getModelId()).toMatch(/^fireworks:/);
|
|
108
|
+
});
|
|
109
|
+
it('deepseek preset', () => {
|
|
110
|
+
const p = OpenAIProvider.deepseek({ apiKey: 'k' });
|
|
111
|
+
expect(p.getModelId()).toBe('deepseek:deepseek-chat');
|
|
112
|
+
});
|
|
113
|
+
it('xai preset', () => {
|
|
114
|
+
const p = OpenAIProvider.xai({ apiKey: 'k' });
|
|
115
|
+
expect(p.getModelId()).toBe('xai:grok-2');
|
|
116
|
+
});
|
|
117
|
+
it('preset apiKey falls back to vendor-specific env var', () => {
|
|
118
|
+
const prev = process.env.GROQ_API_KEY;
|
|
119
|
+
process.env.GROQ_API_KEY = 'groq-env';
|
|
120
|
+
try {
|
|
121
|
+
const p = OpenAIProvider.groq();
|
|
122
|
+
expect(p.getModelId()).toBe('groq:llama-3.3-70b-versatile');
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
if (prev !== undefined)
|
|
126
|
+
process.env.GROQ_API_KEY = prev;
|
|
127
|
+
else
|
|
128
|
+
delete process.env.GROQ_API_KEY;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
it('explicit model overrides preset default', () => {
|
|
132
|
+
const p = OpenAIProvider.groq({ apiKey: 'k', model: 'mixtral-8x7b' });
|
|
133
|
+
expect(p.getModelId()).toBe('groq:mixtral-8x7b');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('OpenAIProvider.ollama', () => {
|
|
137
|
+
beforeEach(() => {
|
|
138
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
139
|
+
});
|
|
140
|
+
afterEach(() => {
|
|
141
|
+
vi.unstubAllGlobals();
|
|
142
|
+
});
|
|
143
|
+
it('does not require an explicit apiKey', () => {
|
|
144
|
+
expect(() => OpenAIProvider.ollama({ model: 'llama3.2' })).not.toThrow();
|
|
145
|
+
});
|
|
146
|
+
it('sets vendor and namespaces getModelId', () => {
|
|
147
|
+
const p = OpenAIProvider.ollama({ model: 'llama3.2' });
|
|
148
|
+
expect(p.getModelId()).toBe('ollama:llama3.2');
|
|
149
|
+
});
|
|
150
|
+
it('hits localhost:11434/v1 by default', async () => {
|
|
151
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
152
|
+
const p = OpenAIProvider.ollama({ model: 'llama3.2' });
|
|
153
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
154
|
+
const url = vi.mocked(fetch).mock.calls[0][0];
|
|
155
|
+
expect(url).toBe('http://localhost:11434/v1/chat/completions');
|
|
156
|
+
});
|
|
157
|
+
it('appends /v1 when OLLAMA_HOST is set without it', async () => {
|
|
158
|
+
const prev = process.env.OLLAMA_HOST;
|
|
159
|
+
process.env.OLLAMA_HOST = 'http://192.168.1.5:11434';
|
|
160
|
+
try {
|
|
161
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
162
|
+
const p = OpenAIProvider.ollama({ model: 'llama3.2' });
|
|
163
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
164
|
+
const url = vi.mocked(fetch).mock.calls[0][0];
|
|
165
|
+
expect(url).toBe('http://192.168.1.5:11434/v1/chat/completions');
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (prev !== undefined)
|
|
169
|
+
process.env.OLLAMA_HOST = prev;
|
|
170
|
+
else
|
|
171
|
+
delete process.env.OLLAMA_HOST;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
it('does NOT double-append /v1 when OLLAMA_HOST already includes it', async () => {
|
|
175
|
+
const prev = process.env.OLLAMA_HOST;
|
|
176
|
+
process.env.OLLAMA_HOST = 'http://localhost:11434/v1';
|
|
177
|
+
try {
|
|
178
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
179
|
+
const p = OpenAIProvider.ollama({ model: 'qwen2.5' });
|
|
180
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
181
|
+
const url = vi.mocked(fetch).mock.calls[0][0];
|
|
182
|
+
expect(url).toBe('http://localhost:11434/v1/chat/completions');
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
if (prev !== undefined)
|
|
186
|
+
process.env.OLLAMA_HOST = prev;
|
|
187
|
+
else
|
|
188
|
+
delete process.env.OLLAMA_HOST;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
it('explicit baseURL overrides OLLAMA_HOST', async () => {
|
|
192
|
+
const prev = process.env.OLLAMA_HOST;
|
|
193
|
+
process.env.OLLAMA_HOST = 'http://wrong:11434';
|
|
194
|
+
try {
|
|
195
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
196
|
+
const p = OpenAIProvider.ollama({ model: 'llama3.2', baseURL: 'http://right:9000/v1' });
|
|
197
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
198
|
+
const url = vi.mocked(fetch).mock.calls[0][0];
|
|
199
|
+
expect(url).toBe('http://right:9000/v1/chat/completions');
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
if (prev !== undefined)
|
|
203
|
+
process.env.OLLAMA_HOST = prev;
|
|
204
|
+
else
|
|
205
|
+
delete process.env.OLLAMA_HOST;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('OpenAIProvider — chat success path', () => {
|
|
210
|
+
beforeEach(() => {
|
|
211
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
212
|
+
});
|
|
213
|
+
afterEach(() => {
|
|
214
|
+
vi.unstubAllGlobals();
|
|
215
|
+
});
|
|
216
|
+
it('returns text content for a plain assistant reply', async () => {
|
|
217
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'hello' })));
|
|
218
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
219
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
220
|
+
expect(result.stopReason).toBe('end_turn');
|
|
221
|
+
expect(result.content).toEqual([{ type: 'text', text: 'hello' }]);
|
|
222
|
+
expect(result.usage).toEqual({ inputTokens: 100, outputTokens: 20 });
|
|
223
|
+
});
|
|
224
|
+
it('maps finish_reason=tool_calls to stopReason=tool_use and emits tool_use blocks', async () => {
|
|
225
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
226
|
+
tool_calls: [{ id: 't1', name: 'search', args: { q: 'milk' } }]
|
|
227
|
+
})));
|
|
228
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
229
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], [dummyTool]);
|
|
230
|
+
expect(result.stopReason).toBe('tool_use');
|
|
231
|
+
expect(result.content).toEqual([
|
|
232
|
+
{ type: 'tool_use', id: 't1', name: 'search', input: { q: 'milk' } }
|
|
233
|
+
]);
|
|
234
|
+
});
|
|
235
|
+
it('maps finish_reason=length to stopReason=max_tokens', async () => {
|
|
236
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
237
|
+
content: 'truncated...',
|
|
238
|
+
finish_reason: 'length'
|
|
239
|
+
})));
|
|
240
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
241
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
242
|
+
expect(result.stopReason).toBe('max_tokens');
|
|
243
|
+
});
|
|
244
|
+
it('plumbs cached_tokens and cache_write_tokens into LLMResponse.cacheUsage and excludes them from inputTokens', async () => {
|
|
245
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
246
|
+
content: 'ok',
|
|
247
|
+
prompt_tokens: 1000,
|
|
248
|
+
completion_tokens: 50,
|
|
249
|
+
cached_tokens: 800,
|
|
250
|
+
cache_write_tokens: 100
|
|
251
|
+
})));
|
|
252
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
253
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
254
|
+
expect(result.cacheUsage).toEqual({
|
|
255
|
+
cacheReadInputTokens: 800,
|
|
256
|
+
cacheCreationInputTokens: 100
|
|
257
|
+
});
|
|
258
|
+
expect(result.usage).toEqual({ inputTokens: 100, outputTokens: 50 });
|
|
259
|
+
});
|
|
260
|
+
it('does not emit cacheUsage when prompt_tokens_details is absent', async () => {
|
|
261
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
262
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
263
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
264
|
+
expect(result.cacheUsage).toBeUndefined();
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
describe('OpenAIProvider — request body shape', () => {
|
|
268
|
+
beforeEach(() => {
|
|
269
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
270
|
+
});
|
|
271
|
+
afterEach(() => {
|
|
272
|
+
vi.unstubAllGlobals();
|
|
273
|
+
});
|
|
274
|
+
function lastBody() {
|
|
275
|
+
const fetchMock = vi.mocked(fetch);
|
|
276
|
+
const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
|
|
277
|
+
const init = call[1];
|
|
278
|
+
return JSON.parse(init.body);
|
|
279
|
+
}
|
|
280
|
+
function lastHeaders() {
|
|
281
|
+
const fetchMock = vi.mocked(fetch);
|
|
282
|
+
const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
|
|
283
|
+
const init = call[1];
|
|
284
|
+
return init.headers;
|
|
285
|
+
}
|
|
286
|
+
it('forwards options.temperature, options.topP, options.stopSequences', async () => {
|
|
287
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
288
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
289
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], [], {
|
|
290
|
+
temperature: 0.3,
|
|
291
|
+
topP: 0.9,
|
|
292
|
+
stopSequences: ['\n\n', 'STOP']
|
|
293
|
+
});
|
|
294
|
+
const body = lastBody();
|
|
295
|
+
expect(body.temperature).toBe(0.3);
|
|
296
|
+
expect(body.top_p).toBe(0.9);
|
|
297
|
+
expect(body.stop).toEqual(['\n\n', 'STOP']);
|
|
298
|
+
});
|
|
299
|
+
it('omits sampling params when not provided', async () => {
|
|
300
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
301
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
302
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
303
|
+
const body = lastBody();
|
|
304
|
+
expect(body.temperature).toBeUndefined();
|
|
305
|
+
expect(body.top_p).toBeUndefined();
|
|
306
|
+
expect(body.stop).toBeUndefined();
|
|
307
|
+
});
|
|
308
|
+
it('options.model overrides the constructor default', async () => {
|
|
309
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
310
|
+
const p = new OpenAIProvider({ apiKey: 'k', model: 'gpt-4o' });
|
|
311
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], [], { model: 'gpt-4o-mini' });
|
|
312
|
+
expect(lastBody().model).toBe('gpt-4o-mini');
|
|
313
|
+
});
|
|
314
|
+
it('attaches Authorization header and merges defaultHeaders', async () => {
|
|
315
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
316
|
+
const p = new OpenAIProvider({
|
|
317
|
+
apiKey: 'secret',
|
|
318
|
+
defaultHeaders: { 'X-Custom': 'yes' }
|
|
319
|
+
});
|
|
320
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
321
|
+
const headers = lastHeaders();
|
|
322
|
+
expect(headers['Authorization']).toBe('Bearer secret');
|
|
323
|
+
expect(headers['Content-Type']).toBe('application/json');
|
|
324
|
+
expect(headers['X-Custom']).toBe('yes');
|
|
325
|
+
});
|
|
326
|
+
it('hits the configured baseURL', async () => {
|
|
327
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
328
|
+
const p = OpenAIProvider.groq({ apiKey: 'k' });
|
|
329
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
330
|
+
const fetchMock = vi.mocked(fetch);
|
|
331
|
+
const url = fetchMock.mock.calls[0][0];
|
|
332
|
+
expect(url).toBe('https://api.groq.com/openai/v1/chat/completions');
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe('OpenAIProvider — message conversion', () => {
|
|
336
|
+
beforeEach(() => {
|
|
337
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
338
|
+
});
|
|
339
|
+
afterEach(() => {
|
|
340
|
+
vi.unstubAllGlobals();
|
|
341
|
+
});
|
|
342
|
+
function lastMessages() {
|
|
343
|
+
const fetchMock = vi.mocked(fetch);
|
|
344
|
+
const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
|
|
345
|
+
const body = JSON.parse(call[1].body);
|
|
346
|
+
return body.messages;
|
|
347
|
+
}
|
|
348
|
+
it('prepends the system prompt as the first message', async () => {
|
|
349
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
350
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
351
|
+
await p.chat('be helpful', [{ role: 'user', content: 'hi' }], []);
|
|
352
|
+
const msgs = lastMessages();
|
|
353
|
+
expect(msgs[0]).toEqual({ role: 'system', content: 'be helpful' });
|
|
354
|
+
expect(msgs[1]).toEqual({ role: 'user', content: 'hi' });
|
|
355
|
+
});
|
|
356
|
+
it('roundtrips assistant tool_use → tool_call and tool_result → tool role', async () => {
|
|
357
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'done' })));
|
|
358
|
+
const messages = [
|
|
359
|
+
{ role: 'user', content: 'find milk' },
|
|
360
|
+
{
|
|
361
|
+
role: 'assistant',
|
|
362
|
+
content: [
|
|
363
|
+
{ type: 'text', text: 'searching' },
|
|
364
|
+
{ type: 'tool_use', id: 't1', name: 'search', input: { q: 'milk' } }
|
|
365
|
+
]
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
role: 'user',
|
|
369
|
+
content: [
|
|
370
|
+
{ type: 'tool_result', tool_use_id: 't1', content: '[{"name":"milk"}]' }
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
];
|
|
374
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
375
|
+
await p.chat('sys', messages, [dummyTool]);
|
|
376
|
+
const msgs = lastMessages();
|
|
377
|
+
// [system, user, assistant-with-tool_calls, tool]
|
|
378
|
+
expect(msgs).toHaveLength(4);
|
|
379
|
+
expect(msgs[2].role).toBe('assistant');
|
|
380
|
+
expect(msgs[2].content).toBe('searching');
|
|
381
|
+
expect(msgs[2].tool_calls).toEqual([
|
|
382
|
+
{ id: 't1', type: 'function', function: { name: 'search', arguments: JSON.stringify({ q: 'milk' }) } }
|
|
383
|
+
]);
|
|
384
|
+
expect(msgs[3]).toEqual({
|
|
385
|
+
role: 'tool',
|
|
386
|
+
content: '[{"name":"milk"}]',
|
|
387
|
+
tool_call_id: 't1'
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
it('converts tool schemas to OpenAI function form', async () => {
|
|
391
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
392
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
393
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], [dummyTool]);
|
|
394
|
+
const fetchMock = vi.mocked(fetch);
|
|
395
|
+
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
396
|
+
expect(body.tools).toEqual([
|
|
397
|
+
{
|
|
398
|
+
type: 'function',
|
|
399
|
+
function: {
|
|
400
|
+
name: 'search',
|
|
401
|
+
description: 'search things',
|
|
402
|
+
parameters: { type: 'object', properties: { q: { type: 'string' } } }
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
]);
|
|
406
|
+
});
|
|
407
|
+
it('omits the tools field when no tools are provided', async () => {
|
|
408
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
|
|
409
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
410
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
411
|
+
const fetchMock = vi.mocked(fetch);
|
|
412
|
+
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
413
|
+
expect(body.tools).toBeUndefined();
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
describe('OpenAIProvider — reasoning stripping', () => {
|
|
417
|
+
beforeEach(() => {
|
|
418
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
419
|
+
});
|
|
420
|
+
afterEach(() => {
|
|
421
|
+
vi.unstubAllGlobals();
|
|
422
|
+
});
|
|
423
|
+
it('strips harmony channel markers from text content by default', async () => {
|
|
424
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
425
|
+
content: '<|channel|>analysis<|message|>Plain answer here.'
|
|
426
|
+
})));
|
|
427
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
428
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
429
|
+
expect(result.content).toEqual([{ type: 'text', text: 'Plain answer here.' }]);
|
|
430
|
+
});
|
|
431
|
+
it('strips a leading `thought` preamble', async () => {
|
|
432
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
433
|
+
content: 'thought\nThe real answer.'
|
|
434
|
+
})));
|
|
435
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
436
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
437
|
+
expect(result.content).toEqual([{ type: 'text', text: 'The real answer.' }]);
|
|
438
|
+
});
|
|
439
|
+
it('preserves the raw text when stripReasoning is false', async () => {
|
|
440
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
|
|
441
|
+
content: '<|channel|>analysis<|message|>Plain answer here.'
|
|
442
|
+
})));
|
|
443
|
+
const p = new OpenAIProvider({ apiKey: 'k', stripReasoning: false });
|
|
444
|
+
const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
445
|
+
expect(result.content).toEqual([
|
|
446
|
+
{ type: 'text', text: '<|channel|>analysis<|message|>Plain answer here.' }
|
|
447
|
+
]);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
describe('OpenAIProvider — error handling', () => {
|
|
451
|
+
beforeEach(() => {
|
|
452
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
453
|
+
});
|
|
454
|
+
afterEach(() => {
|
|
455
|
+
vi.unstubAllGlobals();
|
|
456
|
+
});
|
|
457
|
+
it('throws with vendor name and HTTP status on a non-2xx', async () => {
|
|
458
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'bad key' } }, 401));
|
|
459
|
+
const p = new OpenAIProvider({ apiKey: 'k', vendor: 'groq' });
|
|
460
|
+
await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/groq API error \(HTTP 401\): bad key/);
|
|
461
|
+
});
|
|
462
|
+
it('throws on a 503 in a way that isTransientError classifies as transient', async () => {
|
|
463
|
+
vi.mocked(fetch).mockResolvedValueOnce(textResponse('upstream busy', 503, 'Service Unavailable'));
|
|
464
|
+
const p = new OpenAIProvider({ apiKey: 'k', vendor: 'groq' });
|
|
465
|
+
let caught;
|
|
466
|
+
try {
|
|
467
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
caught = err;
|
|
471
|
+
}
|
|
472
|
+
expect(caught).toBeInstanceOf(Error);
|
|
473
|
+
expect(isTransientError(caught)).toBe(true);
|
|
474
|
+
});
|
|
475
|
+
it('throws on a 401 in a way that isTransientError rejects', async () => {
|
|
476
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'bad key' } }, 401));
|
|
477
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
478
|
+
let caught;
|
|
479
|
+
try {
|
|
480
|
+
await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
caught = err;
|
|
484
|
+
}
|
|
485
|
+
expect(isTransientError(caught)).toBe(false);
|
|
486
|
+
});
|
|
487
|
+
it('throws when the response body is not JSON', async () => {
|
|
488
|
+
vi.mocked(fetch).mockResolvedValueOnce(textResponse('not-json', 200));
|
|
489
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
490
|
+
await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/openai API error: response was not valid JSON/);
|
|
491
|
+
});
|
|
492
|
+
it('throws when 200 OK carries an error body', async () => {
|
|
493
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'rate limited' } }));
|
|
494
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
495
|
+
await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/openai API error: rate limited/);
|
|
496
|
+
});
|
|
497
|
+
it('throws when no choices are returned', async () => {
|
|
498
|
+
vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({
|
|
499
|
+
id: 'r',
|
|
500
|
+
choices: [],
|
|
501
|
+
usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }
|
|
502
|
+
}));
|
|
503
|
+
const p = new OpenAIProvider({ apiKey: 'k' });
|
|
504
|
+
await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/empty response/);
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
//# sourceMappingURL=openai.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.test.js","sourceRoot":"","sources":["../../../src/providers/llm/openai.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/tasks.js
CHANGED
|
@@ -505,16 +505,36 @@ function notifyTaskUpdate(manager, action, options) {
|
|
|
505
505
|
export function createTaskCreateTool(manager, options = {}) {
|
|
506
506
|
return {
|
|
507
507
|
name: "TaskCreate",
|
|
508
|
-
description: `Create a task in the task list. Duplicates are automatically rejected.
|
|
508
|
+
description: `Create a task in the task list. Use this to track progress on multi-step work. Duplicates are automatically rejected.
|
|
509
|
+
|
|
510
|
+
## When to Use
|
|
511
|
+
|
|
512
|
+
Use proactively when:
|
|
513
|
+
- The request requires 3+ distinct steps
|
|
514
|
+
- The user provides multiple items to accomplish
|
|
515
|
+
- You are starting work after receiving new instructions — capture requirements as tasks BEFORE starting
|
|
516
|
+
- After completing a task — add follow-up tasks discovered during implementation
|
|
517
|
+
|
|
518
|
+
Do NOT use when:
|
|
519
|
+
- Single, trivial task (just do it)
|
|
520
|
+
- Purely informational or conversational request
|
|
521
|
+
- Less than 3 steps needed
|
|
522
|
+
|
|
523
|
+
## Creating Good Tasks
|
|
524
|
+
|
|
525
|
+
- Create ALL tasks upfront before starting any work
|
|
526
|
+
- Each task = one logical unit of work, not one per file
|
|
527
|
+
- Include implicit steps: testing, building, verification
|
|
528
|
+
- Provide both subject (imperative) and activeForm (present continuous)
|
|
529
|
+
- Include enough context in description for the task to be self-contained
|
|
509
530
|
|
|
510
531
|
## Fields
|
|
511
532
|
|
|
512
|
-
- **subject**: Brief, actionable title in imperative form (e.g., "Fix authentication bug")
|
|
533
|
+
- **subject**: Brief, actionable title in imperative form (e.g., "Fix authentication bug in login flow")
|
|
513
534
|
- **description**: What needs to be done, including context and acceptance criteria
|
|
514
|
-
- **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Fixing authentication bug")
|
|
535
|
+
- **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Fixing authentication bug"). Always provide this.
|
|
515
536
|
|
|
516
|
-
|
|
517
|
-
`,
|
|
537
|
+
Tasks start as \`pending\`. First task auto-starts as \`in_progress\`. Duplicates are rejected.`,
|
|
518
538
|
parameters: {
|
|
519
539
|
type: "object",
|
|
520
540
|
properties: {
|
|
@@ -733,14 +753,22 @@ Only mark completed when fully done. If blocked, keep as in_progress.
|
|
|
733
753
|
if (status === 'completed') {
|
|
734
754
|
message = `Completed task #${taskId}: "${result.task.subject}"`;
|
|
735
755
|
if (result.next) {
|
|
736
|
-
message +=
|
|
756
|
+
message += `\nNext task: #${result.next.id} "${result.next.subject}" (auto-started). Begin working on it now.`;
|
|
737
757
|
}
|
|
738
758
|
else if (manager.isAllCompleted()) {
|
|
739
|
-
|
|
759
|
+
const allTasks = manager.getAll();
|
|
760
|
+
const hasVerification = allTasks.some(t => /verif|test|build|lint|check|run.*test/i.test(t.subject));
|
|
761
|
+
if (allTasks.length >= 3 && !hasVerification) {
|
|
762
|
+
message += `\nAll tasks completed — but none was a verification step. Create a verification task (run tests, build, or lint) before responding to the user.`;
|
|
763
|
+
}
|
|
764
|
+
else {
|
|
765
|
+
message += `\nAll tasks completed! Respond to the user with a summary of what was done.`;
|
|
766
|
+
}
|
|
740
767
|
}
|
|
741
768
|
}
|
|
742
769
|
else if (status === 'in_progress') {
|
|
743
770
|
message = `Started task #${taskId}: "${result.task.subject}"`;
|
|
771
|
+
message += `\nDo the work, then mark this task completed with TaskUpdate before moving on.`;
|
|
744
772
|
}
|
|
745
773
|
return {
|
|
746
774
|
success: true,
|
|
@@ -792,7 +820,17 @@ export function createTaskGetTool(manager, _options = {}) {
|
|
|
792
820
|
export function createTaskListTool(manager, options = {}) {
|
|
793
821
|
return {
|
|
794
822
|
name: "TaskList",
|
|
795
|
-
description: `List all tasks with
|
|
823
|
+
description: `List all tasks with ID, subject, status, owner, and blockers.
|
|
824
|
+
|
|
825
|
+
Use after completing a task to find the next available one.
|
|
826
|
+
Prefer tasks in ID order (lowest first) — earlier tasks often set up context for later ones.
|
|
827
|
+
|
|
828
|
+
## Output
|
|
829
|
+
- id: Task identifier
|
|
830
|
+
- subject: Brief description
|
|
831
|
+
- status: pending, in_progress, or completed
|
|
832
|
+
- owner: Agent name if assigned, empty if available
|
|
833
|
+
- blockedBy: Open task IDs that must complete first (resolved blockers are hidden)`,
|
|
796
834
|
parameters: {
|
|
797
835
|
type: "object",
|
|
798
836
|
properties: {},
|