@mate-academy/llm-gateway 8.8.2 → 8.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/dist/LLMError.d.ts +12 -0
  2. package/dist/LLMError.js +36 -0
  3. package/dist/LLMError.js.map +1 -0
  4. package/dist/LLMGateway.d.ts +30 -0
  5. package/dist/LLMGateway.js +56 -0
  6. package/dist/LLMGateway.js.map +1 -0
  7. package/dist/LLMGateway.typedefs.d.ts +5 -0
  8. package/dist/LLMGateway.typedefs.js +3 -0
  9. package/dist/LLMGateway.typedefs.js.map +1 -0
  10. package/dist/LLMService.constants.d.ts +26309 -0
  11. package/dist/LLMService.constants.js +35 -0
  12. package/dist/LLMService.constants.js.map +1 -0
  13. package/dist/LLMService.factory.d.ts +71 -0
  14. package/dist/LLMService.factory.js +102 -0
  15. package/dist/LLMService.factory.js.map +1 -0
  16. package/dist/LLMService.typedefs.d.ts +655 -0
  17. package/dist/LLMService.typedefs.js +72 -0
  18. package/dist/LLMService.typedefs.js.map +1 -0
  19. package/dist/advanced.d.ts +11 -0
  20. package/dist/advanced.js +32 -0
  21. package/dist/advanced.js.map +1 -0
  22. package/dist/client/LLMAgent.d.ts +76 -0
  23. package/dist/client/LLMAgent.js +36 -0
  24. package/dist/client/LLMAgent.js.map +1 -0
  25. package/dist/client/LLMClientEngine.d.ts +110 -0
  26. package/dist/client/LLMClientEngine.js +406 -0
  27. package/dist/client/LLMClientEngine.js.map +1 -0
  28. package/dist/client/agentRun.typedefs.d.ts +200 -0
  29. package/dist/client/agentRun.typedefs.js +25 -0
  30. package/dist/client/agentRun.typedefs.js.map +1 -0
  31. package/dist/client/agentRunner.d.ts +161 -0
  32. package/dist/client/agentRunner.js +517 -0
  33. package/dist/client/agentRunner.js.map +1 -0
  34. package/dist/client/codegen/fetchPromptRecords.d.ts +14 -0
  35. package/dist/client/codegen/fetchPromptRecords.js +90 -0
  36. package/dist/client/codegen/fetchPromptRecords.js.map +1 -0
  37. package/dist/client/codegen/generateSnapshot.d.ts +19 -0
  38. package/dist/client/codegen/generateSnapshot.js +28 -0
  39. package/dist/client/codegen/generateSnapshot.js.map +1 -0
  40. package/dist/client/codegen/index.d.ts +6 -0
  41. package/dist/client/codegen/index.js +23 -0
  42. package/dist/client/codegen/index.js.map +1 -0
  43. package/dist/client/codegen/promptCatalog.typedefs.d.ts +51 -0
  44. package/dist/client/codegen/promptCatalog.typedefs.js +3 -0
  45. package/dist/client/codegen/promptCatalog.typedefs.js.map +1 -0
  46. package/dist/client/codegen/promptName.d.ts +8 -0
  47. package/dist/client/codegen/promptName.js +21 -0
  48. package/dist/client/codegen/promptName.js.map +1 -0
  49. package/dist/client/codegen/renderSnapshot.constants.d.ts +7 -0
  50. package/dist/client/codegen/renderSnapshot.constants.js +16 -0
  51. package/dist/client/codegen/renderSnapshot.constants.js.map +1 -0
  52. package/dist/client/codegen/renderSnapshot.d.ts +9 -0
  53. package/dist/client/codegen/renderSnapshot.js +109 -0
  54. package/dist/client/codegen/renderSnapshot.js.map +1 -0
  55. package/dist/client/codegen/renderSnapshot.typedefs.d.ts +19 -0
  56. package/dist/client/codegen/renderSnapshot.typedefs.js +3 -0
  57. package/dist/client/codegen/renderSnapshot.typedefs.js.map +1 -0
  58. package/dist/client/coerceToolResult.d.ts +10 -0
  59. package/dist/client/coerceToolResult.js +38 -0
  60. package/dist/client/coerceToolResult.js.map +1 -0
  61. package/dist/client/createLLMClient.d.ts +10 -0
  62. package/dist/client/createLLMClient.js +47 -0
  63. package/dist/client/createLLMClient.js.map +1 -0
  64. package/dist/client/defineLLMPrompts.d.ts +34 -0
  65. package/dist/client/defineLLMPrompts.js +13 -0
  66. package/dist/client/defineLLMPrompts.js.map +1 -0
  67. package/dist/client/errors.d.ts +57 -0
  68. package/dist/client/errors.js +70 -0
  69. package/dist/client/errors.js.map +1 -0
  70. package/dist/client/index.d.ts +13 -0
  71. package/dist/client/index.js +30 -0
  72. package/dist/client/index.js.map +1 -0
  73. package/dist/client/llmClient.typedefs.d.ts +265 -0
  74. package/dist/client/llmClient.typedefs.js +11 -0
  75. package/dist/client/llmClient.typedefs.js.map +1 -0
  76. package/dist/client/llmConfig.schema.d.ts +53 -0
  77. package/dist/client/llmConfig.schema.js +49 -0
  78. package/dist/client/llmConfig.schema.js.map +1 -0
  79. package/dist/client/plainMessages.d.ts +12 -0
  80. package/dist/client/plainMessages.js +19 -0
  81. package/dist/client/plainMessages.js.map +1 -0
  82. package/dist/client/promptClientPort.typedefs.d.ts +60 -0
  83. package/dist/client/promptClientPort.typedefs.js +3 -0
  84. package/dist/client/promptClientPort.typedefs.js.map +1 -0
  85. package/dist/client/promptRegistry.runtime.d.ts +121 -0
  86. package/dist/client/promptRegistry.runtime.js +264 -0
  87. package/dist/client/promptRegistry.runtime.js.map +1 -0
  88. package/dist/client/promptSnapshot.typedefs.d.ts +55 -0
  89. package/dist/client/promptSnapshot.typedefs.js +3 -0
  90. package/dist/client/promptSnapshot.typedefs.js.map +1 -0
  91. package/dist/client/promptVariables.d.ts +7 -0
  92. package/dist/client/promptVariables.js +13 -0
  93. package/dist/client/promptVariables.js.map +1 -0
  94. package/dist/client/snapshotRuntime.d.ts +17 -0
  95. package/dist/client/snapshotRuntime.js +42 -0
  96. package/dist/client/snapshotRuntime.js.map +1 -0
  97. package/dist/client/snapshotRuntime.typedefs.d.ts +13 -0
  98. package/dist/client/snapshotRuntime.typedefs.js +3 -0
  99. package/dist/client/snapshotRuntime.typedefs.js.map +1 -0
  100. package/dist/client/validationGate.d.ts +24 -0
  101. package/dist/client/validationGate.js +54 -0
  102. package/dist/client/validationGate.js.map +1 -0
  103. package/dist/codegen.d.ts +6 -0
  104. package/dist/codegen.js +23 -0
  105. package/dist/codegen.js.map +1 -0
  106. package/dist/index.d.ts +10 -0
  107. package/dist/index.js +27 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.d.ts +873 -0
  110. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.js +269 -0
  111. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.js.map +1 -0
  112. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.d.ts +24 -0
  113. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.js +210 -0
  114. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.entity.js.map +1 -0
  115. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.typedefs.d.ts +22 -0
  116. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.typedefs.js +20 -0
  117. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.typedefs.js.map +1 -0
  118. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAIService.factory.d.ts +6 -0
  119. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAIService.factory.js +18 -0
  120. package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAIService.factory.js.map +1 -0
  121. package/dist/providers/GoogleGenerativeAI/index.d.ts +5 -0
  122. package/dist/providers/GoogleGenerativeAI/index.js +22 -0
  123. package/dist/providers/GoogleGenerativeAI/index.js.map +1 -0
  124. package/dist/providers/GoogleGenerativeAI/schemas/GoogleSchemaAdapter.d.ts +12 -0
  125. package/dist/providers/GoogleGenerativeAI/schemas/GoogleSchemaAdapter.js +72 -0
  126. package/dist/providers/GoogleGenerativeAI/schemas/GoogleSchemaAdapter.js.map +1 -0
  127. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.d.ts +71 -0
  128. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js +876 -0
  129. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js.map +1 -0
  130. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAICompletion.service.d.ts +25 -0
  131. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAICompletion.service.js +216 -0
  132. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAICompletion.service.js.map +1 -0
  133. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.d.ts +10 -0
  134. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js +136 -0
  135. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js.map +1 -0
  136. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAITextToSpeech.service.d.ts +11 -0
  137. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAITextToSpeech.service.js +97 -0
  138. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAITextToSpeech.service.js.map +1 -0
  139. package/dist/providers/GoogleGenerativeAI/services/index.d.ts +4 -0
  140. package/dist/providers/GoogleGenerativeAI/services/index.js +21 -0
  141. package/dist/providers/GoogleGenerativeAI/services/index.js.map +1 -0
  142. package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +35832 -0
  143. package/dist/providers/LLMAPI/LLMAPI.constants.js +8601 -0
  144. package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -0
  145. package/dist/providers/LLMAPI/LLMAPI.entity.d.ts +6 -0
  146. package/dist/providers/LLMAPI/LLMAPI.entity.js +48 -0
  147. package/dist/providers/LLMAPI/LLMAPI.entity.js.map +1 -0
  148. package/dist/providers/LLMAPI/LLMAPI.typedefs.d.ts +516 -0
  149. package/dist/providers/LLMAPI/LLMAPI.typedefs.js +564 -0
  150. package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -0
  151. package/dist/providers/LLMAPI/LLMAPI.voices.d.ts +376 -0
  152. package/dist/providers/LLMAPI/LLMAPI.voices.js +739 -0
  153. package/dist/providers/LLMAPI/LLMAPI.voices.js.map +1 -0
  154. package/dist/providers/LLMAPI/LLMAPIService.factory.d.ts +6 -0
  155. package/dist/providers/LLMAPI/LLMAPIService.factory.js +19 -0
  156. package/dist/providers/LLMAPI/LLMAPIService.factory.js.map +1 -0
  157. package/dist/providers/LLMAPI/index.d.ts +7 -0
  158. package/dist/providers/LLMAPI/index.js +24 -0
  159. package/dist/providers/LLMAPI/index.js.map +1 -0
  160. package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.d.ts +3 -0
  161. package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.js +8 -0
  162. package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.js.map +1 -0
  163. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.d.ts +76 -0
  164. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js +825 -0
  165. package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js.map +1 -0
  166. package/dist/providers/LLMAPI/services/LLMAPICompletion.service.d.ts +25 -0
  167. package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js +177 -0
  168. package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js.map +1 -0
  169. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.d.ts +17 -0
  170. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js +34 -0
  171. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js.map +1 -0
  172. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.d.ts +20 -0
  173. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js +36 -0
  174. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js.map +1 -0
  175. package/dist/providers/LLMAPI/services/index.d.ts +4 -0
  176. package/dist/providers/LLMAPI/services/index.js +21 -0
  177. package/dist/providers/LLMAPI/services/index.js.map +1 -0
  178. package/dist/providers/LLMAPI/utilities/index.d.ts +4 -0
  179. package/dist/providers/LLMAPI/utilities/index.js +13 -0
  180. package/dist/providers/LLMAPI/utilities/index.js.map +1 -0
  181. package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.d.ts +7 -0
  182. package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.js +35 -0
  183. package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.js.map +1 -0
  184. package/dist/providers/LLMAPI/utilities/stripThinkingTags.d.ts +1 -0
  185. package/dist/providers/LLMAPI/utilities/stripThinkingTags.js +7 -0
  186. package/dist/providers/LLMAPI/utilities/stripThinkingTags.js.map +1 -0
  187. package/dist/providers/LLMAPI/utilities/structuredOutput.d.ts +13 -0
  188. package/dist/providers/LLMAPI/utilities/structuredOutput.js +29 -0
  189. package/dist/providers/LLMAPI/utilities/structuredOutput.js.map +1 -0
  190. package/dist/providers/LLMAPI/utilities/validateStructuredResponse.d.ts +10 -0
  191. package/dist/providers/LLMAPI/utilities/validateStructuredResponse.js +21 -0
  192. package/dist/providers/LLMAPI/utilities/validateStructuredResponse.js.map +1 -0
  193. package/dist/providers/OpenAI/OpenAI.constants.d.ts +1664 -0
  194. package/dist/providers/OpenAI/OpenAI.constants.js +310 -0
  195. package/dist/providers/OpenAI/OpenAI.constants.js.map +1 -0
  196. package/dist/providers/OpenAI/OpenAI.entity.d.ts +15 -0
  197. package/dist/providers/OpenAI/OpenAI.entity.js +162 -0
  198. package/dist/providers/OpenAI/OpenAI.entity.js.map +1 -0
  199. package/dist/providers/OpenAI/OpenAI.typedefs.d.ts +61 -0
  200. package/dist/providers/OpenAI/OpenAI.typedefs.js +39 -0
  201. package/dist/providers/OpenAI/OpenAI.typedefs.js.map +1 -0
  202. package/dist/providers/OpenAI/OpenAIService.factory.d.ts +6 -0
  203. package/dist/providers/OpenAI/OpenAIService.factory.js +18 -0
  204. package/dist/providers/OpenAI/OpenAIService.factory.js.map +1 -0
  205. package/dist/providers/OpenAI/index.d.ts +5 -0
  206. package/dist/providers/OpenAI/index.js +22 -0
  207. package/dist/providers/OpenAI/index.js.map +1 -0
  208. package/dist/providers/OpenAI/schemas/OpenAISchemaAdapter.d.ts +14 -0
  209. package/dist/providers/OpenAI/schemas/OpenAISchemaAdapter.js +87 -0
  210. package/dist/providers/OpenAI/schemas/OpenAISchemaAdapter.js.map +1 -0
  211. package/dist/providers/OpenAI/services/OpenAIAssistance.service.d.ts +42 -0
  212. package/dist/providers/OpenAI/services/OpenAIAssistance.service.js +712 -0
  213. package/dist/providers/OpenAI/services/OpenAIAssistance.service.js.map +1 -0
  214. package/dist/providers/OpenAI/services/OpenAICompletion.service.d.ts +7 -0
  215. package/dist/providers/OpenAI/services/OpenAICompletion.service.js +12 -0
  216. package/dist/providers/OpenAI/services/OpenAICompletion.service.js.map +1 -0
  217. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.d.ts +17 -0
  218. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js +40 -0
  219. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js.map +1 -0
  220. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.d.ts +13 -0
  221. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js +32 -0
  222. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js.map +1 -0
  223. package/dist/providers/OpenAI/services/buildFunctionCallOutput.d.ts +3 -0
  224. package/dist/providers/OpenAI/services/buildFunctionCallOutput.js +19 -0
  225. package/dist/providers/OpenAI/services/buildFunctionCallOutput.js.map +1 -0
  226. package/dist/providers/OpenAI/services/index.d.ts +4 -0
  227. package/dist/providers/OpenAI/services/index.js +21 -0
  228. package/dist/providers/OpenAI/services/index.js.map +1 -0
  229. package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.d.ts +30 -0
  230. package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js +233 -0
  231. package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js.map +1 -0
  232. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.d.ts +22 -0
  233. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js +98 -0
  234. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js.map +1 -0
  235. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.d.ts +22 -0
  236. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js +67 -0
  237. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js.map +1 -0
  238. package/dist/providers/index.d.ts +3 -0
  239. package/dist/providers/index.js +20 -0
  240. package/dist/providers/index.js.map +1 -0
  241. package/dist/services/LLMAssistanceService.abstract.d.ts +39 -0
  242. package/dist/services/LLMAssistanceService.abstract.js +101 -0
  243. package/dist/services/LLMAssistanceService.abstract.js.map +1 -0
  244. package/dist/services/LLMBaseService.abstract.d.ts +161 -0
  245. package/dist/services/LLMBaseService.abstract.js +392 -0
  246. package/dist/services/LLMBaseService.abstract.js.map +1 -0
  247. package/dist/services/LLMCompletionService.abstract.d.ts +16 -0
  248. package/dist/services/LLMCompletionService.abstract.js +12 -0
  249. package/dist/services/LLMCompletionService.abstract.js.map +1 -0
  250. package/dist/services/LLMServicePurposeFactory.abstract.d.ts +12 -0
  251. package/dist/services/LLMServicePurposeFactory.abstract.js +7 -0
  252. package/dist/services/LLMServicePurposeFactory.abstract.js.map +1 -0
  253. package/dist/services/LLMSpeechToTextService.abstract.d.ts +8 -0
  254. package/dist/services/LLMSpeechToTextService.abstract.js +12 -0
  255. package/dist/services/LLMSpeechToTextService.abstract.js.map +1 -0
  256. package/dist/services/LLMTextToSpeechService.abstract.d.ts +8 -0
  257. package/dist/services/LLMTextToSpeechService.abstract.js +12 -0
  258. package/dist/services/LLMTextToSpeechService.abstract.js.map +1 -0
  259. package/dist/services/agentRounds/LLMAgentRounds.d.ts +32 -0
  260. package/dist/services/agentRounds/LLMAgentRounds.js +77 -0
  261. package/dist/services/agentRounds/LLMAgentRounds.js.map +1 -0
  262. package/dist/services/agentRounds/agentRounds.typedefs.d.ts +48 -0
  263. package/dist/services/agentRounds/agentRounds.typedefs.js +3 -0
  264. package/dist/services/agentRounds/agentRounds.typedefs.js.map +1 -0
  265. package/dist/services/agentRounds/index.d.ts +2 -0
  266. package/dist/services/agentRounds/index.js +19 -0
  267. package/dist/services/agentRounds/index.js.map +1 -0
  268. package/dist/services/chatState/CompletionsChatState.d.ts +35 -0
  269. package/dist/services/chatState/CompletionsChatState.js +118 -0
  270. package/dist/services/chatState/CompletionsChatState.js.map +1 -0
  271. package/dist/services/chatState/index.d.ts +1 -0
  272. package/dist/services/chatState/index.js +6 -0
  273. package/dist/services/chatState/index.js.map +1 -0
  274. package/dist/services/fileStorage/FileStorageToolExecutor.d.ts +15 -0
  275. package/dist/services/fileStorage/FileStorageToolExecutor.js +172 -0
  276. package/dist/services/fileStorage/FileStorageToolExecutor.js.map +1 -0
  277. package/dist/services/fileStorage/InMemoryFileStorage.d.ts +20 -0
  278. package/dist/services/fileStorage/InMemoryFileStorage.js +67 -0
  279. package/dist/services/fileStorage/InMemoryFileStorage.js.map +1 -0
  280. package/dist/services/fileStorage/fileStorageTools.d.ts +26 -0
  281. package/dist/services/fileStorage/fileStorageTools.js +68 -0
  282. package/dist/services/fileStorage/fileStorageTools.js.map +1 -0
  283. package/dist/services/fileStorage/index.d.ts +4 -0
  284. package/dist/services/fileStorage/index.js +11 -0
  285. package/dist/services/fileStorage/index.js.map +1 -0
  286. package/dist/services/index.d.ts +7 -0
  287. package/dist/services/index.js +24 -0
  288. package/dist/services/index.js.map +1 -0
  289. package/dist/utilities/calculateCosts.d.ts +4 -0
  290. package/dist/utilities/calculateCosts.js +56 -0
  291. package/dist/utilities/calculateCosts.js.map +1 -0
  292. package/dist/utilities/functional.utils.d.ts +1 -0
  293. package/dist/utilities/functional.utils.js +9 -0
  294. package/dist/utilities/functional.utils.js.map +1 -0
  295. package/dist/utilities/index.d.ts +9 -0
  296. package/dist/utilities/index.js +26 -0
  297. package/dist/utilities/index.js.map +1 -0
  298. package/dist/utilities/llmTracing/index.d.ts +3 -0
  299. package/dist/utilities/llmTracing/index.js +20 -0
  300. package/dist/utilities/llmTracing/index.js.map +1 -0
  301. package/dist/utilities/llmTracing/llmTracing.constants.d.ts +7 -0
  302. package/dist/utilities/llmTracing/llmTracing.constants.js +11 -0
  303. package/dist/utilities/llmTracing/llmTracing.constants.js.map +1 -0
  304. package/dist/utilities/llmTracing/llmTracing.typedefs.d.ts +126 -0
  305. package/dist/utilities/llmTracing/llmTracing.typedefs.js +3 -0
  306. package/dist/utilities/llmTracing/llmTracing.typedefs.js.map +1 -0
  307. package/dist/utilities/llmTracing/noopLLMTracing.d.ts +3 -0
  308. package/dist/utilities/llmTracing/noopLLMTracing.js +36 -0
  309. package/dist/utilities/llmTracing/noopLLMTracing.js.map +1 -0
  310. package/dist/utilities/logger/LLMLoggerInterface.d.ts +36 -0
  311. package/dist/utilities/logger/LLMLoggerInterface.js +3 -0
  312. package/dist/utilities/logger/LLMLoggerInterface.js.map +1 -0
  313. package/dist/utilities/logger/index.d.ts +1 -0
  314. package/dist/utilities/logger/index.js +18 -0
  315. package/dist/utilities/logger/index.js.map +1 -0
  316. package/dist/utilities/promptBuilder.d.ts +58 -0
  317. package/dist/utilities/promptBuilder.js +92 -0
  318. package/dist/utilities/promptBuilder.js.map +1 -0
  319. package/dist/utilities/reporter/LLMReporterInterface.d.ts +46 -0
  320. package/dist/utilities/reporter/LLMReporterInterface.js +3 -0
  321. package/dist/utilities/reporter/LLMReporterInterface.js.map +1 -0
  322. package/dist/utilities/reporter/index.d.ts +1 -0
  323. package/dist/utilities/reporter/index.js +18 -0
  324. package/dist/utilities/reporter/index.js.map +1 -0
  325. package/dist/utilities/schema/LLMSchema.d.ts +112 -0
  326. package/dist/utilities/schema/LLMSchema.js +223 -0
  327. package/dist/utilities/schema/LLMSchema.js.map +1 -0
  328. package/dist/utilities/schema/LLMSchema.typedefs.d.ts +55 -0
  329. package/dist/utilities/schema/LLMSchema.typedefs.js +3 -0
  330. package/dist/utilities/schema/LLMSchema.typedefs.js.map +1 -0
  331. package/dist/utilities/schema/SchemaAdapterRegistry.d.ts +26 -0
  332. package/dist/utilities/schema/SchemaAdapterRegistry.js +32 -0
  333. package/dist/utilities/schema/SchemaAdapterRegistry.js.map +1 -0
  334. package/dist/utilities/schema/index.d.ts +2 -0
  335. package/dist/utilities/schema/index.js +19 -0
  336. package/dist/utilities/schema/index.js.map +1 -0
  337. package/dist/utilities/serializeError.d.ts +9 -0
  338. package/dist/utilities/serializeError.js +69 -0
  339. package/dist/utilities/serializeError.js.map +1 -0
  340. package/dist/utilities/tokenizer.d.ts +4 -0
  341. package/dist/utilities/tokenizer.js +14 -0
  342. package/dist/utilities/tokenizer.js.map +1 -0
  343. package/dist/utilities/tools/LLMTool.d.ts +5 -0
  344. package/dist/utilities/tools/LLMTool.js +10 -0
  345. package/dist/utilities/tools/LLMTool.js.map +1 -0
  346. package/dist/utilities/tools/index.d.ts +2 -0
  347. package/dist/utilities/tools/index.js +8 -0
  348. package/dist/utilities/tools/index.js.map +1 -0
  349. package/dist/utilities/tools/normalizeToolResult.d.ts +15 -0
  350. package/dist/utilities/tools/normalizeToolResult.js +18 -0
  351. package/dist/utilities/tools/normalizeToolResult.js.map +1 -0
  352. package/package.json +1 -1
