koishi-plugin-image-prompt 1.1.1 → 1.3.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 CHANGED
@@ -9,7 +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\u3010AI \u9009\u62E9\u53C2\u8003\u56FE\u7247\u3011\n\n1. \u5728\u300C\u53C2\u8003\u56FE\u7247\u7EC4\u300D\u4E2D\u6CE8\u518C\u5206\u7EC4\uFF1A\u6BCF\u7EC4\u586B\u5199\u82E5\u5E72\u5F20\u300C\u56FE\u7247\u94FE\u63A5 + \u63CF\u8FF0\u300D\uFF08\u63CF\u8FF0\u7528\u4E8E\u8BA9 AI \u5224\u65AD\u8BE5\u56FE\u7684\u7528\u9014\uFF09\u3002\n2. \u5728\u6307\u4EE4\u914D\u7F6E\u7684\u300C\u5F15\u7528\u7684\u53C2\u8003\u56FE\u7247\u7EC4\u540D\u79F0\u300D\u4E2D\u586B\u5165\u7EC4\u540D\uFF08\u53EF\u586B\u591A\u4E2A\uFF09\uFF0C\u8BE5\u6307\u4EE4\u6267\u884C\u65F6\u4F1A\u628A\u7EC4\u5185\u56FE\u7247\u5168\u90E8\u4EA4\u7ED9 AI \u6311\u9009\u3002\n3. \u300CAI \u9009\u56FE\u8BBE\u7F6E\u300D\u53EF\u4FEE\u6539\u5BF9\u8BDD\u6A21\u578B\uFF08\u9ED8\u8BA4 Qwen/Qwen2.5-7B-Instruct\uFF09\u3001\u9009\u62E9\u63D0\u793A\u8BCD\u6A21\u677F\u3001\u8D85\u65F6\u4E0E\u91CD\u8BD5\u7B49\uFF1B\n \u63A5\u53E3\u5730\u5740/\u5BC6\u94A5\u7559\u7A7A\u65F6\u590D\u7528\u7ED8\u56FE\u63A5\u53E3\u7684\u914D\u7F6E\u3002\n4. \u5F53 AI \u5224\u5B9A\u5019\u9009\u56FE\u7247\u91CC\u6CA1\u6709\u5408\u9002\u7684\u53C2\u8003\u56FE\u65F6\uFF0C\u4F1A\u6309\u914D\u7F6E\u8BE2\u95EE\u7528\u6237\u8865\u5145\u53D1\u9001\u56FE\u7247\uFF08\u7528\u6237\u53D1\u9001\u540E\u4F1A\u88AB\u76F4\u63A5\u4F7F\u7528\uFF09\u3002\n \u82E5\u9009\u56FE\u6A21\u578B\u652F\u6301\u8BC6\u522B\u56FE\u7247\uFF08\u591A\u6A21\u6001\uFF09\uFF0C\u53EF\u52FE\u9009\u300C\u9009\u56FE\u6A21\u578B\u652F\u6301\u8BC6\u522B\u56FE\u7247\u300D\uFF0C\u63D2\u4EF6\u4F1A\u628A\u5019\u9009\u56FE\u7247\u672C\u8EAB\u53D1\u7ED9\u6A21\u578B\uFF0C\n \u6A21\u578B\u5BF9\u7740\u771F\u5B9E\u56FE\u7247\u6311\u9009\uFF1B\u5B83\u7ED9\u51FA\u7684\u5173\u952E\u89C6\u89C9\u7279\u5F81\u8FD8\u4F1A\u5E76\u5165\u7ED8\u56FE\u63D0\u793A\u8BCD\uFF0C\u8BA9\u51FA\u56FE\u66F4\u8FD8\u539F\u53C2\u8003\u56FE\u3002\n5. \u300C\u542F\u7528 AI \u667A\u80FD\u9009\u62E9\u53C2\u8003\u56FE\u7247\u300D\u9ED8\u8BA4\u5173\u95ED\uFF0C\u9700\u624B\u52A8\u5F00\u542F\uFF1B\u300CAI \u9009\u56FE\u5931\u8D25\u65F6\u56DE\u9000\u4E3A\u4F7F\u7528\u5019\u9009\u6C60\u5185\u5168\u90E8\u56FE\u7247\u300D\u9ED8\u8BA4\u5173\u95ED\uFF0C\n \u5931\u8D25\u65F6\u672C\u6B21\u4E0D\u4F7F\u7528\u53C2\u8003\u56FE\u7247\uFF08\u5F00\u542F\u5219\u6539\u7528\u5019\u9009\u6C60\u5185\u5168\u90E8\u56FE\u7247\uFF09\u3002\n6. \u53C2\u8003\u56FE\u8F83\u591A\u65F6\uFF08\u8D85\u8FC7 12 \u5F20\uFF09\u81EA\u52A8\u8D70\u4E24\u7EA7\u68C0\u7D22\uFF1A\u5148\u8BA9\u6A21\u578B\u4EA7\u51FA\u68C0\u7D22\u5173\u952E\u8BCD\u3001\u672C\u5730\u5339\u914D\u53EC\u56DE\uFF0C\u518D\u5BF9\u53EC\u56DE\u7ED3\u679C\u7CBE\u6392\uFF1B\n \u8BC6\u56FE\u6A21\u5F0F\u4E0B\u4E5F\u53EA\u53D1\u9001\u53EC\u56DE\u7684\u8FD9\u51E0\u5F20\u56FE\u7247\uFF0C\u907F\u514D\u6BCF\u6B21\u90FD\u628A\u6574\u4E2A\u56FE\u5E93\u53D1\u7ED9\u6A21\u578B\u3002\n7. \u63CF\u8FF0\u53EF\u4EE5\u7528\u300C\u751F\u6210\u63CF\u8FF0\u300D\u6307\u4EE4\u8BA9\u6A21\u578B\u770B\u56FE\u81EA\u52A8\u751F\u6210\u5E76\u5199\u56DE\u914D\u7F6E\uFF08\u9700\u8981\u652F\u6301\u56FE\u7247\u8F93\u5165\u7684\u6A21\u578B\uFF09\u3002\n8. \u751F\u6210\u7ED3\u679C\u53EF\u81EA\u52A8\u5165\u5E93\uFF08\u9ED8\u8BA4\u5173\u95ED\uFF09\uFF0C\u4E0B\u6B21\u80FD\u88AB\u81EA\u5DF1\u68C0\u7D22\u5230\u5E76\u590D\u7528\uFF0C\u5F62\u6210\u95ED\u73AF\uFF1B\n \u5F00\u542F\u300C\u540E\u53F0\u7ED8\u56FE\u300D\u540E\u51FA\u56FE\u4E0D\u518D\u963B\u585E\uFF0C\u5148\u56DE\u300C\u6B63\u5728\u753B\u300D\uFF0C\u753B\u597D\u4E3B\u52A8\u63A8\u9001\u3002\n\n\u63D0\u793A\u8BCD\u6A21\u677F\u53EF\u7528\u5360\u4F4D\u7B26\uFF1A{candidates} \u5019\u9009\u56FE\u7247\u5217\u8868\u3001{userInput} \u7528\u6237\u9644\u52A0\u9700\u6C42\u3001{max} \u6700\u591A\u9009\u62E9\u6570\u91CF\u3001{command} \u6307\u4EE4\u540D\u3001{prompt} \u6307\u4EE4\u63D0\u793A\u8BCD\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";
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\u3010AI \u9009\u62E9\u53C2\u8003\u56FE\u7247\u3011\n\n1. \u5728\u300C\u53C2\u8003\u56FE\u7247\u7EC4\u300D\u4E2D\u6CE8\u518C\u5206\u7EC4\uFF1A\u6BCF\u7EC4\u586B\u5199\u82E5\u5E72\u5F20\u300C\u56FE\u7247\u94FE\u63A5 + \u63CF\u8FF0\u300D\uFF08\u63CF\u8FF0\u7528\u4E8E\u8BA9 AI \u5224\u65AD\u8BE5\u56FE\u7684\u7528\u9014\uFF09\u3002\n **\u63CF\u8FF0\u4E00\u5B9A\u8981\u5199\u5177\u4F53**\uFF08\u53D1\u8272\u53D1\u578B\u3001\u670D\u88C5\u3001\u52A8\u4F5C\u3001\u753B\u98CE\uFF09\u2014\u2014 \u6253\u5206\u5236\u4E0B\u6CA1\u63CF\u8FF0\u7684\u56FE\u6C38\u8FDC\u9009\u4E0D\u4E0A\u3002\n2. \u5728\u6307\u4EE4\u914D\u7F6E\u7684\u300C\u5F15\u7528\u7684\u53C2\u8003\u56FE\u7247\u7EC4\u540D\u79F0\u300D\u4E2D\u586B\u5165\u7EC4\u540D\uFF08\u53EF\u586B\u591A\u4E2A\uFF09\uFF0C\u8BE5\u6307\u4EE4\u6267\u884C\u65F6\u4F1A\u628A\u7EC4\u5185\u56FE\u7247\u5168\u90E8\u4EA4\u7ED9 AI \u6311\u9009\u3002\n3. \u300CAI \u9009\u56FE\u8BBE\u7F6E\u300D\u53EF\u4FEE\u6539\u5BF9\u8BDD\u6A21\u578B\uFF08\u9ED8\u8BA4 Qwen/Qwen2.5-7B-Instruct\uFF09\u3001\u9009\u62E9\u6A21\u5F0F\u3001\u63D0\u793A\u8BCD\u6A21\u677F\u3001\u8D85\u65F6\u4E0E\u91CD\u8BD5\u7B49\uFF1B\n \u63A5\u53E3\u5730\u5740/\u5BC6\u94A5\u7559\u7A7A\u65F6\u590D\u7528\u7ED8\u56FE\u63A5\u53E3\u7684\u914D\u7F6E\u3002\n4. \u300C\u9009\u56FE\u6A21\u5F0F\u300D\u9ED8\u8BA4\u662F**\u6253\u5206\u5236**\uFF1A\u5148\u53EA\u505A\u9700\u6C42\u5206\u6790\uFF08**\u4E0D\u7ED9\u6A21\u578B\u5019\u9009\u56FE**\uFF0C\u5B83\u6CA1\u6709\u300C\u53EF\u6311\u7684\u5BF9\u8C61\u300D\uFF09\uFF0C\n \u518D\u7528\u5173\u952E\u8BCD\u5728\u672C\u5730\u53EC\u56DE\uFF0C\u7136\u540E\u8981\u6C42\u6A21\u578B\u7ED9\u6BCF\u5F20\u5019\u9009\u56FE\u6253 0-100 \u5206\uFF0C\u4F4E\u4E8E\u300C\u6700\u4F4E\u5206\u6570\u7EBF\u300D\u7684\u4E00\u5F8B\u4E0D\u8981\u3002\n \u4E00\u5F20\u90FD\u4E0D\u8FBE\u6807\u5C31\u5982\u5B9E\u544A\u77E5\u7528\u6237\u300C\u56FE\u5E93\u91CC\u6CA1\u6709\u5408\u9002\u7684\u53C2\u8003\u56FE\u300D\uFF0C**\u4E0D\u4F1A\u786C\u51D1**\uFF1B\n \u82E5\u5F00\u542F\u300C\u7F3A\u5C11\u5408\u9002\u53C2\u8003\u56FE\u65F6\u8BE2\u95EE\u7528\u6237\u8865\u5145\u53D1\u9001\u300D\uFF0C\u4F1A\u8BF7\u7528\u6237\u8865\u53D1\u4E00\u5F20\u53C2\u8003\u56FE\uFF08\u7528\u6237\u53D1\u7684\u56FE\u4F1A\u88AB\u76F4\u63A5\u4F7F\u7528\uFF09\u3002\n \u60F3\u56DE\u5230\u8001\u884C\u4E3A\u5C31\u628A\u300C\u9009\u56FE\u6A21\u5F0F\u300D\u6539\u6210\u300C\u65E7\u7248\u300D\u3002\n5. \u5F53\u7528\u6237\u660E\u786E\u8BF4\u300C\u4E0D\u7528\u53C2\u8003 / \u968F\u610F\u753B / \u81EA\u7531\u53D1\u6325\u300D\u65F6\uFF0C\u76F4\u63A5\u8DF3\u8FC7\u9009\u56FE\uFF0C\u4E00\u6B21\u9009\u56FE\u8BF7\u6C42\u90FD\u4E0D\u53D1\u3002\n6. \u6307\u4EE4\u4E00\u89E6\u53D1\u5C31\u5148\u56DE\u4E00\u6761\u300C\u6536\u5230\uFF0C\u6B63\u5728\u51C6\u5907...\u300D\uFF08\u300C\u6D88\u606F\u53D1\u9001 \u2192 \u6536\u5230\u63D0\u793A\u300D\uFF0C\u9ED8\u8BA4\u5F00\uFF09\u3002\n \u540E\u9762\u7684\u4F18\u5316\u63D0\u793A\u8BCD + \u9009\u56FE\u662F\u4E24\u8F6E\u6A21\u578B\u8BF7\u6C42\uFF0C\u53EF\u80FD\u8981\u51E0\u5341\u79D2\uFF0C\u4E0D\u53D1\u8FD9\u6761\u7528\u6237\u4F1A\u4EE5\u4E3A\u673A\u5668\u4EBA\u5361\u6B7B\u3002\n7. **\u5F00\u753B\u524D\u786E\u8BA4**\uFF08\u300C\u6D88\u606F\u53D1\u9001 \u2192 \u5F00\u753B\u524D\u8BF7\u7528\u6237\u786E\u8BA4\u300D\uFF0C\u9ED8\u8BA4\u5F00\uFF09\uFF1AAI \u6311\u5B8C\u53C2\u8003\u56FE\u5148\u4E0D\u753B\uFF0C\n \u628A\u300C\u672C\u6B21\u4F1A\u53C2\u8003\u54EA\u51E0\u5F20\u56FE\u300D\u5217\u51FA\u6765\uFF0C\u56DE\u590D\u300C\u786E\u8BA4\u300D\u624D\u5F00\u753B\uFF08\u8D85\u65F6\u6216\u56DE\u522B\u7684\u90FD\u7B97\u53D6\u6D88\uFF09\u3002\n \u4E0D\u60F3\u591A\u8FD9\u4E00\u6B65\u5C31\u5173\u6389\uFF0C\u6216\u5728\u5355\u4E2A\u6307\u4EE4\u4E0A\u8BBE\u6210\u300C\u9009\u597D\u56FE\u76F4\u63A5\u5F00\u753B\u300D\u3002\n8. \u300C\u542F\u7528 AI \u667A\u80FD\u9009\u62E9\u53C2\u8003\u56FE\u7247\u300D\u9ED8\u8BA4\u5173\u95ED\uFF0C\u9700\u624B\u52A8\u5F00\u542F\uFF1B\u300CAI \u9009\u56FE\u5931\u8D25\u65F6\u56DE\u9000\u4E3A\u4F7F\u7528\u5019\u9009\u6C60\u5185\u5168\u90E8\u56FE\u7247\u300D\u9ED8\u8BA4\u5173\u95ED\uFF0C\n \u5931\u8D25\u65F6\u672C\u6B21\u4E0D\u4F7F\u7528\u53C2\u8003\u56FE\u7247\uFF08\u5F00\u542F\u5219\u6539\u7528\u5019\u9009\u6C60\u5185\u5168\u90E8\u56FE\u7247\uFF09\u3002\u6CE8\u610F\u300C\u56DE\u9000\u300D\u53EA\u5BF9**\u8BF7\u6C42\u5931\u8D25**\u751F\u6548\uFF0C\n \u5BF9\u300C\u6253\u5206\u4E0D\u8FBE\u6807\u300D\u4E0D\u751F\u6548 \u2014\u2014 \u540E\u8005\u5C31\u8BE5\u4E0D\u5E26\u53C2\u8003\u56FE\u3002\n9. \u300C\u65E7\u7248\u300D\u6A21\u5F0F\u4E0B\u53C2\u8003\u56FE\u8F83\u591A\u65F6\uFF08\u8D85\u8FC7 12 \u5F20\uFF09\u81EA\u52A8\u8D70\u4E24\u7EA7\u68C0\u7D22\uFF1A\u5148\u8BA9\u6A21\u578B\u4EA7\u51FA\u68C0\u7D22\u5173\u952E\u8BCD\u3001\u672C\u5730\u5339\u914D\u53EC\u56DE\uFF0C\n \u518D\u5BF9\u53EC\u56DE\u7ED3\u679C\u7CBE\u6392\uFF1B\u8BC6\u56FE\u6A21\u5F0F\u4E0B\u4E5F\u53EA\u53D1\u9001\u53EC\u56DE\u7684\u8FD9\u51E0\u5F20\u56FE\u7247\uFF0C\u907F\u514D\u6BCF\u6B21\u90FD\u628A\u6574\u4E2A\u56FE\u5E93\u53D1\u7ED9\u6A21\u578B\u3002\n10. \u63CF\u8FF0\u53EF\u4EE5\u7528\u300C\u751F\u6210\u63CF\u8FF0\u300D\u6307\u4EE4\u8BA9\u6A21\u578B\u770B\u56FE\u81EA\u52A8\u751F\u6210\u5E76\u5199\u56DE\u914D\u7F6E\uFF08\u9700\u8981\u652F\u6301\u56FE\u7247\u8F93\u5165\u7684\u6A21\u578B\uFF09\u3002\n \u82E5\u9009\u56FE\u6A21\u578B\u652F\u6301\u8BC6\u522B\u56FE\u7247\uFF08\u591A\u6A21\u6001\uFF09\uFF0C\u53EF\u52FE\u9009\u300C\u9009\u56FE\u6A21\u578B\u652F\u6301\u8BC6\u522B\u56FE\u7247\u300D\uFF0C\u63D2\u4EF6\u4F1A\u628A\u5019\u9009\u56FE\u7247**\u81EA\u5DF1\u4E0B\u8F7D\u540E\u8F6C base64**\n \u518D\u53D1\u7ED9\u6A21\u578B\uFF08\u76F4\u63A5\u4E22\u94FE\u63A5\u7684\u8BDD\uFF0C\u6A21\u578B\u670D\u52A1\u7AEF\u62C9\u4E0D\u5230\u5C31\u4F1A\u6574\u6761\u8BF7\u6C42 400\uFF09\uFF0C\u6A21\u578B\u5BF9\u7740\u771F\u5B9E\u56FE\u7247\u6311\u9009\uFF1B\n \u5B83\u7ED9\u51FA\u7684\u5173\u952E\u89C6\u89C9\u7279\u5F81\u8FD8\u4F1A\u5E76\u5165\u7ED8\u56FE\u63D0\u793A\u8BCD\uFF0C\u8BA9\u51FA\u56FE\u66F4\u8FD8\u539F\u53C2\u8003\u56FE\u3002\n11. \u751F\u6210\u7ED3\u679C\u53EF\u81EA\u52A8\u5165\u5E93\uFF08\u9ED8\u8BA4\u5173\u95ED\uFF09\uFF0C\u4E0B\u6B21\u80FD\u88AB\u81EA\u5DF1\u68C0\u7D22\u5230\u5E76\u590D\u7528\uFF0C\u5F62\u6210\u95ED\u73AF\uFF1B\n \u5F00\u542F\u300C\u540E\u53F0\u7ED8\u56FE\u300D\u540E\u51FA\u56FE\u4E0D\u518D\u963B\u585E\uFF0C\u5148\u56DE\u300C\u6B63\u5728\u753B\u300D\uFF0C\u753B\u597D\u4E3B\u52A8\u63A8\u9001\u3002\n\n\u63D0\u793A\u8BCD\u6A21\u677F\u53EF\u7528\u5360\u4F4D\u7B26\uFF1A{candidates} \u5019\u9009\u56FE\u7247\u5217\u8868\u3001{userInput} \u7528\u6237\u9644\u52A0\u9700\u6C42\u3001{max} \u6700\u591A\u9009\u62E9\u6570\u91CF\u3001{command} \u6307\u4EE4\u540D\u3001{prompt} \u6307\u4EE4\u63D0\u793A\u8BCD\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";
13
13
  /**
14
14
  * 解析模型返回的 JSON 选择结果(纯函数,便于单独测试)
15
15
  * @param raw 模型的原始回复
@@ -33,6 +33,66 @@ export declare function computeRetryDelay(status: any, retryAfter: number | unde
33
33
  export declare function matchCandidatesByKeywords(candidates: CandidateImage[], keywords: string[], topK: number): CandidateImage[];
34
34
  /** 去重合并候选(按 url 判重) */
