import { Context, Service } from "koishi"; import { Config } from "../../config"; import { Services } from "../../shared/constants"; export type Snippet = (currentScope: Record) => any | Promise; export interface Injection { /** 注入片段的唯一名称,用于调试和覆盖 (e.g., "my-plugin.tools") */ name: string; /** 渲染优先级,数字越小,越先被渲染和展示 */ priority: number; /** 渲染函数,返回一个字符串或可以被渲染为字符串的内容 */ renderFn: Snippet; } export declare class PromptService extends Service { static readonly inject: Services[]; private readonly renderer; private readonly templates; private readonly snippets; private readonly injections; private _logger; constructor(ctx: Context, config: Config); protected start(): Promise; protected stop(): Promise; /** * 注册一个核心动态片段 (Snippet) * 用于构建作用域,通常由核心服务或高级插件使用。 * @param key - 片段的唯一键 (e.g., "user.name") * @param snippetFn - 在渲染时执行以提供动态数据的函数 */ registerSnippet(key: string, snippetFn: Snippet): void; /** * 注入一个将自动添加到主提示词的片段。 * @param name - 注入的唯一名称,用于标识和调试。 * @param priority - 优先级,数字越小越靠前。 * @param renderFn - 渲染函数,返回一个字符串。其返回值可以包含其他占位符,将进行二次渲染。 */ inject(name: string, priority: number, renderFn: Snippet): void; /** * 注册一个提示词模板 * @param name - 模板的唯一名称 (e.g., "agent.chat.system") * @param content - 包含占位符的模板字符串 */ registerTemplate(name: string, content: string): void; /** * 渲染一个提示词模板 * @param templateName - 要渲染的模板名称 * @param initialScope - 用户在调用时传入的初始数据 * @returns 一个 Promise,解析为最终渲染好的提示词字符串 */ render(templateName: string, initialScope?: Record): Promise; /** * 渲染一个原始的模板字符串,不经过注册 */ renderRaw(templateContent: string, initialScope?: Record): Promise; private registerDefaultSnippets; private registerDefaultInjections; private buildScope; private setNestedProperty; }