@@ -0,0 +1,825 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLMAPIAssistanceService = void 0;
4
+ const openai_1 = require("openai");
5
+ const uuid_1 = require("uuid");
6
+ const LLMService_typedefs_1 = require("../../../LLMService.typedefs");
7
+ const LLMService_constants_1 = require("../../../LLMService.constants");
8
+ const serializeError_1 = require("../../../utilities/serializeError");
9
+ const services_1 = require("../../../services");
10
+ const tools_1 = require("../../../utilities/tools");
11
+ const LLMAPI_typedefs_1 = require("../../../providers/LLMAPI/LLMAPI.typedefs");
12
+ const LLMAPI_entity_1 = require("../../../providers/LLMAPI/LLMAPI.entity");
13
+ const utilities_1 = require("../../../providers/LLMAPI/utilities");
14
+ const OpenAI_entity_1 = require("../../../providers/OpenAI/OpenAI.entity");
15
+ const fileStorage_1 = require("../../../services/fileStorage");
16
+ const chatState_1 = require("../../../services/chatState");
17
+ const FILE_STORAGE_TOOL_NAMES = Object.values(fileStorage_1.FileStorageToolName);
18
+ const GEMINI_THOUGHT_SIGNATURE_VALIDATOR_BYPASS = 'skip_thought_signature_validator';
19
+ class LLMAPIAssistanceService extends services_1.LLMAssistanceService {
20
+ fileStorage = new fileStorage_1.InMemoryFileStorage();
21
+ chatState = new chatState_1.CompletionsChatState();
22
+ toolExecutor = new fileStorage_1.FileStorageToolExecutor(this.fileStorage);
23
+ fileContextInjectedChats = new Set();
24
+ constructor(logger, reporter, options) {
25
+ super(LLMService_typedefs_1.LLMProviders.LLMAPI, logger, reporter, options);
26
+ }
27
+ get instance() {
28
+ return this.getOrCreateInstance(() => new openai_1.OpenAI({
29
+ ...this.options,
30
+ baseURL: LLMAPI_typedefs_1.LLMAPI_BASE_URL,
31
+ }));
32
+ }
33
+ async uploadFile(fileOptions) {
34
+ const { path, name, mimeType, abortSignal, reporterContext, } = fileOptions;
35
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
36
+ try {
37
+ abortSignal?.throwIfAborted();
38
+ const existingFile = this.fileStorage.getFileByPath(path);
39
+ if (existingFile) {
40
+ await this.writeSuccessMetrics({
41
+ method: this.getMethodName(this.uploadFile),
42
+ model: null,
43
+ usage: {},
44
+ writeMetrics,
45
+ });
46
+ return {
47
+ fileId: existingFile.fileId,
48
+ name: existingFile.name,
49
+ path: existingFile.path,
50
+ mimeType: existingFile.mimeType,
51
+ };
52
+ }
53
+ const storedFile = this.fileStorage.addFile(path, name, mimeType);
54
+ const uploadedFileInfo = {
55
+ fileId: storedFile.fileId,
56
+ name: storedFile.name,
57
+ path: storedFile.path,
58
+ mimeType: storedFile.mimeType,
59
+ };
60
+ await this.writeSuccessMetrics({
61
+ method: this.getMethodName(this.uploadFile),
62
+ model: null,
63
+ usage: {},
64
+ writeMetrics,
65
+ });
66
+ return uploadedFileInfo;
67
+ }
68
+ catch (error) {
69
+ await this.writeErrorMetrics({
70
+ method: this.getMethodName(this.uploadFile),
71
+ model: null,
72
+ writeMetrics,
73
+ });
74
+ this.logger?.child(this.getMethodName(this.uploadFile))
75
+ .error('Error uploading file', {
76
+ error: (0, serializeError_1.serializeError)(error),
77
+ file: fileOptions,
78
+ });
79
+ return {
80
+ error: error instanceof Error
81
+ ? error
82
+ : new Error(String(error)),
83
+ };
84
+ }
85
+ }
86
+ async getFile(path) {
87
+ const storedFile = this.fileStorage.getFileByPath(path);
88
+ if (!storedFile) {
89
+ return null;
90
+ }
91
+ return {
92
+ fileId: storedFile.fileId,
93
+ name: storedFile.name,
94
+ path: storedFile.path,
95
+ mimeType: storedFile.mimeType,
96
+ };
97
+ }
98
+ async deleteFile(fileId) {
99
+ this.fileStorage.removeFile(fileId);
100
+ }
101
+ async createFileStorage(options) {
102
+ const { uploadedFiles, abortSignal, reporterContext, } = options;
103
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
104
+ try {
105
+ abortSignal?.throwIfAborted();
106
+ const storageId = this.fileStorage.createStorage(uploadedFiles.map((file) => file.fileId));
107
+ await this.writeSuccessMetrics({
108
+ method: this.getMethodName(this.createFileStorage),
109
+ model: null,
110
+ usage: {},
111
+ writeMetrics,
112
+ });
113
+ return { storageId };
114
+ }
115
+ catch (error) {
116
+ await this.writeErrorMetrics({
117
+ method: this.getMethodName(this.createFileStorage),
118
+ model: null,
119
+ writeMetrics,
120
+ });
121
+ this.logger?.child(this.getMethodName(this.createFileStorage))
122
+ .error('Error creating file storage', {
123
+ error: (0, serializeError_1.serializeError)(error),
124
+ uploadedFiles,
125
+ });
126
+ return {
127
+ error: error instanceof Error
128
+ ? error
129
+ : new Error(String(error)),
130
+ };
131
+ }
132
+ }
133
+ async deleteFileStorage(storageId) {
134
+ this.fileStorage.removeStorage(storageId);
135
+ }
136
+ async createChat(options) {
137
+ const { model, instructions, history = [], storageId, abortSignal, reporterContext, } = options;
138
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
139
+ try {
140
+ abortSignal?.throwIfAborted();
141
+ const chatId = (0, uuid_1.v4)();
142
+ const convertedHistory = LLMAPI_entity_1.LLMAPIEntity
143
+ .convertAssistanceHistoryToCompletions(history);
144
+ this.chatState.createChat(chatId, instructions, storageId, convertedHistory);
145
+ await this.writeSuccessMetrics({
146
+ method: this.getMethodName(this.createChat),
147
+ model,
148
+ usage: {},
149
+ writeMetrics,
150
+ });
151
+ return { chatId };
152
+ }
153
+ catch (error) {
154
+ await this.writeErrorMetrics({
155
+ method: this.getMethodName(this.createChat),
156
+ model,
157
+ writeMetrics,
158
+ });
159
+ this.logger?.child(this.getMethodName(this.createChat))
160
+ .error('Error creating chat', {
161
+ error: (0, serializeError_1.serializeError)(error),
162
+ options,
163
+ });
164
+ return {
165
+ error: error instanceof Error
166
+ ? error
167
+ : new Error(String(error)),
168
+ };
169
+ }
170
+ }
171
+ async deleteChat(chatId) {
172
+ this.chatState.deleteChat(chatId);
173
+ this.fileContextInjectedChats.delete(chatId);
174
+ }
175
+ async countTokens(messages) {
176
+ const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
177
+ const messageContents = messages.flatMap((message) => message.content);
178
+ return countTokensFn(messageContents);
179
+ }
180
+ async assistInChatText(options) {
181
+ const { model, chatId, abortSignal, reporterContext, tools: customTools, maxToolIterations = LLMService_constants_1.DEFAULT_MAX_TOOL_ITERATIONS, traceContext, } = options;
182
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
183
+ const method = this.getMethodName(this.assistInChatText);
184
+ const generationStartedAt = Date.now();
185
+ const rounds = this.openAgentRounds({
186
+ method,
187
+ model,
188
+ traceContext,
189
+ modelParameters: model.config,
190
+ });
191
+ try {
192
+ const { storageId, tools, } = this.prepareChatForAssist(options);
193
+ const toolLoopResult = await this.executeToolLoop({
194
+ chatId,
195
+ model,
196
+ tools,
197
+ storageId,
198
+ customTools,
199
+ maxToolIterations,
200
+ abortSignal,
201
+ rounds,
202
+ onAssistantNarration: options.onAssistantNarration,
203
+ });
204
+ const text = toolLoopResult.text;
205
+ this.chatState.appendAssistantMessage(chatId, text);
206
+ await this.writeSuccessMetrics({
207
+ method,
208
+ model,
209
+ usage: this.buildToolLoopUsage(toolLoopResult),
210
+ writeMetrics,
211
+ });
212
+ return {
213
+ text,
214
+ toolIterationsUsed: toolLoopResult.toolIterationsUsed,
215
+ ...(toolLoopResult.toolIterationsExhausted && {
216
+ toolIterationsExhausted: true,
217
+ }),
218
+ stopReason: toolLoopResult.stopReason,
219
+ ...(toolLoopResult.terminalTool && {
220
+ terminalTool: toolLoopResult.terminalTool,
221
+ }),
222
+ };
223
+ }
224
+ catch (error) {
225
+ await this.writeErrorMetrics({
226
+ method,
227
+ model,
228
+ isAborted: abortSignal?.aborted,
229
+ writeMetrics,
230
+ error,
231
+ generationTrace: this.buildUnstartedRunTrace({
232
+ rounds,
233
+ method,
234
+ traceContext,
235
+ input: options.message,
236
+ modelParameters: model.config,
237
+ startedAt: generationStartedAt,
238
+ }),
239
+ });
240
+ this.logRequestFailure({
241
+ method,
242
+ message: 'Error assisting in chat',
243
+ error,
244
+ isAborted: abortSignal?.aborted,
245
+ meta: { options },
246
+ });
247
+ return {
248
+ error: error instanceof Error
249
+ ? error
250
+ : new Error(String(error)),
251
+ };
252
+ }
253
+ }
254
+ async assistInChatStructured(options) {
255
+ const { model, chatId, abortSignal, schema, reporterContext, tools: customTools, maxToolIterations = LLMService_constants_1.DEFAULT_MAX_TOOL_ITERATIONS, traceContext, } = options;
256
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
257
+ const method = this.getMethodName(this.assistInChatStructured);
258
+ const generationStartedAt = Date.now();
259
+ const rounds = this.openAgentRounds({
260
+ method,
261
+ model,
262
+ traceContext,
263
+ modelParameters: model.config,
264
+ });
265
+ try {
266
+ const { storageId, tools } = this.prepareChatForAssist(options);
267
+ const jsonSchema = schema._toProviderSchema(LLMService_typedefs_1.LLMProviders.LLMAPI);
268
+ const supportsStructuredOutputs = model.capabilities?.structuredOutputs === true;
269
+ const schemaRestore = supportsStructuredOutputs
270
+ ? undefined
271
+ : this.injectSchemaInstruction(chatId, jsonSchema);
272
+ const responseFormat = (0, utilities_1.buildLLMAPIResponseFormat)(model, jsonSchema);
273
+ const toolLoopResult = await this.executeToolLoop({
274
+ chatId,
275
+ model,
276
+ tools,
277
+ storageId,
278
+ customTools,
279
+ maxToolIterations,
280
+ abortSignal,
281
+ responseFormat,
282
+ rounds,
283
+ onAssistantNarration: options.onAssistantNarration,
284
+ });
285
+ const text = (0, utilities_1.stripThinkingTags)(toolLoopResult.text);
286
+ schemaRestore?.();
287
+ this.chatState.appendAssistantMessage(chatId, text);
288
+ const usage = this.buildToolLoopUsage(toolLoopResult);
289
+ if (toolLoopResult.terminalTool) {
290
+ await this.writeSuccessMetrics({
291
+ method,
292
+ model,
293
+ usage,
294
+ writeMetrics,
295
+ });
296
+ return {
297
+ text,
298
+ toolIterationsUsed: toolLoopResult.toolIterationsUsed,
299
+ stopReason: toolLoopResult.stopReason,
300
+ terminalTool: toolLoopResult.terminalTool,
301
+ };
302
+ }
303
+ const structuredResult = (0, utilities_1.validateStructuredResponse)({
304
+ content: text,
305
+ schema,
306
+ usage,
307
+ });
308
+ if ('parseError' in structuredResult) {
309
+ await this.writeErrorMetrics({
310
+ method: this.getMethodName(this.assistInChatStructured),
311
+ model,
312
+ isAborted: abortSignal?.aborted,
313
+ writeMetrics,
314
+ });
315
+ return structuredResult;
316
+ }
317
+ await this.writeSuccessMetrics({
318
+ method,
319
+ model,
320
+ usage,
321
+ writeMetrics,
322
+ });
323
+ if ('error' in structuredResult) {
324
+ return structuredResult;
325
+ }
326
+ return {
327
+ ...structuredResult,
328
+ toolIterationsUsed: toolLoopResult.toolIterationsUsed,
329
+ ...(toolLoopResult.toolIterationsExhausted && {
330
+ toolIterationsExhausted: true,
331
+ }),
332
+ stopReason: toolLoopResult.stopReason,
333
+ };
334
+ }
335
+ catch (error) {
336
+ await this.writeErrorMetrics({
337
+ method,
338
+ model,
339
+ isAborted: abortSignal?.aborted,
340
+ writeMetrics,
341
+ error,
342
+ generationTrace: this.buildUnstartedRunTrace({
343
+ rounds,
344
+ method,
345
+ traceContext,
346
+ input: options.message,
347
+ modelParameters: model.config,
348
+ startedAt: generationStartedAt,
349
+ }),
350
+ });
351
+ this.logRequestFailure({
352
+ method,
353
+ message: 'Error assisting in chat with structured output',
354
+ error,
355
+ isAborted: abortSignal?.aborted,
356
+ meta: { options },
357
+ });
358
+ return {
359
+ text: '',
360
+ error: error instanceof Error
361
+ ? error
362
+ : new Error(String(error)),
363
+ parseError: 'Failed to get structured response'
364
+ + ' from LLMAPI',
365
+ };
366
+ }
367
+ }
368
+ prepareChatForAssist(options) {
369
+ const { chatId, message, storageId: optionsStorageId, tools: customTools, } = options;
370
+ const chat = this.chatState.getChat(chatId);
371
+ if (!chat) {
372
+ throw new Error('Chat session not found');
373
+ }
374
+ const storageId = chat.storageId ?? optionsStorageId;
375
+ this.appendUserMessageToChat(chatId, message);
376
+ this.injectFileContext(chatId, storageId);
377
+ const tools = this.buildToolsArray(storageId, customTools);
378
+ return { storageId, tools };
379
+ }
380
+ appendUserMessageToChat(chatId, message) {
381
+ const convertedMessage = LLMAPI_entity_1.LLMAPIEntity
382
+ .convertAssistanceMessageToCompletion(message);
383
+ const content = convertedMessage.content;
384
+ if (typeof content === 'string') {
385
+ this.chatState.appendUserMessage(chatId, [{ type: 'text', text: content }]);
386
+ return;
387
+ }
388
+ if (Array.isArray(content)) {
389
+ this.chatState.appendUserMessage(chatId, content);
390
+ return;
391
+ }
392
+ this.chatState.appendUserMessage(chatId, [{ type: 'text', text: '' }]);
393
+ }
394
+ injectSchemaInstruction(chatId, jsonSchema) {
395
+ const schemaInstruction = (0, utilities_1.buildSchemaInstruction)(jsonSchema);
396
+ const messages = this.chatState.getMessages(chatId);
397
+ const systemMessageIndex = messages.findIndex((msg) => msg.role === 'system');
398
+ if (systemMessageIndex >= 0) {
399
+ const originalMessage = messages[systemMessageIndex];
400
+ const existingContent = typeof originalMessage.content === 'string'
401
+ ? originalMessage.content
402
+ : '';
403
+ messages[systemMessageIndex] = {
404
+ role: 'system',
405
+ content: existingContent
406
+ ? `${existingContent}\n\n`
407
+ + schemaInstruction
408
+ : schemaInstruction,
409
+ };
410
+ return () => {
411
+ messages[systemMessageIndex] = originalMessage;
412
+ };
413
+ }
414
+ messages.unshift({
415
+ role: 'system',
416
+ content: schemaInstruction,
417
+ });
418
+ return () => {
419
+ messages.shift();
420
+ };
421
+ }
422
+ /**
423
+ * One round's usage, mapped exactly as `buildToolLoopUsage` maps the run
424
+ * total, so the per-round generations add up to the single metrics point the
425
+ * run still writes.
426
+ */
427
+ buildRoundUsage(usage) {
428
+ return this.buildToolLoopUsage({
429
+ totalPromptTokens: usage?.prompt_tokens ?? 0,
430
+ totalCachedTokens: usage?.prompt_tokens_details?.cached_tokens ?? 0,
431
+ totalOutputTokens: usage?.completion_tokens ?? 0,
432
+ totalReasoningTokens: usage?.completion_tokens_details?.reasoning_tokens ?? 0,
433
+ });
434
+ }
435
+ buildToolLoopUsage(result) {
436
+ return {
437
+ inputTextTokens: result.totalPromptTokens
438
+ - result.totalCachedTokens,
439
+ inputCachedTextTokens: result.totalCachedTokens,
440
+ outputTextTokens: result.totalOutputTokens,
441
+ outputReasoningTokens: result.totalReasoningTokens,
442
+ };
443
+ }
444
+ injectFileContext(chatId, storageId) {
445
+ if (!storageId) {
446
+ return;
447
+ }
448
+ if (this.fileContextInjectedChats.has(chatId)) {
449
+ return;
450
+ }
451
+ const files = this.fileStorage.getStorageFiles(storageId);
452
+ if (files.length === 0) {
453
+ return;
454
+ }
455
+ const fileContents = files.map((file) => `--- File: ${file.name} ---\n`
456
+ + file.content
457
+ + '\n--- End of file ---').join('\n\n');
458
+ const fileContext = 'The following files have been uploaded'
459
+ + ' for reference:\n\n'
460
+ + fileContents;
461
+ const messages = this.chatState.getMessages(chatId);
462
+ const systemMessage = messages.find((msg) => msg.role === 'system');
463
+ if (systemMessage && 'content' in systemMessage) {
464
+ const existingContent = typeof systemMessage.content === 'string'
465
+ ? systemMessage.content
466
+ : '';
467
+ systemMessage.content = existingContent
468
+ ? `${existingContent}\n\n${fileContext}`
469
+ : fileContext;
470
+ }
471
+ else {
472
+ messages.unshift({
473
+ role: 'system',
474
+ content: fileContext,
475
+ });
476
+ }
477
+ this.fileContextInjectedChats.add(chatId);
478
+ }
479
+ buildToolsArray(storageId, customTools) {
480
+ const tools = [];
481
+ if (customTools?.length) {
482
+ this.validateToolDefinitions(customTools);
483
+ if (storageId) {
484
+ tools.push(...(0, fileStorage_1.getFileStorageToolsForChatCompletions)());
485
+ }
486
+ for (const tool of customTools) {
487
+ tools.push({
488
+ type: 'function',
489
+ function: {
490
+ name: tool.name,
491
+ description: tool.description,
492
+ parameters: tool.parameters
493
+ ._toProviderSchema(LLMService_typedefs_1.LLMProviders.LLMAPI),
494
+ },
495
+ });
496
+ }
497
+ }
498
+ return tools;
499
+ }
500
+ async executeToolLoop(options) {
501
+ const { chatId, model, tools, storageId, customTools, maxToolIterations, abortSignal, rounds, responseFormat, onAssistantNarration, } = options;
502
+ let totalPromptTokens = 0;
503
+ let totalCachedTokens = 0;
504
+ let totalOutputTokens = 0;
505
+ let totalReasoningTokens = 0;
506
+ let lastResponseText = '';
507
+ let toolIterationsUsed = 0;
508
+ let toolIterationsExhausted = false;
509
+ let terminalTool;
510
+ for (let iteration = 0; iteration < maxToolIterations; iteration++) {
511
+ abortSignal?.throwIfAborted();
512
+ toolIterationsUsed = iteration + 1;
513
+ toolIterationsExhausted = toolIterationsUsed >= maxToolIterations;
514
+ const hasTools = tools.length > 0;
515
+ this.logOutgoingToolCalls(chatId, iteration);
516
+ const response = await rounds.run({
517
+ input: [...this.chatState.getMessages(chatId)],
518
+ call: () => this.createToolLoopCompletion({
519
+ chatId,
520
+ model,
521
+ tools: hasTools ? tools : undefined,
522
+ responseFormat,
523
+ abortSignal,
524
+ }),
525
+ describeOutcome: (completion) => ({
526
+ output: completion.choices[0]?.message,
527
+ usage: this.buildRoundUsage(completion.usage),
528
+ }),
529
+ });
530
+ const choice = response.choices[0];
531
+ totalPromptTokens += response.usage?.prompt_tokens ?? 0;
532
+ totalCachedTokens +=
533
+ response.usage?.prompt_tokens_details?.cached_tokens ?? 0;
534
+ totalOutputTokens += response.usage?.completion_tokens ?? 0;
535
+ totalReasoningTokens +=
536
+ response.usage?.completion_tokens_details?.reasoning_tokens ?? 0;
537
+ const resolvedToolCalls = this.resolveToolCalls(choice);
538
+ if (resolvedToolCalls.toolCalls.length === 0) {
539
+ lastResponseText = resolvedToolCalls.assistantContent;
540
+ toolIterationsExhausted = false;
541
+ break;
542
+ }
543
+ const { toolCalls, assistantContent, reasoningContent } = resolvedToolCalls;
544
+ if (onAssistantNarration) {
545
+ onAssistantNarration(this.extractVisibleToolRoundText(choice, resolvedToolCalls));
546
+ }
547
+ const executedCalls = await Promise.all(toolCalls.map((toolCall) => this.dispatchToolCall(storageId, toolCall, customTools)));
548
+ const terminalCall = executedCalls.find((executed) => executed.isTerminal);
549
+ if (terminalCall) {
550
+ abortSignal?.throwIfAborted();
551
+ terminalTool = {
552
+ name: terminalCall.toolName,
553
+ output: terminalCall.output,
554
+ };
555
+ lastResponseText = this.extractVisibleToolRoundText(choice, resolvedToolCalls);
556
+ toolIterationsExhausted = false;
557
+ break;
558
+ }
559
+ const results = executedCalls.map((executed) => executed.result);
560
+ this.appendToolInteractionMessages({
561
+ chatId,
562
+ modelName: model.name,
563
+ toolCalls,
564
+ results,
565
+ reasoningContent,
566
+ assistantContent,
567
+ });
568
+ this.appendToolResultImages(chatId, results);
569
+ }
570
+ if (toolIterationsExhausted) {
571
+ this.logger?.child(this.getMethodName(this.executeToolLoop)).warn('Tool loop reached maxToolIterations', {
572
+ maxToolIterations,
573
+ toolIterationsUsed,
574
+ });
575
+ }
576
+ return {
577
+ text: lastResponseText,
578
+ totalPromptTokens,
579
+ totalCachedTokens,
580
+ totalOutputTokens,
581
+ totalReasoningTokens,
582
+ toolIterationsUsed,
583
+ toolIterationsExhausted,
584
+ stopReason: this.resolveToolLoopStopReason({
585
+ terminalTool,
586
+ toolIterationsExhausted,
587
+ }),
588
+ terminalTool,
589
+ };
590
+ }
591
+ /**
592
+ * Executes one tool-loop round trip. Gemini through the proxy occasionally
593
+ * rejects a previously-issued thought_signature on replay with HTTP 400
594
+ * "Corrupted thought signature."; the recovery downgrades every recorded
595
+ * signature to the documented validator-bypass marker and retries the same
596
+ * request once.
597
+ */
598
+ async createToolLoopCompletion(options) {
599
+ const { chatId, model, tools, responseFormat, abortSignal } = options;
600
+ const createCompletion = () => this.instance.chat.completions.create({
601
+ model: model.name,
602
+ messages: this.chatState.getMessages(chatId),
603
+ ...model.config,
604
+ ...(tools && { tools }),
605
+ ...(responseFormat && {
606
+ response_format: responseFormat,
607
+ }),
608
+ }, { signal: abortSignal });
609
+ try {
610
+ return await createCompletion();
611
+ }
612
+ catch (error) {
613
+ if (!this.isCorruptedThoughtSignatureError(error)) {
614
+ throw error;
615
+ }
616
+ this.logger?.child(this.getMethodName(this.executeToolLoop)).warn('Recovering from corrupted thought signature', {
617
+ chatId,
618
+ model: model.name,
619
+ });
620
+ this.chatState.replaceThoughtSignatures(chatId, GEMINI_THOUGHT_SIGNATURE_VALIDATOR_BYPASS);
621
+ return createCompletion();
622
+ }
623
+ }
624
+ isCorruptedThoughtSignatureError(error) {
625
+ if (!(error instanceof Error)) {
626
+ return false;
627
+ }
628
+ const status = error.status;
629
+ return status === 400
630
+ && error.message.includes('Corrupted thought signature');
631
+ }
632
+ resolveToolCalls(choice) {
633
+ const hasStandardToolCalls = choice?.finish_reason === 'tool_calls'
634
+ && choice.message.tool_calls?.length;
635
+ if (hasStandardToolCalls) {
636
+ const reasoningContent = choice.message
637
+ ?.reasoning_content;
638
+ return {
639
+ toolCalls: choice.message.tool_calls,
640
+ assistantContent: '',
641
+ reasoningContent,
642
+ };
643
+ }
644
+ const responseText = choice?.message.content ?? '';
645
+ const xmlParsed = (0, utilities_1.parseXmlToolCalls)(responseText);
646
+ if (xmlParsed.toolCalls.length === 0) {
647
+ return {
648
+ toolCalls: [],
649
+ assistantContent: responseText,
650
+ reasoningContent: undefined,
651
+ };
652
+ }
653
+ return {
654
+ toolCalls: xmlParsed.toolCalls,
655
+ assistantContent: xmlParsed.textWithoutToolCalls,
656
+ reasoningContent: undefined,
657
+ };
658
+ }
659
+ /**
660
+ * The visible assistant text a continuing tool-loop round produced, with
661
+ * thinking tags stripped. Standard tool-call turns carry prose in
662
+ * `message.content` alongside the calls; the XML fallback path already split
663
+ * prose from markup into `assistantContent`.
664
+ */
665
+ extractVisibleToolRoundText(choice, resolvedToolCalls) {
666
+ const isStandardToolCall = choice?.finish_reason === 'tool_calls'
667
+ && !!choice.message.tool_calls?.length;
668
+ const visibleText = isStandardToolCall
669
+ ? (choice?.message.content ?? '')
670
+ : resolvedToolCalls.assistantContent;
671
+ return (0, utilities_1.stripThinkingTags)(visibleText);
672
+ }
673
+ appendToolInteractionMessages(options) {
674
+ const { chatId, modelName, toolCalls, results, reasoningContent, assistantContent, } = options;
675
+ if (this.shouldSerializeToolHistory(modelName, toolCalls)) {
676
+ for (let index = 0; index < toolCalls.length; index++) {
677
+ this.chatState.appendToolCallMessages(chatId, [this.withThoughtSignatureFallback(toolCalls[index])], index === 0 ? reasoningContent : undefined, index === 0 ? assistantContent : '');
678
+ this.chatState.appendToolResult(chatId, toolCalls[index].id, results[index].content);
679
+ }
680
+ return;
681
+ }
682
+ this.chatState.appendToolCallMessages(chatId, toolCalls, reasoningContent, assistantContent);
683
+ for (let index = 0; index < toolCalls.length; index++) {
684
+ this.chatState.appendToolResult(chatId, toolCalls[index].id, results[index].content);
685
+ }
686
+ }
687
+ /**
688
+ * Gemini cannot re-pair the proxy-synthesized ids of multiple parallel tool
689
+ * calls replayed in one turn, so a Gemini multi-call turn is recorded as
690
+ * sequential single-call turns (so each function-call turn has exactly one
691
+ * matching response). Gemini also signs only the first parallel call, so the
692
+ * split turns that carry no signature get the documented validator-bypass
693
+ * marker; the first call keeps its real thought_signature verbatim.
694
+ */
695
+ shouldSerializeToolHistory(modelName, toolCalls) {
696
+ return toolCalls.length > 1 && modelName.includes('gemini-');
697
+ }
698
+ withThoughtSignatureFallback(toolCall) {
699
+ if (toolCall.extra_content?.google?.thought_signature) {
700
+ return toolCall;
701
+ }
702
+ return {
703
+ ...toolCall,
704
+ extra_content: {
705
+ ...toolCall.extra_content,
706
+ google: {
707
+ ...toolCall.extra_content?.google,
708
+ thought_signature: GEMINI_THOUGHT_SIGNATURE_VALIDATOR_BYPASS,
709
+ },
710
+ },
711
+ };
712
+ }
713
+ logOutgoingToolCalls(chatId, iteration) {
714
+ if (process.env.LLM_GATEWAY_DEBUG_TOOL_CALLS !== 'true') {
715
+ return;
716
+ }
717
+ const assistantToolTurns = this.chatState.getMessages(chatId)
718
+ .filter((message) => message.role === 'assistant'
719
+ && Array.isArray(message.tool_calls))
720
+ .map((message) => message.tool_calls.map((toolCall) => {
721
+ const signature = toolCall.extra_content?.google?.thought_signature;
722
+ return {
723
+ id: toolCall.id,
724
+ hasExtraContent: toolCall.extra_content !== undefined,
725
+ signatureLength: signature?.length ?? 0,
726
+ };
727
+ }));
728
+ this.logger?.child(this.getMethodName(this.executeToolLoop)).debug?.('Outgoing tool-call turns', {
729
+ iteration,
730
+ assistantToolTurns,
731
+ });
732
+ }
733
+ /**
734
+ * Chat Completions cannot carry images in a `tool`-role message, so any
735
+ * images a tool returned are surfaced to the model as a separate user
736
+ * message appended right after the batch of tool results.
737
+ */
738
+ appendToolResultImages(chatId, results) {
739
+ const images = results.flatMap((result) => result.images);
740
+ if (images.length === 0) {
741
+ return;
742
+ }
743
+ this.chatState.appendUserMessage(chatId, this.buildToolImageMessageParts(images));
744
+ }
745
+ buildToolImageMessageParts(images) {
746
+ return images.flatMap((image) => {
747
+ const imagePart = {
748
+ type: 'image_url',
749
+ image_url: {
750
+ url: image.url,
751
+ ...(image.detail && { detail: image.detail }),
752
+ },
753
+ };
754
+ if (!image.label) {
755
+ return [imagePart];
756
+ }
757
+ const labelPart = {
758
+ type: 'text',
759
+ text: image.label,
760
+ };
761
+ return [labelPart, imagePart];
762
+ });
763
+ }
764
+ async dispatchToolCall(storageId, toolCall, customTools) {
765
+ const toolName = toolCall.function.name;
766
+ const isFileStorageTool = FILE_STORAGE_TOOL_NAMES.includes(toolName);
767
+ if (isFileStorageTool && storageId) {
768
+ const fileStorageResult = await this.toolExecutor.execute(storageId, toolName, toolCall.function.arguments);
769
+ return {
770
+ toolName,
771
+ result: { content: fileStorageResult, images: [] },
772
+ output: fileStorageResult,
773
+ isTerminal: false,
774
+ };
775
+ }
776
+ const customTool = customTools?.find((tool) => tool.name === toolName);
777
+ if (!customTool) {
778
+ const unknownToolMessage = `Unknown tool: '${toolName}'`;
779
+ return {
780
+ toolName,
781
+ result: { content: unknownToolMessage, images: [] },
782
+ output: unknownToolMessage,
783
+ isTerminal: false,
784
+ };
785
+ }
786
+ const isTerminal = customTool.terminal === true;
787
+ try {
788
+ const parsedArguments = JSON.parse(toolCall.function.arguments);
789
+ const result = await this.getTracer().withToolObservation(`${this.serviceName}/tool:${toolName}`, parsedArguments, () => Promise.resolve(customTool.execute(parsedArguments)));
790
+ const normalized = (0, tools_1.normalizeToolResult)(result);
791
+ return {
792
+ toolName,
793
+ result: {
794
+ content: normalized.content.length > 0
795
+ ? normalized.content
796
+ : `Tool '${toolName}' completed.`,
797
+ images: normalized.images,
798
+ },
799
+ output: result,
800
+ isTerminal,
801
+ };
802
+ }
803
+ catch (error) {
804
+ const errorMessage = error instanceof Error
805
+ ? error.message
806
+ : String(error);
807
+ this.logger
808
+ ?.child(this.getMethodName(this.dispatchToolCall))
809
+ .error('Tool execution failed', {
810
+ toolName,
811
+ error: (0, serializeError_1.serializeError)(error),
812
+ });
813
+ const failureMessage = `Error executing tool '${toolName}':`
814
+ + ` ${errorMessage}`;
815
+ return {
816
+ toolName,
817
+ result: { content: failureMessage, images: [] },
818
+ output: failureMessage,
819
+ isTerminal,
820
+ };
821
+ }
822
+ }
823
+ }
824
+ exports.LLMAPIAssistanceService = LLMAPIAssistanceService;
825
+ //# sourceMappingURL=LLMAPIAssistance.service.js.map