UNPKG

ai

Version:

AI SDK by Vercel - The AI Toolkit for TypeScript and JavaScript

239 lines (205 loc) 6.23 kB
import { ReasoningPart } from '@ai-sdk/provider-utils'; import { CallWarning, FinishReason, LanguageModelRequestMetadata, LanguageModelResponseMetadata, ProviderMetadata, } from '../types'; import { Source } from '../types/language-model'; import { LanguageModelUsage } from '../types/usage'; import { ContentPart } from './content-part'; import { GeneratedFile } from './generated-file'; import { ResponseMessage } from './response-message'; import { DynamicToolCall, StaticToolCall, TypedToolCall } from './tool-call'; import { DynamicToolResult, StaticToolResult, TypedToolResult, } from './tool-result'; import { ToolSet } from './tool-set'; /** * The result of a single step in the generation process. */ export type StepResult<TOOLS extends ToolSet> = { /** * The content that was generated in the last step. */ readonly content: Array<ContentPart<TOOLS>>; /** * The generated text. */ readonly text: string; /** * The reasoning that was generated during the generation. */ readonly reasoning: Array<ReasoningPart>; /** * The reasoning text that was generated during the generation. */ readonly reasoningText: string | undefined; /** * The files that were generated during the generation. */ readonly files: Array<GeneratedFile>; /** * The sources that were used to generate the text. */ readonly sources: Array<Source>; /** * The tool calls that were made during the generation. */ readonly toolCalls: Array<TypedToolCall<TOOLS>>; /** * The static tool calls that were made in the last step. */ readonly staticToolCalls: Array<StaticToolCall<TOOLS>>; /** * The dynamic tool calls that were made in the last step. */ readonly dynamicToolCalls: Array<DynamicToolCall>; /** * The results of the tool calls. */ readonly toolResults: Array<TypedToolResult<TOOLS>>; /** * The static tool results that were made in the last step. */ readonly staticToolResults: Array<StaticToolResult<TOOLS>>; /** * The dynamic tool results that were made in the last step. */ readonly dynamicToolResults: Array<DynamicToolResult>; /** * The unified reason why the generation finished. */ readonly finishReason: FinishReason; /** * The raw reason why the generation finished (from the provider). */ readonly rawFinishReason: string | undefined; /** * The token usage of the generated text. */ readonly usage: LanguageModelUsage; /** * Warnings from the model provider (e.g. unsupported settings). */ readonly warnings: CallWarning[] | undefined; /** * Additional request information. */ readonly request: LanguageModelRequestMetadata; /** * Additional response information. */ readonly response: LanguageModelResponseMetadata & { /** * The response messages that were generated during the call. * Response messages can be either assistant messages or tool messages. * They contain a generated id. */ readonly messages: Array<ResponseMessage>; /** * Response body (available only for providers that use HTTP requests). */ body?: unknown; }; /** * Additional provider-specific metadata. They are passed through * from the provider to the AI SDK and enable provider-specific * results that can be fully encapsulated in the provider. */ readonly providerMetadata: ProviderMetadata | undefined; }; export class DefaultStepResult<TOOLS extends ToolSet> implements StepResult<TOOLS> { readonly content: StepResult<TOOLS>['content']; readonly finishReason: StepResult<TOOLS>['finishReason']; readonly rawFinishReason: StepResult<TOOLS>['rawFinishReason']; readonly usage: StepResult<TOOLS>['usage']; readonly warnings: StepResult<TOOLS>['warnings']; readonly request: StepResult<TOOLS>['request']; readonly response: StepResult<TOOLS>['response']; readonly providerMetadata: StepResult<TOOLS>['providerMetadata']; constructor({ content, finishReason, rawFinishReason, usage, warnings, request, response, providerMetadata, }: { content: StepResult<TOOLS>['content']; finishReason: StepResult<TOOLS>['finishReason']; rawFinishReason: StepResult<TOOLS>['rawFinishReason']; usage: StepResult<TOOLS>['usage']; warnings: StepResult<TOOLS>['warnings']; request: StepResult<TOOLS>['request']; response: StepResult<TOOLS>['response']; providerMetadata: StepResult<TOOLS>['providerMetadata']; }) { this.content = content; this.finishReason = finishReason; this.rawFinishReason = rawFinishReason; this.usage = usage; this.warnings = warnings; this.request = request; this.response = response; this.providerMetadata = providerMetadata; } get text() { return this.content .filter(part => part.type === 'text') .map(part => part.text) .join(''); } get reasoning() { return this.content.filter(part => part.type === 'reasoning'); } get reasoningText() { return this.reasoning.length === 0 ? undefined : this.reasoning.map(part => part.text).join(''); } get files() { return this.content .filter(part => part.type === 'file') .map(part => part.file); } get sources() { return this.content.filter(part => part.type === 'source'); } get toolCalls() { return this.content.filter(part => part.type === 'tool-call'); } get staticToolCalls() { return this.toolCalls.filter( (toolCall): toolCall is StaticToolCall<TOOLS> => toolCall.dynamic !== true, ); } get dynamicToolCalls() { return this.toolCalls.filter( (toolCall): toolCall is DynamicToolCall => toolCall.dynamic === true, ); } get toolResults() { return this.content.filter(part => part.type === 'tool-result'); } get staticToolResults() { return this.toolResults.filter( (toolResult): toolResult is StaticToolResult<TOOLS> => toolResult.dynamic !== true, ); } get dynamicToolResults() { return this.toolResults.filter( (toolResult): toolResult is DynamicToolResult => toolResult.dynamic === true, ); } }