@midscene/core 1.13.4-beta-20260928072823.0 → 1.14.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.
Files changed (300) hide show
  1. package/dist/es/agent/task-builder.mjs +1 -1
  2. package/dist/es/agent/task-builder.mjs.map +1 -1
  3. package/dist/es/agent/tasks.mjs +4 -4
  4. package/dist/es/agent/tasks.mjs.map +1 -1
  5. package/dist/es/agent/utils.mjs +1 -1
  6. package/dist/es/ai-model/connectivity/run-connectivity-test.mjs +2 -5
  7. package/dist/es/ai-model/connectivity/run-connectivity-test.mjs.map +1 -1
  8. package/dist/es/ai-model/model-adapter/chat-completion.mjs +8 -11
  9. package/dist/es/ai-model/model-adapter/chat-completion.mjs.map +1 -1
  10. package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs +7 -8
  11. package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs.map +1 -1
  12. package/dist/es/ai-model/model-adapter/locate.mjs +3 -7
  13. package/dist/es/ai-model/model-adapter/locate.mjs.map +1 -1
  14. package/dist/es/ai-model/model-adapter/resolve.mjs +11 -3
  15. package/dist/es/ai-model/model-adapter/resolve.mjs.map +1 -1
  16. package/dist/es/ai-model/model-adapter/responses.mjs +38 -0
  17. package/dist/es/ai-model/model-adapter/responses.mjs.map +1 -0
  18. package/dist/es/ai-model/model-adapter/temperature-with-semantic-retry.mjs +7 -0
  19. package/dist/es/ai-model/model-adapter/temperature-with-semantic-retry.mjs.map +1 -0
  20. package/dist/es/ai-model/models/gpt.mjs +73 -9
  21. package/dist/es/ai-model/models/gpt.mjs.map +1 -1
  22. package/dist/es/ai-model/models/qwen.mjs +8 -2
  23. package/dist/es/ai-model/models/qwen.mjs.map +1 -1
  24. package/dist/es/ai-model/models/registry.mjs +2 -2
  25. package/dist/es/ai-model/models/registry.mjs.map +1 -1
  26. package/dist/es/ai-model/service-caller/call-ai.mjs +22 -13
  27. package/dist/es/ai-model/service-caller/call-ai.mjs.map +1 -1
  28. package/dist/es/ai-model/service-caller/codex/call-codex.mjs +10 -8
  29. package/dist/es/ai-model/service-caller/codex/call-codex.mjs.map +1 -1
  30. package/dist/es/ai-model/service-caller/codex/codex-app-server.mjs +29 -28
  31. package/dist/es/ai-model/service-caller/codex/codex-app-server.mjs.map +1 -1
  32. package/dist/es/ai-model/service-caller/index.mjs +1 -2
  33. package/dist/es/ai-model/service-caller/model-call.mjs +4 -4
  34. package/dist/es/ai-model/service-caller/model-call.mjs.map +1 -1
  35. package/dist/es/ai-model/service-caller/openai/call-openai.mjs +18 -8
  36. package/dist/es/ai-model/service-caller/openai/call-openai.mjs.map +1 -1
  37. package/dist/es/ai-model/service-caller/openai/chat-completion/chat-completion.mjs +11 -7
  38. package/dist/es/ai-model/service-caller/openai/chat-completion/chat-completion.mjs.map +1 -1
  39. package/dist/es/ai-model/service-caller/openai/chat-completion/non-stream.mjs +9 -9
  40. package/dist/es/ai-model/service-caller/openai/chat-completion/non-stream.mjs.map +1 -1
  41. package/dist/es/ai-model/service-caller/openai/chat-completion/stream.mjs +4 -8
  42. package/dist/es/ai-model/service-caller/openai/chat-completion/stream.mjs.map +1 -1
  43. package/dist/es/ai-model/service-caller/openai/chat-completion/utils.mjs +28 -1
  44. package/dist/es/ai-model/service-caller/openai/chat-completion/utils.mjs.map +1 -1
  45. package/dist/es/ai-model/service-caller/openai/openai-client.mjs +3 -3
  46. package/dist/es/ai-model/service-caller/openai/openai-client.mjs.map +1 -1
  47. package/dist/es/ai-model/service-caller/openai/responses/non-stream.mjs +21 -0
  48. package/dist/es/ai-model/service-caller/openai/responses/non-stream.mjs.map +1 -0
  49. package/dist/es/ai-model/service-caller/openai/responses/responses.mjs +57 -0
  50. package/dist/es/ai-model/service-caller/openai/responses/responses.mjs.map +1 -0
  51. package/dist/es/ai-model/service-caller/openai/responses/stream.mjs +56 -0
  52. package/dist/es/ai-model/service-caller/openai/responses/stream.mjs.map +1 -0
  53. package/dist/es/ai-model/service-caller/openai/responses/types.mjs +0 -0
  54. package/dist/es/ai-model/service-caller/openai/responses/utils.mjs +72 -0
  55. package/dist/es/ai-model/service-caller/openai/responses/utils.mjs.map +1 -0
  56. package/dist/es/ai-model/service-caller/semantic-retry.mjs.map +1 -1
  57. package/dist/es/ai-model/service-caller/utils.mjs +6 -25
  58. package/dist/es/ai-model/service-caller/utils.mjs.map +1 -1
  59. package/dist/es/ai-model/shared/model-locate-result/factory.mjs +4 -1
  60. package/dist/es/ai-model/shared/model-locate-result/factory.mjs.map +1 -1
  61. package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs +3 -2
  62. package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs.map +1 -1
  63. package/dist/es/ai-model/shared/model-locate-result/result-field.mjs +13 -0
  64. package/dist/es/ai-model/shared/model-locate-result/result-field.mjs.map +1 -0
  65. package/dist/es/ai-model/shared/model-locate-result/types.mjs.map +1 -1
  66. package/dist/es/ai-model/shared/multimodal-prompt.mjs +5 -8
  67. package/dist/es/ai-model/shared/multimodal-prompt.mjs.map +1 -1
  68. package/dist/es/ai-model/workflows/grounding/locate.mjs +6 -6
  69. package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -1
  70. package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs +5 -5
  71. package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs.map +1 -1
  72. package/dist/es/ai-model/workflows/grounding/section-locate.mjs +5 -5
  73. package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -1
  74. package/dist/es/ai-model/workflows/grounding/utils.mjs +4 -7
  75. package/dist/es/ai-model/workflows/grounding/utils.mjs.map +1 -1
  76. package/dist/es/ai-model/workflows/insight/extraction.mjs +9 -15
  77. package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -1
  78. package/dist/es/ai-model/workflows/insight/order-sensitive.mjs.map +1 -1
  79. package/dist/es/ai-model/workflows/planning/conversation-history.mjs +17 -9
  80. package/dist/es/ai-model/workflows/planning/conversation-history.mjs.map +1 -1
  81. package/dist/es/ai-model/workflows/planning/custom-planning.mjs +12 -14
  82. package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -1
  83. package/dist/es/ai-model/workflows/planning/locate-normalization.mjs +5 -9
  84. package/dist/es/ai-model/workflows/planning/locate-normalization.mjs.map +1 -1
  85. package/dist/es/ai-model/workflows/planning/standard-planning.mjs +25 -28
  86. package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -1
  87. package/dist/es/ai-model/workflows/recorder-generation/common.mjs +2 -4
  88. package/dist/es/ai-model/workflows/recorder-generation/common.mjs.map +1 -1
  89. package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs +3 -5
  90. package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs.map +1 -1
  91. package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs +2 -4
  92. package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs.map +1 -1
  93. package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs.map +1 -1
  94. package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs +2 -4
  95. package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs.map +1 -1
  96. package/dist/es/report-html-template.mjs +1 -1
  97. package/dist/es/service/index.mjs +17 -26
  98. package/dist/es/service/index.mjs.map +1 -1
  99. package/dist/es/types.mjs.map +1 -1
  100. package/dist/es/utils.mjs +1 -1
  101. package/dist/lib/agent/task-builder.js +1 -1
  102. package/dist/lib/agent/task-builder.js.map +1 -1
  103. package/dist/lib/agent/tasks.js +4 -4
  104. package/dist/lib/agent/tasks.js.map +1 -1
  105. package/dist/lib/agent/utils.js +1 -1
  106. package/dist/lib/ai-model/connectivity/run-connectivity-test.js +2 -5
  107. package/dist/lib/ai-model/connectivity/run-connectivity-test.js.map +1 -1
  108. package/dist/lib/ai-model/model-adapter/chat-completion.js +8 -11
  109. package/dist/lib/ai-model/model-adapter/chat-completion.js.map +1 -1
  110. package/dist/lib/ai-model/model-adapter/default-locate-protocol.js +7 -8
  111. package/dist/lib/ai-model/model-adapter/default-locate-protocol.js.map +1 -1
  112. package/dist/lib/ai-model/model-adapter/locate.js +3 -7
  113. package/dist/lib/ai-model/model-adapter/locate.js.map +1 -1
  114. package/dist/lib/ai-model/model-adapter/resolve.js +11 -3
  115. package/dist/lib/ai-model/model-adapter/resolve.js.map +1 -1
  116. package/dist/lib/ai-model/model-adapter/responses.js +75 -0
  117. package/dist/lib/ai-model/model-adapter/responses.js.map +1 -0
  118. package/dist/lib/ai-model/model-adapter/temperature-with-semantic-retry.js +41 -0
  119. package/dist/lib/ai-model/model-adapter/temperature-with-semantic-retry.js.map +1 -0
  120. package/dist/lib/ai-model/models/gpt.js +73 -9
  121. package/dist/lib/ai-model/models/gpt.js.map +1 -1
  122. package/dist/lib/ai-model/models/qwen.js +8 -2
  123. package/dist/lib/ai-model/models/qwen.js.map +1 -1
  124. package/dist/lib/ai-model/models/registry.js +2 -2
  125. package/dist/lib/ai-model/models/registry.js.map +1 -1
  126. package/dist/lib/ai-model/service-caller/call-ai.js +22 -13
  127. package/dist/lib/ai-model/service-caller/call-ai.js.map +1 -1
  128. package/dist/lib/ai-model/service-caller/codex/call-codex.js +10 -8
  129. package/dist/lib/ai-model/service-caller/codex/call-codex.js.map +1 -1
  130. package/dist/lib/ai-model/service-caller/codex/codex-app-server.js +29 -28
  131. package/dist/lib/ai-model/service-caller/codex/codex-app-server.js.map +1 -1
  132. package/dist/lib/ai-model/service-caller/index.js +0 -4
  133. package/dist/lib/ai-model/service-caller/model-call.js +4 -4
  134. package/dist/lib/ai-model/service-caller/model-call.js.map +1 -1
  135. package/dist/lib/ai-model/service-caller/openai/call-openai.js +17 -7
  136. package/dist/lib/ai-model/service-caller/openai/call-openai.js.map +1 -1
  137. package/dist/lib/ai-model/service-caller/openai/chat-completion/chat-completion.js +10 -6
  138. package/dist/lib/ai-model/service-caller/openai/chat-completion/chat-completion.js.map +1 -1
  139. package/dist/lib/ai-model/service-caller/openai/chat-completion/non-stream.js +9 -9
  140. package/dist/lib/ai-model/service-caller/openai/chat-completion/non-stream.js.map +1 -1
  141. package/dist/lib/ai-model/service-caller/openai/chat-completion/stream.js +4 -8
  142. package/dist/lib/ai-model/service-caller/openai/chat-completion/stream.js.map +1 -1
  143. package/dist/lib/ai-model/service-caller/openai/chat-completion/utils.js +32 -2
  144. package/dist/lib/ai-model/service-caller/openai/chat-completion/utils.js.map +1 -1
  145. package/dist/lib/ai-model/service-caller/openai/openai-client.js +5 -5
  146. package/dist/lib/ai-model/service-caller/openai/openai-client.js.map +1 -1
  147. package/dist/lib/ai-model/service-caller/openai/responses/non-stream.js +55 -0
  148. package/dist/lib/ai-model/service-caller/openai/responses/non-stream.js.map +1 -0
  149. package/dist/lib/ai-model/service-caller/openai/responses/responses.js +94 -0
  150. package/dist/lib/ai-model/service-caller/openai/responses/responses.js.map +1 -0
  151. package/dist/lib/ai-model/service-caller/openai/responses/stream.js +90 -0
  152. package/dist/lib/ai-model/service-caller/openai/responses/stream.js.map +1 -0
  153. package/dist/lib/ai-model/service-caller/openai/responses/types.js +20 -0
  154. package/dist/lib/ai-model/service-caller/openai/responses/types.js.map +1 -0
  155. package/dist/lib/ai-model/service-caller/openai/responses/utils.js +112 -0
  156. package/dist/lib/ai-model/service-caller/openai/responses/utils.js.map +1 -0
  157. package/dist/lib/ai-model/service-caller/semantic-retry.js.map +1 -1
  158. package/dist/lib/ai-model/service-caller/utils.js +5 -27
  159. package/dist/lib/ai-model/service-caller/utils.js.map +1 -1
  160. package/dist/lib/ai-model/shared/model-locate-result/factory.js +4 -1
  161. package/dist/lib/ai-model/shared/model-locate-result/factory.js.map +1 -1
  162. package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js +3 -2
  163. package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js.map +1 -1
  164. package/dist/lib/ai-model/shared/model-locate-result/result-field.js +50 -0
  165. package/dist/lib/ai-model/shared/model-locate-result/result-field.js.map +1 -0
  166. package/dist/lib/ai-model/shared/model-locate-result/types.js.map +1 -1
  167. package/dist/lib/ai-model/shared/multimodal-prompt.js +11 -14
  168. package/dist/lib/ai-model/shared/multimodal-prompt.js.map +1 -1
  169. package/dist/lib/ai-model/workflows/grounding/locate.js +6 -6
  170. package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -1
  171. package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js +5 -5
  172. package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js.map +1 -1
  173. package/dist/lib/ai-model/workflows/grounding/section-locate.js +5 -5
  174. package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -1
  175. package/dist/lib/ai-model/workflows/grounding/utils.js +3 -6
  176. package/dist/lib/ai-model/workflows/grounding/utils.js.map +1 -1
  177. package/dist/lib/ai-model/workflows/insight/extraction.js +8 -14
  178. package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -1
  179. package/dist/lib/ai-model/workflows/insight/order-sensitive.js.map +1 -1
  180. package/dist/lib/ai-model/workflows/planning/conversation-history.js +17 -9
  181. package/dist/lib/ai-model/workflows/planning/conversation-history.js.map +1 -1
  182. package/dist/lib/ai-model/workflows/planning/custom-planning.js +11 -13
  183. package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -1
  184. package/dist/lib/ai-model/workflows/planning/locate-normalization.js +5 -9
  185. package/dist/lib/ai-model/workflows/planning/locate-normalization.js.map +1 -1
  186. package/dist/lib/ai-model/workflows/planning/standard-planning.js +24 -27
  187. package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -1
  188. package/dist/lib/ai-model/workflows/recorder-generation/common.js +2 -4
  189. package/dist/lib/ai-model/workflows/recorder-generation/common.js.map +1 -1
  190. package/dist/lib/ai-model/workflows/recorder-generation/markdown.js +3 -5
  191. package/dist/lib/ai-model/workflows/recorder-generation/markdown.js.map +1 -1
  192. package/dist/lib/ai-model/workflows/recorder-generation/metadata.js +2 -4
  193. package/dist/lib/ai-model/workflows/recorder-generation/metadata.js.map +1 -1
  194. package/dist/lib/ai-model/workflows/recorder-generation/playwright.js.map +1 -1
  195. package/dist/lib/ai-model/workflows/recorder-generation/yaml.js +2 -4
  196. package/dist/lib/ai-model/workflows/recorder-generation/yaml.js.map +1 -1
  197. package/dist/lib/report-html-template.js +1 -1
  198. package/dist/lib/service/index.js +17 -26
  199. package/dist/lib/service/index.js.map +1 -1
  200. package/dist/lib/types.js.map +1 -1
  201. package/dist/lib/utils.js +1 -1
  202. package/dist/types/ai-model/connectivity/run-connectivity-test.d.ts.map +1 -1
  203. package/dist/types/ai-model/index.d.ts +1 -1
  204. package/dist/types/ai-model/index.d.ts.map +1 -1
  205. package/dist/types/ai-model/model-adapter/chat-completion.d.ts.map +1 -1
  206. package/dist/types/ai-model/model-adapter/default-locate-protocol.d.ts +2 -6
  207. package/dist/types/ai-model/model-adapter/default-locate-protocol.d.ts.map +1 -1
  208. package/dist/types/ai-model/model-adapter/locate.d.ts +1 -1
  209. package/dist/types/ai-model/model-adapter/locate.d.ts.map +1 -1
  210. package/dist/types/ai-model/model-adapter/resolve.d.ts +4 -2
  211. package/dist/types/ai-model/model-adapter/resolve.d.ts.map +1 -1
  212. package/dist/types/ai-model/model-adapter/responses.d.ts +4 -0
  213. package/dist/types/ai-model/model-adapter/responses.d.ts.map +1 -0
  214. package/dist/types/ai-model/model-adapter/temperature-with-semantic-retry.d.ts +6 -0
  215. package/dist/types/ai-model/model-adapter/temperature-with-semantic-retry.d.ts.map +1 -0
  216. package/dist/types/ai-model/model-adapter/types.d.ts +42 -20
  217. package/dist/types/ai-model/model-adapter/types.d.ts.map +1 -1
  218. package/dist/types/ai-model/models/gpt.d.ts +15 -3
  219. package/dist/types/ai-model/models/gpt.d.ts.map +1 -1
  220. package/dist/types/ai-model/models/qwen.d.ts +2 -1
  221. package/dist/types/ai-model/models/qwen.d.ts.map +1 -1
  222. package/dist/types/ai-model/models/registry.d.ts +16 -3
  223. package/dist/types/ai-model/models/registry.d.ts.map +1 -1
  224. package/dist/types/ai-model/service-caller/call-ai.d.ts +2 -2
  225. package/dist/types/ai-model/service-caller/call-ai.d.ts.map +1 -1
  226. package/dist/types/ai-model/service-caller/codex/call-codex.d.ts +4 -2
  227. package/dist/types/ai-model/service-caller/codex/call-codex.d.ts.map +1 -1
  228. package/dist/types/ai-model/service-caller/codex/codex-app-server.d.ts +5 -4
  229. package/dist/types/ai-model/service-caller/codex/codex-app-server.d.ts.map +1 -1
  230. package/dist/types/ai-model/service-caller/index.d.ts +0 -1
  231. package/dist/types/ai-model/service-caller/index.d.ts.map +1 -1
  232. package/dist/types/ai-model/service-caller/model-call.d.ts +6 -6
  233. package/dist/types/ai-model/service-caller/model-call.d.ts.map +1 -1
  234. package/dist/types/ai-model/service-caller/openai/call-openai.d.ts +9 -1
  235. package/dist/types/ai-model/service-caller/openai/call-openai.d.ts.map +1 -1
  236. package/dist/types/ai-model/service-caller/openai/chat-completion/chat-completion.d.ts +3 -4
  237. package/dist/types/ai-model/service-caller/openai/chat-completion/chat-completion.d.ts.map +1 -1
  238. package/dist/types/ai-model/service-caller/openai/chat-completion/non-stream.d.ts +1 -1
  239. package/dist/types/ai-model/service-caller/openai/chat-completion/non-stream.d.ts.map +1 -1
  240. package/dist/types/ai-model/service-caller/openai/chat-completion/stream.d.ts +1 -1
  241. package/dist/types/ai-model/service-caller/openai/chat-completion/stream.d.ts.map +1 -1
  242. package/dist/types/ai-model/service-caller/openai/chat-completion/types.d.ts +5 -5
  243. package/dist/types/ai-model/service-caller/openai/chat-completion/types.d.ts.map +1 -1
  244. package/dist/types/ai-model/service-caller/openai/chat-completion/utils.d.ts +5 -0
  245. package/dist/types/ai-model/service-caller/openai/chat-completion/utils.d.ts.map +1 -1
  246. package/dist/types/ai-model/service-caller/openai/openai-client.d.ts +2 -2
  247. package/dist/types/ai-model/service-caller/openai/openai-client.d.ts.map +1 -1
  248. package/dist/types/ai-model/service-caller/openai/responses/non-stream.d.ts +4 -0
  249. package/dist/types/ai-model/service-caller/openai/responses/non-stream.d.ts.map +1 -0
  250. package/dist/types/ai-model/service-caller/openai/responses/responses.d.ts +8 -0
  251. package/dist/types/ai-model/service-caller/openai/responses/responses.d.ts.map +1 -0
  252. package/dist/types/ai-model/service-caller/openai/responses/stream.d.ts +4 -0
  253. package/dist/types/ai-model/service-caller/openai/responses/stream.d.ts.map +1 -0
  254. package/dist/types/ai-model/service-caller/openai/responses/types.d.ts +8 -0
  255. package/dist/types/ai-model/service-caller/openai/responses/types.d.ts.map +1 -0
  256. package/dist/types/ai-model/service-caller/openai/responses/utils.d.ts +8 -0
  257. package/dist/types/ai-model/service-caller/openai/responses/utils.d.ts.map +1 -0
  258. package/dist/types/ai-model/service-caller/semantic-retry.d.ts +2 -2
  259. package/dist/types/ai-model/service-caller/semantic-retry.d.ts.map +1 -1
  260. package/dist/types/ai-model/service-caller/types.d.ts +35 -5
  261. package/dist/types/ai-model/service-caller/types.d.ts.map +1 -1
  262. package/dist/types/ai-model/service-caller/utils.d.ts +5 -9
  263. package/dist/types/ai-model/service-caller/utils.d.ts.map +1 -1
  264. package/dist/types/ai-model/shared/model-locate-result/factory.d.ts.map +1 -1
  265. package/dist/types/ai-model/shared/model-locate-result/prompt-spec.d.ts +4 -1
  266. package/dist/types/ai-model/shared/model-locate-result/prompt-spec.d.ts.map +1 -1
  267. package/dist/types/ai-model/shared/model-locate-result/result-field.d.ts +5 -0
  268. package/dist/types/ai-model/shared/model-locate-result/result-field.d.ts.map +1 -0
  269. package/dist/types/ai-model/shared/model-locate-result/types.d.ts +6 -0
  270. package/dist/types/ai-model/shared/model-locate-result/types.d.ts.map +1 -1
  271. package/dist/types/ai-model/shared/multimodal-prompt.d.ts +3 -3
  272. package/dist/types/ai-model/shared/multimodal-prompt.d.ts.map +1 -1
  273. package/dist/types/ai-model/workflows/grounding/planning-action-locate.d.ts.map +1 -1
  274. package/dist/types/ai-model/workflows/grounding/section-locate.d.ts +2 -1
  275. package/dist/types/ai-model/workflows/grounding/section-locate.d.ts.map +1 -1
  276. package/dist/types/ai-model/workflows/grounding/types.d.ts +3 -2
  277. package/dist/types/ai-model/workflows/grounding/types.d.ts.map +1 -1
  278. package/dist/types/ai-model/workflows/grounding/utils.d.ts +3 -3
  279. package/dist/types/ai-model/workflows/grounding/utils.d.ts.map +1 -1
  280. package/dist/types/ai-model/workflows/insight/extraction.d.ts +1 -1
  281. package/dist/types/ai-model/workflows/insight/extraction.d.ts.map +1 -1
  282. package/dist/types/ai-model/workflows/insight/order-sensitive.d.ts.map +1 -1
  283. package/dist/types/ai-model/workflows/planning/conversation-history.d.ts +10 -8
  284. package/dist/types/ai-model/workflows/planning/conversation-history.d.ts.map +1 -1
  285. package/dist/types/ai-model/workflows/planning/custom-planning.d.ts +2 -2
  286. package/dist/types/ai-model/workflows/planning/custom-planning.d.ts.map +1 -1
  287. package/dist/types/ai-model/workflows/planning/locate-normalization.d.ts +1 -2
  288. package/dist/types/ai-model/workflows/planning/locate-normalization.d.ts.map +1 -1
  289. package/dist/types/ai-model/workflows/planning/standard-planning.d.ts.map +1 -1
  290. package/dist/types/ai-model/workflows/recorder-generation/common.d.ts +2 -1
  291. package/dist/types/ai-model/workflows/recorder-generation/common.d.ts.map +1 -1
  292. package/dist/types/ai-model/workflows/recorder-generation/markdown.d.ts +2 -2
  293. package/dist/types/ai-model/workflows/recorder-generation/markdown.d.ts.map +1 -1
  294. package/dist/types/ai-model/workflows/recorder-generation/metadata.d.ts.map +1 -1
  295. package/dist/types/ai-model/workflows/recorder-generation/playwright.d.ts.map +1 -1
  296. package/dist/types/ai-model/workflows/recorder-generation/yaml.d.ts.map +1 -1
  297. package/dist/types/service/index.d.ts.map +1 -1
  298. package/dist/types/types.d.ts +11 -2
  299. package/dist/types/types.d.ts.map +1 -1
  300. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- const defaultImageDetail = (_input)=>void 0;