35
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
+ /** 从任意文本里挖出第一个 JSON 对象(容忍代码块围栏和前后废话) */
60
+ 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
+ * 兜住「需求分析」模型爱乱加的废话。
67
+ *
68
+ * 实测模型会把 needTypes 写成
69
+ * 「能发一张你想用的自己形象的参考图吗?顺便说说 DeepSeek 画成鲸鱼可以吗?」——
70
+ * 后半句是凭空瞎聊,用户看了莫名其妙。这里只保留第一句、去掉换行和 markdown 修饰、
71
+ * 限制长度,把「询问补图」这件事还原成一句话。
72
+ */
73
+ export declare function sanitizeAskMessage(raw: string | null | undefined, max?: number): string;
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[];
83
+ /**
84
+ * 按分数阈值筛选:只有达到 minScore 的才留下,按分数从高到低取前 max 张。
85
+ * 一张都不达标时返回空数组 —— 这是「宁可不选也不乱选」的兜底。
86
+ */
87
+ export declare function selectByScore(scored: ScoredCandidate[], candidates: CandidateImage[], minScore: number, max: number): {
88
+ picked: CandidateImage[];
89
+ best: number;
90
+ passed: number;
91
+ };
92
+ /**
93
+ * 去掉重复图:链接相同的直接去掉;描述完全相同的(同一批入库的近似图)只留第一张。
94
+ */
95
+ export declare function dedupeCandidates(list: CandidateImage[]): CandidateImage[];
36
96
  /**
37
97
  * 图库容量裁剪:超出容量时淘汰最旧的(按 time 升序),只保留每个组最近 capacity 条
38
98
  */
