dominds 1.17.7 → 1.18.2

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.
Files changed (140) hide show
  1. package/dist/dialog-fork.js +11 -5
  2. package/dist/dialog-instance-registry.js +1 -18
  3. package/dist/dialog.d.ts +21 -31
  4. package/dist/dialog.js +207 -56
  5. package/dist/docs/dialog-system.md +3 -2
  6. package/dist/docs/dialog-system.zh.md +3 -2
  7. package/dist/docs/tellask-collab.md +2 -1
  8. package/dist/docs/tellask-collab.zh.md +2 -1
  9. package/dist/llm/defaults.yaml +43 -0
  10. package/dist/llm/gen/anthropic.js +153 -12
  11. package/dist/llm/gen/codex.js +160 -10
  12. package/dist/llm/gen/openai-compatible.js +141 -81
  13. package/dist/llm/gen/openai.js +178 -12
  14. package/dist/llm/gen/tool-result-image-ingest.d.ts +17 -8
  15. package/dist/llm/gen/tool-result-image-ingest.js +127 -27
  16. package/dist/llm/gen.d.ts +13 -0
  17. package/dist/llm/kernel-driver/drive.js +79 -15
  18. package/dist/llm/kernel-driver/flow.js +158 -41
  19. package/dist/llm/kernel-driver/reply-guidance.d.ts +6 -6
  20. package/dist/llm/kernel-driver/reply-guidance.js +169 -2
  21. package/dist/llm/kernel-driver/runtime.d.ts +2 -2
  22. package/dist/llm/kernel-driver/subdialog.js +4 -0
  23. package/dist/llm/kernel-driver/tellask-special.d.ts +2 -0
  24. package/dist/llm/kernel-driver/tellask-special.js +11 -6
  25. package/dist/llm/kernel-driver/types.d.ts +14 -24
  26. package/dist/minds/system-prompt.js +8 -8
  27. package/dist/persistence.d.ts +6 -5
  28. package/dist/persistence.js +198 -39
  29. package/dist/priming.js +98 -3
  30. package/dist/runtime/driver-messages.d.ts +1 -0
  31. package/dist/runtime/driver-messages.js +32 -10
  32. package/dist/runtime/reply-prompt-copy.js +4 -4
  33. package/dist/server/api-routes.js +11 -43
  34. package/dist/server/websocket-handler.js +155 -10
  35. package/dist/tools/builtins.js +10 -4
  36. package/dist/tools/cmd-runner.js +110 -49
  37. package/dist/tools/picture.d.ts +3 -0
  38. package/dist/tools/picture.js +344 -0
  39. package/dist/tools/prompts/control/en/principles.md +4 -2
  40. package/dist/tools/prompts/control/en/scenarios.md +2 -1
  41. package/dist/tools/prompts/control/en/tools.md +6 -6
  42. package/dist/tools/prompts/control/zh/principles.md +4 -2
  43. package/dist/tools/prompts/control/zh/scenarios.md +2 -1
  44. package/dist/tools/prompts/control/zh/tools.md +1 -1
  45. package/dist/tools/prompts/ws_mod.en.md +1 -0
  46. package/dist/tools/prompts/ws_mod.zh.md +1 -0
  47. package/dist/tools/prompts/ws_read/en/tools.md +25 -5
  48. package/dist/tools/prompts/ws_read/zh/tools.md +25 -5
  49. package/package.json +4 -4
  50. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js → _basePickBy-BPJaiZdW.js} +3 -3
  51. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js.map → _basePickBy-BPJaiZdW.js.map} +1 -1
  52. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js → _baseUniq-BEetT15i.js} +2 -2
  53. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js.map → _baseUniq-BEetT15i.js.map} +1 -1
  54. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js → arc-Dm7Zf36f.js} +2 -2
  55. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js.map → arc-Dm7Zf36f.js.map} +1 -1
  56. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js → architectureDiagram-VXUJARFQ-BpTPtkuo.js} +7 -7
  57. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js.map → architectureDiagram-VXUJARFQ-BpTPtkuo.js.map} +1 -1
  58. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js → blockDiagram-VD42YOAC-C8fLN0iu.js} +7 -7
  59. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js.map → blockDiagram-VD42YOAC-C8fLN0iu.js.map} +1 -1
  60. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js → c4Diagram-YG6GDRKO-BpPr62CH.js} +3 -3
  61. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js.map → c4Diagram-YG6GDRKO-BpPr62CH.js.map} +1 -1
  62. package/webapp/dist/assets/{channel-Crbz0zgt.js → channel-EMYoPjW3.js} +2 -2
  63. package/webapp/dist/assets/{channel-Crbz0zgt.js.map → channel-EMYoPjW3.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js → chunk-4BX2VUAB-CefNtjWG.js} +2 -2
  65. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js.map → chunk-4BX2VUAB-CefNtjWG.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js → chunk-55IACEB6-C_X7T43V.js} +2 -2
  67. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js.map → chunk-55IACEB6-C_X7T43V.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js → chunk-B4BG7PRW-BRe3_2oA.js} +5 -5
  69. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js.map → chunk-B4BG7PRW-BRe3_2oA.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js → chunk-DI55MBZ5-CbvrsI_w.js} +4 -4
  71. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js.map → chunk-DI55MBZ5-CbvrsI_w.js.map} +1 -1
  72. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js → chunk-FMBD7UC4-ORmtkrtS.js} +2 -2
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js.map → chunk-FMBD7UC4-ORmtkrtS.js.map} +1 -1
  74. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js → chunk-QN33PNHL-LTAOVhWu.js} +2 -2
  75. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js.map → chunk-QN33PNHL-LTAOVhWu.js.map} +1 -1
  76. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js → chunk-QZHKN3VN-ZoUM_4u5.js} +2 -2
  77. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js.map → chunk-QZHKN3VN-ZoUM_4u5.js.map} +1 -1
  78. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js → chunk-TZMSLE5B-Gao4qrq7.js} +2 -2
  79. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js.map → chunk-TZMSLE5B-Gao4qrq7.js.map} +1 -1
  80. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js → classDiagram-2ON5EDUG-uha1vIGN.js} +6 -6
  81. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js.map → classDiagram-2ON5EDUG-uha1vIGN.js.map} +1 -1
  82. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js → classDiagram-v2-WZHVMYZB-uha1vIGN.js} +6 -6
  83. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js.map → classDiagram-v2-WZHVMYZB-uha1vIGN.js.map} +1 -1
  84. package/webapp/dist/assets/{clone-Cd-48URG.js → clone-_9Ayb1Gp.js} +2 -2
  85. package/webapp/dist/assets/{clone-Cd-48URG.js.map → clone-_9Ayb1Gp.js.map} +1 -1
  86. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js → cose-bilkent-S5V4N54A-C8wDw3NY.js} +2 -2
  87. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js.map → cose-bilkent-S5V4N54A-C8wDw3NY.js.map} +1 -1
  88. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js → dagre-6UL2VRFP-BUSeNot0.js} +7 -7
  89. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js.map → dagre-6UL2VRFP-BUSeNot0.js.map} +1 -1
  90. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js → diagram-PSM6KHXK-CMZAksVC.js} +8 -8
  91. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js.map → diagram-PSM6KHXK-CMZAksVC.js.map} +1 -1
  92. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js → diagram-QEK2KX5R-BQKoRtwy.js} +7 -7
  93. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js.map → diagram-QEK2KX5R-BQKoRtwy.js.map} +1 -1
  94. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js → diagram-S2PKOQOG-DjMG97kd.js} +7 -7
  95. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js.map → diagram-S2PKOQOG-DjMG97kd.js.map} +1 -1
  96. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js → erDiagram-Q2GNP2WA-BujwA137.js} +5 -5
  97. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js.map → erDiagram-Q2GNP2WA-BujwA137.js.map} +1 -1
  98. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js → flowDiagram-NV44I4VS-DgwPjg4y.js} +6 -6
  99. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js.map → flowDiagram-NV44I4VS-DgwPjg4y.js.map} +1 -1
  100. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js → ganttDiagram-JELNMOA3-Db2ykf3E.js} +3 -3
  101. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js.map → ganttDiagram-JELNMOA3-Db2ykf3E.js.map} +1 -1
  102. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js → gitGraphDiagram-V2S2FVAM-D_gSifkv.js} +8 -8
  103. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js.map → gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map} +1 -1
  104. package/webapp/dist/assets/{graph-CuF_sq4r.js → graph-BHjCU5xP.js} +3 -3
  105. package/webapp/dist/assets/{graph-CuF_sq4r.js.map → graph-BHjCU5xP.js.map} +1 -1
  106. package/webapp/dist/assets/{index-DAShQcjb.js → index-DLajsIDJ.js} +1363 -248
  107. package/webapp/dist/assets/{index-DAShQcjb.js.map → index-DLajsIDJ.js.map} +1 -1
  108. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js → infoDiagram-HS3SLOUP-BDba5pKs.js} +6 -6
  109. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js.map → infoDiagram-HS3SLOUP-BDba5pKs.js.map} +1 -1
  110. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js → journeyDiagram-XKPGCS4Q-CmJAbmlm.js} +5 -5
  111. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js.map → journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map} +1 -1
  112. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js → kanban-definition-3W4ZIXB7-DxQeBTDk.js} +3 -3
  113. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js.map → kanban-definition-3W4ZIXB7-DxQeBTDk.js.map} +1 -1
  114. package/webapp/dist/assets/{layout-BvaOu3k2.js → layout-DteV_yE8.js} +5 -5
  115. package/webapp/dist/assets/{layout-BvaOu3k2.js.map → layout-DteV_yE8.js.map} +1 -1
  116. package/webapp/dist/assets/{linear-Cg-CjocS.js → linear-zItbPrND.js} +2 -2
  117. package/webapp/dist/assets/{linear-Cg-CjocS.js.map → linear-zItbPrND.js.map} +1 -1
  118. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js → mindmap-definition-VGOIOE7T-BJXI7UqO.js} +4 -4
  119. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js.map → mindmap-definition-VGOIOE7T-BJXI7UqO.js.map} +1 -1
  120. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js → pieDiagram-ADFJNKIX-BpM-aH2p.js} +8 -8
  121. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js.map → pieDiagram-ADFJNKIX-BpM-aH2p.js.map} +1 -1
  122. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js → quadrantDiagram-AYHSOK5B-NXdIpA15.js} +3 -3
  123. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js.map → quadrantDiagram-AYHSOK5B-NXdIpA15.js.map} +1 -1
  124. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js → requirementDiagram-UZGBJVZJ-D1AICAA0.js} +4 -4
  125. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js.map → requirementDiagram-UZGBJVZJ-D1AICAA0.js.map} +1 -1
  126. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js → sankeyDiagram-TZEHDZUN-WiReDPfo.js} +2 -2
  127. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js.map → sankeyDiagram-TZEHDZUN-WiReDPfo.js.map} +1 -1
  128. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js → sequenceDiagram-WL72ISMW-Cw76oP8t.js} +4 -4
  129. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js.map → sequenceDiagram-WL72ISMW-Cw76oP8t.js.map} +1 -1
  130. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js → stateDiagram-FKZM4ZOC-QjCeRczs.js} +9 -9
  131. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js.map → stateDiagram-FKZM4ZOC-QjCeRczs.js.map} +1 -1
  132. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js} +5 -5
  133. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js.map → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map} +1 -1
  134. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js → timeline-definition-IT6M3QCI-BfyfTY7m.js} +3 -3
  135. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js.map → timeline-definition-IT6M3QCI-BfyfTY7m.js.map} +1 -1
  136. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js → treemap-GDKQZRPO-C5MiL6--.js} +5 -5
  137. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js.map → treemap-GDKQZRPO-C5MiL6--.js.map} +1 -1
  138. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js → xychartDiagram-PRI3JC2R-ybaJrSry.js} +3 -3
  139. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js.map → xychartDiagram-PRI3JC2R-ybaJrSry.js.map} +1 -1
  140. package/webapp/dist/index.html +1 -1
