@xagent-ai/cli 1.2.2 → 1.3.1

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 (602) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  3. package/.github/release.yml +76 -0
  4. package/.github/workflows/ci.yml +75 -0
  5. package/.github/workflows/release.yml +103 -0
  6. package/.gitmodules +3 -3
  7. package/README.md +326 -280
  8. package/README_CN.md +325 -279
  9. package/dist/agents.d.ts.map +1 -1
  10. package/dist/agents.js +7 -3
  11. package/dist/agents.js.map +1 -1
  12. package/dist/ai-client/factory.d.ts +40 -0
  13. package/dist/ai-client/factory.d.ts.map +1 -0
  14. package/dist/ai-client/factory.js +100 -0
  15. package/dist/ai-client/factory.js.map +1 -0
  16. package/dist/ai-client/index.d.ts +20 -0
  17. package/dist/ai-client/index.d.ts.map +1 -0
  18. package/dist/ai-client/index.js +49 -0
  19. package/dist/ai-client/index.js.map +1 -0
  20. package/dist/ai-client/providers/anthropic.d.ts +57 -0
  21. package/dist/ai-client/providers/anthropic.d.ts.map +1 -0
  22. package/dist/ai-client/providers/anthropic.js +406 -0
  23. package/dist/ai-client/providers/anthropic.js.map +1 -0
  24. package/dist/ai-client/providers/openai.d.ts +57 -0
  25. package/dist/ai-client/providers/openai.d.ts.map +1 -0
  26. package/dist/ai-client/providers/openai.js +290 -0
  27. package/dist/ai-client/providers/openai.js.map +1 -0
  28. package/dist/ai-client/providers/remote.d.ts +110 -0
  29. package/dist/ai-client/providers/remote.d.ts.map +1 -0
  30. package/dist/ai-client/providers/remote.js +352 -0
  31. package/dist/ai-client/providers/remote.js.map +1 -0
  32. package/dist/ai-client/registry.d.ts +51 -0
  33. package/dist/ai-client/registry.d.ts.map +1 -0
  34. package/dist/ai-client/registry.js +81 -0
  35. package/dist/ai-client/registry.js.map +1 -0
  36. package/dist/ai-client/types.d.ts +274 -0
  37. package/dist/ai-client/types.d.ts.map +1 -0
  38. package/dist/ai-client/types.js +90 -0
  39. package/dist/ai-client/types.js.map +1 -0
  40. package/dist/ai-client-factory.d.ts +62 -0
  41. package/dist/ai-client-factory.d.ts.map +1 -0
  42. package/dist/ai-client-factory.js +157 -0
  43. package/dist/ai-client-factory.js.map +1 -0
  44. package/dist/auth.d.ts +23 -1
  45. package/dist/auth.d.ts.map +1 -1
  46. package/dist/auth.js +164 -174
  47. package/dist/auth.js.map +1 -1
  48. package/dist/cancellation.d.ts +5 -4
  49. package/dist/cancellation.d.ts.map +1 -1
  50. package/dist/cancellation.js +53 -32
  51. package/dist/cancellation.js.map +1 -1
  52. package/dist/checkpoint.d.ts +2 -1
  53. package/dist/checkpoint.d.ts.map +1 -1
  54. package/dist/checkpoint.js +39 -6
  55. package/dist/checkpoint.js.map +1 -1
  56. package/dist/cli.js +742 -29
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config.d.ts +10 -4
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +62 -25
  61. package/dist/config.js.map +1 -1
  62. package/dist/context-compressor.d.ts +82 -18
  63. package/dist/context-compressor.d.ts.map +1 -1
  64. package/dist/context-compressor.js +718 -154
  65. package/dist/context-compressor.js.map +1 -1
  66. package/dist/conversation.d.ts +1 -1
  67. package/dist/conversation.d.ts.map +1 -1
  68. package/dist/conversation.js +8 -7
  69. package/dist/conversation.js.map +1 -1
  70. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
  71. package/dist/gui-subagent/action-parser/actionParser.js +6 -4
  72. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
  73. package/dist/gui-subagent/agent/gui-agent.d.ts +39 -2
  74. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
  75. package/dist/gui-subagent/agent/gui-agent.js +189 -74
  76. package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
  77. package/dist/gui-subagent/index.d.ts +23 -1
  78. package/dist/gui-subagent/index.d.ts.map +1 -1
  79. package/dist/gui-subagent/index.js +6 -0
  80. package/dist/gui-subagent/index.js.map +1 -1
  81. package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -1
  82. package/dist/gui-subagent/operator/base-operator.js +0 -1
  83. package/dist/gui-subagent/operator/base-operator.js.map +1 -1
  84. package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -1
  85. package/dist/gui-subagent/operator/computer-operator.js +31 -8
  86. package/dist/gui-subagent/operator/computer-operator.js.map +1 -1
  87. package/dist/gui-subagent/types/actions.d.ts +1 -1
  88. package/dist/gui-subagent/types/actions.d.ts.map +1 -1
  89. package/dist/gui-subagent/types/actions.js +0 -1
  90. package/dist/gui-subagent/types/actions.js.map +1 -1
  91. package/dist/gui-subagent/types/operator.d.ts +1 -1
  92. package/dist/gui-subagent/types/operator.d.ts.map +1 -1
  93. package/dist/index.d.ts +1 -2
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +1 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/input-processor.d.ts.map +1 -1
  98. package/dist/input-processor.js +8 -5
  99. package/dist/input-processor.js.map +1 -1
  100. package/dist/logger.d.ts.map +1 -1
  101. package/dist/logger.js +1 -1
  102. package/dist/logger.js.map +1 -1
  103. package/dist/mcp.d.ts +7 -1
  104. package/dist/mcp.d.ts.map +1 -1
  105. package/dist/mcp.js +157 -49
  106. package/dist/mcp.js.map +1 -1
  107. package/dist/memory.d.ts.map +1 -1
  108. package/dist/memory.js +3 -3
  109. package/dist/memory.js.map +1 -1
  110. package/dist/output-util.d.ts +27 -0
  111. package/dist/output-util.d.ts.map +1 -0
  112. package/dist/output-util.js +74 -0
  113. package/dist/output-util.js.map +1 -0
  114. package/dist/retry.js +1 -1
  115. package/dist/retry.js.map +1 -1
  116. package/dist/ripgrep.d.ts +29 -0
  117. package/dist/ripgrep.d.ts.map +1 -0
  118. package/dist/ripgrep.js +294 -0
  119. package/dist/ripgrep.js.map +1 -0
  120. package/dist/sdk-output-adapter.d.ts +34 -1
  121. package/dist/sdk-output-adapter.d.ts.map +1 -1
  122. package/dist/sdk-output-adapter.js +67 -2
  123. package/dist/sdk-output-adapter.js.map +1 -1
  124. package/dist/sdk-session.d.ts.map +1 -1
  125. package/dist/sdk-session.js +2 -0
  126. package/dist/sdk-session.js.map +1 -1
  127. package/dist/session-manager.js +3 -3
  128. package/dist/session-manager.js.map +1 -1
  129. package/dist/session.d.ts +116 -6
  130. package/dist/session.d.ts.map +1 -1
  131. package/dist/session.js +1416 -448
  132. package/dist/session.js.map +1 -1
  133. package/dist/shell.d.ts +33 -0
  134. package/dist/shell.d.ts.map +1 -0
  135. package/dist/shell.js +126 -0
  136. package/dist/shell.js.map +1 -0
  137. package/dist/skill-installer.d.ts +38 -0
  138. package/dist/skill-installer.d.ts.map +1 -0
  139. package/dist/skill-installer.js +447 -0
  140. package/dist/skill-installer.js.map +1 -0
  141. package/dist/skill-invoker.d.ts +8 -2
  142. package/dist/skill-invoker.d.ts.map +1 -1
  143. package/dist/skill-invoker.js +36 -15
  144. package/dist/skill-invoker.js.map +1 -1
  145. package/dist/skill-loader.d.ts +8 -3
  146. package/dist/skill-loader.d.ts.map +1 -1
  147. package/dist/skill-loader.js +51 -48
  148. package/dist/skill-loader.js.map +1 -1
  149. package/dist/skill-manager.d.ts +85 -0
  150. package/dist/skill-manager.d.ts.map +1 -0
  151. package/dist/skill-manager.js +341 -0
  152. package/dist/skill-manager.js.map +1 -0
  153. package/dist/slash-commands.d.ts +39 -2
  154. package/dist/slash-commands.d.ts.map +1 -1
  155. package/dist/slash-commands.js +934 -305
  156. package/dist/slash-commands.js.map +1 -1
  157. package/dist/smart-approval.d.ts +20 -1
  158. package/dist/smart-approval.d.ts.map +1 -1
  159. package/dist/smart-approval.js +125 -56
  160. package/dist/smart-approval.js.map +1 -1
  161. package/dist/system-prompt-generator.d.ts +6 -0
  162. package/dist/system-prompt-generator.d.ts.map +1 -1
  163. package/dist/system-prompt-generator.js +86 -36
  164. package/dist/system-prompt-generator.js.map +1 -1
  165. package/dist/terminal.d.ts +28 -0
  166. package/dist/terminal.d.ts.map +1 -0
  167. package/dist/terminal.js +82 -0
  168. package/dist/terminal.js.map +1 -0
  169. package/dist/theme.d.ts.map +1 -1
  170. package/dist/theme.js +8 -7
  171. package/dist/theme.js.map +1 -1
  172. package/dist/tools.d.ts +38 -7
  173. package/dist/tools.d.ts.map +1 -1
  174. package/dist/tools.js +1249 -617
  175. package/dist/tools.js.map +1 -1
  176. package/dist/truncate.d.ts +55 -0
  177. package/dist/truncate.d.ts.map +1 -0
  178. package/dist/truncate.js +130 -0
  179. package/dist/truncate.js.map +1 -0
  180. package/dist/types.d.ts +84 -9
  181. package/dist/types.d.ts.map +1 -1
  182. package/dist/types.js +49 -0
  183. package/dist/types.js.map +1 -1
  184. package/dist/update.d.ts.map +1 -1
  185. package/dist/update.js +28 -36
  186. package/dist/update.js.map +1 -1
  187. package/dist/workflow.d.ts +5 -1
  188. package/dist/workflow.d.ts.map +1 -1
  189. package/dist/workflow.js +61 -49
  190. package/dist/workflow.js.map +1 -1
  191. package/docs/architecture/mcp-integration-guide.md +304 -194
  192. package/docs/architecture/overview.md +169 -169
  193. package/docs/architecture/tool-system-design.md +134 -134
  194. package/docs/cli/commands.md +349 -238
  195. package/docs/smart-mode.md +281 -281
  196. package/docs/third-party-models.md +440 -439
  197. package/find-skills/SKILL.md +133 -0
  198. package/package.json +91 -90
  199. package/scripts/install-ripgrep.js +241 -0
  200. package/src/agents.ts +7 -3
  201. package/src/ai-client/factory.ts +116 -0
  202. package/src/ai-client/index.ts +61 -0
  203. package/src/ai-client/providers/anthropic.ts +475 -0
  204. package/src/ai-client/providers/openai.ts +348 -0
  205. package/src/ai-client/providers/remote.ts +439 -0
  206. package/src/ai-client/registry.ts +97 -0
  207. package/src/ai-client/types.ts +364 -0
  208. package/src/ai-client-factory.ts +204 -0
  209. package/src/auth.ts +661 -614
  210. package/src/cancellation.ts +202 -176
  211. package/src/checkpoint.ts +255 -219
  212. package/src/cli.ts +1523 -743
  213. package/src/config.ts +341 -297
  214. package/src/context-compressor.ts +987 -290
  215. package/src/conversation.ts +290 -288
  216. package/src/gui-subagent/action-parser/actionParser.ts +318 -315
  217. package/src/gui-subagent/action-parser/constants.ts +14 -14
  218. package/src/gui-subagent/action-parser/index.ts +8 -8
  219. package/src/gui-subagent/action-parser/types.ts +31 -31
  220. package/src/gui-subagent/agent/gui-agent.ts +1234 -1089
  221. package/src/gui-subagent/agent/index.ts +5 -5
  222. package/src/gui-subagent/index.ts +185 -163
  223. package/src/gui-subagent/operator/base-operator.ts +244 -245
  224. package/src/gui-subagent/operator/computer-operator.ts +541 -520
  225. package/src/gui-subagent/operator/index.ts +6 -6
  226. package/src/gui-subagent/types/actions.ts +260 -262
  227. package/src/gui-subagent/types/index.ts +6 -6
  228. package/src/gui-subagent/types/operator.ts +106 -106
  229. package/src/gui-subagent/utils.ts +51 -51
  230. package/src/index.ts +17 -18
  231. package/src/input-processor.ts +8 -5
  232. package/src/logger.ts +436 -438
  233. package/src/mcp.ts +793 -682
  234. package/src/memory.ts +343 -344
  235. package/src/output-util.ts +80 -0
  236. package/src/retry.ts +1 -1
  237. package/src/ripgrep.ts +370 -0
  238. package/src/sdk-output-adapter.ts +842 -0
  239. package/src/sdk-session.ts +62 -0
  240. package/src/session-manager.ts +308 -308
  241. package/src/session.ts +1775 -573
  242. package/src/shell.ts +134 -0
  243. package/src/skill-installer.ts +518 -0
  244. package/src/skill-invoker.ts +959 -935
  245. package/src/skill-loader.ts +501 -496
  246. package/src/skill-manager.ts +385 -0
  247. package/src/slash-commands.ts +2189 -1389
  248. package/src/smart-approval.ts +193 -74
  249. package/src/system-prompt-generator.ts +91 -36
  250. package/src/terminal.ts +96 -0
  251. package/src/theme.ts +739 -738
  252. package/src/tools.ts +1790 -931
  253. package/src/truncate.ts +173 -0
  254. package/src/types.ts +337 -198
  255. package/src/update.ts +33 -40
  256. package/src/workflow.ts +521 -508
  257. package/test/cli-launch.test.ts +279 -0
  258. package/tsconfig.json +22 -22
  259. package/vitest.config.ts +21 -19
  260. package/dist/ai-client.d.ts +0 -86
  261. package/dist/ai-client.d.ts.map +0 -1
  262. package/dist/ai-client.js +0 -1372
  263. package/dist/ai-client.js.map +0 -1
  264. package/dist/gui-subagent/operator/browser-operator.d.ts +0 -36
  265. package/dist/gui-subagent/operator/browser-operator.d.ts.map +0 -1
  266. package/dist/gui-subagent/operator/browser-operator.js +0 -306
  267. package/dist/gui-subagent/operator/browser-operator.js.map +0 -1
  268. package/dist/gui-subagent/operator/desktop-operator.d.ts +0 -55
  269. package/dist/gui-subagent/operator/desktop-operator.d.ts.map +0 -1
  270. package/dist/gui-subagent/operator/desktop-operator.js +0 -527
  271. package/dist/gui-subagent/operator/desktop-operator.js.map +0 -1
  272. package/dist/hook.d.ts +0 -73
  273. package/dist/hook.d.ts.map +0 -1
  274. package/dist/hook.js +0 -156
  275. package/dist/hook.js.map +0 -1
  276. package/dist/input-history.d.ts +0 -24
  277. package/dist/input-history.d.ts.map +0 -1
  278. package/dist/input-history.js +0 -94
  279. package/dist/input-history.js.map +0 -1
  280. package/dist/keyboard-manager.d.ts +0 -151
  281. package/dist/keyboard-manager.d.ts.map +0 -1
  282. package/dist/keyboard-manager.js +0 -396
  283. package/dist/keyboard-manager.js.map +0 -1
  284. package/dist/print-system-prompt.d.ts +0 -2
  285. package/dist/print-system-prompt.d.ts.map +0 -1
  286. package/dist/print-system-prompt.js +0 -40
  287. package/dist/print-system-prompt.js.map +0 -1
  288. package/dist/remote-ai-client.d.ts +0 -104
  289. package/dist/remote-ai-client.d.ts.map +0 -1
  290. package/dist/remote-ai-client.js +0 -552
  291. package/dist/remote-ai-client.js.map +0 -1
  292. package/dist/sdk-session-v2.d.ts +0 -13
  293. package/dist/sdk-session-v2.d.ts.map +0 -1
  294. package/dist/sdk-session-v2.js +0 -46
  295. package/dist/sdk-session-v2.js.map +0 -1
  296. package/dist/test-boundary-conditions.d.ts.map +0 -1
  297. package/dist/test-boundary-conditions.js.map +0 -1
  298. package/dist/test-cancellation-fix.d.ts.map +0 -1
  299. package/dist/test-cancellation-fix.js.map +0 -1
  300. package/dist/test-input-history.d.ts.map +0 -1
  301. package/dist/test-input-history.js.map +0 -1
  302. package/dist/test-interaction-flow.d.ts.map +0 -1
  303. package/dist/test-interaction-flow.js.map +0 -1
  304. package/dist/test-quick.d.ts.map +0 -1
  305. package/dist/test-quick.js.map +0 -1
  306. package/dist/test-user-interaction.d.ts.map +0 -1
  307. package/dist/test-user-interaction.js.map +0 -1
  308. package/dist/tools/edit-diff.d.ts +0 -32
  309. package/dist/tools/edit-diff.d.ts.map +0 -1
  310. package/dist/tools/edit-diff.js +0 -185
  311. package/dist/tools/edit-diff.js.map +0 -1
  312. package/dist/tools/edit.d.ts +0 -11
  313. package/dist/tools/edit.d.ts.map +0 -1
  314. package/dist/tools/edit.js +0 -129
  315. package/dist/tools/edit.js.map +0 -1
  316. package/dist/unified-session.d.ts +0 -42
  317. package/dist/unified-session.d.ts.map +0 -1
  318. package/dist/unified-session.js +0 -271
  319. package/dist/unified-session.js.map +0 -1
  320. package/skills/.claude-plugin/marketplace.json +0 -45
  321. package/skills/README.md +0 -94
  322. package/skills/THIRD_PARTY_NOTICES.md +0 -405
  323. package/skills/skills/algorithmic-art/LICENSE.txt +0 -202
  324. package/skills/skills/algorithmic-art/SKILL.md +0 -405
  325. package/skills/skills/algorithmic-art/templates/generator_template.js +0 -223
  326. package/skills/skills/algorithmic-art/templates/viewer.html +0 -599
  327. package/skills/skills/brand-guidelines/LICENSE.txt +0 -202
  328. package/skills/skills/brand-guidelines/SKILL.md +0 -73
  329. package/skills/skills/canvas-design/LICENSE.txt +0 -202
  330. package/skills/skills/canvas-design/SKILL.md +0 -130
  331. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  332. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  333. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  334. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  335. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  336. package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  337. package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  338. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  339. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  340. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  341. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  342. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  343. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  344. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  345. package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  346. package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  347. package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  348. package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  349. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  350. package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  351. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  352. package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  353. package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  354. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  355. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  356. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  357. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  358. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  359. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  360. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  361. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  362. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  363. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  364. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  365. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  366. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  367. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  368. package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  369. package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  370. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  371. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  372. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  373. package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  374. package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  375. package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  376. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  377. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  378. package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  379. package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  380. package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  381. package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  382. package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  383. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  384. package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  385. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  386. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  387. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  388. package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  389. package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  390. package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  391. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  392. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  393. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  394. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  395. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  396. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  397. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  398. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  399. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  400. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  401. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  402. package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  403. package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  404. package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  405. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  406. package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  407. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  408. package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  409. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  410. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  411. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  412. package/skills/skills/doc-coauthoring/SKILL.md +0 -375
  413. package/skills/skills/docx/LICENSE.txt +0 -30
  414. package/skills/skills/docx/SKILL.md +0 -197
  415. package/skills/skills/docx/docx-js.md +0 -350
  416. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  417. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  418. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  419. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  420. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  421. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  422. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  423. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  424. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  425. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  426. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  427. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  428. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  429. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  430. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  431. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  432. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  433. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  434. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  435. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  436. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  437. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  438. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  439. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  440. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  441. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  442. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  443. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  444. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  445. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  446. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  447. package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  448. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  449. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  450. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  451. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  452. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  453. package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  454. package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  455. package/skills/skills/docx/ooxml/scripts/pack.py +0 -159
  456. package/skills/skills/docx/ooxml/scripts/unpack.py +0 -29
  457. package/skills/skills/docx/ooxml/scripts/validate.py +0 -69
  458. package/skills/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  459. package/skills/skills/docx/ooxml/scripts/validation/base.py +0 -951
  460. package/skills/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  461. package/skills/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  462. package/skills/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  463. package/skills/skills/docx/ooxml.md +0 -610
  464. package/skills/skills/docx/scripts/__init__.py +0 -1
  465. package/skills/skills/docx/scripts/document.py +0 -1276
  466. package/skills/skills/docx/scripts/templates/comments.xml +0 -3
  467. package/skills/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  468. package/skills/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  469. package/skills/skills/docx/scripts/templates/commentsIds.xml +0 -3
  470. package/skills/skills/docx/scripts/templates/people.xml +0 -3
  471. package/skills/skills/docx/scripts/utilities.py +0 -374
  472. package/skills/skills/frontend-design/LICENSE.txt +0 -177
  473. package/skills/skills/frontend-design/SKILL.md +0 -42
  474. package/skills/skills/internal-comms/LICENSE.txt +0 -202
  475. package/skills/skills/internal-comms/SKILL.md +0 -32
  476. package/skills/skills/internal-comms/examples/3p-updates.md +0 -47
  477. package/skills/skills/internal-comms/examples/company-newsletter.md +0 -65
  478. package/skills/skills/internal-comms/examples/faq-answers.md +0 -30
  479. package/skills/skills/internal-comms/examples/general-comms.md +0 -16
  480. package/skills/skills/mcp-builder/LICENSE.txt +0 -202
  481. package/skills/skills/mcp-builder/SKILL.md +0 -236
  482. package/skills/skills/mcp-builder/reference/evaluation.md +0 -602
  483. package/skills/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  484. package/skills/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  485. package/skills/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  486. package/skills/skills/mcp-builder/scripts/connections.py +0 -151
  487. package/skills/skills/mcp-builder/scripts/evaluation.py +0 -373
  488. package/skills/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  489. package/skills/skills/mcp-builder/scripts/requirements.txt +0 -2
  490. package/skills/skills/pdf/LICENSE.txt +0 -30
  491. package/skills/skills/pdf/SKILL.md +0 -294
  492. package/skills/skills/pdf/forms.md +0 -205
  493. package/skills/skills/pdf/reference.md +0 -612
  494. package/skills/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  495. package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  496. package/skills/skills/pdf/scripts/check_fillable_fields.py +0 -12
  497. package/skills/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  498. package/skills/skills/pdf/scripts/create_validation_image.py +0 -41
  499. package/skills/skills/pdf/scripts/extract_form_field_info.py +0 -152
  500. package/skills/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  501. package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  502. package/skills/skills/pptx/LICENSE.txt +0 -30
  503. package/skills/skills/pptx/SKILL.md +0 -484
  504. package/skills/skills/pptx/html2pptx.md +0 -625
  505. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  506. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  507. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  508. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  509. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  510. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  511. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  512. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  513. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  514. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  515. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  516. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  517. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  518. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  519. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  520. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  521. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  522. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  523. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  524. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  525. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  526. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  527. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  528. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  529. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  530. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  531. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  532. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  533. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  534. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  535. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  536. package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +0 -75
  537. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  538. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  539. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  540. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  541. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  542. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  543. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  544. package/skills/skills/pptx/ooxml/scripts/pack.py +0 -159
  545. package/skills/skills/pptx/ooxml/scripts/unpack.py +0 -29
  546. package/skills/skills/pptx/ooxml/scripts/validate.py +0 -69
  547. package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +0 -15
  548. package/skills/skills/pptx/ooxml/scripts/validation/base.py +0 -951
  549. package/skills/skills/pptx/ooxml/scripts/validation/docx.py +0 -274
  550. package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +0 -315
  551. package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +0 -279
  552. package/skills/skills/pptx/ooxml.md +0 -427
  553. package/skills/skills/pptx/scripts/html2pptx.js +0 -979
  554. package/skills/skills/pptx/scripts/inventory.py +0 -1020
  555. package/skills/skills/pptx/scripts/rearrange.py +0 -231
  556. package/skills/skills/pptx/scripts/replace.py +0 -385
  557. package/skills/skills/pptx/scripts/thumbnail.py +0 -450
  558. package/skills/skills/skill-creator/LICENSE.txt +0 -202
  559. package/skills/skills/skill-creator/SKILL.md +0 -356
  560. package/skills/skills/skill-creator/references/output-patterns.md +0 -82
  561. package/skills/skills/skill-creator/references/workflows.md +0 -28
  562. package/skills/skills/skill-creator/scripts/init_skill.py +0 -303
  563. package/skills/skills/skill-creator/scripts/package_skill.py +0 -110
  564. package/skills/skills/skill-creator/scripts/quick_validate.py +0 -95
  565. package/skills/skills/slack-gif-creator/LICENSE.txt +0 -202
  566. package/skills/skills/slack-gif-creator/SKILL.md +0 -254
  567. package/skills/skills/slack-gif-creator/core/easing.py +0 -234
  568. package/skills/skills/slack-gif-creator/core/frame_composer.py +0 -176
  569. package/skills/skills/slack-gif-creator/core/gif_builder.py +0 -269
  570. package/skills/skills/slack-gif-creator/core/validators.py +0 -136
  571. package/skills/skills/slack-gif-creator/requirements.txt +0 -4
  572. package/skills/skills/theme-factory/LICENSE.txt +0 -202
  573. package/skills/skills/theme-factory/SKILL.md +0 -59
  574. package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
  575. package/skills/skills/theme-factory/themes/arctic-frost.md +0 -19
  576. package/skills/skills/theme-factory/themes/botanical-garden.md +0 -19
  577. package/skills/skills/theme-factory/themes/desert-rose.md +0 -19
  578. package/skills/skills/theme-factory/themes/forest-canopy.md +0 -19
  579. package/skills/skills/theme-factory/themes/golden-hour.md +0 -19
  580. package/skills/skills/theme-factory/themes/midnight-galaxy.md +0 -19
  581. package/skills/skills/theme-factory/themes/modern-minimalist.md +0 -19
  582. package/skills/skills/theme-factory/themes/ocean-depths.md +0 -19
  583. package/skills/skills/theme-factory/themes/sunset-boulevard.md +0 -19
  584. package/skills/skills/theme-factory/themes/tech-innovation.md +0 -19
  585. package/skills/skills/web-artifacts-builder/LICENSE.txt +0 -202
  586. package/skills/skills/web-artifacts-builder/SKILL.md +0 -74
  587. package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  588. package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  589. package/skills/skills/webapp-testing/LICENSE.txt +0 -202
  590. package/skills/skills/webapp-testing/SKILL.md +0 -96
  591. package/skills/skills/webapp-testing/examples/console_logging.py +0 -35
  592. package/skills/skills/webapp-testing/examples/element_discovery.py +0 -40
  593. package/skills/skills/webapp-testing/examples/static_html_automation.py +0 -33
  594. package/skills/skills/webapp-testing/scripts/with_server.py +0 -106
  595. package/skills/skills/xlsx/LICENSE.txt +0 -30
  596. package/skills/skills/xlsx/SKILL.md +0 -289
  597. package/skills/skills/xlsx/recalc.py +0 -178
  598. package/skills/spec/agent-skills-spec.md +0 -3
  599. package/skills/template/SKILL.md +0 -6
  600. package/src/ai-client.ts +0 -1560
  601. package/src/remote-ai-client.ts +0 -664
  602. /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