@@ -144,8 +204,11 @@ export declare function withTokenParam(body: any, param: string): any;
144
204
  * @param candidates 候选图片
145
205
  * @param vision 是否附带图片
146
206
  * @param visionMaxImages 最多附带多少张图片
207
+ * @param dataUrls 已经自己下载好的 base64 data URL(按 candidates 下标)。**传了它之后,
208
+ * 没下载成功的图就不再发原始链接了** —— 上游拉不到那个链接会整条请求 400,
209
+ * 连文字描述一起废掉;只发描述反而还能用。
147
210
  */
148
- export declare function buildSelectorContent(text: string, candidates: CandidateImage[], vision: boolean, visionMaxImages: number): string | any[];
211
+ export declare function buildSelectorContent(text: string, candidates: CandidateImage[], vision: boolean, visionMaxImages: number, dataUrls?: (string | undefined)[]): string | any[];
149
212
  /** HTML 转义,避免渲染时把文字当标签吃掉 */
150
213
  export declare function escapeHtml(text: string): string;
151
214
  /** 把要渲染的文字拼成一份 HTML(供无头浏览器截图) */
@@ -173,6 +236,8 @@ interface CommandConfig {
173
236
  aiSelect?: boolean;
174
237
  aiMaxSelect?: number;
175
238
  aiAskUser?: boolean;
239
+ /** 该指令是否在开画前请用户确认:'follow' 跟随全局 / 'on' 总是确认 / 'off' 从不确认 */
240
+ confirmBeforeDraw?: 'follow' | 'on' | 'off' | boolean;
176
241
  }[];