@@ -241,7 +241,8 @@ flowchart TD
241
241
  **支线交付规则(规范)**:
242
242
 
243
243
  - 只有当所有目标完成时,支线对话才可直接正常回复诉请者对话。
244
- - 若任何目标未完成或关键信息缺失,必须先用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续。
244
+ - 若目标尚未完成,不要默认直接 `tellaskBack`;应先按团队规程 / SOP / 职责卡判断能否明确负责人,若能明确且属于执行性处理,直接 `tellask` / `tellaskSessionless` 对应负责人。
245
+ - 只有当必须由上游诉请者补充需求、澄清目标、做业务裁决、确认验收口径、提供缺失输入,或现有规程无法明确判责时,才使用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续。
245
246
  - **FBR 例外**:FBR 支线对话禁止一切 tellask(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`),只能列出缺口与阻塞原因并直接回复。
246
247
 
247
248
  **跨对话传递与标记(强制)**:
@@ -262,7 +263,7 @@ flowchart TD
262
263
 
263
264
  **协议澄清**:
264
265
 
265
- - 需要回问时必须真实调用 `tellaskBack({ tellaskContent: "..." })`;不得发送普通文本中间汇报。
266
+ - 需要回问上游时必须真实调用 `tellaskBack({ tellaskContent: "..." })`;但在此之前应先判断是否已有团队规程可直接判责到其他负责人。不得发送普通文本中间汇报。
266
267
 
267
268
  **示例**:
268
269
 
@@ -120,7 +120,8 @@ That is a workflow break. The model should send the Tellask directly.
120
120
 
121
121
  - If a sideline dialog has completed all goals and can deliver the final result, it MUST reply directly with the response body; do not use `tellaskBack` to send final delivery.
122
122
  - Runtime treats that direct reply as the completion delivery to the tellasker dialog and injects the work-language marker automatically (`【Completed】` in English work language, `【最终完成】` in Chinese work language).
123
- - If any goal is incomplete, the dialog is blocked, or critical context is missing, it MUST issue `tellaskBack({ tellaskContent: "..." })` before proceeding; do not post plain-text intermediate status updates while unfinished.
123
+ - If the work is unfinished, do not default to `tellaskBack`: first use team SOP / role ownership to judge whether a responsible owner is already clear; if yes and the issue is execution work, directly use `tellask` / `tellaskSessionless` for that owner.
124
+ - Use `tellaskBack({ tellaskContent: "..." })` only when the upstream requester must clarify the request, decide a tradeoff, confirm acceptance criteria, provide missing input, or current SOP cannot determine ownership; do not post plain-text intermediate status updates while unfinished.
124
125
  - **FBR exception**: FBR forbids all tellask calls (including `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`); list missing context + reasoning and return.
125
126
  - If a human user inserts a message or asks a follow-up in the sideline: just reply normally; no need to report back to the upstream requester.
126
127
 
@@ -116,7 +116,8 @@
116
116
  **支线交付规则**:
117
117
 
118
118
  - 只有当所有目标完成时,支线对话才可直接正常回复诉请者对话(直接发正文即可,不需要调用 tellaskBack;运行时自动注入完成标记)。
119
- - 若任何目标未完成或关键信息缺失,必须先用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续;不得发送普通文本中间汇报。
119
+ - 若目标尚未完成,不要默认直接 `tellaskBack`:应先按团队规程 / SOP / 职责卡判断能否明确负责人;若能明确且属于执行性处理,直接 `tellask` / `tellaskSessionless` 对应负责人。
120
+ - 只有当必须由上游诉请者补充需求、澄清目标、做业务裁决、确认验收口径、提供缺失输入,或现有规程无法明确判责时,才使用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话;不得发送普通文本中间汇报。
120
121
  - **FBR 例外**:FBR 禁止一切 tellask(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`);只列缺口 + 推理与摘要并直接回复。