package/dist/ai-client.js DELETED
@@ -1,1372 +0,0 @@
1
- import axios from 'axios';
2
- import https from 'https';
3
- import { withRetry } from './retry.js';
4
- // Markdown rendering helper function
5
- export function renderMarkdown(text) {
6
- // Code block rendering
7
- text = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
8
- return `\n┌─[${lang || 'code'}]\n${code.trim().split('\n').map((l) => '│ ' + l).join('\n')}\n└─\n`;
9
- });
10
- // Inline code rendering
11
- text = text.replace(/`([^`]+)`/g, '`$1`');
12
- // Bold rendering
13
- text = text.replace(/\*\*([^*]+)\*\*/g, '●$1○');
14
- // Italic rendering
15
- text = text.replace(/\*([^*]+)\*/g, '/$1/');
16
- // List rendering
17
- text = text.replace(/^- (.*$)/gm, '○ $1');
18
- text = text.replace(/^\d+\. (.*$)/gm, '• $1');
19
- // Heading rendering
20
- text = text.replace(/^### (.*$)/gm, '\n━━━ $1 ━━━\n');
21
- text = text.replace(/^## (.*$)/gm, '\n━━━━━ $1 ━━━━━\n');
22
- text = text.replace(/^# (.*$)/gm, '\n━━━━━━━ $1 ━━━━━━━\n');
23
- // Quote rendering
24
- text = text.replace(/^> (.*$)/gm, '│ │ $1');
25
- // Link rendering
26
- text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '[$1]($2)');
27
- return text;
28
- }
29
- // Format message content
30
- function formatMessageContent(content) {
31
- if (typeof content === 'string') {
32
- return renderMarkdown(content);
33
- }
34
- const parts = [];
35
- let hasToolUse = false;
36
- for (const block of content) {
37
- if (block.type === 'text') {
38
- parts.push(renderMarkdown(block.text || ''));
39
- }
40
- else if (block.type === 'tool_use') {
41
- hasToolUse = true;
42
- parts.push(`[🔧 TOOL CALL PENDING: ${block.name}]`);
43
- }
44
- else if (block.type === 'tool_result') {
45
- const result = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
46
- parts.push(`[✅ TOOL RESULT]\n${result}`);
47
- }
48
- else if (block.type === 'thinking') {
49
- parts.push(`[🧠 THINKING]\n${block.thinking || ''}`);
50
- }
51
- }
52
- if (hasToolUse) {
53
- parts.push('\n[⚠️ Note: Tool calls are executed by the framework, not displayed here]');
54
- }
55
- return parts.join('\n');
56
- }
57
- // Display messages by category
58
- export function displayMessages(messages, systemPrompt) {
59
- const roleColors = {
60
- system: '🟫 SYSTEM',
61
- user: '👤 USER',
62
- assistant: '🤖 ASSISTANT',
63
- tool: '🔧 TOOL'
64
- };
65
- // Display system message first (if there's a separate systemPrompt parameter)
66
- if (systemPrompt) {
67
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
68
- console.log('│ 🟫 SYSTEM │');
69
- console.log('├─────────────────────────────────────────────────────────────┤');
70
- console.log(renderMarkdown(systemPrompt).split('\n').map((l) => '│ ' + l).join('\n'));
71
- console.log('└─────────────────────────────────────────────────────────────┘');
72
- }
73
- // Iterate through all messages
74
- for (let i = 0; i < messages.length; i++) {
75
- const msg = messages[i];
76
- const role = msg.role;
77
- const roleLabel = roleColors[role] || `● ${role.toUpperCase()}`;
78
- console.log(`\n┌─────────────────────────────────────────────────────────────┐`);
79
- console.log(`│ ${roleLabel} (${i + 1}/${messages.length}) │`);
80
- console.log('├─────────────────────────────────────────────────────────────┤');
81
- // Display reasoning_content (if present) - check both camelCase and snake_case
82
- const reasoningContent = msg.reasoningContent || msg.reasoning_content;
83
- if (reasoningContent) {
84
- console.log('│ 🧠 REASONING:');
85
- console.log('│ ───────────────────────────────────────────────────────────');
86
- const reasoningLines = renderMarkdown(reasoningContent).split('\n');
87
- for (const line of reasoningLines.slice(0, 20)) {
88
- console.log('│ ' + line.slice(0, 62));
89
- }
90
- if (reasoningContent.length > 1000)
91
- console.log('│ ... (truncated)');
92
- console.log('│ ───────────────────────────────────────────────────────────');
93
- }
94
- // Display main content
95
- const content = formatMessageContent(msg.content);
96
- const lines = content.split('\n');
97
- for (const line of lines.slice(0, 50)) {
98
- console.log('│ ' + line.slice(0, 62));
99
- }
100
- if (lines.length > 50) {
101
- console.log('│ ... (' + (lines.length - 50) + ' more lines)');
102
- }
103
- console.log('└─────────────────────────────────────────────────────────────┘');
104
- }
105
- }
106
- // Format response content
107
- function formatResponseContent(content) {
108
- if (typeof content === 'string') {
109
- return renderMarkdown(content);
110
- }
111
- const parts = [];
112
- let hasToolUse = false;
113
- for (const block of content) {
114
- if (block.type === 'text') {
115
- parts.push(renderMarkdown(block.text || ''));
116
- }
117
- else if (block.type === 'tool_use') {
118
- hasToolUse = true;
119
- // Tool calls are handled via tool_calls field, not shown here
120
- }
121
- else if (block.type === 'tool_result') {
122
- const result = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
123
- parts.push(`[✅ TOOL RESULT]\n${result}`);
124
- }
125
- else if (block.type === 'thinking') {
126
- parts.push(`[🧠 THINKING]\n${block.thinking || ''}`);
127
- }
128
- else if (block.type === 'image') {
129
- parts.push('[IMAGE]');
130
- }
131
- }
132
- if (hasToolUse) {
133
- parts.push('\n[⚠️ Note: Tool calls are executed via tool_calls field, not shown here]');
134
- }
135
- return parts.join('\n');
136
- }
137
- // Detect if it's Anthropic compatible API(Use x-api-key authentication header)
138
- function isAnthropicCompatible(baseUrl) {
139
- return baseUrl.includes('anthropic') ||
140
- baseUrl.includes('minimaxi.com') ||
141
- baseUrl.includes('minimax.chat');
142
- }
143
- // MiniMax API path detection
144
- function detectMiniMaxAPI(baseUrl) {
145
- return baseUrl.includes('minimax.chat') ||
146
- baseUrl.includes('minimaxi.com');
147
- }
148
- // Get correct endpoint path for MiniMax
149
- function getMiniMaxEndpoint(baseUrl) {
150
- // MiniMax Anthropic format: https://api.minimax.chat/anthropic + /v1/messages
151
- if (baseUrl.includes('/anthropic')) {
152
- return { endpoint: '/v1/messages', format: 'anthropic' };
153
- }
154
- // MiniMax OpenAI format: https://api.minimaxi.com/v1 + /chat/completions
155
- if (baseUrl.includes('/v1') && !baseUrl.includes('/anthropic')) {
156
- return { endpoint: '/chat/completions', format: 'openai' };
157
- }
158
- // Default to Anthropic format
159
- return { endpoint: '/v1/messages', format: 'anthropic' };
160
- }
161
- export class AIClient {
162
- client;
163
- authConfig;
164
- constructor(authConfig) {
165
- this.authConfig = authConfig;
166
- const isMiniMax = detectMiniMaxAPI(authConfig.baseUrl || '');
167
- const isAnthropicOfficial = !isMiniMax && isAnthropicCompatible(authConfig.baseUrl || '');
168
- const headers = {
169
- 'Content-Type': 'application/json'
170
- };
171
- if (isMiniMax) {
172
- // MiniMax: Use x-api-key authentication header
173
- headers['x-api-key'] = authConfig.apiKey || '';
174
- headers['anthropic-version'] = '2023-06-01';
175
- }
176
- else if (isAnthropicOfficial) {
177
- // Anthropic official: Use x-api-key authentication header
178
- headers['x-api-key'] = authConfig.apiKey || '';
179
- headers['anthropic-version'] = '2023-06-01';
180
- headers['anthropic-dangerous-direct-browser-access'] = 'true';
181
- }
182
- else {
183
- // Other OpenAI compatible: 使用 Bearer token
184
- headers['Authorization'] = `Bearer ${authConfig.apiKey}`;
185
- }
186
- this.client = axios.create({
187
- baseURL: authConfig.baseUrl,
188
- headers,
189
- timeout: 300000,
190
- httpsAgent: new https.Agent({ rejectUnauthorized: false })
191
- });
192
- }
193
- // Convert OpenAI format messages to Anthropic format
194
- convertToAnthropicFormat(messages, systemPrompt) {
195
- const systemMessages = messages.filter(m => m.role === 'system');
196
- const otherMessages = messages.filter(m => m.role !== 'system');
197
- const systemContent = systemMessages[0]?.content;
198
- const system = systemPrompt || (typeof systemContent === 'string' ? systemContent : '');
199
- const anthropicMessages = [];
200
- for (const msg of otherMessages) {
201
- const blocks = [];
202
- if (typeof msg.content === 'string') {
203
- blocks.push({ type: 'text', text: msg.content });
204
- }
205
- else if (Array.isArray(msg.content)) {
206
- for (const block of msg.content) {
207
- if (block.type === 'text' && 'text' in block) {
208
- blocks.push({ type: 'text', text: block.text });
209
- }
210
- else if (block.type === 'tool_use') {
211
- blocks.push({
212
- type: 'tool_use',
213
- id: block.id,
214
- name: block.function?.name || block.name,
215
- input: block.function?.arguments || block.input
216
- });
217
- }
218
- else if (block.type === 'tool_result') {
219
- blocks.push({
220
- type: 'tool_result',
221
- tool_use_id: block.tool_call_id || block.tool_use_id,
222
- content: typeof block.content === 'string'
223
- ? block.content
224
- : JSON.stringify(block.content)
225
- });
226
- }
227
- else if (block.type === 'thinking') {
228
- blocks.push({ type: 'thinking', thinking: block.thinking });
229
- }
230
- }
231
- }
232
- // Handle tool_calls (OpenAI 格式)
233
- if (msg.tool_calls) {
234
- for (const tc of msg.tool_calls) {
235
- blocks.push({
236
- type: 'tool_use',
237
- id: tc.id,
238
- name: tc.function?.name,
239
- input: tc.function?.arguments ? (typeof tc.function.arguments === 'string' ? JSON.parse(tc.function.arguments) : tc.function.arguments) : {}
240
- });
241
- }
242
- }
243
- if (blocks.length > 0) {
244
- anthropicMessages.push({
245
- role: msg.role === 'tool' ? 'user' : msg.role,
246
- content: blocks
247
- });
248
- }
249
- }
250
- return { system, messages: anthropicMessages };
251
- }
252
- async chatCompletion(messages, options = {}) {
253
- const model = options.model || this.authConfig.modelName || 'gpt-4';
254
- const isMiniMax = detectMiniMaxAPI(this.authConfig.baseUrl || '');
255
- if (isMiniMax) {
256
- return this.minimaxChatCompletion(messages, options);
257
- }
258
- const isAnthropic = isAnthropicCompatible(this.authConfig.baseUrl || '');
259
- if (isAnthropic) {
260
- return this.anthropicNativeChatCompletion(messages, options);
261
- }
262
- // OpenAI format request
263
- const requestBody = {
264
- model,
265
- messages,
266
- temperature: options.temperature ?? 0.7,
267
- stream: options.stream ?? false
268
- };
269
- if (options.maxTokens && options.maxTokens > 0) {
270
- requestBody.max_tokens = options.maxTokens;
271
- }
272
- if (options.tools && options.tools.length > 0) {
273
- requestBody.tools = options.tools;
274
- requestBody.tool_choice = options.toolChoice || 'auto';
275
- }
276
- if (options.thinkingTokens && options.thinkingTokens > 0) {
277
- requestBody.max_completion_tokens = options.thinkingTokens;
278
- }
279
- // Debug output(受showAIDebugInfo配置控制)
280
- const showDebug = this.authConfig.showAIDebugInfo ?? false;
281
- if (showDebug) {
282
- console.log('\n╔══════════════════════════════════════════════════════════╗');
283
- console.log('║ AI REQUEST DEBUG ║');
284
- console.log('╚══════════════════════════════════════════════════════════╝');
285
- console.log(`📦 Model: ${model}`);
286
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
287
- console.log(`💬 Total Messages: ${messages.length} items`);
288
- if (options.temperature !== undefined)
289
- console.log(`🌡️ Temperature: ${options.temperature}`);
290
- if (options.maxTokens)
291
- console.log(`📏 Max Tokens: ${options.maxTokens}`);
292
- if (options.tools?.length)
293
- console.log(`🔧 Tools: ${options.tools.length} items`);
294
- if (options.thinkingTokens)
295
- console.log(`🧠 Thinking Tokens: ${options.thinkingTokens}`);
296
- console.log('─'.repeat(60));
297
- // Separate system messages
298
- const systemMsgs = messages.filter(m => m.role === 'system');
299
- const otherMsgs = messages.filter(m => m.role !== 'system');
300
- if (systemMsgs.length > 0) {
301
- const systemContent = typeof systemMsgs[0].content === 'string'
302
- ? systemMsgs[0].content
303
- : formatMessageContent(systemMsgs[0].content);
304
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
305
- console.log('│ 🟫 SYSTEM │');
306
- console.log('├─────────────────────────────────────────────────────────────┤');
307
- console.log(renderMarkdown(systemContent).split('\n').map(l => '│ ' + l).join('\n'));
308
- console.log('└─────────────────────────────────────────────────────────────┘');
309
- }
310
- displayMessages(otherMsgs);
311
- console.log('\n📤 Sending request to API...\n');
312
- }
313
- try {
314
- const response = await this.client.post('/chat/completions', requestBody);
315
- if (showDebug) {
316
- console.log('\n╔══════════════════════════════════════════════════════════╗');
317
- console.log('║ AI RESPONSE DEBUG ║');
318
- console.log('╚══════════════════════════════════════════════════════════╝');
319
- console.log(`🆔 ID: ${response.data.id}`);
320
- console.log(`🤖 Model: ${response.data.model}`);
321
- const usage = response.data.usage;
322
- if (usage) {
323
- console.log(`📊 Tokens: ${usage.prompt_tokens} (prompt) + ${usage.completion_tokens} (completion) = ${usage.total_tokens} (total)`);
324
- }
325
- const choice = response.data.choices?.[0];
326
- if (choice) {
327
- console.log(`🏁 Finish Reason: ${choice.finish_reason}`);
328
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
329
- console.log('│ 🤖 ASSISTANT │');
330
- console.log('├─────────────────────────────────────────────────────────────┤');
331
- // Display reasoning_content(如果有)
332
- if (choice.message.reasoning_content) {
333
- console.log('│ 🧠 REASONING:');
334
- console.log('│ ───────────────────────────────────────────────────────────');
335
- const reasoningLines = renderMarkdown(choice.message.reasoning_content).split('\n');
336
- for (const line of reasoningLines.slice(0, 15)) {
337
- console.log('│ ' + line.slice(0, 62));
338
- }
339
- if (choice.message.reasoning_content.length > 800)
340
- console.log('│ ... (truncated)');
341
- console.log('│ ───────────────────────────────────────────────────────────');
342
- }
343
- // Display main content
344
- const content = formatResponseContent(choice.message.content);
345
- const lines = content.split('\n');
346
- console.log('│ 💬 CONTENT:');
347
- console.log('│ ───────────────────────────────────────────────────────────');
348
- for (const line of lines.slice(0, 40)) {
349
- console.log('│ ' + line.slice(0, 62));
350
- }
351
- if (lines.length > 40) {
352
- console.log(`│ ... (${lines.length - 40} more lines)`);
353
- }
354
- console.log('└─────────────────────────────────────────────────────────────┘');
355
- }
356
- console.log('╔══════════════════════════════════════════════════════════╗');
357
- console.log('║ RESPONSE ENDED ║');
358
- console.log('╚══════════════════════════════════════════════════════════╝\n');
359
- }
360
- return response.data;
361
- }
362
- catch (error) {
363
- // Check if error is retryable (timeout, network error, or 5xx)
364
- const isRetryable = this.isRetryableError(error);
365
- if (!isRetryable) {
366
- if (error.response) {
367
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
368
- }
369
- else if (error.request) {
370
- throw new Error('Network error: No response received from server');
371
- }
372
- else {
373
- throw new Error(`Request error: ${error.message}`);
374
- }
375
- }
376
- // Retry with exponential backoff
377
- const retryResult = await withRetry(async () => {
378
- const response = await this.client.post('/chat/completions', requestBody);
379
- if (showDebug) {
380
- console.log('\n╔══════════════════════════════════════════════════════════╗');
381
- console.log('║ AI RESPONSE DEBUG (RETRY) ║');
382
- console.log('╚══════════════════════════════════════════════════════════╝');
383
- console.log(`🆔 ID: ${response.data.id}`);
384
- console.log(`🤖 Model: ${response.data.model}`);
385
- const usage = response.data.usage;
386
- if (usage) {
387
- console.log(`📊 Tokens: ${usage.prompt_tokens} (prompt) + ${usage.completion_tokens} (completion) = ${usage.total_tokens} (total)`);
388
- }
389
- console.log('╔══════════════════════════════════════════════════════════╗');
390
- console.log('║ RESPONSE ENDED ║');
391
- console.log('╚══════════════════════════════════════════════════════════╝\n');
392
- }
393
- return response.data;
394
- }, { maxRetries: 3, baseDelay: 1000, maxDelay: 10000, jitter: true });
395
- if (!retryResult.success) {
396
- throw retryResult.error || new Error('Retry failed');
397
- }
398
- if (!retryResult.data) {
399
- throw new Error('Retry returned empty response');
400
- }
401
- return retryResult.data;
402
- }
403
- }
404
- isRetryableError(error) {
405
- // Timeout or network error (no response received)
406
- if (error.code === 'ECONNABORTED' || !error.response) {
407
- return true;
408
- }
409
- // 5xx server errors
410
- if (error.response?.status && error.response.status >= 500) {
411
- return true;
412
- }
413
- // 429 rate limit
414
- if (error.response?.status === 429) {
415
- return true;
416
- }
417
- return false;
418
- }
419
- // Anthropic official原生 API(使用 /v1/messages 端点)
420
- async anthropicNativeChatCompletion(messages, options = {}) {
421
- const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
422
- const requestBody = {
423
- model: options.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
424
- messages: anthropicMessages,
425
- temperature: options.temperature ?? 1.0,
426
- stream: false,
427
- max_tokens: options.maxTokens || 4096
428
- };
429
- if (system) {
430
- requestBody.system = system;
431
- }
432
- // Anthropic native tool format
433
- if (options.tools && options.tools.length > 0) {
434
- requestBody.tools = options.tools.map(tool => ({
435
- name: tool.function.name,
436
- description: tool.function.description,
437
- input_schema: tool.function.parameters || { type: 'object', properties: {} }
438
- }));
439
- // Convert tool_choice 从 OpenAI 格式到 Anthropic 格式
440
- const toolChoice = options.toolChoice;
441
- if (toolChoice === 'none') {
442
- requestBody.tool_choice = { type: 'auto' };
443
- }
444
- else if (toolChoice && typeof toolChoice === 'object') {
445
- if (toolChoice.type === 'function' && toolChoice.function) {
446
- requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
447
- }
448
- else {
449
- requestBody.tool_choice = { type: 'auto' };
450
- }
451
- }
452
- else {
453
- requestBody.tool_choice = { type: 'auto' };
454
- }
455
- }
456
- // Anthropic thinking mode
457
- if (options.thinkingTokens && options.thinkingTokens > 0) {
458
- requestBody.thinking = { type: 'enabled', budget_tokens: options.thinkingTokens };
459
- }
460
- // Debug output(受showAIDebugInfo配置控制)
461
- const showDebug = this.authConfig.showAIDebugInfo ?? false;
462
- if (showDebug) {
463
- console.log('\n╔══════════════════════════════════════════════════════════╗');
464
- console.log('║ AI REQUEST DEBUG (ANTHROPIC) ║');
465
- console.log('╚══════════════════════════════════════════════════════════╝');
466
- console.log(`📦 Model: ${requestBody.model}`);
467
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
468
- console.log(`💬 Total Messages: ${anthropicMessages.length} items`);
469
- if (requestBody.temperature)
470
- console.log(`🌡️ Temperature: ${requestBody.temperature}`);
471
- if (requestBody.max_tokens)
472
- console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
473
- if (requestBody.tools)
474
- console.log(`🔧 Tools: ${requestBody.tools.length} items`);
475
- if (requestBody.thinking)
476
- console.log(`🧠 Thinking Budget: ${requestBody.thinking.budget_tokens}`);
477
- console.log('─'.repeat(60));
478
- // Display system messages
479
- if (system) {
480
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
481
- console.log('│ 🟫 SYSTEM │');
482
- console.log('├─────────────────────────────────────────────────────────────┤');
483
- console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
484
- console.log('└─────────────────────────────────────────────────────────────┘');
485
- }
486
- // Display user and assistant messages
487
- displayMessages(anthropicMessages);
488
- console.log('\n📤 Sending to Anthropic API (v1/messages)...\n');
489
- }
490
- try {
491
- // Use Anthropic native endpoint /v1/messages
492
- const response = await this.client.post('/v1/messages', requestBody);
493
- if (showDebug) {
494
- console.log('\n╔══════════════════════════════════════════════════════════╗');
495
- console.log('║ AI RESPONSE DEBUG (ANTHROPIC) ║');
496
- console.log('╚══════════════════════════════════════════════════════════╝');
497
- console.log(`🆔 ID: ${response.data.id}`);
498
- console.log(`🤖 Model: ${response.data.model}`);
499
- const usage = response.data.usage;
500
- if (usage) {
501
- console.log(`📊 Tokens: ${usage.input_tokens} (input) + ${usage.output_tokens} (output) = ${usage.input_tokens + usage.output_tokens} (total)`);
502
- }
503
- console.log(`🏁 Stop Reason: ${response.data.stop_reason}`);
504
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
505
- console.log('│ 🤖 ASSISTANT │');
506
- console.log('├─────────────────────────────────────────────────────────────┤');
507
- const content = response.data.content || [];
508
- const reasoning = content.filter((c) => c.type === 'thinking').map((c) => c.thinking).join('');
509
- const textContent = content.filter((c) => c.type === 'text').map((c) => c.text).join('');
510
- // Display thinking
511
- if (reasoning) {
512
- console.log('│ 🧠 REASONING:');
513
- console.log('│ ───────────────────────────────────────────────────────────');
514
- const reasoningLines = renderMarkdown(reasoning).split('\n');
515
- for (const line of reasoningLines.slice(0, 15)) {
516
- console.log('│ ' + line.slice(0, 62));
517
- }
518
- if (reasoning.length > 800)
519
- console.log('│ ... (truncated)');
520
- console.log('│ ───────────────────────────────────────────────────────────');
521
- }
522
- // Display content
523
- console.log('│ 💬 CONTENT:');
524
- console.log('│ ───────────────────────────────────────────────────────────');
525
- const lines = renderMarkdown(textContent).split('\n');
526
- for (const line of lines.slice(0, 40)) {
527
- console.log('│ ' + line.slice(0, 62));
528
- }
529
- if (lines.length > 40) {
530
- console.log(`│ ... (${lines.length - 40} more lines)`);
531
- }
532
- console.log('└─────────────────────────────────────────────────────────────┘');
533
- console.log('\n╔══════════════════════════════════════════════════════════╗');
534
- console.log('║ RESPONSE ENDED ║');
535
- console.log('╚══════════════════════════════════════════════════════════╝\n');
536
- }
537
- return this.convertFromAnthropicNativeResponse(response.data);
538
- }
539
- catch (error) {
540
- const isRetryable = this.isRetryableError(error);
541
- if (!isRetryable) {
542
- if (error.response) {
543
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
544
- }
545
- else if (error.request) {
546
- throw new Error('Network error: No response received from server');
547
- }
548
- else {
549
- throw new Error(`Request error: ${error.message}`);
550
- }
551
- }
552
- const retryResult = await withRetry(async () => {
553
- const response = await this.client.post('/v1/messages', requestBody);
554
- if (showDebug) {
555
- console.log('\n╔══════════════════════════════════════════════════════════╗');
556
- console.log('║ AI RESPONSE DEBUG (ANTHROPIC RETRY) ║');
557
- console.log('╚══════════════════════════════════════════════════════════╝\n');
558
- }
559
- return this.convertFromAnthropicNativeResponse(response.data);
560
- }, { maxRetries: 3, baseDelay: 1000, maxDelay: 10000, jitter: true });
561
- if (!retryResult.success) {
562
- throw retryResult.error || new Error('Retry failed');
563
- }
564
- if (!retryResult.data) {
565
- throw new Error('Retry returned empty response');
566
- }
567
- return retryResult.data;
568
- }
569
- }
570
- // MiniMax API(Automatically select based on baseUrl Anthropic 或 OpenAI 格式)
571
- async minimaxChatCompletion(messages, options = {}) {
572
- const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
573
- const { endpoint, format } = getMiniMaxEndpoint(this.authConfig.baseUrl || '');
574
- const requestBody = {
575
- model: options.model || this.authConfig.modelName || 'MiniMax-M2',
576
- messages: format === 'anthropic' ? anthropicMessages : messages,
577
- temperature: options.temperature ?? 1.0,
578
- stream: false,
579
- max_tokens: options.maxTokens || 4096
580
- };
581
- if (system && format === 'anthropic') {
582
- requestBody.system = system;
583
- }
584
- if (format === 'anthropic') {
585
- // Anthropic format tools
586
- if (options.tools && options.tools.length > 0) {
587
- requestBody.tools = options.tools.map(tool => ({
588
- name: tool.function.name,
589
- description: tool.function.description,
590
- input_schema: tool.function.parameters || { type: 'object', properties: {} }
591
- }));
592
- const toolChoice = options.toolChoice;
593
- if (toolChoice === 'none') {
594
- requestBody.tool_choice = { type: 'auto' };
595
- }
596
- else if (toolChoice && typeof toolChoice === 'object') {
597
- if (toolChoice.type === 'function' && toolChoice.function) {
598
- requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
599
- }
600
- else {
601
- requestBody.tool_choice = { type: 'auto' };
602
- }
603
- }
604
- else {
605
- requestBody.tool_choice = { type: 'auto' };
606
- }
607
- }
608
- }
609
- else {
610
- // OpenAI format tools
611
- if (options.tools && options.tools.length > 0) {
612
- requestBody.tools = options.tools;
613
- requestBody.tool_choice = options.toolChoice || 'auto';
614
- }
615
- }
616
- // Debug output(受showAIDebugInfo配置控制)
617
- const showDebug = this.authConfig.showAIDebugInfo ?? false;
618
- if (showDebug) {
619
- console.log('\n╔══════════════════════════════════════════════════════════╗');
620
- console.log('║ AI REQUEST DEBUG (MINIMAX) ║');
621
- console.log('╚══════════════════════════════════════════════════════════╝');
622
- console.log(`📦 Model: ${requestBody.model}`);
623
- console.log(`🔗 Format: ${format.toUpperCase()} | Endpoint: ${endpoint}`);
624
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
625
- console.log(`💬 Total Messages: ${requestBody.messages.length} items`);
626
- if (requestBody.temperature)
627
- console.log(`🌡️ Temperature: ${requestBody.temperature}`);
628
- if (requestBody.max_tokens)
629
- console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
630
- if (requestBody.tools)
631
- console.log(`🔧 Tools: ${requestBody.tools.length} items`);
632
- console.log('─'.repeat(60));
633
- // Display system messages
634
- if (system && format === 'anthropic') {
635
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
636
- console.log('│ 🟫 SYSTEM │');
637
- console.log('├─────────────────────────────────────────────────────────────┤');
638
- console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
639
- console.log('└─────────────────────────────────────────────────────────────┘');
640
- }
641
- // Display other messages
642
- displayMessages(requestBody.messages);
643
- console.log('\n📤 Sending to MiniMax API...\n');
644
- }
645
- try {
646
- // MiniMax uses correct endpoint
647
- const response = await this.client.post(endpoint, requestBody);
648
- if (showDebug) {
649
- console.log('\n╔══════════════════════════════════════════════════════════╗');
650
- console.log('║ AI RESPONSE DEBUG (MINIMAX) ║');
651
- console.log('╚══════════════════════════════════════════════════════════╝');
652
- console.log(`🆔 ID: ${response.data.id}`);
653
- console.log(`🤖 Model: ${response.data.model}`);
654
- const usage = response.data.usage;
655
- if (usage) {
656
- console.log(`📊 Tokens: ${usage.prompt_tokens} (prompt) + ${usage.completion_tokens} (completion) = ${usage.total_tokens} (total)`);
657
- }
658
- console.log(`🏁 Stop Reason: ${response.data.stop_reason}`);
659
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
660
- console.log('│ 🤖 ASSISTANT │');
661
- console.log('├─────────────────────────────────────────────────────────────┤');
662
- const message = response.data.choices?.[0]?.message;
663
- const content = typeof message?.content === 'string' ? message.content : JSON.stringify(message?.content);
664
- console.log('│ 💬 CONTENT:');
665
- console.log('│ ───────────────────────────────────────────────────────────');
666
- const lines = renderMarkdown(content).split('\n');
667
- for (const line of lines.slice(0, 40)) {
668
- console.log('│ ' + line.slice(0, 62));
669
- }
670
- if (lines.length > 40) {
671
- console.log(`│ ... (${lines.length - 40} more lines)`);
672
- }
673
- console.log('└─────────────────────────────────────────────────────────────┘');
674
- console.log('\n╔══════════════════════════════════════════════════════════╗');
675
- console.log('║ RESPONSE ENDED ║');
676
- console.log('╚══════════════════════════════════════════════════════════╝\n');
677
- }
678
- if (format === 'anthropic') {
679
- return this.convertFromAnthropicNativeResponse(response.data);
680
- }
681
- else {
682
- return this.convertFromMiniMaxResponse(response.data);
683
- }
684
- }
685
- catch (error) {
686
- const isRetryable = this.isRetryableError(error);
687
- if (!isRetryable) {
688
- if (error.response) {
689
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
690
- }
691
- else if (error.request) {
692
- throw new Error('Network error: No response received from server');
693
- }
694
- else {
695
- throw new Error(`Request error: ${error.message}`);
696
- }
697
- }
698
- const retryResult = await withRetry(async () => {
699
- const response = await this.client.post(endpoint, requestBody);
700
- if (showDebug) {
701
- console.log('\n╔══════════════════════════════════════════════════════════╗');
702
- console.log('║ AI RESPONSE DEBUG (MINIMAX RETRY) ║');
703
- console.log('╚══════════════════════════════════════════════════════════╝\n');
704
- }
705
- if (format === 'anthropic') {
706
- return this.convertFromAnthropicNativeResponse(response.data);
707
- }
708
- else {
709
- return this.convertFromMiniMaxResponse(response.data);
710
- }
711
- }, { maxRetries: 3, baseDelay: 1000, maxDelay: 10000, jitter: true });
712
- if (!retryResult.success) {
713
- throw retryResult.error || new Error('Retry failed');
714
- }
715
- if (!retryResult.data) {
716
- throw new Error('Retry returned empty response');
717
- }
718
- return retryResult.data;
719
- }
720
- }
721
- // Convert Anthropic native response to unified format
722
- convertFromAnthropicNativeResponse(anthropicResponse) {
723
- const content = anthropicResponse.content || [];
724
- let textContent = '';
725
- let reasoningContent = '';
726
- const toolCalls = [];
727
- for (const block of content) {
728
- if (block.type === 'text') {
729
- textContent += block.text || '';
730
- }
731
- else if (block.type === 'thinking') {
732
- reasoningContent += block.thinking || '';
733
- }
734
- else if (block.type === 'tool_use') {
735
- toolCalls.push({
736
- id: block.id,
737
- type: 'function',
738
- function: {
739
- name: block.name,
740
- arguments: JSON.stringify(block.input || {})
741
- }
742
- });
743
- }
744
- }
745
- return {
746
- id: anthropicResponse.id || `anthropic-${Date.now()}`,
747
- object: 'chat.completion',
748
- created: Math.floor(Date.now() / 1000),
749
- model: anthropicResponse.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
750
- choices: [{
751
- index: 0,
752
- message: {
753
- role: 'assistant',
754
- content: textContent,
755
- reasoning_content: reasoningContent || undefined,
756
- tool_calls: toolCalls.length > 0 ? toolCalls : undefined
757
- },
758
- finish_reason: anthropicResponse.stop_reason === 'end_turn' ? 'stop' :
759
- anthropicResponse.stop_reason === 'max_tokens' ? 'length' : 'stop'
760
- }],
761
- usage: anthropicResponse.usage ? {
762
- prompt_tokens: anthropicResponse.usage.input_tokens || 0,
763
- completion_tokens: anthropicResponse.usage.output_tokens || 0,
764
- total_tokens: (anthropicResponse.usage.input_tokens || 0) + (anthropicResponse.usage.output_tokens || 0)
765
- } : undefined
766
- };
767
- }
768
- // Convert MiniMax response to unified format
769
- convertFromMiniMaxResponse(minimaxResponse) {
770
- const message = minimaxResponse.choices?.[0]?.message;
771
- const content = message?.content;
772
- let textContent = '';
773
- let reasoningContent = '';
774
- const toolCalls = [];
775
- if (typeof content === 'string') {
776
- textContent = content.trim();
777
- }
778
- else if (Array.isArray(content)) {
779
- for (const block of content) {
780
- if (block.type === 'text') {
781
- textContent += block.text || '';
782
- }
783
- else if (block.type === 'thinking') {
784
- reasoningContent += block.thinking || '';
785
- }
786
- else if (block.type === 'tool_use') {
787
- toolCalls.push({
788
- id: block.id,
789
- type: 'function',
790
- function: {
791
- name: block.name,
792
- arguments: JSON.stringify(block.input || {})
793
- }
794
- });
795
- }
796
- }
797
- }
798
- return {
799
- id: minimaxResponse.id || `minimax-${Date.now()}`,
800
- object: 'chat.completion',
801
- created: Math.floor(Date.now() / 1000),
802
- model: minimaxResponse.model || this.authConfig.modelName || 'MiniMax-M2',
803
- choices: [{
804
- index: 0,
805
- message: {
806
- role: 'assistant',
807
- content: textContent,
808
- reasoning_content: reasoningContent || undefined,
809
- tool_calls: toolCalls.length > 0 ? toolCalls : undefined
810
- },
811
- finish_reason: minimaxResponse.stop_reason === 'end_turn' ? 'stop' :
812
- minimaxResponse.stop_reason === 'max_tokens' ? 'length' : 'stop'
813
- }],
814
- usage: minimaxResponse.usage
815
- };
816
- }
817
- async *streamChatCompletion(messages, options = {}) {
818
- const isMiniMax = detectMiniMaxAPI(this.authConfig.baseUrl || '');
819
- if (isMiniMax) {
820
- yield* this.minimaxStreamChatCompletion(messages, options);
821
- return;
822
- }
823
- const isAnthropic = isAnthropicCompatible(this.authConfig.baseUrl || '');
824
- if (isAnthropic) {
825
- yield* this.anthropicNativeStreamChatCompletion(messages, options);
826
- return;
827
- }
828
- // OpenAI streaming response
829
- const model = options.model || this.authConfig.modelName || 'gpt-4';
830
- const requestBody = {
831
- model,
832
- messages,
833
- temperature: options.temperature ?? 0.7,
834
- stream: true
835
- };
836
- if (options.maxTokens && options.maxTokens > 0) {
837
- requestBody.max_tokens = options.maxTokens;
838
- }
839
- if (options.tools && options.tools.length > 0) {
840
- requestBody.tools = options.tools;
841
- requestBody.tool_choice = options.toolChoice || 'auto';
842
- }
843
- if (options.thinkingTokens && options.thinkingTokens > 0) {
844
- requestBody.max_completion_tokens = options.thinkingTokens;
845
- }
846
- // Debug output(受showAIDebugInfo配置控制)
847
- const showDebug = this.authConfig.showAIDebugInfo ?? false;
848
- if (showDebug) {
849
- console.log('\n╔══════════════════════════════════════════════════════════╗');
850
- console.log('║ AI REQUEST DEBUG (STREAM) ║');
851
- console.log('╚══════════════════════════════════════════════════════════╝');
852
- console.log(`📦 Model: ${model}`);
853
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
854
- console.log(`💬 Total Messages: ${messages.length} items`);
855
- if (options.temperature)
856
- console.log(`🌡️ Temperature: ${options.temperature}`);
857
- if (options.maxTokens)
858
- console.log(`📏 Max Tokens: ${options.maxTokens}`);
859
- if (options.tools?.length)
860
- console.log(`🔧 Tools: ${options.tools.length} items`);
861
- console.log('─'.repeat(60));
862
- // Separate and display messages
863
- const systemMsgs = messages.filter(m => m.role === 'system');
864
- const otherMsgs = messages.filter(m => m.role !== 'system');
865
- if (systemMsgs.length > 0) {
866
- const systemContent = typeof systemMsgs[0].content === 'string'
867
- ? systemMsgs[0].content
868
- : formatMessageContent(systemMsgs[0].content);
869
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
870
- console.log('│ 🟫 SYSTEM │');
871
- console.log('├─────────────────────────────────────────────────────────────┤');
872
- console.log(renderMarkdown(systemContent).split('\n').map(l => '│ ' + l).join('\n'));
873
- console.log('└─────────────────────────────────────────────────────────────┘');
874
- }
875
- displayMessages(otherMsgs);
876
- console.log('\n📤 Starting stream...\n');
877
- }
878
- try {
879
- const response = await this.client.post('/chat/completions', requestBody, {
880
- responseType: 'stream'
881
- });
882
- console.log('📥 Receiving stream chunks...\n');
883
- let buffer = '';
884
- let chunkCount = 0;
885
- let outputBuffer = '';
886
- for await (const chunk of response.data) {
887
- buffer += chunk.toString();
888
- const lines = buffer.split('\n');
889
- buffer = lines.pop() || '';
890
- for (const line of lines) {
891
- const trimmedLine = line.trim();
892
- if (!trimmedLine)
893
- continue;
894
- if (trimmedLine.startsWith('data: ')) {
895
- const data = trimmedLine.slice(6);
896
- if (data === '[DONE]') {
897
- if (showDebug) {
898
- console.log('\n╔══════════════════════════════════════════════════════════╗');
899
- console.log('║ STREAM COMPLETED ║');
900
- console.log('╚══════════════════════════════════════════════════════════╝');
901
- console.log(`📦 Total chunks: ${chunkCount}`);
902
- console.log(`📏 Total output: ${outputBuffer.length} chars`);
903
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
904
- console.log('│ 🤖 ASSISTANT OUTPUT │');
905
- console.log('├─────────────────────────────────────────────────────────────┤');
906
- console.log('│ 💬 CONTENT:');
907
- console.log('│ ───────────────────────────────────────────────────────────');
908
- const lines = renderMarkdown(outputBuffer).split('\n');
909
- for (const line of lines.slice(0, 30)) {
910
- console.log('│ ' + line.slice(0, 62));
911
- }
912
- if (lines.length > 30) {
913
- console.log(`│ ... (${lines.length - 30} more lines)`);
914
- }
915
- console.log('└─────────────────────────────────────────────────────────────┘');
916
- console.log('');
917
- }
918
- return;
919
- }
920
- try {
921
- const parsed = JSON.parse(data);
922
- const delta = parsed.choices?.[0]?.delta;
923
- if (delta?.content) {
924
- chunkCount++;
925
- outputBuffer += delta.content;
926
- yield delta.content;
927
- }
928
- else if (delta?.reasoning_content) {
929
- chunkCount++;
930
- outputBuffer += delta.reasoning_content;
931
- yield delta.reasoning_content;
932
- }
933
- }
934
- catch (e) {
935
- // Silently ignore parsing errors
936
- }
937
- }
938
- }
939
- }
940
- if (buffer.trim()) {
941
- const trimmedLine = buffer.trim();
942
- if (trimmedLine.startsWith('data: ')) {
943
- const data = trimmedLine.slice(6);
944
- if (data !== '[DONE]') {
945
- try {
946
- const parsed = JSON.parse(data);
947
- const delta = parsed.choices?.[0]?.delta;
948
- if (delta?.content) {
949
- yield delta.content;
950
- }
951
- else if (delta?.reasoning_content) {
952
- yield delta.reasoning_content;
953
- }
954
- }
955
- catch (e) {
956
- // Ignore final parsing errors
957
- }
958
- }
959
- }
960
- }
961
- console.log('\n╔══════════════════════════════════════════════════════════╗');
962
- console.log('║ STREAM COMPLETED ║');
963
- console.log('╚══════════════════════════════════════════════════════════╝\n');
964
- }
965
- catch (error) {
966
- if (error.response) {
967
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
968
- }
969
- else if (error.request) {
970
- throw new Error('Network error: No response received from server');
971
- }
972
- else {
973
- throw new Error(`Request error: ${error.message}`);
974
- }
975
- }
976
- }
977
- // Anthropic native streaming response(/v1/messages 端点)
978
- async *anthropicNativeStreamChatCompletion(messages, options = {}) {
979
- const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
980
- const requestBody = {
981
- model: options.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
982
- messages: anthropicMessages,
983
- temperature: options.temperature ?? 1.0,
984
- stream: true,
985
- max_tokens: options.maxTokens || 4096
986
- };
987
- if (system) {
988
- requestBody.system = system;
989
- }
990
- // Anthropic native tool format
991
- if (options.tools && options.tools.length > 0) {
992
- requestBody.tools = options.tools.map(tool => ({
993
- name: tool.function.name,
994
- description: tool.function.description,
995
- input_schema: tool.function.parameters || { type: 'object', properties: {} }
996
- }));
997
- const toolChoice = options.toolChoice;
998
- if (toolChoice === 'none') {
999
- requestBody.tool_choice = { type: 'auto' };
1000
- }
1001
- else if (toolChoice && typeof toolChoice === 'object') {
1002
- if (toolChoice.type === 'function' && toolChoice.function) {
1003
- requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
1004
- }
1005
- else {
1006
- requestBody.tool_choice = { type: 'auto' };
1007
- }
1008
- }
1009
- else {
1010
- requestBody.tool_choice = { type: 'auto' };
1011
- }
1012
- }
1013
- if (options.thinkingTokens && options.thinkingTokens > 0) {
1014
- requestBody.thinking = { type: 'enabled', budget_tokens: options.thinkingTokens };
1015
- }
1016
- // Debug output(受showAIDebugInfo配置控制)
1017
- const showDebug = this.authConfig.showAIDebugInfo ?? false;
1018
- if (showDebug) {
1019
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1020
- console.log('║ AI REQUEST DEBUG (ANTHROPIC STREAM) ║');
1021
- console.log('╚══════════════════════════════════════════════════════════╝');
1022
- console.log(`📦 Model: ${requestBody.model}`);
1023
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
1024
- console.log(`💬 Total Messages: ${anthropicMessages.length} items`);
1025
- if (requestBody.temperature)
1026
- console.log(`🌡️ Temperature: ${requestBody.temperature}`);
1027
- if (requestBody.max_tokens)
1028
- console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
1029
- if (requestBody.thinking)
1030
- console.log(`🧠 Thinking Budget: ${requestBody.thinking.budget_tokens}`);
1031
- console.log('─'.repeat(60));
1032
- // Display system messages
1033
- if (system) {
1034
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
1035
- console.log('│ 🟫 SYSTEM │');
1036
- console.log('├─────────────────────────────────────────────────────────────┤');
1037
- console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
1038
- console.log('└─────────────────────────────────────────────────────────────┘');
1039
- }
1040
- displayMessages(anthropicMessages);
1041
- console.log('\n📤 Starting Anthropic stream...\n');
1042
- }
1043
- try {
1044
- // Anthropic native streaming endpoint /v1/messages
1045
- const response = await this.client.post('/v1/messages', requestBody, {
1046
- responseType: 'stream'
1047
- });
1048
- console.log('📥 Receiving Anthropic stream chunks...\n');
1049
- let buffer = '';
1050
- let outputBuffer = '';
1051
- for await (const chunk of response.data) {
1052
- buffer += chunk.toString();
1053
- const lines = buffer.split('\n');
1054
- buffer = lines.pop() || '';
1055
- for (const line of lines) {
1056
- const trimmedLine = line.trim();
1057
- if (!trimmedLine)
1058
- continue;
1059
- // Anthropic streaming format: data: {"type":"content_block_delta",...}
1060
- if (trimmedLine.startsWith('data: ')) {
1061
- const data = trimmedLine.slice(6);
1062
- try {
1063
- const parsed = JSON.parse(data);
1064
- // Anthropic event types
1065
- if (parsed.type === 'content_block_delta') {
1066
- if (parsed.delta?.type === 'text_delta' && parsed.delta.text) {
1067
- outputBuffer += parsed.delta.text;
1068
- yield parsed.delta.text;
1069
- }
1070
- else if (parsed.delta?.type === 'thinking_delta' && parsed.delta.thinking) {
1071
- outputBuffer += parsed.delta.thinking;
1072
- yield parsed.delta.thinking;
1073
- }
1074
- }
1075
- else if (parsed.type === 'message_delta') {
1076
- if (parsed.delta?.stop_reason) {
1077
- // Message end
1078
- if (showDebug) {
1079
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1080
- console.log('║ STREAM COMPLETED ║');
1081
- console.log('╚══════════════════════════════════════════════════════════╝');
1082
- console.log(`📏 Total output: ${outputBuffer.length} chars`);
1083
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
1084
- console.log('│ 🤖 ASSISTANT OUTPUT │');
1085
- console.log('├─────────────────────────────────────────────────────────────┤');
1086
- console.log('│ 💬 CONTENT:');
1087
- console.log('│ ───────────────────────────────────────────────────────────');
1088
- const lines = renderMarkdown(outputBuffer).split('\n');
1089
- for (const line of lines.slice(0, 30)) {
1090
- console.log('│ ' + line.slice(0, 62));
1091
- }
1092
- if (lines.length > 30) {
1093
- console.log(`│ ... (${lines.length - 30} more lines)`);
1094
- }
1095
- console.log('└─────────────────────────────────────────────────────────────┘');
1096
- console.log('');
1097
- }
1098
- return;
1099
- }
1100
- }
1101
- }
1102
- catch (e) {
1103
- // Ignore parsing errors
1104
- }
1105
- }
1106
- }
1107
- }
1108
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1109
- console.log('║ STREAM COMPLETED ║');
1110
- console.log('╚══════════════════════════════════════════════════════════╝\n');
1111
- }
1112
- catch (error) {
1113
- if (error.response) {
1114
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
1115
- }
1116
- else if (error.request) {
1117
- throw new Error('Network error: No response received from server');
1118
- }
1119
- else {
1120
- throw new Error(`Request error: ${error.message}`);
1121
- }
1122
- }
1123
- }
1124
- // MiniMax streaming response(Automatically select based on baseUrl格式)
1125
- async *minimaxStreamChatCompletion(messages, options = {}) {
1126
- const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
1127
- const { endpoint, format } = getMiniMaxEndpoint(this.authConfig.baseUrl || '');
1128
- const requestBody = {
1129
- model: options.model || this.authConfig.modelName || 'MiniMax-M2',
1130
- messages: format === 'anthropic' ? anthropicMessages : messages,
1131
- temperature: options.temperature ?? 1.0,
1132
- stream: true,
1133
- max_tokens: options.maxTokens || 4096
1134
- };
1135
- if (system && format === 'anthropic') {
1136
- requestBody.system = system;
1137
- }
1138
- if (format === 'anthropic') {
1139
- // Anthropic 格式的工具
1140
- if (options.tools && options.tools.length > 0) {
1141
- requestBody.tools = options.tools.map(tool => ({
1142
- name: tool.function.name,
1143
- description: tool.function.description,
1144
- input_schema: tool.function.parameters || { type: 'object', properties: {} }
1145
- }));
1146
- const toolChoice = options.toolChoice;
1147
- if (toolChoice === 'none') {
1148
- requestBody.tool_choice = { type: 'auto' };
1149
- }
1150
- else if (toolChoice && typeof toolChoice === 'object') {
1151
- if (toolChoice.type === 'function' && toolChoice.function) {
1152
- requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
1153
- }
1154
- else {
1155
- requestBody.tool_choice = { type: 'auto' };
1156
- }
1157
- }
1158
- else {
1159
- requestBody.tool_choice = { type: 'auto' };
1160
- }
1161
- }
1162
- }
1163
- else {
1164
- // OpenAI format tools
1165
- if (options.tools && options.tools.length > 0) {
1166
- requestBody.tools = options.tools;
1167
- requestBody.tool_choice = options.toolChoice || 'auto';
1168
- }
1169
- }
1170
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1171
- console.log('║ AI REQUEST DEBUG (MINIMAX STREAM) ║');
1172
- console.log('╚══════════════════════════════════════════════════════════╝');
1173
- console.log(`📦 Model: ${requestBody.model}`);
1174
- console.log(`🔗 Format: ${format.toUpperCase()} | Endpoint: ${endpoint}`);
1175
- console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
1176
- console.log(`💬 Total Messages: ${requestBody.messages.length} items`);
1177
- if (requestBody.temperature)
1178
- console.log(`🌡️ Temperature: ${requestBody.temperature}`);
1179
- if (requestBody.max_tokens)
1180
- console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
1181
- console.log('─'.repeat(60));
1182
- // Display system messages
1183
- if (system && format === 'anthropic') {
1184
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
1185
- console.log('│ 🟫 SYSTEM │');
1186
- console.log('├─────────────────────────────────────────────────────────────┤');
1187
- console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
1188
- console.log('└─────────────────────────────────────────────────────────────┘');
1189
- }
1190
- displayMessages(requestBody.messages);
1191
- console.log('\n📤 Starting MiniMax stream...\n');
1192
- try {
1193
- // MiniMax uses correct endpoint
1194
- const response = await this.client.post(endpoint, requestBody, {
1195
- responseType: 'stream'
1196
- });
1197
- console.log('📥 Receiving MiniMax stream chunks...\n');
1198
- let buffer = '';
1199
- let outputBuffer = '';
1200
- for await (const chunk of response.data) {
1201
- buffer += chunk.toString();
1202
- const lines = buffer.split('\n');
1203
- buffer = lines.pop() || '';
1204
- for (const line of lines) {
1205
- const trimmedLine = line.trim();
1206
- if (!trimmedLine)
1207
- continue;
1208
- // Parse different streaming responses based on format
1209
- if (format === 'anthropic') {
1210
- // Anthropic SSE format: data: {"type":"content_block_delta",...}
1211
- if (trimmedLine.startsWith('data: ')) {
1212
- const data = trimmedLine.slice(6);
1213
- try {
1214
- const parsed = JSON.parse(data);
1215
- if (parsed.type === 'content_block_delta') {
1216
- if (parsed.delta?.type === 'text_delta' && parsed.delta.text) {
1217
- yield parsed.delta.text;
1218
- }
1219
- else if (parsed.delta?.type === 'thinking_delta' && parsed.delta.thinking) {
1220
- yield parsed.delta.thinking;
1221
- }
1222
- }
1223
- else if (parsed.type === 'message_delta') {
1224
- if (parsed.delta?.stop_reason) {
1225
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1226
- console.log('║ STREAM COMPLETED ║');
1227
- console.log('╚══════════════════════════════════════════════════════════╝');
1228
- console.log(`📏 Total output: ${outputBuffer.length} chars`);
1229
- console.log('\n┌─────────────────────────────────────────────────────────────┐');
1230
- console.log('│ 🤖 ASSISTANT OUTPUT │');
1231
- console.log('├─────────────────────────────────────────────────────────────┤');
1232
- console.log('│ 💬 CONTENT:');
1233
- console.log('│ ───────────────────────────────────────────────────────────');
1234
- const lines = renderMarkdown(outputBuffer).split('\n');
1235
- for (const line of lines.slice(0, 30)) {
1236
- console.log('│ ' + line.slice(0, 62));
1237
- }
1238
- if (lines.length > 30) {
1239
- console.log(`│ ... (${lines.length - 30} more lines)`);
1240
- }
1241
- console.log('└─────────────────────────────────────────────────────────────┘');
1242
- console.log('');
1243
- return;
1244
- }
1245
- }
1246
- }
1247
- catch (e) {
1248
- // Ignore parsing errors
1249
- }
1250
- }
1251
- }
1252
- else {
1253
- // OpenAI SSE format: data: {...}
1254
- if (trimmedLine.startsWith('data: ')) {
1255
- const data = trimmedLine.slice(6);
1256
- if (data === '[DONE]')
1257
- continue;
1258
- try {
1259
- const parsed = JSON.parse(data);
1260
- const delta = parsed.choices?.[0]?.delta;
1261
- if (delta?.content) {
1262
- outputBuffer += delta.content;
1263
- yield delta.content;
1264
- }
1265
- else if (delta?.reasoning_content) {
1266
- outputBuffer += delta.reasoning_content;
1267
- yield delta.reasoning_content;
1268
- }
1269
- }
1270
- catch (e) {
1271
- // Ignore parsing errors
1272
- }
1273
- }
1274
- }
1275
- }
1276
- }
1277
- console.log('\n╔══════════════════════════════════════════════════════════╗');
1278
- console.log('║ STREAM COMPLETED ║');
1279
- console.log('╚══════════════════════════════════════════════════════════╝\n');
1280
- }
1281
- catch (error) {
1282
- if (error.response) {
1283
- throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
1284
- }
1285
- else if (error.request) {
1286
- throw new Error('Network error: No response received from server');
1287
- }
1288
- else {
1289
- throw new Error(`Request error: ${error.message}`);
1290
- }
1291
- }
1292
- }
1293
- async listModels() {
1294
- try {
1295
- const response = await this.client.get('/models');
1296
- return response.data.data || [];
1297
- }
1298
- catch (error) {
1299
- console.error('Failed to list models:', error);
1300
- return [];
1301
- }
1302
- }
1303
- updateAuthConfig(authConfig) {
1304
- this.authConfig = authConfig;
1305
- this.client.defaults.baseURL = authConfig.baseUrl;
1306
- const isMiniMax = detectMiniMaxAPI(authConfig.baseUrl || '');
1307
- const isAnthropic = !isMiniMax && isAnthropicCompatible(authConfig.baseUrl || '');
1308
- if (isMiniMax || isAnthropic) {
1309
- // MiniMax/Anthropic: Use x-api-key auth header
1310
- this.client.defaults.headers['x-api-key'] = authConfig.apiKey || '';
1311
- this.client.defaults.headers['anthropic-version'] = '2023-06-01';
1312
- // Clear Bearer header
1313
- delete this.client.defaults.headers['Authorization'];
1314
- }
1315
- else {
1316
- // OpenAI compatible: Use Bearer token
1317
- this.client.defaults.headers['Authorization'] = `Bearer ${authConfig.apiKey}`;
1318
- // Clear x-api-key header
1319
- delete this.client.defaults.headers['x-api-key'];
1320
- delete this.client.defaults.headers['anthropic-version'];
1321
- }
1322
- }
1323
- getAuthConfig() {
1324
- return { ...this.authConfig };
1325
- }
1326
- // Check if messages contain tool calls
1327
- hasToolCalls(messages) {
1328
- return messages.some(msg => {
1329
- if (msg.tool_calls && msg.tool_calls.length > 0)
1330
- return true;
1331
- if (Array.isArray(msg.content)) {
1332
- return msg.content.some(block => block.type === 'tool_use' ||
1333
- block.type === 'tool_result');
1334
- }
1335
- return false;
1336
- });
1337
- }
1338
- }
1339
- export function detectThinkingKeywords(text) {
1340
- const ultraKeywords = ['super think', 'extreme think', 'deep think', 'full think', 'ultra think', 'careful think',
1341
- 'ultrathink', 'think really super hard', 'think intensely'];
1342
- const megaKeywords = ['strong think', 'powerful think', 'think hard', 'try hard to think', 'think well', 'think carefully',
1343
- 'megathink', 'think really hard', 'think a lot'];
1344
- const hardKeywords = ['think again', 'think more', 'think clearly', 'think thoroughly', 'consider carefully',
1345
- 'think about it', 'think more', 'think harder'];
1346
- const normalKeywords = ['think', 'think', 'consider', 'think'];
1347
- const lowerText = text.toLowerCase();
1348
- if (ultraKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1349
- return 'ultra';
1350
- }
1351
- else if (megaKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1352
- return 'mega';
1353
- }
1354
- else if (hardKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1355
- return 'hard';
1356
- }
1357
- else if (normalKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1358
- return 'normal';
1359
- }
1360
- return 'none';
1361
- }
1362
- export function getThinkingTokens(mode) {
1363
- const tokensMap = {
1364
- none: 0,
1365
- normal: 2000,
1366
- hard: 4000,
1367
- mega: 10000,
1368
- ultra: 32000
1369
- };
1370
- return tokensMap[mode];
1371
- }
1372
- //# sourceMappingURL=ai-client.js.map