1
+ import { getTemperatureWithSemanticRetry } from "./temperature-with-semantic-retry.mjs";
2
2
  const defaultChatCompletionParams = ({ midsceneDefaults, userConfig })=>({
3
3
  config: {
4
4
  temperature: userConfig.temperature ?? midsceneDefaults.temperature
@@ -31,7 +31,6 @@ function resolveExtractContentAndReasoning(chatCompletion) {
31
31
  }
32
32
  function resolveChatCompletion(chatCompletion) {
33
33
  const buildChatCompletionParams = chatCompletion?.buildChatCompletionParams ?? defaultChatCompletionParams;
34
- const resolveImageDetail = chatCompletion?.resolveImageDetail ?? defaultImageDetail;
35
34
  const unsupportedUserConfig = chatCompletion?.unsupportedUserConfig ?? [];
36
35
  const extractContentAndReasoning = resolveExtractContentAndReasoning(chatCompletion);
37
36
  const useReasoningAsContentFallback = chatCompletion?.useReasoningAsContentFallback ?? false;
@@ -45,20 +44,18 @@ function resolveChatCompletion(chatCompletion) {
45
44
  midsceneDefaults: midsceneChatCompletionDefaults
46
45
  };
47
46
  const params = buildChatCompletionParams(context);
48
- const retryAttempt = input.semanticRetryAttempt ?? 0;
49
- if (retryAttempt > 0 && input.userConfig?.temperature === void 0 && 0 === params.config.temperature) return {
47
+ return {
48
+ ...params,
50
49
  config: {
51
50
  ...params.config,
52
- temperature: 0.2
51
+ temperature: getTemperatureWithSemanticRetry({
52
+ temperature: params.config.temperature,
53
+ userTemperature: input.userConfig?.temperature,
54
+ semanticRetryAttempt: input.semanticRetryAttempt
55
+ })
53
56
  }
54
57
  };
55
- return params;
56
58
  },
57
- resolveImageDetail: (input)=>resolveImageDetail({
58
- ...input,
59
- userConfig: input.userConfig ?? {},
60
- midsceneDefaults: midsceneChatCompletionDefaults
61
- }),
62
59
  extractContentAndReasoning,
63
60
  useReasoningAsContentFallback,
64
61
  replayRawAssistantMessage
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model/model-adapter/chat-completion.mjs","sources":["../../../../src/ai-model/model-adapter/chat-completion.ts"],"sourcesContent":["import type {\n ChatCompletionAdapter,\n ChatCompletionCallContext,\n ExtractContentAndReasoning,\n MidsceneChatCompletionDefaults,\n ModelAdapterDefinition,\n} from './types';\n\nconst defaultImageDetail = (_input: unknown) => undefined;\n\nconst defaultChatCompletionParams = ({\n midsceneDefaults,\n userConfig,\n}: ChatCompletionCallContext) => ({\n config: {\n temperature: userConfig.temperature ?? midsceneDefaults.temperature,\n },\n});\n\nconst midsceneChatCompletionDefaults: MidsceneChatCompletionDefaults = {\n temperature: 0,\n};\n\nfunction createDefaultExtractContentAndReasoning(\n reasoningContentKeys: string[],\n): ExtractContentAndReasoning {\n return (message) => {\n if (!message) {\n return {\n content: '',\n reasoning_content: '',\n };\n }\n\n const messageRecord = message as Record<string, unknown>;\n const rawReasoning = reasoningContentKeys\n .map((key) => messageRecord[key])\n .find((value) => typeof value === 'string');\n const messageReasoning =\n typeof rawReasoning === 'string' ? rawReasoning : '';\n\n return {\n content: typeof message.content === 'string' ? message.content : '',\n reasoning_content: messageReasoning,\n };\n };\n}\n\nfunction resolveExtractContentAndReasoning(\n chatCompletion: ModelAdapterDefinition['chatCompletion'],\n): ExtractContentAndReasoning {\n const messageExtraction = chatCompletion?.messageExtraction;\n if (messageExtraction?.kind === 'custom') {\n return messageExtraction.extractContentAndReasoning;\n }\n\n return createDefaultExtractContentAndReasoning(\n messageExtraction?.reasoningContentKeys ?? ['reasoning_content'],\n );\n}\n\nexport function resolveChatCompletion(\n chatCompletion: ModelAdapterDefinition['chatCompletion'],\n): ChatCompletionAdapter {\n const buildChatCompletionParams =\n chatCompletion?.buildChatCompletionParams ?? defaultChatCompletionParams;\n const resolveImageDetail =\n chatCompletion?.resolveImageDetail ?? defaultImageDetail;\n const unsupportedUserConfig = chatCompletion?.unsupportedUserConfig ?? [];\n const extractContentAndReasoning =\n resolveExtractContentAndReasoning(chatCompletion);\n const useReasoningAsContentFallback =\n chatCompletion?.useReasoningAsContentFallback ?? false;\n const replayRawAssistantMessage =\n chatCompletion?.replayRawAssistantMessage ?? false;\n\n return {\n unsupportedUserConfig,\n buildChatCompletionParams: (input) => {\n const context = {\n ...input,\n userConfig: input.userConfig ?? {},\n midsceneDefaults: midsceneChatCompletionDefaults,\n };\n const params = buildChatCompletionParams(context);\n const retryAttempt = input.semanticRetryAttempt ?? 0;\n // Only perturb the default deterministic request after a semantic parse\n // failure: preserve an explicit user temperature, and avoid adding a\n // temperature to adapters whose normal parameters do not include one.\n if (\n retryAttempt > 0 &&\n input.userConfig?.temperature === undefined &&\n params.config.temperature === 0\n ) {\n return {\n config: {\n ...params.config,\n temperature: 0.2,\n },\n };\n }\n return params;\n },\n resolveImageDetail: (input) =>\n resolveImageDetail({\n ...input,\n userConfig: input.userConfig ?? {},\n midsceneDefaults: midsceneChatCompletionDefaults,\n }),\n extractContentAndReasoning,\n useReasoningAsContentFallback,\n replayRawAssistantMessage,\n };\n}\n"],"names":["defaultImageDetail","_input","undefined","defaultChatCompletionParams","midsceneDefaults","userConfig","midsceneChatCompletionDefaults","createDefaultExtractContentAndReasoning","reasoningContentKeys","message","messageRecord","rawReasoning","key","value","messageReasoning","resolveExtractContentAndReasoning","chatCompletion","messageExtraction","resolveChatCompletion","buildChatCompletionParams","resolveImageDetail","unsupportedUserConfig","extractContentAndReasoning","useReasoningAsContentFallback","replayRawAssistantMessage","input","context","params","retryAttempt"],"mappings":"AAQA,MAAMA,qBAAqB,CAACC,SAAoBC;AAEhD,MAAMC,8BAA8B,CAAC,EACnCC,gBAAgB,EAChBC,UAAU,EACgB,GAAM;QAChC,QAAQ;YACN,aAAaA,WAAW,WAAW,IAAID,iBAAiB,WAAW;QACrE;IACF;AAEA,MAAME,iCAAiE;IACrE,aAAa;AACf;AAEA,SAASC,wCACPC,oBAA8B;IAE9B,OAAO,CAACC;QACN,IAAI,CAACA,SACH,OAAO;YACL,SAAS;YACT,mBAAmB;QACrB;QAGF,MAAMC,gBAAgBD;QACtB,MAAME,eAAeH,qBAClB,GAAG,CAAC,CAACI,MAAQF,aAAa,CAACE,IAAI,EAC/B,IAAI,CAAC,CAACC,QAAU,AAAiB,YAAjB,OAAOA;QAC1B,MAAMC,mBACJ,AAAwB,YAAxB,OAAOH,eAA4BA,eAAe;QAEpD,OAAO;YACL,SAAS,AAA2B,YAA3B,OAAOF,QAAQ,OAAO,GAAgBA,QAAQ,OAAO,GAAG;YACjE,mBAAmBK;QACrB;IACF;AACF;AAEA,SAASC,kCACPC,cAAwD;IAExD,MAAMC,oBAAoBD,gBAAgB;IAC1C,IAAIC,mBAAmB,SAAS,UAC9B,OAAOA,kBAAkB,0BAA0B;IAGrD,OAAOV,wCACLU,mBAAmB,wBAAwB;QAAC;KAAoB;AAEpE;AAEO,SAASC,sBACdF,cAAwD;IAExD,MAAMG,4BACJH,gBAAgB,6BAA6Bb;IAC/C,MAAMiB,qBACJJ,gBAAgB,sBAAsBhB;IACxC,MAAMqB,wBAAwBL,gBAAgB,yBAAyB,EAAE;IACzE,MAAMM,6BACJP,kCAAkCC;IACpC,MAAMO,gCACJP,gBAAgB,iCAAiC;IACnD,MAAMQ,4BACJR,gBAAgB,6BAA6B;IAE/C,OAAO;QACLK;QACA,2BAA2B,CAACI;YAC1B,MAAMC,UAAU;gBACd,GAAGD,KAAK;gBACR,YAAYA,MAAM,UAAU,IAAI,CAAC;gBACjC,kBAAkBnB;YACpB;YACA,MAAMqB,SAASR,0BAA0BO;YACzC,MAAME,eAAeH,MAAM,oBAAoB,IAAI;YAInD,IACEG,eAAe,KACfH,MAAM,UAAU,EAAE,gBAAgBvB,UAClCyB,AAA8B,MAA9BA,OAAO,MAAM,CAAC,WAAW,EAEzB,OAAO;gBACL,QAAQ;oBACN,GAAGA,OAAO,MAAM;oBAChB,aAAa;gBACf;YACF;YAEF,OAAOA;QACT;QACA,oBAAoB,CAACF,QACnBL,mBAAmB;gBACjB,GAAGK,KAAK;gBACR,YAAYA,MAAM,UAAU,IAAI,CAAC;gBACjC,kBAAkBnB;YACpB;QACFgB;QACAC;QACAC;IACF;AACF"}
1
+ {"version":3,"file":"ai-model/model-adapter/chat-completion.mjs","sources":["../../../../src/ai-model/model-adapter/chat-completion.ts"],"sourcesContent":["import { getTemperatureWithSemanticRetry } from './temperature-with-semantic-retry';\nimport type {\n ChatCompletionAdapter,\n ChatCompletionCallContext,\n ExtractContentAndReasoning,\n MidsceneChatCompletionDefaults,\n ModelAdapterDefinition,\n} from './types';\n\nconst defaultChatCompletionParams = ({\n midsceneDefaults,\n userConfig,\n}: ChatCompletionCallContext) => ({\n config: {\n temperature: userConfig.temperature ?? midsceneDefaults.temperature,\n },\n});\n\nconst midsceneChatCompletionDefaults: MidsceneChatCompletionDefaults = {\n temperature: 0,\n};\n\nfunction createDefaultExtractContentAndReasoning(\n reasoningContentKeys: string[],\n): ExtractContentAndReasoning {\n return (message) => {\n if (!message) {\n return {\n content: '',\n reasoning_content: '',\n };\n }\n\n const messageRecord = message as Record<string, unknown>;\n const rawReasoning = reasoningContentKeys\n .map((key) => messageRecord[key])\n .find((value) => typeof value === 'string');\n const messageReasoning =\n typeof rawReasoning === 'string' ? rawReasoning : '';\n\n return {\n content: typeof message.content === 'string' ? message.content : '',\n reasoning_content: messageReasoning,\n };\n };\n}\n\nfunction resolveExtractContentAndReasoning(\n chatCompletion: ModelAdapterDefinition['chatCompletion'],\n): ExtractContentAndReasoning {\n const messageExtraction = chatCompletion?.messageExtraction;\n if (messageExtraction?.kind === 'custom') {\n return messageExtraction.extractContentAndReasoning;\n }\n\n return createDefaultExtractContentAndReasoning(\n messageExtraction?.reasoningContentKeys ?? ['reasoning_content'],\n );\n}\n\nexport function resolveChatCompletion(\n chatCompletion: ModelAdapterDefinition['chatCompletion'],\n): ChatCompletionAdapter {\n const buildChatCompletionParams =\n chatCompletion?.buildChatCompletionParams ?? defaultChatCompletionParams;\n const unsupportedUserConfig = chatCompletion?.unsupportedUserConfig ?? [];\n const extractContentAndReasoning =\n resolveExtractContentAndReasoning(chatCompletion);\n const useReasoningAsContentFallback =\n chatCompletion?.useReasoningAsContentFallback ?? false;\n const replayRawAssistantMessage =\n chatCompletion?.replayRawAssistantMessage ?? false;\n\n return {\n unsupportedUserConfig,\n buildChatCompletionParams: (input) => {\n const context = {\n ...input,\n userConfig: input.userConfig ?? {},\n midsceneDefaults: midsceneChatCompletionDefaults,\n };\n const params = buildChatCompletionParams(context);\n return {\n ...params,\n config: {\n ...params.config,\n temperature: getTemperatureWithSemanticRetry({\n temperature: params.config.temperature,\n userTemperature: input.userConfig?.temperature,\n semanticRetryAttempt: input.semanticRetryAttempt,\n }),\n },\n };\n },\n extractContentAndReasoning,\n useReasoningAsContentFallback,\n replayRawAssistantMessage,\n };\n}\n"],"names":["defaultChatCompletionParams","midsceneDefaults","userConfig","midsceneChatCompletionDefaults","createDefaultExtractContentAndReasoning","reasoningContentKeys","message","messageRecord","rawReasoning","key","value","messageReasoning","resolveExtractContentAndReasoning","chatCompletion","messageExtraction","resolveChatCompletion","buildChatCompletionParams","unsupportedUserConfig","extractContentAndReasoning","useReasoningAsContentFallback","replayRawAssistantMessage","input","context","params","getTemperatureWithSemanticRetry"],"mappings":";AASA,MAAMA,8BAA8B,CAAC,EACnCC,gBAAgB,EAChBC,UAAU,EACgB,GAAM;QAChC,QAAQ;YACN,aAAaA,WAAW,WAAW,IAAID,iBAAiB,WAAW;QACrE;IACF;AAEA,MAAME,iCAAiE;IACrE,aAAa;AACf;AAEA,SAASC,wCACPC,oBAA8B;IAE9B,OAAO,CAACC;QACN,IAAI,CAACA,SACH,OAAO;YACL,SAAS;YACT,mBAAmB;QACrB;QAGF,MAAMC,gBAAgBD;QACtB,MAAME,eAAeH,qBAClB,GAAG,CAAC,CAACI,MAAQF,aAAa,CAACE,IAAI,EAC/B,IAAI,CAAC,CAACC,QAAU,AAAiB,YAAjB,OAAOA;QAC1B,MAAMC,mBACJ,AAAwB,YAAxB,OAAOH,eAA4BA,eAAe;QAEpD,OAAO;YACL,SAAS,AAA2B,YAA3B,OAAOF,QAAQ,OAAO,GAAgBA,QAAQ,OAAO,GAAG;YACjE,mBAAmBK;QACrB;IACF;AACF;AAEA,SAASC,kCACPC,cAAwD;IAExD,MAAMC,oBAAoBD,gBAAgB;IAC1C,IAAIC,mBAAmB,SAAS,UAC9B,OAAOA,kBAAkB,0BAA0B;IAGrD,OAAOV,wCACLU,mBAAmB,wBAAwB;QAAC;KAAoB;AAEpE;AAEO,SAASC,sBACdF,cAAwD;IAExD,MAAMG,4BACJH,gBAAgB,6BAA6Bb;IAC/C,MAAMiB,wBAAwBJ,gBAAgB,yBAAyB,EAAE;IACzE,MAAMK,6BACJN,kCAAkCC;IACpC,MAAMM,gCACJN,gBAAgB,iCAAiC;IACnD,MAAMO,4BACJP,gBAAgB,6BAA6B;IAE/C,OAAO;QACLI;QACA,2BAA2B,CAACI;YAC1B,MAAMC,UAAU;gBACd,GAAGD,KAAK;gBACR,YAAYA,MAAM,UAAU,IAAI,CAAC;gBACjC,kBAAkBlB;YACpB;YACA,MAAMoB,SAASP,0BAA0BM;YACzC,OAAO;gBACL,GAAGC,MAAM;gBACT,QAAQ;oBACN,GAAGA,OAAO,MAAM;oBAChB,aAAaC,gCAAgC;wBAC3C,aAAaD,OAAO,MAAM,CAAC,WAAW;wBACtC,iBAAiBF,MAAM,UAAU,EAAE;wBACnC,sBAAsBA,MAAM,oBAAoB;oBAClD;gBACF;YACF;QACF;QACAH;QACAC;QACAC;IACF;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { getPreferredLanguage } from "@midscene/shared/env";
2
2
  import { assertJsonObject } from "../shared/json.mjs";
3
3
  import { formatLocateExampleValue } from "../shared/model-locate-result/index.mjs";
4
+ import { readLocateResultField } from "../shared/model-locate-result/result-field.mjs";
4
5
  const markdownCodeFence = '```';
5
6
  const defaultLocateSystemPromptIntroduction = `## Role:
6
7
  You are an AI assistant that helps identify UI elements.
@@ -89,7 +90,7 @@ const createParseRawResponse = (jsonParser, source, options)=>(content, promptSp
89
90
  });
90
91
  assertJsonObject(parsedResponse);
91
92
  const record = parsedResponse;
92
- const target = void 0 !== record[promptSpec.resultKey] ? record[promptSpec.resultKey] : options.acceptBbox2dAlias && 'bbox' === promptSpec.resultKey ? record.bbox_2d : void 0;
93
+ const target = readLocateResultField(record, promptSpec);
93
94
  const error = 'string' == typeof record.error ? record.error : void 0;
94
95
  if (void 0 === target) throw new Error(`Missing required coordinate field "${promptSpec.resultKey}". Expected "${promptSpec.resultKey}": ${promptSpec.resultValueSchema}; use an empty array when no element is found.${error ? ` Model error: ${error}` : ''}`);
95
96
  if (Array.isArray(target) && 0 === target.length) return {
@@ -105,7 +106,7 @@ const createParseRawResponse = (jsonParser, source, options)=>(content, promptSp
105
106
  error
106
107
  } : {}
107
108
  };
108
- const rawReferences = record[`references_${promptSpec.resultKey}`];
109
+ const rawReferences = readLocateResultField(record, promptSpec, 'references_');
109
110
  const references = null == rawReferences ? void 0 : Array.isArray(rawReferences) ? rawReferences : [
110
111
  rawReferences
111
112
  ];
@@ -120,24 +121,22 @@ const createParseRawResponse = (jsonParser, source, options)=>(content, promptSp
120
121
  } : {}
121
122
  };
122
123
  };
123
- const createDefaultElementProtocol = ({ jsonParser }, options = {})=>({
124
+ const createDefaultElementProtocol = ({ jsonParser })=>({
124
125
  systemPromptIntroduction: defaultLocateSystemPromptIntroduction,
125
126
  buildResponseInstructions,
126
127
  buildUserPrompt,
127
128
  expectedJsonObjectResponse: true,
128
129
  parseRawResponse: createParseRawResponse(jsonParser, 'locate', {
129
- includeReferences: false,
130
- acceptBbox2dAlias: options.acceptBbox2dAlias
130
+ includeReferences: false
131
131
  })
132
132
  });
133
- const createDefaultSearchAreaProtocol = ({ jsonParser }, options = {})=>({
133
+ const createDefaultSearchAreaProtocol = ({ jsonParser })=>({
134
134
  systemPromptIntroduction: defaultSearchAreaSystemPromptIntroduction,
135
135
  buildResponseInstructions: buildSearchAreaResponseInstructions,
136
136
  buildUserPrompt: buildSearchAreaUserPrompt,
137
137
  expectedJsonObjectResponse: true,
138
138
  parseRawResponse: createParseRawResponse(jsonParser, 'section-locator', {
139
- includeReferences: true,
140
- acceptBbox2dAlias: options.acceptBbox2dAlias
139
+ includeReferences: true
141
140
  })
142
141
  });
143
142
  export { createDefaultElementProtocol, createDefaultSearchAreaProtocol };
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model/model-adapter/default-locate-protocol.mjs","sources":["../../../../src/ai-model/model-adapter/default-locate-protocol.ts"],"sourcesContent":["import { getPreferredLanguage } from '@midscene/shared/env';\nimport {\n type JsonParser,\n type JsonParserSource,\n assertJsonObject,\n} from '../shared/json';\nimport {\n type LocateResultPromptSpec,\n formatLocateExampleValue,\n} from '../shared/model-locate-result';\nimport type {\n ParsedLocateResponse,\n StandardLocateProtocol,\n StandardLocateProtocolContext,\n} from './locate-protocol';\n\nconst markdownCodeFence = '```';\n\nconst defaultLocateSystemPromptIntroduction = `## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Identify elements in screenshots that match the user's description.\n- Provide the coordinates of the element that matches the user's description.`;\n\nconst defaultSearchAreaSystemPromptIntroduction = `## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Find a section containing the target element\n- If the description mentions reference elements, also locate sections containing those references`;\n\nconst buildResponseInstructions = (promptSpec: LocateResultPromptSpec) => {\n const preferredLanguage = getPreferredLanguage();\n const resultKey = promptSpec.resultKey;\n const exampleValueText = formatLocateExampleValue(\n promptSpec.exampleValues[0],\n );\n const resultFieldDescription = `the ${promptSpec.resultNoun} of the element that matches the user's description`;\n return `## Output Format:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${promptSpec.resultValueSchema}, // ${promptSpec.resultValueDescription}\n \"error\": string // optional\n}\n${markdownCodeFence}\n\nFields:\n* \\`${resultKey}\\` is ${resultFieldDescription}\n* \\`error\\` is an optional error message (if any)\n\nFor example, when an element is found:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${exampleValueText}\n}\n${markdownCodeFence}\n\nWhen no element is found:\n${markdownCodeFence}json\n{\n \"${resultKey}\": [],\n \"error\": \"I can see ..., but {some element} is not found. Use ${preferredLanguage}.\"\n}\n${markdownCodeFence}\n`;\n};\n\nconst buildUserPrompt = (targetElementDescription: string) =>\n `Find: ${targetElementDescription}`;\n\nconst buildSearchAreaResponseInstructions = (\n promptSpec: LocateResultPromptSpec,\n) => {\n const preferredLanguage = getPreferredLanguage();\n const resultKey = promptSpec.resultKey;\n const exampleValueText = formatLocateExampleValue(\n promptSpec.exampleValues[0],\n );\n const resultJsonProperty = `\"${resultKey}\": ${promptSpec.resultValueSchema}, // ${promptSpec.resultValueDescription}`;\n const resultFieldDescription = `${promptSpec.resultNoun} of the section containing the target element`;\n const referenceFieldDescription = `Optional array of ${promptSpec.resultNounPlural} of reference elements`;\n return `## Output Format:\n${markdownCodeFence}json\n{\n ${resultJsonProperty}\n \"references_${resultKey}\"?: [\n ${promptSpec.resultValueSchema},\n ...\n ],\n \"error\"?: string\n}\n${markdownCodeFence}\n\nFields:\n* \\`${resultKey}\\` - ${resultFieldDescription}\n* \\`references_${resultKey}\\` - ${referenceFieldDescription}\n* \\`error\\` - Optional error message if the section cannot be found. Use ${preferredLanguage}.\n\nExample:\nIf the description is \"delete button on the second row with title 'Peter'\", return:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${exampleValueText},\n \"references_${resultKey}\": [${exampleValueText}]\n}\n${markdownCodeFence}\n`;\n};\n\nconst buildSearchAreaUserPrompt = (sectionDescription: string) =>\n `Find section containing: ${sectionDescription}`;\n\ntype ParseRawResponseOptions = {\n includeReferences: boolean;\n acceptBbox2dAlias?: boolean;\n};\n\nconst createParseRawResponse =\n (\n jsonParser: JsonParser,\n source: JsonParserSource,\n options: ParseRawResponseOptions,\n ) =>\n (\n content: string,\n promptSpec: LocateResultPromptSpec,\n ): ParsedLocateResponse => {\n const parsedResponse = jsonParser(content, {\n source,\n });\n assertJsonObject(parsedResponse);\n const record = parsedResponse;\n const target =\n record[promptSpec.resultKey] !== undefined\n ? record[promptSpec.resultKey]\n : options.acceptBbox2dAlias && promptSpec.resultKey === 'bbox'\n ? record.bbox_2d\n : undefined;\n const error = typeof record.error === 'string' ? record.error : undefined;\n if (target === undefined) {\n throw new Error(\n `Missing required coordinate field \"${promptSpec.resultKey}\". Expected \"${promptSpec.resultKey}\": ${promptSpec.resultValueSchema}; use an empty array when no element is found.${error ? ` Model error: ${error}` : ''}`,\n );\n }\n if (Array.isArray(target) && target.length === 0) {\n return { kind: 'not-found', ...(error ? { error } : {}) };\n }\n\n if (!options.includeReferences) {\n return { kind: 'located', target, ...(error ? { error } : {}) };\n }\n\n const rawReferences = record[`references_${promptSpec.resultKey}`];\n const references =\n rawReferences === undefined || rawReferences === null\n ? undefined\n : Array.isArray(rawReferences)\n ? rawReferences\n : [rawReferences];\n return {\n kind: 'located',\n target,\n ...(references?.length ? { references } : {}),\n ...(error ? { error } : {}),\n };\n };\n\ntype DefaultLocateProtocolOptions = {\n acceptBbox2dAlias?: boolean;\n};\n\nexport const createDefaultElementProtocol = (\n { jsonParser }: StandardLocateProtocolContext,\n options: DefaultLocateProtocolOptions = {},\n): StandardLocateProtocol => ({\n systemPromptIntroduction: defaultLocateSystemPromptIntroduction,\n buildResponseInstructions,\n buildUserPrompt,\n expectedJsonObjectResponse: true,\n parseRawResponse: createParseRawResponse(jsonParser, 'locate', {\n includeReferences: false,\n acceptBbox2dAlias: options.acceptBbox2dAlias,\n }),\n});\n\nexport const createDefaultSearchAreaProtocol = (\n { jsonParser }: StandardLocateProtocolContext,\n options: DefaultLocateProtocolOptions = {},\n): StandardLocateProtocol => ({\n systemPromptIntroduction: defaultSearchAreaSystemPromptIntroduction,\n buildResponseInstructions: buildSearchAreaResponseInstructions,\n buildUserPrompt: buildSearchAreaUserPrompt,\n expectedJsonObjectResponse: true,\n parseRawResponse: createParseRawResponse(jsonParser, 'section-locator', {\n includeReferences: true,\n acceptBbox2dAlias: options.acceptBbox2dAlias,\n }),\n});\n"],"names":["markdownCodeFence","defaultLocateSystemPromptIntroduction","defaultSearchAreaSystemPromptIntroduction","buildResponseInstructions","promptSpec","preferredLanguage","getPreferredLanguage","resultKey","exampleValueText","formatLocateExampleValue","resultFieldDescription","buildUserPrompt","targetElementDescription","buildSearchAreaResponseInstructions","resultJsonProperty","referenceFieldDescription","buildSearchAreaUserPrompt","sectionDescription","createParseRawResponse","jsonParser","source","options","content","parsedResponse","assertJsonObject","record","target","undefined","error","Error","Array","rawReferences","references","createDefaultElementProtocol","createDefaultSearchAreaProtocol"],"mappings":"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"}
1
+ {"version":3,"file":"ai-model/model-adapter/default-locate-protocol.mjs","sources":["../../../../src/ai-model/model-adapter/default-locate-protocol.ts"],"sourcesContent":["import { getPreferredLanguage } from '@midscene/shared/env';\nimport {\n type JsonParser,\n type JsonParserSource,\n assertJsonObject,\n} from '../shared/json';\nimport {\n type LocateResultPromptSpec,\n formatLocateExampleValue,\n} from '../shared/model-locate-result';\nimport { readLocateResultField } from '../shared/model-locate-result/result-field';\nimport type {\n ParsedLocateResponse,\n StandardLocateProtocol,\n StandardLocateProtocolContext,\n} from './locate-protocol';\n\nconst markdownCodeFence = '```';\n\nconst defaultLocateSystemPromptIntroduction = `## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Identify elements in screenshots that match the user's description.\n- Provide the coordinates of the element that matches the user's description.`;\n\nconst defaultSearchAreaSystemPromptIntroduction = `## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Find a section containing the target element\n- If the description mentions reference elements, also locate sections containing those references`;\n\nconst buildResponseInstructions = (promptSpec: LocateResultPromptSpec) => {\n const preferredLanguage = getPreferredLanguage();\n const resultKey = promptSpec.resultKey;\n const exampleValueText = formatLocateExampleValue(\n promptSpec.exampleValues[0],\n );\n const resultFieldDescription = `the ${promptSpec.resultNoun} of the element that matches the user's description`;\n return `## Output Format:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${promptSpec.resultValueSchema}, // ${promptSpec.resultValueDescription}\n \"error\": string // optional\n}\n${markdownCodeFence}\n\nFields:\n* \\`${resultKey}\\` is ${resultFieldDescription}\n* \\`error\\` is an optional error message (if any)\n\nFor example, when an element is found:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${exampleValueText}\n}\n${markdownCodeFence}\n\nWhen no element is found:\n${markdownCodeFence}json\n{\n \"${resultKey}\": [],\n \"error\": \"I can see ..., but {some element} is not found. Use ${preferredLanguage}.\"\n}\n${markdownCodeFence}\n`;\n};\n\nconst buildUserPrompt = (targetElementDescription: string) =>\n `Find: ${targetElementDescription}`;\n\nconst buildSearchAreaResponseInstructions = (\n promptSpec: LocateResultPromptSpec,\n) => {\n const preferredLanguage = getPreferredLanguage();\n const resultKey = promptSpec.resultKey;\n const exampleValueText = formatLocateExampleValue(\n promptSpec.exampleValues[0],\n );\n const resultJsonProperty = `\"${resultKey}\": ${promptSpec.resultValueSchema}, // ${promptSpec.resultValueDescription}`;\n const resultFieldDescription = `${promptSpec.resultNoun} of the section containing the target element`;\n const referenceFieldDescription = `Optional array of ${promptSpec.resultNounPlural} of reference elements`;\n return `## Output Format:\n${markdownCodeFence}json\n{\n ${resultJsonProperty}\n \"references_${resultKey}\"?: [\n ${promptSpec.resultValueSchema},\n ...\n ],\n \"error\"?: string\n}\n${markdownCodeFence}\n\nFields:\n* \\`${resultKey}\\` - ${resultFieldDescription}\n* \\`references_${resultKey}\\` - ${referenceFieldDescription}\n* \\`error\\` - Optional error message if the section cannot be found. Use ${preferredLanguage}.\n\nExample:\nIf the description is \"delete button on the second row with title 'Peter'\", return:\n${markdownCodeFence}json\n{\n \"${resultKey}\": ${exampleValueText},\n \"references_${resultKey}\": [${exampleValueText}]\n}\n${markdownCodeFence}\n`;\n};\n\nconst buildSearchAreaUserPrompt = (sectionDescription: string) =>\n `Find section containing: ${sectionDescription}`;\n\ntype ParseRawResponseOptions = {\n includeReferences: boolean;\n};\n\nconst createParseRawResponse =\n (\n jsonParser: JsonParser,\n source: JsonParserSource,\n options: ParseRawResponseOptions,\n ) =>\n (\n content: string,\n promptSpec: LocateResultPromptSpec,\n ): ParsedLocateResponse => {\n const parsedResponse = jsonParser(content, {\n source,\n });\n assertJsonObject(parsedResponse);\n const record = parsedResponse;\n const target = readLocateResultField(record, promptSpec);\n const error = typeof record.error === 'string' ? record.error : undefined;\n if (target === undefined) {\n throw new Error(\n `Missing required coordinate field \"${promptSpec.resultKey}\". Expected \"${promptSpec.resultKey}\": ${promptSpec.resultValueSchema}; use an empty array when no element is found.${error ? ` Model error: ${error}` : ''}`,\n );\n }\n if (Array.isArray(target) && target.length === 0) {\n return { kind: 'not-found', ...(error ? { error } : {}) };\n }\n\n if (!options.includeReferences) {\n return { kind: 'located', target, ...(error ? { error } : {}) };\n }\n\n const rawReferences = readLocateResultField(\n record,\n promptSpec,\n 'references_',\n );\n const references =\n rawReferences === undefined || rawReferences === null\n ? undefined\n : Array.isArray(rawReferences)\n ? rawReferences\n : [rawReferences];\n return {\n kind: 'located',\n target,\n ...(references?.length ? { references } : {}),\n ...(error ? { error } : {}),\n };\n };\n\nexport const createDefaultElementProtocol = ({\n jsonParser,\n}: StandardLocateProtocolContext): StandardLocateProtocol => ({\n systemPromptIntroduction: defaultLocateSystemPromptIntroduction,\n buildResponseInstructions,\n buildUserPrompt,\n expectedJsonObjectResponse: true,\n parseRawResponse: createParseRawResponse(jsonParser, 'locate', {\n includeReferences: false,\n }),\n});\n\nexport const createDefaultSearchAreaProtocol = ({\n jsonParser,\n}: StandardLocateProtocolContext): StandardLocateProtocol => ({\n systemPromptIntroduction: defaultSearchAreaSystemPromptIntroduction,\n buildResponseInstructions: buildSearchAreaResponseInstructions,\n buildUserPrompt: buildSearchAreaUserPrompt,\n expectedJsonObjectResponse: true,\n parseRawResponse: createParseRawResponse(jsonParser, 'section-locator', {\n includeReferences: true,\n }),\n});\n"],"names":["markdownCodeFence","defaultLocateSystemPromptIntroduction","defaultSearchAreaSystemPromptIntroduction","buildResponseInstructions","promptSpec","preferredLanguage","getPreferredLanguage","resultKey","exampleValueText","formatLocateExampleValue","resultFieldDescription","buildUserPrompt","targetElementDescription","buildSearchAreaResponseInstructions","resultJsonProperty","referenceFieldDescription","buildSearchAreaUserPrompt","sectionDescription","createParseRawResponse","jsonParser","source","options","content","parsedResponse","assertJsonObject","record","target","readLocateResultField","error","undefined","Error","Array","rawReferences","references","createDefaultElementProtocol","createDefaultSearchAreaProtocol"],"mappings":"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"}
@@ -9,7 +9,7 @@ const defaultLocateResultFormatDefinition = {
9
9
  }
10
10
  };
11
11
  const resolveLocateProtocolDefinition = (protocolDefinition, protocolContext)=>'function' == typeof protocolDefinition ? protocolDefinition(protocolContext) : protocolDefinition;
12
- function resolveLocate(locate, resolvedCustomPlanner, protocolContext, acceptBbox2dAlias = false) {
12
+ function resolveLocate(locate, resolvedCustomPlanner, protocolContext) {
13
13
  if (locate?.kind === 'custom') {
14
14
  let locateFn = locate.locateFn;
15
15
  if (!locateFn) {
@@ -23,14 +23,10 @@ function resolveLocate(locate, resolvedCustomPlanner, protocolContext, acceptBbo
23
23
  locateFn
24
24
  };
25
25
  }
26
- const elementProtocol = resolveLocateProtocolDefinition(locate?.element?.protocol ?? ((context)=>createDefaultElementProtocol(context, {
27
- acceptBbox2dAlias
28
- })), protocolContext);
26
+ const elementProtocol = resolveLocateProtocolDefinition(locate?.element?.protocol ?? createDefaultElementProtocol, protocolContext);
29
27
  const elementResultFormat = locate?.element?.resultFormat ?? defaultLocateResultFormatDefinition;
30
28
  const elementResultCodec = createLocateResultCodec(elementResultFormat);
31
- const searchAreaProtocol = locate?.searchArea === false ? void 0 : resolveLocateProtocolDefinition(locate?.searchArea?.protocol ?? ((context)=>createDefaultSearchAreaProtocol(context, {
32
- acceptBbox2dAlias
33
- })), protocolContext);
29
+ const searchAreaProtocol = locate?.searchArea === false ? void 0 : resolveLocateProtocolDefinition(locate?.searchArea?.protocol ?? createDefaultSearchAreaProtocol, protocolContext);
34
30
  const searchAreaResultFormat = locate?.searchArea === false ? void 0 : locate?.searchArea?.resultFormat ?? elementResultFormat;
35
31
  const searchAreaResultCodec = searchAreaResultFormat ? createLocateResultCodec(searchAreaResultFormat) : void 0;
36
32
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model/model-adapter/locate.mjs","sources":["../../../../src/ai-model/model-adapter/locate.ts"],"sourcesContent":["import { createLocateResultCodec } from '../shared/model-locate-result/factory';\nimport type { LocateResultFormatDefinition } from '../shared/model-locate-result/types';\nimport { resolvePlanningTapLocator } from '../workflows/grounding/planning-action-locate';\nimport type { ResolvedCustomPlanningDefinition } from './custom-planning-types';\nimport {\n createDefaultElementProtocol,\n createDefaultSearchAreaProtocol,\n} from './default-locate-protocol';\nimport type {\n StandardLocateProtocolContext,\n StandardLocateProtocolDefinition,\n} from './locate-protocol';\nimport type { LocateAdapter, ModelAdapterDefinition } from './types';\n\nconst defaultLocateResultFormatDefinition: LocateResultFormatDefinition = {\n coordinates: { shape: 'bbox', order: 'xy', normalizedBy: 1000 },\n};\n\nconst resolveLocateProtocolDefinition = (\n protocolDefinition: StandardLocateProtocolDefinition,\n protocolContext: StandardLocateProtocolContext,\n) =>\n typeof protocolDefinition === 'function'\n ? protocolDefinition(protocolContext)\n : protocolDefinition;\n\nexport function resolveLocate(\n locate: ModelAdapterDefinition['locate'],\n resolvedCustomPlanner: ResolvedCustomPlanningDefinition | undefined,\n protocolContext: StandardLocateProtocolContext,\n acceptBbox2dAlias = false,\n): LocateAdapter {\n if (locate?.kind === 'custom') {\n let locateFn = locate.locateFn;\n\n if (!locateFn) {\n const planningTapLocator = locate.planningTapLocator;\n\n if (!planningTapLocator) {\n throw new Error(\n 'Custom locate definition requires either locateFn or planningTapLocator',\n );\n }\n\n if (!resolvedCustomPlanner) {\n throw new Error(\n 'Custom planning tap locator requires a custom planning planner definition',\n );\n }\n locateFn = resolvePlanningTapLocator(\n planningTapLocator,\n resolvedCustomPlanner,\n );\n }\n\n return {\n kind: 'custom',\n locateFn,\n };\n }\n\n const elementProtocol = resolveLocateProtocolDefinition(\n locate?.element?.protocol ??\n ((context) =>\n createDefaultElementProtocol(context, { acceptBbox2dAlias })),\n protocolContext,\n );\n const elementResultFormat =\n locate?.element?.resultFormat ?? defaultLocateResultFormatDefinition;\n const elementResultCodec = createLocateResultCodec(elementResultFormat);\n const searchAreaProtocol =\n locate?.searchArea === false\n ? undefined\n : resolveLocateProtocolDefinition(\n locate?.searchArea?.protocol ??\n ((context) =>\n createDefaultSearchAreaProtocol(context, {\n acceptBbox2dAlias,\n })),\n protocolContext,\n );\n const searchAreaResultFormat =\n locate?.searchArea === false\n ? undefined\n : (locate?.searchArea?.resultFormat ?? elementResultFormat);\n const searchAreaResultCodec = searchAreaResultFormat\n ? createLocateResultCodec(searchAreaResultFormat)\n : undefined;\n\n return {\n kind: 'standard',\n userMessageContentOrder: locate?.userMessageContentOrder ?? 'image-first',\n element: {\n protocol: elementProtocol,\n resultCodec: elementResultCodec,\n },\n ...(searchAreaProtocol && searchAreaResultCodec\n ? {\n searchArea: {\n protocol: searchAreaProtocol,\n resultCodec: searchAreaResultCodec,\n },\n }\n : {}),\n };\n}\n"],"names":["defaultLocateResultFormatDefinition","resolveLocateProtocolDefinition","protocolDefinition","protocolContext","resolveLocate","locate","resolvedCustomPlanner","acceptBbox2dAlias","locateFn","planningTapLocator","Error","resolvePlanningTapLocator","elementProtocol","context","createDefaultElementProtocol","elementResultFormat","elementResultCodec","createLocateResultCodec","searchAreaProtocol","undefined","createDefaultSearchAreaProtocol","searchAreaResultFormat","searchAreaResultCodec"],"mappings":";;;AAcA,MAAMA,sCAAoE;IACxE,aAAa;QAAE,OAAO;QAAQ,OAAO;QAAM,cAAc;IAAK;AAChE;AAEA,MAAMC,kCAAkC,CACtCC,oBACAC,kBAEA,AAA8B,cAA9B,OAAOD,qBACHA,mBAAmBC,mBACnBD;AAEC,SAASE,cACdC,MAAwC,EACxCC,qBAAmE,EACnEH,eAA8C,EAC9CI,oBAAoB,KAAK;IAEzB,IAAIF,QAAQ,SAAS,UAAU;QAC7B,IAAIG,WAAWH,OAAO,QAAQ;QAE9B,IAAI,CAACG,UAAU;YACb,MAAMC,qBAAqBJ,OAAO,kBAAkB;YAEpD,IAAI,CAACI,oBACH,MAAM,IAAIC,MACR;YAIJ,IAAI,CAACJ,uBACH,MAAM,IAAII,MACR;YAGJF,WAAWG,0BACTF,oBACAH;QAEJ;QAEA,OAAO;YACL,MAAM;YACNE;QACF;IACF;IAEA,MAAMI,kBAAkBX,gCACtBI,QAAQ,SAAS,YACb,EAAAQ,UACAC,6BAA6BD,SAAS;YAAEN;QAAkB,EAAC,GAC/DJ;IAEF,MAAMY,sBACJV,QAAQ,SAAS,gBAAgBL;IACnC,MAAMgB,qBAAqBC,wBAAwBF;IACnD,MAAMG,qBACJb,QAAQ,eAAe,QACnBc,SACAlB,gCACEI,QAAQ,YAAY,YAChB,EAAAQ,UACAO,gCAAgCP,SAAS;YACvCN;QACF,EAAC,GACLJ;IAER,MAAMkB,yBACJhB,QAAQ,eAAe,QACnBc,SACCd,QAAQ,YAAY,gBAAgBU;IAC3C,MAAMO,wBAAwBD,yBAC1BJ,wBAAwBI,0BACxBF;IAEJ,OAAO;QACL,MAAM;QACN,yBAAyBd,QAAQ,2BAA2B;QAC5D,SAAS;YACP,UAAUO;YACV,aAAaI;QACf;QACA,GAAIE,sBAAsBI,wBACtB;YACE,YAAY;gBACV,UAAUJ;gBACV,aAAaI;YACf;QACF,IACA,CAAC,CAAC;IACR;AACF"}
1
+ {"version":3,"file":"ai-model/model-adapter/locate.mjs","sources":["../../../../src/ai-model/model-adapter/locate.ts"],"sourcesContent":["import { createLocateResultCodec } from '../shared/model-locate-result/factory';\nimport type { LocateResultFormatDefinition } from '../shared/model-locate-result/types';\nimport { resolvePlanningTapLocator } from '../workflows/grounding/planning-action-locate';\nimport type { ResolvedCustomPlanningDefinition } from './custom-planning-types';\nimport {\n createDefaultElementProtocol,\n createDefaultSearchAreaProtocol,\n} from './default-locate-protocol';\nimport type {\n StandardLocateProtocolContext,\n StandardLocateProtocolDefinition,\n} from './locate-protocol';\nimport type { LocateAdapter, ModelAdapterDefinition } from './types';\n\nconst defaultLocateResultFormatDefinition: LocateResultFormatDefinition = {\n coordinates: { shape: 'bbox', order: 'xy', normalizedBy: 1000 },\n};\n\nconst resolveLocateProtocolDefinition = (\n protocolDefinition: StandardLocateProtocolDefinition,\n protocolContext: StandardLocateProtocolContext,\n) =>\n typeof protocolDefinition === 'function'\n ? protocolDefinition(protocolContext)\n : protocolDefinition;\n\nexport function resolveLocate(\n locate: ModelAdapterDefinition['locate'],\n resolvedCustomPlanner: ResolvedCustomPlanningDefinition | undefined,\n protocolContext: StandardLocateProtocolContext,\n): LocateAdapter {\n if (locate?.kind === 'custom') {\n let locateFn = locate.locateFn;\n\n if (!locateFn) {\n const planningTapLocator = locate.planningTapLocator;\n\n if (!planningTapLocator) {\n throw new Error(\n 'Custom locate definition requires either locateFn or planningTapLocator',\n );\n }\n\n if (!resolvedCustomPlanner) {\n throw new Error(\n 'Custom planning tap locator requires a custom planning planner definition',\n );\n }\n locateFn = resolvePlanningTapLocator(\n planningTapLocator,\n resolvedCustomPlanner,\n );\n }\n\n return {\n kind: 'custom',\n locateFn,\n };\n }\n\n const elementProtocol = resolveLocateProtocolDefinition(\n locate?.element?.protocol ?? createDefaultElementProtocol,\n protocolContext,\n );\n const elementResultFormat =\n locate?.element?.resultFormat ?? defaultLocateResultFormatDefinition;\n const elementResultCodec = createLocateResultCodec(elementResultFormat);\n const searchAreaProtocol =\n locate?.searchArea === false\n ? undefined\n : resolveLocateProtocolDefinition(\n locate?.searchArea?.protocol ?? createDefaultSearchAreaProtocol,\n protocolContext,\n );\n const searchAreaResultFormat =\n locate?.searchArea === false\n ? undefined\n : (locate?.searchArea?.resultFormat ?? elementResultFormat);\n const searchAreaResultCodec = searchAreaResultFormat\n ? createLocateResultCodec(searchAreaResultFormat)\n : undefined;\n\n return {\n kind: 'standard',\n userMessageContentOrder: locate?.userMessageContentOrder ?? 'image-first',\n element: {\n protocol: elementProtocol,\n resultCodec: elementResultCodec,\n },\n ...(searchAreaProtocol && searchAreaResultCodec\n ? {\n searchArea: {\n protocol: searchAreaProtocol,\n resultCodec: searchAreaResultCodec,\n },\n }\n : {}),\n };\n}\n"],"names":["defaultLocateResultFormatDefinition","resolveLocateProtocolDefinition","protocolDefinition","protocolContext","resolveLocate","locate","resolvedCustomPlanner","locateFn","planningTapLocator","Error","resolvePlanningTapLocator","elementProtocol","createDefaultElementProtocol","elementResultFormat","elementResultCodec","createLocateResultCodec","searchAreaProtocol","undefined","createDefaultSearchAreaProtocol","searchAreaResultFormat","searchAreaResultCodec"],"mappings":";;;AAcA,MAAMA,sCAAoE;IACxE,aAAa;QAAE,OAAO;QAAQ,OAAO;QAAM,cAAc;IAAK;AAChE;AAEA,MAAMC,kCAAkC,CACtCC,oBACAC,kBAEA,AAA8B,cAA9B,OAAOD,qBACHA,mBAAmBC,mBACnBD;AAEC,SAASE,cACdC,MAAwC,EACxCC,qBAAmE,EACnEH,eAA8C;IAE9C,IAAIE,QAAQ,SAAS,UAAU;QAC7B,IAAIE,WAAWF,OAAO,QAAQ;QAE9B,IAAI,CAACE,UAAU;YACb,MAAMC,qBAAqBH,OAAO,kBAAkB;YAEpD,IAAI,CAACG,oBACH,MAAM,IAAIC,MACR;YAIJ,IAAI,CAACH,uBACH,MAAM,IAAIG,MACR;YAGJF,WAAWG,0BACTF,oBACAF;QAEJ;QAEA,OAAO;YACL,MAAM;YACNC;QACF;IACF;IAEA,MAAMI,kBAAkBV,gCACtBI,QAAQ,SAAS,YAAYO,8BAC7BT;IAEF,MAAMU,sBACJR,QAAQ,SAAS,gBAAgBL;IACnC,MAAMc,qBAAqBC,wBAAwBF;IACnD,MAAMG,qBACJX,QAAQ,eAAe,QACnBY,SACAhB,gCACEI,QAAQ,YAAY,YAAYa,iCAChCf;IAER,MAAMgB,yBACJd,QAAQ,eAAe,QACnBY,SACCZ,QAAQ,YAAY,gBAAgBQ;IAC3C,MAAMO,wBAAwBD,yBAC1BJ,wBAAwBI,0BACxBF;IAEJ,OAAO;QACL,MAAM;QACN,yBAAyBZ,QAAQ,2BAA2B;QAC5D,SAAS;YACP,UAAUM;YACV,aAAaG;QACf;QACA,GAAIE,sBAAsBI,wBACtB;YACE,YAAY;gBACV,UAAUJ;gBACV,aAAaI;YACf;QACF,IACA,CAAC,CAAC;IACR;AACF"}
@@ -4,6 +4,7 @@ import { buildDefaultCodexAppServerParams } from "./codex-app-server.mjs";
4
4
  import { resolveInsight } from "./insight.mjs";
5
5
  import { resolveLocate } from "./locate.mjs";
6
6
  import { resolveCustomPlanningDefinition, resolvePlanning } from "./planning.mjs";
7
+ import { resolveResponses } from "./responses.mjs";
7
8
  function _define_property(obj, key, value) {
8
9
  if (key in obj) Object.defineProperty(obj, key, {
9
10
  value: value,
@@ -14,6 +15,7 @@ function _define_property(obj, key, value) {
14
15
  else obj[key] = value;
15
16
  return obj;
16
17
  }
18
+ const defaultImageDetail = ({ imageDetail })=>imageDetail ?? 'high';
17
19
  function resolveJsonParser(jsonParser) {
18
20
  if (!jsonParser || 'lenient-json' === jsonParser) return parseModelResponseJson;
19
21
  if ('function' == typeof jsonParser) return jsonParser;
@@ -26,18 +28,24 @@ function resolveImagePreprocess(imagePreprocess) {
26
28
  }
27
29
  class ResolvedModelAdapter {
28
30
  constructor(config, modelFamily){
31
+ _define_property(this, "supportedProtocols", void 0);
29
32
  _define_property(this, "jsonParser", void 0);
30
33
  _define_property(this, "chatCompletion", void 0);
34
+ _define_property(this, "resolveImageDetail", void 0);
35
+ _define_property(this, "responses", void 0);
31
36
  _define_property(this, "buildCodexAppServerParams", void 0);
32
- _define_property(this, "acceptBbox2dAlias", void 0);
33
37
  _define_property(this, "imagePreprocess", void 0);
34
38
  _define_property(this, "insight", void 0);
35
39
  _define_property(this, "planning", void 0);
36
40
  _define_property(this, "locate", void 0);
41
+ this.supportedProtocols = config.supportedProtocols ?? [
42
+ 'openai-chat'
43
+ ];
37
44
  this.jsonParser = resolveJsonParser(config.jsonParser);
38
45
  this.chatCompletion = resolveChatCompletion(config.chatCompletion);
46
+ this.resolveImageDetail = config.resolveImageDetail ?? defaultImageDetail;
47
+ this.responses = resolveResponses(config.responses);
39
48
  this.buildCodexAppServerParams = config.buildCodexAppServerParams ?? buildDefaultCodexAppServerParams;
40
- this.acceptBbox2dAlias = config.acceptBbox2dAlias ?? false;
41
49
  this.imagePreprocess = resolveImagePreprocess(config.imagePreprocess);
42
50
  this.insight = resolveInsight(config.insight, {
43
51
  jsonParser: this.jsonParser
@@ -46,7 +54,7 @@ class ResolvedModelAdapter {
46
54
  const resolvedCustomPlanner = customPlanner ? resolveCustomPlanningDefinition(customPlanner) : void 0;
47
55
  this.locate = resolveLocate(config.locate, resolvedCustomPlanner, {
48
56
  jsonParser: this.jsonParser
49
- }, this.acceptBbox2dAlias);
57
+ });
50
58
  this.planning = resolvePlanning(config.planning, resolvedCustomPlanner, {
51
59
  jsonParser: this.jsonParser
52
60
  }, 'standard' === this.locate.kind ? this.locate.element.resultCodec : void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model/model-adapter/resolve.mjs","sources":["../../../../src/ai-model/model-adapter/resolve.ts"],"sourcesContent":["import { parseModelResponseJson } from '../shared/json';\nimport { resolveChatCompletion } from './chat-completion';\nimport { buildDefaultCodexAppServerParams } from './codex-app-server';\nimport { resolveInsight } from './insight';\nimport type { InsightAdapter } from './insight-protocol';\nimport { resolveLocate } from './locate';\nimport { resolveCustomPlanningDefinition, resolvePlanning } from './planning';\nimport type {\n BuildCodexAppServerParams,\n ChatCompletionAdapter,\n ImagePreprocessPolicy,\n JsonParser,\n LocateAdapter,\n ModelAdapter,\n ModelAdapterDefinition,\n PlanningAdapter,\n} from './types';\n\nfunction resolveJsonParser(\n jsonParser: ModelAdapterDefinition['jsonParser'],\n): JsonParser {\n if (!jsonParser || jsonParser === 'lenient-json') {\n return parseModelResponseJson;\n }\n\n if (typeof jsonParser === 'function') {\n return jsonParser;\n }\n\n throw new Error(`Unknown json parser preset: ${jsonParser}`);\n}\n\nfunction resolveImagePreprocess(\n imagePreprocess: ModelAdapterDefinition['imagePreprocess'],\n): ImagePreprocessPolicy {\n return {\n padBlockSize: imagePreprocess?.padBlockSize,\n };\n}\n\nexport class ResolvedModelAdapter implements ModelAdapter {\n readonly jsonParser: JsonParser;\n readonly chatCompletion: ChatCompletionAdapter;\n readonly buildCodexAppServerParams: BuildCodexAppServerParams;\n readonly acceptBbox2dAlias: boolean;\n readonly imagePreprocess: ImagePreprocessPolicy;\n readonly insight: InsightAdapter;\n readonly planning: PlanningAdapter;\n readonly locate: LocateAdapter;\n\n constructor(config: ModelAdapterDefinition, modelFamily: string) {\n this.jsonParser = resolveJsonParser(config.jsonParser);\n this.chatCompletion = resolveChatCompletion(config.chatCompletion);\n this.buildCodexAppServerParams =\n config.buildCodexAppServerParams ?? buildDefaultCodexAppServerParams;\n this.acceptBbox2dAlias = config.acceptBbox2dAlias ?? false;\n this.imagePreprocess = resolveImagePreprocess(config.imagePreprocess);\n this.insight = resolveInsight(config.insight, {\n jsonParser: this.jsonParser,\n });\n const customPlanner =\n config.planning?.kind === 'custom' ? config.planning.planner : undefined;\n const resolvedCustomPlanner = customPlanner\n ? resolveCustomPlanningDefinition(customPlanner)\n : undefined;\n this.locate = resolveLocate(\n config.locate,\n resolvedCustomPlanner,\n {\n jsonParser: this.jsonParser,\n },\n this.acceptBbox2dAlias,\n );\n this.planning = resolvePlanning(\n config.planning,\n resolvedCustomPlanner,\n { jsonParser: this.jsonParser },\n this.locate.kind === 'standard'\n ? this.locate.element.resultCodec\n : undefined,\n );\n }\n}\n"],"names":["resolveJsonParser","jsonParser","parseModelResponseJson","Error","resolveImagePreprocess","imagePreprocess","ResolvedModelAdapter","config","modelFamily","resolveChatCompletion","buildDefaultCodexAppServerParams","resolveInsight","customPlanner","undefined","resolvedCustomPlanner","resolveCustomPlanningDefinition","resolveLocate","resolvePlanning"],"mappings":";;;;;;;;;;;;;;;;AAkBA,SAASA,kBACPC,UAAgD;IAEhD,IAAI,CAACA,cAAcA,AAAe,mBAAfA,YACjB,OAAOC;IAGT,IAAI,AAAsB,cAAtB,OAAOD,YACT,OAAOA;IAGT,MAAM,IAAIE,MAAM,CAAC,4BAA4B,EAAEF,YAAY;AAC7D;AAEA,SAASG,uBACPC,eAA0D;IAE1D,OAAO;QACL,cAAcA,iBAAiB;IACjC;AACF;AAEO,MAAMC;IAUX,YAAYC,MAA8B,EAAEC,WAAmB,CAAE;QATjE,uBAAS,cAAT;QACA,uBAAS,kBAAT;QACA,uBAAS,6BAAT;QACA,uBAAS,qBAAT;QACA,uBAAS,mBAAT;QACA,uBAAS,WAAT;QACA,uBAAS,YAAT;QACA,uBAAS,UAAT;QAGE,IAAI,CAAC,UAAU,GAAGR,kBAAkBO,OAAO,UAAU;QACrD,IAAI,CAAC,cAAc,GAAGE,sBAAsBF,OAAO,cAAc;QACjE,IAAI,CAAC,yBAAyB,GAC5BA,OAAO,yBAAyB,IAAIG;QACtC,IAAI,CAAC,iBAAiB,GAAGH,OAAO,iBAAiB,IAAI;QACrD,IAAI,CAAC,eAAe,GAAGH,uBAAuBG,OAAO,eAAe;QACpE,IAAI,CAAC,OAAO,GAAGI,eAAeJ,OAAO,OAAO,EAAE;YAC5C,YAAY,IAAI,CAAC,UAAU;QAC7B;QACA,MAAMK,gBACJL,OAAO,QAAQ,EAAE,SAAS,WAAWA,OAAO,QAAQ,CAAC,OAAO,GAAGM;QACjE,MAAMC,wBAAwBF,gBAC1BG,gCAAgCH,iBAChCC;QACJ,IAAI,CAAC,MAAM,GAAGG,cACZT,OAAO,MAAM,EACbO,uBACA;YACE,YAAY,IAAI,CAAC,UAAU;QAC7B,GACA,IAAI,CAAC,iBAAiB;QAExB,IAAI,CAAC,QAAQ,GAAGG,gBACdV,OAAO,QAAQ,EACfO,uBACA;YAAE,YAAY,IAAI,CAAC,UAAU;QAAC,GAC9B,AAAqB,eAArB,IAAI,CAAC,MAAM,CAAC,IAAI,GACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,GAC/BD;IAER;AACF"}
1
+ {"version":3,"file":"ai-model/model-adapter/resolve.mjs","sources":["../../../../src/ai-model/model-adapter/resolve.ts"],"sourcesContent":["import { parseModelResponseJson } from '../shared/json';\nimport { resolveChatCompletion } from './chat-completion';\nimport { buildDefaultCodexAppServerParams } from './codex-app-server';\nimport { resolveInsight } from './insight';\nimport type { InsightAdapter } from './insight-protocol';\nimport { resolveLocate } from './locate';\nimport { resolveCustomPlanningDefinition, resolvePlanning } from './planning';\nimport { resolveResponses } from './responses';\nimport type {\n BuildCodexAppServerParams,\n ChatCompletionAdapter,\n ImagePreprocessPolicy,\n JsonParser,\n LocateAdapter,\n ModelAdapter,\n ModelAdapterDefinition,\n PlanningAdapter,\n ResolveImageDetail,\n ResponsesAdapter,\n} from './types';\n\nconst defaultImageDetail: ResolveImageDetail = ({ imageDetail }) =>\n imageDetail ?? 'high';\n\nfunction resolveJsonParser(\n jsonParser: ModelAdapterDefinition['jsonParser'],\n): JsonParser {\n if (!jsonParser || jsonParser === 'lenient-json') {\n return parseModelResponseJson;\n }\n\n if (typeof jsonParser === 'function') {\n return jsonParser;\n }\n\n throw new Error(`Unknown json parser preset: ${jsonParser}`);\n}\n\nfunction resolveImagePreprocess(\n imagePreprocess: ModelAdapterDefinition['imagePreprocess'],\n): ImagePreprocessPolicy {\n return {\n padBlockSize: imagePreprocess?.padBlockSize,\n };\n}\n\nexport class ResolvedModelAdapter implements ModelAdapter {\n readonly supportedProtocols: ModelAdapter['supportedProtocols'];\n readonly jsonParser: JsonParser;\n readonly chatCompletion: ChatCompletionAdapter;\n readonly resolveImageDetail: ResolveImageDetail;\n readonly responses: ResponsesAdapter;\n readonly buildCodexAppServerParams: BuildCodexAppServerParams;\n readonly imagePreprocess: ImagePreprocessPolicy;\n readonly insight: InsightAdapter;\n readonly planning: PlanningAdapter;\n readonly locate: LocateAdapter;\n\n constructor(config: ModelAdapterDefinition, modelFamily: string) {\n this.supportedProtocols = config.supportedProtocols ?? ['openai-chat'];\n this.jsonParser = resolveJsonParser(config.jsonParser);\n this.chatCompletion = resolveChatCompletion(config.chatCompletion);\n this.resolveImageDetail = config.resolveImageDetail ?? defaultImageDetail;\n this.responses = resolveResponses(config.responses);\n this.buildCodexAppServerParams =\n config.buildCodexAppServerParams ?? buildDefaultCodexAppServerParams;\n this.imagePreprocess = resolveImagePreprocess(config.imagePreprocess);\n this.insight = resolveInsight(config.insight, {\n jsonParser: this.jsonParser,\n });\n const customPlanner =\n config.planning?.kind === 'custom' ? config.planning.planner : undefined;\n const resolvedCustomPlanner = customPlanner\n ? resolveCustomPlanningDefinition(customPlanner)\n : undefined;\n this.locate = resolveLocate(config.locate, resolvedCustomPlanner, {\n jsonParser: this.jsonParser,\n });\n this.planning = resolvePlanning(\n config.planning,\n resolvedCustomPlanner,\n { jsonParser: this.jsonParser },\n this.locate.kind === 'standard'\n ? this.locate.element.resultCodec\n : undefined,\n );\n }\n}\n"],"names":["defaultImageDetail","imageDetail","resolveJsonParser","jsonParser","parseModelResponseJson","Error","resolveImagePreprocess","imagePreprocess","ResolvedModelAdapter","config","modelFamily","resolveChatCompletion","resolveResponses","buildDefaultCodexAppServerParams","resolveInsight","customPlanner","undefined","resolvedCustomPlanner","resolveCustomPlanningDefinition","resolveLocate","resolvePlanning"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,MAAMA,qBAAyC,CAAC,EAAEC,WAAW,EAAE,GAC7DA,eAAe;AAEjB,SAASC,kBACPC,UAAgD;IAEhD,IAAI,CAACA,cAAcA,AAAe,mBAAfA,YACjB,OAAOC;IAGT,IAAI,AAAsB,cAAtB,OAAOD,YACT,OAAOA;IAGT,MAAM,IAAIE,MAAM,CAAC,4BAA4B,EAAEF,YAAY;AAC7D;AAEA,SAASG,uBACPC,eAA0D;IAE1D,OAAO;QACL,cAAcA,iBAAiB;IACjC;AACF;AAEO,MAAMC;IAYX,YAAYC,MAA8B,EAAEC,WAAmB,CAAE;QAXjE,uBAAS,sBAAT;QACA,uBAAS,cAAT;QACA,uBAAS,kBAAT;QACA,uBAAS,sBAAT;QACA,uBAAS,aAAT;QACA,uBAAS,6BAAT;QACA,uBAAS,mBAAT;QACA,uBAAS,WAAT;QACA,uBAAS,YAAT;QACA,uBAAS,UAAT;QAGE,IAAI,CAAC,kBAAkB,GAAGD,OAAO,kBAAkB,IAAI;YAAC;SAAc;QACtE,IAAI,CAAC,UAAU,GAAGP,kBAAkBO,OAAO,UAAU;QACrD,IAAI,CAAC,cAAc,GAAGE,sBAAsBF,OAAO,cAAc;QACjE,IAAI,CAAC,kBAAkB,GAAGA,OAAO,kBAAkB,IAAIT;QACvD,IAAI,CAAC,SAAS,GAAGY,iBAAiBH,OAAO,SAAS;QAClD,IAAI,CAAC,yBAAyB,GAC5BA,OAAO,yBAAyB,IAAII;QACtC,IAAI,CAAC,eAAe,GAAGP,uBAAuBG,OAAO,eAAe;QACpE,IAAI,CAAC,OAAO,GAAGK,eAAeL,OAAO,OAAO,EAAE;YAC5C,YAAY,IAAI,CAAC,UAAU;QAC7B;QACA,MAAMM,gBACJN,OAAO,QAAQ,EAAE,SAAS,WAAWA,OAAO,QAAQ,CAAC,OAAO,GAAGO;QACjE,MAAMC,wBAAwBF,gBAC1BG,gCAAgCH,iBAChCC;QACJ,IAAI,CAAC,MAAM,GAAGG,cAAcV,OAAO,MAAM,EAAEQ,uBAAuB;YAChE,YAAY,IAAI,CAAC,UAAU;QAC7B;QACA,IAAI,CAAC,QAAQ,GAAGG,gBACdX,OAAO,QAAQ,EACfQ,uBACA;YAAE,YAAY,IAAI,CAAC,UAAU;QAAC,GAC9B,AAAqB,eAArB,IAAI,CAAC,MAAM,CAAC,IAAI,GACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,GAC/BD;IAER;AACF"}
@@ -0,0 +1,38 @@
1
+ import { getTemperatureWithSemanticRetry } from "./temperature-with-semantic-retry.mjs";
2
+ const midsceneResponsesDefaults = {
3
+ temperature: 0
4
+ };
5
+ const buildDefaultResponsesParams = ({ midsceneDefaults, userConfig })=>({
6
+ config: {
7
+ temperature: userConfig.temperature ?? midsceneDefaults.temperature
8
+ }
9
+ });
10
+ function resolveResponses(responses) {
11
+ const buildResponsesParams = responses?.buildResponsesParams ?? buildDefaultResponsesParams;
12
+ return {
13
+ replayRawAssistantOutput: responses?.replayRawAssistantOutput ?? false,
14
+ unsupportedUserConfig: responses?.unsupportedUserConfig ?? [],
15
+ buildResponsesParams: (input)=>{
16
+ const context = {
17
+ ...input,
18
+ userConfig: input.userConfig ?? {},
19
+ midsceneDefaults: midsceneResponsesDefaults
20
+ };
21
+ const params = buildResponsesParams(context);
22
+ return {
23
+ ...params,
24
+ config: {
25
+ ...params.config,
26
+ temperature: getTemperatureWithSemanticRetry({
27
+ temperature: params.config.temperature,
28
+ userTemperature: input.userConfig?.temperature,
29
+ semanticRetryAttempt: input.semanticRetryAttempt
30
+ })
31
+ }
32
+ };
33
+ }
34
+ };
35
+ }
36
+ export { buildDefaultResponsesParams, resolveResponses };
37
+
38
+ //# sourceMappingURL=responses.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/model-adapter/responses.mjs","sources":["../../../../src/ai-model/model-adapter/responses.ts"],"sourcesContent":["import { getTemperatureWithSemanticRetry } from './temperature-with-semantic-retry';\nimport type {\n BuildResponsesParams,\n MidsceneResponsesDefaults,\n ModelAdapterDefinition,\n ResponsesAdapter,\n} from './types';\n\nconst midsceneResponsesDefaults: MidsceneResponsesDefaults = {\n temperature: 0,\n};\n\nexport const buildDefaultResponsesParams: BuildResponsesParams = ({\n midsceneDefaults,\n userConfig,\n}) => ({\n config: {\n temperature: userConfig.temperature ?? midsceneDefaults.temperature,\n },\n});\n\nexport function resolveResponses(\n responses: ModelAdapterDefinition['responses'],\n): ResponsesAdapter {\n const buildResponsesParams =\n responses?.buildResponsesParams ?? buildDefaultResponsesParams;\n return {\n replayRawAssistantOutput: responses?.replayRawAssistantOutput ?? false,\n unsupportedUserConfig: responses?.unsupportedUserConfig ?? [],\n buildResponsesParams: (input) => {\n const context = {\n ...input,\n userConfig: input.userConfig ?? {},\n midsceneDefaults: midsceneResponsesDefaults,\n };\n const params = buildResponsesParams(context);\n return {\n ...params,\n config: {\n ...params.config,\n temperature: getTemperatureWithSemanticRetry({\n temperature: params.config.temperature,\n userTemperature: input.userConfig?.temperature,\n semanticRetryAttempt: input.semanticRetryAttempt,\n }),\n },\n };\n },\n };\n}\n"],"names":["midsceneResponsesDefaults","buildDefaultResponsesParams","midsceneDefaults","userConfig","resolveResponses","responses","buildResponsesParams","input","context","params","getTemperatureWithSemanticRetry"],"mappings":";AAQA,MAAMA,4BAAuD;IAC3D,aAAa;AACf;AAEO,MAAMC,8BAAoD,CAAC,EAChEC,gBAAgB,EAChBC,UAAU,EACX,GAAM;QACL,QAAQ;YACN,aAAaA,WAAW,WAAW,IAAID,iBAAiB,WAAW;QACrE;IACF;AAEO,SAASE,iBACdC,SAA8C;IAE9C,MAAMC,uBACJD,WAAW,wBAAwBJ;IACrC,OAAO;QACL,0BAA0BI,WAAW,4BAA4B;QACjE,uBAAuBA,WAAW,yBAAyB,EAAE;QAC7D,sBAAsB,CAACE;YACrB,MAAMC,UAAU;gBACd,GAAGD,KAAK;gBACR,YAAYA,MAAM,UAAU,IAAI,CAAC;gBACjC,kBAAkBP;YACpB;YACA,MAAMS,SAASH,qBAAqBE;YACpC,OAAO;gBACL,GAAGC,MAAM;gBACT,QAAQ;oBACN,GAAGA,OAAO,MAAM;oBAChB,aAAaC,gCAAgC;wBAC3C,aAAaD,OAAO,MAAM,CAAC,WAAW;wBACtC,iBAAiBF,MAAM,UAAU,EAAE;wBACnC,sBAAsBA,MAAM,oBAAoB;oBAClD;gBACF;YACF;QACF;IACF;AACF"}
@@ -0,0 +1,7 @@
1
+ function getTemperatureWithSemanticRetry({ temperature, userTemperature, semanticRetryAttempt = 0 }) {
2
+ if (semanticRetryAttempt > 0 && void 0 === userTemperature && 0 === temperature) return 0.2;
3
+ return temperature;
4
+ }
5
+ export { getTemperatureWithSemanticRetry };
6
+
7
+ //# sourceMappingURL=temperature-with-semantic-retry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/model-adapter/temperature-with-semantic-retry.mjs","sources":["../../../../src/ai-model/model-adapter/temperature-with-semantic-retry.ts"],"sourcesContent":["export function getTemperatureWithSemanticRetry<T>({\n temperature,\n userTemperature,\n semanticRetryAttempt = 0,\n}: {\n temperature: T;\n userTemperature?: number;\n semanticRetryAttempt?: number;\n}): T | number {\n // Only perturb the default deterministic request after a semantic parse\n // failure: preserve an explicit user temperature, and avoid adding a\n // temperature to adapters whose normal parameters do not include one.\n if (\n semanticRetryAttempt > 0 &&\n userTemperature === undefined &&\n temperature === 0\n ) {\n return 0.2;\n }\n return temperature;\n}\n"],"names":["getTemperatureWithSemanticRetry","temperature","userTemperature","semanticRetryAttempt","undefined"],"mappings":"AAAO,SAASA,gCAAmC,EACjDC,WAAW,EACXC,eAAe,EACfC,uBAAuB,CAAC,EAKzB;IAIC,IACEA,uBAAuB,KACvBD,AAAoBE,WAApBF,mBACAD,AAAgB,MAAhBA,aAEA,OAAO;IAET,OAAOA;AACT"}
@@ -1,5 +1,5 @@
1
1
  import { isLocateIntent } from "./utils/intent.mjs";
2
- const originalImageDetailForDefaultIntent = (input)=>isLocateIntent(input.intent) || input.requiresOriginalImageDetail ? 'original' : void 0;
2
+ const originalImageDetailForDefaultIntent = (input)=>isLocateIntent(input.intent) || input.requiresOriginalImageDetail ? 'original' : input.imageDetail ?? 'high';
3
3
  const resolveGpt5ReasoningEffort = ({ reasoningEnabled, reasoningEffort })=>{
4
4
  if ('default' === reasoningEnabled) return;
5
5
  return true === reasoningEnabled ? reasoningEffort ?? 'medium' : 'none';
@@ -11,15 +11,56 @@ const resolveGpt6ReasoningEffort = ({ reasoningEnabled, reasoningEffort })=>{
11
11
  const buildGpt5CodexAppServerParams = (input)=>({
12
12
  config: {
13
13
  effort: resolveGpt5ReasoningEffort(input.userConfig ?? {})
14
- },
15
- imageDetail: originalImageDetailForDefaultIntent(input)
14
+ }
16
15
  });
17
16
  const buildGpt6CodexAppServerParams = (input)=>({
18
17
  config: {
19
18
  effort: resolveGpt6ReasoningEffort(input.userConfig ?? {})
20
- },
21
- imageDetail: originalImageDetailForDefaultIntent(input)
19
+ }
22
20
  });
21
+ const buildGpt5ResponsesParams = (input)=>{
22
+ const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;
23
+ const commonOverrideConfig = {};
24
+ if (void 0 !== userConfig.temperature) commonOverrideConfig.temperature = userConfig.temperature;
25
+ if ('none' !== userConfig.responseFormat && expectedJsonObjectResponse) commonOverrideConfig.text = {
26
+ format: {
27
+ type: 'json_object'
28
+ }
29
+ };
30
+ const effectiveReasoningEffort = resolveGpt5ReasoningEffort(userConfig);
31
+ return {
32
+ config: {
33
+ ...midsceneDefaults,
34
+ ...commonOverrideConfig,
35
+ reasoning: {
36
+ effort: effectiveReasoningEffort,
37
+ context: 'current_turn'
38
+ }
39
+ }
40
+ };
41
+ };
42
+ const buildGpt6ResponsesParams = (input)=>{
43
+ const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;
44
+ const { responseFormat } = userConfig;
45
+ const commonOverrideConfig = {};
46
+ commonOverrideConfig.temperature = void 0;
47
+ if ('none' !== responseFormat && expectedJsonObjectResponse) commonOverrideConfig.text = {
48
+ format: {
49
+ type: 'json_object'
50
+ }
51
+ };
52
+ const effectiveReasoningEffort = resolveGpt6ReasoningEffort(userConfig);
53
+ return {
54
+ config: {
55
+ ...midsceneDefaults,
56
+ ...commonOverrideConfig,
57
+ reasoning: {
58
+ effort: effectiveReasoningEffort,
59
+ context: 'current_turn'
60
+ }
61
+ }
62
+ };
63
+ };
23
64
  const buildGpt5ChatCompletionParams = (input)=>{
24
65
  const { midsceneDefaults, userConfig } = input;
25
66
  const commonOverrideConfig = {};
@@ -55,13 +96,24 @@ const buildGpt6ChatCompletionParams = (input)=>{
55
96
  };
56
97
  const gptAdapters = {
57
98
  'gpt-5': {
99
+ supportedProtocols: [
100
+ 'openai-chat',
101
+ 'openai-responses'
102
+ ],
103
+ resolveImageDetail: originalImageDetailForDefaultIntent,
104
+ responses: {
105
+ replayRawAssistantOutput: false,
106
+ unsupportedUserConfig: [
107
+ 'reasoningBudget'
108
+ ],
109
+ buildResponsesParams: buildGpt5ResponsesParams
110
+ },
58
111
  buildCodexAppServerParams: buildGpt5CodexAppServerParams,
59
112
  chatCompletion: {
60
113
  unsupportedUserConfig: [
61
114
  'reasoningBudget'
62
115
  ],
63
- buildChatCompletionParams: buildGpt5ChatCompletionParams,
64
- resolveImageDetail: originalImageDetailForDefaultIntent
116
+ buildChatCompletionParams: buildGpt5ChatCompletionParams
65
117
  },
66
118
  locate: {
67
119
  element: {
@@ -75,14 +127,26 @@ const gptAdapters = {
75
127
  }
76
128
  },
77
129
  'gpt-6': {
130
+ supportedProtocols: [
131
+ 'openai-chat',
132
+ 'openai-responses'
133
+ ],
134
+ resolveImageDetail: originalImageDetailForDefaultIntent,
135
+ responses: {
136
+ replayRawAssistantOutput: false,
137
+ unsupportedUserConfig: [
138
+ 'temperature',
139
+ 'reasoningBudget'
140
+ ],
141
+ buildResponsesParams: buildGpt6ResponsesParams
142
+ },
78
143
  buildCodexAppServerParams: buildGpt6CodexAppServerParams,
79
144
  chatCompletion: {
80
145
  unsupportedUserConfig: [
81
146
  'temperature',
82
147
  'reasoningBudget'
83
148
  ],
84
- buildChatCompletionParams: buildGpt6ChatCompletionParams,
85
- resolveImageDetail: originalImageDetailForDefaultIntent
149
+ buildChatCompletionParams: buildGpt6ChatCompletionParams
86
150
  },
87
151
  locate: {
88
152
  element: {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model/models/gpt.mjs","sources":["../../../../src/ai-model/models/gpt.ts"],"sourcesContent":["import type { TModelFamily } from '@midscene/shared/env';\nimport type {\n ChatCompletionCallContext,\n ChatCompletionParamsResult,\n CodexAppServerCallInput,\n CodexAppServerParamsResult,\n ImageDetail,\n ModelAdapterDefinition,\n ReasoningInput,\n} from '../model-adapter/types';\nimport { isLocateIntent } from './utils/intent';\n\nconst originalImageDetailForDefaultIntent = (\n input: Pick<\n CodexAppServerCallInput,\n 'intent' | 'requiresOriginalImageDetail'\n >,\n): ImageDetail | undefined =>\n isLocateIntent(input.intent) || input.requiresOriginalImageDetail\n ? 'original'\n : undefined;\n\nconst resolveGpt5ReasoningEffort = ({\n reasoningEnabled,\n reasoningEffort,\n}: ReasoningInput): string | undefined => {\n if (reasoningEnabled === 'default') return undefined;\n return reasoningEnabled === true ? (reasoningEffort ?? 'medium') : 'none';\n};\n\n// Astra cannot disable reasoning; use its lowest effort when disabled.\nconst resolveGpt6ReasoningEffort = ({\n reasoningEnabled,\n reasoningEffort,\n}: ReasoningInput): string | undefined => {\n if (reasoningEnabled === 'default') return undefined;\n return reasoningEnabled === true ? (reasoningEffort ?? 'medium') : 'low';\n};\n\nconst buildGpt5CodexAppServerParams = (\n input: CodexAppServerCallInput,\n): CodexAppServerParamsResult => ({\n config: { effort: resolveGpt5ReasoningEffort(input.userConfig ?? {}) },\n imageDetail: originalImageDetailForDefaultIntent(input),\n});\n\nconst buildGpt6CodexAppServerParams = (\n input: CodexAppServerCallInput,\n): CodexAppServerParamsResult => ({\n config: { effort: resolveGpt6ReasoningEffort(input.userConfig ?? {}) },\n imageDetail: originalImageDetailForDefaultIntent(input),\n});\n\nconst buildGpt5ChatCompletionParams = (\n input: ChatCompletionCallContext,\n): ChatCompletionParamsResult => {\n const { midsceneDefaults, userConfig } = input;\n const commonOverrideConfig: Record<string, unknown> = {};\n\n if (userConfig.temperature !== undefined) {\n commonOverrideConfig.temperature = userConfig.temperature;\n }\n\n // OpenAI Chat Completions JSON mode:\n // https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat#json-mode\n if (\n input.userConfig.responseFormat !== 'none' &&\n input.expectedJsonObjectResponse\n ) {\n commonOverrideConfig.response_format = { type: 'json_object' };\n }\n\n const effectiveReasoningEffort = resolveGpt5ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n reasoning_effort: effectiveReasoningEffort,\n },\n };\n};\n\nconst buildGpt6ChatCompletionParams = (\n input: ChatCompletionCallContext,\n): ChatCompletionParamsResult => {\n const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;\n const { responseFormat } = userConfig;\n const commonOverrideConfig: Record<string, unknown> = {};\n // GPT-6 does not support temperature; omit it from the serialized request.\n commonOverrideConfig.temperature = undefined;\n if (responseFormat !== 'none' && expectedJsonObjectResponse) {\n commonOverrideConfig.response_format = { type: 'json_object' };\n }\n\n const effectiveReasoningEffort = resolveGpt6ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n reasoning_effort: effectiveReasoningEffort,\n },\n };\n};\n\nexport const gptAdapters = {\n 'gpt-5': {\n buildCodexAppServerParams: buildGpt5CodexAppServerParams,\n chatCompletion: {\n unsupportedUserConfig: ['reasoningBudget'],\n buildChatCompletionParams: buildGpt5ChatCompletionParams,\n resolveImageDetail: originalImageDetailForDefaultIntent,\n },\n locate: {\n element: {\n resultFormat: {\n coordinates: { shape: 'bbox', order: 'xy' },\n },\n },\n },\n },\n 'gpt-6': {\n buildCodexAppServerParams: buildGpt6CodexAppServerParams,\n chatCompletion: {\n unsupportedUserConfig: ['temperature', 'reasoningBudget'],\n buildChatCompletionParams: buildGpt6ChatCompletionParams,\n resolveImageDetail: originalImageDetailForDefaultIntent,\n },\n locate: {\n element: {\n resultFormat: {\n coordinates: { shape: 'bbox', order: 'xy' },\n },\n },\n },\n },\n} satisfies Pick<\n Record<TModelFamily, ModelAdapterDefinition>,\n 'gpt-5' | 'gpt-6'\n>;\n"],"names":["originalImageDetailForDefaultIntent","input","isLocateIntent","undefined","resolveGpt5ReasoningEffort","reasoningEnabled","reasoningEffort","resolveGpt6ReasoningEffort","buildGpt5CodexAppServerParams","buildGpt6CodexAppServerParams","buildGpt5ChatCompletionParams","midsceneDefaults","userConfig","commonOverrideConfig","effectiveReasoningEffort","buildGpt6ChatCompletionParams","expectedJsonObjectResponse","responseFormat","gptAdapters"],"mappings":";AAYA,MAAMA,sCAAsC,CAC1CC,QAKAC,eAAeD,MAAM,MAAM,KAAKA,MAAM,2BAA2B,GAC7D,aACAE;AAEN,MAAMC,6BAA6B,CAAC,EAClCC,gBAAgB,EAChBC,eAAe,EACA;IACf,IAAID,AAAqB,cAArBA,kBAAgC;IACpC,OAAOA,AAAqB,SAArBA,mBAA6BC,mBAAmB,WAAY;AACrE;AAGA,MAAMC,6BAA6B,CAAC,EAClCF,gBAAgB,EAChBC,eAAe,EACA;IACf,IAAID,AAAqB,cAArBA,kBAAgC;IACpC,OAAOA,AAAqB,SAArBA,mBAA6BC,mBAAmB,WAAY;AACrE;AAEA,MAAME,gCAAgC,CACpCP,QACgC;QAChC,QAAQ;YAAE,QAAQG,2BAA2BH,MAAM,UAAU,IAAI,CAAC;QAAG;QACrE,aAAaD,oCAAoCC;IACnD;AAEA,MAAMQ,gCAAgC,CACpCR,QACgC;QAChC,QAAQ;YAAE,QAAQM,2BAA2BN,MAAM,UAAU,IAAI,CAAC;QAAG;QACrE,aAAaD,oCAAoCC;IACnD;AAEA,MAAMS,gCAAgC,CACpCT;IAEA,MAAM,EAAEU,gBAAgB,EAAEC,UAAU,EAAE,GAAGX;IACzC,MAAMY,uBAAgD,CAAC;IAEvD,IAAID,AAA2BT,WAA3BS,WAAW,WAAW,EACxBC,qBAAqB,WAAW,GAAGD,WAAW,WAAW;IAK3D,IACEX,AAAoC,WAApCA,MAAM,UAAU,CAAC,cAAc,IAC/BA,MAAM,0BAA0B,EAEhCY,qBAAqB,eAAe,GAAG;QAAE,MAAM;IAAc;IAG/D,MAAMC,2BAA2BV,2BAA2BQ;IAE5D,OAAO;QACL,QAAQ;YACN,GAAGD,gBAAgB;YACnB,GAAGE,oBAAoB;YACvB,kBAAkBC;QACpB;IACF;AACF;AAEA,MAAMC,gCAAgC,CACpCd;IAEA,MAAM,EAAEU,gBAAgB,EAAEC,UAAU,EAAEI,0BAA0B,EAAE,GAAGf;IACrE,MAAM,EAAEgB,cAAc,EAAE,GAAGL;IAC3B,MAAMC,uBAAgD,CAAC;IAEvDA,qBAAqB,WAAW,GAAGV;IACnC,IAAIc,AAAmB,WAAnBA,kBAA6BD,4BAC/BH,qBAAqB,eAAe,GAAG;QAAE,MAAM;IAAc;IAG/D,MAAMC,2BAA2BP,2BAA2BK;IAE5D,OAAO;QACL,QAAQ;YACN,GAAGD,gBAAgB;YACnB,GAAGE,oBAAoB;YACvB,kBAAkBC;QACpB;IACF;AACF;AAEO,MAAMI,cAAc;IACzB,SAAS;QACP,2BAA2BV;QAC3B,gBAAgB;YACd,uBAAuB;gBAAC;aAAkB;YAC1C,2BAA2BE;YAC3B,oBAAoBV;QACtB;QACA,QAAQ;YACN,SAAS;gBACP,cAAc;oBACZ,aAAa;wBAAE,OAAO;wBAAQ,OAAO;oBAAK;gBAC5C;YACF;QACF;IACF;IACA,SAAS;QACP,2BAA2BS;QAC3B,gBAAgB;YACd,uBAAuB;gBAAC;gBAAe;aAAkB;YACzD,2BAA2BM;YAC3B,oBAAoBf;QACtB;QACA,QAAQ;YACN,SAAS;gBACP,cAAc;oBACZ,aAAa;wBAAE,OAAO;wBAAQ,OAAO;oBAAK;gBAC5C;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"file":"ai-model/models/gpt.mjs","sources":["../../../../src/ai-model/models/gpt.ts"],"sourcesContent":["import type { TModelFamily } from '@midscene/shared/env';\nimport type {\n BuildResponsesParams,\n ChatCompletionCallContext,\n ChatCompletionParamsResult,\n CodexAppServerCallInput,\n CodexAppServerParamsResult,\n ModelAdapterDefinition,\n ReasoningInput,\n ResolveImageDetail,\n} from '../model-adapter/types';\nimport { isLocateIntent } from './utils/intent';\n\nconst originalImageDetailForDefaultIntent: ResolveImageDetail = (input) =>\n isLocateIntent(input.intent) || input.requiresOriginalImageDetail\n ? 'original'\n : (input.imageDetail ?? 'high');\n\nconst resolveGpt5ReasoningEffort = ({\n reasoningEnabled,\n reasoningEffort,\n}: ReasoningInput): string | undefined => {\n if (reasoningEnabled === 'default') return undefined;\n return reasoningEnabled === true ? (reasoningEffort ?? 'medium') : 'none';\n};\n\n// Astra cannot disable reasoning; use its lowest effort when disabled.\nconst resolveGpt6ReasoningEffort = ({\n reasoningEnabled,\n reasoningEffort,\n}: ReasoningInput): string | undefined => {\n if (reasoningEnabled === 'default') return undefined;\n return reasoningEnabled === true ? (reasoningEffort ?? 'medium') : 'low';\n};\n\nconst buildGpt5CodexAppServerParams = (\n input: CodexAppServerCallInput,\n): CodexAppServerParamsResult => ({\n config: { effort: resolveGpt5ReasoningEffort(input.userConfig ?? {}) },\n});\n\nconst buildGpt6CodexAppServerParams = (\n input: CodexAppServerCallInput,\n): CodexAppServerParamsResult => ({\n config: { effort: resolveGpt6ReasoningEffort(input.userConfig ?? {}) },\n});\n\nconst buildGpt5ResponsesParams: BuildResponsesParams = (input) => {\n const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;\n const commonOverrideConfig: Record<string, unknown> = {};\n\n if (userConfig.temperature !== undefined) {\n commonOverrideConfig.temperature = userConfig.temperature;\n }\n\n if (userConfig.responseFormat !== 'none' && expectedJsonObjectResponse) {\n commonOverrideConfig.text = { format: { type: 'json_object' } };\n }\n\n const effectiveReasoningEffort = resolveGpt5ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n // Use current-turn reasoning only. Switching to all_turns requires\n // responses.replayRawAssistantOutput to preserve reasoning history.\n reasoning: { effort: effectiveReasoningEffort, context: 'current_turn' },\n },\n };\n};\n\nconst buildGpt6ResponsesParams: BuildResponsesParams = (input) => {\n const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;\n const { responseFormat } = userConfig;\n const commonOverrideConfig: Record<string, unknown> = {};\n // GPT-6 does not support temperature; omit it from the serialized request.\n commonOverrideConfig.temperature = undefined;\n if (responseFormat !== 'none' && expectedJsonObjectResponse) {\n commonOverrideConfig.text = { format: { type: 'json_object' } };\n }\n\n const effectiveReasoningEffort = resolveGpt6ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n // Use current-turn reasoning only. Switching to all_turns requires\n // responses.replayRawAssistantOutput to preserve reasoning history.\n reasoning: { effort: effectiveReasoningEffort, context: 'current_turn' },\n },\n };\n};\n\nconst buildGpt5ChatCompletionParams = (\n input: ChatCompletionCallContext,\n): ChatCompletionParamsResult => {\n const { midsceneDefaults, userConfig } = input;\n const commonOverrideConfig: Record<string, unknown> = {};\n\n if (userConfig.temperature !== undefined) {\n commonOverrideConfig.temperature = userConfig.temperature;\n }\n\n // OpenAI Chat Completions JSON mode:\n // https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat#json-mode\n if (\n input.userConfig.responseFormat !== 'none' &&\n input.expectedJsonObjectResponse\n ) {\n commonOverrideConfig.response_format = { type: 'json_object' };\n }\n\n const effectiveReasoningEffort = resolveGpt5ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n reasoning_effort: effectiveReasoningEffort,\n },\n };\n};\n\nconst buildGpt6ChatCompletionParams = (\n input: ChatCompletionCallContext,\n): ChatCompletionParamsResult => {\n const { midsceneDefaults, userConfig, expectedJsonObjectResponse } = input;\n const { responseFormat } = userConfig;\n const commonOverrideConfig: Record<string, unknown> = {};\n // GPT-6 does not support temperature; omit it from the serialized request.\n commonOverrideConfig.temperature = undefined;\n if (responseFormat !== 'none' && expectedJsonObjectResponse) {\n commonOverrideConfig.response_format = { type: 'json_object' };\n }\n\n const effectiveReasoningEffort = resolveGpt6ReasoningEffort(userConfig);\n\n return {\n config: {\n ...midsceneDefaults,\n ...commonOverrideConfig,\n reasoning_effort: effectiveReasoningEffort,\n },\n };\n};\n\nexport const gptAdapters = {\n 'gpt-5': {\n supportedProtocols: ['openai-chat', 'openai-responses'],\n resolveImageDetail: originalImageDetailForDefaultIntent,\n responses: {\n replayRawAssistantOutput: false,\n unsupportedUserConfig: ['reasoningBudget'],\n buildResponsesParams: buildGpt5ResponsesParams,\n },\n buildCodexAppServerParams: buildGpt5CodexAppServerParams,\n chatCompletion: {\n unsupportedUserConfig: ['reasoningBudget'],\n buildChatCompletionParams: buildGpt5ChatCompletionParams,\n },\n locate: {\n element: {\n resultFormat: {\n coordinates: { shape: 'bbox', order: 'xy' },\n },\n },\n },\n },\n 'gpt-6': {\n supportedProtocols: ['openai-chat', 'openai-responses'],\n resolveImageDetail: originalImageDetailForDefaultIntent,\n responses: {\n replayRawAssistantOutput: false,\n unsupportedUserConfig: ['temperature', 'reasoningBudget'],\n buildResponsesParams: buildGpt6ResponsesParams,\n },\n buildCodexAppServerParams: buildGpt6CodexAppServerParams,\n chatCompletion: {\n unsupportedUserConfig: ['temperature', 'reasoningBudget'],\n buildChatCompletionParams: buildGpt6ChatCompletionParams,\n },\n locate: {\n element: {\n resultFormat: {\n coordinates: { shape: 'bbox', order: 'xy' },\n },\n },\n },\n },\n} satisfies Pick<\n Record<TModelFamily, ModelAdapterDefinition>,\n 'gpt-5' | 'gpt-6'\n>;\n"],"names":["originalImageDetailForDefaultIntent","input","isLocateIntent","resolveGpt5ReasoningEffort","reasoningEnabled","reasoningEffort","resolveGpt6ReasoningEffort","buildGpt5CodexAppServerParams","buildGpt6CodexAppServerParams","buildGpt5ResponsesParams","midsceneDefaults","userConfig","expectedJsonObjectResponse","commonOverrideConfig","undefined","effectiveReasoningEffort","buildGpt6ResponsesParams","responseFormat","buildGpt5ChatCompletionParams","buildGpt6ChatCompletionParams","gptAdapters"],"mappings":"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"}
@@ -63,7 +63,6 @@ const buildQwen25ChatCompletionParams = (input)=>{
63
63
  };
64
64
  };
65
65
  const qwen3Adapter = {
66
- acceptBbox2dAlias: true,
67
66
  chatCompletion: {
68
67
  unsupportedUserConfig: [
69
68
  'reasoningEffort'
@@ -81,6 +80,10 @@ const qwen3Adapter = {
81
80
  locate: {
82
81
  element: {
83
82
  resultFormat: {
83
+ resultKey: 'bbox_2d',
84
+ resultKeyAliases: [
85
+ 'bbox'
86
+ ],
84
87
  coordinates: qwen3BboxCoordinatesMeta
85
88
  }
86
89
  }
@@ -88,7 +91,6 @@ const qwen3Adapter = {
88
91
  };
89
92
  const qwenAdapters = {
90
93
  'qwen2.5-vl': {
91
- acceptBbox2dAlias: true,
92
94
  chatCompletion: {
93
95
  unsupportedUserConfig: [
94
96
  'reasoningEnabled',
@@ -103,6 +105,10 @@ const qwenAdapters = {
103
105
  locate: {
104
106
  element: {
105
107
  resultFormat: {
108
+ resultKey: 'bbox_2d',
109
+ resultKeyAliases: [
110
+ 'bbox'
111
+ ],
106
112
  coordinates: qwen25BboxCoordinatesMeta,
107
113
  parseRawLocateValue: parseQwen25RawLocateValue
108
114
  }