121
122
  - 若人类用户在支线对话中插入消息或补问:直接正常回复,不需要向诉请者汇报。
122
123
 
@@ -199,24 +199,28 @@ providers:
199
199
  models:
200
200
  MiniMax-M2.7:
201
201
  name: MiniMax M2.7
202
+ supports_image_input: false
202
203
  context_length: 204800
203
204
  input_length: 204800
204
205
  output_length: 8192
205
206
  context_window: '204K'
206
207
  MiniMax-M2.5:
207
208
  name: MiniMax M2.5
209
+ supports_image_input: false
208
210
  context_length: 204800
209
211
  input_length: 204800
210
212
  output_length: 8192
211
213
  context_window: '204K'
212
214
  MiniMax-M2.1:
213
215
  name: MiniMax M2.1
216
+ supports_image_input: false
214
217
  context_length: 204800
215
218
  input_length: 204800
216
219
  output_length: 8192
217
220
  context_window: '204K'
218
221
  MiniMax-M2:
219
222
  name: MiniMax M2
223
+ supports_image_input: false
220
224
  context_length: 204800
221
225
  input_length: 204800
222
226
  output_length: 8192
@@ -252,24 +256,28 @@ providers:
252
256
  models:
253
257
  MiniMax-M2.7:
254
258
  name: MiniMax M2.7
