@whxway/loom 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/diagnostics/route-bundle-stats.json +35 -35
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/server/app/(auth)/login/page_client-reference-manifest.js +1 -1
  7. package/.next/server/app/(dashboard)/logs/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(dashboard)/mcp/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/(dashboard)/mcp/presets/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(dashboard)/models/[name]/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(dashboard)/playground/audio/speech/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/(dashboard)/playground/audio/transcription/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(dashboard)/playground/chat/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/(dashboard)/playground/embedding/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(dashboard)/playground/image/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/(dashboard)/playground/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(dashboard)/playground/video/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/(dashboard)/providers/[name]/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(dashboard)/providers/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/(dashboard)/settings/api-keys/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/(dashboard)/settings/users/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/_global-error.html +1 -1
  25. package/.next/server/app/_global-error.rsc +1 -1
  26. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  29. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  30. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/_not-found.html +2 -2
  33. package/.next/server/app/_not-found.rsc +3 -3
  34. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  35. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  37. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  38. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  39. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/api/adapters/route.js.nft.json +1 -1
  41. package/.next/server/app/api/apikeys/[id]/route.js.nft.json +1 -1
  42. package/.next/server/app/api/apikeys/route.js.nft.json +1 -1
  43. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  44. package/.next/server/app/api/conversations/[id]/messages/route.js.nft.json +1 -1
  45. package/.next/server/app/api/conversations/[id]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  47. package/.next/server/app/api/health/route.js.nft.json +1 -1
  48. package/.next/server/app/api/login/route.js.nft.json +1 -1
  49. package/.next/server/app/api/logout/route.js.nft.json +1 -1
  50. package/.next/server/app/api/logs/generations/[id]/images/[idx]/route.js.nft.json +1 -1
  51. package/.next/server/app/api/logs/generations/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/logs/generations/route.js.nft.json +1 -1
  53. package/.next/server/app/api/mcp/presets/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/servers/[id]/check/route.js +1 -1
  55. package/.next/server/app/api/mcp/servers/[id]/check/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/servers/[id]/route.js.nft.json +1 -1
  57. package/.next/server/app/api/mcp/servers/[id]/tools/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  59. package/.next/server/app/api/messages/[id]/rate/route.js.nft.json +1 -1
  60. package/.next/server/app/api/models/[id]/route.js.nft.json +1 -1
  61. package/.next/server/app/api/models/route.js.nft.json +1 -1
  62. package/.next/server/app/api/ping/route.js.nft.json +1 -1
  63. package/.next/server/app/api/playground/chat/route.js +4 -4
  64. package/.next/server/app/api/playground/chat/route.js.nft.json +1 -1
  65. package/.next/server/app/api/playground/embedding/route.js +4 -4
  66. package/.next/server/app/api/playground/embedding/route.js.nft.json +1 -1
  67. package/.next/server/app/api/providers/[id]/check/route.js.nft.json +1 -1
  68. package/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  69. package/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/providers/probe/route.js.nft.json +1 -1
  71. package/.next/server/app/api/providers/reload/route.js.nft.json +1 -1
  72. package/.next/server/app/api/providers/route.js.nft.json +1 -1
  73. package/.next/server/app/api/stats/models/[name]/route.js.nft.json +1 -1
  74. package/.next/server/app/api/stats/route.js.nft.json +1 -1
  75. package/.next/server/app/api/tools/[id]/route.js.nft.json +1 -1
  76. package/.next/server/app/api/tools/route.js.nft.json +1 -1
  77. package/.next/server/app/api/users/[username]/route.js.nft.json +1 -1
  78. package/.next/server/app/api/users/me/preferences/route.js +1 -1
  79. package/.next/server/app/api/users/me/preferences/route.js.nft.json +1 -1
  80. package/.next/server/app/api/users/me/route.js.nft.json +1 -1
  81. package/.next/server/app/api/users/route.js.nft.json +1 -1
  82. package/.next/server/app/api/v1/audio/speech/route.js +1 -1
  83. package/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  84. package/.next/server/app/api/v1/audio/transcriptions/route.js +4 -4
  85. package/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  86. package/.next/server/app/api/v1/chat/completions/route.js +1 -1
  87. package/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  88. package/.next/server/app/api/v1/embeddings/route.js +1 -1
  89. package/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  90. package/.next/server/app/api/v1/images/generations/route.js +1 -1
  91. package/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  92. package/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  93. package/.next/server/app/api/v1/rerank/route.js +1 -1
  94. package/.next/server/app/api/v1/rerank/route.js.nft.json +1 -1
  95. package/.next/server/app/api/v1/videos/[id]/content/route.js +4 -4
  96. package/.next/server/app/api/v1/videos/[id]/content/route.js.nft.json +1 -1
  97. package/.next/server/app/api/v1/videos/[id]/route.js +4 -4
  98. package/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/v1/videos/route.js +1 -1
  100. package/.next/server/app/api/v1/videos/route.js.nft.json +1 -1
  101. package/.next/server/app/api/variants/route.js.nft.json +1 -1
  102. package/.next/server/app/index.html +2 -2
  103. package/.next/server/app/index.rsc +7 -7
  104. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk/__PAGE__.segment.rsc +2 -2
  105. package/.next/server/app/index.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  106. package/.next/server/app/index.segments/_full.segment.rsc +7 -7
  107. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/login.html +2 -2
  111. package/.next/server/app/login.rsc +3 -3
  112. package/.next/server/app/login.segments/!KGF1dGgp/login/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/login.segments/!KGF1dGgp/login.segment.rsc +1 -1
  114. package/.next/server/app/login.segments/!KGF1dGgp.segment.rsc +1 -1
  115. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/logs.html +2 -2
  120. package/.next/server/app/logs.rsc +7 -7
  121. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs/__PAGE__.segment.rsc +2 -2
  122. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk/logs.segment.rsc +1 -1
  123. package/.next/server/app/logs.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  124. package/.next/server/app/logs.segments/_full.segment.rsc +7 -7
  125. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  126. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  127. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  128. package/.next/server/app/mcp/presets.html +2 -2
  129. package/.next/server/app/mcp/presets.rsc +7 -7
  130. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets/__PAGE__.segment.rsc +2 -2
  131. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp/presets.segment.rsc +1 -1
  132. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  133. package/.next/server/app/mcp/presets.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  134. package/.next/server/app/mcp/presets.segments/_full.segment.rsc +7 -7
  135. package/.next/server/app/mcp/presets.segments/_head.segment.rsc +1 -1
  136. package/.next/server/app/mcp/presets.segments/_index.segment.rsc +2 -2
  137. package/.next/server/app/mcp/presets.segments/_tree.segment.rsc +2 -2
  138. package/.next/server/app/mcp.html +2 -2
  139. package/.next/server/app/mcp.rsc +7 -7
  140. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp/__PAGE__.segment.rsc +2 -2
  141. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk/mcp.segment.rsc +1 -1
  142. package/.next/server/app/mcp.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  143. package/.next/server/app/mcp.segments/_full.segment.rsc +7 -7
  144. package/.next/server/app/mcp.segments/_head.segment.rsc +1 -1
  145. package/.next/server/app/mcp.segments/_index.segment.rsc +2 -2
  146. package/.next/server/app/mcp.segments/_tree.segment.rsc +2 -2
  147. package/.next/server/app/playground/audio/speech.html +2 -2
  148. package/.next/server/app/playground/audio/speech.rsc +8 -8
  149. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech/__PAGE__.segment.rsc +2 -2
  150. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio/speech.segment.rsc +1 -1
  151. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  152. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  153. package/.next/server/app/playground/audio/speech.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  154. package/.next/server/app/playground/audio/speech.segments/_full.segment.rsc +8 -8
  155. package/.next/server/app/playground/audio/speech.segments/_head.segment.rsc +1 -1
  156. package/.next/server/app/playground/audio/speech.segments/_index.segment.rsc +2 -2
  157. package/.next/server/app/playground/audio/speech.segments/_tree.segment.rsc +2 -2
  158. package/.next/server/app/playground/audio/transcription.html +2 -2
  159. package/.next/server/app/playground/audio/transcription.rsc +8 -8
  160. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription/__PAGE__.segment.rsc +2 -2
  161. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio/transcription.segment.rsc +1 -1
  162. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground/audio.segment.rsc +1 -1
  163. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  164. package/.next/server/app/playground/audio/transcription.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  165. package/.next/server/app/playground/audio/transcription.segments/_full.segment.rsc +8 -8
  166. package/.next/server/app/playground/audio/transcription.segments/_head.segment.rsc +1 -1
  167. package/.next/server/app/playground/audio/transcription.segments/_index.segment.rsc +2 -2
  168. package/.next/server/app/playground/audio/transcription.segments/_tree.segment.rsc +2 -2
  169. package/.next/server/app/playground/chat.html +2 -2
  170. package/.next/server/app/playground/chat.rsc +8 -8
  171. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat/__PAGE__.segment.rsc +2 -2
  172. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground/chat.segment.rsc +1 -1
  173. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  174. package/.next/server/app/playground/chat.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  175. package/.next/server/app/playground/chat.segments/_full.segment.rsc +8 -8
  176. package/.next/server/app/playground/chat.segments/_head.segment.rsc +1 -1
  177. package/.next/server/app/playground/chat.segments/_index.segment.rsc +2 -2
  178. package/.next/server/app/playground/chat.segments/_tree.segment.rsc +2 -2
  179. package/.next/server/app/playground/embedding.html +2 -2
  180. package/.next/server/app/playground/embedding.rsc +8 -8
  181. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding/__PAGE__.segment.rsc +2 -2
  182. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground/embedding.segment.rsc +1 -1
  183. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  184. package/.next/server/app/playground/embedding.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  185. package/.next/server/app/playground/embedding.segments/_full.segment.rsc +8 -8
  186. package/.next/server/app/playground/embedding.segments/_head.segment.rsc +1 -1
  187. package/.next/server/app/playground/embedding.segments/_index.segment.rsc +2 -2
  188. package/.next/server/app/playground/embedding.segments/_tree.segment.rsc +2 -2
  189. package/.next/server/app/playground/image.html +2 -2
  190. package/.next/server/app/playground/image.rsc +8 -8
  191. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image/__PAGE__.segment.rsc +2 -2
  192. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground/image.segment.rsc +1 -1
  193. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  194. package/.next/server/app/playground/image.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  195. package/.next/server/app/playground/image.segments/_full.segment.rsc +8 -8
  196. package/.next/server/app/playground/image.segments/_head.segment.rsc +1 -1
  197. package/.next/server/app/playground/image.segments/_index.segment.rsc +2 -2
  198. package/.next/server/app/playground/image.segments/_tree.segment.rsc +2 -2
  199. package/.next/server/app/playground/video.html +2 -2
  200. package/.next/server/app/playground/video.rsc +8 -8
  201. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video/__PAGE__.segment.rsc +2 -2
  202. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground/video.segment.rsc +1 -1
  203. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  204. package/.next/server/app/playground/video.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  205. package/.next/server/app/playground/video.segments/_full.segment.rsc +8 -8
  206. package/.next/server/app/playground/video.segments/_head.segment.rsc +1 -1
  207. package/.next/server/app/playground/video.segments/_index.segment.rsc +2 -2
  208. package/.next/server/app/playground/video.segments/_tree.segment.rsc +2 -2
  209. package/.next/server/app/playground.html +2 -2
  210. package/.next/server/app/playground.rsc +8 -8
  211. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground/__PAGE__.segment.rsc +2 -2
  212. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk/playground.segment.rsc +2 -2
  213. package/.next/server/app/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  214. package/.next/server/app/playground.segments/_full.segment.rsc +8 -8
  215. package/.next/server/app/playground.segments/_head.segment.rsc +1 -1
  216. package/.next/server/app/playground.segments/_index.segment.rsc +2 -2
  217. package/.next/server/app/playground.segments/_tree.segment.rsc +2 -2
  218. package/.next/server/app/providers.html +2 -2
  219. package/.next/server/app/providers.rsc +7 -7
  220. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers/__PAGE__.segment.rsc +2 -2
  221. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk/providers.segment.rsc +1 -1
  222. package/.next/server/app/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  223. package/.next/server/app/providers.segments/_full.segment.rsc +7 -7
  224. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  225. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  226. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  227. package/.next/server/app/settings/api-keys.html +2 -2
  228. package/.next/server/app/settings/api-keys.rsc +7 -7
  229. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys/__PAGE__.segment.rsc +2 -2
  230. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings/api-keys.segment.rsc +1 -1
  231. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  232. package/.next/server/app/settings/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  233. package/.next/server/app/settings/api-keys.segments/_full.segment.rsc +7 -7
  234. package/.next/server/app/settings/api-keys.segments/_head.segment.rsc +1 -1
  235. package/.next/server/app/settings/api-keys.segments/_index.segment.rsc +2 -2
  236. package/.next/server/app/settings/api-keys.segments/_tree.segment.rsc +2 -2
  237. package/.next/server/app/settings/users.html +2 -2
  238. package/.next/server/app/settings/users.rsc +7 -7
  239. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users/__PAGE__.segment.rsc +2 -2
  240. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings/users.segment.rsc +1 -1
  241. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  242. package/.next/server/app/settings/users.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  243. package/.next/server/app/settings/users.segments/_full.segment.rsc +7 -7
  244. package/.next/server/app/settings/users.segments/_head.segment.rsc +1 -1
  245. package/.next/server/app/settings/users.segments/_index.segment.rsc +2 -2
  246. package/.next/server/app/settings/users.segments/_tree.segment.rsc +2 -2
  247. package/.next/server/app/settings.html +2 -2
  248. package/.next/server/app/settings.rsc +8 -8
  249. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
  250. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  251. package/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +3 -3
  252. package/.next/server/app/settings.segments/_full.segment.rsc +8 -8
  253. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  254. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  255. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  256. package/.next/server/chunks/[root-of-the-server]__019oqc3._.js +3 -0
  257. package/.next/server/chunks/[root-of-the-server]__019oqc3._.js.map +1 -0
  258. package/.next/server/chunks/[root-of-the-server]__01ou67p._.js +1 -1
  259. package/.next/server/chunks/[root-of-the-server]__01ou67p._.js.map +1 -1
  260. package/.next/server/chunks/[root-of-the-server]__02sypva._.js +2 -2
  261. package/.next/server/chunks/[root-of-the-server]__02sypva._.js.map +1 -1
  262. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js +2 -2
  263. package/.next/server/chunks/[root-of-the-server]__0myi8j1._.js.map +1 -1
  264. package/.next/server/chunks/[root-of-the-server]__0wiw6hu._.js +3 -0
  265. package/.next/server/chunks/[root-of-the-server]__0wiw6hu._.js.map +1 -0
  266. package/.next/server/chunks/[root-of-the-server]__0xrm_9r._.js +3 -0
  267. package/.next/server/chunks/[root-of-the-server]__0xrm_9r._.js.map +1 -0
  268. package/.next/server/chunks/[root-of-the-server]__11t79he._.js +1 -1
  269. package/.next/server/chunks/[root-of-the-server]__11t79he._.js.map +1 -1
  270. package/.next/server/chunks/[root-of-the-server]__1fs5lo-._.js +1 -1
  271. package/.next/server/chunks/[root-of-the-server]__1fs5lo-._.js.map +1 -1
  272. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js +2 -2
  273. package/.next/server/chunks/[root-of-the-server]__1qg3d87._.js.map +1 -1
  274. package/.next/server/chunks/[root-of-the-server]__1zgou-a._.js +6 -0
  275. package/.next/server/chunks/[root-of-the-server]__1zgou-a._.js.map +1 -0
  276. package/.next/server/chunks/_00k5vl0._.js +3 -0
  277. package/.next/server/chunks/_00k5vl0._.js.map +1 -0
  278. package/.next/server/chunks/_06hthvw._.js +3 -0
  279. package/.next/server/chunks/_06hthvw._.js.map +1 -0
  280. package/.next/server/chunks/_0c6vpbw._.js +3 -0
  281. package/.next/server/chunks/_0c6vpbw._.js.map +1 -0
  282. package/.next/server/chunks/_0hawg18._.js +3 -0
  283. package/.next/server/chunks/_0hawg18._.js.map +1 -0
  284. package/.next/server/chunks/_0kr91st._.js +3 -0
  285. package/.next/server/chunks/_0kr91st._.js.map +1 -0
  286. package/.next/server/chunks/_1i4x7k4._.js +3 -0
  287. package/.next/server/chunks/_1i4x7k4._.js.map +1 -0
  288. package/.next/server/chunks/_1lk_ovb._.js +3 -0
  289. package/.next/server/chunks/_1lk_ovb._.js.map +1 -0
  290. package/.next/server/chunks/_1wk63w9._.js +3 -0
  291. package/.next/server/chunks/_1wk63w9._.js.map +1 -0
  292. package/.next/server/chunks/_1wl3z8e._.js +3 -0
  293. package/.next/server/chunks/_1wl3z8e._.js.map +1 -0
  294. package/.next/server/chunks/lib_server_11s_lvw._.js +1 -1
  295. package/.next/server/chunks/lib_server_11s_lvw._.js.map +1 -1
  296. package/.next/server/chunks/lib_server_gateway_index_ts_1nvei3v._.js +2 -2
  297. package/.next/server/chunks/lib_server_gateway_index_ts_1nvei3v._.js.map +1 -1
  298. package/.next/server/chunks/ssr/app_(dashboard)_settings_page_tsx_1hwv4x8._.js +2 -2
  299. package/.next/server/chunks/ssr/app_(dashboard)_settings_page_tsx_1hwv4x8._.js.map +1 -1
  300. package/.next/server/chunks/ssr/lib_schemas_preferences_ts_1fy1exu._.js +1 -1
  301. package/.next/server/chunks/ssr/lib_schemas_preferences_ts_1fy1exu._.js.map +1 -1
  302. package/.next/server/middleware-build-manifest.js +3 -3
  303. package/.next/server/pages/404.html +2 -2
  304. package/.next/server/pages/500.html +1 -1
  305. package/.next/static/chunks/{2zeeni2y2fh59.js → 1si1c1m377t3w.js} +1 -1
  306. package/.next/static/chunks/2yzdc8m536xea.css +1 -0
  307. package/.next/static/chunks/3oj24pftrz5zy.js +11 -0
  308. package/.next/trace +2 -2
  309. package/.next/trace-build +1 -1
  310. package/bin/loom.mjs +1 -1
  311. package/drizzle/0019_timeout_default_3600.sql +36 -0
  312. package/drizzle/meta/0019_snapshot.json +1309 -0
  313. package/drizzle/meta/_journal.json +7 -0
  314. package/package.json +1 -1
  315. package/.next/server/chunks/[root-of-the-server]__00b7x8i._.js +0 -3
  316. package/.next/server/chunks/[root-of-the-server]__00b7x8i._.js.map +0 -1
  317. package/.next/server/chunks/[root-of-the-server]__022u2d9._.js +0 -3
  318. package/.next/server/chunks/[root-of-the-server]__022u2d9._.js.map +0 -1
  319. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js +0 -6
  320. package/.next/server/chunks/[root-of-the-server]__0g3mnim._.js.map +0 -1
  321. package/.next/server/chunks/[root-of-the-server]__1gon00b._.js +0 -3
  322. package/.next/server/chunks/[root-of-the-server]__1gon00b._.js.map +0 -1
  323. package/.next/server/chunks/[root-of-the-server]__1xj9qqs._.js +0 -3
  324. package/.next/server/chunks/[root-of-the-server]__1xj9qqs._.js.map +0 -1
  325. package/.next/server/chunks/_028m5t0._.js +0 -3
  326. package/.next/server/chunks/_028m5t0._.js.map +0 -1
  327. package/.next/server/chunks/_0eq8a_c._.js +0 -3
  328. package/.next/server/chunks/_0eq8a_c._.js.map +0 -1
  329. package/.next/server/chunks/_0n06usu._.js +0 -3
  330. package/.next/server/chunks/_0n06usu._.js.map +0 -1
  331. package/.next/server/chunks/_0tcchv1._.js +0 -3
  332. package/.next/server/chunks/_0tcchv1._.js.map +0 -1
  333. package/.next/server/chunks/_14120rw._.js +0 -3
  334. package/.next/server/chunks/_14120rw._.js.map +0 -1
  335. package/.next/server/chunks/_1633jn_._.js +0 -3
  336. package/.next/server/chunks/_1633jn_._.js.map +0 -1
  337. package/.next/server/chunks/_19jpf08._.js +0 -3
  338. package/.next/server/chunks/_19jpf08._.js.map +0 -1
  339. package/.next/server/chunks/_1gi5m-_._.js +0 -3
  340. package/.next/server/chunks/_1gi5m-_._.js.map +0 -1
  341. package/.next/server/chunks/_1jgm_7u._.js +0 -3
  342. package/.next/server/chunks/_1jgm_7u._.js.map +0 -1
  343. package/.next/static/chunks/0cbg1vmtl84ae.css +0 -1
  344. package/.next/static/chunks/29p-wdja_cbgh.js +0 -11
  345. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_buildManifest.js +0 -0
  346. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_clientMiddlewareManifest.js +0 -0
  347. /package/.next/static/{wCZkC7ZaYrxG37d-e2tac → TZ8IS4-HWznFu8M4EwNGp}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/server/api-variants/chat-completions.ts","../../../lib/server/api-variants/responses.ts","../../../lib/server/api-variants/embeddings.ts","../../../lib/server/api-variants/images-generations.ts","../../../lib/server/api-variants/audio-speech.ts","../../../lib/server/api-variants/audio-transcriptions.ts","../../../lib/server/api-variants/rerank.ts","../../../lib/server/api-variants/videos.ts","../../../lib/server/models/service.ts","../../../lib/server/models/serializer.ts"],"sourcesContent":["import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * /v1/chat/completions — the canonical chat shape. The gateway uses\n * chat-completion as its lingua-franca, so this variant is a near-pass-through.\n */\nexport const chatCompletionsVariant: UpstreamApiVariant = {\n id: \"chat.completions\",\n capability: \"chat\",\n path: \"/chat/completions\",\n supportsStreaming: true,\n\n parseResponse(json) {\n const j = json as {\n id?: string;\n model?: string;\n choices?: Array<{\n message?: {\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n };\n const message = j?.choices?.[0]?.message;\n const finishReason = j?.choices?.[0]?.finish_reason;\n const usage = j?.usage ?? {};\n const tcRaw = Array.isArray(message?.tool_calls) ? message?.tool_calls : [];\n const toolCalls = tcRaw\n .map((tc) => ({\n id: typeof tc?.id === \"string\" ? tc.id : \"\",\n name: typeof tc?.function?.name === \"string\" ? tc.function.name : \"\",\n arguments: typeof tc?.function?.arguments === \"string\" ? tc.function.arguments : \"\",\n }))\n .filter((tc) => tc.name);\n return {\n output: message?.content ?? null,\n promptTokens: usage.prompt_tokens ?? null,\n completionTokens: usage.completion_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n // Pass-through — already in canonical shape.\n normalized: j as unknown as Record<string, unknown>,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n finishReason: typeof finishReason === \"string\" ? finishReason : undefined,\n };\n },\n\n parseStreamChunk(json) {\n const j = json as {\n id?: string;\n model?: string;\n system_fingerprint?: string;\n choices?: Array<{\n delta?: {\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: Record<string, unknown>;\n };\n const choice = j?.choices?.[0];\n const delta = choice?.delta;\n const toolDeltas = delta?.tool_calls;\n const toolCalls = Array.isArray(toolDeltas) && toolDeltas.length > 0\n ? toolDeltas.map((tc) => ({\n index: typeof tc.index === \"number\" ? tc.index : 0,\n id: typeof tc.id === \"string\" ? tc.id : undefined,\n name: typeof tc.function?.name === \"string\" ? tc.function.name : undefined,\n argumentsDelta:\n typeof tc.function?.arguments === \"string\" ? tc.function.arguments : undefined,\n }))\n : undefined;\n return {\n content: typeof delta?.content === \"string\" ? delta.content : \"\",\n reasoning: typeof delta?.reasoning_content === \"string\" ? delta.reasoning_content : \"\",\n toolCalls,\n finishReason: typeof choice?.finish_reason === \"string\" ? choice.finish_reason : undefined,\n id: typeof j?.id === \"string\" ? j.id : undefined,\n model: typeof j?.model === \"string\" ? j.model : undefined,\n systemFingerprint:\n typeof j?.system_fingerprint === \"string\" ? j.system_fingerprint : undefined,\n usage: j?.usage,\n };\n },\n};\n\nregisterVariant(chatCompletionsVariant);\n\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * /v1/responses — OpenAI Responses API. Different shape on every axis:\n *\n * Request: { input: [...], instructions, max_output_tokens, ... }\n * vs chat: { messages: [...], max_tokens, ... }\n * Response: { output: [{type:\"message\", content:[{type:\"output_text\", text}]}],\n * usage: { input_tokens, output_tokens, total_tokens } }\n * vs chat: { choices:[{message:{content}}], usage:{prompt_tokens,...} }\n * Stream: typed events `response.output_text.delta`, `response.reasoning_summary_text.delta`,\n * `response.completed`, …\n * vs chat: `data: {choices:[{delta:{content}}]}` lines with `[DONE]` terminator\n *\n * The gateway speaks chat-completion as its internal canonical form, so\n * this variant translates chat → responses on the way out and responses\n * → chat on the way back.\n */\n\ninterface ChatMessage {\n role?: string;\n content?: unknown;\n name?: string;\n [k: string]: unknown;\n}\n\ninterface ResponsesUsage {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n [k: string]: unknown;\n}\n\ninterface ResponsesOutputItem {\n type?: string;\n role?: string;\n content?: Array<{\n type?: string;\n text?: string;\n annotations?: unknown[];\n }>;\n summary?: Array<{ type?: string; text?: string }>;\n [k: string]: unknown;\n}\n\ninterface ResponsesResponse {\n id?: string;\n model?: string;\n status?: string;\n created_at?: number;\n output?: ResponsesOutputItem[];\n usage?: ResponsesUsage;\n [k: string]: unknown;\n}\n\ninterface ResponsesStreamEvent {\n type?: string;\n delta?: unknown;\n response?: ResponsesResponse;\n item?: ResponsesOutputItem;\n [k: string]: unknown;\n}\n\n// =============================================================================\n// Request translation: chat-completion → responses\n// =============================================================================\n\nfunction flattenContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((p) => {\n if (typeof p === \"string\") return p;\n const obj = p as { text?: string; type?: string };\n return typeof obj?.text === \"string\" ? obj.text : \"\";\n })\n .filter(Boolean)\n .join(\"\");\n }\n return \"\";\n}\n\n/** Translate a chat message into a Responses-API input item. The Responses\n * API expects message items shaped like\n * `{ type: \"message\", role, content: [{type: \"input_text\"|\"output_text\", text}] }`.\n * Multimodal parts map to `input_image` / `input_file` (Responses\n * flavour) when present. */\nfunction chatMessageToInputItem(m: ChatMessage): Record<string, unknown> | null {\n const role = m.role;\n if (!role) return null;\n const isAssistant = role === \"assistant\";\n const partType = isAssistant ? \"output_text\" : \"input_text\";\n\n if (typeof m.content === \"string\") {\n return {\n type: \"message\",\n role,\n content: [{ type: partType, text: m.content }],\n };\n }\n if (Array.isArray(m.content)) {\n const parts = m.content\n .map((p) => {\n if (typeof p === \"string\") return { type: partType, text: p };\n const obj = p as {\n type?: string;\n text?: string;\n image_url?: { url?: string; detail?: string } | string;\n file?: { filename?: string; file_data?: string; file_id?: string };\n };\n // image_url part — keep the same shape (Responses\n // `input_image` accepts the same object).\n if (obj?.type === \"image_url\" || obj?.image_url) {\n return { type: \"input_image\", image_url: obj.image_url };\n }\n // file part — chat-completion's\n // `{type:\"file\", file:{filename, file_data}}` maps to\n // Responses' `{type:\"input_file\", filename, file_data}`.\n if (obj?.type === \"file\" || obj?.file) {\n const f = obj.file ?? {};\n const out: Record<string, unknown> = { type: \"input_file\" };\n if (f.filename) out.filename = f.filename;\n if (f.file_data) out.file_data = f.file_data;\n if (f.file_id) out.file_id = f.file_id;\n return out;\n }\n if (typeof obj?.text === \"string\") return { type: partType, text: obj.text };\n return null;\n })\n .filter(Boolean);\n if (parts.length === 0) return null;\n return { type: \"message\", role, content: parts };\n }\n return null;\n}\n\nconst FIELDS_NOT_FOR_RESPONSES = new Set([\n \"messages\",\n \"max_tokens\",\n \"max_completion_tokens\",\n \"stream_options\", // chat-only; Responses streams usage in response.completed\n \"logprobs\",\n \"top_logprobs\",\n \"n\", // Responses produces one response\n \"frequency_penalty\",\n \"presence_penalty\",\n \"logit_bias\",\n \"stop\", // Responses has no direct equivalent; drop silently\n \"response_format\", // Replaced by `text.format` below\n \"function_call\", // Legacy alias\n \"functions\", // Legacy alias\n]);\n\nfunction translateRequest(body: Record<string, unknown>): Record<string, unknown> {\n const messages = (body.messages ?? []) as ChatMessage[];\n\n const instructions: string[] = [];\n const inputItems: Array<Record<string, unknown>> = [];\n for (const m of messages) {\n if (m.role === \"system\" || m.role === \"developer\") {\n const t = flattenContent(m.content);\n if (t) instructions.push(t);\n continue;\n }\n const item = chatMessageToInputItem(m);\n if (item) inputItems.push(item);\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(body)) {\n if (FIELDS_NOT_FOR_RESPONSES.has(k)) continue;\n out[k] = v;\n }\n\n out.input = inputItems;\n\n // System messages → `instructions`, merged with any explicit one in body.\n const existingInstructions = typeof body.instructions === \"string\" ? body.instructions : \"\";\n const merged = [existingInstructions, ...instructions].filter(Boolean).join(\"\\n\\n\");\n if (merged) out.instructions = merged;\n\n // Token cap: prefer the most specific caller-supplied value.\n const cap =\n (body.max_output_tokens as number | undefined) ??\n (body.max_completion_tokens as number | undefined) ??\n (body.max_tokens as number | undefined);\n if (cap != null) out.max_output_tokens = cap;\n\n // Translate response_format → text.format. OpenAI Responses uses\n // `text: {format: {type: \"json_schema\"|\"text\", ...}}`.\n const rf = body.response_format as Record<string, unknown> | undefined;\n if (rf) {\n const existingText = (out.text as Record<string, unknown>) ?? {};\n out.text = { ...existingText, format: rf };\n }\n\n // `stream` flag passes through.\n return out;\n}\n\n// =============================================================================\n// Response parsing\n// =============================================================================\n\nfunction extractText(output: ResponsesOutputItem[] | undefined): { content: string; reasoning: string } {\n let content = \"\";\n let reasoning = \"\";\n if (!Array.isArray(output)) return { content, reasoning };\n for (const item of output) {\n if (item?.type === \"message\") {\n for (const part of item.content ?? []) {\n if (part?.type === \"output_text\" && typeof part.text === \"string\") {\n content += part.text;\n }\n }\n } else if (item?.type === \"reasoning\") {\n const summary = item.summary;\n if (Array.isArray(summary)) {\n for (const s of summary) {\n if (s?.type === \"summary_text\" && typeof s.text === \"string\") {\n reasoning += s.text;\n }\n }\n }\n }\n }\n return { content, reasoning };\n}\n\nfunction normalizeUsage(u: ResponsesUsage | undefined): Record<string, unknown> | null {\n if (!u) return null;\n return {\n prompt_tokens: u.input_tokens ?? null,\n completion_tokens: u.output_tokens ?? null,\n total_tokens: u.total_tokens ?? null,\n // Preserve everything else (cached/prompt detail blocks, etc.).\n ...u,\n };\n}\n\nfunction toChatCompletion(\n r: ResponsesResponse,\n content: string,\n reasoning: string,\n): Record<string, unknown> {\n const message: Record<string, unknown> = { role: \"assistant\", content };\n if (reasoning) message.reasoning_content = reasoning;\n const usage = normalizeUsage(r.usage);\n const out: Record<string, unknown> = {\n id: r.id ?? \"\",\n object: \"chat.completion\",\n created: typeof r.created_at === \"number\" ? r.created_at : Math.floor(Date.now() / 1000),\n model: r.model ?? \"\",\n choices: [\n {\n index: 0,\n message,\n finish_reason: r.status === \"completed\" ? \"stop\" : (r.status ?? \"stop\"),\n },\n ],\n };\n if (usage) out.usage = usage;\n return out;\n}\n\n// =============================================================================\n// Variant export\n// =============================================================================\n\nexport const responsesVariant: UpstreamApiVariant = {\n id: \"responses\",\n capability: \"chat\",\n path: \"/responses\",\n supportsStreaming: true,\n\n transformRequest(body) {\n return translateRequest(body);\n },\n\n parseResponse(json) {\n const r = (json ?? {}) as ResponsesResponse;\n const { content, reasoning } = extractText(r.output);\n const usage = r.usage ?? {};\n return {\n output: content || null,\n promptTokens: usage.input_tokens ?? null,\n completionTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n normalized: toChatCompletion(r, content, reasoning),\n };\n },\n\n parseStreamChunk(json) {\n const ev = (json ?? {}) as ResponsesStreamEvent;\n const type = ev.type;\n if (!type) return null;\n\n // Lifecycle: capture id/model when the response is created or finalized.\n if (type === \"response.created\" || type === \"response.in_progress\") {\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n };\n }\n\n // Textual content delta.\n if (type === \"response.output_text.delta\") {\n const delta = typeof ev.delta === \"string\" ? ev.delta : \"\";\n return { content: delta, reasoning: \"\" };\n }\n\n // Reasoning deltas land under several event names depending on\n // model family — catch them all.\n if (\n type === \"response.reasoning_summary_text.delta\" ||\n type === \"response.reasoning_summary.delta\" ||\n type === \"response.reasoning.delta\"\n ) {\n const delta = typeof ev.delta === \"string\" ? ev.delta : \"\";\n return { content: \"\", reasoning: delta };\n }\n\n // Terminal event carries the final usage + canonical id/model.\n if (type === \"response.completed\") {\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n usage: normalizeUsage(r?.usage) ?? undefined,\n };\n }\n\n if (type === \"response.failed\" || type === \"response.incomplete\") {\n // Surface as an empty terminal — the gateway logs the upstream\n // error separately via HTTP status if any.\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n usage: normalizeUsage(r?.usage) ?? undefined,\n };\n }\n\n // Housekeeping events (output_item.added, content_part.added,\n // done variants for items/parts, etc.) carry no content delta.\n return null;\n },\n};\n\nregisterVariant(responsesVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const embeddingsVariant: UpstreamApiVariant = {\n id: \"embeddings\",\n capability: \"embedding\",\n path: \"/embeddings\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n usage?: { prompt_tokens?: number; total_tokens?: number };\n data?: Array<{ embedding?: number[] }>;\n };\n const dim = j?.data?.[0]?.embedding?.length;\n return {\n output: dim ? `${j.data!.length} vector(s) × ${dim} dim` : null,\n promptTokens: j?.usage?.prompt_tokens ?? null,\n completionTokens: null,\n totalTokens: j?.usage?.total_tokens ?? null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(embeddingsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const imagesGenerationsVariant: UpstreamApiVariant = {\n id: \"images.generations\",\n capability: \"image\",\n path: \"/images/generations\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n data?: Array<{ url?: string; b64_json?: string }>;\n usage?: { input_tokens?: number; output_tokens?: number; total_tokens?: number };\n };\n const count = j?.data?.length ?? 0;\n return {\n output: count > 0 ? `Generated ${count} image${count === 1 ? \"\" : \"s\"}` : null,\n // gpt-image-1 reports token usage; legacy DALL·E doesn't.\n promptTokens: j?.usage?.input_tokens ?? null,\n completionTokens: j?.usage?.output_tokens ?? null,\n totalTokens: j?.usage?.total_tokens ?? null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(imagesGenerationsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const audioSpeechVariant: UpstreamApiVariant = {\n id: \"audio.speech\",\n capability: \"audio.speech\",\n path: \"/audio/speech\",\n supportsStreaming: false,\n\n parseResponse() {\n // Audio responses are binary — the gateway intercepts at the\n // arraybuffer layer (see forwardGeneration) before calling this.\n return {\n output: \"audio stream returned\",\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: {},\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(audioSpeechVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const audioTranscriptionsVariant: UpstreamApiVariant = {\n id: \"audio.transcriptions\",\n capability: \"audio.transcription\",\n path: \"/audio/transcriptions\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const text = (json as { text?: string })?.text;\n return {\n output: typeof text === \"string\" ? text.slice(0, 400) : null,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (json ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(audioTranscriptionsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const rerankVariant: UpstreamApiVariant = {\n id: \"rerank\",\n capability: \"rerank\",\n path: \"/rerank\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const results = (json as { results?: unknown[] })?.results;\n const count = Array.isArray(results) ? results.length : 0;\n return {\n output: `Reranked ${count} document${count === 1 ? \"\" : \"s\"}`,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (json ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(rerankVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * OpenAI Sora `POST /v1/videos` — async multipart create. The wire\n * shape is multipart/form-data so the JSON gateway pipeline does NOT\n * route through this variant's `transformRequest`; instead the v1\n * route forwards the multipart payload verbatim via\n * `forwardMultipartGeneration`. `parseResponse` still runs on the\n * upstream JSON so the create-time Video object lands in the\n * generation log.\n */\nexport const videosVariant: UpstreamApiVariant = {\n id: \"videos\",\n capability: \"video\",\n path: \"/videos\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n id?: string;\n status?: string;\n progress?: number;\n seconds?: string | number;\n size?: string;\n model?: string;\n };\n const id = typeof j?.id === \"string\" ? j.id : null;\n const status = typeof j?.status === \"string\" ? j.status : null;\n const summary = id\n ? `${id}${status ? ` (${status})` : \"\"}`\n : status ?? \"video job created\";\n return {\n output: summary,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(videosVariant);\n","import \"server-only\";\nimport { randomUUID } from \"node:crypto\";\nimport { eq } from \"drizzle-orm\";\nimport { db } from \"../db\";\nimport { models, providers, type Provider } from \"../db/schema\";\nimport {\n discoveredForProvider,\n getDiscoveryStatus,\n listAllDiscovered,\n type DiscoveredModel,\n} from \"../discovery\";\nimport { findProviderByIdOrName } from \"../providers\";\nimport { resolveAdapter, resolveVariantId } from \"../adapters\";\nimport \"../adapters/register\";\nimport { getCapability } from \"../capabilities\";\nimport \"../capabilities/register\";\nimport \"../api-variants/register\";\nimport { badRequest, notFound } from \"../response\";\nimport { serializeModel } from \"./serializer\";\nimport type { ModelDTO } from \"@/lib/schemas/model\";\nimport type { ModelCreateInput, ModelUpdateInput } from \"@/lib/schemas/model\";\nimport type { NormalizedModelMeta } from \"@/lib/schemas/adapter\";\n\nexport function findModelByIdOrName(idOrName: string) {\n return (\n db.select().from(models).where(eq(models.id, idOrName)).get() ||\n db.select().from(models).where(eq(models.name, idOrName)).get()\n );\n}\n\n/** Verbatim entry persisted at override creation, or the freshest cached\n * discovery entry, or null. Requires the discovery cache to be warm\n * for the relevant provider (callers warm via listAllDiscovered or\n * discoveredForProvider before invoking). */\nfunction rawForDbModel(model: typeof models.$inferSelect, provider: Provider | undefined): unknown {\n if (model.discoveredMetadata !== null && model.discoveredMetadata !== undefined) {\n return model.discoveredMetadata;\n }\n if (!provider) return null;\n const cached = getDiscoveryStatus(provider.id);\n const hit = cached?.models.find((m) => m.id === model.upstreamModelId);\n return hit?.meta.raw ?? null;\n}\n\n/** Re-project the raw entry through the provider's adapter. When raw is\n * missing entirely we feed `{id}` so the adapter still emits its built-in\n * defaults (Foundry's accepted/rejected_fields, etc.). */\nfunction metaForDbModel(\n model: typeof models.$inferSelect,\n provider: Provider | undefined,\n raw: unknown,\n): NormalizedModelMeta | null {\n if (!provider) return null;\n const adapter = resolveAdapter(provider);\n return adapter.extractModelMeta(raw ?? { id: model.upstreamModelId }, provider);\n}\n\n/** Compute the variant id the gateway would dispatch to right now —\n * combines the model's pin (if any) with the capability preference\n * chain. Surfaced on the DTO so the admin form seeds its dropdown with\n * the same value the gateway is using. */\nfunction resolveDisplayVariant(\n model: typeof models.$inferSelect,\n provider: Provider | undefined,\n meta: NormalizedModelMeta | null,\n): string | null {\n if (!provider) return null;\n const capability = getCapability(model.type);\n if (!capability) return null;\n try {\n const adapter = resolveAdapter(provider);\n return resolveVariantId(adapter, capability, model, meta);\n } catch {\n return null;\n }\n}\n\n/** Synthesize a transient ModelDTO for a discovered upstream model. */\nfunction discoveredToDTO(d: DiscoveredModel, provider: Provider | undefined): ModelDTO & { is_discovered: true } {\n // Build a tiny shim Model so resolveDisplayVariant can drive the\n // same capability + adapter logic as for DB-backed rows. Only the\n // fields resolveVariantId reads need to be present.\n const shim = {\n apiVariantId: null,\n type: d.capability,\n upstreamModelId: d.id,\n } as typeof models.$inferSelect;\n const resolved = resolveDisplayVariant(shim, provider, d.meta);\n return {\n id: `discovered:${d.provider_id}:${d.id}`,\n name: d.id,\n model_id: d.id,\n proxy: provider?.baseUrl ?? null,\n timeout: 60,\n max_retries: 2,\n http_proxy: null,\n default_params: {},\n type: d.capability,\n api_variant_id: null,\n resolved_variant_id: resolved,\n pricing: null,\n output_dimension: null,\n context_window: d.meta.context_window ?? null,\n max_tokens: d.meta.max_output_tokens ?? null,\n description: null,\n knowledge_date: null,\n provider: provider?.name ?? d.provider_name,\n provider_id: d.provider_id,\n is_local: false,\n enabled: true,\n meta: d.meta,\n created_at: undefined,\n updated_at: undefined,\n is_discovered: true,\n };\n}\n\n/** List all DB-backed override rows plus live discovered models (union, DB shadows discovery). */\nexport async function listAllModels(): Promise<ModelDTO[]> {\n // Kick off discovery + the bulk providers fetch BEFORE the DB scan so\n // the network round-trip overlaps with local work. Drizzle is sync via\n // better-sqlite3, so without this overlap discovery would always be on\n // the critical path.\n const discoveredPromise = listAllDiscovered();\n\n const rows = db.select().from(models).orderBy(models.name).all();\n const allProviders = db.select().from(providers).all();\n const allProvidersById = new Map(allProviders.map((p) => [p.id, p]));\n\n const discovered = await discoveredPromise;\n\n const dbModels: ModelDTO[] = rows.map((m) => {\n const p = allProvidersById.get(m.providerId);\n const raw = rawForDbModel(m, p);\n const meta = metaForDbModel(m, p, raw);\n return {\n ...serializeModel(m, p?.name ?? null, p?.baseUrl ?? null, meta, resolveDisplayVariant(m, p, meta)),\n is_discovered: false,\n };\n });\n\n const seen = new Set(dbModels.map((m) => m.name));\n const synthesized = discovered\n .filter((d) => !seen.has(d.id))\n .map((d) => discoveredToDTO(d, allProvidersById.get(d.provider_id)));\n\n return [...dbModels, ...synthesized];\n}\n\nexport async function listModelsForProvider(providerIdOrName: string): Promise<ModelDTO[]> {\n const provider = findProviderByIdOrName(providerIdOrName);\n if (!provider) throw notFound(\"Provider not found\");\n\n // Overlap discovery with the DB scan.\n const discoveredPromise = discoveredForProvider(provider).catch((err) => {\n console.warn(`[loom] provider \"${provider.name}\" discovery failed:`, err);\n return [] as DiscoveredModel[];\n });\n\n const rows = db.select().from(models)\n .where(eq(models.providerId, provider.id))\n .orderBy(models.name)\n .all();\n\n const discovered = await discoveredPromise;\n\n const dbModels: ModelDTO[] = rows.map((m) => {\n const raw = rawForDbModel(m, provider);\n const meta = metaForDbModel(m, provider, raw);\n return {\n ...serializeModel(m, provider.name, provider.baseUrl, meta, resolveDisplayVariant(m, provider, meta)),\n is_discovered: false,\n };\n });\n const seen = new Set(dbModels.map((m) => m.name));\n\n const synthesized = discovered\n .filter((d) => !seen.has(d.id))\n .map((d) => discoveredToDTO(d, provider));\n\n return [...dbModels, ...synthesized];\n}\n\nexport async function getModel(idOrName: string): Promise<ModelDTO> {\n const model = findModelByIdOrName(idOrName);\n if (model) {\n const provider = db.select().from(providers).where(eq(providers.id, model.providerId)).get();\n // Network warmup is only worth doing when the DB row lacks a\n // persisted snapshot — otherwise `rawForDbModel` already has\n // everything it needs and we'd just be paying upstream latency\n // for no UI win.\n if (provider && model.discoveredMetadata == null) {\n try {\n await discoveredForProvider(provider);\n } catch (err) {\n console.warn(`[loom] provider \"${provider.name}\" discovery failed:`, err);\n }\n }\n const raw = rawForDbModel(model, provider);\n const meta = metaForDbModel(model, provider, raw);\n return serializeModel(model, provider?.name ?? null, provider?.baseUrl ?? null, meta, resolveDisplayVariant(model, provider, meta));\n }\n // No DB row — fall back to the live discovery union so /models/<name>\n // works for transient discovered entries too.\n const discovered = await listAllDiscovered();\n const hit = discovered.find((d) => d.id === idOrName);\n if (hit) {\n const provider = db.select().from(providers).where(eq(providers.id, hit.provider_id)).get();\n return discoveredToDTO(hit, provider);\n }\n throw notFound(\"Model not found\");\n}\n\nexport async function createModel(input: ModelCreateInput): Promise<ModelDTO> {\n const name = input.name.trim();\n const providerKey = input.provider_id.trim();\n const upstream = input.upstream_model_id.trim();\n\n const provider = findProviderByIdOrName(providerKey);\n if (!provider) throw badRequest(\"Provider not found\");\n\n const existing = db.select().from(models).where(eq(models.name, name)).get();\n if (existing) throw badRequest(\"Model name already exists\");\n\n // Snapshot the discovery cache when the caller didn't supply a raw\n // entry — promoting a discovered model into an override is the common\n // case and we don't want to lose its metadata.\n let snapshotted = input.discovered_metadata;\n if (snapshotted === undefined || snapshotted === null) {\n const cached = getDiscoveryStatus(provider.id);\n const hit = cached?.models.find((m) => m.id === upstream);\n if (hit) snapshotted = hit.meta.raw ?? null;\n }\n\n const id = randomUUID();\n db.insert(models).values({\n id,\n name,\n providerId: provider.id,\n upstreamModelId: upstream,\n type: input.type ?? \"chat\",\n defaultParams: input.default_params ?? {},\n contextWindow: input.context_window ?? null,\n maxTokens: input.max_tokens ?? null,\n outputDimension: input.output_dimension ?? null,\n pricing: input.pricing ?? null,\n description: input.description ?? null,\n knowledgeDate: input.knowledge_date ?? null,\n timeout: input.timeout ?? 60,\n maxRetries: input.max_retries ?? 2,\n httpProxy: input.http_proxy ?? null,\n enabled: input.enabled ?? true,\n apiVariantId: input.api_variant_id?.trim() || null,\n discoveredMetadata: snapshotted ?? null,\n }).run();\n\n return getModel(id);\n}\n\nexport async function updateModel(idOrName: string, input: ModelUpdateInput): Promise<ModelDTO> {\n const model = findModelByIdOrName(idOrName);\n if (!model) throw notFound(\"Model not found\");\n\n const updates: Partial<typeof models.$inferInsert> = {};\n\n if (input.name !== undefined) {\n const newName = input.name.trim();\n if (!newName) throw badRequest(\"Model name cannot be empty\");\n if (newName !== model.name) {\n const dup = db.select().from(models).where(eq(models.name, newName)).get();\n if (dup) throw badRequest(\"Model name already exists\");\n updates.name = newName;\n }\n }\n if (input.provider_id !== undefined) {\n const provider = findProviderByIdOrName(input.provider_id);\n if (!provider) throw badRequest(\"Provider not found\");\n updates.providerId = provider.id;\n }\n if (input.upstream_model_id !== undefined) {\n const v = input.upstream_model_id.trim();\n if (!v) throw badRequest(\"upstream_model_id cannot be empty\");\n updates.upstreamModelId = v;\n }\n if (input.type !== undefined) updates.type = input.type;\n if (input.default_params !== undefined) updates.defaultParams = input.default_params ?? {};\n if (input.context_window !== undefined) updates.contextWindow = input.context_window;\n if (input.max_tokens !== undefined) updates.maxTokens = input.max_tokens;\n if (input.output_dimension !== undefined) updates.outputDimension = input.output_dimension;\n if (input.pricing !== undefined) updates.pricing = input.pricing;\n if (input.description !== undefined) updates.description = input.description;\n if (input.knowledge_date !== undefined) updates.knowledgeDate = input.knowledge_date;\n if (input.timeout !== undefined) updates.timeout = input.timeout;\n if (input.max_retries !== undefined) updates.maxRetries = input.max_retries;\n if (input.http_proxy !== undefined) updates.httpProxy = input.http_proxy ?? null;\n if (input.enabled !== undefined) updates.enabled = !!input.enabled;\n if (input.api_variant_id !== undefined) {\n const v = input.api_variant_id?.trim();\n updates.apiVariantId = v ? v : null;\n }\n if (input.discovered_metadata !== undefined) updates.discoveredMetadata = input.discovered_metadata;\n\n updates.updatedAt = new Date().toISOString();\n\n db.update(models).set(updates).where(eq(models.id, model.id)).run();\n return getModel(model.id);\n}\n\nexport async function deleteModel(idOrName: string): Promise<void> {\n const model = findModelByIdOrName(idOrName);\n if (!model) throw notFound(\"Model not found\");\n db.delete(models).where(eq(models.id, model.id)).run();\n}\n","import \"server-only\";\nimport type { Model } from \"../db/schema\";\nimport type { ModelDTO } from \"@/lib/schemas/model\";\nimport type { NormalizedModelMeta } from \"@/lib/schemas/adapter\";\n\nexport function serializeModel(\n m: Model,\n providerName?: string | null,\n providerProxy?: string | null,\n meta?: NormalizedModelMeta | null,\n resolvedVariantId?: string | null,\n): ModelDTO {\n return {\n id: m.id,\n name: m.name,\n model_id: m.upstreamModelId,\n proxy: providerProxy ?? null,\n timeout: m.timeout,\n max_retries: m.maxRetries,\n http_proxy: m.httpProxy ?? null,\n default_params: (m.defaultParams ?? {}) as Record<string, unknown>,\n type: m.type,\n api_variant_id: m.apiVariantId ?? null,\n resolved_variant_id: resolvedVariantId ?? null,\n pricing: m.pricing ?? null,\n output_dimension: m.outputDimension ?? null,\n context_window: m.contextWindow ?? null,\n max_tokens: m.maxTokens ?? null,\n description: m.description ?? null,\n knowledge_date: m.knowledgeDate ?? null,\n provider: providerName ?? null,\n provider_id: m.providerId,\n is_local: false,\n enabled: !!m.enabled,\n meta: meta ?? null,\n created_at: m.createdAt,\n updated_at: m.updatedAt,\n };\n}\n"],"names":["chatCompletionsVariant","id","capability","path","supportsStreaming","parseResponse","json","j","message","choices","finishReason","finish_reason","usage","tcRaw","Array","isArray","tool_calls","toolCalls","map","tc","name","function","arguments","filter","output","content","promptTokens","prompt_tokens","completionTokens","completion_tokens","totalTokens","total_tokens","normalized","length","undefined","parseStreamChunk","choice","delta","toolDeltas","index","argumentsDelta","reasoning","reasoning_content","model","systemFingerprint","system_fingerprint","serializeModel","m","providerName","providerProxy","meta","resolvedVariantId","model_id","upstreamModelId","proxy","timeout","max_retries","maxRetries","http_proxy","httpProxy","default_params","defaultParams","type","api_variant_id","apiVariantId","resolved_variant_id","pricing","output_dimension","outputDimension","context_window","contextWindow","max_tokens","maxTokens","description","knowledge_date","knowledgeDate","provider","provider_id","providerId","is_local","enabled","created_at","createdAt","updated_at","updatedAt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../lib/server/api-variants/chat-completions.ts","../../../lib/server/api-variants/responses.ts","../../../lib/server/api-variants/embeddings.ts","../../../lib/server/api-variants/images-generations.ts","../../../lib/server/api-variants/audio-speech.ts","../../../lib/server/api-variants/audio-transcriptions.ts","../../../lib/server/api-variants/rerank.ts","../../../lib/server/api-variants/videos.ts","../../../lib/server/models/service.ts","../../../lib/server/models/serializer.ts"],"sourcesContent":["import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * /v1/chat/completions — the canonical chat shape. The gateway uses\n * chat-completion as its lingua-franca, so this variant is a near-pass-through.\n */\nexport const chatCompletionsVariant: UpstreamApiVariant = {\n id: \"chat.completions\",\n capability: \"chat\",\n path: \"/chat/completions\",\n supportsStreaming: true,\n\n parseResponse(json) {\n const j = json as {\n id?: string;\n model?: string;\n choices?: Array<{\n message?: {\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n };\n const message = j?.choices?.[0]?.message;\n const finishReason = j?.choices?.[0]?.finish_reason;\n const usage = j?.usage ?? {};\n const tcRaw = Array.isArray(message?.tool_calls) ? message?.tool_calls : [];\n const toolCalls = tcRaw\n .map((tc) => ({\n id: typeof tc?.id === \"string\" ? tc.id : \"\",\n name: typeof tc?.function?.name === \"string\" ? tc.function.name : \"\",\n arguments: typeof tc?.function?.arguments === \"string\" ? tc.function.arguments : \"\",\n }))\n .filter((tc) => tc.name);\n return {\n output: message?.content ?? null,\n promptTokens: usage.prompt_tokens ?? null,\n completionTokens: usage.completion_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n // Pass-through — already in canonical shape.\n normalized: j as unknown as Record<string, unknown>,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n finishReason: typeof finishReason === \"string\" ? finishReason : undefined,\n };\n },\n\n parseStreamChunk(json) {\n const j = json as {\n id?: string;\n model?: string;\n system_fingerprint?: string;\n choices?: Array<{\n delta?: {\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: Record<string, unknown>;\n };\n const choice = j?.choices?.[0];\n const delta = choice?.delta;\n const toolDeltas = delta?.tool_calls;\n const toolCalls = Array.isArray(toolDeltas) && toolDeltas.length > 0\n ? toolDeltas.map((tc) => ({\n index: typeof tc.index === \"number\" ? tc.index : 0,\n id: typeof tc.id === \"string\" ? tc.id : undefined,\n name: typeof tc.function?.name === \"string\" ? tc.function.name : undefined,\n argumentsDelta:\n typeof tc.function?.arguments === \"string\" ? tc.function.arguments : undefined,\n }))\n : undefined;\n return {\n content: typeof delta?.content === \"string\" ? delta.content : \"\",\n reasoning: typeof delta?.reasoning_content === \"string\" ? delta.reasoning_content : \"\",\n toolCalls,\n finishReason: typeof choice?.finish_reason === \"string\" ? choice.finish_reason : undefined,\n id: typeof j?.id === \"string\" ? j.id : undefined,\n model: typeof j?.model === \"string\" ? j.model : undefined,\n systemFingerprint:\n typeof j?.system_fingerprint === \"string\" ? j.system_fingerprint : undefined,\n usage: j?.usage,\n };\n },\n};\n\nregisterVariant(chatCompletionsVariant);\n\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * /v1/responses — OpenAI Responses API. Different shape on every axis:\n *\n * Request: { input: [...], instructions, max_output_tokens, ... }\n * vs chat: { messages: [...], max_tokens, ... }\n * Response: { output: [{type:\"message\", content:[{type:\"output_text\", text}]}],\n * usage: { input_tokens, output_tokens, total_tokens } }\n * vs chat: { choices:[{message:{content}}], usage:{prompt_tokens,...} }\n * Stream: typed events `response.output_text.delta`, `response.reasoning_summary_text.delta`,\n * `response.completed`, …\n * vs chat: `data: {choices:[{delta:{content}}]}` lines with `[DONE]` terminator\n *\n * The gateway speaks chat-completion as its internal canonical form, so\n * this variant translates chat → responses on the way out and responses\n * → chat on the way back.\n */\n\ninterface ChatMessage {\n role?: string;\n content?: unknown;\n name?: string;\n [k: string]: unknown;\n}\n\ninterface ResponsesUsage {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n [k: string]: unknown;\n}\n\ninterface ResponsesOutputItem {\n type?: string;\n role?: string;\n content?: Array<{\n type?: string;\n text?: string;\n annotations?: unknown[];\n }>;\n summary?: Array<{ type?: string; text?: string }>;\n [k: string]: unknown;\n}\n\ninterface ResponsesResponse {\n id?: string;\n model?: string;\n status?: string;\n created_at?: number;\n output?: ResponsesOutputItem[];\n usage?: ResponsesUsage;\n [k: string]: unknown;\n}\n\ninterface ResponsesStreamEvent {\n type?: string;\n delta?: unknown;\n response?: ResponsesResponse;\n item?: ResponsesOutputItem;\n [k: string]: unknown;\n}\n\n// =============================================================================\n// Request translation: chat-completion → responses\n// =============================================================================\n\nfunction flattenContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((p) => {\n if (typeof p === \"string\") return p;\n const obj = p as { text?: string; type?: string };\n return typeof obj?.text === \"string\" ? obj.text : \"\";\n })\n .filter(Boolean)\n .join(\"\");\n }\n return \"\";\n}\n\n/** Translate a chat message into a Responses-API input item. The Responses\n * API expects message items shaped like\n * `{ type: \"message\", role, content: [{type: \"input_text\"|\"output_text\", text}] }`.\n * Multimodal parts map to `input_image` / `input_file` (Responses\n * flavour) when present. */\nfunction chatMessageToInputItem(m: ChatMessage): Record<string, unknown> | null {\n const role = m.role;\n if (!role) return null;\n const isAssistant = role === \"assistant\";\n const partType = isAssistant ? \"output_text\" : \"input_text\";\n\n if (typeof m.content === \"string\") {\n return {\n type: \"message\",\n role,\n content: [{ type: partType, text: m.content }],\n };\n }\n if (Array.isArray(m.content)) {\n const parts = m.content\n .map((p) => {\n if (typeof p === \"string\") return { type: partType, text: p };\n const obj = p as {\n type?: string;\n text?: string;\n image_url?: { url?: string; detail?: string } | string;\n file?: { filename?: string; file_data?: string; file_id?: string };\n };\n // image_url part — keep the same shape (Responses\n // `input_image` accepts the same object).\n if (obj?.type === \"image_url\" || obj?.image_url) {\n return { type: \"input_image\", image_url: obj.image_url };\n }\n // file part — chat-completion's\n // `{type:\"file\", file:{filename, file_data}}` maps to\n // Responses' `{type:\"input_file\", filename, file_data}`.\n if (obj?.type === \"file\" || obj?.file) {\n const f = obj.file ?? {};\n const out: Record<string, unknown> = { type: \"input_file\" };\n if (f.filename) out.filename = f.filename;\n if (f.file_data) out.file_data = f.file_data;\n if (f.file_id) out.file_id = f.file_id;\n return out;\n }\n if (typeof obj?.text === \"string\") return { type: partType, text: obj.text };\n return null;\n })\n .filter(Boolean);\n if (parts.length === 0) return null;\n return { type: \"message\", role, content: parts };\n }\n return null;\n}\n\nconst FIELDS_NOT_FOR_RESPONSES = new Set([\n \"messages\",\n \"max_tokens\",\n \"max_completion_tokens\",\n \"stream_options\", // chat-only; Responses streams usage in response.completed\n \"logprobs\",\n \"top_logprobs\",\n \"n\", // Responses produces one response\n \"frequency_penalty\",\n \"presence_penalty\",\n \"logit_bias\",\n \"stop\", // Responses has no direct equivalent; drop silently\n \"response_format\", // Replaced by `text.format` below\n \"function_call\", // Legacy alias\n \"functions\", // Legacy alias\n]);\n\nfunction translateRequest(body: Record<string, unknown>): Record<string, unknown> {\n const messages = (body.messages ?? []) as ChatMessage[];\n\n const instructions: string[] = [];\n const inputItems: Array<Record<string, unknown>> = [];\n for (const m of messages) {\n if (m.role === \"system\" || m.role === \"developer\") {\n const t = flattenContent(m.content);\n if (t) instructions.push(t);\n continue;\n }\n const item = chatMessageToInputItem(m);\n if (item) inputItems.push(item);\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(body)) {\n if (FIELDS_NOT_FOR_RESPONSES.has(k)) continue;\n out[k] = v;\n }\n\n out.input = inputItems;\n\n // System messages → `instructions`, merged with any explicit one in body.\n const existingInstructions = typeof body.instructions === \"string\" ? body.instructions : \"\";\n const merged = [existingInstructions, ...instructions].filter(Boolean).join(\"\\n\\n\");\n if (merged) out.instructions = merged;\n\n // Token cap: prefer the most specific caller-supplied value.\n const cap =\n (body.max_output_tokens as number | undefined) ??\n (body.max_completion_tokens as number | undefined) ??\n (body.max_tokens as number | undefined);\n if (cap != null) out.max_output_tokens = cap;\n\n // Translate response_format → text.format. OpenAI Responses uses\n // `text: {format: {type: \"json_schema\"|\"text\", ...}}`.\n const rf = body.response_format as Record<string, unknown> | undefined;\n if (rf) {\n const existingText = (out.text as Record<string, unknown>) ?? {};\n out.text = { ...existingText, format: rf };\n }\n\n // `stream` flag passes through.\n return out;\n}\n\n// =============================================================================\n// Response parsing\n// =============================================================================\n\nfunction extractText(output: ResponsesOutputItem[] | undefined): { content: string; reasoning: string } {\n let content = \"\";\n let reasoning = \"\";\n if (!Array.isArray(output)) return { content, reasoning };\n for (const item of output) {\n if (item?.type === \"message\") {\n for (const part of item.content ?? []) {\n if (part?.type === \"output_text\" && typeof part.text === \"string\") {\n content += part.text;\n }\n }\n } else if (item?.type === \"reasoning\") {\n const summary = item.summary;\n if (Array.isArray(summary)) {\n for (const s of summary) {\n if (s?.type === \"summary_text\" && typeof s.text === \"string\") {\n reasoning += s.text;\n }\n }\n }\n }\n }\n return { content, reasoning };\n}\n\nfunction normalizeUsage(u: ResponsesUsage | undefined): Record<string, unknown> | null {\n if (!u) return null;\n return {\n prompt_tokens: u.input_tokens ?? null,\n completion_tokens: u.output_tokens ?? null,\n total_tokens: u.total_tokens ?? null,\n // Preserve everything else (cached/prompt detail blocks, etc.).\n ...u,\n };\n}\n\nfunction toChatCompletion(\n r: ResponsesResponse,\n content: string,\n reasoning: string,\n): Record<string, unknown> {\n const message: Record<string, unknown> = { role: \"assistant\", content };\n if (reasoning) message.reasoning_content = reasoning;\n const usage = normalizeUsage(r.usage);\n const out: Record<string, unknown> = {\n id: r.id ?? \"\",\n object: \"chat.completion\",\n created: typeof r.created_at === \"number\" ? r.created_at : Math.floor(Date.now() / 1000),\n model: r.model ?? \"\",\n choices: [\n {\n index: 0,\n message,\n finish_reason: r.status === \"completed\" ? \"stop\" : (r.status ?? \"stop\"),\n },\n ],\n };\n if (usage) out.usage = usage;\n return out;\n}\n\n// =============================================================================\n// Variant export\n// =============================================================================\n\nexport const responsesVariant: UpstreamApiVariant = {\n id: \"responses\",\n capability: \"chat\",\n path: \"/responses\",\n supportsStreaming: true,\n\n transformRequest(body) {\n return translateRequest(body);\n },\n\n parseResponse(json) {\n const r = (json ?? {}) as ResponsesResponse;\n const { content, reasoning } = extractText(r.output);\n const usage = r.usage ?? {};\n return {\n output: content || null,\n promptTokens: usage.input_tokens ?? null,\n completionTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n normalized: toChatCompletion(r, content, reasoning),\n };\n },\n\n parseStreamChunk(json) {\n const ev = (json ?? {}) as ResponsesStreamEvent;\n const type = ev.type;\n if (!type) return null;\n\n // Lifecycle: capture id/model when the response is created or finalized.\n if (type === \"response.created\" || type === \"response.in_progress\") {\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n };\n }\n\n // Textual content delta.\n if (type === \"response.output_text.delta\") {\n const delta = typeof ev.delta === \"string\" ? ev.delta : \"\";\n return { content: delta, reasoning: \"\" };\n }\n\n // Reasoning deltas land under several event names depending on\n // model family — catch them all.\n if (\n type === \"response.reasoning_summary_text.delta\" ||\n type === \"response.reasoning_summary.delta\" ||\n type === \"response.reasoning.delta\"\n ) {\n const delta = typeof ev.delta === \"string\" ? ev.delta : \"\";\n return { content: \"\", reasoning: delta };\n }\n\n // Terminal event carries the final usage + canonical id/model.\n if (type === \"response.completed\") {\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n usage: normalizeUsage(r?.usage) ?? undefined,\n };\n }\n\n if (type === \"response.failed\" || type === \"response.incomplete\") {\n // Surface as an empty terminal — the gateway logs the upstream\n // error separately via HTTP status if any.\n const r = ev.response;\n return {\n content: \"\",\n reasoning: \"\",\n id: typeof r?.id === \"string\" ? r.id : undefined,\n model: typeof r?.model === \"string\" ? r.model : undefined,\n usage: normalizeUsage(r?.usage) ?? undefined,\n };\n }\n\n // Housekeeping events (output_item.added, content_part.added,\n // done variants for items/parts, etc.) carry no content delta.\n return null;\n },\n};\n\nregisterVariant(responsesVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const embeddingsVariant: UpstreamApiVariant = {\n id: \"embeddings\",\n capability: \"embedding\",\n path: \"/embeddings\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n usage?: { prompt_tokens?: number; total_tokens?: number };\n data?: Array<{ embedding?: number[] }>;\n };\n const dim = j?.data?.[0]?.embedding?.length;\n return {\n output: dim ? `${j.data!.length} vector(s) × ${dim} dim` : null,\n promptTokens: j?.usage?.prompt_tokens ?? null,\n completionTokens: null,\n totalTokens: j?.usage?.total_tokens ?? null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(embeddingsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const imagesGenerationsVariant: UpstreamApiVariant = {\n id: \"images.generations\",\n capability: \"image\",\n path: \"/images/generations\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n data?: Array<{ url?: string; b64_json?: string }>;\n usage?: { input_tokens?: number; output_tokens?: number; total_tokens?: number };\n };\n const count = j?.data?.length ?? 0;\n return {\n output: count > 0 ? `Generated ${count} image${count === 1 ? \"\" : \"s\"}` : null,\n // gpt-image-1 reports token usage; legacy DALL·E doesn't.\n promptTokens: j?.usage?.input_tokens ?? null,\n completionTokens: j?.usage?.output_tokens ?? null,\n totalTokens: j?.usage?.total_tokens ?? null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(imagesGenerationsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const audioSpeechVariant: UpstreamApiVariant = {\n id: \"audio.speech\",\n capability: \"audio.speech\",\n path: \"/audio/speech\",\n supportsStreaming: false,\n\n parseResponse() {\n // Audio responses are binary — the gateway intercepts at the\n // arraybuffer layer (see forwardGeneration) before calling this.\n return {\n output: \"audio stream returned\",\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: {},\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(audioSpeechVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const audioTranscriptionsVariant: UpstreamApiVariant = {\n id: \"audio.transcriptions\",\n capability: \"audio.transcription\",\n path: \"/audio/transcriptions\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const text = (json as { text?: string })?.text;\n return {\n output: typeof text === \"string\" ? text.slice(0, 400) : null,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (json ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(audioTranscriptionsVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\nexport const rerankVariant: UpstreamApiVariant = {\n id: \"rerank\",\n capability: \"rerank\",\n path: \"/rerank\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const results = (json as { results?: unknown[] })?.results;\n const count = Array.isArray(results) ? results.length : 0;\n return {\n output: `Reranked ${count} document${count === 1 ? \"\" : \"s\"}`,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (json ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(rerankVariant);\n","import \"server-only\";\nimport { registerVariant, type UpstreamApiVariant } from \".\";\n\n/**\n * OpenAI Sora `POST /v1/videos` — async multipart create. The wire\n * shape is multipart/form-data so the JSON gateway pipeline does NOT\n * route through this variant's `transformRequest`; instead the v1\n * route forwards the multipart payload verbatim via\n * `forwardMultipartGeneration`. `parseResponse` still runs on the\n * upstream JSON so the create-time Video object lands in the\n * generation log.\n */\nexport const videosVariant: UpstreamApiVariant = {\n id: \"videos\",\n capability: \"video\",\n path: \"/videos\",\n supportsStreaming: false,\n\n parseResponse(json) {\n const j = json as {\n id?: string;\n status?: string;\n progress?: number;\n seconds?: string | number;\n size?: string;\n model?: string;\n };\n const id = typeof j?.id === \"string\" ? j.id : null;\n const status = typeof j?.status === \"string\" ? j.status : null;\n const summary = id\n ? `${id}${status ? ` (${status})` : \"\"}`\n : status ?? \"video job created\";\n return {\n output: summary,\n promptTokens: null,\n completionTokens: null,\n totalTokens: null,\n normalized: (j ?? {}) as Record<string, unknown>,\n };\n },\n\n parseStreamChunk() {\n return null;\n },\n};\n\nregisterVariant(videosVariant);\n","import \"server-only\";\nimport { randomUUID } from \"node:crypto\";\nimport { eq } from \"drizzle-orm\";\nimport { db } from \"../db\";\nimport { models, providers, type Provider } from \"../db/schema\";\nimport {\n discoveredForProvider,\n getDiscoveryStatus,\n listAllDiscovered,\n type DiscoveredModel,\n} from \"../discovery\";\nimport { findProviderByIdOrName } from \"../providers\";\nimport { resolveAdapter, resolveVariantId } from \"../adapters\";\nimport \"../adapters/register\";\nimport { getCapability } from \"../capabilities\";\nimport \"../capabilities/register\";\nimport \"../api-variants/register\";\nimport { badRequest, notFound } from \"../response\";\nimport { serializeModel } from \"./serializer\";\nimport type { ModelDTO } from \"@/lib/schemas/model\";\nimport type { ModelCreateInput, ModelUpdateInput } from \"@/lib/schemas/model\";\nimport type { NormalizedModelMeta } from \"@/lib/schemas/adapter\";\n\nexport function findModelByIdOrName(idOrName: string) {\n return (\n db.select().from(models).where(eq(models.id, idOrName)).get() ||\n db.select().from(models).where(eq(models.name, idOrName)).get()\n );\n}\n\n/** Verbatim entry persisted at override creation, or the freshest cached\n * discovery entry, or null. Requires the discovery cache to be warm\n * for the relevant provider (callers warm via listAllDiscovered or\n * discoveredForProvider before invoking). */\nfunction rawForDbModel(model: typeof models.$inferSelect, provider: Provider | undefined): unknown {\n if (model.discoveredMetadata !== null && model.discoveredMetadata !== undefined) {\n return model.discoveredMetadata;\n }\n if (!provider) return null;\n const cached = getDiscoveryStatus(provider.id);\n const hit = cached?.models.find((m) => m.id === model.upstreamModelId);\n return hit?.meta.raw ?? null;\n}\n\n/** Re-project the raw entry through the provider's adapter. When raw is\n * missing entirely we feed `{id}` so the adapter still emits its built-in\n * defaults (Foundry's accepted/rejected_fields, etc.). */\nfunction metaForDbModel(\n model: typeof models.$inferSelect,\n provider: Provider | undefined,\n raw: unknown,\n): NormalizedModelMeta | null {\n if (!provider) return null;\n const adapter = resolveAdapter(provider);\n return adapter.extractModelMeta(raw ?? { id: model.upstreamModelId }, provider);\n}\n\n/** Compute the variant id the gateway would dispatch to right now —\n * combines the model's pin (if any) with the capability preference\n * chain. Surfaced on the DTO so the admin form seeds its dropdown with\n * the same value the gateway is using. */\nfunction resolveDisplayVariant(\n model: typeof models.$inferSelect,\n provider: Provider | undefined,\n meta: NormalizedModelMeta | null,\n): string | null {\n if (!provider) return null;\n const capability = getCapability(model.type);\n if (!capability) return null;\n try {\n const adapter = resolveAdapter(provider);\n return resolveVariantId(adapter, capability, model, meta);\n } catch {\n return null;\n }\n}\n\n/** Synthesize a transient ModelDTO for a discovered upstream model. */\nfunction discoveredToDTO(d: DiscoveredModel, provider: Provider | undefined): ModelDTO & { is_discovered: true } {\n // Build a tiny shim Model so resolveDisplayVariant can drive the\n // same capability + adapter logic as for DB-backed rows. Only the\n // fields resolveVariantId reads need to be present.\n const shim = {\n apiVariantId: null,\n type: d.capability,\n upstreamModelId: d.id,\n } as typeof models.$inferSelect;\n const resolved = resolveDisplayVariant(shim, provider, d.meta);\n return {\n id: `discovered:${d.provider_id}:${d.id}`,\n name: d.id,\n model_id: d.id,\n proxy: provider?.baseUrl ?? null,\n timeout: 3600,\n max_retries: 2,\n http_proxy: null,\n default_params: {},\n type: d.capability,\n api_variant_id: null,\n resolved_variant_id: resolved,\n pricing: null,\n output_dimension: null,\n context_window: d.meta.context_window ?? null,\n max_tokens: d.meta.max_output_tokens ?? null,\n description: null,\n knowledge_date: null,\n provider: provider?.name ?? d.provider_name,\n provider_id: d.provider_id,\n is_local: false,\n enabled: true,\n meta: d.meta,\n created_at: undefined,\n updated_at: undefined,\n is_discovered: true,\n };\n}\n\n/** List all DB-backed override rows plus live discovered models (union, DB shadows discovery). */\nexport async function listAllModels(): Promise<ModelDTO[]> {\n // Kick off discovery + the bulk providers fetch BEFORE the DB scan so\n // the network round-trip overlaps with local work. Drizzle is sync via\n // better-sqlite3, so without this overlap discovery would always be on\n // the critical path.\n const discoveredPromise = listAllDiscovered();\n\n const rows = db.select().from(models).orderBy(models.name).all();\n const allProviders = db.select().from(providers).all();\n const allProvidersById = new Map(allProviders.map((p) => [p.id, p]));\n\n const discovered = await discoveredPromise;\n\n const dbModels: ModelDTO[] = rows.map((m) => {\n const p = allProvidersById.get(m.providerId);\n const raw = rawForDbModel(m, p);\n const meta = metaForDbModel(m, p, raw);\n return {\n ...serializeModel(m, p?.name ?? null, p?.baseUrl ?? null, meta, resolveDisplayVariant(m, p, meta)),\n is_discovered: false,\n };\n });\n\n const seen = new Set(dbModels.map((m) => m.name));\n const synthesized = discovered\n .filter((d) => !seen.has(d.id))\n .map((d) => discoveredToDTO(d, allProvidersById.get(d.provider_id)));\n\n return [...dbModels, ...synthesized];\n}\n\nexport async function listModelsForProvider(providerIdOrName: string): Promise<ModelDTO[]> {\n const provider = findProviderByIdOrName(providerIdOrName);\n if (!provider) throw notFound(\"Provider not found\");\n\n // Overlap discovery with the DB scan.\n const discoveredPromise = discoveredForProvider(provider).catch((err) => {\n console.warn(`[loom] provider \"${provider.name}\" discovery failed:`, err);\n return [] as DiscoveredModel[];\n });\n\n const rows = db.select().from(models)\n .where(eq(models.providerId, provider.id))\n .orderBy(models.name)\n .all();\n\n const discovered = await discoveredPromise;\n\n const dbModels: ModelDTO[] = rows.map((m) => {\n const raw = rawForDbModel(m, provider);\n const meta = metaForDbModel(m, provider, raw);\n return {\n ...serializeModel(m, provider.name, provider.baseUrl, meta, resolveDisplayVariant(m, provider, meta)),\n is_discovered: false,\n };\n });\n const seen = new Set(dbModels.map((m) => m.name));\n\n const synthesized = discovered\n .filter((d) => !seen.has(d.id))\n .map((d) => discoveredToDTO(d, provider));\n\n return [...dbModels, ...synthesized];\n}\n\nexport async function getModel(idOrName: string): Promise<ModelDTO> {\n const model = findModelByIdOrName(idOrName);\n if (model) {\n const provider = db.select().from(providers).where(eq(providers.id, model.providerId)).get();\n // Network warmup is only worth doing when the DB row lacks a\n // persisted snapshot — otherwise `rawForDbModel` already has\n // everything it needs and we'd just be paying upstream latency\n // for no UI win.\n if (provider && model.discoveredMetadata == null) {\n try {\n await discoveredForProvider(provider);\n } catch (err) {\n console.warn(`[loom] provider \"${provider.name}\" discovery failed:`, err);\n }\n }\n const raw = rawForDbModel(model, provider);\n const meta = metaForDbModel(model, provider, raw);\n return serializeModel(model, provider?.name ?? null, provider?.baseUrl ?? null, meta, resolveDisplayVariant(model, provider, meta));\n }\n // No DB row — fall back to the live discovery union so /models/<name>\n // works for transient discovered entries too.\n const discovered = await listAllDiscovered();\n const hit = discovered.find((d) => d.id === idOrName);\n if (hit) {\n const provider = db.select().from(providers).where(eq(providers.id, hit.provider_id)).get();\n return discoveredToDTO(hit, provider);\n }\n throw notFound(\"Model not found\");\n}\n\nexport async function createModel(input: ModelCreateInput): Promise<ModelDTO> {\n const name = input.name.trim();\n const providerKey = input.provider_id.trim();\n const upstream = input.upstream_model_id.trim();\n\n const provider = findProviderByIdOrName(providerKey);\n if (!provider) throw badRequest(\"Provider not found\");\n\n const existing = db.select().from(models).where(eq(models.name, name)).get();\n if (existing) throw badRequest(\"Model name already exists\");\n\n // Snapshot the discovery cache when the caller didn't supply a raw\n // entry — promoting a discovered model into an override is the common\n // case and we don't want to lose its metadata.\n let snapshotted = input.discovered_metadata;\n if (snapshotted === undefined || snapshotted === null) {\n const cached = getDiscoveryStatus(provider.id);\n const hit = cached?.models.find((m) => m.id === upstream);\n if (hit) snapshotted = hit.meta.raw ?? null;\n }\n\n const id = randomUUID();\n db.insert(models).values({\n id,\n name,\n providerId: provider.id,\n upstreamModelId: upstream,\n type: input.type ?? \"chat\",\n defaultParams: input.default_params ?? {},\n contextWindow: input.context_window ?? null,\n maxTokens: input.max_tokens ?? null,\n outputDimension: input.output_dimension ?? null,\n pricing: input.pricing ?? null,\n description: input.description ?? null,\n knowledgeDate: input.knowledge_date ?? null,\n timeout: input.timeout ?? 3600,\n maxRetries: input.max_retries ?? 2,\n httpProxy: input.http_proxy ?? null,\n enabled: input.enabled ?? true,\n apiVariantId: input.api_variant_id?.trim() || null,\n discoveredMetadata: snapshotted ?? null,\n }).run();\n\n return getModel(id);\n}\n\nexport async function updateModel(idOrName: string, input: ModelUpdateInput): Promise<ModelDTO> {\n const model = findModelByIdOrName(idOrName);\n if (!model) throw notFound(\"Model not found\");\n\n const updates: Partial<typeof models.$inferInsert> = {};\n\n if (input.name !== undefined) {\n const newName = input.name.trim();\n if (!newName) throw badRequest(\"Model name cannot be empty\");\n if (newName !== model.name) {\n const dup = db.select().from(models).where(eq(models.name, newName)).get();\n if (dup) throw badRequest(\"Model name already exists\");\n updates.name = newName;\n }\n }\n if (input.provider_id !== undefined) {\n const provider = findProviderByIdOrName(input.provider_id);\n if (!provider) throw badRequest(\"Provider not found\");\n updates.providerId = provider.id;\n }\n if (input.upstream_model_id !== undefined) {\n const v = input.upstream_model_id.trim();\n if (!v) throw badRequest(\"upstream_model_id cannot be empty\");\n updates.upstreamModelId = v;\n }\n if (input.type !== undefined) updates.type = input.type;\n if (input.default_params !== undefined) updates.defaultParams = input.default_params ?? {};\n if (input.context_window !== undefined) updates.contextWindow = input.context_window;\n if (input.max_tokens !== undefined) updates.maxTokens = input.max_tokens;\n if (input.output_dimension !== undefined) updates.outputDimension = input.output_dimension;\n if (input.pricing !== undefined) updates.pricing = input.pricing;\n if (input.description !== undefined) updates.description = input.description;\n if (input.knowledge_date !== undefined) updates.knowledgeDate = input.knowledge_date;\n if (input.timeout !== undefined) updates.timeout = input.timeout;\n if (input.max_retries !== undefined) updates.maxRetries = input.max_retries;\n if (input.http_proxy !== undefined) updates.httpProxy = input.http_proxy ?? null;\n if (input.enabled !== undefined) updates.enabled = !!input.enabled;\n if (input.api_variant_id !== undefined) {\n const v = input.api_variant_id?.trim();\n updates.apiVariantId = v ? v : null;\n }\n if (input.discovered_metadata !== undefined) updates.discoveredMetadata = input.discovered_metadata;\n\n updates.updatedAt = new Date().toISOString();\n\n db.update(models).set(updates).where(eq(models.id, model.id)).run();\n return getModel(model.id);\n}\n\nexport async function deleteModel(idOrName: string): Promise<void> {\n const model = findModelByIdOrName(idOrName);\n if (!model) throw notFound(\"Model not found\");\n db.delete(models).where(eq(models.id, model.id)).run();\n}\n","import \"server-only\";\nimport type { Model } from \"../db/schema\";\nimport type { ModelDTO } from \"@/lib/schemas/model\";\nimport type { NormalizedModelMeta } from \"@/lib/schemas/adapter\";\n\nexport function serializeModel(\n m: Model,\n providerName?: string | null,\n providerProxy?: string | null,\n meta?: NormalizedModelMeta | null,\n resolvedVariantId?: string | null,\n): ModelDTO {\n return {\n id: m.id,\n name: m.name,\n model_id: m.upstreamModelId,\n proxy: providerProxy ?? null,\n timeout: m.timeout,\n max_retries: m.maxRetries,\n http_proxy: m.httpProxy ?? null,\n default_params: (m.defaultParams ?? {}) as Record<string, unknown>,\n type: m.type,\n api_variant_id: m.apiVariantId ?? null,\n resolved_variant_id: resolvedVariantId ?? null,\n pricing: m.pricing ?? null,\n output_dimension: m.outputDimension ?? null,\n context_window: m.contextWindow ?? null,\n max_tokens: m.maxTokens ?? null,\n description: m.description ?? null,\n knowledge_date: m.knowledgeDate ?? null,\n provider: providerName ?? null,\n provider_id: m.providerId,\n is_local: false,\n enabled: !!m.enabled,\n meta: meta ?? null,\n created_at: m.createdAt,\n updated_at: m.updatedAt,\n };\n}\n"],"names":["chatCompletionsVariant","id","capability","path","supportsStreaming","parseResponse","json","j","message","choices","finishReason","finish_reason","usage","tcRaw","Array","isArray","tool_calls","toolCalls","map","tc","name","function","arguments","filter","output","content","promptTokens","prompt_tokens","completionTokens","completion_tokens","totalTokens","total_tokens","normalized","length","undefined","parseStreamChunk","choice","delta","toolDeltas","index","argumentsDelta","reasoning","reasoning_content","model","systemFingerprint","system_fingerprint","serializeModel","m","providerName","providerProxy","meta","resolvedVariantId","model_id","upstreamModelId","proxy","timeout","max_retries","maxRetries","http_proxy","httpProxy","default_params","defaultParams","type","api_variant_id","apiVariantId","resolved_variant_id","pricing","output_dimension","outputDimension","context_window","contextWindow","max_tokens","maxTokens","description","knowledge_date","knowledgeDate","provider","provider_id","providerId","is_local","enabled","created_at","createdAt","updated_at","updatedAt"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- module.exports=[681281,22438,e=>{"use strict";e.s(["forwardGeneration",()=>$,"resolveModel",()=>C],681281);var t=e.i(875225),n=e.i(846344),a=e.i(110726);e.i(222784),e.i(299207);var o=e.i(425568);e.i(246875);var s=e.i(938015),r=e.i(898947),i=e.i(152358);e.i(494977);var l=e.i(183397);e.i(439782);var d=e.i(57578),u=e.i(54013);e.i(886116);var p=e.i(803028),c=e.i(666680);let m=new Set(["messages","input","image","mask","file","prompt","tools"]),f=/^[A-Za-z0-9+/=]+$/;function g(e){let t=(0,c.randomUUID)(),o=function e(t){if("string"==typeof t)return function(e){if(e.length<=2048)return e;if(e.startsWith("data:")){let t=e.indexOf(";"),n=t>5?e.slice(5,t):"binary",a=Math.round(e.length/1024),o=n.startsWith("image/")?"image":"file";return`[base64 ${o} ${n}, ~${a} KB]`}if(f.test(e.slice(0,96))){let t=Math.round(e.length/1024);return`[base64 blob, ~${t} KB]`}return e}(t);if(Array.isArray(t))return t.map(e);if(t&&"object"==typeof t){let n={};for(let[a,o]of Object.entries(t))n[a]=e(o);return n}return t}(e.requestBody);return n.db.insert(a.schema.generationLogs).values({id:t,userId:e.userId,modelName:e.modelName,capability:e.capability,status:"pending",input:o,inputSummary:e.inputSummary,generationKwargs:function(e){let t={};for(let[n,a]of Object.entries(e))m.has(n)||(t[n]=a);return t}(o),conversationId:e.conversationId??null,messageId:e.messageId??null}).run(),t}function y(e,o){n.db.update(a.schema.generationLogs).set({status:o.status,output:o.output??null,reason:o.reason??null,generation:o.generation??null,promptTokens:o.promptTokens??null,completionTokens:o.completionTokens??null,totalTokens:o.totalTokens??null,firstTokenLatencyMs:o.firstTokenLatencyMs??null,totalLatencyMs:o.totalLatencyMs??null,updatedAt:new Date().toISOString()}).where((0,t.eq)(a.schema.generationLogs.id,e)).run()}let h=new TextEncoder;var w=e.i(872031);async function b({upstream:e,variant:t,ctx:n,opts:a,started:o,logId:s}){let r=e.headers.get("Content-Type")??"";if(r.startsWith("application/json")){let r=await e.json().catch(()=>({})),i=t.parseResponse(r,n),l=i.normalized;if("image"===n.capability.id)try{l=structuredClone(i.normalized),await (0,w.persistImageArtifacts)(s,l)}catch(e){console.error("[loom] persistImageArtifacts failed:",e),l=i.normalized}return y(s,{status:"completed",output:i.output,generation:l,promptTokens:i.promptTokens,completionTokens:i.completionTokens,totalTokens:i.totalTokens,totalLatencyMs:Date.now()-o}),a.onComplete?.({content:i.output??"",reasoning:"",usage:i.normalized.usage,toolCalls:i.toolCalls,finishReason:i.finishReason}),{response:new Response(JSON.stringify(i.normalized),{headers:{"Content-Type":"application/json"}}),logId:s}}let i=await e.arrayBuffer();return y(s,{status:"completed",output:`binary response (${r||"unknown"}, ${i.byteLength} bytes)`,totalLatencyMs:Date.now()-o}),{response:new Response(i,{headers:{"Content-Type":r||"application/octet-stream"}}),logId:s}}async function T(e,t,n){let a,o=(0,i.getCapability)(t);if(!o)throw(0,p.badRequest)(`Unknown capability "${t}"`);let s=n.get("model");if("string"!=typeof s||!s)throw(0,p.badRequest)("`model` form field is required");let{model:r,provider:d,adapter:c,meta:m,apiKey:f}=await C(s),h=(0,l.resolveVariantId)(c,o,r,m),w=(0,u.getVariant)(h);if(!w)throw(0,p.badRequest)(`No upstream variant registered for "${h}"`);if(w.capability!==o.id)throw(0,p.badRequest)(`Variant "${h}" serves "${w.capability}", not "${o.id}"`);let T={provider:d,model:r,meta:m,capability:o,variant:w,stream:!1},v=new FormData;for(let[e,t]of n.entries())"model"!==e&&v.append(e,t);v.append("model",r.upstreamModelId);let $=function(e,t){let n=e.get("prompt");if("string"==typeof n&&n)return n;if("audio.transcription"===t){let t=e.get("file"),n=t instanceof File?t.name:null,a=t instanceof File?t.size:null;return n?`audio file: ${n}${a?` (${a} bytes)`:""}`:"audio input"}return null}(n,o.id),M=g({userId:e.id,modelName:r.name,capability:o.id,requestBody:function(e){let t={};for(let[n,a]of e.entries())if(a instanceof File)t[n]={_kind:"file",name:a.name,type:a.type,size:a.size};else{let e=String(a);t[n]=e.length>4e3?`${e.slice(0,4e3)}…(+${e.length-4e3})`:e}return t}(n),inputSummary:$?.slice(0,1e3)??null}),k={...c.upstreamHeaders(T,f)};delete k["Content-Type"],delete k["content-type"];let D=Date.now(),I=1e3*Math.max(1,r.timeout);try{a=await fetch(c.upstreamUrl(T),{method:"POST",headers:k,body:v,signal:AbortSignal.timeout(I)})}catch(t){let e=t instanceof Error?t.message:String(t);throw y(M,{status:"failed",reason:e,totalLatencyMs:Date.now()-D}),new p.HttpError(`Upstream request failed: ${e}`,502)}if(!a.ok){let e=await a.text().catch(()=>a.statusText);return y(M,{status:"failed",reason:`Upstream HTTP ${a.status}`,output:e.slice(0,4e3),totalLatencyMs:Date.now()-D}),{response:new Response(e,{status:a.status,headers:{"Content-Type":a.headers.get("Content-Type")??"application/json"}}),logId:M}}return b({upstream:a,variant:w,ctx:{provider:d,model:r,meta:m,capability:o,stream:!1},opts:{},started:D,logId:M})}async function v(e){let{provider:t,apiKey:n}=await C(e.modelName);if(!t.enabled)throw(0,p.badRequest)(`Provider "${t.name}" is disabled`);let a=t.baseUrl.replace(/\/$/,""),o=`${a}${e.path}`;e.query&&(o+=`?${e.query}`);let s={};n&&(s.Authorization=`Bearer ${n}`),Object.assign(s,e.headers??{}),!e.body||s["Content-Type"]||e.body instanceof FormData||(s["Content-Type"]="application/json");let r=await fetch(o,{method:e.method??"GET",headers:s,body:e.body}),i={"Content-Type":r.headers.get("Content-Type")??"application/octet-stream"},l=r.headers.get("Content-Length");l&&(i["Content-Length"]=l);let d=r.headers.get("Content-Disposition");return d&&(i["Content-Disposition"]=d),new Response(r.body,{status:r.status,statusText:r.statusText,headers:i})}async function C(e){let d,u=(0,s.findModelByIdOrName)(e);if(u){if(!u.enabled)throw(0,p.badRequest)(`Model "${e}" is disabled`);let s=n.db.select().from(a.schema.providers).where((0,t.eq)(a.schema.providers.id,u.providerId)).get();if(!s)throw(0,p.notFound)(`Provider for model "${e}" not found`);if(!s.enabled)throw(0,p.badRequest)(`Provider "${s.name}" is disabled`);let i=(0,l.resolveAdapter)(s),d=u.discoveredMetadata;if(null==d){let e=(0,r.getDiscoveryStatus)(s.id),t=e?.models.find(e=>e.id===u.upstreamModelId);d=t?.meta.raw??{id:u.upstreamModelId}}let c=i.extractModelMeta(d,s);return{model:u,provider:s,adapter:i,meta:c,apiKey:(0,o.decryptSecret)(s.apiKeyEncrypted),discovered:!1}}let c=await (0,r.resolveByDiscovery)(e);if(!c)throw(0,p.notFound)(`Model "${e}" not found in any provider`);let{provider:m,upstreamModelId:f,meta:g}=c,y=(0,l.resolveAdapter)(m),h=(0,i.classifyModel)(f);return{model:(d=new Date().toISOString(),{id:`discovered:${m.id}:${f}`,name:e,providerId:m.id,upstreamModelId:f,type:h,defaultParams:{},contextWindow:null,maxTokens:null,outputDimension:null,pricing:null,description:null,knowledgeDate:null,timeout:60,maxRetries:2,httpProxy:null,enabled:!0,apiVariantId:null,discoveredMetadata:null,createdAt:d,updatedAt:d}),provider:m,adapter:y,meta:g,apiKey:(0,o.decryptSecret)(m.apiKeyEncrypted),discovered:!0}}async function $(e,t,n,a={}){let o,s,r,c=(0,i.getCapability)(t);if(!c)throw(0,p.badRequest)(`Unknown capability "${t}"`);let m="string"==typeof n.model?n.model:"";if(!m)throw(0,p.badRequest)("`model` is required");let{model:f,provider:w,adapter:T,meta:v,apiKey:M}=await C(m),k=(0,l.resolveVariantId)(T,c,f,v),D=(0,u.getVariant)(k);if(!D)throw(0,p.badRequest)(`No upstream variant registered for "${k}"`);if(D.capability!==c.id)throw(0,p.badRequest)(`Variant "${k}" serves "${D.capability}", not "${c.id}"`);let I=!!D.supportsStreaming&&!!n.stream,S={provider:w,model:f,meta:v,capability:c,stream:I},q={provider:w,model:f,meta:v,capability:c,variant:D,stream:I},x=(s=w.defaultParams??{},r=f.defaultParams??{},{...s,...r,...n}),R=(0,d.applyFieldFilter)(x,v),L=D.transformRequest?.(R,S)??R,A=T.finalizeRequest?.(L,q)??L,O=c.summarizeInput?.(x)??null,N=g({userId:e.id,modelName:f.name,capability:c.id,requestBody:A,inputSummary:O?.slice(0,1e3)??null,conversationId:a.conversationId,messageId:a.messageId}),U=Date.now(),_=1e3*Math.max(1,f.timeout),j=AbortSignal.timeout(_),z=a.signal?AbortSignal.any([a.signal,j]):j;try{o=await fetch(T.upstreamUrl(q),{method:"POST",headers:T.upstreamHeaders(q,M),body:JSON.stringify(A),signal:z})}catch(t){let e=t instanceof Error?t.message:String(t);throw y(N,{status:"failed",reason:e,totalLatencyMs:Date.now()-U}),new p.HttpError(`Upstream request failed: ${e}`,502)}if(!o.ok){let e=await o.text().catch(()=>o.statusText);return y(N,{status:"failed",reason:`Upstream HTTP ${o.status}`,output:e.slice(0,4e3),totalLatencyMs:Date.now()-U}),{response:new Response(e,{status:o.status,headers:{"Content-Type":o.headers.get("Content-Type")??"application/json"}}),logId:N}}return I?function({upstream:e,variant:t,ctx:n,opts:a,started:o,logId:s,model:r}){let i,l,d,u;if(!e.body)throw y(s,{status:"failed",reason:"Upstream returned empty stream",totalLatencyMs:Date.now()-o}),new p.HttpError("Upstream returned empty stream",502);let c="",m="",f=null,g="",w=null,b=new Map,T=new TextDecoder,v=Math.floor(o/1e3),C=(e,t,n,a=null)=>{let o={};t.content&&(o.content=t.content),t.reasoning&&(o.reasoning_content=t.reasoning),t.toolCalls&&t.toolCalls.length>0&&(o.tool_calls=t.toolCalls.map(e=>({index:e.index,id:e.id,type:"function",function:{name:e.name,arguments:e.argumentsDelta}})));let i={id:d??s,object:"chat.completion.chunk",created:v,model:l??r.upstreamModelId,choices:[{index:0,delta:o,finish_reason:a}]};u&&(i.system_fingerprint=u),n&&(i.usage=n),e.enqueue(h.encode(`data: ${JSON.stringify(i)}
1
+ module.exports=[681281,22438,e=>{"use strict";e.s(["forwardGeneration",()=>M,"resolveModel",()=>$],681281);var t=e.i(875225),n=e.i(846344),a=e.i(110726);e.i(222784),e.i(299207);var o=e.i(425568);e.i(246875);var s=e.i(938015),r=e.i(898947),i=e.i(152358);e.i(494977);var l=e.i(183397);e.i(439782);var d=e.i(57578),u=e.i(54013);e.i(886116),e.i(341703);var p=e.i(438107),c=e.i(803028),m=e.i(666680);let f=new Set(["messages","input","image","mask","file","prompt","tools"]),g=/^[A-Za-z0-9+/=]+$/;function y(e){let t=(0,m.randomUUID)(),o=function e(t){if("string"==typeof t)return function(e){if(e.length<=2048)return e;if(e.startsWith("data:")){let t=e.indexOf(";"),n=t>5?e.slice(5,t):"binary",a=Math.round(e.length/1024),o=n.startsWith("image/")?"image":"file";return`[base64 ${o} ${n}, ~${a} KB]`}if(g.test(e.slice(0,96))){let t=Math.round(e.length/1024);return`[base64 blob, ~${t} KB]`}return e}(t);if(Array.isArray(t))return t.map(e);if(t&&"object"==typeof t){let n={};for(let[a,o]of Object.entries(t))n[a]=e(o);return n}return t}(e.requestBody);return n.db.insert(a.schema.generationLogs).values({id:t,userId:e.userId,modelName:e.modelName,capability:e.capability,status:"pending",input:o,inputSummary:e.inputSummary,generationKwargs:function(e){let t={};for(let[n,a]of Object.entries(e))f.has(n)||(t[n]=a);return t}(o),conversationId:e.conversationId??null,messageId:e.messageId??null}).run(),t}function h(e,o){n.db.update(a.schema.generationLogs).set({status:o.status,output:o.output??null,reason:o.reason??null,generation:o.generation??null,promptTokens:o.promptTokens??null,completionTokens:o.completionTokens??null,totalTokens:o.totalTokens??null,firstTokenLatencyMs:o.firstTokenLatencyMs??null,totalLatencyMs:o.totalLatencyMs??null,updatedAt:new Date().toISOString()}).where((0,t.eq)(a.schema.generationLogs.id,e)).run()}let w=new TextEncoder;var b=e.i(872031);async function T({upstream:e,variant:t,ctx:n,opts:a,started:o,logId:s}){let r=e.headers.get("Content-Type")??"";if(r.startsWith("application/json")){let r=await e.json().catch(()=>({})),i=t.parseResponse(r,n),l=i.normalized;if("image"===n.capability.id)try{l=structuredClone(i.normalized),await (0,b.persistImageArtifacts)(s,l)}catch(e){console.error("[loom] persistImageArtifacts failed:",e),l=i.normalized}return h(s,{status:"completed",output:i.output,generation:l,promptTokens:i.promptTokens,completionTokens:i.completionTokens,totalTokens:i.totalTokens,totalLatencyMs:Date.now()-o}),a.onComplete?.({content:i.output??"",reasoning:"",usage:i.normalized.usage,toolCalls:i.toolCalls,finishReason:i.finishReason}),{response:new Response(JSON.stringify(i.normalized),{headers:{"Content-Type":"application/json"}}),logId:s}}let i=await e.arrayBuffer();return h(s,{status:"completed",output:`binary response (${r||"unknown"}, ${i.byteLength} bytes)`,totalLatencyMs:Date.now()-o}),{response:new Response(i,{headers:{"Content-Type":r||"application/octet-stream"}}),logId:s}}async function v(e,t,n){let a,o=(0,i.getCapability)(t);if(!o)throw(0,c.badRequest)(`Unknown capability "${t}"`);let s=n.get("model");if("string"!=typeof s||!s)throw(0,c.badRequest)("`model` form field is required");let{model:r,provider:d,adapter:m,meta:f,apiKey:g}=await $(s),w=(0,l.resolveVariantId)(m,o,r,f),b=(0,u.getVariant)(w);if(!b)throw(0,c.badRequest)(`No upstream variant registered for "${w}"`);if(b.capability!==o.id)throw(0,c.badRequest)(`Variant "${w}" serves "${b.capability}", not "${o.id}"`);let v={provider:d,model:r,meta:f,capability:o,variant:b,stream:!1},C=new FormData;for(let[e,t]of n.entries())"model"!==e&&C.append(e,t);C.append("model",r.upstreamModelId);let M=function(e,t){let n=e.get("prompt");if("string"==typeof n&&n)return n;if("audio.transcription"===t){let t=e.get("file"),n=t instanceof File?t.name:null,a=t instanceof File?t.size:null;return n?`audio file: ${n}${a?` (${a} bytes)`:""}`:"audio input"}return null}(n,o.id),k=y({userId:e.id,modelName:r.name,capability:o.id,requestBody:function(e){let t={};for(let[n,a]of e.entries())if(a instanceof File)t[n]={_kind:"file",name:a.name,type:a.type,size:a.size};else{let e=String(a);t[n]=e.length>4e3?`${e.slice(0,4e3)}…(+${e.length-4e3})`:e}return t}(n),inputSummary:M?.slice(0,1e3)??null}),D={...m.upstreamHeaders(v,g)};delete D["Content-Type"],delete D["content-type"];let I=Date.now(),S=1e3*Math.max(1,(0,p.getPreferences)(e.id).gateway_timeout_seconds||r.timeout);try{a=await fetch(m.upstreamUrl(v),{method:"POST",headers:D,body:C,signal:AbortSignal.timeout(S)})}catch(t){let e=t instanceof Error?t.message:String(t);throw h(k,{status:"failed",reason:e,totalLatencyMs:Date.now()-I}),new c.HttpError(`Upstream request failed: ${e}`,502)}if(!a.ok){let e=await a.text().catch(()=>a.statusText);return h(k,{status:"failed",reason:`Upstream HTTP ${a.status}`,output:e.slice(0,4e3),totalLatencyMs:Date.now()-I}),{response:new Response(e,{status:a.status,headers:{"Content-Type":a.headers.get("Content-Type")??"application/json"}}),logId:k}}return T({upstream:a,variant:b,ctx:{provider:d,model:r,meta:f,capability:o,stream:!1},opts:{},started:I,logId:k})}async function C(e){let{provider:t,apiKey:n}=await $(e.modelName);if(!t.enabled)throw(0,c.badRequest)(`Provider "${t.name}" is disabled`);let a=t.baseUrl.replace(/\/$/,""),o=`${a}${e.path}`;e.query&&(o+=`?${e.query}`);let s={};n&&(s.Authorization=`Bearer ${n}`),Object.assign(s,e.headers??{}),!e.body||s["Content-Type"]||e.body instanceof FormData||(s["Content-Type"]="application/json");let r=await fetch(o,{method:e.method??"GET",headers:s,body:e.body}),i={"Content-Type":r.headers.get("Content-Type")??"application/octet-stream"},l=r.headers.get("Content-Length");l&&(i["Content-Length"]=l);let d=r.headers.get("Content-Disposition");return d&&(i["Content-Disposition"]=d),new Response(r.body,{status:r.status,statusText:r.statusText,headers:i})}async function $(e){let d,u=(0,s.findModelByIdOrName)(e);if(u){if(!u.enabled)throw(0,c.badRequest)(`Model "${e}" is disabled`);let s=n.db.select().from(a.schema.providers).where((0,t.eq)(a.schema.providers.id,u.providerId)).get();if(!s)throw(0,c.notFound)(`Provider for model "${e}" not found`);if(!s.enabled)throw(0,c.badRequest)(`Provider "${s.name}" is disabled`);let i=(0,l.resolveAdapter)(s),d=u.discoveredMetadata;if(null==d){let e=(0,r.getDiscoveryStatus)(s.id),t=e?.models.find(e=>e.id===u.upstreamModelId);d=t?.meta.raw??{id:u.upstreamModelId}}let p=i.extractModelMeta(d,s);return{model:u,provider:s,adapter:i,meta:p,apiKey:(0,o.decryptSecret)(s.apiKeyEncrypted),discovered:!1}}let p=await (0,r.resolveByDiscovery)(e);if(!p)throw(0,c.notFound)(`Model "${e}" not found in any provider`);let{provider:m,upstreamModelId:f,meta:g}=p,y=(0,l.resolveAdapter)(m),h=(0,i.classifyModel)(f);return{model:(d=new Date().toISOString(),{id:`discovered:${m.id}:${f}`,name:e,providerId:m.id,upstreamModelId:f,type:h,defaultParams:{},contextWindow:null,maxTokens:null,outputDimension:null,pricing:null,description:null,knowledgeDate:null,timeout:3600,maxRetries:2,httpProxy:null,enabled:!0,apiVariantId:null,discoveredMetadata:null,createdAt:d,updatedAt:d}),provider:m,adapter:y,meta:g,apiKey:(0,o.decryptSecret)(m.apiKeyEncrypted),discovered:!0}}async function M(e,t,n,a={}){let o,s,r,m=(0,i.getCapability)(t);if(!m)throw(0,c.badRequest)(`Unknown capability "${t}"`);let f="string"==typeof n.model?n.model:"";if(!f)throw(0,c.badRequest)("`model` is required");let{model:g,provider:b,adapter:v,meta:C,apiKey:k}=await $(f),D=(0,l.resolveVariantId)(v,m,g,C),I=(0,u.getVariant)(D);if(!I)throw(0,c.badRequest)(`No upstream variant registered for "${D}"`);if(I.capability!==m.id)throw(0,c.badRequest)(`Variant "${D}" serves "${I.capability}", not "${m.id}"`);let S=!!I.supportsStreaming&&!!n.stream,q={provider:b,model:g,meta:C,capability:m,stream:S},x={provider:b,model:g,meta:C,capability:m,variant:I,stream:S},R=(s=b.defaultParams??{},r=g.defaultParams??{},{...s,...r,...n}),L=(0,d.applyFieldFilter)(R,C),_=I.transformRequest?.(L,q)??L,A=v.finalizeRequest?.(_,x)??_,O=m.summarizeInput?.(R)??null,N=y({userId:e.id,modelName:g.name,capability:m.id,requestBody:A,inputSummary:O?.slice(0,1e3)??null,conversationId:a.conversationId,messageId:a.messageId}),P=Date.now(),U=1e3*Math.max(1,(0,p.getPreferences)(e.id).gateway_timeout_seconds||g.timeout),j=AbortSignal.timeout(U),z=a.signal?AbortSignal.any([a.signal,j]):j;try{o=await fetch(v.upstreamUrl(x),{method:"POST",headers:v.upstreamHeaders(x,k),body:JSON.stringify(A),signal:z})}catch(t){let e=t instanceof Error?t.message:String(t);throw h(N,{status:"failed",reason:e,totalLatencyMs:Date.now()-P}),new c.HttpError(`Upstream request failed: ${e}`,502)}if(!o.ok){let e=await o.text().catch(()=>o.statusText);return h(N,{status:"failed",reason:`Upstream HTTP ${o.status}`,output:e.slice(0,4e3),totalLatencyMs:Date.now()-P}),{response:new Response(e,{status:o.status,headers:{"Content-Type":o.headers.get("Content-Type")??"application/json"}}),logId:N}}return S?function({upstream:e,variant:t,ctx:n,opts:a,started:o,logId:s,model:r}){let i,l,d,u;if(!e.body)throw h(s,{status:"failed",reason:"Upstream returned empty stream",totalLatencyMs:Date.now()-o}),new c.HttpError("Upstream returned empty stream",502);let p="",m="",f=null,g="",y=null,b=new Map,T=new TextDecoder,v=Math.floor(o/1e3),C=(e,t,n,a=null)=>{let o={};t.content&&(o.content=t.content),t.reasoning&&(o.reasoning_content=t.reasoning),t.toolCalls&&t.toolCalls.length>0&&(o.tool_calls=t.toolCalls.map(e=>({index:e.index,id:e.id,type:"function",function:{name:e.name,arguments:e.argumentsDelta}})));let i={id:d??s,object:"chat.completion.chunk",created:v,model:l??r.upstreamModelId,choices:[{index:0,delta:o,finish_reason:a}]};u&&(i.system_fingerprint=u),n&&(i.usage=n),e.enqueue(w.encode(`data: ${JSON.stringify(i)}
2
2
 
3
- `))},$=new TransformStream({transform(e,s){let r=(g+=T.decode(e,{stream:!0})).split("\n");for(let e of(g=r.pop()||"",r)){let r,p=e.trim();if(!p.startsWith("data:"))continue;let g=p.slice(5).trim();if(!g||"[DONE]"===g)continue;try{r=JSON.parse(g)}catch{continue}let y=t.parseStreamChunk(r,n);if(!y)continue;if(y.id&&!d&&(d=y.id),y.model&&(l=y.model),y.systemFingerprint&&(u=y.systemFingerprint),y.usage&&(i=y.usage),y.finishReason&&(f=y.finishReason),y.toolCalls&&y.toolCalls.length>0){for(let e of y.toolCalls){let t=b.get(e.index)??{arguments:""};e.id&&(t.id=e.id),e.name&&(t.name=e.name),e.argumentsDelta&&(t.arguments+=e.argumentsDelta),b.set(e.index,t)}null===w&&(w=Date.now()-o)}let h=!!(y.content||y.reasoning);h&&(null===w&&(w=Date.now()-o),y.content&&(c+=y.content),y.reasoning&&(m+=y.reasoning),a.onStreamDelta?.({content:y.content??"",reasoning:y.reasoning??""})),(h||y.toolCalls&&y.toolCalls.length>0)&&C(s,{content:y.content,reasoning:y.reasoning,toolCalls:y.toolCalls})}},flush(e){let t=Array.from(b.entries()).sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??"",name:e.name??"",arguments:e.arguments})).filter(e=>e.name),n=f??(t.length>0?"tool_calls":"stop");C(e,{},i,n),e.enqueue(h.encode("data: [DONE]\n\n"));let p=i,g={role:"assistant",content:c};m&&(g.reasoning_content=m),t.length>0&&(g.tool_calls=t.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:e.arguments}})));let T={id:d??s,object:"chat.completion",created:v,model:l??r.upstreamModelId,choices:[{index:0,message:g,finish_reason:n}]};u&&(T.system_fingerprint=u),i&&(T.usage=i),y(s,{status:"completed",output:c,generation:T,promptTokens:p?.prompt_tokens??null,completionTokens:p?.completion_tokens??null,totalTokens:p?.total_tokens??null,firstTokenLatencyMs:w,totalLatencyMs:Date.now()-o}),a.onComplete?.({content:c,reasoning:m,usage:i,toolCalls:t.length>0?t:void 0,finishReason:n})}});return{response:new Response(e.body.pipeThrough($),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),logId:s}}({upstream:o,variant:D,ctx:S,opts:a,started:U,logId:N,model:f}):b({upstream:o,variant:D,ctx:S,opts:a,started:U,logId:N})}e.s(["forwardMultipartGeneration",()=>T,"gatewayProxy",()=>v],22438)}];
3
+ `))},$=new TransformStream({transform(e,s){let r=(g+=T.decode(e,{stream:!0})).split("\n");for(let e of(g=r.pop()||"",r)){let r,c=e.trim();if(!c.startsWith("data:"))continue;let g=c.slice(5).trim();if(!g||"[DONE]"===g)continue;try{r=JSON.parse(g)}catch{continue}let h=t.parseStreamChunk(r,n);if(!h)continue;if(h.id&&!d&&(d=h.id),h.model&&(l=h.model),h.systemFingerprint&&(u=h.systemFingerprint),h.usage&&(i=h.usage),h.finishReason&&(f=h.finishReason),h.toolCalls&&h.toolCalls.length>0){for(let e of h.toolCalls){let t=b.get(e.index)??{arguments:""};e.id&&(t.id=e.id),e.name&&(t.name=e.name),e.argumentsDelta&&(t.arguments+=e.argumentsDelta),b.set(e.index,t)}null===y&&(y=Date.now()-o)}let w=!!(h.content||h.reasoning);w&&(null===y&&(y=Date.now()-o),h.content&&(p+=h.content),h.reasoning&&(m+=h.reasoning),a.onStreamDelta?.({content:h.content??"",reasoning:h.reasoning??""})),(w||h.toolCalls&&h.toolCalls.length>0)&&C(s,{content:h.content,reasoning:h.reasoning,toolCalls:h.toolCalls})}},flush(e){let t=Array.from(b.entries()).sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??"",name:e.name??"",arguments:e.arguments})).filter(e=>e.name),n=f??(t.length>0?"tool_calls":"stop");C(e,{},i,n),e.enqueue(w.encode("data: [DONE]\n\n"));let c=i,g={role:"assistant",content:p};m&&(g.reasoning_content=m),t.length>0&&(g.tool_calls=t.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:e.arguments}})));let T={id:d??s,object:"chat.completion",created:v,model:l??r.upstreamModelId,choices:[{index:0,message:g,finish_reason:n}]};u&&(T.system_fingerprint=u),i&&(T.usage=i),h(s,{status:"completed",output:p,generation:T,promptTokens:c?.prompt_tokens??null,completionTokens:c?.completion_tokens??null,totalTokens:c?.total_tokens??null,firstTokenLatencyMs:y,totalLatencyMs:Date.now()-o}),a.onComplete?.({content:p,reasoning:m,usage:i,toolCalls:t.length>0?t:void 0,finishReason:n})}});return{response:new Response(e.body.pipeThrough($),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),logId:s}}({upstream:o,variant:I,ctx:q,opts:a,started:P,logId:N,model:g}):T({upstream:o,variant:I,ctx:q,opts:a,started:P,logId:N})}e.s(["forwardMultipartGeneration",()=>v,"gatewayProxy",()=>C],22438)}];
4
4
 
5
5
  //# sourceMappingURL=lib_server_gateway_index_ts_1nvei3v._.js.map