feat(agent): add streamed reasoning summary callbacks to runAgent
This commit is contained in:
@@ -156,6 +156,7 @@ export async function runAgent(options: IAgentRunOptions): Promise<IAgentRunResu
|
||||
let validationRetries = 0;
|
||||
const toolCalls: IAgentToolCallRecord[] = [];
|
||||
const toolCallIndexes = new Map<string, number>();
|
||||
const reasoningTextById = new Map<string, string>();
|
||||
|
||||
const tools = options.tools ?? {};
|
||||
const cache = options.cache ?? 'auto';
|
||||
@@ -227,8 +228,33 @@ export async function runAgent(options: IAgentRunOptions): Promise<IAgentRunResu
|
||||
},
|
||||
|
||||
onChunk: ({ chunk }) => {
|
||||
if (chunk.type === 'text-delta' && options.onToken) {
|
||||
options.onToken((chunk as any).textDelta ?? (chunk as any).text ?? '');
|
||||
const chunkType = String((chunk as any).type || '');
|
||||
if (chunkType === 'text-delta' && options.onToken) {
|
||||
options.onToken((chunk as any).delta ?? (chunk as any).textDelta ?? (chunk as any).text ?? '');
|
||||
return;
|
||||
}
|
||||
if (chunkType === 'reasoning-start') {
|
||||
const id = (chunk as any).id || 'reasoning';
|
||||
reasoningTextById.set(id, '');
|
||||
options.onReasoningStart?.(id, (chunk as any).providerMetadata);
|
||||
return;
|
||||
}
|
||||
if (chunkType === 'reasoning-delta') {
|
||||
const id = (chunk as any).id || 'reasoning';
|
||||
const delta = (chunk as any).delta ?? (chunk as any).textDelta ?? (chunk as any).text ?? '';
|
||||
if (!reasoningTextById.has(id)) {
|
||||
reasoningTextById.set(id, '');
|
||||
options.onReasoningStart?.(id, (chunk as any).providerMetadata);
|
||||
}
|
||||
reasoningTextById.set(id, (reasoningTextById.get(id) ?? '') + delta);
|
||||
options.onReasoningDelta?.(id, delta, (chunk as any).providerMetadata);
|
||||
return;
|
||||
}
|
||||
if (chunkType === 'reasoning-end') {
|
||||
const id = (chunk as any).id || 'reasoning';
|
||||
const text = reasoningTextById.get(id) ?? '';
|
||||
reasoningTextById.delete(id);
|
||||
options.onReasoningEnd?.(id, text, (chunk as any).providerMetadata);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -286,6 +312,10 @@ export async function runAgent(options: IAgentRunOptions): Promise<IAgentRunResu
|
||||
const finishReason = await result.finishReason;
|
||||
const responseData = await result.response;
|
||||
const responseMessages = responseData.messages as plugins.ModelMessage[];
|
||||
for (const [id, reasoningText] of reasoningTextById) {
|
||||
options.onReasoningEnd?.(id, reasoningText);
|
||||
reasoningTextById.delete(id);
|
||||
}
|
||||
|
||||
attempt = 0; // reset on success
|
||||
|
||||
|
||||
@@ -45,6 +45,12 @@ export interface IAgentRunOptions {
|
||||
messages?: ModelMessage[];
|
||||
/** Called for each streamed text delta */
|
||||
onToken?: (delta: string) => void;
|
||||
/** Called when the model starts a streamed reasoning summary */
|
||||
onReasoningStart?: (id: string, providerMetadata?: unknown) => void;
|
||||
/** Called for each streamed reasoning summary delta */
|
||||
onReasoningDelta?: (id: string, delta: string, providerMetadata?: unknown) => void;
|
||||
/** Called when a streamed reasoning summary completes */
|
||||
onReasoningEnd?: (id: string, text: string, providerMetadata?: unknown) => void;
|
||||
/** Called when a tool call starts */
|
||||
onToolCall?: (toolName: string, input: unknown) => void;
|
||||
/** Called when a tool call completes */
|
||||
|
||||
Reference in New Issue
Block a user