259
+ supports_image_input: false
255
260
  context_length: 204800
256
261
  input_length: 204800
257
262
  output_length: 8192
258
263
  context_window: '204K'
259
264
  MiniMax-M2.5:
260
265
  name: MiniMax M2.5
266
+ supports_image_input: false
261
267
  context_length: 204800
262
268
  input_length: 204800
263
269
  output_length: 8192
264
270
  context_window: '204K'
265
271
  MiniMax-M2.1:
266
272
  name: MiniMax M2.1
273
+ supports_image_input: false
267
274
  context_length: 204800
268
275
  input_length: 204800
269
276
  output_length: 8192
270
277
  context_window: '204K'
271
278
  MiniMax-M2:
272
279
  name: MiniMax M2 Stable
280
+ supports_image_input: false
273
281
  context_length: 204800
274
282
  input_length: 204800
275
283
  output_length: 8192
@@ -305,24 +313,28 @@ providers:
305
313
  models:
306
314
  MiniMax-M2.7:
307
315
  name: MiniMax M2.7
316
+ supports_image_input: false
308
317
  context_length: 204800
309
318
  input_length: 204800
310
319
  output_length: 8192
311
320
  context_window: '204K'
312
321
  MiniMax-M2.5:
313
322
  name: MiniMax M2.5
323
+ supports_image_input: false
314
324
  context_length: 204800
315
325
  input_length: 204800
316
326
  output_length: 8192
317
327
  context_window: '204K'
318
328
  MiniMax-M2.1:
319
329
  name: MiniMax M2.1
330
+ supports_image_input: false
320
331
  context_length: 204800
321
332
  input_length: 204800
322
333
  output_length: 8192
323
334
  context_window: '204K'
324
335
  MiniMax-M2:
325
336
  name: MiniMax M2
337
+ supports_image_input: false
326
338
  context_length: 204800
327
339
  input_length: 204800
328
340
  output_length: 8192
@@ -358,24 +370,28 @@ providers:
358
370
  models:
359
371
  MiniMax-M2.7:
360
372
  name: MiniMax M2.7
373
+ supports_image_input: false
361
374
  context_length: 204800
362
375
  input_length: 204800
363
376
  output_length: 8192
364
377
  context_window: '204K'
365
378
  MiniMax-M2.5:
366
379
  name: MiniMax M2.5
380
+ supports_image_input: false
367
381
  context_length: 204800
368
382
  input_length: 204800
369
383
  output_length: 8192
370
384
  context_window: '204K'
371
385
  MiniMax-M2.1:
372
386
  name: MiniMax M2.1
387
+ supports_image_input: false
373
388
  context_length: 204800
374
389
  input_length: 204800
375
390
  output_length: 8192
376
391
  context_window: '204K'
377
392
  MiniMax-M2:
378
393
  name: MiniMax M2 Stable
394
+ supports_image_input: false
379
395
  context_length: 204800
380
396
  input_length: 204800
381
397
  output_length: 8192
@@ -390,24 +406,28 @@ providers:
390
406
  models:
391
407
  glm-4.7:
392
408
  name: GLM-4.7
