import { Context, Element, Session } from "koishi"; import { type UserMessagePart } from "../../dependencies/xsai"; import { ChatMessage, Interaction } from "../../types/model"; import { Message, ConversationSummary } from "./types"; export interface MultimodalConfig { Enabled: boolean; ImageDetail: "low" | "high" | "auto"; MaxImagesPerPrompt: number; } interface ImageInfo { element: Element; timestamp: Date; messageId: string; imageId?: string; imageUrl?: string; } /** * 统一的场景类,管理对话上下文和状态 */ export declare class Scenario { readonly ctx: Context; readonly session: Session; private readonly limit; private readonly multimodalConfig; readonly id: string; metadata: Record; summary: ConversationSummary | null; private messages; private pendingMessages; private recallSize; private lastReplyTime; private platformAdapter; private imageProcessor; constructor(ctx: Context, session: Session, limit: number, multimodalConfig: MultimodalConfig); private createPlatformAdapter; /** * 判断场景是否有新消息,是否活跃 */ get isActive(): boolean; /** * 异步加载初始数据 */ load(): Promise; private loadHistoricalData; private loadMetadata; private getMetaData; /** * 添加消息到场景 */ addMessage(message: Message, isPending?: boolean, isLoading?: boolean): void; /** * 同步 Interaction 的生命周期,在内存中递减 life 并移除生命周期结束的 Interaction。 * 这个方法由 ScenarioManager 在数据库操作后调用。 */ syncAndPruneInteractions(): void; /** * 将待处理消息提交到主消息历史中 */ commitPendingMessages(): void; /** * 获取所有消息 */ getMessages(includePending?: boolean): Message[]; /** * 将新消息转移到已读历史中,并重置活跃状态。 * 在机器人成功回复后调用。 */ clearPendingMessages(): void; /** * 渲染场景内容 */ renderForPrompt(): Promise>; /** * 渲染聊天历史 */ protected renderChatHistory(promptParts: UserMessagePart[], allowedImageSet: Set): Promise; /** * 渲染新消息 */ protected renderNewMessages(promptParts: UserMessagePart[], allowedImageSet: Set): Promise; /** * 渲染场景为LLM的Prompt */ render(): Promise>; private renderSummary; private renderMessageHistory; /** * 格式化上下文记录 */ protected formatContext(record: ChatMessage | Interaction, allowedImageSet: Set): Promise; /** * 格式化消息 * @param message 消息对象 * @param allowedImageSet 允许渲染的图片集合 * @returns 格式化后的消息部分数组 */ protected formatMessage(message: ChatMessage, allowedImageSet: Set): Promise; /** * 处理图片元素,根据是否在允许渲染的集合中返回相应的部分 * @param elem 图片元素 * @param messageId 消息ID * @param allowedImageSet 允许渲染的图片集合 * @returns 图片处理结果部分数组 */ private processImageElement; /** * 格式化交互记录 */ protected formatInteraction(interaction: Interaction): string; /** * 提取 sender 格式化逻辑为私有方法,避免重复 * @param message 消息对象 * @returns 格式化后的发送者字符串 */ private getSenderString; /** * 处理元素 */ protected processElement(elem: Element, messageId: string, allowedImageSet: Set): Promise; /** * 格式化发送者 */ protected formatSender(message: ChatMessage): string; /** * 收集所有消息中的图片信息 * @param records 消息或交互记录数组 * @returns 图片信息数组,按时间排序(最新的在前) */ protected collectAllImages(records: (ChatMessage | Interaction)[]): Promise; /** * 选择允许渲染的图片 */ protected selectAllowedImages(images: ImageInfo[]): ImageInfo[]; /** * 获取图片键值 */ protected getImageKey(image: ImageInfo): string; /** * 辅助方法:添加文本部分 */ protected appendTextPart(parts: UserMessagePart[], text: string): void; /** * 添加格式化的部分 */ protected appendFormattedParts(parts: UserMessagePart[], newParts: UserMessagePart[], indentLevel: number): void; } export {};