@assistant-ui/react
Version:
TypeScript/React library for AI Chat
153 lines (137 loc) • 3.9 kB
text/typescript
import type { CompleteAttachment } from "./AttachmentTypes";
import type { ReadonlyJSONValue } from "assistant-stream/utils";
import type {
TextMessagePart,
ReasoningMessagePart,
SourceMessagePart,
ImageMessagePart,
FileMessagePart,
Unstable_AudioMessagePart,
ToolCallMessagePart,
ThreadUserMessagePart,
ThreadAssistantMessagePart,
} from "./MessagePartTypes";
// Re-export message part types for convenience
export type {
TextMessagePart,
ReasoningMessagePart,
SourceMessagePart,
ImageMessagePart,
FileMessagePart,
Unstable_AudioMessagePart,
ToolCallMessagePart,
ThreadUserMessagePart,
ThreadAssistantMessagePart,
};
// Alias for the role of a thread message
export type MessageRole = ThreadMessage["role"];
type MessageCommonProps = {
readonly id: string;
readonly createdAt: Date;
};
export type ThreadStep = {
readonly messageId?: string;
readonly usage?:
| {
readonly promptTokens: number;
readonly completionTokens: number;
}
| undefined;
};
export type MessagePartStatus =
| {
readonly type: "running";
}
| {
readonly type: "complete";
}
| {
readonly type: "incomplete";
readonly reason:
| "cancelled"
| "length"
| "content-filter"
| "other"
| "error";
readonly error?: unknown;
};
export type ToolCallMessagePartStatus =
| {
readonly type: "requires-action";
readonly reason: "interrupt";
}
| MessagePartStatus;
export type MessageStatus =
| {
readonly type: "running";
}
| {
readonly type: "requires-action";
readonly reason: "tool-calls" | "interrupt";
}
| {
readonly type: "complete";
readonly reason: "stop" | "unknown";
}
| {
readonly type: "incomplete";
readonly reason:
| "cancelled"
| "tool-calls"
| "length"
| "content-filter"
| "other"
| "error";
readonly error?: ReadonlyJSONValue;
};
export type ThreadSystemMessage = MessageCommonProps & {
readonly role: "system";
readonly content: readonly [TextMessagePart];
readonly metadata: {
readonly custom: Record<string, unknown>;
};
};
export type ThreadUserMessage = MessageCommonProps & {
readonly role: "user";
readonly content: readonly ThreadUserMessagePart[];
readonly attachments: readonly CompleteAttachment[];
readonly metadata: {
readonly custom: Record<string, unknown>;
};
};
export type ThreadAssistantMessage = MessageCommonProps & {
readonly role: "assistant";
readonly content: readonly ThreadAssistantMessagePart[];
readonly status: MessageStatus;
readonly metadata: {
readonly unstable_state: ReadonlyJSONValue;
readonly unstable_annotations: readonly ReadonlyJSONValue[];
readonly unstable_data: readonly ReadonlyJSONValue[];
readonly steps: readonly ThreadStep[];
readonly custom: Record<string, unknown>;
};
};
export type RunConfig = {
// TODO allow user customization via global type overrides
readonly custom?: Record<string, unknown>;
};
export type AppendMessage = Omit<ThreadMessage, "id"> & {
parentId: string | null;
/** The ID of the message that was edited or undefined. */
sourceId: string | null;
runConfig: RunConfig | undefined;
startRun?: boolean | undefined;
};
type BaseThreadMessage = {
readonly status?: ThreadAssistantMessage["status"];
readonly metadata: {
readonly unstable_state?: ReadonlyJSONValue;
readonly unstable_annotations?: readonly ReadonlyJSONValue[];
readonly unstable_data?: readonly ReadonlyJSONValue[];
readonly steps?: readonly ThreadStep[];
readonly custom: Record<string, unknown>;
};
readonly attachments?: ThreadUserMessage["attachments"];
};
export type ThreadMessage = BaseThreadMessage &
(ThreadSystemMessage | ThreadUserMessage | ThreadAssistantMessage);