koishi-plugin-image-prompt 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +92 -125
- package/lib/index.js +694 -871
- package/package.json +3 -3
- package/readme.md +133 -186
- package/src/index.ts +3426 -3691
package/lib/index.d.ts
CHANGED
|
@@ -9,15 +9,7 @@ export declare const inject: {
|
|
|
9
9
|
required: string[];
|
|
10
10
|
optional: string[];
|
|
11
11
|
};
|
|
12
|
-
export declare const usage = "\n---\n\n\u6B64\u63D2\u4EF6\u76F4\u63A5\u8C03\u7528 OpenAI \u517C\u5BB9\u7684 Chat Completions \u63A5\u53E3\u751F\u6210\u56FE\u7247\n\n\u8BF7\u5728\u63D2\u4EF6\u8BBE\u7F6E\u4E2D\u586B\u5199\uFF1A\n\n- API \u670D\u52A1\u5668\u5730\u5740\uFF08baseUrl\uFF09\n- \u4F7F\u7528\u7684\u6A21\u578B\uFF08model\uFF09\n- API \u5BC6\u94A5\uFF08apiKey\uFF09\n\n\
|
|
13
|
-
/**
|
|
14
|
-
* 解析模型返回的 JSON 选择结果(纯函数,便于单独测试)
|
|
15
|
-
* @param raw 模型的原始回复
|
|
16
|
-
* @param candidates 候选图片列表(编号从 1 开始)
|
|
17
|
-
* @param max 最多选取数量
|
|
18
|
-
* @param warn 日志回调
|
|
19
|
-
*/
|
|
20
|
-
export declare function parseSelectionResult(raw: string | null, candidates: CandidateImage[], max: number, warn?: (msg: string) => void): SelectionResult;
|
|
12
|
+
export declare const usage = "\n---\n\n\u6B64\u63D2\u4EF6\u76F4\u63A5\u8C03\u7528 OpenAI \u517C\u5BB9\u7684 Chat Completions \u63A5\u53E3\u751F\u6210\u56FE\u7247\n\n\u8BF7\u5728\u63D2\u4EF6\u8BBE\u7F6E\u4E2D\u586B\u5199\uFF1A\n\n- API \u670D\u52A1\u5668\u5730\u5740\uFF08baseUrl\uFF09\n- \u4F7F\u7528\u7684\u6A21\u578B\uFF08model\uFF09\n- API \u5BC6\u94A5\uFF08apiKey\uFF09\n\n\u3010Agent \u6A21\u5F0F\uFF08\u9ED8\u8BA4\uFF0C\u63A8\u8350\uFF09\u3011\n\n\u6307\u4EE4\u4E00\u89E6\u53D1\uFF0C\u63D2\u4EF6\u5C31\u628A\u300C\u7528\u6237\u8BF4\u4E86\u4EC0\u4E48 + \u6307\u4EE4\u63D0\u793A\u8BCD + \u53EF\u7528\u7684\u53C2\u8003\u56FE\u300D\u5168\u90E8\u4EA4\u7ED9**\u5BF9\u8BDD\u6A21\u578B**\uFF0C\n\u7531\u6A21\u578B\u81EA\u5DF1\u51B3\u5B9A\u4E0B\u4E00\u6B65 \u2014\u2014 \u8DDF NeoBot \u4E00\u4E2A\u5957\u8DEF\uFF1A\n\n- **gallery_search**\uFF1A\u6A21\u578B\u81EA\u5DF1\u6309\u5173\u952E\u8BCD\u641C\u53C2\u8003\u56FE\u5E93\uFF08\u5173\u952E\u8BCD\u7531\u5B83\u81EA\u5DF1\u62DF\uFF0C\u4E0D\u7528\u4F60\u5728\u914D\u7F6E\u91CC\u5199\u89C4\u5219\uFF09\n- **ask_user**\uFF1A\u95EE\u9898\u4E0D\u6E05\u695A\u3001\u7F3A\u53C2\u8003\u56FE\u3001\u5F00\u753B\u524D\u8981\u786E\u8BA4\uFF0C\u6A21\u578B\u81EA\u5DF1\u5F00\u53E3\u95EE\uFF0C\u5E76\u7B49\u7528\u6237\u56DE\u8BDD\n- **draw**\uFF1A\u628A prompt \u548C\u5B83\u6311\u4E2D\u7684\u53C2\u8003\u56FE\u7F16\u53F7\u4EA4\u51FA\u53BB\uFF0C\u771F\u6B63\u5F00\u59CB\u753B\n\n\u4E5F\u5C31\u662F\u8BF4\uFF1A**\u53C2\u8003\u56FE\u9009\u8C01\u3001\u8981\u4E0D\u8981\u8FFD\u95EE\u3001\u4EC0\u4E48\u65F6\u5019\u5F00\u753B\uFF0C\u5168\u90E8\u662F\u6A21\u578B\u81EA\u5DF1\u51B3\u5B9A\u7684**\uFF0C\n\u63D2\u4EF6\u4E0D\u518D\u5199\u6B7B\u300C\u6253\u5206 \u2192 \u9608\u503C \u2192 \u4E0D\u591F\u5C31\u95EE\u7528\u6237\u300D\u8FD9\u5957\u6D41\u7A0B\u3002\n\u6A21\u578B\u60F3\u641C\u51E0\u6B21\u56FE\u5E93\u3001\u60F3\u548C\u7528\u6237\u6765\u56DE\u51E0\u8F6E\u90FD\u884C\uFF0C\u76F4\u5230\u5B83\u8BA4\u4E3A\u53EF\u4EE5\u753B\u4E86\u3002\n\n\u8981\u6C42\uFF1A\u586B\u5199\u7684\u5BF9\u8BDD\u6A21\u578B\u5FC5\u987B**\u652F\u6301 function calling\uFF08\u5DE5\u5177\u8C03\u7528\uFF09**\u3002\n\u4E0D\u652F\u6301\u4E5F\u6CA1\u5173\u7CFB \u2014\u2014 \u63D2\u4EF6\u5185\u7F6E\u4E86\u300C\u53EA\u7528\u4E00\u884C JSON \u8C03\u7528\u5DE5\u5177\u300D\u7684\u515C\u5E95\u534F\u8BAE\uFF0C\u6A21\u578B\u7167\u6837\u80FD\u8DD1\u6D41\u7A0B\u3002\n\n\u76F8\u5173\u5F00\u5173\uFF1A\n- \u300C\u542F\u7528 Agent \u6A21\u5F0F\u300D\u9ED8\u8BA4\u5F00\u3002\u5173\u6389\u5C31\u9000\u5316\u6210\u300C\u6307\u4EE4\u63D0\u793A\u8BCD + \u7528\u6237\u9644\u52A0\u9700\u6C42\u76F4\u63A5\u753B\u300D\uFF0C\u4E0D\u67E5\u56FE\u5E93\u4E5F\u4E0D\u8FFD\u95EE\u3002\n- \u300C\u5F00\u753B\u524D\u5148\u95EE\u4E00\u53E5\u300D\u9ED8\u8BA4\u5F00\uFF1A\u6A21\u578B\u753B\u4E4B\u524D\u4F1A\u5148\u7528 ask_user \u628A\u300C\u672C\u6B21\u53C2\u8003\u54EA\u51E0\u5F20\u56FE + \u5927\u81F4\u753B\u9762\u300D\u544A\u8BC9\u4F60\uFF0C\u4F60\u70B9\u5934\u5B83\u624D\u753B\u3002\n- \u300C\u6700\u591A\u53C2\u8003\u56FE\u6570\u91CF\u300D\u300C\u5355\u6B21\u641C\u7D22\u8FD4\u56DE\u6761\u6570\u300D\u300C\u8BE2\u95EE\u7B49\u5F85\u65F6\u95F4\u300D\u300C\u6700\u591A\u6765\u56DE\u8F6E\u6570\u300D\u90FD\u5728 agent \u914D\u7F6E\u91CC\u8C03\u3002\n\n\u3010\u53C2\u8003\u56FE\u7247\u7EC4 / \u56FE\u5E93\u3011\n\n1. \u5728\u300C\u53C2\u8003\u56FE\u7247\u7EC4\u300D\u91CC\u6CE8\u518C\u5206\u7EC4\uFF1A\u6BCF\u7EC4\u586B\u300C\u56FE\u7247\u94FE\u63A5 + \u63CF\u8FF0\u300D\u3002**\u63CF\u8FF0\u8981\u5199\u5177\u4F53**\uFF08\u53D1\u8272\u53D1\u578B\u3001\u670D\u88C5\u3001\u52A8\u4F5C\u3001\u753B\u98CE\uFF09\uFF0C\n \u6A21\u578B\u5C31\u662F\u9760\u8FD9\u53E5\u63CF\u8FF0\u641C\u5230\u5B83\u7684\u3002\n2. \u5728\u6307\u4EE4\u914D\u7F6E\u7684\u300C\u5F15\u7528\u7684\u53C2\u8003\u56FE\u7247\u7EC4\u540D\u79F0\u300D\u91CC\u586B\u7EC4\u540D\uFF08\u53EF\u591A\u4E2A\uFF09\uFF1B\u6A21\u578B\u53EA\u4F1A\u5728\u8FD9\u4E2A\u8303\u56F4\u5185\u641C\u3002\n \u7559\u7A7A\u4E14\u5F00\u542F\u300C\u5141\u8BB8\u641C\u7D22\u5168\u90E8\u7EC4\u300D\u65F6\uFF0C\u6240\u6709\u7EC4\u90FD\u80FD\u641C\u5230\u3002\n3. \u300C\u751F\u6210\u63CF\u8FF0\u300D\u6307\u4EE4\u53EF\u4EE5\u8BA9\u6A21\u578B\u770B\u56FE\u81EA\u52A8\u5199\u63CF\u8FF0\u5E76\u5199\u56DE\u914D\u7F6E\uFF08\u9700\u8981\u652F\u6301\u56FE\u7247\u8F93\u5165\u7684\u6A21\u578B\uFF09\u3002\n4. \u751F\u6210\u7ED3\u679C\u53EF\u81EA\u52A8\u5165\u5E93\uFF08\u9ED8\u8BA4\u5173\u95ED\uFF09\uFF0C\u4E0B\u6B21\u80FD\u88AB\u81EA\u5DF1\u641C\u5230\u5E76\u590D\u7528\uFF0C\u5F62\u6210\u95ED\u73AF\u3002\n\n\u3010\u5176\u5B83\u3011\n\n- \u300C\u6536\u5230\u63D0\u793A\u300D\u9ED8\u8BA4\u5F00\uFF1A\u6307\u4EE4\u89E6\u53D1\u7ACB\u523B\u56DE\u4E00\u6761\u300C\u6536\u5230\uFF0C\u6B63\u5728\u51C6\u5907...\u300D\uFF0C\u4E0D\u8BA9\u7528\u6237\u4EE5\u4E3A\u5361\u4F4F\u3002\n- \u300C\u540E\u53F0\u7ED8\u56FE\u300D\u5F00\u542F\u540E\u51FA\u56FE\u4E0D\u963B\u585E\uFF0C\u5148\u56DE\u300C\u6B63\u5728\u753B\u300D\uFF0C\u753B\u597D\u4E3B\u52A8\u63A8\u9001\u3002\n- \u300C\u6587\u5B57\u6E32\u67D3\u53C2\u8003\u56FE\u300D\u628A\u753B\u9762\u4E0A\u7684\u6587\u5B57\uFF08\u53F0\u8BCD/\u62DB\u724C\uFF09\u5148\u6E32\u67D3\u6210\u56FE\u7247\u4E00\u8D77\u53D1\u7ED9\u7ED8\u56FE\u6A21\u578B\uFF0C\u89E3\u51B3\u4E2D\u6587\u5D29\u5B57\u3002\n- \u56DE\u663E\u63D0\u793A\u8BCD\u3001\u7ED3\u679C\u56FE\u5C3A\u5BF8/\u8D70 assets \u7B49\u90FD\u5728\u300C\u6D88\u606F\u53D1\u9001\u300D\u91CC\u3002\n\nAgent \u6307\u4EE4\u6A21\u677F\u53EF\u7528\u5360\u4F4D\u7B26\uFF1A{command} \u6307\u4EE4\u540D\u3001{prompt} \u6307\u4EE4\u63D0\u793A\u8BCD\u3001{userInput} \u7528\u6237\u9644\u52A0\u9700\u6C42\u3001{imageCount} \u7528\u6237\u968F\u6D88\u606F\u53D1\u7684\u56FE\u6570\u91CF\u3001{refCount} \u53EF\u68C0\u7D22\u7684\u53C2\u8003\u56FE\u6570\u91CF\n\n---\n\u6B64\u9879\u76EE\u6240\u9700\u7684koishi\u670D\u52A1\uFF1A\u5FC5\u9700 'http', 'logger', 'i18n'\uFF1B\u53EF\u9009 'puppeteer'\uFF08\u4EC5\u300C\u6587\u5B57\u6E32\u67D3\u53C2\u8003\u56FE\u300D\u9700\u8981\uFF09\n\n---\n";
|
|
21
13
|
/**
|
|
22
14
|
* 计算重试等待时间(毫秒):限流类错误优先用 Retry-After,否则指数退避
|
|
23
15
|
* @param status HTTP 状态码
|
|
@@ -26,63 +18,59 @@ export declare function parseSelectionResult(raw: string | null, candidates: Can
|
|
|
26
18
|
* @param attempt 第几次重试(从 0 开始)
|
|
27
19
|
*/
|
|
28
20
|
export declare function computeRetryDelay(status: any, retryAfter: number | undefined, baseInterval: number, attempt: number): number;
|
|
29
|
-
/**
|
|
30
|
-
* 第一级检索:按关键词在候选池里做文本匹配召回(纯本地,不发请求)
|
|
31
|
-
* 支持中文子串匹配 + 2-gram 部分命中,关键词可含空格/顿号(会自动拆分)
|
|
32
|
-
*/
|
|
33
|
-
export declare function matchCandidatesByKeywords(candidates: CandidateImage[], keywords: string[], topK: number): CandidateImage[];
|
|
34
|
-
/** 去重合并候选(按 url 判重) */
|
|
35
|
-
export declare function mergeCandidates(...lists: CandidateImage[][]): CandidateImage[];
|
|
36
|
-
/** 选图第一步的产物:先想清楚「要什么」,再去看「有什么」 */
|
|
37
|
-
export interface RequirementAnalysis {
|
|
38
|
-
/** 画面主体(一句话) */
|
|
39
|
-
subject: string;
|
|
40
|
-
/** 硬性要素:缺一个就不该选这张图 */
|
|
41
|
-
must: string[];
|
|
42
|
-
/** 加分要素:有更好,没有也能用 */
|
|
43
|
-
nice: string[];
|
|
44
|
-
/** 明确不要出现的 */
|
|
45
|
-
avoid: string[];
|
|
46
|
-
/** 画面需要出现的文字(台词/标题/招牌),交给浏览器渲染 */
|
|
47
|
-
text: string;
|
|
48
|
-
/** 用户表示「不用参考/随意画」时跳过检索 */
|
|
49
|
-
skipReference: boolean;
|
|
50
|
-
/** 判定需要用户补图时,用一句话说明要什么样的图 */
|
|
51
|
-
needTypes: string;
|
|
52
|
-
}
|
|
53
|
-
/** 单张候选图的打分结果(index 从 1 开始,对应候选列表位置) */
|
|
54
|
-
export interface ScoredCandidate {
|
|
55
|
-
index: number;
|
|
56
|
-
score: number;
|
|
57
|
-
why: string;
|
|
58
|
-
}
|
|
59
21
|
/** 从任意文本里挖出第一个 JSON 对象(容忍代码块围栏和前后废话) */
|
|
60
22
|
export declare function extractJsonObject(raw: string | null | undefined): any | null;
|
|
61
|
-
/** 把模型给的字段统一成字符串数组(支持数组 / 逗号顿号换行分隔的字符串) */
|
|
62
|
-
export declare function toStrList(value: any): string[];
|
|
63
|
-
/** 用户这句话是不是「不用参考了」 */
|
|
64
|
-
export declare function isSkipReferenceInput(userInput: string): boolean;
|
|
65
|
-
/** 解析「需求抽取」的返回 */
|
|
66
|
-
export declare function parseAnalysisResult(raw: string | null): RequirementAnalysis | null;
|
|
67
|
-
/** 把「需求要素」转成本地检索用的关键词 */
|
|
68
|
-
export declare function keywordsFromAnalysis(analysis: RequirementAnalysis | null): string[];
|
|
69
|
-
/** 把分数归一化到 0-100(兼容 0.85 这种小数写法、以及 "85分" 这种字符串) */
|
|
70
|
-
export declare function normalizeScore(value: any): number | null;
|
|
71
|
-
/** 解析「逐图打分」的返回 */
|
|
72
|
-
export declare function parseScoreResult(raw: string | null, candidates: CandidateImage[]): ScoredCandidate[];
|
|
73
23
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
24
|
+
* gallery_search 工具的检索实现:关键词由**模型**自己拟,这里只做文本匹配排序。
|
|
25
|
+
* 多关键词空格分隔,全部命中的排最前(参考 NeoBot 的 gallery_search)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function searchGallery(items: CandidateImage[], keyword: string, limit: number): CandidateImage[];
|
|
28
|
+
/**
|
|
29
|
+
* 把模型给的 references 解析成登记表里的编号。
|
|
30
|
+
* 兼容 `ref3` / `gallery:ref3` / 裸编号 `3` / `url:https://...` / 直接写链接。
|
|
31
|
+
* 认不出来的进 unknown,让模型知道它编了个不存在的 id。
|
|
76
32
|
*/
|
|
77
|
-
export declare function
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
33
|
+
export declare function resolveReferences(refs: any[], registry: Map<string, {
|
|
34
|
+
url: string;
|
|
35
|
+
}>): {
|
|
36
|
+
ids: string[];
|
|
37
|
+
unknown: string[];
|
|
81
38
|
};
|
|
39
|
+
/** agent 可用的工具名(JSON 兜底协议只对这几个名字生效,避免把正常回复当工具调用) */
|
|
40
|
+
export declare const AGENT_TOOL_NAMES: string[];
|
|
41
|
+
/** OpenAI function-calling 格式的工具定义 */
|
|
42
|
+
export declare function buildAgentTools(): any[];
|
|
82
43
|
/**
|
|
83
|
-
*
|
|
44
|
+
* 从模型返回里取出助手消息,以及它想调用的工具。
|
|
45
|
+
* 兼容:原生 tool_calls、老式 function_call、中转站把正文塞进奇怪字段。
|
|
84
46
|
*/
|
|
85
|
-
export declare function
|
|
47
|
+
export declare function pickAgentMessage(response: any): {
|
|
48
|
+
message: any;
|
|
49
|
+
content: string;
|
|
50
|
+
toolCalls: {
|
|
51
|
+
id?: string;
|
|
52
|
+
name: string;
|
|
53
|
+
args: any;
|
|
54
|
+
}[];
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* 「一行 JSON」兜底协议:模型所在接口不支持 function calling 时,
|
|
58
|
+
* 它只要输出 {"tool":"draw","args":{...}} 我们照样能执行。
|
|
59
|
+
* 只有 tool 名字命中 AGENT_TOOL_NAMES 才当工具调用,避免把正常回复误判。
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseJsonToolCall(content: string, names?: string[]): {
|
|
62
|
+
id?: string;
|
|
63
|
+
name: string;
|
|
64
|
+
args: any;
|
|
65
|
+
}[];
|
|
66
|
+
/** 渲染 agent 指令模板:把 {xxx} 占位符换成实际值 */
|
|
67
|
+
export declare function renderAgentInstructions(template: string, vars: Record<string, string | number>): string;
|
|
68
|
+
/**
|
|
69
|
+
* 洗一下 ask_user 的提问文案。
|
|
70
|
+
* 模型偶尔会在问句后面顺带聊别的(实测出现过「能发一张参考图吗?顺便说说 XX 可以吗?」),
|
|
71
|
+
* 这里压成一行、去掉 markdown 记号和包裹引号、限长,让它永远是「对用户说的一句话」。
|
|
72
|
+
*/
|
|
73
|
+
export declare function cleanAskMessage(raw: any, max?: number): string;
|
|
86
74
|
/**
|
|
87
75
|
* 图库容量裁剪:超出容量时淘汰最旧的(按 time 升序),只保留每个组最近 capacity 条
|
|
88
76
|
*/
|
|
@@ -187,15 +175,6 @@ export declare function isPassiveReplyError(error: any): boolean;
|
|
|
187
175
|
export declare function resolveTokenParam(model: string, mode?: string): string;
|
|
188
176
|
/** 用指定参数名重建请求体(避免同时存在两个长度参数被接口拒绝) */
|
|
189
177
|
export declare function withTokenParam(body: any, param: string): any;
|
|
190
|
-
/**
|
|
191
|
-
* 构造发给选图模型的 user 消息内容。
|
|
192
|
-
* 未开启识别图片时返回纯文本;开启时按「编号文字 + 图片」交替排列,让模型把编号和图片对上。
|
|
193
|
-
* @param text 提示词正文(含 {candidates} 文本列表)
|
|
194
|
-
* @param candidates 候选图片
|
|
195
|
-
* @param vision 是否附带图片
|
|
196
|
-
* @param visionMaxImages 最多附带多少张图片
|
|
197
|
-
*/
|
|
198
|
-
export declare function buildSelectorContent(text: string, candidates: CandidateImage[], vision: boolean, visionMaxImages: number): string | any[];
|
|
199
178
|
/** HTML 转义,避免渲染时把文字当标签吃掉 */
|
|
200
179
|
export declare function escapeHtml(text: string): string;
|
|
201
180
|
/** 把要渲染的文字拼成一份 HTML(供无头浏览器截图) */
|
|
@@ -220,9 +199,8 @@ interface CommandConfig {
|
|
|
220
199
|
waitTimeout: number;
|
|
221
200
|
defaultImageUrls: string[];
|
|
222
201
|
referenceGroups?: string[];
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
aiAskUser?: boolean;
|
|
202
|
+
/** 该指令是否走 agent(默认跟随全局 agent.enabled) */
|
|
203
|
+
agent?: 'follow' | 'on' | 'off' | boolean;
|
|
226
204
|
}[];
|
|
227
205
|
};
|
|
228
206
|
defaultWaitTimeout: number;
|
|
@@ -234,6 +212,7 @@ interface CommandConfig {
|
|
|
234
212
|
loggerinfo: boolean;
|
|
235
213
|
referenceGroups?: ReferenceGroup[];
|
|
236
214
|
aiSelector?: AISelectorConfig;
|
|
215
|
+
agent?: AgentConfig;
|
|
237
216
|
showPrompt?: boolean;
|
|
238
217
|
promptMaxLength?: number;
|
|
239
218
|
appendUserInput?: boolean;
|
|
@@ -242,8 +221,8 @@ interface CommandConfig {
|
|
|
242
221
|
resultGallery?: ResultGalleryConfig;
|
|
243
222
|
backgroundDrawing?: BackgroundDrawingConfig;
|
|
244
223
|
textRender?: TextRenderConfig;
|
|
245
|
-
/**
|
|
246
|
-
|
|
224
|
+
/** 指令一触发就立刻回一条「收到」,避免用户以为卡住 */
|
|
225
|
+
ackOnStart?: boolean;
|
|
247
226
|
/** 结果图用 markdown 的  单独发一条(支持的平台) */
|
|
248
227
|
markdownImage?: boolean;
|
|
249
228
|
/** 结果图先经 assets 服务上传再发(外链在手机端 QQ 可能拉不到) */
|
|
@@ -319,33 +298,18 @@ interface ReferenceGroup {
|
|
|
319
298
|
enabled: boolean;
|
|
320
299
|
items: ReferenceImageItem[];
|
|
321
300
|
}
|
|
322
|
-
/** AI
|
|
301
|
+
/** AI 对话模型接口配置(agent 循环、提示词优化、生成描述都用它) */
|
|
323
302
|
interface AISelectorConfig {
|
|
324
|
-
enabled: boolean;
|
|
325
303
|
baseUrl: string;
|
|
326
304
|
apiKey?: string;
|
|
327
305
|
model: string;
|
|
328
|
-
prompt: string;
|
|
329
|
-
maxSelect: number;
|
|
330
306
|
temperature: number;
|
|
331
307
|
timeout: number;
|
|
332
308
|
maxRetries: number;
|
|
333
309
|
retryInterval: number;
|
|
334
310
|
retryMaxWait: number;
|
|
335
|
-
askUser: boolean;
|
|
336
|
-
askTimeout: number;
|
|
337
311
|
includeAllGroups: boolean;
|
|
338
312
|
includeCommandDefaults: boolean;
|
|
339
|
-
fallbackOnError: boolean;
|
|
340
|
-
notify: boolean;
|
|
341
|
-
vision: boolean;
|
|
342
|
-
visionMaxImages: number;
|
|
343
|
-
visionFallback: boolean;
|
|
344
|
-
appendHint: boolean;
|
|
345
|
-
twoStage: boolean;
|
|
346
|
-
twoStageThreshold: number;
|
|
347
|
-
retrievalTopK: number;
|
|
348
|
-
keywordPrompt: string;
|
|
349
313
|
captionModel: string;
|
|
350
314
|
captionPrompt: string;
|
|
351
315
|
captionBatch: number;
|
|
@@ -354,28 +318,50 @@ interface AISelectorConfig {
|
|
|
354
318
|
optimizeTemperature?: number;
|
|
355
319
|
/** 输出长度参数名:auto / max_tokens / max_completion_tokens */
|
|
356
320
|
maxTokensParam?: 'auto' | 'max_tokens' | 'max_completion_tokens';
|
|
357
|
-
/** 选图(精排)的输出长度上限。推理模型会把额度耗在思考上,太小会导致正文一个字都生成不出来 */
|
|
358
|
-
selectMaxTokens?: number;
|
|
359
|
-
/** 两级检索「关键词」阶段的输出长度上限 */
|
|
360
|
-
keywordMaxTokens?: number;
|
|
361
321
|
/** 提示词优化(融合/扩写)的输出长度上限 */
|
|
362
322
|
optimizeMaxTokens?: number;
|
|
363
323
|
/** 输出被截断时自动加大,最多加到这个值 */
|
|
364
324
|
maxTokensCeiling?: number;
|
|
365
|
-
/**
|
|
325
|
+
/** 诊断指令名:发一次模型请求并回显原始返回 */
|
|
366
326
|
debugCommand?: string;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
327
|
+
}
|
|
328
|
+
/** Agent 配置:把「要不要查图库 / 要不要追问 / 什么时候开画」全部交给模型自己决定 */
|
|
329
|
+
interface AgentConfig {
|
|
330
|
+
/** 是否启用 agent 模式;关掉就退化成「指令提示词 + 用户附加需求直接画」 */
|
|
331
|
+
enabled: boolean;
|
|
332
|
+
/** agent 用的模型,留空则用 aiSelector.model */
|
|
333
|
+
model: string;
|
|
334
|
+
baseUrl?: string;
|
|
335
|
+
apiKey?: string;
|
|
336
|
+
/** 驱动 agent 行为的系统提示词(可参考 NeoBot 的 skill instructions 写法) */
|
|
337
|
+
instructions?: string;
|
|
338
|
+
/** 最多来回几轮(每轮 = 一次模型请求 + 它要调的工具) */
|
|
339
|
+
maxIterations: number;
|
|
340
|
+
/** 一次绘图最多用几张参考图 */
|
|
341
|
+
maxSelect: number;
|
|
342
|
+
/** gallery_search 单次最多返回多少条 */
|
|
343
|
+
searchLimit: number;
|
|
344
|
+
/** ask_user 等待用户回复的秒数 */
|
|
345
|
+
askTimeout: number;
|
|
346
|
+
/** 开画前是否要求模型先问一句(写进提示词,由模型执行) */
|
|
347
|
+
confirmBeforeDraw: boolean;
|
|
348
|
+
/** 单次模型请求的超时(秒) */
|
|
349
|
+
timeout: number;
|
|
350
|
+
temperature: number;
|
|
351
|
+
/** 单次回复的输出长度上限。推理模型会把额度耗在思考上,太小会一个字都生成不出来 */
|
|
352
|
+
maxTokens: number;
|
|
353
|
+
/** 记住当前频道最近几轮对话(0 = 不记忆) */
|
|
354
|
+
historyTurns: number;
|
|
355
|
+
/** 把每一轮的工具调用打到日志里,方便排查 */
|
|
356
|
+
debugLog: boolean;
|
|
357
|
+
}
|
|
358
|
+
/** agent 参考图登记表里的一条 */
|
|
359
|
+
export interface RefEntry {
|
|
360
|
+
id: string;
|
|
361
|
+
url: string;
|
|
362
|
+
description: string;
|
|
363
|
+
group: string;
|
|
364
|
+
source: 'gallery' | 'user' | 'cmd';
|
|
379
365
|
}
|
|
380
366
|
/** 交给 AI 挑选的候选图片 */
|
|
381
367
|
interface CandidateImage {
|
|
@@ -383,25 +369,6 @@ interface CandidateImage {
|
|
|
383
369
|
url: string;
|
|
384
370
|
description: string;
|
|
385
371
|
}
|
|
386
|
-
/** AI 选择结果 */
|
|
387
|
-
interface SelectionResult {
|
|
388
|
-
picked: CandidateImage[];
|
|
389
|
-
needUserImage: boolean;
|
|
390
|
-
askMessage: string;
|
|
391
|
-
reason: string;
|
|
392
|
-
ok: boolean;
|
|
393
|
-
/** 失败原因(如 429 限流),供回显给用户 */
|
|
394
|
-
error?: string;
|
|
395
|
-
/** 模型看到图片后给出的关键视觉特征描述(开启识别图片时才有),可并入绘图提示词 */
|
|
396
|
-
hint?: string;
|
|
397
|
-
/** 第一阶段产出的检索关键词 */
|
|
398
|
-
keywords?: string[];
|
|
399
|
-
/** 两级检索时从多少张里召回了多少张,用于回显 */
|
|
400
|
-
recalled?: number;
|
|
401
|
-
total?: number;
|
|
402
|
-
/** 模型认为「画面上需要出现的文字」(台词/标题/字幕),交给浏览器渲染成参考图 */
|
|
403
|
-
renderText?: string;
|
|
404
|
-
}
|
|
405
372
|
export declare const Config: Schema;
|
|
406
373
|
export declare function apply(ctx: Context, config: CommandConfig): void;
|
|
407
374
|
export {};
|