UNPKG

koishi-plugin-hhs-huatu

Version:
191 lines (190 loc) 7.39 kB
import { Context, Dict } from 'koishi'; import { ImageData } from './types'; declare module 'koishi' { interface Context { runtime?: { currentTokenIndex: number; tokenUsage?: Record<number, boolean>; tokenPool?: string[]; poolIndex?: number; lastPoolRefreshTime?: number; _forcedTokenIndex?: number; _redraw?: boolean; _timeStamp?: number; _taskIndex?: number; _taskId?: number; }; } } export declare function project(object: {}, mapping: {}): {}; export interface Size { width: number; height: number; } export declare function getImageSize(buffer: ArrayBuffer): Size; /** * 图片内存缓存,以 URL 为 key 缓存已下载的 ImageData。 * - 默认 TTL 为 5 分钟(300000ms),每次读取时自动刷新 * - 最大内存上限默认 200MB,超过时自动淘汰最久未使用的条目(LRU) * - TTL 到期后自动从内存中移除 * - 利用 Map 的插入顺序特性实现 LRU:访问时删除并重新插入到末尾 */ declare class ImageCache { private cache; private ttl; private maxBytes; private currentBytes; /** * @param ttlMs 缓存过期时间(毫秒),默认 5 分钟 * @param maxMB 最大缓存内存(MB),默认 200MB */ constructor(ttlMs?: number, maxMB?: number); /** 从缓存中获取图片,命中时刷新 TTL 并更新 LRU 顺序 */ get(url: string): ImageData | undefined; /** 将图片存入缓存,超过内存上限时淘汰最久未使用的条目 */ set(url: string, data: ImageData): void; /** 内部方法:移除指定条目并释放内存计数 */ private _evict; /** 清除所有缓存条目 */ clear(): void; /** 当前缓存条目数 */ get size(): number; /** 当前缓存占用内存(字节) */ get memoryUsage(): number; /** 当前缓存占用内存(MB,保留两位小数) */ get memoryUsageMB(): number; } /** 全局图片缓存实例(TTL 5分钟,上限 200MB) */ export declare const imageCache: ImageCache; export declare function download(ctx: Context, url: string, headers?: {}): Promise<ImageData>; export declare function calcAccessKey(email: string, password: string): Promise<string>; export declare function calcEncryptionKey(email: string, password: string): Promise<string>; export declare class NetworkError extends Error { params: {}; constructor(message: string, params?: {}); static catch: (mapping: Dict<string>) => (e: any) => never; } export declare function initTokenPool(ctx: Context): Promise<string[]>; export declare function login(ctx: Context, email: string, password: string): Promise<string>; export declare function closestMultiple(num: number, mult?: number): number; export interface Size { width: number; height: number; /** Indicate whether this resolution is pre-defined or customized */ custom?: boolean; } export declare function resizeInput(size: Size): Size; export declare function forceDataPrefix(url: string, mime?: string): string; /** * 将位置字符串(如 "A1" 到 "E5")转换为坐标 * 横向: A(-0.4) → B(-0.2) → C(0) → D(+0.2) → E(+0.4) * 纵向: 1(-0.4) → 2(-0.2) → 3(0) → 4(+0.2) → 5(+0.4) * @param position 位置字符串,默认为 "C3" (中心点) * @returns 坐标对象 { x, y },值域为 [0.1, 0.9] */ export declare function convertPosition(position?: string): { x: number; y: number; }; /** * 检查模型是否支持 Characters 功能 * @param model 模型名称 * @returns 是否支持 Characters */ export declare function modelSupportsCharacters(model: string): boolean; /** * 解析用户友好的 characters 文本格式 * 格式:prompt@position --uc:negative;prompt2@position2 * * 示例: * - "1girl, red hair@B3;1boy, blue eyes@D3" * - "1girl@B3 --uc:frown;1boy@D3" * - "princess, dress@C2 --uc:messy;knight@C4" * - 支持中文分号:"1girl@B3;1boy@D3" * * @param input 用户输入的字符串 * @returns Character 数组 */ export declare function parseCharacters(input: string): Array<{ prompt: string; uc?: string; position?: string; }>; export declare function createContextWithRuntime(ctx: Context, runtime: any): Context; /** * 将尺寸对齐到64的倍数(NovelAI API要求) */ export declare function alignTo64(size: number): number; /** * NovelAI 最大总像素数限制(不包括该值本身) * 经测试:28*64 x 28*64 = 1792x1792 = 3,211,264 不能生成 * 27*64 x 28*64 = 1728x1792 = 3,096,576 可以生成 */ export declare const NAI_MAX_PIXELS = 3211264; /** * 将宽高限制在 NovelAI 最大像素限制范围内 * 如果总像素数 >= NAI_MAX_PIXELS,等比缩小并对齐到64的倍数 * @param width 原始宽度(已对齐64) * @param height 原始高度(已对齐64) * @returns 缩小后的尺寸和是否发生了缩小 */ export declare function clampToNAILimit(width: number, height: number): { width: number; height: number; clamped: boolean; }; /** * 将图片调暗并对齐尺寸(用于局部重绘的交互式流程) * @param imageData 原始图片数据 * @param factor 调暗系数(0-1,默认0.5) * @param targetWidth 可选的目标宽度(用户通过 -r 指定时传入) * @param targetHeight 可选的目标高度(用户通过 -r 指定时传入) * @returns 调暗后的图片Data URL和对齐后的尺寸 */ export declare function darkenImage(imageData: ImageData, factor?: number, targetWidth?: number, targetHeight?: number): Promise<{ dataUrl: string; alignedWidth: number; alignedHeight: number; originalBuffer: Buffer; }>; /** * 针对 NovelAI V4 优化的 Mask 处理算法 * 逻辑复刻自 Auto-NovelAI-Refactor 的 process_white_regions * 1. 二值化 * 2. 8x8 网格对齐 (Latent Alignment) * 3. 区域膨胀 (Block Dilation) 确保覆盖边缘 * * @param imageData 用户涂白的图片数据 * @param targetWidth 目标宽度(对齐到64的倍数) * @param targetHeight 目标高度(对齐到64的倍数) * @returns 处理后的遮罩base64(不含data:前缀) */ export declare function extractMaskWithAntiArtifact(imageData: ImageData, targetWidth: number, targetHeight: number): Promise<string>; /** * 从用户涂白的图片中提取遮罩并进行膨胀处理(旧版,保留兼容) * @deprecated 推荐使用 extractMaskWithAntiArtifact */ export declare function extractAndDilateMask(imageData: ImageData, threshold?: number, minPenSize?: number): Promise<string>; /** * 检查模型是否支持 Character Reference Image 功能 * 仅 v4.5 模型支持此功能 * @param model 模型名称 * @returns 是否支持角色参考 */ export declare function modelSupportsCharacterReference(model: string): boolean; /** * 将角色参考图片调整到 NovelAI 要求的尺寸 * 参考 Auto-NovelAI-Refactor 的 process_image_by_orientation 函数 * - 横图:1536×1024 * - 竖图:1024×1536 * - 方图:1472×1472 * * @param imageData 原始图片数据 * @returns 处理后的图片 base64(不含 data: 前缀)和尺寸信息 */ export declare function processCharacterReferenceImage(imageData: ImageData): Promise<{ base64: string; width: number; height: number; }>; export {};