409
+ supports_image_input: false
393
410
  context_length: 200000
394
411
  input_length: 200000
395
412
  output_length: 8192
396
413
  context_window: '200K'
397
414
  glm-4.6:
398
415
  name: GLM-4.6
416
+ supports_image_input: false
399
417
  context_length: 200000
400
418
  input_length: 200000
401
419
  output_length: 8192
402
420
  context_window: '200K'
403
421
  glm-4.5:
404
422
  name: GLM-4.5
423
+ supports_image_input: false
405
424
  context_length: 128000
406
425
  input_length: 128000
407
426
  output_length: 8192
408
427
  context_window: '128K'
409
428
  glm-4.5-air:
410
429
  name: GLM-4.5-Air
430
+ supports_image_input: false
411
431
  context_length: 128000
412
432
  input_length: 128000
413
433
  output_length: 8192
@@ -422,24 +442,28 @@ providers:
422
442
  models:
423
443
  glm-4.7:
424
444
  name: GLM-4.7
445
+ supports_image_input: false
425
446
  context_length: 200000
426
447
  input_length: 200000
427
448
  output_length: 8192
428
449
  context_window: '200K'
429
450
  glm-4.6:
430
451
  name: GLM-4.6
452
+ supports_image_input: false
431
453
  context_length: 200000
432
454
  input_length: 200000
433
455
  output_length: 8192
434
456
  context_window: '200K'
435
457
  glm-4.5:
436
458
  name: GLM-4.5
459
+ supports_image_input: false
437
460
  context_length: 128000
438
461
  input_length: 128000
439
462
  output_length: 8192
440
463
  context_window: '128K'
441
464
  glm-4.5-air:
442
465
  name: GLM-4.5-Air
466
+ supports_image_input: false
443
467
  context_length: 128000
444
468
  input_length: 128000
445
469
  output_length: 8192
@@ -454,6 +478,7 @@ providers:
454
478
  models:
455
479
  doubao-seed-code:
456
480
  name: Doubao Seed Code Preview
481
+ supports_image_input: true
457
482
  context_length: 256000
458
483
  input_length: 256000
459
484
  output_length: 8192
@@ -461,12 +486,14 @@ providers:
461
486
  optimization: 专为Agentic Coding任务优化
462
487
  deepseek-v3.2:
463
488
  name: DeepSeek-V3.2
489
+ supports_image_input: false
464
490
  context_length: 128000
465
491
  input_length: 96000
466
492
  output_length: 32000
467
493
  context_window: '128K'
468
494
  glm-4.7:
469
495
  name: GLM 4.7
496
+ supports_image_input: false
470
497
  context_length: 256000
471
498
  input_length: 256000
472
499
  output_length: 8192
@@ -487,42 +514,49 @@ providers:
487
514
  models:
488
515
  deepseek-v3-2-251201:
489
516
  name: DeepSeek-V3.2
517
+ supports_image_input: false
490
518
  context_length: 128000
491
519
  input_length: 96000
492
520
  output_length: 32000
493
521
  context_window: '128K'
494
522
  doubao-seed-code-preview-251028:
495
523
  name: Doubao Seed Code Preview 251028
524
+ supports_image_input: true
496
525
  context_length: 256000
497
526
  input_length: 256000
498
527
  output_length: 8192
499
528
  context_window: '256K'
500
529
  doubao-seed-1-6-251015:
501
530
  name: Doubao Seed 1.6
531
+ supports_image_input: false
502
532
  context_length: 256000
503
533
  input_length: 256000
504
534
  output_length: 8192
505
535
  context_window: '256K'
506
536
  doubao-seed-1-6-thinking-250715:
507
537
  name: Doubao Seed 1.6 Thinking
538
+ supports_image_input: false
508
539
  context_length: 256000
509
540
  input_length: 256000
510
541
  output_length: 8192
511
542
  context_window: '256K'
512
543
  doubao-seed-1-6-lite-251015:
513
544
  name: Doubao Seed 1.6 Lite
545
+ supports_image_input: false
514
546
  context_length: 32000
515
547
  input_length: 32000
516
548
  output_length: 8192
517
549
  context_window: '32K'
518
550
  kimi-k2-250905:
519
551
  name: Kimi K2
552
+ supports_image_input: false
520
553
  context_length: 200000
521
554
  input_length: 200000
522
555
  output_length: 8192
523
556
  context_window: '200K (约20万汉字)'
524
557
  deepseek-v3-1-terminus:
525
558
  name: DeepSeek V3.1 Terminus
559
+ supports_image_input: false
526
560
  context_length: 131072
527
561
  input_length: 131072
528
562
  output_length: 8192
@@ -621,12 +655,14 @@ providers:
621
655
  models:
622
656
  deepseek-chat:
623
657
  name: DeepSeek-V3.2
658
+ supports_image_input: false
624
659
  context_length: 128000
625
660
  input_length: 128000
626
661
  output_length: 8192
627
662
  context_window: '128K'
628
663
  deepseek-reasoner:
629
664
  name: DeepSeek-R1 (reasoner, V3.2 thinking mode)
665
+ supports_image_input: false
630
666
  context_length: 128000
