feat(agent): add streamed reasoning summary callbacks to runAgent
This commit is contained in:
@@ -33,6 +33,25 @@ const createTextStreamResult = (text: string) => ({
|
||||
] as any[]),
|
||||
});
|
||||
|
||||
const createReasoningStreamResult = (reasoning: string, text: string) => ({
|
||||
stream: convertArrayToReadableStream([
|
||||
{ type: 'stream-start', warnings: [] },
|
||||
{ type: 'response-metadata', id: 'response-1', timestamp: new Date(0), modelId: 'mock-model' },
|
||||
{ type: 'reasoning-start', id: 'reasoning-1' },
|
||||
{ type: 'reasoning-delta', id: 'reasoning-1', delta: reasoning.slice(0, 7) },
|
||||
{ type: 'reasoning-delta', id: 'reasoning-1', delta: reasoning.slice(7) },
|
||||
{ type: 'reasoning-end', id: 'reasoning-1' },
|
||||
{ type: 'text-start', id: 'text-1' },
|
||||
{ type: 'text-delta', id: 'text-1', delta: text },
|
||||
{ type: 'text-end', id: 'text-1' },
|
||||
{
|
||||
type: 'finish',
|
||||
finishReason: { unified: 'stop', raw: 'stop' },
|
||||
usage: createUsage(2, 2),
|
||||
},
|
||||
] as any[]),
|
||||
});
|
||||
|
||||
const createToolCallStreamResult = (toolName: string, input: unknown) => ({
|
||||
stream: convertArrayToReadableStream([
|
||||
{ type: 'stream-start', warnings: [] },
|
||||
@@ -131,6 +150,32 @@ tap.test('runAgent should add OpenAI cache defaults when sessionId is provided',
|
||||
expect(openaiOptions.reasoningEffort).toEqual('high');
|
||||
});
|
||||
|
||||
tap.test('runAgent should stream reasoning summary callbacks', async () => {
|
||||
const reasoningEvents: string[] = [];
|
||||
const tokenDeltas: string[] = [];
|
||||
const model = new MockLanguageModelV3({
|
||||
doStream: async () => createReasoningStreamResult('thinking through it', 'done') as any,
|
||||
});
|
||||
|
||||
const result = await smartagent.runAgent({
|
||||
model,
|
||||
prompt: 'hello',
|
||||
onToken: (delta) => tokenDeltas.push(delta),
|
||||
onReasoningStart: (id) => reasoningEvents.push('start:' + id),
|
||||
onReasoningDelta: (id, delta) => reasoningEvents.push('delta:' + id + ':' + delta),
|
||||
onReasoningEnd: (id, text) => reasoningEvents.push('end:' + id + ':' + text),
|
||||
});
|
||||
|
||||
expect(result.text).toEqual('done');
|
||||
expect(tokenDeltas.join('')).toEqual('done');
|
||||
expect(reasoningEvents).toEqual([
|
||||
'start:reasoning-1',
|
||||
'delta:reasoning-1:thinkin',
|
||||
'delta:reasoning-1:g through it',
|
||||
'end:reasoning-1:thinking through it',
|
||||
]);
|
||||
});
|
||||
|
||||
tap.test('runAgent should mark Anthropic prompt cache breakpoints by default', async () => {
|
||||
const model = new MockLanguageModelV3({
|
||||
provider: 'anthropic',
|
||||
|
||||
Reference in New Issue
Block a user