koishi-plugin-image-prompt 2.0.2 → 2.0.3

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
@@ -222,7 +222,7 @@ interface CommandConfig {
222
222
  showPrompt?: boolean;
223
223
  promptMaxLength?: number;
224
224
  appendUserInput?: boolean;
225
- promptOptimize?: 'off' | 'merge' | 'rewrite';
225
+ promptOptimize?: 'off' | 'passthrough' | 'merge' | 'rewrite';
226
226
  optimizePrompt?: string;
227
227
  resultGallery?: ResultGalleryConfig;
228
228
  backgroundDrawing?: BackgroundDrawingConfig;
package/lib/index.js CHANGED
@@ -270,7 +270,8 @@ function buildAgentTools() {
270
270
  parameters: {
271
271
  type: "object",
272
272
  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" },
273
+ // 提示词要短:宁可朴素,也不要堆术语写成几百字的「专业」prompt
274
+ 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
275
  references: {
275
276
  type: "array",
276
277
  items: { type: "string" },
@@ -757,13 +758,15 @@ function extractTextToRender(text, options = {}) {
757
758
  }
758
759
  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
760
 
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
761
+ \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
762
 
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
763
+ 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
764
+ 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
765
+ \u7528\u6237\u6CA1\u63D0\u7684\u5C31\u522B\u5199\u3002
766
+ 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
767
+ 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
768
+ \u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u4E13\u4E1A\u800C\u7FFB\u6210\u82F1\u6587\u3001\u4E0D\u8981\u5806\u780C\u672F\u8BED\u3002
769
+ 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
770
 
768
771
  \u539F\u59CB\u63D0\u793A\u8BCD\uFF1A
769
772
  {prompt}
@@ -798,6 +801,11 @@ var DEFAULT_AGENT_INSTRUCTIONS = `\u4F60\u662F QQ \u7FA4\u91CC\u7684\u7ED8\u56FE
798
801
  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
802
  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
803
  \u53EA\u586B\u4F60\u786E\u8BA4\u5B58\u5728\u7684\u7F16\u53F7\uFF0C**\u7EDD\u5BF9\u4E0D\u8981\u7F16\u9020 id**\u3002
804
+ 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
805
+ - \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
806
+ - \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
807
+ - \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
808
+ - \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
809
 
802
810
  \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
811
  {"tool":"gallery_search","args":{"keyword":"\u767D\u53D1 \u7ACB\u7ED8"}}
@@ -1361,10 +1369,11 @@ var Config = import_koishi.Schema.intersect([
1361
1369
  import_koishi.Schema.object({
1362
1370
  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
1371
  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"),
1372
+ 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"),
1373
+ 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"),
1374
+ 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"),
1375
+ 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")
1376
+ ]).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
1377
  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
1378
  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
1379
  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")
@@ -1937,21 +1946,27 @@ ${echo}` : echo);
1937
1946
  async function runDirectFlow(session, cmdConfig, userInputText, defaultImageUrls) {
1938
1947
  const waitTimeout = cmdConfig.waitTimeout || config.defaultWaitTimeout;
1939
1948
  const maxImages = cmdConfig.maxImages || 0;
1940
- let promptText = cmdConfig.prompt;
1949
+ const basePrompt = cmdConfig.prompt || "";
1950
+ const input = String(userInputText || "").trim();
1951
+ const mode = config.promptOptimize || "passthrough";
1952
+ const takeInput = input && config.appendUserInput !== false;
1953
+ let promptText = mode === "passthrough" ? (takeInput ? input : "") || basePrompt : basePrompt;
1941
1954
  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
- }
1955
+ if (takeInput && mode === "merge") {
1956
+ promptText = mergePrompt(basePrompt, input, true);
1957
+ logInfo2(`\u5DF2\u628A\u7528\u6237\u539F\u8BDD\u8FFD\u52A0\u5230\u6307\u4EE4\u63D0\u793A\u8BCD\u540E: ${input}`);
1958
+ } else if (takeInput && mode === "rewrite") {
1959
+ const optimized = await optimizePromptText(basePrompt, input);
1960
+ if (optimized) {
1961
+ promptText = optimized;
1962
+ logInfo2("\u63D0\u793A\u8BCD\u5DF2\u878D\u5408\u91CD\u5199");
1963
+ } else {
1964
+ ctx.logger.warn("\u63D0\u793A\u8BCD\u878D\u5408\u91CD\u5199\u5931\u8D25\uFF0C\u6539\u7528\u7528\u6237\u7684\u539F\u8BDD");
1965
+ promptText = mergePrompt(basePrompt, input, true);
1966
+ optimizeFailed = true;
1954
1967
  }
1968
+ } else if (takeInput && mode !== "off") {
1969
+ logInfo2(`\u5DF2\u5E76\u5165\u7528\u6237\u539F\u8BDD\uFF08${mode} \u6A21\u5F0F\uFF09: ${input}`);
1955
1970
  }
1956
1971
  if (cmdConfig.custom && !cmdConfig.prompt && !userInputText) {
1957
1972
  const [msgId] = await session.send(session.text("image-prompt.messages.customprompt", [waitTimeout]));
@@ -1963,7 +1978,7 @@ ${echo}` : echo);
1963
1978
  }
1964
1979
  if (!userPrompt) return session.text("image-prompt.messages.needprompt");
1965
1980
  const text = extractTextFromMessage(userPrompt) || String(userPrompt).trim();
1966
- promptText = config.promptOptimize === "rewrite" ? await optimizePromptText("", text) || text : mergePrompt("", text, true);
1981
+ promptText = mode === "rewrite" && await optimizePromptText("", text) || text;
1967
1982
  }
1968
1983
  const images = [...defaultImageUrls || [], ...extractImagesFromSession(session)];
1969
1984
  const remaining = Math.max(0, maxImages - images.length);
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.3",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
package/readme.md CHANGED
@@ -161,11 +161,12 @@ bot:画好啦,按 ref1 的立绘做的~
161
161
 
162
162
  ### 📝 提示词回显
163
163
 
164
- 处理时会把**最终优化后的提示词**一起发出来,方便你确认 AI 到底用了什么(含识图模式追加的「参考图关键特征」)。
164
+ 处理时会把**最终交给绘图模型的提示词**一起发出来,方便你确认它到底用了什么。
165
+ 用默认的「原话直出」时,你看到的基本就是你发的那句话。
165
166
 
166
167
  | 配置项 | 说明 | 默认 |
167
168
  |---|---|---|
168
- | 发送优化后的提示词 | 关闭则不回显 | 开 |
169
+ | 发送最终提示词 | 关闭则不回显 | 开 |
169
170
  | 回显提示词的最大字符数 | 超出截断并标注;**0 = 不截断** | 4000 |
170
171
 
171
172
  - **官方 QQ**(`qq` / `qq-*` / `qqbot`):发 `markdown` **元素**,由适配器走 QQ 的 markdown API,
@@ -224,28 +225,40 @@ bot:画好啦,按 ref1 的立绘做的~
224
225
 
225
226
  这句里的附加需求会**同时**用于两件事:
226
227
 
227
- 1. 交给 AI 选图(按「deepseekQ版」等关键词去参考图组里挑图)
228
- 2. **并入绘图提示词**(追加在系统提示词末尾,用空行分隔)——这样出图才会带上「偷吃白饭被发现的表情」
228
+ 1. 交给 AI 参考(agent 模式下用于决策;该搜什么、要不要问用户、用哪张参考图)
229
+ 2. **原样进入绘图提示词**——这样出图才会带上「偷吃白饭被发现的表情」。
230
+ 默认不再加工:不扩写、不翻译成英文、不拼接指令自带的那串英文提示词
229
231
 
230
232
  > 之前只有 `custom` 类型的指令才合并用户输入,普通指令(手办化、coser化…)只拿它去选图、
231
233
  > 画图时丢掉,所以会出现「图选对了但需求没体现」。现在两者都合并。
232
234
  >
233
235
  > 另外文本取的是**指令参数**,不是整条消息——否则提示词里会混进指令名(「手办化 xxx」→ 只取 xxx)。
234
236
 
235
- ### 🪄 提示词融合方式
237
+ ### 🪄 提示词融合方式(默认:直接说人话,不多加工)
238
+
239
+ > **现在的绘图模型听得懂中文,也有基本的理解力。** 把用户那句话原样交给它就够了 ——
240
+ > 反过来,把它「优化」成一两百字的英文术语堆砌,各要素互相稀释,出图反而更容易走样。
241
+ > 所以 2.0.3 起默认是**做减法**。
236
242
 
237
243
  | 配置项 | 说明 | 默认 |
238
244
  |---|---|---|
239
- | 附加需求如何并入提示词 | `rewrite` 融合重写 / `merge` 直接追加 / `off` 不处理 | `rewrite` |
245
+ | 附加需求如何并入提示词 | `passthrough` 原话直出 / `merge` 追加 / `rewrite` 融合重写 / `off` 不处理 | **`passthrough`** |
240
246
  | 把用户附加需求并入提示词 | 关闭则只用于选图,不改提示词 | 开 |
241
- | 融合重写用的提示词模板 | 占位符 `{prompt}` 原始提示词、`{userInput}` 用户附加需求 | 内置模板 |
247
+ | 融合重写用的提示词模板 | 占位符 `{prompt}` 原始提示词、`{userInput}` 用户附加需求 | 内置模板(已改成「宁短勿长」) |
248
+
249
+ - **`passthrough`(原话直出,推荐)**:用户说了话就用**他的原话**,不再拼指令自带的长提示词、
250
+ 不扩写、不翻译。用户没说话时才退回指令自带的提示词
251
+ - **`merge`(追加)**:把用户的原话贴在指令自带提示词后面,不做改写
252
+ - **`rewrite`(融合重写)**:让模型把需求写进提示词对应位置 —— **会明显变长**,
253
+ 老版本(≤2.0.2)就是默认这个。想要旧行为选它
254
+ - **`off`**:只用指令自身的提示词,忽略用户说的话(agent 模式下仍会把需求交给模型看)
242
255
 
243
- - **rewrite(融合重写,推荐)**:让模型把需求写进提示词**该去的位置**(表情/动作/神态/服装/场景),
244
- 而不是贴在最后。模板要求它**保留原始提示词的全部细节、不得删减**,语言与原文一致
245
- - **merge(直接追加)**:把需求贴在原始提示词末尾,不做改写
246
- - **off**:只用指令自身的提示词(agent 模式下仍会把需求交给模型看)
256
+ `rewrite` 失败时自动退回用户的原话,不会因为优化失败而不出图;失败会在处理消息里提示。
247
257
 
248
- rewrite 失败时自动退回 merge 的结果,不会因为优化失败而不出图;失败会在处理消息里提示
258
+ > **agent 模式下**(默认开启)这条配置项不影响你的输入是否被保留 ——
259
+ > 用户的话会原封不动地出现在给模型的上下文里(`用户这次说的话:…`),
260
+ > 画图的 prompt 由模型自己组织。2.0.3 起提示词里明确要求它
261
+ > **「短、说人话、保持中文、不要替用户脑补细节」**。
249
262
  「(提示词融合失败,已改为追加模式)」,方便排查(多半是模型限流或返回被判空)。
250
263
  用的是「AI 模型接口」那套接口/模型(想换更强的模型可以单独改)。
251
264
 
package/src/index.ts CHANGED
@@ -256,7 +256,8 @@ export function buildAgentTools(): any[] {
256
256
  parameters: {
257
257
  type: 'object',
258
258
  properties: {
259
- prompt: { type: 'string', description: '完整的绘图提示词(英文效果更稳;画面上必须出现的文字要原样写进去)' },
259
+ // 提示词要短:宁可朴素,也不要堆术语写成几百字的「专业」prompt
260
+ prompt: { type: 'string', description: '绘图提示词。说人话、写简短就行,中文即可(绘图模型听得懂中文);不要把用户的话扩写成几百字,也不要堆砌风格/材质/光线术语。画面上必须出现的文字要原样写进去' },
260
261
  references: {
261
262
  type: 'array',
262
263
  items: { type: 'string' },
@@ -967,7 +968,7 @@ interface CommandConfig {
967
968
  showPrompt?: boolean
968
969
  promptMaxLength?: number
969
970
  appendUserInput?: boolean
970
- promptOptimize?: 'off' | 'merge' | 'rewrite'
971
+ promptOptimize?: 'off' | 'passthrough' | 'merge' | 'rewrite'
971
972
  optimizePrompt?: string
972
973
  resultGallery?: ResultGalleryConfig
973
974
  backgroundDrawing?: BackgroundDrawingConfig
@@ -1134,13 +1135,15 @@ interface CandidateImage {
1134
1135
  /** 把用户附加需求融合进原始提示词(而不是贴在最末尾) */
1135
1136
  const DEFAULT_OPTIMIZE_PROMPT = `你是绘图提示词优化助手。下面是「绘图指令的原始提示词」和「用户本次的需求」。
1136
1137
 
1137
- 请输出一份完整、可直接用于绘图模型的提示词。规则:
1138
+ 请输出一份**简短**的、可直接用于绘图模型的提示词。规则:
1138
1139
 
1139
- 1. 原始提示词不为空时:把用户需求自然地融合进原始提示词,并**保留原始提示词中的全部场景、构图、风格、材质、光线等细节**,不得删减或简化。
1140
- 2. 原始提示词为空时(例如自定义指令):根据用户需求**扩写**成完整的绘图提示词,补足画风、构图、镜头、光线、氛围、配色与细节,但不要改变用户的原意。
1141
- 3. 把用户需求写到它该去的位置(表情/动作/神态/服装/场景/互动等),不要原样贴在末尾。
1142
- 4. 语言:原始提示词是英文就输出英文;原始提示词为空时也用英文(英文提示词出图效果通常更稳)。
1143
- 5. 只输出优化后的提示词正文,不要解释、不要标题、不要 Markdown 代码块、不要引号。
1140
+ 1. 原始提示词不为空时:把用户需求自然地融入原始提示词,保留其中的构图与风格,不要删减。
1141
+ 2. 原始提示词为空时:直接整理用户的话作为提示词,**不要替他脑补**画风、镜头、光线、氛围、配色之类的细节 ——
1142
+ 用户没提的就别写。
1143
+ 3. 把用户需求写到它该去的位置,不要原样贴在末尾,也不要另起一段复述一遍。
1144
+ 4. **语言跟着用户走**:用户用中文就输出中文(绘图模型听得懂中文,理解力也够),
1145
+ 不要为了显得专业而翻成英文、不要堆砌术语。
1146
+ 5. **宁短勿长**:只写真正要在画面上出现的东西。提示词越长各要素互相稀释,出图反而更糊。
1144
1147
 
1145
1148
  原始提示词:
1146
1149
  {prompt}
@@ -1184,6 +1187,11 @@ const DEFAULT_AGENT_INSTRUCTIONS = `你是 QQ 群里的绘图助手。用户发
1184
1187
  6. 流程结束后用中文回一句简短的结果说明(不要复述 prompt,不要写小作文,不要再问「还要我做什么」)。
1185
1188
  7. 图片编号:gallery_search 结果里的 id、用户发的图(user1、user2…)、指令默认图(cmd1…)都可以直接写进 draw 的 references。
1186
1189
  只填你确认存在的编号,**绝对不要编造 id**。
1190
+ 8. 【prompt 要短,要说人话】**不要**把用户的话扩写成几百字的「专业」提示词:
1191
+ - 用户用中文提的需求,prompt 就写中文(绘图模型听得懂中文,理解力也够用);
1192
+ - 别为了显得专业就去堆风格 / 材质 / 光线 / 镜头术语,更别刻意翻成英文;
1193
+ - 只保留用户真正说过的内容 + 画面必须有的要素,**不要替他脑补细节**;
1194
+ - 提示词越长,各要素互相稀释,出图反而越走样。一两句话能把画面说清就够了。
1187
1195
 
1188
1196
  如果你所在的接口不支持函数调用,就**只输出一行 JSON** 来调用工具,例如:
1189
1197
  {"tool":"gallery_search","args":{"keyword":"白发 立绘"}}
@@ -1761,10 +1769,11 @@ export const Config: Schema = Schema.intersect([
1761
1769
  Schema.object({
1762
1770
  appendUserInput: Schema.boolean().default(true).description('把用户随指令发的附加需求并入绘图提示词(例如「手办化 xxx 在偷吃白饭被发现的表情」)'),
1763
1771
  promptOptimize: Schema.union([
1764
- Schema.const('rewrite').description('融合重写(推荐):让模型把需求写进提示词对应位置'),
1765
- Schema.const('merge').description('直接追加:把需求贴在原始提示词末尾'),
1766
- Schema.const('off').description('不处理:只用指令自身的提示词')
1767
- ]).default('rewrite').description('用户附加需求如何并入提示词'),
1772
+ Schema.const('passthrough').description('原话直出(推荐):用户说了就用用户的原话,不再拼接指令自带的提示词,也不做扩写'),
1773
+ Schema.const('merge').description('追加:把用户的原话贴在指令自带提示词后面'),
1774
+ Schema.const('rewrite').description('融合重写:让模型把需求写进提示词对应位置(会变长,老版本的默认行为)'),
1775
+ Schema.const('off').description('不处理:只用指令自带的提示词,忽略用户说的话')
1776
+ ]).default('passthrough').description('用户附加需求如何并入提示词。**绘图模型听得懂中文**,一般不需要再优化/翻译'),
1768
1777
  optimizePrompt: Schema.string().role('textarea', { rows: [10, 6] }).default(DEFAULT_OPTIMIZE_PROMPT).description('融合重写用的提示词模板,占位符:{prompt} 原始提示词、{userInput} 用户附加需求'),
1769
1778
  showPrompt: Schema.boolean().default(true).description('发送优化后的提示词(QQ / QQ 频道用代码块包裹,其它平台发纯文本)'),
1770
1779
  promptMaxLength: Schema.number().default(4000).min(0).max(20000).step(100).description('回显提示词的最大字符数,超出部分截断并标注;设为 0 表示不截断(QQ markdown 有长度上限,太长可能被拒收)'),
@@ -2541,22 +2550,30 @@ export function apply(ctx: Context, config: CommandConfig) {
2541
2550
  ) {
2542
2551
  const waitTimeout = cmdConfig.waitTimeout || config.defaultWaitTimeout
2543
2552
  const maxImages = cmdConfig.maxImages || 0
2544
- let promptText = cmdConfig.prompt
2553
+ const basePrompt = cmdConfig.prompt || ''
2554
+ const input = String(userInputText || '').trim()
2555
+ const mode = config.promptOptimize || 'passthrough'
2556
+ const takeInput = input && config.appendUserInput !== false
2557
+ // 绘图模型听得懂中文,默认做的是「减法」:用户说了就用他的原话,
2558
+ // 不拼指令自带的长提示词、不扩写、不翻译。
2559
+ let promptText = mode === 'passthrough' ? ((takeInput ? input : '') || basePrompt) : basePrompt
2545
2560
  let optimizeFailed = false
2546
2561
 
2547
- if (userInputText && config.appendUserInput !== false) {
2548
- promptText = mergePrompt(promptText, userInputText, true)
2549
- logInfo(`已并入用户附加需求: ${userInputText}`)
2550
- if (config.promptOptimize === 'rewrite') {
2551
- const optimized = await optimizePromptText(cmdConfig.prompt, userInputText)
2552
- if (optimized) {
2553
- promptText = optimized
2554
- logInfo('提示词已融合重写')
2555
- } else {
2556
- ctx.logger.warn('提示词融合重写失败,保留追加后的提示词')
2557
- optimizeFailed = true
2558
- }
2562
+ if (takeInput && mode === 'merge') {
2563
+ promptText = mergePrompt(basePrompt, input, true)
2564
+ logInfo(`已把用户原话追加到指令提示词后: ${input}`)
2565
+ } else if (takeInput && mode === 'rewrite') {
2566
+ const optimized = await optimizePromptText(basePrompt, input)
2567
+ if (optimized) {
2568
+ promptText = optimized
2569
+ logInfo('提示词已融合重写')
2570
+ } else {
2571
+ ctx.logger.warn('提示词融合重写失败,改用用户的原话')
2572
+ promptText = mergePrompt(basePrompt, input, true)
2573
+ optimizeFailed = true
2559
2574
  }
2575
+ } else if (takeInput && mode !== 'off') {
2576
+ logInfo(`已并入用户原话(${mode} 模式): ${input}`)
2560
2577
  }
2561
2578
 
2562
2579
  // 自定义指令:本身没提示词、用户也没给文本 -> 要一句
@@ -2570,9 +2587,7 @@ export function apply(ctx: Context, config: CommandConfig) {
2570
2587
  }
2571
2588
  if (!userPrompt) return session.text('image-prompt.messages.needprompt')
2572
2589
  const text = extractTextFromMessage(userPrompt) || String(userPrompt).trim()
2573
- promptText = config.promptOptimize === 'rewrite'
2574
- ? ((await optimizePromptText('', text)) || text)
2575
- : mergePrompt('', text, true)
2590
+ promptText = (mode === 'rewrite' && (await optimizePromptText('', text))) || text
2576
2591
  }
2577
2592
 
2578
2593
  const images: string[] = [...(defaultImageUrls || []), ...extractImagesFromSession(session)]