koishi-plugin-image-prompt 2.0.2 → 2.0.4

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 CHANGED
@@ -2,14 +2,13 @@ import { Context, Schema } from 'koishi';
2
2
  export declare const name = "image-prompt";
3
3
  /**
4
4
  * 依赖声明:http / logger / i18n 是必需的;
5
- * puppeteer 是**可选**的——只有开启「文字渲染参考图」时才需要浏览器服务,
6
- * 没装也能正常绘图(Koishi 会在它可用时把它注入进来,并等它就绪后再启动本插件)。
5
+ * assets 是**可选**的(结果图先上传再发,外链在手机端 QQ 常常拉不到)。
7
6
  */
8
7
  export declare const inject: {
9
8
  required: string[];
10
9
  optional: string[];
11
10
  };
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";
11
+ 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- \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 'assets'\uFF08\u7ED3\u679C\u56FE\u4E0A\u4F20\uFF09\n\n---\n";
13
12
  /**
14
13
  * 计算重试等待时间(毫秒):限流类错误优先用 Retry-After,否则指数退避
15
14
  * @param status HTTP 状态码
@@ -181,18 +180,6 @@ export declare function isPassiveReplyError(error: any): boolean;
181
180
  export declare function resolveTokenParam(model: string, mode?: string): string;
182
181
  /** 用指定参数名重建请求体(避免同时存在两个长度参数被接口拒绝) */
183
182
  export declare function withTokenParam(body: any, param: string): any;
