import { FinishReason, LanguageModelRequestMetadata, LanguageModelUsage, StreamTextResult } from 'ai'; export interface StreamVisitorOption { debug?: boolean; onStart?: (content: StartContent) => void; onStep?: (content: StepContent) => void; onReasoning?: (content: ReasoningContent) => void; onText?: (content: TextContent) => void; onTool?: (content: ToolContent) => void; onFinish?: () => void; } export interface StartContent { running: boolean; steps: StepContent[]; finishReason?: FinishReason; totalUsage?: LanguageModelUsage; /** 工具内部异常的错误信息 */ error?: any; } export interface StepContent { running: boolean; contents: (TextContent | ReasoningContent | ToolContent)[]; finishReason?: FinishReason; /** 本轮对话的消耗 */ usage?: LanguageModelUsage; /** 包含本轮对话的请求体 */ request: LanguageModelRequestMetadata; } export interface TextContent { type: 'text'; id: string; running: boolean; text: string; } export interface ReasoningContent { type: 'reasoning'; id: string; running: boolean; text: string; } export interface ToolContent { type: 'tool'; id: string; running: boolean; toolCallId: string; title: string; toolName: string; /** 不确定输入参数的工具调用 */ dynamic: boolean | undefined; /** 生成tool 调用参数的动态字符串, 在调用 tool 之前,会保存json结果到input属性中 */ inputStr: string; /** 工具参数对象 */ input: any; /** 工具返回值对象 */ output: any; /** 工具内部异常的错误信息 */ error?: any; } /** ai-sdk@v6 的流消息访问者, 暴露响应式的数据,它随着流消息到来逐渐的变化 * @example * const stream = await toolLoopAgent.stream({prompt:'xxxx'}) * const visitor= new StreamVisitor({ * onStart(content){ * -- 保存这个content * } * }) * * await visitor.traverse(stream) * const result = await visitor.traverse(stream) // 或者保存此处的 result 的Ref响应数据 */ export declare class StreamVisitor { option: StreamVisitorOption; constructor(option?: StreamVisitorOption); traverse(stream: StreamTextResult<{}, never>): Promise>; }