@xsai/shared-chat
Version:
extra-small AI SDK.
308 lines (290 loc) • 10.6 kB
TypeScript
import { WithUnknown, CommonRequestOptions } from '@xsai/shared';
interface AudioContentPart {
input_audio: {
data: string;
format: 'mp3' | 'wav';
};
type: 'input_audio';
}
/** @internal */
type CommonContentPart = AudioContentPart | FileContentPart | ImageContentPart | TextContentPart;
interface FileContentPart {
file: {
file_data?: string;
file_id?: string;
filename?: string;
};
type: 'file';
}
interface ImageContentPart {
image_url: {
detail?: 'auto' | 'high' | 'low';
url: string;
};
type: 'image_url';
}
interface RefusalContentPart {
refusal: string;
type: 'refusal';
}
interface TextContentPart {
text: string;
type: 'text';
}
interface ToolCall {
function: ToolCallFunction | ToolCallFunctionWithoutArguments | ToolCallFunctionWithoutName;
id: string;
type: 'function';
}
interface ToolCallFunction {
arguments: string;
name: string;
}
interface ToolCallFunctionWithoutArguments {
arguments?: never;
name: string;
}
interface ToolCallFunctionWithoutName {
arguments: string;
name?: never;
}
interface AssistantMessage {
content?: (RefusalContentPart | TextContentPart)[] | string;
name?: string;
/** @see {@link https://cookbook.openai.com/articles/gpt-oss/handle-raw-cot#chat-completions-api} */
reasoning?: string;
/** @remarks OpenAI doesn't support this, but some providers do. */
reasoning_content?: string;
refusal?: string;
role: 'assistant';
tool_calls?: ToolCall[];
}
interface DeveloperMessage {
content: string | TextContentPart[];
name?: string;
/** @remarks Before using, confirm that your model supports this. */
role: 'developer';
}
type Message = AssistantMessage | DeveloperMessage | SystemMessage | ToolMessage | UserMessage;
interface SystemMessage {
content: string | TextContentPart[];
name?: string;
role: 'system';
}
interface ToolMessage {
/** @remarks considering the support of ecosystems (such as MCP), we have relaxed this type. */
content: CommonContentPart[] | string;
role: 'tool';
tool_call_id: string;
}
interface UserMessage {
content: CommonContentPart[] | string;
name?: string;
role: 'user';
}
interface CompletionToolCall {
args: string;
toolCallId: string;
toolCallType: 'function';
toolName: string;
}
interface CompletionToolResult {
args: Record<string, unknown>;
result: ToolExecuteResult;
toolCallId: string;
toolName: string;
}
type PostToolCall = (toolResult: CompletionToolResult, options: ToolExecuteOptions) => CompletionToolResult | Promise<CompletionToolResult | void> | void;
type PreToolCall = (toolCall: CompletionToolCall, options: ToolExecuteOptions) => CompletionToolCall | CompletionToolResult | Promise<CompletionToolCall | CompletionToolResult | void> | void;
interface Tool {
execute: (input: unknown, options: ToolExecuteOptions) => Promise<ToolExecuteResult> | ToolExecuteResult;
function: {
description?: string;
name: string;
parameters: Record<string, unknown>;
strict?: boolean;
};
type: 'function';
}
interface ToolExecuteOptions {
abortSignal?: AbortSignal;
messages: Message[];
toolCallId: string;
}
type ToolExecuteResult = object | string | unknown[];
interface ChatCompletionUsage {
completion_tokens: number;
prompt_tokens: number;
total_tokens: number;
}
interface Usage {
inputTokens: number;
outputTokens: number;
totalTokens: number;
}
interface ErrorEvent {
cause?: unknown;
message: string;
type: 'error';
}
type Event = ErrorEvent | ReasoningDeltaEvent | ReasoningDoneEvent | ReasoningStartEvent | StepDoneEvent | StepStartEvent | TextDeltaEvent | TextDoneEvent | TextStartEvent | ToolCallDeltaEvent | ToolCallDoneEvent | ToolCallStartEvent | ToolResultDoneEvent;
type EventType = Event['type'];
interface ReasoningDeltaEvent {
delta: string;
type: 'reasoning.delta';
}
interface ReasoningDoneEvent {
content: string;
type: 'reasoning.done';
}
interface ReasoningStartEvent {
type: 'reasoning.start';
}
interface StepDoneEvent {
type: 'step.done';
usage?: Usage;
}
interface StepStartEvent {
type: 'step.start';
}
interface TextDeltaEvent {
delta: string;
type: 'text.delta';
}
interface TextDoneEvent {
content: string;
type: 'text.done';
}
interface TextStartEvent {
type: 'text.start';
}
interface ToolCallDeltaEvent {
delta: string;
type: 'tool-call.delta';
}
interface ToolCallDoneEvent extends CompletionToolCall {
type: 'tool-call.done';
}
interface ToolCallStartEvent extends Omit<CompletionToolCall, 'args' | 'toolCallType'> {
type: 'tool-call.start';
}
interface ToolResultDoneEvent extends CompletionToolResult {
type: 'tool-result.done';
}
type FinishReason = 'content_filter' | 'error' | 'length' | 'other' | 'stop' | 'tool-calls' | 'tool_calls' | (string & {});
type CompletionStep<T extends boolean = false> = (T extends true ? {
usage: Usage;
} : {
usage?: Usage;
}) & {
finishReason: FinishReason;
text?: string;
toolCalls: CompletionToolCall[];
toolResults: CompletionToolResult[];
};
type ToolChoice = AllowedTools | ToolChoiceMode | ToolChoiceTool;
interface AllowedTools {
mode: 'auto' | 'required';
tools: ToolChoiceTool[];
type: 'allowed_tools';
}
type ToolChoiceMode = 'auto' | 'none' | 'required';
interface ToolChoiceTool {
function: {
name: string;
};
type: 'function';
}
type PrepareStep<TInput = Message[], TToolChoice = ToolChoice> = (options: PrepareStepOptions<TInput>) => PrepareStepResult<TInput, TToolChoice> | Promise<PrepareStepResult<TInput, TToolChoice>>;
interface PrepareStepOptions<TInput = Message[]> {
input: TInput;
model: string;
stepNumber: number;
steps: CompletionStep[];
}
interface PrepareStepResult<TInput = Message[], TToolChoice = ToolChoice> {
input?: TInput;
model?: string;
toolChoice?: TToolChoice;
}
type StopCondition<Input = unknown> = (context: StopContext<Input>) => boolean;
interface StopContext<Input = unknown> {
input: readonly Input[];
step: CompletionStep;
steps: readonly CompletionStep[];
}
/** @see {@link https://platform.openai.com/docs/api-reference/chat/create} */
interface ChatOptions extends CommonRequestOptions {
/**
* number between -2.0 and 2.0.
* @default 0
*/
frequencyPenalty?: number;
messages: Message[];
/** Whether to enable parallel function calling during tool use. */
parallelToolCalls?: boolean;
/**
* number between -2.0 and 2.0.
* @default 0
*/
presencePenalty?: number;
/** Constrains effort on reasoning for reasoning models. */
reasoningEffort?: 'high' | 'medium' | 'minimal' | 'none' | 'xhigh';
seed?: number;
/** up to 4 sequences where the API will stop generating further tokens. */
stop?: [string, string, string, string] | [string, string, string] | [string, string] | [string] | string;
/**
* what sampling temperature to use, between 0 and 2.
* @default 1
*/
temperature?: number;
/** Controls which (if any) tool is called by the model. */
toolChoice?: ToolChoice;
/** A list of tools the model may call. */
tools?: Tool[];
/** @remarks OpenAI doesn't support this, but some providers do. */
topK?: number;
/** @default 1 */
topP?: number;
}
declare const chat: <T extends WithUnknown<ChatOptions>>(options: T) => Promise<Response>;
interface ExecuteToolOptions<T = ToolMessage['content']> {
abortSignal?: AbortSignal;
messages: Message[];
postToolCall?: PostToolCall;
preToolCall?: PreToolCall;
toolCall: ToolCall;
tools?: Tool[];
wrapResult?: (result: ToolExecuteResult) => T;
}
interface ExecuteToolResult<T = ToolMessage['content']> {
completionToolCall: CompletionToolCall;
completionToolResult: CompletionToolResult;
result: T;
}
declare const executeTool: <T = ToolMessage["content"]>({ abortSignal, messages, postToolCall, preToolCall, toolCall, tools, wrapResult }: ExecuteToolOptions<T>) => Promise<ExecuteToolResult<T>>;
interface ResolvePrepareStepOptions<TInput = Message[], TToolChoice = ToolChoice> {
input: TInput;
model: string;
prepareStep?: PrepareStep<TInput, TToolChoice>;
stepNumber: number;
steps: CompletionStep[];
toolChoice?: TToolChoice;
}
interface ResolvePrepareStepResult<TInput = Message[], TToolChoice = ToolChoice> {
input: TInput;
model: string;
toolChoice?: TToolChoice;
}
declare const resolvePrepareStep: <TInput, TToolChoice>({ input, model, prepareStep, stepNumber, steps, toolChoice }: ResolvePrepareStepOptions<TInput, TToolChoice>) => Promise<ResolvePrepareStepResult<TInput, TToolChoice>>;
declare const and: <Input = unknown>(...conditions: StopCondition<Input>[]) => StopCondition<Input>;
declare const or: <Input = unknown>(...conditions: StopCondition<Input>[]) => StopCondition<Input>;
declare const not: <Input = unknown>(condition: StopCondition<Input>) => StopCondition<Input>;
declare const stepCountAtLeast: (count: number) => StopCondition;
declare const hasToolCall: (name?: string) => StopCondition;
/** @internal */
declare const shouldStop: <Input = unknown>(stopWhen: StopCondition<Input>, context: StopContext<Input>) => boolean;
declare const computeTotalUsage: (totalUsage: undefined | Usage, usage: Usage) => Usage;
declare const normalizeChatCompletionUsage: (usage: ChatCompletionUsage) => Usage;
export { and, chat, computeTotalUsage, executeTool, hasToolCall, normalizeChatCompletionUsage, not, or, resolvePrepareStep, shouldStop, stepCountAtLeast };
export type { AssistantMessage, AudioContentPart, ChatCompletionUsage, ChatOptions, CommonContentPart, CompletionStep, CompletionToolCall, CompletionToolResult, DeveloperMessage, ErrorEvent, Event, EventType, ExecuteToolOptions, ExecuteToolResult, FileContentPart, FinishReason, ImageContentPart, Message, PostToolCall, PreToolCall, PrepareStep, PrepareStepOptions, PrepareStepResult, ReasoningDeltaEvent, ReasoningDoneEvent, ReasoningStartEvent, RefusalContentPart, ResolvePrepareStepOptions, ResolvePrepareStepResult, StepDoneEvent, StepStartEvent, StopCondition, StopContext, SystemMessage, TextContentPart, TextDeltaEvent, TextDoneEvent, TextStartEvent, Tool, ToolCall, ToolCallDeltaEvent, ToolCallDoneEvent, ToolCallStartEvent, ToolChoice, ToolExecuteOptions, ToolExecuteResult, ToolMessage, ToolResultDoneEvent, Usage, UserMessage };