Skip to content

Commit 1d3fa00

Browse files
committed
slop--
1 parent 5939c41 commit 1d3fa00

File tree

10 files changed

+164
-473
lines changed

10 files changed

+164
-473
lines changed

packages/kernel-agents/src/attempt.test.ts

Lines changed: 47 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ describe('doAttempt', () => {
2020
let mockReader: ReturnType<typeof vi.fn>;
2121
let mockEvaluator: ReturnType<typeof vi.fn>;
2222
let mockPrinter: ReturnType<typeof vi.fn>;
23-
let mockLanguageModel: {
24-
sample: ReturnType<typeof vi.fn>;
25-
};
26-
let mockProgress: Progress<string, TestMessage[]>;
23+
let mockLanguageModel: { sample: ReturnType<typeof vi.fn> };
2724
let prep: PREP<TestMessage[], TestMessage, TestMessage>;
2825
let logger: Logger;
2926

@@ -32,14 +29,11 @@ describe('doAttempt', () => {
3229
mockReader = vi.fn();
3330
mockEvaluator = vi.fn();
3431
mockPrinter = vi.fn();
35-
mockLanguageModel = {
36-
sample: vi.fn(),
37-
};
32+
mockLanguageModel = { sample: vi.fn() };
3833
logger = {
3934
info: vi.fn(),
4035
subLogger: vi.fn(() => logger),
4136
} as unknown as Logger;
42-
4337
prep = [
4438
mockPrompter,
4539
mockReader,
@@ -48,6 +42,21 @@ describe('doAttempt', () => {
4842
] as unknown as PREP<TestMessage[], TestMessage, TestMessage>;
4943
});
5044

45+
const makeProgress = (
46+
history: TestMessage[],
47+
isDone: ReturnType<typeof vi.fn>,
48+
result?: string,
49+
): Progress<string, TestMessage[]> => {
50+
const progress: Progress<string, TestMessage[]> = {
51+
history,
52+
isDone,
53+
};
54+
if (result !== undefined) {
55+
progress.result = result;
56+
}
57+
return progress;
58+
};
59+
5160
it('returns result when done on first step', async () => {
5261
const history: TestMessage[] = [];
5362
const action = new TestMessage('action');
@@ -58,15 +67,14 @@ describe('doAttempt', () => {
5867
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
5968
mockReader.mockResolvedValue(action);
6069
mockEvaluator.mockResolvedValue(observation);
61-
mockProgress = {
62-
history,
63-
isDone: vi.fn(() => true),
64-
result,
65-
};
6670

6771
const actual = await doAttempt(
6872
prep,
69-
mockProgress,
73+
makeProgress(
74+
history,
75+
vi.fn(() => true),
76+
result,
77+
),
7078
mockLanguageModel as unknown as LanguageModel<
7179
unknown,
7280
{ response: string }
@@ -75,12 +83,8 @@ describe('doAttempt', () => {
7583
);
7684

7785
expect(actual).toBe(result);
78-
expect(mockPrompter).toHaveBeenCalledTimes(1);
7986
expect(mockPrompter).toHaveBeenCalledWith(history);
80-
expect(mockLanguageModel.sample).toHaveBeenCalledTimes(1);
8187
expect(mockLanguageModel.sample).toHaveBeenCalledWith('test prompt');
82-
expect(mockReader).toHaveBeenCalledTimes(1);
83-
expect(mockEvaluator).toHaveBeenCalledTimes(1);
8488
expect(mockEvaluator).toHaveBeenCalledWith(history, action);
8589
expect(mockPrinter).not.toHaveBeenCalled();
8690
expect(logger.info).toHaveBeenCalledWith('Step 1 of 10');
@@ -107,15 +111,14 @@ describe('doAttempt', () => {
107111
mockEvaluator
108112
.mockResolvedValueOnce(observation1)
109113
.mockResolvedValueOnce(observation2);
110-
mockProgress = {
111-
history,
112-
isDone: vi.fn(() => callCount === 2),
113-
result,
114-
};
115114

116115
const actual = await doAttempt(
117116
prep,
118-
mockProgress,
117+
makeProgress(
118+
history,
119+
vi.fn(() => callCount === 2),
120+
result,
121+
),
119122
mockLanguageModel as unknown as LanguageModel<
120123
unknown,
121124
{ response: string }
@@ -125,32 +128,26 @@ describe('doAttempt', () => {
125128

126129
expect(actual).toBe(result);
127130
expect(mockPrompter).toHaveBeenCalledTimes(2);
128-
expect(mockLanguageModel.sample).toHaveBeenCalledTimes(2);
129-
expect(mockReader).toHaveBeenCalledTimes(2);
130-
expect(mockEvaluator).toHaveBeenCalledTimes(2);
131-
expect(mockPrinter).toHaveBeenCalledTimes(1);
132131
expect(mockPrinter).toHaveBeenCalledWith(action1, observation1);
133132
});
134133

135134
it('passes readerArgs to reader', async () => {
136135
const history: TestMessage[] = [];
137136
const action = new TestMessage('action');
138-
const observation = new TestMessage('observation');
139137
const readerArgs = { stop: '</|>', prefix: 'test' };
140138

141139
mockPrompter.mockReturnValue({ prompt: 'test prompt', readerArgs });
142140
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
143141
mockReader.mockResolvedValue(action);
144-
mockEvaluator.mockResolvedValue(observation);
145-
mockProgress = {
146-
history,
147-
isDone: vi.fn(() => true),
148-
result: 'result',
149-
};
142+
mockEvaluator.mockResolvedValue(new TestMessage('observation'));
150143

151144
await doAttempt(
152145
prep,
153-
mockProgress,
146+
makeProgress(
147+
history,
148+
vi.fn(() => true),
149+
'result',
150+
),
154151
mockLanguageModel as unknown as LanguageModel<
155152
unknown,
156153
{ response: string }
@@ -166,23 +163,22 @@ describe('doAttempt', () => {
166163
}),
167164
);
168165
});
166+
169167
it('throws error when maxSteps is exceeded', async () => {
170168
const history: TestMessage[] = [];
171169
const action = new TestMessage('action');
172-
const observation = new TestMessage('observation');
173170

174171
mockPrompter.mockReturnValue({ prompt: 'test prompt', readerArgs: {} });
175172
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
176173
mockReader.mockResolvedValue(action);
177-
mockEvaluator.mockResolvedValue(observation);
178-
mockProgress = {
179-
history,
180-
isDone: vi.fn(() => false),
181-
};
174+
mockEvaluator.mockResolvedValue(new TestMessage('observation'));
182175

183176
const attempt = doAttempt(
184177
prep,
185-
mockProgress,
178+
makeProgress(
179+
history,
180+
vi.fn(() => false),
181+
),
186182
mockLanguageModel as unknown as LanguageModel<
187183
unknown,
188184
{ response: string }
@@ -192,69 +188,9 @@ describe('doAttempt', () => {
192188

193189
await expect(attempt).rejects.toThrow('Invocation budget exceeded');
194190
expect(mockPrompter).toHaveBeenCalledTimes(3);
195-
expect(mockLanguageModel.sample).toHaveBeenCalledTimes(3);
196-
expect(mockReader).toHaveBeenCalledTimes(3);
197-
expect(mockEvaluator).toHaveBeenCalledTimes(3);
198191
expect(mockPrinter).toHaveBeenCalledTimes(3);
199192
});
200193

201-
it('logs step numbers', async () => {
202-
const history: TestMessage[] = [];
203-
const action = new TestMessage('action');
204-
const observation = new TestMessage('observation');
205-
206-
mockPrompter.mockReturnValue({ prompt: 'test prompt', readerArgs: {} });
207-
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
208-
mockReader.mockResolvedValue(action);
209-
mockEvaluator.mockResolvedValue(observation);
210-
mockProgress = {
211-
history,
212-
isDone: vi.fn(() => true),
213-
result: 'result',
214-
};
215-
216-
await doAttempt(
217-
prep,
218-
mockProgress,
219-
mockLanguageModel as unknown as LanguageModel<
220-
unknown,
221-
{ response: string }
222-
>,
223-
{ maxSteps: 5, logger },
224-
);
225-
226-
expect(logger.info).toHaveBeenCalledWith('Step 1 of 5');
227-
expect(logger.info).toHaveBeenCalledWith('done:', 'result');
228-
});
229-
230-
it('does not log when logger is not provided', async () => {
231-
const history: TestMessage[] = [];
232-
const action = new TestMessage('action');
233-
const observation = new TestMessage('observation');
234-
235-
mockPrompter.mockReturnValue({ prompt: 'test prompt', readerArgs: {} });
236-
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
237-
mockReader.mockResolvedValue(action);
238-
mockEvaluator.mockResolvedValue(observation);
239-
mockProgress = {
240-
history,
241-
isDone: vi.fn(() => true),
242-
result: 'result',
243-
};
244-
245-
await doAttempt(
246-
prep,
247-
mockProgress,
248-
mockLanguageModel as unknown as LanguageModel<
249-
unknown,
250-
{ response: string }
251-
>,
252-
{ maxSteps: 5 },
253-
);
254-
255-
expect(logger.info).not.toHaveBeenCalled();
256-
});
257-
258194
it('handles null observation from evaluator', async () => {
259195
const history: TestMessage[] = [];
260196
const action = new TestMessage('action');
@@ -263,18 +199,17 @@ describe('doAttempt', () => {
263199
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
264200
mockReader.mockResolvedValue(action);
265201
mockEvaluator.mockResolvedValue(null);
266-
mockProgress = {
267-
history,
268-
isDone: vi
269-
.fn(() => false)
270-
.mockReturnValueOnce(false)
271-
.mockReturnValueOnce(true),
272-
result: 'result',
273-
};
274202

275203
await doAttempt(
276204
prep,
277-
mockProgress,
205+
makeProgress(
206+
history,
207+
vi
208+
.fn(() => false)
209+
.mockReturnValueOnce(false)
210+
.mockReturnValueOnce(true),
211+
'result',
212+
),
278213
mockLanguageModel as unknown as LanguageModel<
279214
unknown,
280215
{ response: string }
@@ -284,32 +219,4 @@ describe('doAttempt', () => {
284219

285220
expect(mockPrinter).toHaveBeenCalledWith(action, null);
286221
});
287-
288-
it('uses default maxSteps when not provided', async () => {
289-
const history: TestMessage[] = [];
290-
const action = new TestMessage('action');
291-
const observation = new TestMessage('observation');
292-
293-
mockPrompter.mockReturnValue({ prompt: 'test prompt', readerArgs: {} });
294-
mockLanguageModel.sample.mockResolvedValue(makeTestStream(['response']));
295-
mockReader.mockResolvedValue(action);
296-
mockEvaluator.mockResolvedValue(observation);
297-
mockProgress = {
298-
history,
299-
isDone: vi.fn(() => true),
300-
result: 'result',
301-
};
302-
303-
await doAttempt(
304-
prep,
305-
mockProgress,
306-
mockLanguageModel as unknown as LanguageModel<
307-
unknown,
308-
{ response: string }
309-
>,
310-
{},
311-
);
312-
313-
expect(mockPrompter).toHaveBeenCalledTimes(1);
314-
});
315222
});

packages/kernel-agents/src/capabilities/capability.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import { describe, it, expect } from 'vitest';
33
import { capability } from './capability.ts';
44

55
describe('capability', () => {
6-
it('creates a capability', () => {
6+
it('creates a capability with func and schema', () => {
77
const testCapability = capability(async () => Promise.resolve('test'), {
88
description: 'a test capability',
99
args: {},
1010
});
11-
expect(testCapability).toStrictEqual({
12-
func: expect.any(Function),
13-
schema: { description: 'a test capability', args: {} },
11+
expect(testCapability.func).toBeInstanceOf(Function);
12+
expect(testCapability.schema).toStrictEqual({
13+
description: 'a test capability',
14+
args: {},
1415
});
1516
});
1617
});

packages/kernel-agents/src/strategies/json/message.test.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,25 @@ import { describe, it, expect } from 'vitest';
33
import { AssistantMessage } from './messages.ts';
44

55
describe('AssistantMessage', () => {
6-
it('should create an assistant message', () => {
6+
it('creates an assistant message', () => {
77
const message = new AssistantMessage({ think: ['test'], invoke: [] });
88
expect(message).toBeDefined();
99
});
1010

11-
it('serializes think before invoke if present', () => {
11+
it('serializes think before invoke', () => {
1212
const message = new AssistantMessage({
1313
invoke: [{ name: 'test', args: {} }],
1414
think: ['test'],
1515
});
1616
const json = message.toJSON();
17-
const [left, right] = json.split('think');
18-
expect(left).toContain('messageType');
19-
expect(left).not.toContain('invoke');
20-
expect(right).not.toContain('messageType');
21-
expect(right).toContain('invoke');
17+
expect(json.indexOf('think')).toBeLessThan(json.indexOf('invoke'));
2218
});
2319

24-
it('serializes if think is not present', () => {
20+
it('serializes without think when absent', () => {
2521
const message = new AssistantMessage({
2622
invoke: [{ name: 'test', args: {} }],
2723
});
2824
const json = message.toJSON();
29-
expect(json).toContain('messageType');
3025
expect(json).not.toContain('think');
3126
expect(json).toContain('invoke');
3227
});

packages/kernel-agents/src/strategies/json/prompter.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@ import { describe, it, expect } from 'vitest';
55
import { makePrompter } from './prompter.ts';
66

77
describe('makePrompter', () => {
8-
it('should get the prompt and prefix', () => {
8+
it('returns prompt and prefix', () => {
99
const prompter = makePrompter();
10-
const {
11-
prompt,
12-
readerArgs: { prefix },
13-
} = prompter([]);
10+
const { prompt, readerArgs } = prompter([]);
1411
expect(typeof prompt).toBe('string');
15-
expect(typeof prefix).toBe('string');
12+
expect(typeof readerArgs.prefix).toBe('string');
1613
});
1714
});

0 commit comments

Comments
 (0)