177
242
  };
178
243
  defaultWaitTimeout: number;
@@ -194,6 +259,12 @@ interface CommandConfig {
194
259
  textRender?: TextRenderConfig;
195
260
  /** 把处理过程中的多条提示合并成一条消息发出(省被动消息额度) */
196
261
  mergeNotifications?: boolean;
262
+ /** 指令一触发就立刻回一条「收到」,避免用户以为卡住 */
263
+ ackOnStart?: boolean;
264
+ /** AI 选好参考图后先请用户确认再开画 */
265
+ confirmBeforeDraw?: boolean;
266
+ /** 等待用户确认的时间(秒) */
267
+ confirmTimeout?: number;
197
268
  /** 结果图用 markdown 的 ![](url) 单独发一条(支持的平台) */
198
269
  markdownImage?: boolean;
199
270
  /** 结果图先经 assets 服务上传再发(外链在手机端 QQ 可能拉不到) */
@@ -290,6 +361,8 @@ interface AISelectorConfig {
290
361
  notify: boolean;
291
362
  vision: boolean;
292
363
  visionMaxImages: number;
364
+ /** 识图时单张候选图的体积上限(MB),超过就只发文字描述 */
365
+ visionMaxImageBytes?: number;
293
366
  visionFallback: boolean;
294
367
  appendHint: boolean;
295
368
  twoStage: boolean;
@@ -314,6 +387,18 @@ interface AISelectorConfig {
314
387
  maxTokensCeiling?: number;
315
388
  /** 诊断指令名:发一次选图请求并回显模型原始返回 */
316
389
  debugCommand?: string;
390
+ /** 选图模式:score = 抽需求+逐图打分(默认);legacy = 旧的候选全量丢给模型挑 */
391
+ selectionMode?: 'score' | 'legacy';
392
+ /** 打分制的最低分数线(0-100),低于它的图一律不选 */
393
+ minScore?: number;
394
+ /** 打分制第一步「需求分析」的提示词模板 */
395
+ analyzePrompt?: string;
396
+ /** 打分制第二步「逐图打分」的提示词模板 */
397
+ scorePrompt?: string;
398
+ /** 是否合并描述完全相同的重复参考图(默认开) */
399
+ dedupe?: boolean;
400
+ /** 用户说「不用参考/随意画」时是否跳过选图(默认开) */
401
+ respectSkipReference?: boolean;
317
402
  }
318
403
  /** 交给 AI 挑选的候选图片 */
319
404
  interface CandidateImage {