631
667
  input_length: 128000
632
668
  output_length: 65536
@@ -665,42 +701,49 @@ providers:
665
701
  models:
666
702
  qwen3.5-plus:
667
703
  name: Qwen3.5 Plus
704
+ supports_image_input: true
668
705
  context_length: 1000000
669
706
  input_length: 983616
670
707
  output_length: 65536
671
708
  context_window: '1M'
672
709
  kimi-k2.5:
673
710
  name: Kimi K2.5
711
+ supports_image_input: true
674
712
  context_length: 262144
675
713
  input_length: 258048
676
714
  output_length: 32768
677
715
  context_window: '262K'
678
716
  glm-5:
679
717
  name: GLM-5
718
+ supports_image_input: false
680
719
  context_length: 202752
681
720
  input_length: 202752
682
721
  output_length: 16384
683
722
  context_window: '202K'
684
723
  MiniMax-M2.5:
685
724
  name: MiniMax M2.5
725
+ supports_image_input: false
686
726
  context_length: 204800
687
727
  input_length: 196608
688
728
  output_length: 131072
689
729
  context_window: '204K'
690
730
  qwen3-coder-next:
691
731
  name: Qwen3 Coder Next
732
+ supports_image_input: false
692
733
  context_length: 262144
693
734
  input_length: 204800
694
735
  output_length: 65536
695
736
  context_window: '262K'
696
737
  qwen3-coder-plus:
697
738
  name: Qwen3 Coder Plus
739
+ supports_image_input: false
698
740
  context_length: 1000000
699
741
  input_length: 997952
700
742
  output_length: 65536
701
743
  context_window: '1M'
702
744
  glm-4.7:
703
745
  name: GLM-4.7
746
+ supports_image_input: false
704
747
  context_length: 202752
705
748
  input_length: 169984
706
749
  output_length: 16384
@@ -185,7 +185,7 @@ function parseForcedJsonToolInput(rawJson, fallbackInput, at) {
185
185
  }
186
186
  throw new Error(`Invalid ${at}: ${errorText}; raw=${JSON.stringify(preview)}`);
187
187
  }
