omniroute 3.4.5 → 3.4.6

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 (249) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/build-manifest.json +3 -3
  3. package/app/.next/prerender-manifest.json +3 -3
  4. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/audit/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/cache/page.js.nft.json +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/memory/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/settings/page.js.nft.json +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/_global-error.html +1 -1
  41. package/app/.next/server/app/_global-error.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  46. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/api/monitoring/health/route.js +3 -3
  49. package/app/.next/server/app/api/provider-models/route.js +2 -2
  50. package/app/.next/server/app/api/provider-nodes/[id]/route.js +2 -2
  51. package/app/.next/server/app/api/provider-nodes/route.js +3 -3
  52. package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  53. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  54. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  55. package/app/.next/server/app/api/providers/[id]/sync-models/route.js +3 -3
  56. package/app/.next/server/app/api/providers/[id]/sync-models/route.js.nft.json +1 -1
  57. package/app/.next/server/app/api/providers/[id]/test/route.js +6 -6
  58. package/app/.next/server/app/api/providers/route.js +4 -4
  59. package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
  60. package/app/.next/server/app/api/providers/test-batch/route.js +5 -5
  61. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  62. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  63. package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
  64. package/app/.next/server/app/api/usage/[connectionId]/route.js +2 -2
  65. package/app/.next/server/app/api/usage/provider-limits/route.js +5 -5
  66. package/app/.next/server/app/api/usage/provider-limits/route.js.nft.json +1 -1
  67. package/app/.next/server/app/api/v1/models/route.js +4 -4
  68. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  69. package/app/.next/server/app/api/v1/route.js +4 -4
  70. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  71. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  72. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  73. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  74. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  75. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  76. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  77. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  78. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  79. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  81. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  82. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  83. package/app/.next/server/chunks/[root-of-the-server]__0.7zz6j._.js +1 -1
  84. package/app/.next/server/chunks/[root-of-the-server]__0.lz97q._.js +1 -1
  85. package/app/.next/server/chunks/[root-of-the-server]__0.m9_5-._.js +1 -1
  86. package/app/.next/server/chunks/[root-of-the-server]__00-bzx_._.js +1 -1
  87. package/app/.next/server/chunks/[root-of-the-server]__00hsd7k._.js +1 -1
  88. package/app/.next/server/chunks/[root-of-the-server]__00i_ryi._.js +1 -1
  89. package/app/.next/server/chunks/[root-of-the-server]__01fudn9._.js +1 -1
  90. package/app/.next/server/chunks/[root-of-the-server]__024slax._.js +1 -1
  91. package/app/.next/server/chunks/[root-of-the-server]__030_-af._.js +2 -2
  92. package/app/.next/server/chunks/[root-of-the-server]__03gl9dh._.js +2 -2
  93. package/app/.next/server/chunks/[root-of-the-server]__03x69ll._.js +1 -1
  94. package/app/.next/server/chunks/[root-of-the-server]__047np0t._.js +2 -2
  95. package/app/.next/server/chunks/[root-of-the-server]__04lc9.m._.js +2 -2
  96. package/app/.next/server/chunks/[root-of-the-server]__05u48b-._.js +1 -1
  97. package/app/.next/server/chunks/[root-of-the-server]__06dr~pl._.js +1 -1
  98. package/app/.next/server/chunks/[root-of-the-server]__06hr_sx._.js +1 -1
  99. package/app/.next/server/chunks/[root-of-the-server]__06r5eje._.js +2 -2
  100. package/app/.next/server/chunks/[root-of-the-server]__07.ui7z._.js +1 -1
  101. package/app/.next/server/chunks/[root-of-the-server]__075j.5s._.js +1 -1
  102. package/app/.next/server/chunks/[root-of-the-server]__07ju0wx._.js +1 -1
  103. package/app/.next/server/chunks/[root-of-the-server]__07wj.c4._.js +1 -1
  104. package/app/.next/server/chunks/[root-of-the-server]__08-9vz.._.js +1 -1
  105. package/app/.next/server/chunks/[root-of-the-server]__0908q-_._.js +1 -1
  106. package/app/.next/server/chunks/[root-of-the-server]__09blmoy._.js +1 -1
  107. package/app/.next/server/chunks/[root-of-the-server]__09c50mp._.js +1 -1
  108. package/app/.next/server/chunks/[root-of-the-server]__0a.3c_r._.js +1 -1
  109. package/app/.next/server/chunks/[root-of-the-server]__0bkx9sd._.js +1 -1
  110. package/app/.next/server/chunks/[root-of-the-server]__0c4v_hg._.js +2 -2
  111. package/app/.next/server/chunks/[root-of-the-server]__0c5t729._.js +1 -1
  112. package/app/.next/server/chunks/[root-of-the-server]__0cem6i6._.js +1 -1
  113. package/app/.next/server/chunks/[root-of-the-server]__0d-qyrk._.js +2 -2
  114. package/app/.next/server/chunks/[root-of-the-server]__0d-rd-n._.js +1 -1
  115. package/app/.next/server/chunks/[root-of-the-server]__0djfz6n._.js +1 -1
  116. package/app/.next/server/chunks/[root-of-the-server]__0dmb7bd._.js +1 -1
  117. package/app/.next/server/chunks/[root-of-the-server]__0e7dp.z._.js +2 -2
  118. package/app/.next/server/chunks/[root-of-the-server]__0el_v65._.js +1 -1
  119. package/app/.next/server/chunks/[root-of-the-server]__0enebbv._.js +2 -2
  120. package/app/.next/server/chunks/[root-of-the-server]__0enecpa._.js +1 -1
  121. package/app/.next/server/chunks/[root-of-the-server]__0eps0zu._.js +1 -1
  122. package/app/.next/server/chunks/[root-of-the-server]__0fbv0zh._.js +1 -1
  123. package/app/.next/server/chunks/[root-of-the-server]__0fmf-tk._.js +1 -1
  124. package/app/.next/server/chunks/[root-of-the-server]__0fw0v5q._.js +2 -2
  125. package/app/.next/server/chunks/[root-of-the-server]__0g0b9au._.js +1 -1
  126. package/app/.next/server/chunks/[root-of-the-server]__0gukblk._.js +1 -1
  127. package/app/.next/server/chunks/[root-of-the-server]__0h-q5l0._.js +1 -1
  128. package/app/.next/server/chunks/[root-of-the-server]__0h1fgwr._.js +1 -1
  129. package/app/.next/server/chunks/[root-of-the-server]__0h86b7i._.js +1 -1
  130. package/app/.next/server/chunks/[root-of-the-server]__0h~a5f1._.js +1 -1
  131. package/app/.next/server/chunks/[root-of-the-server]__0irqapk._.js +1 -1
  132. package/app/.next/server/chunks/[root-of-the-server]__0j0ez8_._.js +2 -2
  133. package/app/.next/server/chunks/[root-of-the-server]__0jacr87._.js +1 -1
  134. package/app/.next/server/chunks/[root-of-the-server]__0jnihz9._.js +1 -1
  135. package/app/.next/server/chunks/[root-of-the-server]__0jp3yj4._.js +1 -1
  136. package/app/.next/server/chunks/[root-of-the-server]__0llqbda._.js +2 -2
  137. package/app/.next/server/chunks/[root-of-the-server]__0m-356c._.js +1 -1
  138. package/app/.next/server/chunks/[root-of-the-server]__0mj7x5~._.js +8 -8
  139. package/app/.next/server/chunks/[root-of-the-server]__0mpnloa._.js +1 -1
  140. package/app/.next/server/chunks/[root-of-the-server]__0n-~kvf._.js +1 -1
  141. package/app/.next/server/chunks/[root-of-the-server]__0n.gjo8._.js +2 -2
  142. package/app/.next/server/chunks/[root-of-the-server]__0n0nara._.js +1 -1
  143. package/app/.next/server/chunks/[root-of-the-server]__0ncz8xj._.js +1 -1
  144. package/app/.next/server/chunks/[root-of-the-server]__0oph175._.js +1 -1
  145. package/app/.next/server/chunks/[root-of-the-server]__0p3a7_l._.js +1 -1
  146. package/app/.next/server/chunks/[root-of-the-server]__0pl_899._.js +1 -1
  147. package/app/.next/server/chunks/[root-of-the-server]__0prott7._.js +2 -2
  148. package/app/.next/server/chunks/[root-of-the-server]__0pwiejj._.js +1 -1
  149. package/app/.next/server/chunks/[root-of-the-server]__0pxqo8v._.js +1 -1
  150. package/app/.next/server/chunks/[root-of-the-server]__0q04t~4._.js +1 -1
  151. package/app/.next/server/chunks/[root-of-the-server]__0q9h_5u._.js +1 -1
  152. package/app/.next/server/chunks/[root-of-the-server]__0qaruz-._.js +1 -1
  153. package/app/.next/server/chunks/[root-of-the-server]__0qka2s7._.js +1 -1
  154. package/app/.next/server/chunks/[root-of-the-server]__0rnvi83._.js +1 -1
  155. package/app/.next/server/chunks/[root-of-the-server]__0rpwwig._.js +1 -1
  156. package/app/.next/server/chunks/[root-of-the-server]__0rs2ec_._.js +1 -1
  157. package/app/.next/server/chunks/[root-of-the-server]__0s1dq3.._.js +1 -1
  158. package/app/.next/server/chunks/[root-of-the-server]__0s1ya.l._.js +5 -5
  159. package/app/.next/server/chunks/[root-of-the-server]__0svm~lc._.js +1 -1
  160. package/app/.next/server/chunks/[root-of-the-server]__0t83olx._.js +1 -1
  161. package/app/.next/server/chunks/[root-of-the-server]__0tsl88m._.js +1 -1
  162. package/app/.next/server/chunks/[root-of-the-server]__0uctzvq._.js +1 -1
  163. package/app/.next/server/chunks/[root-of-the-server]__0vkqjj1._.js +2 -2
  164. package/app/.next/server/chunks/[root-of-the-server]__0vwq47l._.js +1 -1
  165. package/app/.next/server/chunks/[root-of-the-server]__0vx1juw._.js +1 -1
  166. package/app/.next/server/chunks/[root-of-the-server]__0vzvfbd._.js +2 -2
  167. package/app/.next/server/chunks/[root-of-the-server]__0w39cdo._.js +1 -1
  168. package/app/.next/server/chunks/[root-of-the-server]__0wc__c~._.js +1 -1
  169. package/app/.next/server/chunks/[root-of-the-server]__0y2h760._.js +1 -1
  170. package/app/.next/server/chunks/[root-of-the-server]__0y_c7uk._.js +2 -2
  171. package/app/.next/server/chunks/[root-of-the-server]__0~8fltv._.js +1 -1
  172. package/app/.next/server/chunks/[root-of-the-server]__0~dj8ev._.js +2 -2
  173. package/app/.next/server/chunks/[root-of-the-server]__10.x-iq._.js +4 -4
  174. package/app/.next/server/chunks/[root-of-the-server]__10e1a_z._.js +2 -2
  175. package/app/.next/server/chunks/[root-of-the-server]__10o_k-p._.js +2 -2
  176. package/app/.next/server/chunks/[root-of-the-server]__10smy7g._.js +1 -1
  177. package/app/.next/server/chunks/[root-of-the-server]__11wa4b~._.js +1 -1
  178. package/app/.next/server/chunks/[root-of-the-server]__11xpr8u._.js +1 -1
  179. package/app/.next/server/chunks/[root-of-the-server]__122-jdl._.js +8 -8
  180. package/app/.next/server/chunks/[root-of-the-server]__12e9-l1._.js +1 -1
  181. package/app/.next/server/chunks/[root-of-the-server]__12gh.g1._.js +1 -1
  182. package/app/.next/server/chunks/[root-of-the-server]__136nal9._.js +1 -1
  183. package/app/.next/server/chunks/[root-of-the-server]__13_i443._.js +1 -1
  184. package/app/.next/server/chunks/[root-of-the-server]__13c-d_4._.js +2 -2
  185. package/app/.next/server/chunks/_0-jnvci._.js +1 -1
  186. package/app/.next/server/chunks/_0-~thzo._.js +1 -1
  187. package/app/.next/server/chunks/_00.pgsp._.js +1 -1
  188. package/app/.next/server/chunks/_013gowh._.js +1 -1
  189. package/app/.next/server/chunks/{_03c-j3o._.js → _02~yzex._.js} +2 -2
  190. package/app/.next/server/chunks/_036lxbr._.js +1 -1
  191. package/app/.next/server/chunks/_05reh6o._.js +1 -1
  192. package/app/.next/server/chunks/_0a3.3sc._.js +1 -1
  193. package/app/.next/server/chunks/_0c.abwr._.js +1 -1
  194. package/app/.next/server/chunks/_0due8oe._.js +2 -2
  195. package/app/.next/server/chunks/_0h-j8c2._.js +1 -1
  196. package/app/.next/server/chunks/_0k43pd6._.js +3 -3
  197. package/app/.next/server/chunks/_0vx-r0i._.js +2 -2
  198. package/app/.next/server/chunks/_10.rw9f._.js +1 -1
  199. package/app/.next/server/chunks/_13mo7j5._.js +1 -1
  200. package/app/.next/server/chunks/src_0f_le~m._.js +1 -1
  201. package/app/.next/server/chunks/ssr/_008ht2n._.js +2 -2
  202. package/app/.next/server/chunks/ssr/_0oo1f90._.js +2 -2
  203. package/app/.next/server/chunks/ssr/_0~laquj._.js +1 -1
  204. package/app/.next/server/chunks/ssr/src_04gjot1._.js +1 -1
  205. package/app/.next/server/chunks/ssr/src_app_(dashboard)_dashboard_cache_04_vca6._.js +1 -1
  206. package/app/.next/server/chunks/ssr/{src_app_(dashboard)_dashboard_settings_0ni3aus._.js → src_app_(dashboard)_dashboard_settings_09gq48u._.js} +2 -2
  207. package/app/.next/server/chunks/ssr/src_i18n_messages_en_json_[json]_cjs_13rg.m2._.js +1 -1
  208. package/app/.next/server/chunks/ssr/src_i18n_messages_pt-BR_json_[json]_cjs_01n5fvn._.js +1 -1
  209. package/app/.next/server/chunks/ssr/src_i18n_messages_pt_json_[json]_cjs_0fwb8p.._.js +1 -1
  210. package/app/.next/server/chunks/ssr/src_shared_0jy4djq._.js +3 -0
  211. package/app/.next/server/chunks/ssr/src_shared_components_0v5o286._.js +3 -0
  212. package/app/.next/server/middleware-build-manifest.js +3 -3
  213. package/app/.next/server/pages/500.html +1 -1
  214. package/app/.next/server/server-reference-manifest.js +1 -1
  215. package/app/.next/server/server-reference-manifest.json +1 -1
  216. package/app/.next/static/chunks/{03~_6b5~n101_.js → 0.ap2gsi3d-1e.js} +1 -1
  217. package/app/.next/static/chunks/08iujr48xci8k.js +1 -0
  218. package/app/.next/static/chunks/{0up_y.7qkqwxz.js → 08n6n76lz~vt6.js} +1 -1
  219. package/app/.next/static/chunks/{060zmf~qn1q6y.js → 0f611s~575pn8.js} +1 -1
  220. package/app/.next/static/chunks/0y5kx9rgeb6~_.js +1 -0
  221. package/app/.next/static/chunks/13xz-222deqiy.js +1 -0
  222. package/app/CHANGELOG.md +18 -0
  223. package/app/docs/openapi.yaml +1 -1
  224. package/app/llm.txt +2 -2
  225. package/app/open-sse/handlers/chatCore.ts +2 -2
  226. package/app/open-sse/package.json +1 -1
  227. package/app/open-sse/translator/request/claude-to-gemini.ts +17 -0
  228. package/app/open-sse/translator/request/openai-to-gemini.ts +14 -3
  229. package/app/open-sse/utils/stream.ts +2 -2
  230. package/app/package-lock.json +3 -3
  231. package/app/package.json +1 -1
  232. package/app/src/app/(dashboard)/dashboard/cache/components/CacheTrends.tsx +19 -12
  233. package/app/src/app/(dashboard)/dashboard/cache/page.tsx +0 -3
  234. package/app/src/app/(dashboard)/dashboard/memory/page.tsx +20 -20
  235. package/app/src/i18n/messages/en.json +55 -1
  236. package/app/src/i18n/messages/pt-BR.json +53 -0
  237. package/app/src/i18n/messages/pt.json +54 -1
  238. package/app/src/shared/constants/providers.ts +40 -0
  239. package/app/src/shared/constants/sidebarVisibility.ts +6 -0
  240. package/app/src/shared/utils/circuitBreaker.ts +14 -4
  241. package/package.json +1 -1
  242. package/app/.next/server/chunks/ssr/src_05ekey-._.js +0 -3
  243. package/app/.next/server/chunks/ssr/src_100xxow._.js +0 -3
  244. package/app/.next/static/chunks/05tcrkqknq.20.js +0 -1
  245. package/app/.next/static/chunks/0eng4c9gz1s4..js +0 -1
  246. package/app/.next/static/chunks/0go~kwn1zgxnd.js +0 -1
  247. /package/app/.next/static/{Dbb1D6OoD7WlyZuPBm3L6 → ImZm5czz4prt8gnJPx7vv}/_buildManifest.js +0 -0
  248. /package/app/.next/static/{Dbb1D6OoD7WlyZuPBm3L6 → ImZm5czz4prt8gnJPx7vv}/_clientMiddlewareManifest.js +0 -0
  249. /package/app/.next/static/{Dbb1D6OoD7WlyZuPBm3L6 → ImZm5czz4prt8gnJPx7vv}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,628029,e=>{"use strict";var s=e.i(969353);e.s(["Badge",()=>s.default])},11131,e=>{"use strict";var s=e.i(629342);e.s(["EmptyState",()=>s.default])},565650,e=>{"use strict";e.i(342923),e.i(80173),e.i(907714),e.i(393718),e.i(703166),e.i(454149),e.i(822124),e.i(969353),e.i(635055),e.i(897844),e.i(450222),e.i(647829),e.i(6998),e.i(982131),e.i(116016),e.i(279743),e.i(193464),e.i(548036),e.i(566770),e.i(953789),e.i(8839),e.i(227404),e.i(621745),e.i(567955),e.i(17517),e.i(419947),e.i(323060),e.i(642440),e.i(629342),e.i(816062),e.i(690777),e.i(563201),e.i(115243),e.i(165149),e.i(359505),e.s([],565650)},11477,e=>{"use strict";var s=e.i(393718);e.s(["Card",()=>s.default])},474078,e=>{"use strict";var s=e.i(342923);e.s(["Button",()=>s.default])},339971,e=>{"use strict";var s=e.i(80173);e.s(["Input",()=>s.default])},87855,e=>{"use strict";var s=e.i(703166);e.s(["Modal",()=>s.default])},148943,e=>{"use strict";var s=e.i(635055);e.s(["Toggle",()=>s.default])},105370,e=>{"use strict";var s=e.i(8839);e.s(["ProxyConfigModal",()=>s.default])},516495,e=>{"use strict";e.s(["ROUTING_STRATEGIES",0,[{value:"priority",labelKey:"priority",combosDescKey:"priorityDesc",settingsDescKey:"priorityDesc",icon:"sort"},{value:"weighted",labelKey:"weighted",combosDescKey:"weightedDesc",settingsDescKey:"weightedDesc",icon:"percent"},{value:"round-robin",labelKey:"roundRobin",combosDescKey:"roundRobinDesc",settingsDescKey:"roundRobinDesc",icon:"autorenew"},{value:"fill-first",labelKey:"fillFirst",combosDescKey:"fillFirstDesc",settingsDescKey:"fillFirstDesc",icon:"vertical_align_top"},{value:"p2c",labelKey:"p2c",combosDescKey:"p2cDesc",settingsDescKey:"p2cDesc",icon:"balance"},{value:"random",labelKey:"random",combosDescKey:"randomDesc",settingsDescKey:"randomDesc",icon:"shuffle"},{value:"least-used",labelKey:"leastUsed",combosDescKey:"leastUsedDesc",settingsDescKey:"leastUsedDesc",icon:"low_priority"},{value:"cost-optimized",labelKey:"costOpt",combosDescKey:"costOptimizedDesc",settingsDescKey:"costOptDesc",icon:"savings"},{value:"strict-random",labelKey:"strictRandom",combosDescKey:"strictRandomDesc",settingsDescKey:"strictRandomDesc",icon:"casino"}],"SETTINGS_FALLBACK_STRATEGY_VALUES",0,["fill-first","round-robin","p2c","random","least-used","cost-optimized","strict-random"]])}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,565650,e=>{"use strict";e.i(342923),e.i(80173),e.i(907714),e.i(393718),e.i(703166),e.i(454149),e.i(822124),e.i(969353),e.i(635055),e.i(897844),e.i(450222),e.i(647829),e.i(6998),e.i(982131),e.i(116016),e.i(279743),e.i(193464),e.i(548036),e.i(566770),e.i(953789),e.i(8839),e.i(227404),e.i(621745),e.i(567955),e.i(17517),e.i(419947),e.i(323060),e.i(642440),e.i(629342),e.i(816062),e.i(690777),e.i(563201),e.i(115243),e.i(165149),e.i(359505),e.s([],565650)},11477,e=>{"use strict";var t=e.i(393718);e.s(["Card",()=>t.default])},474078,e=>{"use strict";var t=e.i(342923);e.s(["Button",()=>t.default])},339971,e=>{"use strict";var t=e.i(80173);e.s(["Input",()=>t.default])},961430,e=>{"use strict";var t=e.i(907714);e.s(["Select",()=>t.default])},628029,e=>{"use strict";var t=e.i(969353);e.s(["Badge",()=>t.default])},168903,e=>{"use strict";var t=e.i(843476),s=e.i(271645);e.i(565650);var i=e.i(11477),a=e.i(628029),l=e.i(474078),r=e.i(339971),c=e.i(961430),n=e.i(948148);e.s(["default",0,function(){let e=(0,n.useTranslations)("memory"),[d,o]=(0,s.useState)([]),[x,h]=(0,s.useState)({totalEntries:0,tokensUsed:0,hitRate:0}),[m,u]=(0,s.useState)("all"),[p,j]=(0,s.useState)(""),[f,v]=(0,s.useState)(!0);(0,s.useEffect)(()=>{y()},[]);let y=async()=>{try{let e=await fetch("/api/memory");if(e.ok){let t=await e.json();o(t.memories||[]),h(t.stats||{totalEntries:0,tokensUsed:0,hitRate:0})}}catch(e){console.error("Failed to fetch memories:",e)}finally{v(!1)}},N=async e=>{try{await fetch(`/api/memory/${e}`,{method:"DELETE"}),o(d.filter(t=>t.id!==e))}catch(e){console.error("Failed to delete memory:",e)}},g=d.filter(e=>{let t="all"===m||e.type===m,s=""===p||e.content.toLowerCase().includes(p.toLowerCase())||e.key.toLowerCase().includes(p.toLowerCase());return t&&s});return f?(0,t.jsx)("div",{className:"flex items-center justify-center h-64",children:(0,t.jsx)("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900"})}):(0,t.jsxs)("div",{className:"space-y-6 p-6",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("h1",{className:"text-2xl font-bold",children:e("title")}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(l.Button,{variant:"outline",onClick:()=>{let e=new Blob([JSON.stringify(d,null,2)],{type:"application/json"}),t=URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download=`memory-export-${new Date().toISOString()}.json`,s.click()},children:e("export")}),(0,t.jsx)(l.Button,{variant:"outline",children:e("import")}),(0,t.jsx)(l.Button,{children:e("addMemory")})]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[(0,t.jsx)(i.Card,{children:(0,t.jsxs)("div",{className:"p-4",children:[(0,t.jsx)("div",{className:"text-sm text-gray-500",children:e("totalEntries")}),(0,t.jsx)("div",{className:"text-2xl font-bold",children:x.totalEntries})]})}),(0,t.jsx)(i.Card,{children:(0,t.jsxs)("div",{className:"p-4",children:[(0,t.jsx)("div",{className:"text-sm text-gray-500",children:e("tokensUsed")}),(0,t.jsx)("div",{className:"text-2xl font-bold",children:x.tokensUsed.toLocaleString()})]})}),(0,t.jsx)(i.Card,{children:(0,t.jsxs)("div",{className:"p-4",children:[(0,t.jsx)("div",{className:"text-sm text-gray-500",children:e("hitRate")}),(0,t.jsxs)("div",{className:"text-2xl font-bold",children:[(100*x.hitRate).toFixed(1),"%"]})]})})]}),(0,t.jsx)(i.Card,{children:(0,t.jsxs)("div",{className:"p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:e("memories")}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(r.Input,{placeholder:e("search"),value:p,onChange:e=>j(e.target.value),className:"w-64"}),(0,t.jsxs)(c.Select,{value:m,onChange:e=>u(e.target.value),children:[(0,t.jsx)("option",{value:"all",children:e("allTypes")}),(0,t.jsx)("option",{value:"factual",children:e("factual")}),(0,t.jsx)("option",{value:"episodic",children:e("episodic")}),(0,t.jsx)("option",{value:"procedural",children:e("procedural")}),(0,t.jsx)("option",{value:"semantic",children:e("semantic")})]})]})]}),(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"w-full",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"border-b",children:[(0,t.jsx)("th",{className:"text-left py-2 px-4",children:e("type")}),(0,t.jsx)("th",{className:"text-left py-2 px-4",children:e("key")}),(0,t.jsx)("th",{className:"text-left py-2 px-4",children:e("content")}),(0,t.jsx)("th",{className:"text-left py-2 px-4",children:e("created")}),(0,t.jsx)("th",{className:"text-left py-2 px-4",children:e("actions")})]})}),(0,t.jsx)("tbody",{children:g.map(s=>(0,t.jsxs)("tr",{className:"border-b",children:[(0,t.jsx)("td",{className:"py-2 px-4",children:(0,t.jsx)(a.Badge,{variant:(e=>{switch(e){case"factual":return"info";case"episodic":return"success";case"procedural":return"warning";case"semantic":return"error";default:return"default"}})(s.type),children:s.type})}),(0,t.jsx)("td",{className:"py-2 px-4 font-medium",children:s.key}),(0,t.jsx)("td",{className:"py-2 px-4 max-w-md truncate",children:s.content}),(0,t.jsx)("td",{className:"py-2 px-4",children:new Date(s.createdAt).toLocaleDateString()}),(0,t.jsx)("td",{className:"py-2 px-4",children:(0,t.jsx)(l.Button,{variant:"ghost",size:"sm",onClick:()=>N(s.id),children:e("delete")})})]},s.id))})]})})]})})]})}])}]);
package/app/CHANGELOG.md CHANGED
@@ -4,6 +4,24 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## [3.4.6] - 2026-04-02
8
+
9
+ ### ✨ New Features
10
+
11
+ - **Providers:** Registered new image, video, and audio generation providers from the community-requested list (#926).
12
+ - **Dashboard UI:** Added standalone sidebar navigation for the new Memory and Skills modules (#926).
13
+ - **i18n:** Added translation strings and layout mappings across 30 languages for the Memory and Skills namespaces.
14
+
15
+ ### 🐛 Bug Fixes
16
+
17
+ - **Resilience:** Prevented the proxy Circuit Breaker from becoming stuck in an OPEN state indefinitely by handling direct transitions to CLOSED state inside fallback combo paths (#930).
18
+ - **Protocol Translation:** Patched the streaming transformer to sanitize response blocks based on the expected _source_ protocol rather than the provider _target_ protocol, fixing Anthropics models wrapped in OpenAI payloads crashing Claude Code (#929).
19
+ - **API Specs & Gemini:** Fixed `thought_signature` parsing in `openai-to-gemini` and `claude-to-gemini` translators, preventing HTTP 400 errors across all Gemini 3 API tool-calls.
20
+ - **Providers:** Cleaned up non-OpenAI-compatible endpoints preventing valid upstream connections (#926).
21
+ - **Cache Trends:** Fixed an invalid property mapping data mismatch causing Cache Trends UI charts to crash, and extracted redundant cache metric widgets (#926).
22
+
23
+ ---
24
+
7
25
  ## [3.4.5] - 2026-04-02
8
26
 
9
27
  ### ✨ New Features
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OmniRoute API
4
- version: 3.4.5
4
+ version: 3.4.6
5
5
  description: |
6
6
  OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible
7
7
  endpoint that routes requests to multiple AI providers with load balancing,
package/app/llm.txt CHANGED
@@ -8,7 +8,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
8
8
 
9
9
  **Key value:** One endpoint (`http://localhost:20128/v1`), unlimited models, zero downtime, minimal cost.
10
10
 
11
- **Current version:** 3.4.5
11
+ **Current version:** 3.4.6
12
12
 
13
13
  ## Tech Stack
14
14
 
@@ -277,7 +277,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
277
277
  └── .env.example # Environment variable template
278
278
  ```
279
279
 
280
- ## Key Features (v3.4.5)
280
+ ## Key Features (v3.4.6)
281
281
 
282
282
  ### Core Proxy
283
283
  - **60+ AI providers** with automatic format translation
@@ -1776,8 +1776,8 @@ export async function handleChatCore({
1776
1776
  // Sanitize response for OpenAI SDK compatibility
1777
1777
  // Strips non-standard fields (x_groq, usage_breakdown, service_tier, etc.)
1778
1778
  // Extracts <think> and <thinking> tags into reasoning_content
1779
- // Target format determines output shape. If we are outputting OpenAI shape or pseudo-OpenAI shape, sanitize.
1780
- if (targetFormat === FORMATS.OPENAI || targetFormat === FORMATS.OPENAI_RESPONSES) {
1779
+ // Source format determines output shape. If we are outputting OpenAI shape or pseudo-OpenAI shape, sanitize.
1780
+ if (sourceFormat === FORMATS.OPENAI || sourceFormat === FORMATS.OPENAI_RESPONSES) {
1781
1781
  translatedResponse = sanitizeOpenAIResponse(translatedResponse);
1782
1782
  }
1783
1783
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omniroute/open-sse",
3
- "version": "3.4.5",
3
+ "version": "3.4.6",
4
4
  "description": "Express SSE sidecar for OmniRoute — handles streaming, protocol translation, and provider orchestration",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -147,6 +147,23 @@ export function claudeToGeminiRequest(model, body, stream) {
147
147
  if (parts.length > 0) {
148
148
  // Map Claude roles to Gemini roles
149
149
  const geminiRole = msg.role === "assistant" ? "model" : "user";
150
+
151
+ // Gemini 3+ requires thoughtSignature as a sibling part in model content
152
+ // that contains functionCall parts. Inject if not already present from
153
+ // a thinking block. (#927)
154
+ if (geminiRole === "model") {
155
+ const hasFunctionCall = parts.some((p) => p.functionCall);
156
+ const hasSignature = parts.some((p) => p.thoughtSignature);
157
+ if (hasFunctionCall && !hasSignature) {
158
+ // Insert before the first functionCall part
159
+ const fcIndex = parts.findIndex((p) => p.functionCall);
160
+ parts.splice(fcIndex, 0, {
161
+ thoughtSignature: DEFAULT_THINKING_GEMINI_SIGNATURE,
162
+ text: "",
163
+ });
164
+ }
165
+ }
166
+
150
167
  result.contents.push({ role: geminiRole, parts });
151
168
  }
152
169
  }
@@ -168,14 +168,25 @@ function openaiToGeminiBase(model, body, stream) {
168
168
  }
169
169
 
170
170
  if (msg.tool_calls && Array.isArray(msg.tool_calls)) {
171
+ // Gemini 3+ requires thoughtSignature as a sibling part in model content
172
+ // that contains functionCall parts. If no reasoning_content was present
173
+ // (which already injects the signature above), inject one now. (#927)
174
+ const hasSignatureAlready = parts.some((p) => p.thoughtSignature);
175
+ if (!hasSignatureAlready) {
176
+ parts.push({
177
+ thoughtSignature: DEFAULT_THINKING_GEMINI_SIGNATURE,
178
+ text: "",
179
+ });
180
+ }
181
+
171
182
  const toolCallIds = [];
172
183
  for (const tc of msg.tool_calls) {
173
184
  if (tc.type !== "function") continue;
174
185
 
175
186
  const args = tryParseJSON(tc.function?.arguments || "{}");
176
- // Do NOT include thoughtSignature on functionCall parts — it is only valid
177
- // on thinking/reasoning parts and causes HTTP 400 "invalid argument" from the
178
- // Gemini API when present on a functionCall part (#725).
187
+ // Do NOT include thoughtSignature ON the functionCall part itself — it is
188
+ // only valid as a separate sibling part. Including it inside functionCall
189
+ // causes HTTP 400 "invalid argument" (#725).
179
190
  parts.push({
180
191
  functionCall: {
181
192
  id: tc.id,
@@ -585,9 +585,9 @@ export function createSSEStream(options: StreamOptions = {}) {
585
585
  // Content for call log is accumulated only from parsed (above) to avoid double-counting;
586
586
  // do not add again from item here.
587
587
 
588
- // #723, #727: Sanitize intermediate stream chunks if target is OpenAI format loop
588
+ // #723, #727: Sanitize intermediate stream chunks if source (client) is OpenAI format
589
589
  let itemSanitized: Record<string, unknown> = item;
590
- if (targetFormat === FORMATS.OPENAI || targetFormat === FORMATS.OPENAI_RESPONSES) {
590
+ if (sourceFormat === FORMATS.OPENAI || sourceFormat === FORMATS.OPENAI_RESPONSES) {
591
591
  itemSanitized = sanitizeStreamingChunk(itemSanitized) as Record<string, unknown>;
592
592
 
593
593
  // Extract reasoning tags from content if translation generated them
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.4.5",
3
+ "version": "3.4.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omniroute",
9
- "version": "3.4.5",
9
+ "version": "3.4.6",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
@@ -20886,7 +20886,7 @@
20886
20886
  },
20887
20887
  "open-sse": {
20888
20888
  "name": "@omniroute/open-sse",
20889
- "version": "3.4.5"
20889
+ "version": "3.4.6"
20890
20890
  }
20891
20891
  }
20892
20892
  }
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.4.5",
3
+ "version": "3.4.6",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,9 +5,10 @@ import { useTranslations } from "next-intl";
5
5
  export interface CacheTrendPoint {
6
6
  timestamp: string;
7
7
  requests: number;
8
- hits: number;
9
- misses: number;
10
- hitRate: number;
8
+ cachedRequests: number;
9
+ inputTokens: number;
10
+ cachedTokens: number;
11
+ cacheCreationTokens: number;
11
12
  }
12
13
 
13
14
  interface CacheTrendsProps {
@@ -27,7 +28,8 @@ export default function CacheTrends({
27
28
 
28
29
  const trendData: CacheTrendPoint[] = data ?? [];
29
30
  const maxRequests = trendData.length > 0 ? Math.max(...trendData.map((p) => p.requests), 1) : 1;
30
- const peakHitRate = trendData.length > 0 ? Math.max(...trendData.map((p) => p.hitRate)) : null;
31
+ const maxCachedRequests =
32
+ trendData.length > 0 ? Math.max(...trendData.map((p) => p.cachedRequests), 0) : 0;
31
33
 
32
34
  return (
33
35
  <div
@@ -69,17 +71,21 @@ export default function CacheTrends({
69
71
  </div>
70
72
  ) : (
71
73
  <>
72
- {peakHitRate !== null && (
74
+ {maxCachedRequests > 0 && (
73
75
  <div className="text-xs text-text-muted">
74
- Peak hit rate:{" "}
75
- <span className="font-medium text-foreground">{peakHitRate.toFixed(1)}</span>
76
+ {t("peakCached")}:{" "}
77
+ <span className="font-medium text-foreground">
78
+ {maxCachedRequests} / {maxRequests}
79
+ </span>
76
80
  </div>
77
81
  )}
78
82
  <div className="flex items-end gap-1 h-32">
79
83
  {trendData.map((point) => {
80
84
  const height = Math.max(4, (point.requests / maxRequests) * 100);
81
- const hitHeight =
82
- point.requests > 0 ? Math.max(2, (point.hits / point.requests) * height) : 0;
85
+ const cachedHeight =
86
+ point.requests > 0
87
+ ? Math.max(2, (point.cachedRequests / point.requests) * height)
88
+ : 0;
83
89
  const hour = new Date(point.timestamp).toLocaleTimeString([], {
84
90
  hour: "2-digit",
85
91
  minute: "2-digit",
@@ -92,16 +98,17 @@ export default function CacheTrends({
92
98
  className="flex-1 flex flex-col items-center gap-1 group relative"
93
99
  >
94
100
  <div className="absolute bottom-full mb-1 hidden group-hover:block bg-surface-raised border border-border rounded px-2 py-1 text-xs whitespace-nowrap z-10">
95
- {hour}: {point.requests} requests, {point.hits} cached
101
+ {hour}: {point.requests} {t("requests").toLowerCase()}, {point.cachedRequests}{" "}
102
+ {t("cached").toLowerCase()}
96
103
  </div>
97
104
  <div className="w-full flex flex-col justify-end h-full gap-px">
98
105
  <div
99
106
  className="w-full bg-green-500/30 rounded-t"
100
- style={{ height: `${hitHeight}%` }}
107
+ style={{ height: `${cachedHeight}%` }}
101
108
  />
102
109
  <div
103
110
  className="w-full bg-text-muted/20 rounded-t"
104
- style={{ height: `${height - hitHeight}%` }}
111
+ style={{ height: `${height - cachedHeight}%` }}
105
112
  />
106
113
  </div>
107
114
  <span className="text-[10px] text-text-muted truncate w-full text-center">
@@ -435,9 +435,6 @@ export default function CachePage() {
435
435
  </Card>
436
436
  )}
437
437
 
438
- {/* Prompt Cache Metrics (cumulative with reset) */}
439
- <CacheStatsCard />
440
-
441
438
  {/* Cache Trend (24h) */}
442
439
  {trend.length > 0 && (
443
440
  <Card>
@@ -108,32 +108,32 @@ export default function MemoryPage() {
108
108
  return (
109
109
  <div className="space-y-6 p-6">
110
110
  <div className="flex items-center justify-between">
111
- <h1 className="text-2xl font-bold">Memory Management</h1>
111
+ <h1 className="text-2xl font-bold">{t("title")}</h1>
112
112
  <div className="flex gap-2">
113
113
  <Button variant="outline" onClick={handleExport}>
114
- Export
114
+ {t("export")}
115
115
  </Button>
116
- <Button variant="outline">Import</Button>
117
- <Button>Add Memory</Button>
116
+ <Button variant="outline">{t("import")}</Button>
117
+ <Button>{t("addMemory")}</Button>
118
118
  </div>
119
119
  </div>
120
120
 
121
121
  <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
122
122
  <Card>
123
123
  <div className="p-4">
124
- <div className="text-sm text-gray-500">Total Entries</div>
124
+ <div className="text-sm text-gray-500">{t("totalEntries")}</div>
125
125
  <div className="text-2xl font-bold">{stats.totalEntries}</div>
126
126
  </div>
127
127
  </Card>
128
128
  <Card>
129
129
  <div className="p-4">
130
- <div className="text-sm text-gray-500">Tokens Used</div>
130
+ <div className="text-sm text-gray-500">{t("tokensUsed")}</div>
131
131
  <div className="text-2xl font-bold">{stats.tokensUsed.toLocaleString()}</div>
132
132
  </div>
133
133
  </Card>
134
134
  <Card>
135
135
  <div className="p-4">
136
- <div className="text-sm text-gray-500">Hit Rate</div>
136
+ <div className="text-sm text-gray-500">{t("hitRate")}</div>
137
137
  <div className="text-2xl font-bold">{(stats.hitRate * 100).toFixed(1)}%</div>
138
138
  </div>
139
139
  </Card>
@@ -142,20 +142,20 @@ export default function MemoryPage() {
142
142
  <Card>
143
143
  <div className="p-4">
144
144
  <div className="flex items-center justify-between mb-4">
145
- <h2 className="text-lg font-semibold">Memories</h2>
145
+ <h2 className="text-lg font-semibold">{t("memories")}</h2>
146
146
  <div className="flex gap-2">
147
147
  <Input
148
- placeholder="Search memories..."
148
+ placeholder={t("search")}
149
149
  value={searchQuery}
150
150
  onChange={(e) => setSearchQuery(e.target.value)}
151
151
  className="w-64"
152
152
  />
153
153
  <Select value={filterType} onChange={(e) => setFilterType(e.target.value)}>
154
- <option value="all">All Types</option>
155
- <option value="factual">Factual</option>
156
- <option value="episodic">Episodic</option>
157
- <option value="procedural">Procedural</option>
158
- <option value="semantic">Semantic</option>
154
+ <option value="all">{t("allTypes")}</option>
155
+ <option value="factual">{t("factual")}</option>
156
+ <option value="episodic">{t("episodic")}</option>
157
+ <option value="procedural">{t("procedural")}</option>
158
+ <option value="semantic">{t("semantic")}</option>
159
159
  </Select>
160
160
  </div>
161
161
  </div>
@@ -164,11 +164,11 @@ export default function MemoryPage() {
164
164
  <table className="w-full">
165
165
  <thead>
166
166
  <tr className="border-b">
167
- <th className="text-left py-2 px-4">Type</th>
168
- <th className="text-left py-2 px-4">Key</th>
169
- <th className="text-left py-2 px-4">Content</th>
170
- <th className="text-left py-2 px-4">Created</th>
171
- <th className="text-left py-2 px-4">Actions</th>
167
+ <th className="text-left py-2 px-4">{t("type")}</th>
168
+ <th className="text-left py-2 px-4">{t("key")}</th>
169
+ <th className="text-left py-2 px-4">{t("content")}</th>
170
+ <th className="text-left py-2 px-4">{t("created")}</th>
171
+ <th className="text-left py-2 px-4">{t("actions")}</th>
172
172
  </tr>
173
173
  </thead>
174
174
  <tbody>
@@ -182,7 +182,7 @@ export default function MemoryPage() {
182
182
  <td className="py-2 px-4">{new Date(memory.createdAt).toLocaleDateString()}</td>
183
183
  <td className="py-2 px-4">
184
184
  <Button variant="ghost" size="sm" onClick={() => handleDelete(memory.id)}>
185
- Delete
185
+ {t("delete")}
186
186
  </Button>
187
187
  </td>
188
188
  </tr>
@@ -156,6 +156,8 @@
156
156
  "playground": "Playground",
157
157
  "searchTools": "Search Tools",
158
158
  "agents": "Agents",
159
+ "memory": "Memory",
160
+ "skills": "Skills",
159
161
  "docs": "Docs",
160
162
  "issues": "Issues",
161
163
  "endpoints": "Endpoints",
@@ -1266,6 +1268,57 @@
1266
1268
  "events": "Events",
1267
1269
  "artifacts": "Artifacts"
1268
1270
  },
1271
+ "memory": {
1272
+ "title": "Memory Management",
1273
+ "description": "View and manage stored memory entries",
1274
+ "memories": "Memories",
1275
+ "totalEntries": "Total Entries",
1276
+ "tokensUsed": "Tokens Used",
1277
+ "hitRate": "Hit Rate",
1278
+ "loading": "Loading memories...",
1279
+ "noMemories": "No memories found",
1280
+ "search": "Search memories...",
1281
+ "allTypes": "All Types",
1282
+ "export": "Export",
1283
+ "import": "Import",
1284
+ "addMemory": "Add Memory",
1285
+ "type": "Type",
1286
+ "key": "Key",
1287
+ "content": "Content",
1288
+ "created": "Created",
1289
+ "actions": "Actions",
1290
+ "factual": "Factual",
1291
+ "episodic": "Episodic",
1292
+ "procedural": "Procedural",
1293
+ "semantic": "Semantic"
1294
+ },
1295
+ "skills": {
1296
+ "title": "Skills",
1297
+ "description": "Manage and monitor AI skills",
1298
+ "skillsTab": "Skills",
1299
+ "executionsTab": "Executions",
1300
+ "sandboxTab": "Sandbox",
1301
+ "loading": "Loading skills...",
1302
+ "noSkills": "No skills found",
1303
+ "noExecutions": "No executions found",
1304
+ "enabled": "Enabled",
1305
+ "disabled": "Disabled",
1306
+ "version": "Version",
1307
+ "tableDescription": "Description",
1308
+ "skill": "Skill",
1309
+ "status": "Status",
1310
+ "duration": "Duration",
1311
+ "time": "Time",
1312
+ "sandboxConfig": "Sandbox Configuration",
1313
+ "cpuLimit": "CPU Limit",
1314
+ "cpuLimitDesc": "Maximum execution time per skill",
1315
+ "memoryLimit": "Memory Limit",
1316
+ "memoryLimitDesc": "Maximum memory allocation",
1317
+ "timeout": "Timeout",
1318
+ "timeoutDesc": "Maximum wait time for response",
1319
+ "networkAccess": "Network Access",
1320
+ "networkAccessDesc": "Allow outbound network requests"
1321
+ },
1269
1322
  "health": {
1270
1323
  "title": "System Health",
1271
1324
  "description": "Real-time monitoring of your OmniRoute instance",
@@ -3015,6 +3068,7 @@
3015
3068
  "cachedTokensCol": "Cached",
3016
3069
  "cacheCreation": "Creation",
3017
3070
  "trend24h": "Cache Trend (24h)",
3071
+ "peakCached": "Peak cached",
3018
3072
  "cached": "Cached",
3019
3073
  "overview": "Overview",
3020
3074
  "entries": "Entries",
@@ -3028,4 +3082,4 @@
3028
3082
  "expires": "Expires",
3029
3083
  "actions": "Actions"
3030
3084
  }
3031
- }
3085
+ }
@@ -156,6 +156,8 @@
156
156
  "playground": "Playground",
157
157
  "searchTools": "Search Tools",
158
158
  "agents": "Agentes",
159
+ "memory": "Memória",
160
+ "skills": "Habilidades",
159
161
  "docs": "Documentação",
160
162
  "issues": "Problemas",
161
163
  "endpoints": "Endpoints",
@@ -1266,6 +1268,57 @@
1266
1268
  "events": "Eventos",
1267
1269
  "artifacts": "Artefatos"
1268
1270
  },
1271
+ "memory": {
1272
+ "title": "Gerenciamento de Memória",
1273
+ "description": "Visualize e gerencie entradas de memória armazenadas",
1274
+ "memories": "Memórias",
1275
+ "totalEntries": "Total de Entradas",
1276
+ "tokensUsed": "Tokens Usados",
1277
+ "hitRate": "Taxa de Acerto",
1278
+ "loading": "Carregando memórias...",
1279
+ "noMemories": "Nenhuma memória encontrada",
1280
+ "search": "Buscar memórias...",
1281
+ "allTypes": "Todos os Tipos",
1282
+ "export": "Exportar",
1283
+ "import": "Importar",
1284
+ "addMemory": "Adicionar Memória",
1285
+ "type": "Tipo",
1286
+ "key": "Chave",
1287
+ "content": "Conteúdo",
1288
+ "created": "Criado",
1289
+ "actions": "Ações",
1290
+ "factual": "Factual",
1291
+ "episodic": "Episódica",
1292
+ "procedural": "Procedural",
1293
+ "semantic": "Semântica"
1294
+ },
1295
+ "skills": {
1296
+ "title": "Skills",
1297
+ "description": "Gerencie e monitore skills de IA",
1298
+ "skillsTab": "Skills",
1299
+ "executionsTab": "Execuções",
1300
+ "sandboxTab": "Sandbox",
1301
+ "loading": "Carregando skills...",
1302
+ "noSkills": "Nenhuma skill encontrada",
1303
+ "noExecutions": "Nenhuma execução encontrada",
1304
+ "enabled": "Ativado",
1305
+ "disabled": "Desativado",
1306
+ "version": "Versão",
1307
+ "tableDescription": "Descrição",
1308
+ "skill": "Skill",
1309
+ "status": "Status",
1310
+ "duration": "Duração",
1311
+ "time": "Tempo",
1312
+ "sandboxConfig": "Configuração da Sandbox",
1313
+ "cpuLimit": "Limite de CPU",
1314
+ "cpuLimitDesc": "Tempo máximo de execução por skill",
1315
+ "memoryLimit": "Limite de Memória",
1316
+ "memoryLimitDesc": "Alocação máxima de memória",
1317
+ "timeout": "Timeout",
1318
+ "timeoutDesc": "Tempo máximo de espera por resposta",
1319
+ "networkAccess": "Acesso à Rede",
1320
+ "networkAccessDesc": "Permitir requisições de rede de saída"
1321
+ },
1269
1322
  "health": {
1270
1323
  "title": "Saúde do Sistema",
1271
1324
  "description": "Monitoramento em tempo real da sua instância OmniRoute",
@@ -156,6 +156,8 @@
156
156
  "playground": "Playground",
157
157
  "searchTools": "Search Tools",
158
158
  "agents": "Agentes",
159
+ "memory": "Memória",
160
+ "skills": "Habilidades",
159
161
  "docs": "Documentos",
160
162
  "issues": "Problemas",
161
163
  "endpoints": "Endpoints",
@@ -1264,7 +1266,58 @@
1264
1266
  "close": "Close",
1265
1267
  "metadata": "Metadata",
1266
1268
  "events": "Events",
1267
- "artifacts": "Artifacts"
1269
+ "artifacts": "Artefatos"
1270
+ },
1271
+ "memory": {
1272
+ "title": "Gerenciamento de Memória",
1273
+ "description": "Visualize e gerencie entradas de memória armazenadas",
1274
+ "memories": "Memórias",
1275
+ "totalEntries": "Total de Entradas",
1276
+ "tokensUsed": "Tokens Usados",
1277
+ "hitRate": "Taxa de Acerto",
1278
+ "loading": "Carregando memórias...",
1279
+ "noMemories": "Nenhuma memória encontrada",
1280
+ "search": "Buscar memórias...",
1281
+ "allTypes": "Todos os Tipos",
1282
+ "export": "Exportar",
1283
+ "import": "Importar",
1284
+ "addMemory": "Adicionar Memória",
1285
+ "type": "Tipo",
1286
+ "key": "Chave",
1287
+ "content": "Conteúdo",
1288
+ "created": "Criado",
1289
+ "actions": "Ações",
1290
+ "factual": "Factual",
1291
+ "episodic": "Episódica",
1292
+ "procedural": "Procedural",
1293
+ "semantic": "Semântica"
1294
+ },
1295
+ "skills": {
1296
+ "title": "Skills",
1297
+ "description": "Gerencie e monitore skills de IA",
1298
+ "skillsTab": "Skills",
1299
+ "executionsTab": "Execuções",
1300
+ "sandboxTab": "Sandbox",
1301
+ "loading": "Carregando skills...",
1302
+ "noSkills": "Nenhuma skill encontrada",
1303
+ "noExecutions": "Nenhuma execução encontrada",
1304
+ "enabled": "Ativado",
1305
+ "disabled": "Desativado",
1306
+ "version": "Versão",
1307
+ "tableDescription": "Descrição",
1308
+ "skill": "Skill",
1309
+ "status": "Status",
1310
+ "duration": "Duração",
1311
+ "time": "Tempo",
1312
+ "sandboxConfig": "Configuração da Sandbox",
1313
+ "cpuLimit": "Limite de CPU",
1314
+ "cpuLimitDesc": "Tempo máximo de execução por skill",
1315
+ "memoryLimit": "Limite de Memória",
1316
+ "memoryLimitDesc": "Alocação máxima de memória",
1317
+ "timeout": "Timeout",
1318
+ "timeoutDesc": "Tempo máximo de espera por resposta",
1319
+ "networkAccess": "Acesso à Rede",
1320
+ "networkAccessDesc": "Permitir requisições de rede de saída"
1268
1321
  },
1269
1322
  "health": {
1270
1323
  "title": "Saúde do sistema",
@@ -603,6 +603,46 @@ export const APIKEY_PROVIDERS = {
603
603
  "$0.025/day free credits — 200+ models (GPT-4o, Claude, Gemini, Llama) via single endpoint",
604
604
  passthroughModels: true,
605
605
  },
606
+ novita: {
607
+ id: "novita",
608
+ alias: "novita",
609
+ name: "Novita AI",
610
+ icon: "auto_awesome",
611
+ color: "#FF4081",
612
+ textIcon: "NV",
613
+ website: "https://novita.ai",
614
+ passthroughModels: true,
615
+ },
616
+ piapi: {
617
+ id: "piapi",
618
+ alias: "pi",
619
+ name: "PiAPI",
620
+ icon: "api",
621
+ color: "#7C4DFF",
622
+ textIcon: "PI",
623
+ website: "https://piapi.ai",
624
+ passthroughModels: true,
625
+ },
626
+ getgoapi: {
627
+ id: "getgoapi",
628
+ alias: "ggo",
629
+ name: "GoAPI",
630
+ icon: "rocket_launch",
631
+ color: "#FF6D00",
632
+ textIcon: "GO",
633
+ website: "https://api.getgoapi.com",
634
+ passthroughModels: true,
635
+ },
636
+ laozhang: {
637
+ id: "laozhang",
638
+ alias: "lz",
639
+ name: "LaoZhang AI",
640
+ icon: "hub",
641
+ color: "#FF1744",
642
+ textIcon: "LZ",
643
+ website: "https://api.laozhang.ai",
644
+ passthroughModels: true,
645
+ },
606
646
  };
607
647
 
608
648
  export const OPENAI_COMPATIBLE_PREFIX = "openai-compatible-";