koishi-plugin-image-prompt 1.3.0 → 2.0.1
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 +88 -144
- package/lib/index.js +672 -976
- package/package.json +3 -3
- package/readme.md +129 -224
- package/src/index.ts +3434 -3909
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,73 +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
23
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* 实测模型会把 needTypes 写成
|
|
69
|
-
* 「能发一张你想用的自己形象的参考图吗?顺便说说 DeepSeek 画成鲸鱼可以吗?」——
|
|
70
|
-
* 后半句是凭空瞎聊,用户看了莫名其妙。这里只保留第一句、去掉换行和 markdown 修饰、
|
|
71
|
-
* 限制长度,把「询问补图」这件事还原成一句话。
|
|
24
|
+
* gallery_search 工具的检索实现:关键词由**模型**自己拟,这里只做文本匹配排序。
|
|
25
|
+
* 多关键词空格分隔,全部命中的排最前(参考 NeoBot 的 gallery_search)。
|
|
72
26
|
*/
|
|
73
|
-
export declare function
|
|
74
|
-
export declare function isConfirmInput(raw: string | null | undefined): boolean;
|
|
75
|
-
/** 解析「需求抽取」的返回 */
|
|
76
|
-
export declare function parseAnalysisResult(raw: string | null): RequirementAnalysis | null;
|
|
77
|
-
/** 把「需求要素」转成本地检索用的关键词 */
|
|
78
|
-
export declare function keywordsFromAnalysis(analysis: RequirementAnalysis | null): string[];
|
|
79
|
-
/** 把分数归一化到 0-100(兼容 0.85 这种小数写法、以及 "85分" 这种字符串) */
|
|
80
|
-
export declare function normalizeScore(value: any): number | null;
|
|
81
|
-
/** 解析「逐图打分」的返回 */
|
|
82
|
-
export declare function parseScoreResult(raw: string | null, candidates: CandidateImage[]): ScoredCandidate[];
|
|
27
|
+
export declare function searchGallery(items: CandidateImage[], keyword: string, limit: number): CandidateImage[];
|
|
83
28
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
29
|
+
* 把模型给的 references 解析成登记表里的编号。
|
|
30
|
+
* 兼容 `ref3` / `gallery:ref3` / 裸编号 `3` / `url:https://...` / 直接写链接。
|
|
31
|
+
* 认不出来的进 unknown,让模型知道它编了个不存在的 id。
|
|
86
32
|
*/
|
|
87
|
-
export declare function
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
33
|
+
export declare function resolveReferences(refs: any[], registry: Map<string, {
|
|
34
|
+
url: string;
|
|
35
|
+
}>): {
|
|
36
|
+
ids: string[];
|
|
37
|
+
unknown: string[];
|
|
91
38
|
};
|
|
39
|
+
/** agent 可用的工具名(JSON 兜底协议只对这几个名字生效,避免把正常回复当工具调用) */
|
|
40
|
+
export declare const AGENT_TOOL_NAMES: string[];
|
|
41
|
+
/** OpenAI function-calling 格式的工具定义 */
|
|
42
|
+
export declare function buildAgentTools(): any[];
|
|
92
43
|
/**
|
|
93
|
-
*
|
|
44
|
+
* 从模型返回里取出助手消息,以及它想调用的工具。
|
|
45
|
+
* 兼容:原生 tool_calls、老式 function_call、中转站把正文塞进奇怪字段。
|
|
94
46
|
*/
|
|
95
|
-
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;
|
|
96
74
|
/**
|
|
97
75
|
* 图库容量裁剪:超出容量时淘汰最旧的(按 time 升序),只保留每个组最近 capacity 条
|
|
98
76
|
*/
|
|
@@ -197,18 +175,6 @@ export declare function isPassiveReplyError(error: any): boolean;
|
|
|
197
175
|
export declare function resolveTokenParam(model: string, mode?: string): string;
|
|
198
176
|
/** 用指定参数名重建请求体(避免同时存在两个长度参数被接口拒绝) */
|
|
199
177
|
export declare function withTokenParam(body: any, param: string): any;
|
|
200
|
-
/**
|
|
201
|
-
* 构造发给选图模型的 user 消息内容。
|
|
202
|
-
* 未开启识别图片时返回纯文本;开启时按「编号文字 + 图片」交替排列,让模型把编号和图片对上。
|
|
203
|
-
* @param text 提示词正文(含 {candidates} 文本列表)
|
|
204
|
-
* @param candidates 候选图片
|
|
205
|
-
* @param vision 是否附带图片
|
|
206
|
-
* @param visionMaxImages 最多附带多少张图片
|
|
207
|
-
* @param dataUrls 已经自己下载好的 base64 data URL(按 candidates 下标)。**传了它之后,
|
|
208
|
-
* 没下载成功的图就不再发原始链接了** —— 上游拉不到那个链接会整条请求 400,
|
|
209
|
-
* 连文字描述一起废掉;只发描述反而还能用。
|
|
210
|
-
*/
|
|
211
|
-
export declare function buildSelectorContent(text: string, candidates: CandidateImage[], vision: boolean, visionMaxImages: number, dataUrls?: (string | undefined)[]): string | any[];
|
|
212
178
|
/** HTML 转义,避免渲染时把文字当标签吃掉 */
|
|
213
179
|
export declare function escapeHtml(text: string): string;
|
|
214
180
|
/** 把要渲染的文字拼成一份 HTML(供无头浏览器截图) */
|
|
@@ -233,11 +199,8 @@ interface CommandConfig {
|
|
|
233
199
|
waitTimeout: number;
|
|
234
200
|
defaultImageUrls: string[];
|
|
235
201
|
referenceGroups?: string[];
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
aiAskUser?: boolean;
|
|
239
|
-
/** 该指令是否在开画前请用户确认:'follow' 跟随全局 / 'on' 总是确认 / 'off' 从不确认 */
|
|
240
|
-
confirmBeforeDraw?: 'follow' | 'on' | 'off' | boolean;
|
|
202
|
+
/** 该指令是否走 agent(默认跟随全局 agent.enabled) */
|
|
203
|
+
agent?: 'follow' | 'on' | 'off' | boolean;
|
|
241
204
|
}[];
|
|
242
205
|
};
|
|
243
206
|
defaultWaitTimeout: number;
|
|
@@ -249,6 +212,7 @@ interface CommandConfig {
|
|
|
249
212
|
loggerinfo: boolean;
|
|
250
213
|
referenceGroups?: ReferenceGroup[];
|
|
251
214
|
aiSelector?: AISelectorConfig;
|
|
215
|
+
agent?: AgentConfig;
|
|
252
216
|
showPrompt?: boolean;
|
|
253
217
|
promptMaxLength?: number;
|
|
254
218
|
appendUserInput?: boolean;
|
|
@@ -257,14 +221,8 @@ interface CommandConfig {
|
|
|
257
221
|
resultGallery?: ResultGalleryConfig;
|
|
258
222
|
backgroundDrawing?: BackgroundDrawingConfig;
|
|
259
223
|
textRender?: TextRenderConfig;
|
|
260
|
-
/** 把处理过程中的多条提示合并成一条消息发出(省被动消息额度) */
|
|
261
|
-
mergeNotifications?: boolean;
|
|
262
224
|
/** 指令一触发就立刻回一条「收到」,避免用户以为卡住 */
|
|
263
225
|
ackOnStart?: boolean;
|
|
264
|
-
/** AI 选好参考图后先请用户确认再开画 */
|
|
265
|
-
confirmBeforeDraw?: boolean;
|
|
266
|
-
/** 等待用户确认的时间(秒) */
|
|
267
|
-
confirmTimeout?: number;
|
|
268
226
|
/** 结果图用 markdown 的  单独发一条(支持的平台) */
|
|
269
227
|
markdownImage?: boolean;
|
|
270
228
|
/** 结果图先经 assets 服务上传再发(外链在手机端 QQ 可能拉不到) */
|
|
@@ -340,35 +298,18 @@ interface ReferenceGroup {
|
|
|
340
298
|
enabled: boolean;
|
|
341
299
|
items: ReferenceImageItem[];
|
|
342
300
|
}
|
|
343
|
-
/** AI
|
|
301
|
+
/** AI 对话模型接口配置(agent 循环、提示词优化、生成描述都用它) */
|
|
344
302
|
interface AISelectorConfig {
|
|
345
|
-
enabled: boolean;
|
|
346
303
|
baseUrl: string;
|
|
347
304
|
apiKey?: string;
|
|
348
305
|
model: string;
|
|
349
|
-
prompt: string;
|
|
350
|
-
maxSelect: number;
|
|
351
306
|
temperature: number;
|
|
352
307
|
timeout: number;
|
|
353
308
|
maxRetries: number;
|
|
354
309
|
retryInterval: number;
|
|
355
310
|
retryMaxWait: number;
|
|
356
|
-
askUser: boolean;
|
|
357
|
-
askTimeout: number;
|
|
358
311
|
includeAllGroups: boolean;
|
|
359
312
|
includeCommandDefaults: boolean;
|
|
360
|
-
fallbackOnError: boolean;
|
|
361
|
-
notify: boolean;
|
|
362
|
-
vision: boolean;
|
|
363
|
-
visionMaxImages: number;
|
|
364
|
-
/** 识图时单张候选图的体积上限(MB),超过就只发文字描述 */
|
|
365
|
-
visionMaxImageBytes?: number;
|
|
366
|
-
visionFallback: boolean;
|
|
367
|
-
appendHint: boolean;
|
|
368
|
-
twoStage: boolean;
|
|
369
|
-
twoStageThreshold: number;
|
|
370
|
-
retrievalTopK: number;
|
|
371
|
-
keywordPrompt: string;
|
|
372
313
|
captionModel: string;
|
|
373
314
|
captionPrompt: string;
|
|
374
315
|
captionBatch: number;
|
|
@@ -377,28 +318,50 @@ interface AISelectorConfig {
|
|
|
377
318
|
optimizeTemperature?: number;
|
|
378
319
|
/** 输出长度参数名:auto / max_tokens / max_completion_tokens */
|
|
379
320
|
maxTokensParam?: 'auto' | 'max_tokens' | 'max_completion_tokens';
|
|
380
|
-
/** 选图(精排)的输出长度上限。推理模型会把额度耗在思考上,太小会导致正文一个字都生成不出来 */
|
|
381
|
-
selectMaxTokens?: number;
|
|
382
|
-
/** 两级检索「关键词」阶段的输出长度上限 */
|
|
383
|
-
keywordMaxTokens?: number;
|
|
384
321
|
/** 提示词优化(融合/扩写)的输出长度上限 */
|
|
385
322
|
optimizeMaxTokens?: number;
|
|
386
323
|
/** 输出被截断时自动加大,最多加到这个值 */
|
|
387
324
|
maxTokensCeiling?: number;
|
|
388
|
-
/**
|
|
325
|
+
/** 诊断指令名:发一次模型请求并回显原始返回 */
|
|
389
326
|
debugCommand?: string;
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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';
|
|
402
365
|
}
|
|
403
366
|
/** 交给 AI 挑选的候选图片 */
|
|
404
367
|
interface CandidateImage {
|
|
@@ -406,25 +369,6 @@ interface CandidateImage {
|
|
|
406
369
|
url: string;
|
|
407
370
|
description: string;
|
|
408
371
|
}
|
|
409
|
-
/** AI 选择结果 */
|
|
410
|
-
interface SelectionResult {
|
|
411
|
-
picked: CandidateImage[];
|
|
412
|
-
needUserImage: boolean;
|
|
413
|
-
askMessage: string;
|
|
414
|
-
reason: string;
|
|
415
|
-
ok: boolean;
|
|
416
|
-
/** 失败原因(如 429 限流),供回显给用户 */
|
|
417
|
-
error?: string;
|
|
418
|
-
/** 模型看到图片后给出的关键视觉特征描述(开启识别图片时才有),可并入绘图提示词 */
|
|
419
|
-
hint?: string;
|
|
420
|
-
/** 第一阶段产出的检索关键词 */
|
|
421
|
-
keywords?: string[];
|
|
422
|
-
/** 两级检索时从多少张里召回了多少张,用于回显 */
|
|
423
|
-
recalled?: number;
|
|
424
|
-
total?: number;
|
|
425
|
-
/** 模型认为「画面上需要出现的文字」(台词/标题/字幕),交给浏览器渲染成参考图 */
|
|
426
|
-
renderText?: string;
|
|
427
|
-
}
|
|
428
372
|
export declare const Config: Schema;
|
|
429
373
|
export declare function apply(ctx: Context, config: CommandConfig): void;
|
|
430
374
|
export {};
|