188
- async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, requestContext, allowedImageKeys, onToolResultImageIngest) {
188
+ async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest) {
189
189
  const items = chatMsg.contentItems;
190
190
  if (!Array.isArray(items) || items.length === 0) {
191
191
  return {
@@ -195,12 +195,29 @@ async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, request
195
195
  };
196
196
  }
197
197
  const content = [];
198
- for (const item of items) {
198
+ for (const [itemIndex, item] of items.entries()) {
199
199
  if (item.type === 'input_text') {
200
200
  content.push({ type: 'text', text: item.text });
201
201
  continue;
202
202
  }
203
203
  if (item.type === 'input_image') {
204
+ if (!supportsImageInput) {
205
+ if (onToolResultImageIngest) {
206
+ await onToolResultImageIngest((0, tool_result_image_ingest_1.buildToolResultImageIngest)({
207
+ requestContext,
208
+ toolCallId: chatMsg.id,
209
+ toolName: chatMsg.name,
210
+ artifact: item.artifact,
211
+ disposition: 'filtered_model_unsupported',
212
+ providerPathLabel: 'Anthropic Messages path',
213
+ }));
214
+ }
215
+ content.push({
216
+ type: 'text',
217
+ text: `[image not sent: current model does not support image input]`,
218
+ });
219
+ continue;
220
+ }
204
221
  if (!(0, artifacts_1.isVisionImageMimeType)(item.mimeType)) {
205
222
  if (onToolResultImageIngest) {
206
223
  await onToolResultImageIngest((0, tool_result_image_ingest_1.buildToolResultImageIngest)({
@@ -219,7 +236,7 @@ async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, request
219
236
  });
220
237
  continue;
221
238
  }
222
- if (!allowedImageKeys.has((0, tool_result_image_ingest_1.buildToolResultImageBudgetKeyForMsg)(chatMsg, item.artifact))) {
239
+ if (!allowedImageKeys.has((0, tool_result_image_ingest_1.buildImageBudgetKeyForContentItem)({ msg: chatMsg, itemIndex, artifact: item.artifact }))) {
223
240
  if (onToolResultImageIngest) {
224
241
  await onToolResultImageIngest((0, tool_result_image_ingest_1.buildToolResultImageIngest)({
225
242
  requestContext,
@@ -227,7 +244,7 @@ async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, request
227
244
  toolName: chatMsg.name,
228
245
  artifact: item.artifact,
229
246
  disposition: 'filtered_size_limit',
230
- detail: (0, tool_result_image_ingest_1.buildToolResultImageBudgetLimitDetail)({
247
+ detail: (0, tool_result_image_ingest_1.buildImageBudgetLimitDetail)({
231
248
  byteLength: item.byteLength,
232
249
  budgetBytes: tool_result_image_ingest_1.ANTHROPIC_TOOL_RESULT_IMAGE_BUDGET_BYTES,
233
250
  }),
@@ -308,16 +325,135 @@ async function funcResultToAnthropicToolResultBlock(chatMsg, limitChars, request
308
325
  content: limitAnthropicToolOutputBlocks(content, chatMsg, limitChars),
309
326
  };
310
327
  }
311
- async function chatMessageToContentBlocksAsync(chatMsg, limitChars, requestContext, allowedImageKeys, onToolResultImageIngest) {
328
+ async function chatMessageToContentBlocksAsync(chatMsg, limitChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest, onUserImageIngest) {
329
+ if ((chatMsg.type === 'prompting_msg' ||
330
+ chatMsg.type === 'tellask_result_msg' ||
331
+ chatMsg.type === 'tellask_carryover_msg') &&
332
+ Array.isArray(chatMsg.contentItems) &&
333
+ chatMsg.contentItems.length > 0) {
334
+ const content = [
335
+ { type: 'text', text: chatMsg.content },
336
+ ];
337
+ for (const [itemIndex, item] of chatMsg.contentItems.entries()) {
338
+ if (item.type === 'input_text') {
339
+ content.push({ type: 'text', text: item.text });
340
+ continue;
341
+ }
342
+ if (item.type === 'input_image') {
343
+ if (!supportsImageInput) {
344
+ if (onUserImageIngest) {
345
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
346
+ requestContext,
347
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
348
+ artifact: item.artifact,
349
+ disposition: 'filtered_model_unsupported',
350
+ providerPathLabel: 'Anthropic Messages path',
351
+ }));
352
+ }
353
+ content.push({
354
+ type: 'text',
355
+ text: `[image not sent: current model does not support image input]`,
356
+ });
357
+ continue;
358
+ }
359
+ if (!(0, artifacts_1.isVisionImageMimeType)(item.mimeType)) {
360
+ if (onUserImageIngest) {
361
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
362
+ requestContext,
363
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
364
+ artifact: item.artifact,
365
+ disposition: 'filtered_mime_unsupported',
366
+ mimeType: item.mimeType,
367
+ providerPathLabel: 'Anthropic Messages path',
368
+ }));
369
+ }
370
+ content.push({
371
+ type: 'text',
372
+ text: `[image not sent: unsupported mimeType=${item.mimeType}]`,
373
+ });
374
+ continue;
375
+ }
376
+ if (!allowedImageKeys.has((0, tool_result_image_ingest_1.buildImageBudgetKeyForContentItem)({ msg: chatMsg, itemIndex, artifact: item.artifact }))) {
377
+ if (onUserImageIngest) {
378
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
379
+ requestContext,
380
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
381
+ artifact: item.artifact,
382
+ disposition: 'filtered_size_limit',
383
+ detail: (0, tool_result_image_ingest_1.buildImageBudgetLimitDetail)({
384
+ byteLength: item.byteLength,
385
+ budgetBytes: tool_result_image_ingest_1.ANTHROPIC_TOOL_RESULT_IMAGE_BUDGET_BYTES,
386
+ }),
387
+ providerPathLabel: 'Anthropic Messages path',
388
+ }));
389
+ }
390
+ content.push({
391
+ type: 'text',
392
+ text: `[image not sent: request image budget exceeded bytes=${String(item.byteLength)} budget=${String(tool_result_image_ingest_1.ANTHROPIC_TOOL_RESULT_IMAGE_BUDGET_BYTES)}]`,
393
+ });
394
+ continue;
395
+ }
396
+ const bytesResult = await (0, tool_result_image_ingest_1.readToolResultImageBytesSafe)(item.artifact);
397
+ if (bytesResult.kind === 'missing') {
398
+ if (onUserImageIngest) {
399
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
400
+ requestContext,
401
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
402
+ artifact: item.artifact,
403
+ disposition: 'filtered_missing',
404
+ providerPathLabel: 'Anthropic Messages path',
405
+ }));
406
+ }
407
+ content.push({ type: 'text', text: `[image missing: ${item.artifact.relPath}]` });
408
+ continue;
409
+ }
410
+ if (bytesResult.kind === 'read_failed') {
411
+ if (onUserImageIngest) {
412
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
413
+ requestContext,
414
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
415
+ artifact: item.artifact,
416
+ disposition: 'filtered_read_failed',
417
+ detail: bytesResult.detail,
418
+ providerPathLabel: 'Anthropic Messages path',
419
+ }));
420
+ }
421
+ content.push({ type: 'text', text: `[image unreadable: ${item.artifact.relPath}]` });
422
+ continue;
423
+ }
424
+ if (onUserImageIngest) {
425
+ await onUserImageIngest((0, tool_result_image_ingest_1.buildUserImageIngest)({
426
+ requestContext,
427
+ ...(chatMsg.type === 'prompting_msg' ? { msgId: chatMsg.msgId } : {}),
428
+ artifact: item.artifact,
429
+ disposition: 'fed_native',
430
+ providerPathLabel: 'Anthropic Messages path',
431
+ }));
432
+ }
433
+ content.push({
434
+ type: 'image',
435
+ source: {
436
+ type: 'base64',
437
+ media_type: item.mimeType,
438
+ data: bytesResult.bytes.toString('base64'),
439
+ },
440
+ });
441
+ continue;
442
+ }
443
+ const _exhaustive = item;
444
+ throw new Error(`Unsupported user content item: ${String(_exhaustive)}`);
445
+ }
446
+ return content;
447
+ }
312
448
  if (chatMsg.type !== 'func_result_msg') {
313
449
  return chatMessageToContentBlocks(chatMsg);
314
450
  }