184
- /** HTML 转义,避免渲染时把文字当标签吃掉 */
185
- export declare function escapeHtml(text: string): string;
186
- /** 把要渲染的文字拼成一份 HTML(供无头浏览器截图) */
187
- export declare function buildTextHtml(lines: string[], cfg?: Partial<TextRenderConfig>): string;
188
- /**
189
- * 从提示词/用户输入里提取「需要在画面上真实出现的文字」
190
- * 只提取含中日韩文字的片段——纯英文/数字一般不会因为渲染而崩字
191
- */
192
- export declare function extractTextToRender(text: string, options?: {
193
- loose?: boolean;
194
- maxChars?: number;
195
- }): string[];
196
183
  interface CommandConfig {
197
184
  basename: string;
198
185
  nested: {
@@ -222,11 +209,10 @@ interface CommandConfig {
222
209
  showPrompt?: boolean;
223
210
  promptMaxLength?: number;
224
211
  appendUserInput?: boolean;
225
- promptOptimize?: 'off' | 'merge' | 'rewrite';
212
+ promptOptimize?: 'off' | 'passthrough' | 'merge' | 'rewrite';
226
213
  optimizePrompt?: string;
227
214
  resultGallery?: ResultGalleryConfig;
228
215
  backgroundDrawing?: BackgroundDrawingConfig;
229
- textRender?: TextRenderConfig;
230
216
  /** 指令一触发就立刻回一条「收到」,避免用户以为卡住 */
231
217
  ackOnStart?: boolean;
232
218
  /** 结果图用 markdown 的 ![](url) 单独发一条(支持的平台) */
@@ -241,35 +227,6 @@ interface CommandConfig {
241
227
  imageWidth?: number;
242
228
  imageHeight?: number;
243
229
  }
244
- /** 文字渲染参考图配置(把要在画面上出现的文字先渲染成图片,避免中文崩字) */
245
- interface TextRenderConfig {
246
- enabled: boolean;
247
- /** 自动从提示词里识别需要出现在画面上的文字并渲染 */
248
- autoDetect: boolean;
249
- /** 引号内没有其它线索时,也允许直接提取中文片段 */
250
- loose: boolean;
251
- /** 手动渲染指令名 */
252
- commandName: string;
253
- /** 手动渲染后,多少秒内的绘图指令自动带上它 */
254
- pendingTTL: number;
255
- /** 渲染后先把参考图发出来给用户看 */
256
- sendPreview: boolean;
257
- /** 渲染结果并入绘图参考图 */
258
- attachToDraw: boolean;
259
- width: number;
260
- fontSize: number;
261
- lineHeight: number;
262
- padding: number;
263
- background: string;
264
- color: string;
265
- fontFamily: string;
266
- align: 'center' | 'left';
267
- bold: boolean;
268
- strokeWidth: number;
269
- strokeColor: string;
270
- maxChars: number;
271
- scale: number;
272
- }
273
230
  /** 生成结果入库(图库)配置 */
274
231
  interface ResultGalleryConfig {
275
232
  enabled: boolean;
package/lib/index.js CHANGED
@@ -36,15 +36,12 @@ __export(src_exports, {
36
36
  buildMarkdownImage: () => buildMarkdownImage,
37
37
  buildPromptBlock: () => buildPromptBlock,
38
38
  buildPromptEcho: () => buildPromptEcho,
39
- buildTextHtml: () => buildTextHtml,
40
39
  cleanAskMessage: () => cleanAskMessage,
41
40
  computeRetryDelay: () => computeRetryDelay,
42
41
  describeSelectorError: () => describeSelectorError,
43
- escapeHtml: () => escapeHtml,
44
42
  extractJsonObject: () => extractJsonObject,
45
43
  extractResponseText: () => extractResponseText,
46
44
  extractServerMessage: () => extractServerMessage,
47
- extractTextToRender: () => extractTextToRender,
48
45
  fitImageSize: () => fitImageSize,
49
46
  httpErrorText: () => httpErrorText,
50
47
  inject: () => inject,
@@ -77,7 +74,7 @@ var nodePath = __toESM(require("node:path"));
77
74
  var name = "image-prompt";
78
75
  var inject = {
79
76
  required: ["http", "logger", "i18n"],
80
- optional: ["puppeteer", "assets"]
77
+ optional: ["assets"]
81
78
  };
82
79
  var usage = `
83
80
  ---
@@ -124,13 +121,12 @@ var usage = `
124
121
 
125
122
  - \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
126
123
  - \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
127
- - \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
128
124
  - \u56DE\u663E\u63D0\u793A\u8BCD\u3001\u7ED3\u679C\u56FE\u5C3A\u5BF8/\u8D70 assets \u7B49\u90FD\u5728\u300C\u6D88\u606F\u53D1\u9001\u300D\u91CC\u3002
129
125
 
130
126
  Agent \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
131
127
 
132
128
  ---
133
- \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
129
+ \u6B64\u9879\u76EE\u6240\u9700\u7684koishi\u670D\u52A1\uFF1A\u5FC5\u9700 'http', 'logger', 'i18n'\uFF1B\u53EF\u9009 'assets'\uFF08\u7ED3\u679C\u56FE\u4E0A\u4F20\uFF09
134
130
 
135
131
  ---
136
132
  `;
@@ -270,7 +266,8 @@ function buildAgentTools() {
270
266
  parameters: {
271
267
  type: "object",
272
268
  properties: {
273
- prompt: { type: "string", description: "\u5B8C\u6574\u7684\u7ED8\u56FE\u63D0\u793A\u8BCD\uFF08\u82F1\u6587\u6548\u679C\u66F4\u7A33\uFF1B\u753B\u9762\u4E0A\u5FC5\u987B\u51FA\u73B0\u7684\u6587\u5B57\u8981\u539F\u6837\u5199\u8FDB\u53BB\uFF09" },
269
+ // 提示词要短:宁可朴素,也不要堆术语写成几百字的「专业」prompt
270
+ prompt: { type: "string", description: "\u7ED8\u56FE\u63D0\u793A\u8BCD\u3002\u8BF4\u4EBA\u8BDD\u3001\u5199\u7B80\u77ED\u5C31\u884C\uFF0C\u4E2D\u6587\u5373\u53EF\uFF08\u7ED8\u56FE\u6A21\u578B\u542C\u5F97\u61C2\u4E2D\u6587\uFF09\uFF1B\u4E0D\u8981\u628A\u7528\u6237\u7684\u8BDD\u6269\u5199\u6210\u51E0\u767E\u5B57\uFF0C\u4E5F\u4E0D\u8981\u5806\u780C\u98CE\u683C/\u6750\u8D28/\u5149\u7EBF\u672F\u8BED\u3002\u753B\u9762\u4E0A\u5FC5\u987B\u51FA\u73B0\u7684\u6587\u5B57\u8981\u539F\u6837\u5199\u8FDB\u53BB" },
274
271
  references: {
275
272
  type: "array",
276
273
  items: { type: "string" },
@@ -695,75 +692,17 @@ function withTokenParam(body, param) {
695
692
  if (value !== void 0) next[param] = value;
696
693
  return next;
697
694
  }
698
- function escapeHtml(text) {
699
- return String(text).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
700
- }
701
- function buildTextHtml(lines, cfg = {}) {
702
- const width = cfg.width || 1024;
703
- const fontSize = cfg.fontSize || 96;
704
- const lineHeight = cfg.lineHeight || 1.4;
705
- const padding = cfg.padding || 48;
706
- const background = cfg.background || "#ffffff";
707
- const color = cfg.color || "#111111";
708
- const fontFamily = cfg.fontFamily || "Microsoft YaHei, PingFang SC, Noto Sans CJK SC, sans-serif";
709
- const align = cfg.align === "left" ? "left" : "center";
710
- const weight = cfg.bold ? "700" : "400";
711
- const strokeWidth = cfg.strokeWidth || 0;
712
- const strokeColor = cfg.strokeColor || "#ffffff";
713
- const stroke = strokeWidth > 0 ? `-webkit-text-stroke: ${strokeWidth}px ${strokeColor}; paint-order: stroke fill;` : "";
714
- const body = lines.map((line) => `<div class="line">${escapeHtml(line)}</div>`).join("");
715
- return `<!DOCTYPE html><html><head><meta charset="utf-8"><style>
716
- * { margin: 0; padding: 0; box-sizing: border-box; }
717
- html, body { background: ${background}; }
718
- #stage { display: inline-block; min-width: ${width}px; padding: ${padding}px; }
719
- .line { font-family: ${fontFamily}; font-size: ${fontSize}px; line-height: ${lineHeight};
720
- color: ${color}; font-weight: ${weight}; text-align: ${align};
721
- white-space: pre-wrap; word-break: break-word; ${stroke} }
722
- </style></head><body><div id="stage">${body}</div></body></html>`;
723
- }
724
- var CJK_RE = /[\u3400-\u4dbf\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af\uf900-\ufaff]/;
725
- function extractTextToRender(text, options = {}) {
726
- const source = String(text || "");
727
- if (!source.trim()) return [];
728
- const maxChars = options.maxChars && options.maxChars > 0 ? options.maxChars : 200;
729
- const results = [];
730
- const push = (raw) => {
731
- const value = String(raw || "").trim().replace(/^[\s"'`「『“《【((\[]+/, "").replace(/[\s"'`」』”》】))\]]+$/, "").replace(/\s+/g, " ");
732
- if (!value) return;
733
- if (value.length > maxChars) return;
734
- if (!CJK_RE.test(value)) return;
735
- if (results.includes(value)) return;
736
- results.push(value);
737
- };
738
- const patterns = [
739
- /「([^」\n]{1,200})」/g,
740
- /『([^』\n]{1,200})』/g,
741
- /“([^”\n]{1,200})”/g,
742
- /《([^》\n]{1,200})》/g,
743
- /【([^】\n]{1,200})】/g,
744
- /"([^"\n]{1,200})"/g,
745
- /'([^'\n]{1,200})'/g,
746
- /(?:台词|字幕|标语|招牌|标题|写着|写着的是|对话)\s*[::]?\s*([^\n。;;!!??]{1,200})/g
747
- ];
748
- for (const pattern of patterns) {
749
- let match;
750
- while (match = pattern.exec(source)) push(match[1]);
751
- }
752
- if (results.length === 0 && options.loose) {
753
- const chunks = source.match(/[\u3400-\u4dbf\u4e00-\u9fff][\u3400-\u4dbf\u4e00-\u9fff\u3001\u3002\uff0c\uff01\uff1f\uff1a\u201c\u201d\s]{3,}/g);
754
- for (const chunk of chunks || []) push(chunk);
755
- }
756
- return results;
757
- }
758
695
  var DEFAULT_OPTIMIZE_PROMPT = `\u4F60\u662F\u7ED8\u56FE\u63D0\u793A\u8BCD\u4F18\u5316\u52A9\u624B\u3002\u4E0B\u9762\u662F\u300C\u7ED8\u56FE\u6307\u4EE4\u7684\u539F\u59CB\u63D0\u793A\u8BCD\u300D\u548C\u300C\u7528\u6237\u672C\u6B21\u7684\u9700\u6C42\u300D\u3002
759
696
 
760
- \u8BF7\u8F93\u51FA\u4E00\u4EFD\u5B8C\u6574\u3001\u53EF\u76F4\u63A5\u7528\u4E8E\u7ED8\u56FE\u6A21\u578B\u7684\u63D0\u793A\u8BCD\u3002\u89C4\u5219\uFF1A
697
+ \u8BF7\u8F93\u51FA\u4E00\u4EFD**\u7B80\u77ED**\u7684\u3001\u53EF\u76F4\u63A5\u7528\u4E8E\u7ED8\u56FE\u6A21\u578B\u7684\u63D0\u793A\u8BCD\u3002\u89C4\u5219\uFF1A
761
698
 
762
- 1. \u539F\u59CB\u63D0\u793A\u8BCD\u4E0D\u4E3A\u7A7A\u65F6\uFF1A\u628A\u7528\u6237\u9700\u6C42\u81EA\u7136\u5730\u878D\u5408\u8FDB\u539F\u59CB\u63D0\u793A\u8BCD\uFF0C\u5E76**\u4FDD\u7559\u539F\u59CB\u63D0\u793A\u8BCD\u4E2D\u7684\u5168\u90E8\u573A\u666F\u3001\u6784\u56FE\u3001\u98CE\u683C\u3001\u6750\u8D28\u3001\u5149\u7EBF\u7B49\u7EC6\u8282**\uFF0C\u4E0D\u5F97\u5220\u51CF\u6216\u7B80\u5316\u3002
763
- 2. \u539F\u59CB\u63D0\u793A\u8BCD\u4E3A\u7A7A\u65F6\uFF08\u4F8B\u5982\u81EA\u5B9A\u4E49\u6307\u4EE4\uFF09\uFF1A\u6839\u636E\u7528\u6237\u9700\u6C42**\u6269\u5199**\u6210\u5B8C\u6574\u7684\u7ED8\u56FE\u63D0\u793A\u8BCD\uFF0C\u8865\u8DB3\u753B\u98CE\u3001\u6784\u56FE\u3001\u955C\u5934\u3001\u5149\u7EBF\u3001\u6C1B\u56F4\u3001\u914D\u8272\u4E0E\u7EC6\u8282\uFF0C\u4F46\u4E0D\u8981\u6539\u53D8\u7528\u6237\u7684\u539F\u610F\u3002
764
- 3. \u628A\u7528\u6237\u9700\u6C42\u5199\u5230\u5B83\u8BE5\u53BB\u7684\u4F4D\u7F6E\uFF08\u8868\u60C5/\u52A8\u4F5C/\u795E\u6001/\u670D\u88C5/\u573A\u666F/\u4E92\u52A8\u7B49\uFF09\uFF0C\u4E0D\u8981\u539F\u6837\u8D34\u5728\u672B\u5C3E\u3002
765
- 4. \u8BED\u8A00\uFF1A\u539F\u59CB\u63D0\u793A\u8BCD\u662F\u82F1\u6587\u5C31\u8F93\u51FA\u82F1\u6587\uFF1B\u539F\u59CB\u63D0\u793A\u8BCD\u4E3A\u7A7A\u65F6\u4E5F\u7528\u82F1\u6587\uFF08\u82F1\u6587\u63D0\u793A\u8BCD\u51FA\u56FE\u6548\u679C\u901A\u5E38\u66F4\u7A33\uFF09\u3002
766
- 5. \u53EA\u8F93\u51FA\u4F18\u5316\u540E\u7684\u63D0\u793A\u8BCD\u6B63\u6587\uFF0C\u4E0D\u8981\u89E3\u91CA\u3001\u4E0D\u8981\u6807\u9898\u3001\u4E0D\u8981 Markdown \u4EE3\u7801\u5757\u3001\u4E0D\u8981\u5F15\u53F7\u3002
699
+ 1. \u539F\u59CB\u63D0\u793A\u8BCD\u4E0D\u4E3A\u7A7A\u65F6\uFF1A\u628A\u7528\u6237\u9700\u6C42\u81EA\u7136\u5730\u878D\u5165\u539F\u59CB\u63D0\u793A\u8BCD\uFF0C\u4FDD\u7559\u5176\u4E2D\u7684\u6784\u56FE\u4E0E\u98CE\u683C\uFF0C\u4E0D\u8981\u5220\u51CF\u3002
700
+ 2. \u539F\u59CB\u63D0\u793A\u8BCD\u4E3A\u7A7A\u65F6\uFF1A\u76F4\u63A5\u6574\u7406\u7528\u6237\u7684\u8BDD\u4F5C\u4E3A\u63D0\u793A\u8BCD\uFF0C**\u4E0D\u8981\u66FF\u4ED6\u8111\u8865**\u753B\u98CE\u3001\u955C\u5934\u3001\u5149\u7EBF\u3001\u6C1B\u56F4\u3001\u914D\u8272\u4E4B\u7C7B\u7684\u7EC6\u8282 \u2014\u2014
701
+ \u7528\u6237\u6CA1\u63D0\u7684\u5C31\u522B\u5199\u3002
702
+ 3. \u628A\u7528\u6237\u9700\u6C42\u5199\u5230\u5B83\u8BE5\u53BB\u7684\u4F4D\u7F6E\uFF0C\u4E0D\u8981\u539F\u6837\u8D34\u5728\u672B\u5C3E\uFF0C\u4E5F\u4E0D\u8981\u53E6\u8D77\u4E00\u6BB5\u590D\u8FF0\u4E00\u904D\u3002
703
+ 4. **\u8BED\u8A00\u8DDF\u7740\u7528\u6237\u8D70**\uFF1A\u7528\u6237\u7528\u4E2D\u6587\u5C31\u8F93\u51FA\u4E2D\u6587\uFF08\u7ED8\u56FE\u6A21\u578B\u542C\u5F97\u61C2\u4E2D\u6587\uFF0C\u7406\u89E3\u529B\u4E5F\u591F\uFF09\uFF0C
704
+ \u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u4E13\u4E1A\u800C\u7FFB\u6210\u82F1\u6587\u3001\u4E0D\u8981\u5806\u780C\u672F\u8BED\u3002
705
+ 5. **\u5B81\u77ED\u52FF\u957F**\uFF1A\u53EA\u5199\u771F\u6B63\u8981\u5728\u753B\u9762\u4E0A\u51FA\u73B0\u7684\u4E1C\u897F\u3002\u63D0\u793A\u8BCD\u8D8A\u957F\u5404\u8981\u7D20\u4E92\u76F8\u7A00\u91CA\uFF0C\u51FA\u56FE\u53CD\u800C\u66F4\u7CCA\u3002
767
706
 
768
707
  \u539F\u59CB\u63D0\u793A\u8BCD\uFF1A
769
708
  {prompt}
@@ -798,6 +737,11 @@ var DEFAULT_AGENT_INSTRUCTIONS = `\u4F60\u662F QQ \u7FA4\u91CC\u7684\u7ED8\u56FE
798
737
  6. \u6D41\u7A0B\u7ED3\u675F\u540E\u7528\u4E2D\u6587\u56DE\u4E00\u53E5\u7B80\u77ED\u7684\u7ED3\u679C\u8BF4\u660E\uFF08\u4E0D\u8981\u590D\u8FF0 prompt\uFF0C\u4E0D\u8981\u5199\u5C0F\u4F5C\u6587\uFF0C\u4E0D\u8981\u518D\u95EE\u300C\u8FD8\u8981\u6211\u505A\u4EC0\u4E48\u300D\uFF09\u3002
799
738
  7. \u56FE\u7247\u7F16\u53F7\uFF1Agallery_search \u7ED3\u679C\u91CC\u7684 id\u3001\u7528\u6237\u53D1\u7684\u56FE\uFF08user1\u3001user2\u2026\uFF09\u3001\u6307\u4EE4\u9ED8\u8BA4\u56FE\uFF08cmd1\u2026\uFF09\u90FD\u53EF\u4EE5\u76F4\u63A5\u5199\u8FDB draw \u7684 references\u3002
800
739
  \u53EA\u586B\u4F60\u786E\u8BA4\u5B58\u5728\u7684\u7F16\u53F7\uFF0C**\u7EDD\u5BF9\u4E0D\u8981\u7F16\u9020 id**\u3002
740
+ 8. \u3010prompt \u8981\u77ED\uFF0C\u8981\u8BF4\u4EBA\u8BDD\u3011**\u4E0D\u8981**\u628A\u7528\u6237\u7684\u8BDD\u6269\u5199\u6210\u51E0\u767E\u5B57\u7684\u300C\u4E13\u4E1A\u300D\u63D0\u793A\u8BCD\uFF1A
741
+ - \u7528\u6237\u7528\u4E2D\u6587\u63D0\u7684\u9700\u6C42\uFF0Cprompt \u5C31\u5199\u4E2D\u6587\uFF08\u7ED8\u56FE\u6A21\u578B\u542C\u5F97\u61C2\u4E2D\u6587\uFF0C\u7406\u89E3\u529B\u4E5F\u591F\u7528\uFF09\uFF1B
742
+ - \u522B\u4E3A\u4E86\u663E\u5F97\u4E13\u4E1A\u5C31\u53BB\u5806\u98CE\u683C / \u6750\u8D28 / \u5149\u7EBF / \u955C\u5934\u672F\u8BED\uFF0C\u66F4\u522B\u523B\u610F\u7FFB\u6210\u82F1\u6587\uFF1B
743
+ - \u53EA\u4FDD\u7559\u7528\u6237\u771F\u6B63\u8BF4\u8FC7\u7684\u5185\u5BB9 + \u753B\u9762\u5FC5\u987B\u6709\u7684\u8981\u7D20\uFF0C**\u4E0D\u8981\u66FF\u4ED6\u8111\u8865\u7EC6\u8282**\uFF1B
744
+ - \u63D0\u793A\u8BCD\u8D8A\u957F\uFF0C\u5404\u8981\u7D20\u4E92\u76F8\u7A00\u91CA\uFF0C\u51FA\u56FE\u53CD\u800C\u8D8A\u8D70\u6837\u3002\u4E00\u4E24\u53E5\u8BDD\u80FD\u628A\u753B\u9762\u8BF4\u6E05\u5C31\u591F\u4E86\u3002
801
745
 
802
746
  \u5982\u679C\u4F60\u6240\u5728\u7684\u63A5\u53E3\u4E0D\u652F\u6301\u51FD\u6570\u8C03\u7528\uFF0C\u5C31**\u53EA\u8F93\u51FA\u4E00\u884C JSON** \u6765\u8C03\u7528\u5DE5\u5177\uFF0C\u4F8B\u5982\uFF1A
803
747
  {"tool":"gallery_search","args":{"keyword":"\u767D\u53D1 \u7ACB\u7ED8"}}
@@ -1361,41 +1305,15 @@ var Config = import_koishi.Schema.intersect([
1361
1305
  import_koishi.Schema.object({
1362
1306
  appendUserInput: import_koishi.Schema.boolean().default(true).description("\u628A\u7528\u6237\u968F\u6307\u4EE4\u53D1\u7684\u9644\u52A0\u9700\u6C42\u5E76\u5165\u7ED8\u56FE\u63D0\u793A\u8BCD\uFF08\u4F8B\u5982\u300C\u624B\u529E\u5316 xxx \u5728\u5077\u5403\u767D\u996D\u88AB\u53D1\u73B0\u7684\u8868\u60C5\u300D\uFF09"),
1363
1307
  promptOptimize: import_koishi.Schema.union([
1364
- import_koishi.Schema.const("rewrite").description("\u878D\u5408\u91CD\u5199\uFF08\u63A8\u8350\uFF09\uFF1A\u8BA9\u6A21\u578B\u628A\u9700\u6C42\u5199\u8FDB\u63D0\u793A\u8BCD\u5BF9\u5E94\u4F4D\u7F6E"),
1365
- import_koishi.Schema.const("merge").description("\u76F4\u63A5\u8FFD\u52A0\uFF1A\u628A\u9700\u6C42\u8D34\u5728\u539F\u59CB\u63D0\u793A\u8BCD\u672B\u5C3E"),
1366
- import_koishi.Schema.const("off").description("\u4E0D\u5904\u7406\uFF1A\u53EA\u7528\u6307\u4EE4\u81EA\u8EAB\u7684\u63D0\u793A\u8BCD")
1367
- ]).default("rewrite").description("\u7528\u6237\u9644\u52A0\u9700\u6C42\u5982\u4F55\u5E76\u5165\u63D0\u793A\u8BCD"),
1308
+ import_koishi.Schema.const("passthrough").description("\u539F\u8BDD\u76F4\u51FA\uFF08\u63A8\u8350\uFF09\uFF1A\u7528\u6237\u8BF4\u4E86\u5C31\u7528\u7528\u6237\u7684\u539F\u8BDD\uFF0C\u4E0D\u518D\u62FC\u63A5\u6307\u4EE4\u81EA\u5E26\u7684\u63D0\u793A\u8BCD\uFF0C\u4E5F\u4E0D\u505A\u6269\u5199"),
1309
+ import_koishi.Schema.const("merge").description("\u8FFD\u52A0\uFF1A\u628A\u7528\u6237\u7684\u539F\u8BDD\u8D34\u5728\u6307\u4EE4\u81EA\u5E26\u63D0\u793A\u8BCD\u540E\u9762"),
1310
+ import_koishi.Schema.const("rewrite").description("\u878D\u5408\u91CD\u5199\uFF1A\u8BA9\u6A21\u578B\u628A\u9700\u6C42\u5199\u8FDB\u63D0\u793A\u8BCD\u5BF9\u5E94\u4F4D\u7F6E\uFF08\u4F1A\u53D8\u957F\uFF0C\u8001\u7248\u672C\u7684\u9ED8\u8BA4\u884C\u4E3A\uFF09"),
1311
+ import_koishi.Schema.const("off").description("\u4E0D\u5904\u7406\uFF1A\u53EA\u7528\u6307\u4EE4\u81EA\u5E26\u7684\u63D0\u793A\u8BCD\uFF0C\u5FFD\u7565\u7528\u6237\u8BF4\u7684\u8BDD")
1312
+ ]).default("passthrough").description("\u7528\u6237\u9644\u52A0\u9700\u6C42\u5982\u4F55\u5E76\u5165\u63D0\u793A\u8BCD\u3002**\u7ED8\u56FE\u6A21\u578B\u542C\u5F97\u61C2\u4E2D\u6587**\uFF0C\u4E00\u822C\u4E0D\u9700\u8981\u518D\u4F18\u5316/\u7FFB\u8BD1"),
1368
1313
  optimizePrompt: import_koishi.Schema.string().role("textarea", { rows: [10, 6] }).default(DEFAULT_OPTIMIZE_PROMPT).description("\u878D\u5408\u91CD\u5199\u7528\u7684\u63D0\u793A\u8BCD\u6A21\u677F\uFF0C\u5360\u4F4D\u7B26\uFF1A{prompt} \u539F\u59CB\u63D0\u793A\u8BCD\u3001{userInput} \u7528\u6237\u9644\u52A0\u9700\u6C42"),
1369
1314
  showPrompt: import_koishi.Schema.boolean().default(true).description("\u53D1\u9001\u4F18\u5316\u540E\u7684\u63D0\u793A\u8BCD\uFF08QQ / QQ \u9891\u9053\u7528\u4EE3\u7801\u5757\u5305\u88F9\uFF0C\u5176\u5B83\u5E73\u53F0\u53D1\u7EAF\u6587\u672C\uFF09"),
1370
1315
  promptMaxLength: import_koishi.Schema.number().default(4e3).min(0).max(2e4).step(100).description("\u56DE\u663E\u63D0\u793A\u8BCD\u7684\u6700\u5927\u5B57\u7B26\u6570\uFF0C\u8D85\u51FA\u90E8\u5206\u622A\u65AD\u5E76\u6807\u6CE8\uFF1B\u8BBE\u4E3A 0 \u8868\u793A\u4E0D\u622A\u65AD\uFF08QQ markdown \u6709\u957F\u5EA6\u4E0A\u9650\uFF0C\u592A\u957F\u53EF\u80FD\u88AB\u62D2\u6536\uFF09")
1371
1316
  }).description("\u63D0\u793A\u8BCD\u8BBE\u7F6E"),
1372
- import_koishi.Schema.object({
1373
- textRender: import_koishi.Schema.object({
1374
- enabled: import_koishi.Schema.boolean().default(false).description("\u5F00\u542F\u300C\u6587\u5B57\u6E32\u67D3\u53C2\u8003\u56FE\u300D\uFF1A\u628A\u8981\u5728\u753B\u9762\u4E0A\u51FA\u73B0\u7684\u6587\u5B57\uFF08\u53F0\u8BCD/\u6807\u9898/\u6807\u8BED\uFF09\u5148\u7528\u6D4F\u89C8\u5668\u6E32\u67D3\u6210\u56FE\u7247\uFF0C\u4E00\u8D77\u53D1\u7ED9\u7ED8\u56FE\u6A21\u578B\uFF0C\u89E3\u51B3\u4E2D\u6587\u5D29\u5B57\u95EE\u9898\uFF08\u9700\u8981\u5B89\u88C5\u5E76\u542F\u7528 koishi-plugin-puppeteer\uFF09"),
1375
- autoDetect: import_koishi.Schema.boolean().default(true).description("\u81EA\u52A8\u8BC6\u522B\u63D0\u793A\u8BCD\u91CC\u9700\u8981\u51FA\u73B0\u5728\u753B\u9762\u4E0A\u7684\u4E2D\u6587\u6587\u5B57\u5E76\u6E32\u67D3\uFF08\u8BC6\u522B\u300C\u300D\u201C\u201D\u300A\u300B\u3010\u3011\u4EE5\u53CA\u300C\u53F0\u8BCD\uFF1A\u300D\u7B49\uFF09"),
1376
- loose: import_koishi.Schema.boolean().default(false).description("\u5BBD\u677E\u6A21\u5F0F\uFF1A\u5F15\u53F7\u90FD\u6CA1\u7528\u4E0A\u65F6\uFF0C\u4E5F\u76F4\u63A5\u63D0\u53D6\u8FDE\u7EED\u7684\u4E2D\u6587\u7247\u6BB5\uFF08\u53EF\u80FD\u8BEF\u5224\uFF09"),
1377
- commandName: import_koishi.Schema.string().default("\u6E32\u67D3\u6587\u5B57").description("\u624B\u52A8\u6E32\u67D3\u6307\u4EE4\u540D\uFF08\u6302\u5728\u4E3B\u6307\u4EE4\u6839\u4E0B\uFF09\uFF0C\u7528\u6CD5\uFF1A\u6E32\u67D3\u6587\u5B57 \u8981\u753B\u7684\u6587\u5B57"),
1378
- pendingTTL: import_koishi.Schema.number().default(600).min(0).max(86400).step(30).description("\u624B\u52A8\u6E32\u67D3\u540E\uFF0C\u591A\u5C11\u79D2\u5185\u7684\u7ED8\u56FE\u6307\u4EE4\u81EA\u52A8\u5E26\u4E0A\u8FD9\u5F20\u53C2\u8003\u56FE\uFF080 \u8868\u793A\u53EA\u5728\u4E0B\u4E00\u6B21\u751F\u6548\u524D\u4E00\u76F4\u6709\u6548\uFF09"),
1379
- sendPreview: import_koishi.Schema.boolean().default(true).description("\u6E32\u67D3\u540E\u5148\u628A\u53C2\u8003\u56FE\u53D1\u51FA\u6765\u7ED9\u4F60\u770B"),
1380
- attachToDraw: import_koishi.Schema.boolean().default(true).description("\u628A\u6E32\u67D3\u7ED3\u679C\u5E76\u5165\u7ED8\u56FE\u53C2\u8003\u56FE\u4E00\u8D77\u53D1\u7ED9\u7ED8\u56FE\u6A21\u578B"),
1381
- width: import_koishi.Schema.number().default(1024).min(256).max(4096).step(64).description("\u753B\u5E03\u6700\u5C0F\u5BBD\u5EA6\uFF08\u50CF\u7D20\uFF09"),
1382
- fontSize: import_koishi.Schema.number().default(96).min(12).max(400).step(4).description("\u5B57\u53F7"),
1383
- lineHeight: import_koishi.Schema.number().default(1.4).min(1).max(3).step(0.1).description("\u884C\u9AD8"),
1384
- padding: import_koishi.Schema.number().default(48).min(0).max(400).step(4).description("\u5185\u8FB9\u8DDD"),
1385
- background: import_koishi.Schema.string().default("#ffffff").description("\u80CC\u666F\u8272\uFF08\u586B transparent \u53EF\u8F93\u51FA\u900F\u660E\u5E95\uFF0C\u9002\u5408\u8D34\u5728\u753B\u9762\u4E0A\u7684\u5B57\u5E55\uFF09"),
1386
- color: import_koishi.Schema.string().default("#111111").description("\u6587\u5B57\u989C\u8272"),
1387
- fontFamily: import_koishi.Schema.string().default("Microsoft YaHei, PingFang SC, Noto Sans CJK SC, sans-serif").description("\u5B57\u4F53\uFF08\u6309\u5148\u540E\u987A\u5E8F\u56DE\u9000\uFF09"),
1388
- align: import_koishi.Schema.union([
1389
- import_koishi.Schema.const("center").description("\u5C45\u4E2D"),
1390
- import_koishi.Schema.const("left").description("\u5DE6\u5BF9\u9F50")
1391
- ]).default("center").description("\u5BF9\u9F50\u65B9\u5F0F"),
1392
- bold: import_koishi.Schema.boolean().default(false).description("\u52A0\u7C97"),
1393
- strokeWidth: import_koishi.Schema.number().default(0).min(0).max(40).step(1).description("\u63CF\u8FB9\u5BBD\u5EA6\uFF080 \u4E0D\u63CF\u8FB9\uFF1B\u5B57\u5E55\u5EFA\u8BAE 6-10\uFF09"),
1394
- strokeColor: import_koishi.Schema.string().default("#ffffff").description("\u63CF\u8FB9\u989C\u8272"),
1395
- maxChars: import_koishi.Schema.number().default(200).min(10).max(2e3).step(10).description("\u5355\u6761\u6587\u5B57\u6700\u5927\u5B57\u7B26\u6570\uFF0C\u8D85\u8FC7\u5219\u4E0D\u6E32\u67D3"),
1396
- scale: import_koishi.Schema.number().default(2).min(1).max(4).step(1).description("\u622A\u56FE\u7F29\u653E\u500D\u6570\uFF08\u8D8A\u5927\u8D8A\u6E05\u6670\uFF0C\u6587\u4EF6\u4E5F\u8D8A\u5927\uFF09")
1397
- }).collapse().description("\u6587\u5B57\u6E32\u67D3\u914D\u7F6E\u9879")
1398
- }).description("\u6587\u5B57\u6E32\u67D3\u53C2\u8003\u56FE\uFF08\u9632\u5D29\u5B57\uFF09"),
1399
1317
  import_koishi.Schema.object({
1400
1318
  ackOnStart: import_koishi.Schema.boolean().default(true).description("\u6307\u4EE4\u4E00\u89E6\u53D1\u5C31\u7ACB\u523B\u56DE\u4E00\u6761\u300C\u6536\u5230\uFF0C\u6B63\u5728\u51C6\u5907...\u300D\u3002\u540E\u9762\u7684\u300C\u4F18\u5316\u63D0\u793A\u8BCD + agent \u601D\u8003\u300D\u662F\u4E24\u8F6E\u6A21\u578B\u8BF7\u6C42\u3001\u53EF\u80FD\u8981\u51E0\u5341\u79D2\uFF0C\u4E0D\u53D1\u8FD9\u6761\u7528\u6237\u4F1A\u4EE5\u4E3A\u673A\u5668\u4EBA\u5361\u4F4F\u4E86"),
1401
1319
  markdownImage: import_koishi.Schema.boolean().default(true).description("\u751F\u6210\u7ED3\u679C\u7528 markdown \u7684 ![](\u56FE\u7247\u94FE\u63A5) \u5355\u72EC\u53D1\u4E00\u6761\uFF1B\u4E0D\u652F\u6301 markdown \u7684\u5E73\u53F0\u81EA\u52A8\u9000\u56DE\u666E\u901A\u56FE\u7247\u6D88\u606F"),
@@ -1555,14 +1473,7 @@ function apply(ctx, config) {
1555
1473
  optimizefailed: "\uFF08\u63D0\u793A\u8BCD\u878D\u5408\u5931\u8D25\uFF0C\u5DF2\u6539\u4E3A\u8FFD\u52A0\u6A21\u5F0F\uFF09",
1556
1474
  bgstart: "\u5DF2\u5F00\u59CB\u540E\u53F0\u7ED8\u56FE\uFF08{0} \u5F20\u56FE\uFF09\uFF0C\u753B\u597D\u540E\u4F1A\u5728\u8FD9\u91CC\u901A\u77E5\u4F60...",
1557
1475
  bgqueue: "\uFF08\u5F53\u524D\u6709 {0} \u4E2A\u4EFB\u52A1\u5728\u6392\u961F\uFF09",
1558
- bgdone: "\u753B\u597D\u4E86\uFF1A",
1559
- textrenderNopp: "\u6587\u5B57\u6E32\u67D3\u9700\u8981\u5B89\u88C5\u5E76\u542F\u7528 koishi-plugin-puppeteer\uFF08\u6D4F\u89C8\u5668\u670D\u52A1\uFF09",
1560
- textrenderEmpty: "\u8BF7\u63D0\u4F9B\u8981\u6E32\u67D3\u7684\u6587\u5B57\uFF0C\u4F8B\u5982\uFF1A{0} \u4F60\u597D\u4E16\u754C",
1561
- textrenderFailed: "\u6587\u5B57\u6E32\u67D3\u5931\u8D25\uFF1A{0}",
1562
- textrenderOk: "\u6587\u5B57\u53C2\u8003\u56FE\u5DF2\u6E32\u67D3\uFF0C{0} \u79D2\u5185\u7684\u7ED8\u56FE\u6307\u4EE4\u4F1A\u81EA\u52A8\u5E26\u4E0A\u5B83",
1563
- textrenderOkForever: "\u6587\u5B57\u53C2\u8003\u56FE\u5DF2\u6E32\u67D3\uFF0C\u4E0B\u6B21\u7ED8\u56FE\u4F1A\u81EA\u52A8\u5E26\u4E0A\u5B83",
1564
- textrenderAttached: "\uFF08\u5DF2\u9644\u4E0A\u6587\u5B57\u53C2\u8003\u56FE\uFF1A{0}\uFF09",
1565
- textrenderPreview: "\u6587\u5B57\u53C2\u8003\u56FE\uFF1A"
1476
+ bgdone: "\u753B\u597D\u4E86\uFF1A"
1566
1477
  }
1567
1478
  }
1568
1479
  });
@@ -1876,20 +1787,7 @@ Negative prompt: ${String(args.negative_prompt).trim()}` : prompt;
1876
1787
  const commandName = cmdConfig.name;
1877
1788
  const requireInput = options.requireInput !== false;
1878
1789
  const files = await downloadFiles(imageUrls);
1879
- let text = promptText;
1880
- if (config.textRender?.enabled) {
1881
- const textRef = await resolveTextReference(session, text, userInputText, "");
1882
- if (textRef) {
1883
- files.push(textRef.file);
1884
- text = `${text}
1885
-
1886
- Text in the image must be rendered exactly as shown in the attached text-reference image; copy the glyphs precisely, never distort or invent characters.`;
1887
- logInfo2("\u5DF2\u9644\u52A0\u6587\u5B57\u6E32\u67D3\u53C2\u8003\u56FE");
1888
- if (config.textRender?.sendPreview !== false) {
1889
- await reply(session, [session.text("image-prompt.messages.textrenderPreview"), import_koishi.h.image(textRef.file.data, "image/png")]);
1890
- }
1891
- }
1892
- }
1790
+ const text = promptText;
1893
1791
  if (files.length === 0 && requireInput) return { ok: false, error: "invalidimage" };
1894
1792
  if (config.showPrompt !== false) {
1895
1793
  const echo = buildPromptBlock(text, config.promptMaxLength || 4e3);
@@ -1937,21 +1835,27 @@ ${echo}` : echo);
1937
1835
  async function runDirectFlow(session, cmdConfig, userInputText, defaultImageUrls) {
1938
1836
  const waitTimeout = cmdConfig.waitTimeout || config.defaultWaitTimeout;
1939
1837
  const maxImages = cmdConfig.maxImages || 0;
1940
- let promptText = cmdConfig.prompt;
1838
+ const basePrompt = cmdConfig.prompt || "";
1839
+ const input = String(userInputText || "").trim();
1840
+ const mode = config.promptOptimize || "passthrough";
1841
+ const takeInput = input && config.appendUserInput !== false;
1842
+ let promptText = mode === "passthrough" ? (takeInput ? input : "") || basePrompt : basePrompt;
1941
1843
  let optimizeFailed = false;
1942
- if (userInputText && config.appendUserInput !== false) {
1943
- promptText = mergePrompt(promptText, userInputText, true);
1944
- logInfo2(`\u5DF2\u5E76\u5165\u7528\u6237\u9644\u52A0\u9700\u6C42: ${userInputText}`);
1945
- if (config.promptOptimize === "rewrite") {
1946
- const optimized = await optimizePromptText(cmdConfig.prompt, userInputText);
1947
- if (optimized) {
1948
- promptText = optimized;
1949
- logInfo2("\u63D0\u793A\u8BCD\u5DF2\u878D\u5408\u91CD\u5199");
1950
- } else {
1951
- ctx.logger.warn("\u63D0\u793A\u8BCD\u878D\u5408\u91CD\u5199\u5931\u8D25\uFF0C\u4FDD\u7559\u8FFD\u52A0\u540E\u7684\u63D0\u793A\u8BCD");
1952
- optimizeFailed = true;
1953
- }
1844
+ if (takeInput && mode === "merge") {
1845
+ promptText = mergePrompt(basePrompt, input, true);
1846
+ logInfo2(`\u5DF2\u628A\u7528\u6237\u539F\u8BDD\u8FFD\u52A0\u5230\u6307\u4EE4\u63D0\u793A\u8BCD\u540E: ${input}`);
1847
+ } else if (takeInput && mode === "rewrite") {
1848
+ const optimized = await optimizePromptText(basePrompt, input);
1849
+ if (optimized) {
1850
+ promptText = optimized;
1851
+ logInfo2("\u63D0\u793A\u8BCD\u5DF2\u878D\u5408\u91CD\u5199");
1852
+ } else {
1853
+ ctx.logger.warn("\u63D0\u793A\u8BCD\u878D\u5408\u91CD\u5199\u5931\u8D25\uFF0C\u6539\u7528\u7528\u6237\u7684\u539F\u8BDD");
1854
+ promptText = mergePrompt(basePrompt, input, true);
1855
+ optimizeFailed = true;
1954
1856
  }
1857
+ } else if (takeInput && mode !== "off") {
1858
+ logInfo2(`\u5DF2\u5E76\u5165\u7528\u6237\u539F\u8BDD\uFF08${mode} \u6A21\u5F0F\uFF09: ${input}`);
1955
1859
  }
1956
1860
  if (cmdConfig.custom && !cmdConfig.prompt && !userInputText) {
1957
1861
  const [msgId] = await session.send(session.text("image-prompt.messages.customprompt", [waitTimeout]));
@@ -1963,7 +1867,7 @@ ${echo}` : echo);
1963
1867
  }
1964
1868
  if (!userPrompt) return session.text("image-prompt.messages.needprompt");
1965
1869
  const text = extractTextFromMessage(userPrompt) || String(userPrompt).trim();
1966
- promptText = config.promptOptimize === "rewrite" ? await optimizePromptText("", text) || text : mergePrompt("", text, true);
1870
+ promptText = mode === "rewrite" && await optimizePromptText("", text) || text;
1967
1871
  }
1968
1872
  const images = [...defaultImageUrls || [], ...extractImagesFromSession(session)];
1969
1873
  const remaining = Math.max(0, maxImages - images.length);
@@ -2066,107 +1970,6 @@ ${echo}` : echo);
2066
1970
  if (source === "both") return [userInput, promptText].filter(Boolean).join(" | ");
2067
1971
  return promptText;
2068
1972
  }
2069
- const pendingTextRefs = /* @__PURE__ */ new Map();
2070
- function textRefKey(session) {
2071
- return `${session.platform}:${session.channelId || session.userId || ""}`;
2072
- }
2073
- function takePendingTextRef(session) {
2074
- const cfg = config.textRender || {};
2075
- const key = textRefKey(session);
2076
- const item = pendingTextRefs.get(key);
2077
- if (!item) return null;
2078
- const ttl = (cfg.pendingTTL || 0) * 1e3;
2079
- if (ttl > 0 && Date.now() - item.time > ttl) {
2080
- pendingTextRefs.delete(key);
2081
- return null;
2082
- }
2083
- pendingTextRefs.delete(key);
2084
- return { file: item.file, text: item.text };
2085
- }
2086
- async function renderTextToImage(text) {
2087
- const cfg = config.textRender || {};
2088
- const lines = String(text || "").split("\n").map((line) => line.trim()).filter(Boolean);
2089
- if (lines.length === 0) return null;
2090
- const puppeteer = ctx.puppeteer;
2091
- if (!puppeteer || typeof puppeteer.page !== "function") {
2092
- ctx.logger.warn("\u6587\u5B57\u6E32\u67D3\u9700\u8981 koishi-plugin-puppeteer\uFF08\u6D4F\u89C8\u5668\u670D\u52A1\uFF09\uFF0C\u5F53\u524D\u4E0D\u53EF\u7528");
2093
- return null;
2094
- }
2095
- const html = buildTextHtml(lines, cfg);
2096
- let page;
2097
- try {
2098
- page = await puppeteer.page();
2099
- await page.setViewport({
2100
- width: cfg.width || 1024,
2101
- height: 400,
2102
- deviceScaleFactor: cfg.scale || 2
2103
- });
2104
- await page.setContent(html, { waitUntil: "load" });
2105
- await page.evaluate(() => document.fonts?.ready).catch(() => {
2106
- });
2107
- const stage = await page.$("#stage");
2108
- const clip = stage ? await stage.boundingBox() : null;
2109
- const transparent = String(cfg.background || "").toLowerCase() === "transparent";
2110
- const buffer = clip ? await page.screenshot({ clip, omitBackground: transparent }) : await page.screenshot({ omitBackground: transparent });
2111
- const data = Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer);
2112
- logInfo2(`\u6587\u5B57\u6E32\u67D3\u5B8C\u6210: ${lines.length} \u884C, ${data.length} \u5B57\u8282`);
2113
- return { data, mime: "image/png" };
2114
- } catch (error) {
2115
- ctx.logger.warn(`\u6587\u5B57\u6E32\u67D3\u5931\u8D25: ${error}`);
2116
- return null;
2117
- } finally {
2118
- try {
2119
- await page?.close();
2120
- } catch {
2121
- }
2122
- }
2123
- }
2124
- async function resolveTextReference(session, promptText, userInput, modelText) {
2125
- const cfg = config.textRender || {};
2126
- if (!cfg.enabled || cfg.attachToDraw === false) return null;
2127
- const pending = takePendingTextRef(session);
2128
- if (pending) return pending;
2129
- const fromModel = (modelText || "").trim();
2130
- if (fromModel) {
2131
- const file2 = await renderTextToImage(fromModel);
2132
- if (file2) return { file: file2, text: fromModel };
2133
- }
2134
- if (cfg.autoDetect === false) return null;
2135
- const found = [
2136
- ...extractTextToRender(promptText, { loose: cfg.loose, maxChars: cfg.maxChars }),
2137
- ...extractTextToRender(userInput, { loose: cfg.loose, maxChars: cfg.maxChars })
2138
- ];
2139
- const text = Array.from(new Set(found)).join("\n");
2140
- if (!text) return null;
2141
- logInfo2(`\u81EA\u52A8\u8BC6\u522B\u5230\u9700\u8981\u6E32\u67D3\u7684\u6587\u5B57: ${text}`);
2142
- const file = await renderTextToImage(text);
2143
- return file ? { file, text } : null;
2144
- }
2145
- const textCmdName = (config.textRender?.commandName || "\u6E32\u67D3\u6587\u5B57").trim() || "\u6E32\u67D3\u6587\u5B57";
2146
- ctx.command(`${config.basename}/${textCmdName} [...text:text]`).usage("\u628A\u6587\u5B57\u6E32\u67D3\u6210\u56FE\u7247\uFF0C\u4F5C\u4E3A\u7ED8\u56FE\u53C2\u8003\u56FE\uFF08\u89E3\u51B3\u4E2D\u6587\u5D29\u5B57\uFF09").action(async ({ session }, ...args) => {
2147
- if (!isActive || !ctx.scope.isActive) return;
2148
- if (!session) return;
2149
- const quote = import_koishi.h.quote(session.messageId);
2150
- const cfg = config.textRender || {};
2151
- const raw = args.filter(Boolean).join(" ").trim() || stripCommandName(extractTextFromMessage(session.stripped.content), textCmdName).trim();
2152
- if (!raw) return `${quote}${session.text("image-prompt.messages.textrenderEmpty", [textCmdName])}`;
2153
- const puppeteer = ctx.puppeteer;
2154
- if (!puppeteer || typeof puppeteer.page !== "function") {
2155
- return `${quote}${session.text("image-prompt.messages.textrenderNopp")}`;
2156
- }
2157
- const file = await renderTextToImage(raw);
2158
- if (!file) return `${quote}${session.text("image-prompt.messages.textrenderFailed", ["\u6E32\u67D3\u5F02\u5E38"])}`;
2159
- if (cfg.attachToDraw !== false) {
2160
- pendingTextRefs.set(textRefKey(session), { file, text: raw, time: Date.now() });
2161
- }
2162
- const ttl = cfg.pendingTTL || 0;
2163
- const tip = ttl > 0 ? session.text("image-prompt.messages.textrenderOk", [ttl]) : session.text("image-prompt.messages.textrenderOkForever");
2164
- if (cfg.sendPreview !== false) {
2165
- await reply(session, [import_koishi.h.image(file.data, "image/png"), tip]);
2166
- return;
2167
- }
2168
- return `${quote}${tip}`;
2169
- });
2170
1973
  const debugCmdName = (config.aiSelector?.debugCommand || "\u6D4B\u8BD5\u9009\u56FE").trim() || "\u6D4B\u8BD5\u9009\u56FE";
2171
1974
  ctx.command(`${config.basename}/${debugCmdName}`).usage("\u53D1\u4E00\u6B21\u9009\u56FE\u8BF7\u6C42\u5E76\u56DE\u663E\u6A21\u578B\u539F\u59CB\u8FD4\u56DE\uFF0C\u7528\u4E8E\u6392\u67E5\u300C\u54CD\u5E94\u4E2D\u6CA1\u6709\u6587\u672C\u5185\u5BB9\u300D").action(async ({ session }) => {
2172
1975
  if (!isActive || !ctx.scope.isActive) return;
@@ -2653,15 +2456,12 @@ ${lines.join("\n")}`]);
2653
2456
  buildMarkdownImage,
2654
2457
  buildPromptBlock,
2655
2458
  buildPromptEcho,
2656
- buildTextHtml,
2657
2459
  cleanAskMessage,
2658
2460
  computeRetryDelay,
2659
2461
  describeSelectorError,
2660
- escapeHtml,
2661
2462
  extractJsonObject,
2662
2463
  extractResponseText,
2663
2464
  extractServerMessage,
2664
- extractTextToRender,
2665
2465
  fitImageSize,
2666
2466
  httpErrorText,
2667
2467
  inject,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-image-prompt",
3
3
  "description": "多功能 AI 图像处理插件:Agent 模式把「查不查图库 / 要不要追问 / 什么时候开画」全交给模型自己决定,支持手办化、Coser 化、Minecraft 化等 47 种风格与自定义提示词",
4
- "version": "2.0.2",
4
+ "version": "2.0.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [