UNPKG

koishi-plugin-best-cave

Version:

功能强大、高度可定制的回声洞插件。支持丰富的媒体类型、内容查重、AI分析、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。

100 lines (99 loc) 4.34 kB
import { Context, Logger } from 'koishi'; import { Config, CaveObject } from './index'; import { FileManager } from './FileManager'; /** * @description 定义了数据库 \`cave_meta\` 表的结构模型。 */ export interface CaveMetaObject { cave: number; rating: number; type: string; keywords: string[]; } declare module 'koishi' { interface Tables { cave_meta: CaveMetaObject; } } /** * @class AIManager * @description AI 管理器,作为连接 AI 服务与回声洞功能的核心模块。 */ export declare class AIManager { private ctx; private config; private logger; private fileManager; private http; private endpointIndex; private retryTime; /** * @description 用于分析的 AI 系统提示词。 */ private readonly ANALYSIS_SYSTEM_PROMPT; /** * @description 用于查重的 AI 系统提示词。 */ private readonly DUPLICATE_SYSTEM_PROMPT; /** * @constructor * @description AIManager 的构造函数。 * @param {Context} ctx - Koishi 的上下文对象。 * @param {Config} config - 插件的配置对象。 * @param {Logger} logger - 日志记录器实例。 * @param {FileManager} fileManager - 文件管理器实例。 */ constructor(ctx: Context, config: Config, logger: Logger, fileManager: FileManager); /** * @description 注册与 AI 功能相关的管理命令。 * @param {any} cave - \`cave\` 命令的实例,用于挂载子命令。 */ registerCommands(cave: any): void; /** * @description 检查新内容是否与数据库中已存在的回声洞重复。 * @param {CaveMetaObject} newAnalysis - 新内容经过 AI 分析后的元数据。 * @param {CaveObject} newCave - 待检查的新回声洞的完整对象。 * @returns {Promise<number[]>} - 一个 Promise,解析为重复的回声洞 ID 数组。如果不重复或检查失败,则为空数组。 */ checkForDuplicates(newAnalysis: CaveMetaObject, newCave: CaveObject): Promise<number[]>; /** * @description 对一个或多个回声洞内容进行 AI 分析。 * @param {CaveObject[]} caves - 需要分析的回声洞对象数组。 * @param {{ fileName: string; buffer: Buffer }[]} [mediaBuffers] - 可选的媒体文件缓存。 * @returns {Promise<CaveMetaObject[]>} - 一个 Promise,解析为分析结果(\`CaveMetaObject\`)的数组。 */ analyze(caves: CaveObject[], mediaBuffers?: { fileName: string; buffer: Buffer; }[]): Promise<CaveMetaObject[]>; /** * @description 准备单个回声洞的内容(文本和图片)以供 AI 模型处理。 * @param {CaveObject} cave - 要处理的回声洞对象。 * @param {Map<string, Buffer>} [mediaMap] - 媒体文件的缓存 Map。 * @returns {Promise<any[] | null>} - 一个 Promise,解析为适合 AI 请求的 content 数组,如果回声洞为空则返回 null。 */ private prepareContent; /** * @description 使用 AI 批量判断一个主要回声洞是否与一组候选回声洞中的任何一个重复。 * @param {CaveObject} mainCave - 主要的回声洞。 * @param {CaveObject[]} candidateCaves - 用于比较的候选回声洞数组。 * @returns {Promise<number[]>} - 一个 Promise,解析为重复的回声洞 ID 数组。如果不重复或检查失败,则为空数组。 */ private IsDuplicate; /** * @description 计算两组关键词之间的相似度(Jaccard 相似系数)。 * @param {string[]} keywordsA - 第一组关键词。 * @param {string[]} keywordsB - 第二组关键词。 * @returns {number} - 返回 0 到 100 之间的相似度百分比。 */ private calculateSimilarity; /** * @description 向配置的 AI 服务端点发送请求的通用方法。 * @template T - 期望从 AI 响应中解析出的 JSON 对象的类型。 * @param {any[]} messages - 发送给 AI 的消息数组。 * @param {string} systemPrompt - 系统提示词。 * @returns {Promise<T>} - 一个 Promise,解析为从 AI 响应中解析出的 JSON 对象。 * @throws {Error} - 如果 AI 服务持续失败或响应无法解析,则抛出错误。 */ private requestAI; }