315
451
  return [
316
- await funcResultToAnthropicToolResultBlock(chatMsg, limitChars, requestContext, allowedImageKeys, onToolResultImageIngest),
452
+ await funcResultToAnthropicToolResultBlock(chatMsg, limitChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest),
317
453
  ];
318
454
  }
319
- async function chatMessageToAnthropicAsync(chatMsg, limitChars, requestContext, allowedImageKeys, onToolResultImageIngest) {
320
- const contentBlocks = await chatMessageToContentBlocksAsync(chatMsg, limitChars, requestContext, allowedImageKeys, onToolResultImageIngest);
455
+ async function chatMessageToAnthropicAsync(chatMsg, limitChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest, onUserImageIngest) {
456
+ const contentBlocks = await chatMessageToContentBlocksAsync(chatMsg, limitChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest, onUserImageIngest);
321
457
  if (contentBlocks.length === 0) {
322
458
  throw new Error(`No content blocks generated for message: ${JSON.stringify(chatMsg)}`);
323
459
  }
@@ -330,7 +466,7 @@ async function chatMessageToAnthropicAsync(chatMsg, limitChars, requestContext,
330
466
  content: contentBlocks.length === 1 ? contentBlocks : contentBlocks,
331
467
  };
332
468
  }
333
- async function buildAnthropicRequestMessages(context, requestContext, providerConfig, onToolResultImageIngest) {
469
+ async function buildAnthropicRequestMessages(context, requestContext, providerConfig, onToolResultImageIngest, onUserImageIngest) {
334
470
  // We keep the async path for func_result_msg because it may contain image artifacts.
335
471
  const normalized = (0, tool_call_context_1.normalizeToolCallPairs)(context);
336
472
  const violation = (0, tool_call_context_1.findFirstToolCallAdjacencyViolation)(normalized);
@@ -346,9 +482,12 @@ async function buildAnthropicRequestMessages(context, requestContext, providerCo
346
482
  }
347
483
  const messages = [];
348
484
  const toolResultMaxChars = (0, tool_output_limit_1.resolveProviderToolResultMaxChars)(providerConfig);
349
- const allowedImageKeys = (0, tool_result_image_ingest_1.selectLatestToolResultImagesWithinBudget)(normalized, tool_result_image_ingest_1.ANTHROPIC_TOOL_RESULT_IMAGE_BUDGET_BYTES);
485
+ const allowedImageKeys = (0, tool_result_image_ingest_1.selectLatestImagesWithinBudget)(normalized, tool_result_image_ingest_1.ANTHROPIC_TOOL_RESULT_IMAGE_BUDGET_BYTES);
486
+ const supportsImageInput = (0, tool_result_image_ingest_1.resolveModelImageInputSupport)(requestContext.modelKey === undefined
487
+ ? undefined
488
+ : providerConfig?.models[requestContext.modelKey], true);
350
489
  for (const msg of normalized) {
351
- messages.push(await chatMessageToAnthropicAsync(msg, toolResultMaxChars, requestContext, allowedImageKeys, onToolResultImageIngest));
490
+ messages.push(await chatMessageToAnthropicAsync(msg, toolResultMaxChars, requestContext, allowedImageKeys, supportsImageInput, onToolResultImageIngest, onUserImageIngest));
352
491
  }
353
492
  return assembleAnthropicTurns(messages);
354
493
  }
@@ -919,7 +1058,7 @@ class AnthropicGen {
919
1058
  if (!apiKey)
920
1059
  throw new Error(`Missing API key env var ${providerConfig.apiKeyEnvVar}`);
921
1060
  const client = new sdk_1.Anthropic({ apiKey, baseURL: providerConfig.baseUrl });
922
- const requestMessages = await buildAnthropicRequestMessages(context, requestContext, providerConfig, receiver.toolResultImageIngest);
1061
+ const requestMessages = await buildAnthropicRequestMessages(context, requestContext, providerConfig, receiver.toolResultImageIngest, receiver.userImageIngest);
923
1062
  const anthropicParams = agent.model_params?.anthropic || {};
924
1063
  const forceJsonResponse = resolveAnthropicJsonResponseEnabled(agent);
925
1064
  const maxTokens = agent.model_params?.max_tokens;
@@ -972,6 +1111,8 @@ class AnthropicGen {
972
1111
  const outputs = [];
973
1112
  const requestMessages = await buildAnthropicRequestMessages(context, requestContext, providerConfig, async (ingest) => {
974
1113
  outputs.push({ kind: 'tool_result_image_ingest', ingest });
1114
+ }, async (ingest) => {
1115
+ outputs.push({ kind: 'user_image_ingest', ingest });
975
1116
  });
976
1117
  const anthropicParams = agent.model_params?.anthropic || {};
977
1118
  const forceJsonResponse = resolveAnthropicJsonResponseEnabled(agent);