@jheavenknows/bluerouter 5.4.2 → 5.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +9 -9
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page_client-reference-manifest.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  52. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  54. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  55. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  56. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  57. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  58. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  60. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  61. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  62. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  63. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  64. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js +1 -1
  111. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  130. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  132. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  170. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  189. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  226. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  228. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  230. package/app/.next-cli-build/server/app/callback.html +1 -1
  231. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  232. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  233. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  234. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  235. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  236. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  237. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  238. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  239. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  240. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  241. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  242. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  243. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  244. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  246. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  247. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  248. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  249. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  250. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  251. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +7 -7
  252. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +7 -7
  253. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +7 -7
  254. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  256. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  257. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  258. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  259. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  262. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  263. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  264. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  266. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  267. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  268. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  269. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  272. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  273. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  274. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +6 -6
  277. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +6 -6
  278. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +6 -6
  279. package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
  281. package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
  282. package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +6 -6
  283. package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
  284. package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  287. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  288. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  289. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  291. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  292. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  293. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  294. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
  297. package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +7 -7
  298. package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
  299. package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  301. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  302. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  303. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  304. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  307. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  308. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  309. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  311. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  312. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  313. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  314. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  317. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  318. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  319. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
  321. package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
  322. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +7 -7
  323. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
  324. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
  327. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +7 -7
  328. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
  329. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  331. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  333. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  334. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  337. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  338. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  339. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  341. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  342. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  343. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  344. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +6 -6
  347. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +6 -6
  348. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
  349. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/routing-topology.html +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/routing-topology.rsc +7 -7
  352. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology/__PAGE__.segment.rsc +7 -7
  353. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_full.segment.rsc +7 -7
  354. package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_tree.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  357. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  358. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  359. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  362. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  363. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  364. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  367. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  368. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  369. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  372. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  373. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  374. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  377. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  378. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  379. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  381. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  382. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  383. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  384. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/index.html +1 -1
  386. package/app/.next-cli-build/server/app/index.rsc +5 -5
  387. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  388. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  389. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  391. package/app/.next-cli-build/server/app/landing.html +1 -1
  392. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  393. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  394. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  395. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  396. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  397. package/app/.next-cli-build/server/app/login.html +1 -1
  398. package/app/.next-cli-build/server/app/login.rsc +6 -6
  399. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  400. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  402. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  403. package/app/.next-cli-build/server/app-paths-manifest.json +9 -9
  404. package/app/.next-cli-build/server/chunks/3399.js +1 -1
  405. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  406. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  407. package/app/.next-cli-build/server/chunks/6992.js +1 -1
  408. package/app/.next-cli-build/server/chunks/9434.js +1 -1
  409. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  410. package/app/.next-cli-build/server/pages/404.html +1 -1
  411. package/app/.next-cli-build/server/pages/500.html +1 -1
  412. package/app/.next-cli-build/static/chunks/{5263-880b83571dc88427.js → 5263-5e205412cc7c5cc5.js} +1 -1
  413. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/routing-topology/page-9c3843549aadfa60.js +1 -0
  414. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  415. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  416. package/app/package.json +1 -1
  417. package/package.json +1 -1
  418. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/routing-topology/page-5e0ce0de52dcc940.js +0 -1
  419. /package/app/.next-cli-build/static/{5Fp4_XJ3FoeJrP4zmMlRv → qO0o75GBaTmzRwkeHGVeM}/_buildManifest.js +0 -0
  420. /package/app/.next-cli-build/static/{5Fp4_XJ3FoeJrP4zmMlRv → qO0o75GBaTmzRwkeHGVeM}/_ssgManifest.js +0 -0
  421. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.84-to-5.3.85-5.3.85-20260823-213631 → upgrade-5.4.0-to-5.4.1-5.4.1-20260823-225230}/data.sqlite +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"5Fp4_XJ3FoeJrP4zmMlRv\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"qO0o75GBaTmzRwkeHGVeM\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5263],{28777:(e,i,a)=>{a.d(i,{KC:()=>t.KC,Xg:()=>t.Xg});var t=a(45564);Object.entries(a(52679).Q2).filter(([,e])=>e.passthroughModels).map(([e])=>e),Object.entries(t.vq).flatMap(([e,i])=>i.map(i=>({provider:e,model:i.id,name:i.name})))},44656:(e,i,a)=>{a.d(i,{BrandingProvider:()=>m,notifyBrandingChanged:()=>d,useBranding:()=>p});var t=a(95155),o=a(12115),s=a(14051),n=a.n(s);let r={siteTitle:"",siteShortName:"",siteDescription:"",logoUrl:null,faviconUrl:null,logoMime:null,faviconMime:null,hasLogo:!1,hasFavicon:!1},c=(0,o.createContext)({...r,loading:!0,refresh:async()=>{}}),l="bluerouter:branding-updated";function d(){window.dispatchEvent(new CustomEvent(l))}function m({initialBranding:e,children:i}){let[a,s]=(0,o.useState)(e||r),[n,d]=(0,o.useState)(!e),p=(0,o.useCallback)(async()=>{try{let e=await fetch("/api/branding",{cache:"no-store"});if(!e.ok)return;let i=await e.json();s({...r,...i})}catch{}finally{d(!1)}},[]);(0,o.useEffect)(()=>{p()},[p]),(0,o.useEffect)(()=>{let e=()=>p();return window.addEventListener(l,e),()=>window.removeEventListener(l,e)},[p]);let h=(0,o.useMemo)(()=>({...a,loading:n,refresh:p}),[a,n,p]);return(0,t.jsx)(c.Provider,{value:h,children:i})}function p(){return(0,o.useContext)(c)}m.propTypes={initialBranding:n().object,children:n().node}},52679:(e,i,a)=>{a.d(i,{DI:()=>h,IS:()=>o,JH:()=>p,MA:()=>T,Ox:()=>x,Q2:()=>k,U_:()=>w,_8:()=>b,br:()=>d,fg:()=>l,gC:()=>f,gb:()=>v,hb:()=>g,mq:()=>y,nJ:()=>s,o5:()=>I,rj:()=>m,rs:()=>M,s9:()=>n,wG:()=>U,wb:()=>K,zN:()=>c,zt:()=>C});let t="⚠️ Lưu \xfd: Mỗi t\xe0i khoản OAuth chỉ n\xean d\xf9ng cho một user. Kh\xf4ng chia sẻ OAuth account cho nhiều user/API key để tr\xe1nh lỗi quota, kh\xf3a phi\xean hoặc bị provider hạn chế.",o={kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35",deprecated:!0,deprecationNotice:t,website:"https://kiro.dev",notice:{signupUrl:"https://kiro.dev"}},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4",deprecated:!0,deprecationNotice:t,website:"https://github.com/google-gemini/gemini-cli",notice:{signupUrl:"https://github.com/google-gemini/gemini-cli"}},opencode:{id:"opencode",alias:"oc",name:"OpenCode Free",icon:"terminal",color:"#E87040",textIcon:"OC",noAuth:!0,passthroughModels:!0,modelsFetcher:{url:"https://opencode.ai/zen/v1/models",type:"opencode-free"}}},s={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#F97316",textIcon:"OR",website:"https://openrouter.ai",notice:{text:"Free tier: 27+ free models, no credit card needed, 200 req/day. After $10 credit: 1,000 req/day.",apiKeyUrl:"https://openrouter.ai/settings/keys"},modelsFetcher:{url:"https://openrouter.ai/api/v1/models",type:"openrouter-free"},passthroughModels:!0,serviceKinds:["llm","embedding","tts","imageToText"],embeddingConfig:{baseUrl:"https://openrouter.ai/api/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"openai/text-embedding-3-small",name:"Text Embedding 3 Small (OpenRouter)",dimensions:1536},{id:"openai/text-embedding-3-large",name:"Text Embedding 3 Large (OpenRouter)",dimensions:3072},{id:"openai/text-embedding-ada-002",name:"Text Embedding Ada 002 (OpenRouter)",dimensions:1536}]}},nvidia:{id:"nvidia",alias:"nvidia",name:"NVIDIA NIM",icon:"developer_board",color:"#76B900",textIcon:"NV",website:"https://developer.nvidia.com/nim",notice:{text:"Free access for NVIDIA Developer Program members (prototyping & testing).",apiKeyUrl:"https://build.nvidia.com/settings/api-keys"},serviceKinds:["llm","tts","embedding"],ttsConfig:{baseUrl:"https://integrate.api.nvidia.com/v1/audio/speech",authType:"apikey",authHeader:"bearer",format:"nvidia-tts",models:[{id:"fastpitch",name:"FastPitch"},{id:"tacotron2",name:"Tacotron2"}]},embeddingConfig:{baseUrl:"https://integrate.api.nvidia.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nvidia/nv-embedqa-e5-v5",name:"NV EmbedQA E5 v5",dimensions:1024}]}},ollama:{id:"ollama",alias:"ollama",name:"Ollama Cloud",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com",notice:{text:"Free tier: light usage, 1 cloud model at a time (limits reset every 5h & 7d). Pro $20/mo \xb7 Max $100/mo.",apiKeyUrl:"https://ollama.com/settings/keys"}},vertex:{id:"vertex",alias:"vx",name:"Vertex AI",icon:"cloud",color:"#4285F4",textIcon:"VX",website:"https://cloud.google.com/vertex-ai",notice:{text:"New Google Cloud accounts get $300 free credits. Requires GCP project + Service Account with Vertex AI API enabled.",apiKeyUrl:"https://console.cloud.google.com/iam-admin/serviceaccounts"}},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE",mediaPriority:1,website:"https://ai.google.dev",notice:{apiKeyUrl:"https://aistudio.google.com/app/apikey"},serviceKinds:["llm","embedding","image","imageToText","webSearch","tts","stt"],sttConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",format:"gemini-stt",models:[{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro (Best)"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite (Cheapest)"},{id:"gemini-2.0-flash",name:"Gemini 2.0 Flash"}]},searchViaChat:{defaultModel:"gemini-2.5-flash",pricingUrl:"https://ai.google.dev/pricing",freeTier:"Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio."},embeddingConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",models:[{id:"text-embedding-004",name:"Text Embedding 004",dimensions:768},{id:"embedding-001",name:"Embedding 001",dimensions:768}]},ttsConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",format:"gemini-tts",models:[{id:"gemini-2.5-flash-preview-tts",name:"Gemini 2.5 Flash TTS"},{id:"gemini-2.5-pro-preview-tts",name:"Gemini 2.5 Pro TTS"}]}},"cloudflare-ai":{id:"cloudflare-ai",alias:"cf",name:"Cloudflare",icon:"cloud",color:"#F38020",textIcon:"CF",website:"https://developers.cloudflare.com/workers-ai/",notice:{text:"Workers AI free tier. Requires a Cloudflare API token and Account ID.",apiKeyUrl:"https://dash.cloudflare.com/profile/api-tokens"},serviceKinds:["llm","image"],hasProviderSpecificData:!0},byteplus:{id:"byteplus",alias:"bpm",name:"BytePlus ModelArk",icon:"cloud",color:"#2563EB",textIcon:"BP",website:"https://console.byteplus.com/ark",notice:{text:"Free credits for new accounts. Access to Seed 2.0, Kimi K2 Thinking, GLM 4.7, GPT-OSS-120B models.",apiKeyUrl:"https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey"},serviceKinds:["llm"]}},n={extended:{options:["auto","on","off"],defaultMode:"auto",defaultBudgetTokens:1e4},effort:{options:["auto","none","low","medium","high"],defaultMode:"auto"}},r=[{id:"speech-2.8-hd",name:"Speech 2.8 HD"},{id:"speech-2.8-turbo",name:"Speech 2.8 Turbo"},{id:"speech-2.6-hd",name:"Speech 2.6 HD"},{id:"speech-2.6-turbo",name:"Speech 2.6 Turbo"},{id:"speech-02-hd",name:"Speech 02 HD"},{id:"speech-02-turbo",name:"Speech 02 Turbo"},{id:"speech-01-hd",name:"Speech 01 HD"},{id:"speech-01-turbo",name:"Speech 01 Turbo"}],c={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757",deprecated:!0,deprecationNotice:t,website:"https://claude.ai",notice:{signupUrl:"https://claude.ai"}},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B",deprecated:!0,deprecationNotice:"⚠️ Cảnh b\xe1o rủi ro: Provider n\xe0y d\xf9ng subscription/OAuth session kh\xf4ng được cấp ph\xe9p ch\xednh thức cho mục đ\xedch proxy/router. T\xe0i khoản c\xf3 thể bị provider hạn chế hoặc kh\xf3a. Sử dụng v\xe0 tự chịu rủi ro.",website:"https://antigravity.google",notice:{signupUrl:"https://antigravity.google"}},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6",deprecated:!0,deprecationNotice:t,thinkingConfig:n.effort,serviceKinds:["llm","image"],kindNotice:{image:"Requires a ChatGPT Plus (or higher) account. Free accounts are not supported for image generation."},website:"https://chatgpt.com/codex",notice:{signupUrl:"https://chatgpt.com/codex"}},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333",deprecated:!0,deprecationNotice:t,serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://models.github.ai/inference/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"text-embedding-3-small",name:"Text Embedding 3 Small (GitHub)",dimensions:1536},{id:"text-embedding-3-large",name:"Text Embedding 3 Large (GitHub)",dimensions:3072}]},website:"https://github.com/features/copilot",notice:{signupUrl:"https://github.com/features/copilot"}},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA",website:"https://cursor.com",notice:{signupUrl:"https://cursor.com"}},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai",notice:{apiKeyUrl:"https://console.x.ai",signupUrl:"https://x.ai"},serviceKinds:["llm","imageToText","webSearch","image"],searchViaChat:{defaultModel:"grok-4.20-reasoning",pricingUrl:"https://x.ai/api#pricing"},authModes:["oauth","apikey"],hasOAuth:!0},kilocode:{id:"kilocode",alias:"kc",name:"Kilo Code",icon:"code",color:"#FF6B35",textIcon:"KC",website:"https://kilocode.ai",notice:{signupUrl:"https://kilocode.ai"}},cline:{id:"cline",alias:"cl",name:"Cline",icon:"smart_toy",color:"#5B9BD5",textIcon:"CL",website:"https://cline.bot",notice:{signupUrl:"https://cline.bot"}}},l={glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL",website:"https://open.bigmodel.cn",notice:{apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys"}},"glm-cn":{id:"glm-cn",alias:"glm-cn",name:"GLM (China)",icon:"code",color:"#DC2626",textIcon:"GC",website:"https://open.bigmodel.cn",notice:{apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys"}},kimi:{id:"kimi",alias:"kimi",name:"Kimi",icon:"psychology",color:"#1E3A8A",textIcon:"KM",website:"https://kimi.moonshot.cn",notice:{apiKeyUrl:"https://platform.moonshot.ai/console/api-keys"},serviceKinds:["llm","webSearch"],searchViaChat:{defaultModel:"kimi-k2.5",pricingUrl:"https://platform.moonshot.ai/docs/pricing/chat"}},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM",website:"https://www.minimaxi.com",notice:{apiKeyUrl:"https://platform.minimaxi.com/user-center/basic-information/interface-key"},serviceKinds:["llm","image","imageToText","webSearch","tts"],searchViaChat:{defaultModel:"MiniMax-M2.7",pricingUrl:"https://www.minimaxi.com/document/price"},ttsConfig:{baseUrl:"https://api.minimax.io/v1/t2a_v2",authType:"apikey",authHeader:"bearer",format:"minimax-tts",models:r}},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC",website:"https://www.minimaxi.com",notice:{apiKeyUrl:"https://platform.minimaxi.com/user-center/basic-information/interface-key"},serviceKinds:["llm","tts"],ttsConfig:{baseUrl:"https://api.minimaxi.com/v1/t2a_v2",authType:"apikey",authHeader:"bearer",format:"minimax-tts",models:r}},alicode:{id:"alicode",alias:"alicode",name:"Alibaba",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://bailian.console.aliyun.com",notice:{apiKeyUrl:"https://bailian.console.aliyun.com/?apiKey=1"}},"alicode-intl":{id:"alicode-intl",alias:"alicode-intl",name:"Alibaba Intl Coding Plan",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://modelstudio.console.alibabacloud.com",notice:{apiKeyUrl:"https://modelstudio.console.alibabacloud.com/?apiKey=1"}},"alims-intl":{id:"alims-intl",alias:"alims-intl",name:"Alibaba Intl Model Studio",icon:"cloud",color:"#FF6A00",textIcon:"AMS",website:"https://modelstudio.console.alibabacloud.com",notice:{apiKeyUrl:"https://modelstudio.console.alibabacloud.com/?apiKey=1"}},"xiaomi-mimo":{id:"xiaomi-mimo",alias:"mimo",name:"Xiaomi MiMo",icon:"smart_toy",color:"#FF6900",textIcon:"XM",website:"https://xiaomimimo.com",notice:{apiKeyUrl:"https://xiaomimimo.com"}},"xiaomi-tokenplan":{id:"xiaomi-tokenplan",alias:"xmtp",name:"Xiaomi MiMo (Token Plan)",icon:"smart_toy",color:"#FF6700",textIcon:"XT",website:"https://mimo.xiaomi.com",notice:{text:"Xiaomi MiMo Token Plan subscription (API key starts with tp-). Token Plan keys are cluster-specific — select the region matching your subscription.",apiKeyUrl:"https://mimo.xiaomi.com"},hasProviderSpecificData:!0,regions:[{id:"sgp",label:"Singapore",baseUrl:"https://token-plan-sgp.xiaomimimo.com/v1"},{id:"cn",label:"China",baseUrl:"https://token-plan-cn.xiaomimimo.com/v1"},{id:"ams",label:"Europe",baseUrl:"https://token-plan-ams.xiaomimimo.com/v1"}],defaultRegion:"sgp"},"volcengine-ark":{id:"volcengine-ark",alias:"ark",name:"Volcengine Ark",icon:"cloud",color:"#1677FF",textIcon:"ARK",website:"https://ark.cn-beijing.volces.com",notice:{apiKeyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey"}},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA",website:"https://platform.openai.com",notice:{apiKeyUrl:"https://platform.openai.com/api-keys"},serviceKinds:["llm","embedding","tts","stt","image","imageToText","webSearch"],thinkingConfig:n.effort,searchViaChat:{defaultModel:"gpt-4o-mini",pricingUrl:"https://openai.com/api/pricing"},ttsConfig:{baseUrl:"https://api.openai.com/v1/audio/speech",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"tts-1",name:"TTS-1"},{id:"tts-1-hd",name:"TTS-1 HD"},{id:"gpt-4o-mini-tts",name:"GPT-4o Mini TTS"}]},sttConfig:{baseUrl:"https://api.openai.com/v1/audio/transcriptions",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"whisper-1",name:"Whisper 1"},{id:"gpt-4o-transcribe",name:"GPT-4o Transcribe"},{id:"gpt-4o-mini-transcribe",name:"GPT-4o Mini Transcribe"}]},embeddingConfig:{baseUrl:"https://api.openai.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"text-embedding-3-small",name:"Text Embedding 3 Small",dimensions:1536},{id:"text-embedding-3-large",name:"Text Embedding 3 Large",dimensions:3072},{id:"text-embedding-ada-002",name:"Text Embedding Ada 002",dimensions:1536}]}},"vercel-ai-gateway":{id:"vercel-ai-gateway",alias:"vercel",name:"Vercel AI Gateway",icon:"deployed_code",color:"#111827",textIcon:"VG",website:"https://vercel.com/ai-gateway",notice:{text:"Unified OpenAI-compatible endpoint from Vercel. Use your AI Gateway API key, then pick models with provider/model IDs like anthropic/claude-sonnet-4.6 or openai/gpt-5.4.",apiKeyUrl:"https://vercel.com/dashboard/~/ai-gateway"},passthroughModels:!0,serviceKinds:["llm"]},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN",website:"https://console.anthropic.com",notice:{apiKeyUrl:"https://console.anthropic.com/settings/keys"},serviceKinds:["llm","imageToText"]},"opencode-go":{id:"opencode-go",alias:"ocg",name:"OpenCode Go",icon:"terminal",color:"#E87040",textIcon:"OC",website:"https://opencode.ai/auth",notice:{text:"OpenCode Go subscription: $5/mo (then $10/mo). Access to Kimi, GLM, Qwen, MiMo, MiniMax models.",apiKeyUrl:"https://opencode.ai/auth"}},azure:{id:"azure",alias:"azure",name:"Azure OpenAI",icon:"cloud",color:"#0078D4",textIcon:"AZ",website:"https://azure.microsoft.com/en-us/products/ai-services/openai-service",notice:{apiKeyUrl:"https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI"},hasProviderSpecificData:!0},deepseek:{id:"deepseek",alias:"ds",name:"DeepSeek",icon:"bolt",color:"#4D6BFE",textIcon:"DS",website:"https://deepseek.com",notice:{apiKeyUrl:"https://platform.deepseek.com/api_keys"}},commandcode:{id:"commandcode",alias:"cmc",name:"Command Code",icon:"smart_toy",color:"#000000",textIcon:"CC",website:"https://commandcode.ai",notice:{text:"Use your CommandCode CLI API key (starts with user_...) from ~/.commandcode/auth.json or commandcode.ai/studio.",apiKeyUrl:"https://commandcode.ai/studio"}},groq:{id:"groq",alias:"groq",name:"Groq",icon:"speed",color:"#F55036",textIcon:"GQ",website:"https://groq.com",notice:{apiKeyUrl:"https://console.groq.com/keys"},serviceKinds:["llm","imageToText","stt"],sttConfig:{baseUrl:"https://api.groq.com/openai/v1/audio/transcriptions",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"whisper-large-v3",name:"Whisper Large v3"},{id:"whisper-large-v3-turbo",name:"Whisper Large v3 Turbo"},{id:"distil-whisper-large-v3-en",name:"Distil Whisper Large v3 EN"}]}},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai",notice:{apiKeyUrl:"https://console.x.ai"},serviceKinds:["llm","imageToText","webSearch","image"],searchViaChat:{defaultModel:"grok-4.20-reasoning",pricingUrl:"https://x.ai/api#pricing"},authModes:["oauth","apikey"],hasOAuth:!0},mistral:{id:"mistral",alias:"mistral",name:"Mistral",icon:"air",color:"#FF7000",textIcon:"MI",website:"https://mistral.ai",notice:{apiKeyUrl:"https://console.mistral.ai/api-keys"},serviceKinds:["llm","imageToText","embedding"],embeddingConfig:{baseUrl:"https://api.mistral.ai/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"mistral-embed",name:"Mistral Embed",dimensions:1024}]}},perplexity:{id:"perplexity",alias:"pplx",name:"Perplexity",icon:"search",color:"#20808D",textIcon:"PP",website:"https://www.perplexity.ai",notice:{apiKeyUrl:"https://www.perplexity.ai/settings/api"},serviceKinds:["llm","webSearch"],searchConfig:{baseUrl:"https://api.perplexity.ai/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.005,freeMonthlyQuota:0,searchTypes:["web"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5}},together:{id:"together",alias:"together",name:"Together AI",icon:"group_work",color:"#0F6FFF",textIcon:"TG",website:"https://www.together.ai",notice:{apiKeyUrl:"https://api.together.xyz/settings/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.together.xyz/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"BAAI/bge-large-en-v1.5",name:"BGE Large EN v1.5",dimensions:1024},{id:"togethercomputer/m2-bert-80M-8k-retrieval",name:"M2 BERT 80M 8K",dimensions:768}]}},fireworks:{id:"fireworks",alias:"fireworks",name:"Fireworks AI",icon:"local_fire_department",color:"#7B2EF2",textIcon:"FW",website:"https://fireworks.ai",notice:{apiKeyUrl:"https://fireworks.ai/account/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.fireworks.ai/inference/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nomic-ai/nomic-embed-text-v1.5",name:"Nomic Embed Text v1.5",dimensions:768}]}},cerebras:{id:"cerebras",alias:"cerebras",name:"Cerebras",icon:"memory",color:"#FF4F00",textIcon:"CB",website:"https://www.cerebras.ai",notice:{apiKeyUrl:"https://cloud.cerebras.ai/platform"}},cohere:{id:"cohere",alias:"cohere",name:"Cohere",icon:"hub",color:"#39594D",textIcon:"CO",website:"https://cohere.com",notice:{apiKeyUrl:"https://dashboard.cohere.com/api-keys"}},nebius:{id:"nebius",alias:"nebius",name:"Nebius AI",icon:"cloud",color:"#6C5CE7",textIcon:"NB",website:"https://nebius.com",notice:{apiKeyUrl:"https://studio.nebius.com/settings/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.tokenfactory.nebius.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"Qwen/Qwen3-Embedding-8B",name:"Qwen3 Embedding 8B",dimensions:4096}]}},siliconflow:{id:"siliconflow",alias:"siliconflow",name:"SiliconFlow",icon:"cloud_queue",color:"#5B6EF5",textIcon:"SF",website:"https://cloud.siliconflow.com",notice:{apiKeyUrl:"https://cloud.siliconflow.com/account/ak"}},hyperbolic:{id:"hyperbolic",alias:"hyp",name:"Hyperbolic",icon:"bolt",color:"#00D4FF",textIcon:"HY",website:"https://hyperbolic.xyz",notice:{apiKeyUrl:"https://app.hyperbolic.xyz/settings"},serviceKinds:["llm","tts"],ttsConfig:{baseUrl:"https://api.hyperbolic.xyz/v1/audio/generation",authType:"apikey",authHeader:"bearer",format:"hyperbolic",models:[{id:"melo-tts",name:"Melo TTS"}]}},deepgram:{id:"deepgram",alias:"dg",name:"Deepgram",icon:"mic",color:"#13EF93",textIcon:"DG",website:"https://deepgram.com",notice:{text:"$200 free credit on signup (no card required). Aura-1: $0.015/1k chars, Aura-2: $0.030/1k chars (Pay-As-You-Go).",apiKeyUrl:"https://console.deepgram.com/api-keys"},serviceKinds:["stt","imageToText","tts"],ttsConfig:{baseUrl:"https://api.deepgram.com/v1/speak",authType:"apikey",authHeader:"token",format:"deepgram",models:[]},sttConfig:{baseUrl:"https://api.deepgram.com/v1/listen",authType:"apikey",authHeader:"token",format:"deepgram",models:[{id:"nova-3",name:"Nova 3"},{id:"nova-2",name:"Nova 2"},{id:"whisper-large",name:"Whisper Large"}]}},assemblyai:{id:"assemblyai",alias:"aai",name:"AssemblyAI",icon:"record_voice_over",color:"#0062FF",textIcon:"AA",website:"https://assemblyai.com",notice:{apiKeyUrl:"https://www.assemblyai.com/app/api-keys"},serviceKinds:["stt"],sttConfig:{baseUrl:"https://api.assemblyai.com/v2/transcript",authType:"apikey",authHeader:"bearer",format:"assemblyai",async:!0,models:[{id:"universal-3-pro",name:"Universal 3 Pro"},{id:"universal-2",name:"Universal 2"}]}},nanobanana:{id:"nanobanana",alias:"nb",name:"NanoBanana API",icon:"extension",color:"#FFD700",textIcon:"\uD83C\uDF4C",website:"https://nanobananaapi.ai",notice:{text:"3rd-party proxy for Google Nano Banana (Gemini 2.5/3 Flash Image). For official, use Gemini provider.",apiKeyUrl:"https://nanobananaapi.ai/dashboard"},serviceKinds:["image"]},elevenlabs:{id:"elevenlabs",alias:"el",name:"ElevenLabs",icon:"record_voice_over",color:"#6C47FF",textIcon:"EL",website:"https://elevenlabs.io",notice:{apiKeyUrl:"https://elevenlabs.io/app/settings/api-keys"},serviceKinds:["tts"],ttsConfig:{baseUrl:"https://api.elevenlabs.io/v1/text-to-speech",authType:"apikey",authHeader:"xi-api-key",format:"elevenlabs",models:[{id:"eleven_multilingual_v2",name:"Eleven Multilingual v2"},{id:"eleven_turbo_v2_5",name:"Eleven Turbo v2.5"}]}},cartesia:{id:"cartesia",alias:"cartesia",name:"Cartesia",icon:"spatial_audio",color:"#FF4F8B",textIcon:"CA",website:"https://cartesia.ai",notice:{apiKeyUrl:"https://play.cartesia.ai/keys"},serviceKinds:["tts"],hidden:!0,ttsConfig:{baseUrl:"https://api.cartesia.ai/tts/bytes",authType:"apikey",authHeader:"x-api-key",format:"cartesia",models:[{id:"sonic-2",name:"Sonic 2"},{id:"sonic-3",name:"Sonic 3"}]}},playht:{id:"playht",alias:"playht",name:"PlayHT",icon:"play_circle",color:"#00B4D8",textIcon:"PH",website:"https://play.ht",notice:{apiKeyUrl:"https://play.ht/studio/api-access"},serviceKinds:["tts"],hidden:!0,ttsConfig:{baseUrl:"https://api.play.ht/api/v2/tts/stream",authType:"apikey",authHeader:"playht",format:"playht",models:[{id:"PlayDialog",name:"PlayDialog"},{id:"Play3.0-mini",name:"Play 3.0 Mini"}]}},"local-device":{id:"local-device",alias:"local-device",name:"Local Device",icon:"speaker",color:"#64748B",textIcon:"LD",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"local-device",authType:"none",authHeader:"none",format:"local-device",models:[]}},"google-tts":{id:"google-tts",alias:"google-tts",name:"Google TTS",icon:"record_voice_over",color:"#4285F4",textIcon:"GT",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"google-tts",authType:"none",authHeader:"none",format:"google-tts",models:[]}},"edge-tts":{id:"edge-tts",alias:"edge-tts",name:"Edge TTS",icon:"record_voice_over",color:"#0078D4",textIcon:"ET",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"edge-tts",authType:"none",authHeader:"none",format:"edge-tts",models:[]}},coqui:{id:"coqui",alias:"coqui",name:"Coqui TTS",icon:"record_voice_over",color:"#10B981",textIcon:"CQ",website:"https://github.com/coqui-ai/TTS",serviceKinds:["tts"],hidden:!0,noAuth:!0,ttsConfig:{baseUrl:"http://localhost:5002/api/tts",authType:"none",authHeader:"none",format:"coqui",models:[{id:"tts_models/en/ljspeech/tacotron2-DDC",name:"Tacotron2 DDC (LJSpeech)"}]}},tortoise:{id:"tortoise",alias:"tortoise",name:"Tortoise TTS",icon:"record_voice_over",color:"#7C3AED",textIcon:"TT",website:"https://github.com/neonbjb/tortoise-tts",serviceKinds:["tts"],hidden:!0,noAuth:!0,ttsConfig:{baseUrl:"http://localhost:5000/api/tts",authType:"none",authHeader:"none",format:"tortoise",models:[{id:"tortoise-v2",name:"Tortoise v2"}]}},inworld:{id:"inworld",alias:"inworld",name:"Inworld TTS",icon:"record_voice_over",color:"#FF6B6B",textIcon:"IW",website:"https://inworld.ai",notice:{text:"Free tier: 40 minutes/month TTS. Paid: TTS-1.5 Mini $0.01/min ($15/1M chars), TTS-1.5 Max $0.025/min ($30/1M chars). 270+ voices, 15 languages.",apiKeyUrl:"https://platform.inworld.ai/api-keys"},serviceKinds:["tts"],ttsConfig:{baseUrl:"https://api.inworld.ai/tts/v1/voice",authType:"apikey",authHeader:"basic",format:"inworld",models:[{id:"inworld-tts-1.5-mini",name:"Inworld TTS 1.5 Mini ($0.01/min)"},{id:"inworld-tts-1.5-max",name:"Inworld TTS 1.5 Max ($0.025/min)"}]}},"voyage-ai":{id:"voyage-ai",alias:"voyage",name:"Voyage AI",icon:"data_array",color:"#0EA5E9",textIcon:"VG",website:"https://www.voyageai.com",notice:{apiKeyUrl:"https://dash.voyageai.com/api-keys"},serviceKinds:["embedding"],embeddingConfig:{baseUrl:"https://api.voyageai.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"voyage-3-large",name:"Voyage 3 Large",dimensions:1024},{id:"voyage-3.5",name:"Voyage 3.5",dimensions:1024},{id:"voyage-3.5-lite",name:"Voyage 3.5 Lite",dimensions:1024},{id:"voyage-code-3",name:"Voyage Code 3",dimensions:1024},{id:"voyage-finance-2",name:"Voyage Finance 2",dimensions:1024},{id:"voyage-law-2",name:"Voyage Law 2",dimensions:1024},{id:"voyage-multilingual-2",name:"Voyage Multilingual 2",dimensions:1024}]}},sdwebui:{id:"sdwebui",alias:"sdwebui",name:"SD WebUI",icon:"brush",color:"#FF7043",textIcon:"SD",website:"https://github.com/AUTOMATIC1111/stable-diffusion-webui",serviceKinds:["image"]},comfyui:{id:"comfyui",alias:"comfyui",name:"ComfyUI",icon:"account_tree",color:"#4CAF50",textIcon:"CF",website:"https://github.com/comfyanonymous/ComfyUI",serviceKinds:["image"]},huggingface:{id:"huggingface",alias:"hf",name:"HuggingFace",icon:"face",color:"#FFD21E",textIcon:"HF",website:"https://huggingface.co",notice:{apiKeyUrl:"https://huggingface.co/settings/tokens"},serviceKinds:["image","imageToText","tts","stt"],hiddenKinds:["tts"],ttsConfig:{baseUrl:"https://api-inference.huggingface.co/models",authType:"apikey",authHeader:"bearer",format:"huggingface-tts",models:[{id:"facebook/mms-tts-eng",name:"MMS TTS English"},{id:"microsoft/speecht5_tts",name:"SpeechT5 TTS"}]},sttConfig:{baseUrl:"https://api-inference.huggingface.co/models",authType:"apikey",authHeader:"bearer",format:"huggingface-asr",models:[{id:"openai/whisper-large-v3",name:"Whisper Large v3 (HF)"},{id:"openai/whisper-small",name:"Whisper Small (HF)"}]}},blackbox:{id:"blackbox",alias:"bb",name:"Blackbox AI",icon:"smart_toy",color:"#5B5FEF",textIcon:"BB",website:"https://blackbox.ai",notice:{apiKeyUrl:"https://www.blackbox.ai/api-management"},serviceKinds:["llm"]},chutes:{id:"chutes",alias:"ch",name:"Chutes AI",icon:"water_drop",color:"#ffffffff",textIcon:"CH",website:"https://chutes.ai",notice:{apiKeyUrl:"https://chutes.ai/app/api"}},"ollama-local":{id:"ollama-local",alias:"ollama-local",name:"Ollama Local",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com"},"vertex-partner":{id:"vertex-partner",alias:"vxp",name:"Vertex Partner",icon:"cloud",color:"#34A853",textIcon:"VP",website:"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models",notice:{apiKeyUrl:"https://console.cloud.google.com/iam-admin/serviceaccounts"}},tavily:{id:"tavily",alias:"tavily",name:"Tavily",icon:"search",color:"#5B21B6",textIcon:"TV",website:"https://tavily.com",notice:{apiKeyUrl:"https://app.tavily.com/home"},serviceKinds:["webSearch","webFetch"],searchConfig:{baseUrl:"https://api.tavily.com/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.008,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5},fetchConfig:{baseUrl:"https://api.tavily.com/extract",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.008,freeMonthlyQuota:1e3,formats:["markdown","text"],maxCharacters:1e5,timeoutMs:15e3}},"brave-search":{id:"brave-search",alias:"brave",name:"Brave Search",icon:"travel_explore",color:"#FB542B",textIcon:"BR",website:"https://brave.com/search/api",notice:{apiKeyUrl:"https://api-dashboard.search.brave.com/app/keys"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://api.search.brave.com/res/v1",method:"GET",authType:"apikey",authHeader:"x-subscription-token",costPerQuery:.005,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5}},serper:{id:"serper",alias:"serper",name:"Serper",icon:"search",color:"#4F46E5",textIcon:"SP",website:"https://serper.dev",notice:{apiKeyUrl:"https://serper.dev/api-key"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://google.serper.dev",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.001,freeMonthlyQuota:2500,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},exa:{id:"exa",alias:"exa",name:"Exa",icon:"manage_search",color:"#2563EB",textIcon:"EX",website:"https://exa.ai",notice:{apiKeyUrl:"https://dashboard.exa.ai/api-keys"},serviceKinds:["webSearch","webFetch"],searchConfig:{baseUrl:"https://api.exa.ai/search",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.007,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5},fetchConfig:{baseUrl:"https://api.exa.ai/contents",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.001,freeMonthlyQuota:1e3,formats:["text","markdown"],maxCharacters:1e5,timeoutMs:15e3}},searxng:{id:"searxng",alias:"searxng",name:"SearXNG",icon:"saved_search",color:"#3B82F6",textIcon:"SX",website:"https://docs.searxng.org",serviceKinds:["webSearch"],noAuth:!0,searchConfig:{baseUrl:"http://localhost:8888/search",method:"GET",authType:"none",authHeader:"none",costPerQuery:0,freeMonthlyQuota:999999,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:50,timeoutMs:1e4,cacheTTLMs:18e4}},"google-pse":{id:"google-pse",alias:"gpse",name:"Google PSE",icon:"search",color:"#4285F4",textIcon:"GP",website:"https://programmablesearchengine.google.com",notice:{apiKeyUrl:"https://programmablesearchengine.google.com/controlpanel/create"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://www.googleapis.com/customsearch/v1",method:"GET",authType:"apikey",authHeader:"key",costPerQuery:.005,freeMonthlyQuota:3e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:10,timeoutMs:1e4,cacheTTLMs:3e5}},linkup:{id:"linkup",alias:"linkup",name:"Linkup",icon:"link",color:"#0EA5E9",textIcon:"LK",website:"https://linkup.so",notice:{apiKeyUrl:"https://app.linkup.so/api-keys"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://api.linkup.so/v1/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.005,freeMonthlyQuota:1e3,searchTypes:["web"],defaultMaxResults:5,maxMaxResults:50,timeoutMs:1e4,cacheTTLMs:3e5}},searchapi:{id:"searchapi",alias:"searchapi",name:"SearchAPI",icon:"search",color:"#0EA5A4",textIcon:"SA",website:"https://www.searchapi.io",notice:{apiKeyUrl:"https://www.searchapi.io/dashboard"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://www.searchapi.io/api/v1/search",method:"GET",authType:"apikey",authHeader:"api_key",costPerQuery:.004,freeMonthlyQuota:100,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},youcom:{id:"youcom",alias:"youcom",name:"You.com Search",icon:"search",color:"#7C3AED",textIcon:"YC",website:"https://you.com",notice:{apiKeyUrl:"https://api.you.com"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://ydc-index.io/v1/search",method:"GET",authType:"apikey",authHeader:"x-api-key",costPerQuery:.005,freeMonthlyQuota:0,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},firecrawl:{id:"firecrawl",alias:"firecrawl",name:"Firecrawl",icon:"local_fire_department",color:"#F59E0B",textIcon:"FC",website:"https://firecrawl.dev",notice:{apiKeyUrl:"https://www.firecrawl.dev/app/api-keys"},serviceKinds:["webFetch"],fetchConfig:{baseUrl:"https://api.firecrawl.dev/v1/scrape",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.002,freeMonthlyQuota:500,formats:["markdown","html","text"],maxCharacters:2e5,timeoutMs:3e4}},"fal-ai":{id:"fal-ai",alias:"fal",name:"Fal.ai",icon:"image",color:"#2563EB",textIcon:"FL",website:"https://fal.ai",notice:{apiKeyUrl:"https://fal.ai/dashboard/keys"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.fal.ai/v1/models?limit=1",method:"GET",authType:"apikey",authHeader:"key"}},"stability-ai":{id:"stability-ai",alias:"stability",name:"Stability AI",icon:"image",color:"#8B5CF6",textIcon:"SA",website:"https://stability.ai",notice:{apiKeyUrl:"https://platform.stability.ai/account/keys"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.stability.ai/v1/user/account",method:"GET",authType:"apikey",authHeader:"bearer"}},"black-forest-labs":{id:"black-forest-labs",alias:"bfl",name:"Black Forest Labs",icon:"image",color:"#111827",textIcon:"BF",website:"https://blackforestlabs.ai",notice:{apiKeyUrl:"https://api.bfl.ai"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.bfl.ai/v1/get_result?id=ping",method:"GET",authType:"apikey",authHeader:"x-key"}},recraft:{id:"recraft",alias:"recraft",name:"Recraft",icon:"image",color:"#EC4899",textIcon:"RC",website:"https://recraft.ai",notice:{apiKeyUrl:"https://www.recraft.ai/profile/api"},serviceKinds:["image"],imageConfig:{baseUrl:"https://external.api.recraft.ai/v1/users/me",method:"GET",authType:"apikey",authHeader:"bearer"}},topaz:{id:"topaz",alias:"topaz",name:"Topaz",icon:"image",color:"#059669",textIcon:"TP",website:"https://topazlabs.com",notice:{apiKeyUrl:"https://topazlabs.com/account"},serviceKinds:["image"]},runwayml:{id:"runwayml",alias:"runway",name:"Runway ML",icon:"movie",color:"#000000",textIcon:"RW",website:"https://runwayml.com",notice:{apiKeyUrl:"https://dev.runwayml.com"},serviceKinds:["image","video"],imageConfig:{baseUrl:"https://api.dev.runwayml.com/v1/organization",method:"GET",authType:"apikey",authHeader:"bearer",extraHeaders:{"X-Runway-Version":"2024-11-06"}}},"aws-polly":{id:"aws-polly",alias:"polly",name:"AWS Polly",icon:"record_voice_over",color:"#FF9900",textIcon:"PL",website:"https://aws.amazon.com/polly/",notice:{text:"Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region.",apiKeyUrl:"https://console.aws.amazon.com/iam/home#/security_credentials"},serviceKinds:["tts"],hasProviderSpecificData:!0,ttsConfig:{baseUrl:"https://polly.{region}.amazonaws.com/v1/speech",authType:"apikey",authHeader:"aws-sigv4",format:"aws-polly",models:[{id:"standard",name:"Standard"},{id:"neural",name:"Neural"},{id:"long-form",name:"Long-form"},{id:"generative",name:"Generative"}]}},"jina-ai":{id:"jina-ai",alias:"jina",name:"Jina AI",icon:"blur_on",color:"#2563EB",textIcon:"JA",website:"https://jina.ai",notice:{text:"10M free tokens on signup (non-commercial), no credit card required.",apiKeyUrl:"https://jina.ai/?sui=apikey"},serviceKinds:["embedding"],embeddingConfig:{baseUrl:"https://api.jina.ai/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"jina-embeddings-v3",name:"Jina Embeddings v3",dimensions:1024},{id:"jina-embeddings-v2-base-en",name:"Jina Embeddings v2 Base EN",dimensions:768},{id:"jina-embeddings-v2-base-code",name:"Jina Embeddings v2 Base Code",dimensions:768}]}},"jina-reader":{id:"jina-reader",alias:"jina",name:"Jina Reader",icon:"menu_book",color:"#000000",textIcon:"JR",website:"https://jina.ai/reader",notice:{apiKeyUrl:"https://jina.ai/?sui=apikey"},serviceKinds:["webFetch"],fetchConfig:{baseUrl:"https://r.jina.ai",method:"GET",authType:"apikey",authHeader:"bearer",costPerQuery:0,freeMonthlyQuota:1e6,formats:["markdown","text","html"],maxCharacters:2e5,timeoutMs:3e4}}},d={"grok-web":{id:"grok-web",alias:"gw",name:"Grok Web (Subscription)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"GW",website:"https://grok.com",authType:"cookie",authHint:"Paste your sso= cookie value from grok.com",passthroughModels:!0,serviceKinds:["llm"]},"perplexity-web":{id:"perplexity-web",alias:"pw",name:"Perplexity Web (Pro/Max)",icon:"search",color:"#20808D",textIcon:"PW",website:"https://www.perplexity.ai",authType:"cookie",authHint:"Paste your __Secure-next-auth.session-token cookie value from perplexity.ai",serviceKinds:["llm"]}},m=[{id:"embedding",label:"Embedding",icon:"data_array",endpoint:{method:"POST",path:"/v1/embeddings"}},{id:"image",label:"Text to Image",icon:"brush",endpoint:{method:"POST",path:"/v1/images/generations"}},{id:"imageToText",label:"Image to Text",icon:"image_search",endpoint:{method:"POST",path:"/v1/images/understanding"}},{id:"tts",label:"Text To Speech",icon:"record_voice_over",endpoint:{method:"POST",path:"/v1/audio/speech"}},{id:"stt",label:"Speech To Text",icon:"mic",endpoint:{method:"POST",path:"/v1/audio/transcriptions"}},{id:"webSearch",label:"Web Search",icon:"travel_explore",endpoint:{method:"POST",path:"/v1/search"}},{id:"webFetch",label:"Web Fetch",icon:"language",endpoint:{method:"POST",path:"/v1/web/fetch"}},{id:"video",label:"Video",icon:"movie",endpoint:{method:"POST",path:"/v1/video/generations"}},{id:"music",label:"Music",icon:"music_note",endpoint:{method:"POST",path:"/v1/audio/music"}}],p="openai-compatible-",h="anthropic-compatible-",u=Object.freeze({GENERIC:"generic",LLAMA_CPP:"llamacpp",VLLM:"vllm",OLLAMA:"ollama"}),g=u.LLAMA_CPP,b=[{value:u.GENERIC,label:"Generic OpenAI-compatible",description:"Only standard request fields are forwarded. Thinking/reasoning-specific fields are not injected."},{value:u.LLAMA_CPP,label:"llama.cpp / llama-server",description:"Supports chat_template_kwargs.enable_thinking and reasoning_budget for Qwen-style thinking control."},{value:u.VLLM,label:"vLLM",description:"Supports chat_template_kwargs.enable_thinking and maps reasoning budget to thinking_token_budget."},{value:u.OLLAMA,label:"Ollama OpenAI-compatible",description:"Uses standard OpenAI-compatible fields only. Thinking/reasoning fields are not injected."}];function y(e){return"string"==typeof e&&e.startsWith(p)}function v(e){return"string"==typeof e&&e.startsWith(h)}function f(e){return"string"==typeof e&&e.startsWith("custom-embedding-")}function x(e){return"string"==typeof e&&e.startsWith("custom-stt-")}function w(e){return"string"==typeof e&&e.startsWith("custom-tts-")}Object.freeze({generic:u.GENERIC,default:u.GENERIC,openai:u.GENERIC,strict:u.GENERIC,llama:u.LLAMA_CPP,llamacpp:u.LLAMA_CPP,"llama.cpp":u.LLAMA_CPP,"llama-cpp":u.LLAMA_CPP,"llama-server":u.LLAMA_CPP,llamaserver:u.LLAMA_CPP,vllm:u.VLLM,"v-llm":u.VLLM,ollama:u.OLLAMA,"ollama-openai":u.OLLAMA});let k={...o,...s,...c,...l,...d},T={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"},cookie:{id:"cookie",name:"Browser Cookie",icon:"cookie"}};function C(e){for(let i of Object.values(k))if(i.alias===e||i.id===e)return i;return null}function M(e){let i=C(e);return i?.id||e}function U(e){let i=k[e];return i?.alias||e}function I(e){return Object.values(k).filter(i=>!(!(i.serviceKinds??["llm"]).includes(e)||i.hidden||i.hiddenKinds?.includes(e))).sort((e,i)=>(e.mediaPriority??100)-(i.mediaPriority??100))}Object.values(k).reduce((e,i)=>(e[i.alias]=i.id,e),{}),Object.values(k).reduce((e,i)=>(e[i.id]=i.alias,e),{});let K=["claude","antigravity","kiro","github","codex","kimi-coding","ollama","gemini-cli","glm","glm-cn","minimax","minimax-cn"]},90620:(e,i,a)=>{a.d(i,{Q2:()=>t.Q2,fg:()=>t.fg,vQ:()=>o,MA:()=>t.MA,UY:()=>c,Nu:()=>s,zN:()=>t.zN,X3:()=>l,B2:()=>r,h0:()=>n});var t=a(52679);a(28777);let o={name:"AI Router Gateway",description:"AI Infrastructure Management",version:"5.4.1"},s={changelogUrl:"https://raw.githubusercontent.com/decolua/bluerouter/refs/heads/master/CHANGELOG.md",donateUrl:"https://bluerouter.com/api/donate"},n={npmPackageName:"@jheavenknows/bluerouter",installCmd:"npm i -g @jheavenknows/bluerouter",installCmdLatest:"npm install -g @jheavenknows/bluerouter@latest",shutdownCountdownSec:3,exitDelayMs:500,statusPort:20129,statusPollIntervalMs:1e3,statusLogTailLines:8,installRetries:3,installRetryDelayMs:5e3,lingerAfterDoneMs:3e4,waitForExitMinMs:5e3,waitForExitMaxMs:2e4,waitForExitCheckMs:500,appPort:20128},r={storageKey:"theme",defaultTheme:"system"},c={maxLines:200,pollIntervalMs:1e3},l={openrouter:"https://openrouter.ai/api/v1/chat/completions",glm:"https://api.z.ai/api/anthropic/v1/messages","glm-cn":"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",kimi:"https://api.kimi.com/coding/v1/messages",minimax:"https://api.minimax.io/anthropic/v1/messages","minimax-cn":"https://api.minimaxi.com/anthropic/v1/messages",alicode:"https://coding.dashscope.aliyuncs.com/v1/chat/completions","alicode-intl":"https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions","alims-intl":"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions","volcengine-ark":"https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions",byteplus:"https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions",openai:"https://api.openai.com/v1/chat/completions","vercel-ai-gateway":"https://ai-gateway.vercel.sh/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",gemini:"https://generativelanguage.googleapis.com/v1beta/models",ollama:"https://ollama.com/api/chat","ollama-local":"http://localhost:11434/api/chat"}}}]);
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5263],{28777:(e,i,a)=>{a.d(i,{KC:()=>t.KC,Xg:()=>t.Xg});var t=a(45564);Object.entries(a(52679).Q2).filter(([,e])=>e.passthroughModels).map(([e])=>e),Object.entries(t.vq).flatMap(([e,i])=>i.map(i=>({provider:e,model:i.id,name:i.name})))},44656:(e,i,a)=>{a.d(i,{BrandingProvider:()=>m,notifyBrandingChanged:()=>d,useBranding:()=>p});var t=a(95155),o=a(12115),s=a(14051),n=a.n(s);let r={siteTitle:"",siteShortName:"",siteDescription:"",logoUrl:null,faviconUrl:null,logoMime:null,faviconMime:null,hasLogo:!1,hasFavicon:!1},c=(0,o.createContext)({...r,loading:!0,refresh:async()=>{}}),l="bluerouter:branding-updated";function d(){window.dispatchEvent(new CustomEvent(l))}function m({initialBranding:e,children:i}){let[a,s]=(0,o.useState)(e||r),[n,d]=(0,o.useState)(!e),p=(0,o.useCallback)(async()=>{try{let e=await fetch("/api/branding",{cache:"no-store"});if(!e.ok)return;let i=await e.json();s({...r,...i})}catch{}finally{d(!1)}},[]);(0,o.useEffect)(()=>{p()},[p]),(0,o.useEffect)(()=>{let e=()=>p();return window.addEventListener(l,e),()=>window.removeEventListener(l,e)},[p]);let h=(0,o.useMemo)(()=>({...a,loading:n,refresh:p}),[a,n,p]);return(0,t.jsx)(c.Provider,{value:h,children:i})}function p(){return(0,o.useContext)(c)}m.propTypes={initialBranding:n().object,children:n().node}},52679:(e,i,a)=>{a.d(i,{DI:()=>h,IS:()=>o,JH:()=>p,MA:()=>T,Ox:()=>x,Q2:()=>k,U_:()=>w,_8:()=>b,br:()=>d,fg:()=>l,gC:()=>f,gb:()=>v,hb:()=>g,mq:()=>y,nJ:()=>s,o5:()=>I,rj:()=>m,rs:()=>M,s9:()=>n,wG:()=>U,wb:()=>K,zN:()=>c,zt:()=>C});let t="⚠️ Lưu \xfd: Mỗi t\xe0i khoản OAuth chỉ n\xean d\xf9ng cho một user. Kh\xf4ng chia sẻ OAuth account cho nhiều user/API key để tr\xe1nh lỗi quota, kh\xf3a phi\xean hoặc bị provider hạn chế.",o={kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35",deprecated:!0,deprecationNotice:t,website:"https://kiro.dev",notice:{signupUrl:"https://kiro.dev"}},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4",deprecated:!0,deprecationNotice:t,website:"https://github.com/google-gemini/gemini-cli",notice:{signupUrl:"https://github.com/google-gemini/gemini-cli"}},opencode:{id:"opencode",alias:"oc",name:"OpenCode Free",icon:"terminal",color:"#E87040",textIcon:"OC",noAuth:!0,passthroughModels:!0,modelsFetcher:{url:"https://opencode.ai/zen/v1/models",type:"opencode-free"}}},s={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#F97316",textIcon:"OR",website:"https://openrouter.ai",notice:{text:"Free tier: 27+ free models, no credit card needed, 200 req/day. After $10 credit: 1,000 req/day.",apiKeyUrl:"https://openrouter.ai/settings/keys"},modelsFetcher:{url:"https://openrouter.ai/api/v1/models",type:"openrouter-free"},passthroughModels:!0,serviceKinds:["llm","embedding","tts","imageToText"],embeddingConfig:{baseUrl:"https://openrouter.ai/api/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"openai/text-embedding-3-small",name:"Text Embedding 3 Small (OpenRouter)",dimensions:1536},{id:"openai/text-embedding-3-large",name:"Text Embedding 3 Large (OpenRouter)",dimensions:3072},{id:"openai/text-embedding-ada-002",name:"Text Embedding Ada 002 (OpenRouter)",dimensions:1536}]}},nvidia:{id:"nvidia",alias:"nvidia",name:"NVIDIA NIM",icon:"developer_board",color:"#76B900",textIcon:"NV",website:"https://developer.nvidia.com/nim",notice:{text:"Free access for NVIDIA Developer Program members (prototyping & testing).",apiKeyUrl:"https://build.nvidia.com/settings/api-keys"},serviceKinds:["llm","tts","embedding"],ttsConfig:{baseUrl:"https://integrate.api.nvidia.com/v1/audio/speech",authType:"apikey",authHeader:"bearer",format:"nvidia-tts",models:[{id:"fastpitch",name:"FastPitch"},{id:"tacotron2",name:"Tacotron2"}]},embeddingConfig:{baseUrl:"https://integrate.api.nvidia.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nvidia/nv-embedqa-e5-v5",name:"NV EmbedQA E5 v5",dimensions:1024}]}},ollama:{id:"ollama",alias:"ollama",name:"Ollama Cloud",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com",notice:{text:"Free tier: light usage, 1 cloud model at a time (limits reset every 5h & 7d). Pro $20/mo \xb7 Max $100/mo.",apiKeyUrl:"https://ollama.com/settings/keys"}},vertex:{id:"vertex",alias:"vx",name:"Vertex AI",icon:"cloud",color:"#4285F4",textIcon:"VX",website:"https://cloud.google.com/vertex-ai",notice:{text:"New Google Cloud accounts get $300 free credits. Requires GCP project + Service Account with Vertex AI API enabled.",apiKeyUrl:"https://console.cloud.google.com/iam-admin/serviceaccounts"}},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE",mediaPriority:1,website:"https://ai.google.dev",notice:{apiKeyUrl:"https://aistudio.google.com/app/apikey"},serviceKinds:["llm","embedding","image","imageToText","webSearch","tts","stt"],sttConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",format:"gemini-stt",models:[{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro (Best)"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite (Cheapest)"},{id:"gemini-2.0-flash",name:"Gemini 2.0 Flash"}]},searchViaChat:{defaultModel:"gemini-2.5-flash",pricingUrl:"https://ai.google.dev/pricing",freeTier:"Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio."},embeddingConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",models:[{id:"text-embedding-004",name:"Text Embedding 004",dimensions:768},{id:"embedding-001",name:"Embedding 001",dimensions:768}]},ttsConfig:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"apikey",authHeader:"key",format:"gemini-tts",models:[{id:"gemini-2.5-flash-preview-tts",name:"Gemini 2.5 Flash TTS"},{id:"gemini-2.5-pro-preview-tts",name:"Gemini 2.5 Pro TTS"}]}},"cloudflare-ai":{id:"cloudflare-ai",alias:"cf",name:"Cloudflare",icon:"cloud",color:"#F38020",textIcon:"CF",website:"https://developers.cloudflare.com/workers-ai/",notice:{text:"Workers AI free tier. Requires a Cloudflare API token and Account ID.",apiKeyUrl:"https://dash.cloudflare.com/profile/api-tokens"},serviceKinds:["llm","image"],hasProviderSpecificData:!0},byteplus:{id:"byteplus",alias:"bpm",name:"BytePlus ModelArk",icon:"cloud",color:"#2563EB",textIcon:"BP",website:"https://console.byteplus.com/ark",notice:{text:"Free credits for new accounts. Access to Seed 2.0, Kimi K2 Thinking, GLM 4.7, GPT-OSS-120B models.",apiKeyUrl:"https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey"},serviceKinds:["llm"]}},n={extended:{options:["auto","on","off"],defaultMode:"auto",defaultBudgetTokens:1e4},effort:{options:["auto","none","low","medium","high"],defaultMode:"auto"}},r=[{id:"speech-2.8-hd",name:"Speech 2.8 HD"},{id:"speech-2.8-turbo",name:"Speech 2.8 Turbo"},{id:"speech-2.6-hd",name:"Speech 2.6 HD"},{id:"speech-2.6-turbo",name:"Speech 2.6 Turbo"},{id:"speech-02-hd",name:"Speech 02 HD"},{id:"speech-02-turbo",name:"Speech 02 Turbo"},{id:"speech-01-hd",name:"Speech 01 HD"},{id:"speech-01-turbo",name:"Speech 01 Turbo"}],c={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757",deprecated:!0,deprecationNotice:t,website:"https://claude.ai",notice:{signupUrl:"https://claude.ai"}},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B",deprecated:!0,deprecationNotice:"⚠️ Cảnh b\xe1o rủi ro: Provider n\xe0y d\xf9ng subscription/OAuth session kh\xf4ng được cấp ph\xe9p ch\xednh thức cho mục đ\xedch proxy/router. T\xe0i khoản c\xf3 thể bị provider hạn chế hoặc kh\xf3a. Sử dụng v\xe0 tự chịu rủi ro.",website:"https://antigravity.google",notice:{signupUrl:"https://antigravity.google"}},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6",deprecated:!0,deprecationNotice:t,thinkingConfig:n.effort,serviceKinds:["llm","image"],kindNotice:{image:"Requires a ChatGPT Plus (or higher) account. Free accounts are not supported for image generation."},website:"https://chatgpt.com/codex",notice:{signupUrl:"https://chatgpt.com/codex"}},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333",deprecated:!0,deprecationNotice:t,serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://models.github.ai/inference/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"text-embedding-3-small",name:"Text Embedding 3 Small (GitHub)",dimensions:1536},{id:"text-embedding-3-large",name:"Text Embedding 3 Large (GitHub)",dimensions:3072}]},website:"https://github.com/features/copilot",notice:{signupUrl:"https://github.com/features/copilot"}},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA",website:"https://cursor.com",notice:{signupUrl:"https://cursor.com"}},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai",notice:{apiKeyUrl:"https://console.x.ai",signupUrl:"https://x.ai"},serviceKinds:["llm","imageToText","webSearch","image"],searchViaChat:{defaultModel:"grok-4.20-reasoning",pricingUrl:"https://x.ai/api#pricing"},authModes:["oauth","apikey"],hasOAuth:!0},kilocode:{id:"kilocode",alias:"kc",name:"Kilo Code",icon:"code",color:"#FF6B35",textIcon:"KC",website:"https://kilocode.ai",notice:{signupUrl:"https://kilocode.ai"}},cline:{id:"cline",alias:"cl",name:"Cline",icon:"smart_toy",color:"#5B9BD5",textIcon:"CL",website:"https://cline.bot",notice:{signupUrl:"https://cline.bot"}}},l={glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL",website:"https://open.bigmodel.cn",notice:{apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys"}},"glm-cn":{id:"glm-cn",alias:"glm-cn",name:"GLM (China)",icon:"code",color:"#DC2626",textIcon:"GC",website:"https://open.bigmodel.cn",notice:{apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys"}},kimi:{id:"kimi",alias:"kimi",name:"Kimi",icon:"psychology",color:"#1E3A8A",textIcon:"KM",website:"https://kimi.moonshot.cn",notice:{apiKeyUrl:"https://platform.moonshot.ai/console/api-keys"},serviceKinds:["llm","webSearch"],searchViaChat:{defaultModel:"kimi-k2.5",pricingUrl:"https://platform.moonshot.ai/docs/pricing/chat"}},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM",website:"https://www.minimaxi.com",notice:{apiKeyUrl:"https://platform.minimaxi.com/user-center/basic-information/interface-key"},serviceKinds:["llm","image","imageToText","webSearch","tts"],searchViaChat:{defaultModel:"MiniMax-M2.7",pricingUrl:"https://www.minimaxi.com/document/price"},ttsConfig:{baseUrl:"https://api.minimax.io/v1/t2a_v2",authType:"apikey",authHeader:"bearer",format:"minimax-tts",models:r}},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC",website:"https://www.minimaxi.com",notice:{apiKeyUrl:"https://platform.minimaxi.com/user-center/basic-information/interface-key"},serviceKinds:["llm","tts"],ttsConfig:{baseUrl:"https://api.minimaxi.com/v1/t2a_v2",authType:"apikey",authHeader:"bearer",format:"minimax-tts",models:r}},alicode:{id:"alicode",alias:"alicode",name:"Alibaba",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://bailian.console.aliyun.com",notice:{apiKeyUrl:"https://bailian.console.aliyun.com/?apiKey=1"}},"alicode-intl":{id:"alicode-intl",alias:"alicode-intl",name:"Alibaba Intl Coding Plan",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://modelstudio.console.alibabacloud.com",notice:{apiKeyUrl:"https://modelstudio.console.alibabacloud.com/?apiKey=1"}},"alims-intl":{id:"alims-intl",alias:"alims-intl",name:"Alibaba Intl Model Studio",icon:"cloud",color:"#FF6A00",textIcon:"AMS",website:"https://modelstudio.console.alibabacloud.com",notice:{apiKeyUrl:"https://modelstudio.console.alibabacloud.com/?apiKey=1"}},"xiaomi-mimo":{id:"xiaomi-mimo",alias:"mimo",name:"Xiaomi MiMo",icon:"smart_toy",color:"#FF6900",textIcon:"XM",website:"https://xiaomimimo.com",notice:{apiKeyUrl:"https://xiaomimimo.com"}},"xiaomi-tokenplan":{id:"xiaomi-tokenplan",alias:"xmtp",name:"Xiaomi MiMo (Token Plan)",icon:"smart_toy",color:"#FF6700",textIcon:"XT",website:"https://mimo.xiaomi.com",notice:{text:"Xiaomi MiMo Token Plan subscription (API key starts with tp-). Token Plan keys are cluster-specific — select the region matching your subscription.",apiKeyUrl:"https://mimo.xiaomi.com"},hasProviderSpecificData:!0,regions:[{id:"sgp",label:"Singapore",baseUrl:"https://token-plan-sgp.xiaomimimo.com/v1"},{id:"cn",label:"China",baseUrl:"https://token-plan-cn.xiaomimimo.com/v1"},{id:"ams",label:"Europe",baseUrl:"https://token-plan-ams.xiaomimimo.com/v1"}],defaultRegion:"sgp"},"volcengine-ark":{id:"volcengine-ark",alias:"ark",name:"Volcengine Ark",icon:"cloud",color:"#1677FF",textIcon:"ARK",website:"https://ark.cn-beijing.volces.com",notice:{apiKeyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey"}},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA",website:"https://platform.openai.com",notice:{apiKeyUrl:"https://platform.openai.com/api-keys"},serviceKinds:["llm","embedding","tts","stt","image","imageToText","webSearch"],thinkingConfig:n.effort,searchViaChat:{defaultModel:"gpt-4o-mini",pricingUrl:"https://openai.com/api/pricing"},ttsConfig:{baseUrl:"https://api.openai.com/v1/audio/speech",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"tts-1",name:"TTS-1"},{id:"tts-1-hd",name:"TTS-1 HD"},{id:"gpt-4o-mini-tts",name:"GPT-4o Mini TTS"}]},sttConfig:{baseUrl:"https://api.openai.com/v1/audio/transcriptions",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"whisper-1",name:"Whisper 1"},{id:"gpt-4o-transcribe",name:"GPT-4o Transcribe"},{id:"gpt-4o-mini-transcribe",name:"GPT-4o Mini Transcribe"}]},embeddingConfig:{baseUrl:"https://api.openai.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"text-embedding-3-small",name:"Text Embedding 3 Small",dimensions:1536},{id:"text-embedding-3-large",name:"Text Embedding 3 Large",dimensions:3072},{id:"text-embedding-ada-002",name:"Text Embedding Ada 002",dimensions:1536}]}},"vercel-ai-gateway":{id:"vercel-ai-gateway",alias:"vercel",name:"Vercel AI Gateway",icon:"deployed_code",color:"#111827",textIcon:"VG",website:"https://vercel.com/ai-gateway",notice:{text:"Unified OpenAI-compatible endpoint from Vercel. Use your AI Gateway API key, then pick models with provider/model IDs like anthropic/claude-sonnet-4.6 or openai/gpt-5.4.",apiKeyUrl:"https://vercel.com/dashboard/~/ai-gateway"},passthroughModels:!0,serviceKinds:["llm"]},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN",website:"https://console.anthropic.com",notice:{apiKeyUrl:"https://console.anthropic.com/settings/keys"},serviceKinds:["llm","imageToText"]},"opencode-go":{id:"opencode-go",alias:"ocg",name:"OpenCode Go",icon:"terminal",color:"#E87040",textIcon:"OC",website:"https://opencode.ai/auth",notice:{text:"OpenCode Go subscription: $5/mo (then $10/mo). Access to Kimi, GLM, Qwen, MiMo, MiniMax models.",apiKeyUrl:"https://opencode.ai/auth"}},azure:{id:"azure",alias:"azure",name:"Azure OpenAI",icon:"cloud",color:"#0078D4",textIcon:"AZ",website:"https://azure.microsoft.com/en-us/products/ai-services/openai-service",notice:{apiKeyUrl:"https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI"},hasProviderSpecificData:!0},deepseek:{id:"deepseek",alias:"ds",name:"DeepSeek",icon:"bolt",color:"#4D6BFE",textIcon:"DS",website:"https://deepseek.com",notice:{apiKeyUrl:"https://platform.deepseek.com/api_keys"}},commandcode:{id:"commandcode",alias:"cmc",name:"Command Code",icon:"smart_toy",color:"#000000",textIcon:"CC",website:"https://commandcode.ai",notice:{text:"Use your CommandCode CLI API key (starts with user_...) from ~/.commandcode/auth.json or commandcode.ai/studio.",apiKeyUrl:"https://commandcode.ai/studio"}},groq:{id:"groq",alias:"groq",name:"Groq",icon:"speed",color:"#F55036",textIcon:"GQ",website:"https://groq.com",notice:{apiKeyUrl:"https://console.groq.com/keys"},serviceKinds:["llm","imageToText","stt"],sttConfig:{baseUrl:"https://api.groq.com/openai/v1/audio/transcriptions",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"whisper-large-v3",name:"Whisper Large v3"},{id:"whisper-large-v3-turbo",name:"Whisper Large v3 Turbo"},{id:"distil-whisper-large-v3-en",name:"Distil Whisper Large v3 EN"}]}},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai",notice:{apiKeyUrl:"https://console.x.ai"},serviceKinds:["llm","imageToText","webSearch","image"],searchViaChat:{defaultModel:"grok-4.20-reasoning",pricingUrl:"https://x.ai/api#pricing"},authModes:["oauth","apikey"],hasOAuth:!0},mistral:{id:"mistral",alias:"mistral",name:"Mistral",icon:"air",color:"#FF7000",textIcon:"MI",website:"https://mistral.ai",notice:{apiKeyUrl:"https://console.mistral.ai/api-keys"},serviceKinds:["llm","imageToText","embedding"],embeddingConfig:{baseUrl:"https://api.mistral.ai/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"mistral-embed",name:"Mistral Embed",dimensions:1024}]}},perplexity:{id:"perplexity",alias:"pplx",name:"Perplexity",icon:"search",color:"#20808D",textIcon:"PP",website:"https://www.perplexity.ai",notice:{apiKeyUrl:"https://www.perplexity.ai/settings/api"},serviceKinds:["llm","webSearch"],searchConfig:{baseUrl:"https://api.perplexity.ai/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.005,freeMonthlyQuota:0,searchTypes:["web"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5}},together:{id:"together",alias:"together",name:"Together AI",icon:"group_work",color:"#0F6FFF",textIcon:"TG",website:"https://www.together.ai",notice:{apiKeyUrl:"https://api.together.xyz/settings/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.together.xyz/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"BAAI/bge-large-en-v1.5",name:"BGE Large EN v1.5",dimensions:1024},{id:"togethercomputer/m2-bert-80M-8k-retrieval",name:"M2 BERT 80M 8K",dimensions:768}]}},fireworks:{id:"fireworks",alias:"fireworks",name:"Fireworks AI",icon:"local_fire_department",color:"#7B2EF2",textIcon:"FW",website:"https://fireworks.ai",notice:{apiKeyUrl:"https://fireworks.ai/account/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.fireworks.ai/inference/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nomic-ai/nomic-embed-text-v1.5",name:"Nomic Embed Text v1.5",dimensions:768}]}},cerebras:{id:"cerebras",alias:"cerebras",name:"Cerebras",icon:"memory",color:"#FF4F00",textIcon:"CB",website:"https://www.cerebras.ai",notice:{apiKeyUrl:"https://cloud.cerebras.ai/platform"}},cohere:{id:"cohere",alias:"cohere",name:"Cohere",icon:"hub",color:"#39594D",textIcon:"CO",website:"https://cohere.com",notice:{apiKeyUrl:"https://dashboard.cohere.com/api-keys"}},nebius:{id:"nebius",alias:"nebius",name:"Nebius AI",icon:"cloud",color:"#6C5CE7",textIcon:"NB",website:"https://nebius.com",notice:{apiKeyUrl:"https://studio.nebius.com/settings/api-keys"},serviceKinds:["llm","embedding"],embeddingConfig:{baseUrl:"https://api.tokenfactory.nebius.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"Qwen/Qwen3-Embedding-8B",name:"Qwen3 Embedding 8B",dimensions:4096}]}},siliconflow:{id:"siliconflow",alias:"siliconflow",name:"SiliconFlow",icon:"cloud_queue",color:"#5B6EF5",textIcon:"SF",website:"https://cloud.siliconflow.com",notice:{apiKeyUrl:"https://cloud.siliconflow.com/account/ak"}},hyperbolic:{id:"hyperbolic",alias:"hyp",name:"Hyperbolic",icon:"bolt",color:"#00D4FF",textIcon:"HY",website:"https://hyperbolic.xyz",notice:{apiKeyUrl:"https://app.hyperbolic.xyz/settings"},serviceKinds:["llm","tts"],ttsConfig:{baseUrl:"https://api.hyperbolic.xyz/v1/audio/generation",authType:"apikey",authHeader:"bearer",format:"hyperbolic",models:[{id:"melo-tts",name:"Melo TTS"}]}},deepgram:{id:"deepgram",alias:"dg",name:"Deepgram",icon:"mic",color:"#13EF93",textIcon:"DG",website:"https://deepgram.com",notice:{text:"$200 free credit on signup (no card required). Aura-1: $0.015/1k chars, Aura-2: $0.030/1k chars (Pay-As-You-Go).",apiKeyUrl:"https://console.deepgram.com/api-keys"},serviceKinds:["stt","imageToText","tts"],ttsConfig:{baseUrl:"https://api.deepgram.com/v1/speak",authType:"apikey",authHeader:"token",format:"deepgram",models:[]},sttConfig:{baseUrl:"https://api.deepgram.com/v1/listen",authType:"apikey",authHeader:"token",format:"deepgram",models:[{id:"nova-3",name:"Nova 3"},{id:"nova-2",name:"Nova 2"},{id:"whisper-large",name:"Whisper Large"}]}},assemblyai:{id:"assemblyai",alias:"aai",name:"AssemblyAI",icon:"record_voice_over",color:"#0062FF",textIcon:"AA",website:"https://assemblyai.com",notice:{apiKeyUrl:"https://www.assemblyai.com/app/api-keys"},serviceKinds:["stt"],sttConfig:{baseUrl:"https://api.assemblyai.com/v2/transcript",authType:"apikey",authHeader:"bearer",format:"assemblyai",async:!0,models:[{id:"universal-3-pro",name:"Universal 3 Pro"},{id:"universal-2",name:"Universal 2"}]}},nanobanana:{id:"nanobanana",alias:"nb",name:"NanoBanana API",icon:"extension",color:"#FFD700",textIcon:"\uD83C\uDF4C",website:"https://nanobananaapi.ai",notice:{text:"3rd-party proxy for Google Nano Banana (Gemini 2.5/3 Flash Image). For official, use Gemini provider.",apiKeyUrl:"https://nanobananaapi.ai/dashboard"},serviceKinds:["image"]},elevenlabs:{id:"elevenlabs",alias:"el",name:"ElevenLabs",icon:"record_voice_over",color:"#6C47FF",textIcon:"EL",website:"https://elevenlabs.io",notice:{apiKeyUrl:"https://elevenlabs.io/app/settings/api-keys"},serviceKinds:["tts"],ttsConfig:{baseUrl:"https://api.elevenlabs.io/v1/text-to-speech",authType:"apikey",authHeader:"xi-api-key",format:"elevenlabs",models:[{id:"eleven_multilingual_v2",name:"Eleven Multilingual v2"},{id:"eleven_turbo_v2_5",name:"Eleven Turbo v2.5"}]}},cartesia:{id:"cartesia",alias:"cartesia",name:"Cartesia",icon:"spatial_audio",color:"#FF4F8B",textIcon:"CA",website:"https://cartesia.ai",notice:{apiKeyUrl:"https://play.cartesia.ai/keys"},serviceKinds:["tts"],hidden:!0,ttsConfig:{baseUrl:"https://api.cartesia.ai/tts/bytes",authType:"apikey",authHeader:"x-api-key",format:"cartesia",models:[{id:"sonic-2",name:"Sonic 2"},{id:"sonic-3",name:"Sonic 3"}]}},playht:{id:"playht",alias:"playht",name:"PlayHT",icon:"play_circle",color:"#00B4D8",textIcon:"PH",website:"https://play.ht",notice:{apiKeyUrl:"https://play.ht/studio/api-access"},serviceKinds:["tts"],hidden:!0,ttsConfig:{baseUrl:"https://api.play.ht/api/v2/tts/stream",authType:"apikey",authHeader:"playht",format:"playht",models:[{id:"PlayDialog",name:"PlayDialog"},{id:"Play3.0-mini",name:"Play 3.0 Mini"}]}},"local-device":{id:"local-device",alias:"local-device",name:"Local Device",icon:"speaker",color:"#64748B",textIcon:"LD",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"local-device",authType:"none",authHeader:"none",format:"local-device",models:[]}},"google-tts":{id:"google-tts",alias:"google-tts",name:"Google TTS",icon:"record_voice_over",color:"#4285F4",textIcon:"GT",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"google-tts",authType:"none",authHeader:"none",format:"google-tts",models:[]}},"edge-tts":{id:"edge-tts",alias:"edge-tts",name:"Edge TTS",icon:"record_voice_over",color:"#0078D4",textIcon:"ET",mediaPriority:5,serviceKinds:["tts"],noAuth:!0,ttsConfig:{baseUrl:"edge-tts",authType:"none",authHeader:"none",format:"edge-tts",models:[]}},coqui:{id:"coqui",alias:"coqui",name:"Coqui TTS",icon:"record_voice_over",color:"#10B981",textIcon:"CQ",website:"https://github.com/coqui-ai/TTS",serviceKinds:["tts"],hidden:!0,noAuth:!0,ttsConfig:{baseUrl:"http://localhost:5002/api/tts",authType:"none",authHeader:"none",format:"coqui",models:[{id:"tts_models/en/ljspeech/tacotron2-DDC",name:"Tacotron2 DDC (LJSpeech)"}]}},tortoise:{id:"tortoise",alias:"tortoise",name:"Tortoise TTS",icon:"record_voice_over",color:"#7C3AED",textIcon:"TT",website:"https://github.com/neonbjb/tortoise-tts",serviceKinds:["tts"],hidden:!0,noAuth:!0,ttsConfig:{baseUrl:"http://localhost:5000/api/tts",authType:"none",authHeader:"none",format:"tortoise",models:[{id:"tortoise-v2",name:"Tortoise v2"}]}},inworld:{id:"inworld",alias:"inworld",name:"Inworld TTS",icon:"record_voice_over",color:"#FF6B6B",textIcon:"IW",website:"https://inworld.ai",notice:{text:"Free tier: 40 minutes/month TTS. Paid: TTS-1.5 Mini $0.01/min ($15/1M chars), TTS-1.5 Max $0.025/min ($30/1M chars). 270+ voices, 15 languages.",apiKeyUrl:"https://platform.inworld.ai/api-keys"},serviceKinds:["tts"],ttsConfig:{baseUrl:"https://api.inworld.ai/tts/v1/voice",authType:"apikey",authHeader:"basic",format:"inworld",models:[{id:"inworld-tts-1.5-mini",name:"Inworld TTS 1.5 Mini ($0.01/min)"},{id:"inworld-tts-1.5-max",name:"Inworld TTS 1.5 Max ($0.025/min)"}]}},"voyage-ai":{id:"voyage-ai",alias:"voyage",name:"Voyage AI",icon:"data_array",color:"#0EA5E9",textIcon:"VG",website:"https://www.voyageai.com",notice:{apiKeyUrl:"https://dash.voyageai.com/api-keys"},serviceKinds:["embedding"],embeddingConfig:{baseUrl:"https://api.voyageai.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"voyage-3-large",name:"Voyage 3 Large",dimensions:1024},{id:"voyage-3.5",name:"Voyage 3.5",dimensions:1024},{id:"voyage-3.5-lite",name:"Voyage 3.5 Lite",dimensions:1024},{id:"voyage-code-3",name:"Voyage Code 3",dimensions:1024},{id:"voyage-finance-2",name:"Voyage Finance 2",dimensions:1024},{id:"voyage-law-2",name:"Voyage Law 2",dimensions:1024},{id:"voyage-multilingual-2",name:"Voyage Multilingual 2",dimensions:1024}]}},sdwebui:{id:"sdwebui",alias:"sdwebui",name:"SD WebUI",icon:"brush",color:"#FF7043",textIcon:"SD",website:"https://github.com/AUTOMATIC1111/stable-diffusion-webui",serviceKinds:["image"]},comfyui:{id:"comfyui",alias:"comfyui",name:"ComfyUI",icon:"account_tree",color:"#4CAF50",textIcon:"CF",website:"https://github.com/comfyanonymous/ComfyUI",serviceKinds:["image"]},huggingface:{id:"huggingface",alias:"hf",name:"HuggingFace",icon:"face",color:"#FFD21E",textIcon:"HF",website:"https://huggingface.co",notice:{apiKeyUrl:"https://huggingface.co/settings/tokens"},serviceKinds:["image","imageToText","tts","stt"],hiddenKinds:["tts"],ttsConfig:{baseUrl:"https://api-inference.huggingface.co/models",authType:"apikey",authHeader:"bearer",format:"huggingface-tts",models:[{id:"facebook/mms-tts-eng",name:"MMS TTS English"},{id:"microsoft/speecht5_tts",name:"SpeechT5 TTS"}]},sttConfig:{baseUrl:"https://api-inference.huggingface.co/models",authType:"apikey",authHeader:"bearer",format:"huggingface-asr",models:[{id:"openai/whisper-large-v3",name:"Whisper Large v3 (HF)"},{id:"openai/whisper-small",name:"Whisper Small (HF)"}]}},blackbox:{id:"blackbox",alias:"bb",name:"Blackbox AI",icon:"smart_toy",color:"#5B5FEF",textIcon:"BB",website:"https://blackbox.ai",notice:{apiKeyUrl:"https://www.blackbox.ai/api-management"},serviceKinds:["llm"]},chutes:{id:"chutes",alias:"ch",name:"Chutes AI",icon:"water_drop",color:"#ffffffff",textIcon:"CH",website:"https://chutes.ai",notice:{apiKeyUrl:"https://chutes.ai/app/api"}},"ollama-local":{id:"ollama-local",alias:"ollama-local",name:"Ollama Local",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com"},"vertex-partner":{id:"vertex-partner",alias:"vxp",name:"Vertex Partner",icon:"cloud",color:"#34A853",textIcon:"VP",website:"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models",notice:{apiKeyUrl:"https://console.cloud.google.com/iam-admin/serviceaccounts"}},tavily:{id:"tavily",alias:"tavily",name:"Tavily",icon:"search",color:"#5B21B6",textIcon:"TV",website:"https://tavily.com",notice:{apiKeyUrl:"https://app.tavily.com/home"},serviceKinds:["webSearch","webFetch"],searchConfig:{baseUrl:"https://api.tavily.com/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.008,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5},fetchConfig:{baseUrl:"https://api.tavily.com/extract",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.008,freeMonthlyQuota:1e3,formats:["markdown","text"],maxCharacters:1e5,timeoutMs:15e3}},"brave-search":{id:"brave-search",alias:"brave",name:"Brave Search",icon:"travel_explore",color:"#FB542B",textIcon:"BR",website:"https://brave.com/search/api",notice:{apiKeyUrl:"https://api-dashboard.search.brave.com/app/keys"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://api.search.brave.com/res/v1",method:"GET",authType:"apikey",authHeader:"x-subscription-token",costPerQuery:.005,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:20,timeoutMs:1e4,cacheTTLMs:3e5}},serper:{id:"serper",alias:"serper",name:"Serper",icon:"search",color:"#4F46E5",textIcon:"SP",website:"https://serper.dev",notice:{apiKeyUrl:"https://serper.dev/api-key"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://google.serper.dev",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.001,freeMonthlyQuota:2500,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},exa:{id:"exa",alias:"exa",name:"Exa",icon:"manage_search",color:"#2563EB",textIcon:"EX",website:"https://exa.ai",notice:{apiKeyUrl:"https://dashboard.exa.ai/api-keys"},serviceKinds:["webSearch","webFetch"],searchConfig:{baseUrl:"https://api.exa.ai/search",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.007,freeMonthlyQuota:1e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5},fetchConfig:{baseUrl:"https://api.exa.ai/contents",method:"POST",authType:"apikey",authHeader:"x-api-key",costPerQuery:.001,freeMonthlyQuota:1e3,formats:["text","markdown"],maxCharacters:1e5,timeoutMs:15e3}},searxng:{id:"searxng",alias:"searxng",name:"SearXNG",icon:"saved_search",color:"#3B82F6",textIcon:"SX",website:"https://docs.searxng.org",serviceKinds:["webSearch"],noAuth:!0,searchConfig:{baseUrl:"http://localhost:8888/search",method:"GET",authType:"none",authHeader:"none",costPerQuery:0,freeMonthlyQuota:999999,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:50,timeoutMs:1e4,cacheTTLMs:18e4}},"google-pse":{id:"google-pse",alias:"gpse",name:"Google PSE",icon:"search",color:"#4285F4",textIcon:"GP",website:"https://programmablesearchengine.google.com",notice:{apiKeyUrl:"https://programmablesearchengine.google.com/controlpanel/create"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://www.googleapis.com/customsearch/v1",method:"GET",authType:"apikey",authHeader:"key",costPerQuery:.005,freeMonthlyQuota:3e3,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:10,timeoutMs:1e4,cacheTTLMs:3e5}},linkup:{id:"linkup",alias:"linkup",name:"Linkup",icon:"link",color:"#0EA5E9",textIcon:"LK",website:"https://linkup.so",notice:{apiKeyUrl:"https://app.linkup.so/api-keys"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://api.linkup.so/v1/search",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.005,freeMonthlyQuota:1e3,searchTypes:["web"],defaultMaxResults:5,maxMaxResults:50,timeoutMs:1e4,cacheTTLMs:3e5}},searchapi:{id:"searchapi",alias:"searchapi",name:"SearchAPI",icon:"search",color:"#0EA5A4",textIcon:"SA",website:"https://www.searchapi.io",notice:{apiKeyUrl:"https://www.searchapi.io/dashboard"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://www.searchapi.io/api/v1/search",method:"GET",authType:"apikey",authHeader:"api_key",costPerQuery:.004,freeMonthlyQuota:100,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},youcom:{id:"youcom",alias:"youcom",name:"You.com Search",icon:"search",color:"#7C3AED",textIcon:"YC",website:"https://you.com",notice:{apiKeyUrl:"https://api.you.com"},serviceKinds:["webSearch"],searchConfig:{baseUrl:"https://ydc-index.io/v1/search",method:"GET",authType:"apikey",authHeader:"x-api-key",costPerQuery:.005,freeMonthlyQuota:0,searchTypes:["web","news"],defaultMaxResults:5,maxMaxResults:100,timeoutMs:1e4,cacheTTLMs:3e5}},firecrawl:{id:"firecrawl",alias:"firecrawl",name:"Firecrawl",icon:"local_fire_department",color:"#F59E0B",textIcon:"FC",website:"https://firecrawl.dev",notice:{apiKeyUrl:"https://www.firecrawl.dev/app/api-keys"},serviceKinds:["webFetch"],fetchConfig:{baseUrl:"https://api.firecrawl.dev/v1/scrape",method:"POST",authType:"apikey",authHeader:"bearer",costPerQuery:.002,freeMonthlyQuota:500,formats:["markdown","html","text"],maxCharacters:2e5,timeoutMs:3e4}},"fal-ai":{id:"fal-ai",alias:"fal",name:"Fal.ai",icon:"image",color:"#2563EB",textIcon:"FL",website:"https://fal.ai",notice:{apiKeyUrl:"https://fal.ai/dashboard/keys"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.fal.ai/v1/models?limit=1",method:"GET",authType:"apikey",authHeader:"key"}},"stability-ai":{id:"stability-ai",alias:"stability",name:"Stability AI",icon:"image",color:"#8B5CF6",textIcon:"SA",website:"https://stability.ai",notice:{apiKeyUrl:"https://platform.stability.ai/account/keys"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.stability.ai/v1/user/account",method:"GET",authType:"apikey",authHeader:"bearer"}},"black-forest-labs":{id:"black-forest-labs",alias:"bfl",name:"Black Forest Labs",icon:"image",color:"#111827",textIcon:"BF",website:"https://blackforestlabs.ai",notice:{apiKeyUrl:"https://api.bfl.ai"},serviceKinds:["image"],imageConfig:{baseUrl:"https://api.bfl.ai/v1/get_result?id=ping",method:"GET",authType:"apikey",authHeader:"x-key"}},recraft:{id:"recraft",alias:"recraft",name:"Recraft",icon:"image",color:"#EC4899",textIcon:"RC",website:"https://recraft.ai",notice:{apiKeyUrl:"https://www.recraft.ai/profile/api"},serviceKinds:["image"],imageConfig:{baseUrl:"https://external.api.recraft.ai/v1/users/me",method:"GET",authType:"apikey",authHeader:"bearer"}},topaz:{id:"topaz",alias:"topaz",name:"Topaz",icon:"image",color:"#059669",textIcon:"TP",website:"https://topazlabs.com",notice:{apiKeyUrl:"https://topazlabs.com/account"},serviceKinds:["image"]},runwayml:{id:"runwayml",alias:"runway",name:"Runway ML",icon:"movie",color:"#000000",textIcon:"RW",website:"https://runwayml.com",notice:{apiKeyUrl:"https://dev.runwayml.com"},serviceKinds:["image","video"],imageConfig:{baseUrl:"https://api.dev.runwayml.com/v1/organization",method:"GET",authType:"apikey",authHeader:"bearer",extraHeaders:{"X-Runway-Version":"2024-11-06"}}},"aws-polly":{id:"aws-polly",alias:"polly",name:"AWS Polly",icon:"record_voice_over",color:"#FF9900",textIcon:"PL",website:"https://aws.amazon.com/polly/",notice:{text:"Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region.",apiKeyUrl:"https://console.aws.amazon.com/iam/home#/security_credentials"},serviceKinds:["tts"],hasProviderSpecificData:!0,ttsConfig:{baseUrl:"https://polly.{region}.amazonaws.com/v1/speech",authType:"apikey",authHeader:"aws-sigv4",format:"aws-polly",models:[{id:"standard",name:"Standard"},{id:"neural",name:"Neural"},{id:"long-form",name:"Long-form"},{id:"generative",name:"Generative"}]}},"jina-ai":{id:"jina-ai",alias:"jina",name:"Jina AI",icon:"blur_on",color:"#2563EB",textIcon:"JA",website:"https://jina.ai",notice:{text:"10M free tokens on signup (non-commercial), no credit card required.",apiKeyUrl:"https://jina.ai/?sui=apikey"},serviceKinds:["embedding"],embeddingConfig:{baseUrl:"https://api.jina.ai/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"jina-embeddings-v3",name:"Jina Embeddings v3",dimensions:1024},{id:"jina-embeddings-v2-base-en",name:"Jina Embeddings v2 Base EN",dimensions:768},{id:"jina-embeddings-v2-base-code",name:"Jina Embeddings v2 Base Code",dimensions:768}]}},"jina-reader":{id:"jina-reader",alias:"jina",name:"Jina Reader",icon:"menu_book",color:"#000000",textIcon:"JR",website:"https://jina.ai/reader",notice:{apiKeyUrl:"https://jina.ai/?sui=apikey"},serviceKinds:["webFetch"],fetchConfig:{baseUrl:"https://r.jina.ai",method:"GET",authType:"apikey",authHeader:"bearer",costPerQuery:0,freeMonthlyQuota:1e6,formats:["markdown","text","html"],maxCharacters:2e5,timeoutMs:3e4}}},d={"grok-web":{id:"grok-web",alias:"gw",name:"Grok Web (Subscription)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"GW",website:"https://grok.com",authType:"cookie",authHint:"Paste your sso= cookie value from grok.com",passthroughModels:!0,serviceKinds:["llm"]},"perplexity-web":{id:"perplexity-web",alias:"pw",name:"Perplexity Web (Pro/Max)",icon:"search",color:"#20808D",textIcon:"PW",website:"https://www.perplexity.ai",authType:"cookie",authHint:"Paste your __Secure-next-auth.session-token cookie value from perplexity.ai",serviceKinds:["llm"]}},m=[{id:"embedding",label:"Embedding",icon:"data_array",endpoint:{method:"POST",path:"/v1/embeddings"}},{id:"image",label:"Text to Image",icon:"brush",endpoint:{method:"POST",path:"/v1/images/generations"}},{id:"imageToText",label:"Image to Text",icon:"image_search",endpoint:{method:"POST",path:"/v1/images/understanding"}},{id:"tts",label:"Text To Speech",icon:"record_voice_over",endpoint:{method:"POST",path:"/v1/audio/speech"}},{id:"stt",label:"Speech To Text",icon:"mic",endpoint:{method:"POST",path:"/v1/audio/transcriptions"}},{id:"webSearch",label:"Web Search",icon:"travel_explore",endpoint:{method:"POST",path:"/v1/search"}},{id:"webFetch",label:"Web Fetch",icon:"language",endpoint:{method:"POST",path:"/v1/web/fetch"}},{id:"video",label:"Video",icon:"movie",endpoint:{method:"POST",path:"/v1/video/generations"}},{id:"music",label:"Music",icon:"music_note",endpoint:{method:"POST",path:"/v1/audio/music"}}],p="openai-compatible-",h="anthropic-compatible-",u=Object.freeze({GENERIC:"generic",LLAMA_CPP:"llamacpp",VLLM:"vllm",OLLAMA:"ollama"}),g=u.LLAMA_CPP,b=[{value:u.GENERIC,label:"Generic OpenAI-compatible",description:"Only standard request fields are forwarded. Thinking/reasoning-specific fields are not injected."},{value:u.LLAMA_CPP,label:"llama.cpp / llama-server",description:"Supports chat_template_kwargs.enable_thinking and reasoning_budget for Qwen-style thinking control."},{value:u.VLLM,label:"vLLM",description:"Supports chat_template_kwargs.enable_thinking and maps reasoning budget to thinking_token_budget."},{value:u.OLLAMA,label:"Ollama OpenAI-compatible",description:"Uses standard OpenAI-compatible fields only. Thinking/reasoning fields are not injected."}];function y(e){return"string"==typeof e&&e.startsWith(p)}function v(e){return"string"==typeof e&&e.startsWith(h)}function f(e){return"string"==typeof e&&e.startsWith("custom-embedding-")}function x(e){return"string"==typeof e&&e.startsWith("custom-stt-")}function w(e){return"string"==typeof e&&e.startsWith("custom-tts-")}Object.freeze({generic:u.GENERIC,default:u.GENERIC,openai:u.GENERIC,strict:u.GENERIC,llama:u.LLAMA_CPP,llamacpp:u.LLAMA_CPP,"llama.cpp":u.LLAMA_CPP,"llama-cpp":u.LLAMA_CPP,"llama-server":u.LLAMA_CPP,llamaserver:u.LLAMA_CPP,vllm:u.VLLM,"v-llm":u.VLLM,ollama:u.OLLAMA,"ollama-openai":u.OLLAMA});let k={...o,...s,...c,...l,...d},T={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"},cookie:{id:"cookie",name:"Browser Cookie",icon:"cookie"}};function C(e){for(let i of Object.values(k))if(i.alias===e||i.id===e)return i;return null}function M(e){let i=C(e);return i?.id||e}function U(e){let i=k[e];return i?.alias||e}function I(e){return Object.values(k).filter(i=>!(!(i.serviceKinds??["llm"]).includes(e)||i.hidden||i.hiddenKinds?.includes(e))).sort((e,i)=>(e.mediaPriority??100)-(i.mediaPriority??100))}Object.values(k).reduce((e,i)=>(e[i.alias]=i.id,e),{}),Object.values(k).reduce((e,i)=>(e[i.id]=i.alias,e),{});let K=["claude","antigravity","kiro","github","codex","kimi-coding","ollama","gemini-cli","glm","glm-cn","minimax","minimax-cn"]},90620:(e,i,a)=>{a.d(i,{Q2:()=>t.Q2,fg:()=>t.fg,vQ:()=>o,MA:()=>t.MA,UY:()=>c,Nu:()=>s,zN:()=>t.zN,X3:()=>l,B2:()=>r,h0:()=>n});var t=a(52679);a(28777);let o={name:"AI Router Gateway",description:"AI Infrastructure Management",version:"5.4.2"},s={changelogUrl:"https://raw.githubusercontent.com/decolua/bluerouter/refs/heads/master/CHANGELOG.md",donateUrl:"https://bluerouter.com/api/donate"},n={npmPackageName:"@jheavenknows/bluerouter",installCmd:"npm i -g @jheavenknows/bluerouter",installCmdLatest:"npm install -g @jheavenknows/bluerouter@latest",shutdownCountdownSec:3,exitDelayMs:500,statusPort:20129,statusPollIntervalMs:1e3,statusLogTailLines:8,installRetries:3,installRetryDelayMs:5e3,lingerAfterDoneMs:3e4,waitForExitMinMs:5e3,waitForExitMaxMs:2e4,waitForExitCheckMs:500,appPort:20128},r={storageKey:"theme",defaultTheme:"system"},c={maxLines:200,pollIntervalMs:1e3},l={openrouter:"https://openrouter.ai/api/v1/chat/completions",glm:"https://api.z.ai/api/anthropic/v1/messages","glm-cn":"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",kimi:"https://api.kimi.com/coding/v1/messages",minimax:"https://api.minimax.io/anthropic/v1/messages","minimax-cn":"https://api.minimaxi.com/anthropic/v1/messages",alicode:"https://coding.dashscope.aliyuncs.com/v1/chat/completions","alicode-intl":"https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions","alims-intl":"https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions","volcengine-ark":"https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions",byteplus:"https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions",openai:"https://api.openai.com/v1/chat/completions","vercel-ai-gateway":"https://ai-gateway.vercel.sh/v1/chat/completions",anthropic:"https://api.anthropic.com/v1/messages",gemini:"https://generativelanguage.googleapis.com/v1beta/models",ollama:"https://ollama.com/api/chat","ollama-local":"http://localhost:11434/api/chat"}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7226],{31474:(e,t,s)=>{"use strict";function r(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}s.d(t,{cn:()=>r})},46442:(e,t,s)=>{"use strict";s.d(t,{j:()=>n,t:()=>i});var r=s(95155),a=s(12115);let l=(0,a.createContext)(null);function n({resolver:e,children:t}){return(0,r.jsx)(l.Provider,{value:"function"==typeof e?e:null,children:t})}function i(){return(0,a.useContext)(l)}},72762:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>w});var r=s(95155),a=s(12115),l=s(81127);let n=new Set(["coder","coder-fast","coder-high","translator"]);function i(e,t=1){let s=Number(e);return Number.isFinite(s)?s.toLocaleString("vi-VN",{minimumFractionDigits:t,maximumFractionDigits:t}):"—"}function o(e){if(!e)return"—";let t=new Date(e);return Number.isFinite(t.getTime())?t.toLocaleTimeString("vi-VN",{hour12:!1}):"—"}function d(e){return String(e||"").trim()}function c({name:e,className:t=""}){return(0,r.jsx)("span",{className:`material-symbols-outlined ${t}`,children:e})}function x({icon:e,label:t,value:s,detail:a,tone:l="blue"}){let n={blue:"bg-blue-500/10 text-blue-500",violet:"bg-violet-500/10 text-violet-500",cyan:"bg-cyan-500/10 text-cyan-500",emerald:"bg-emerald-500/10 text-emerald-500",amber:"bg-amber-500/10 text-amber-500"};return(0,r.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:`flex h-10 w-10 items-center justify-center rounded-xl ${n[l]||n.blue}`,children:(0,r.jsx)(c,{name:e,className:"text-[22px]"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-text-subtle",children:t}),(0,r.jsx)("div",{className:"mt-0.5 truncate text-lg font-bold text-text-main",children:s})]})]}),a?(0,r.jsx)("div",{className:"mt-2 truncate text-[11px] text-text-muted",children:a}):null]})}function m({icon:e,label:t,value:s,suffix:a=""}){return(0,r.jsxs)("div",{className:"rounded-xl border border-border-subtle bg-background/60 px-3 py-2.5",children:[(0,r.jsxs)("div",{className:"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-subtle",children:[(0,r.jsx)(c,{name:e,className:"text-[14px]"}),t]}),(0,r.jsxs)("div",{className:"mt-1 text-sm font-semibold text-text-main",children:[s,a]})]})}function u({status:e="unknown",label:t}){let s={live:"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",stale:"bg-red-500/10 text-red-600 dark:text-red-400",partial:"bg-amber-500/10 text-amber-700 dark:text-amber-300",unknown:"bg-surface-2 text-text-muted"},a={live:"bg-emerald-500",stale:"bg-red-500",partial:"bg-amber-500",unknown:"bg-text-subtle"};return(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-semibold ${s[e]||s.unknown}`,children:[(0,r.jsx)("span",{className:`h-1.5 w-1.5 rounded-full ${a[e]||a.unknown}`}),t]})}function p(e=[]){if(!e.length)return"Chưa c\xf3 GPU telemetry";let t=[...new Set(e.map(e=>d(e.name)).filter(Boolean))];return 1===t.length?`${e.length}\xd7 ${t[0]}`:`${e.length} GPU \xb7 ${t.join(" + ")}`}function b(e,t,s){let r,a=e?.resourceServerId?t.get(e.resourceServerId):null,l=e?.resourceServerId?s.get(e.resourceServerId):null,n=function(e,t){if(!t)return null;let s=t.vllm?.instances||[];if(e?.vllmInstanceKey){let t=s.find(t=>t.key===e.vllmInstanceKey);if(t)return t}if(e?.port){let t=s.filter(t=>Number(t.port||0)===Number(e.port||0));if(1===t.length)return t[0]}return null}(e,l),i=!!(r=l?.lastStatusAt?new Date(l.lastStatusAt).getTime():0)&&Date.now()-r<=3e4&&!l?.lastError&&!!n&&!1!==n.metricsAvailable;return{server:a,liveServer:l,instance:n,online:i}}function h({backend:e,serverMap:t,liveMap:s}){let{server:a,liveServer:l,instance:n,online:o}=b(e,t,s),d=l?.gpus?.length?l.gpus:a?.gpus||[],x=e?.resourceMatch,g=n?.models?.length?n.models:e?.reportedModels||[];return(0,r.jsxs)("div",{className:"group relative overflow-hidden rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)] transition hover:-translate-y-0.5 hover:border-primary/30 hover:shadow-lg",children:[(0,r.jsx)("div",{className:"absolute inset-x-0 top-0 h-0.5 bg-gradient-to-r from-cyan-500 via-primary to-violet-500 opacity-70"}),(0,r.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-500",children:(0,r.jsx)(c,{name:"memory",className:"text-[22px]"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsxs)("div",{className:"font-mono text-sm font-bold text-text-main",children:[e?.host||"—",":",e?.port||"—"]}),e?.weight?(0,r.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-violet-500/10 px-2 py-0.5 text-[10px] font-semibold text-violet-600 dark:text-violet-300",children:[(0,r.jsx)(c,{name:"balance",className:"text-[13px]"}),"weight ",e.weight]}):null]}),(0,r.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:e?.label||a?.name||"Real vLLM endpoint"})]})]}),(0,r.jsx)(u,{status:o?"live":"host"===x?"partial":"unmatched"===x?"unknown":"stale",label:o?"Live vLLM":"host"===x?"Host found \xb7 port unresolved":"unmatched"===x?"Not monitored":"Offline / stale"})]}),(0,r.jsxs)("div",{className:"mt-4 rounded-xl border border-border-subtle bg-surface-2/45 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-text-main",children:[(0,r.jsx)(c,{name:"dns",className:"text-[17px] text-primary"}),(0,r.jsx)("span",{className:"truncate",children:a?.name||"Chưa map Resource Monitor"})]}),(0,r.jsx)("div",{className:"mt-1 truncate font-mono text-[11px] text-text-muted",children:a?`${a.host}:${a.agentPort}`:"Kh\xf4ng t\xecm thấy server monitor khớp host"}),(0,r.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-xs text-text-muted",children:[(0,r.jsx)(c,{name:"developer_board",className:"text-[16px]"}),(0,r.jsx)("span",{className:"truncate",children:p(d)})]})]}),(0,r.jsxs)("div",{className:"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-4",children:[(0,r.jsx)(m,{icon:"speed",label:"Out tok/s",value:i(n?.outputTokensPerSecond)}),(0,r.jsx)(m,{icon:"play_circle",label:"Running",value:i(n?.running,0)}),(0,r.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:i(n?.waiting,0)}),(0,r.jsx)(m,{icon:"database",label:"KV cache",value:i(n?.kvCacheUsagePercent),suffix:n?.kvCacheUsagePercent==null?"":"%"})]}),g.length?(0,r.jsxs)("div",{className:"mt-3 flex items-start gap-2 text-[11px] text-text-subtle",children:[(0,r.jsx)(c,{name:"neurology",className:"mt-0.5 text-[15px]"}),(0,r.jsx)("span",{className:"min-w-0 break-all",children:g.join(", ")})]}):null]})}function g(e,t,s){let r=0,a=!1,l=0,n=0,i=null,o=0;for(let d of e||[]){let e=b(d,t,s);e.online&&(o+=1);let c=Number(e.instance?.outputTokensPerSecond);Number.isFinite(c)&&(r+=c,a=!0),l+=Number(e.instance?.running||0),n+=Number(e.instance?.waiting||0);let x=Number(e.instance?.kvCacheUsagePercent);Number.isFinite(x)&&(i=null===i?x:Math.max(i,x))}return{output:a?r:null,running:l,waiting:n,maxKv:i,online:o,total:(e||[]).length}}function f({target:e,provider:t,serverMap:s,liveMap:a,onEdit:l}){if(!t)return(0,r.jsx)("div",{className:"rounded-2xl border border-amber-500/25 bg-amber-500/5 p-5",children:(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-amber-500/10 text-amber-500",children:(0,r.jsx)(c,{name:"link_off",className:"text-[22px]"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"font-semibold text-text-main",children:e.label||e.model||"Unknown target"}),(0,r.jsx)("div",{className:"mt-1 font-mono text-xs text-text-muted",children:e.model||"—"}),(0,r.jsx)("div",{className:"mt-3 text-xs leading-5 text-amber-700 dark:text-amber-300",children:e.unresolvedReason||"Kh\xf4ng map được target sang local compatible provider."})]})]})});let n="proxy"===t.routeType,o=g(t.backends||[],s,a),d=t.gateway?.resourceServerId?s.get(t.gateway.resourceServerId):null;return(0,r.jsxs)("div",{className:"overflow-hidden rounded-3xl border border-border bg-surface shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"relative overflow-hidden border-b border-border bg-gradient-to-r from-primary/8 via-surface to-cyan-500/8 px-5 py-4",children:[(0,r.jsx)("div",{className:"absolute -right-12 -top-16 h-40 w-40 rounded-full bg-primary/5 blur-2xl"}),(0,r.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-4",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-start gap-3",children:[(0,r.jsx)("div",{className:`flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl ${n?"bg-violet-500/10 text-violet-500":"bg-blue-500/10 text-blue-500"}`,children:(0,r.jsx)(c,{name:n?"account_tree":"memory",className:"text-[24px]"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("div",{className:"text-base font-bold text-text-main",children:t.name}),(0,r.jsx)("span",{className:"rounded-full bg-primary/10 px-2.5 py-1 font-mono text-[10px] font-semibold text-primary",children:t.prefix}),(0,r.jsxs)("span",{className:`inline-flex items-center gap-1 rounded-full px-2.5 py-1 text-[10px] font-semibold ${n?"bg-violet-500/10 text-violet-600 dark:text-violet-300":"bg-blue-500/10 text-blue-600 dark:text-blue-300"}`,children:[(0,r.jsx)(c,{name:n?"hub":"developer_board",className:"text-[13px]"}),n?"Proxy / Load Balancer":"Direct vLLM"]})]}),(0,r.jsx)("div",{className:"mt-1.5 truncate font-mono text-xs text-text-muted",title:t.baseUrl,children:t.baseUrl||"—"}),(0,r.jsxs)("div",{className:"mt-2 flex flex-wrap items-center gap-2 text-[11px] text-text-subtle",children:[(0,r.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,r.jsx)(c,{name:"model_training",className:"text-[14px]"}),e.model||"—"]}),t.topologyConfigured?(0,r.jsxs)("span",{className:"inline-flex items-center gap-1 text-emerald-600 dark:text-emerald-400",children:[(0,r.jsx)(c,{name:"verified",className:"text-[14px]"})," custom topology"]}):null]})]})]}),(0,r.jsxs)("button",{type:"button",onClick:()=>l(t),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2 text-xs font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:bg-primary/5 hover:text-primary",children:[(0,r.jsx)(c,{name:"tune",className:"text-[17px]"}),"Edit topology"]})]})]}),(0,r.jsx)("div",{className:"p-5",children:n?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"grid gap-3 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,1fr)]",children:[(0,r.jsxs)("div",{className:"rounded-2xl border border-violet-500/20 bg-violet-500/5 p-4",children:[(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,r.jsx)(c,{name:"lan",className:"text-[22px]"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-violet-500",children:"Ingress / routing hop"}),(0,r.jsxs)("div",{className:"mt-1 truncate font-mono text-sm font-bold text-text-main",children:[t.gateway?.host||t.endpoint?.host||"—",":",t.gateway?.port||t.endpoint?.port||"—"]}),(0,r.jsx)("div",{className:"mt-1 truncate text-xs text-text-muted",children:d?`${d.name} \xb7 monitored host`:"Nginx / proxy endpoint"})]})]}),(0,r.jsx)("div",{className:"mt-3 rounded-xl bg-background/70 px-3 py-2.5 text-[11px] leading-5 text-text-muted",children:"GPU/vLLM metrics của gateway n\xe0y kh\xf4ng được t\xednh l\xe0 compute. Telemetry b\xean dưới lấy từ c\xe1c real endpoint đ\xe3 khai b\xe1o."})]}),(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4 lg:grid-cols-2",children:[(0,r.jsx)(m,{icon:"speed",label:"Pool out",value:i(o.output),suffix:null==o.output?"":" tok/s"}),(0,r.jsx)(m,{icon:"memory",label:"Backends live",value:`${o.online}/${o.total}`}),(0,r.jsx)(m,{icon:"play_circle",label:"Running",value:i(o.running,0)}),(0,r.jsx)(m,{icon:"hourglass_top",label:"Waiting",value:i(o.waiting,0)})]})]}),(0,r.jsxs)("div",{className:"my-4 flex items-center gap-3",children:[(0,r.jsx)("div",{className:"h-px flex-1 bg-border"}),(0,r.jsxs)("div",{className:"inline-flex items-center gap-2 rounded-full bg-surface-2 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-[0.12em] text-text-muted",children:[(0,r.jsx)(c,{name:"call_split",className:"text-[15px] text-primary"}),"Real vLLM backend pool"]}),(0,r.jsx)("div",{className:"h-px flex-1 bg-border"})]}),t.backends?.length?(0,r.jsx)("div",{className:"grid gap-3 xl:grid-cols-3",children:t.backends.map(e=>(0,r.jsx)(h,{backend:e,serverMap:s,liveMap:a},e.id))}):(0,r.jsx)("div",{className:"rounded-2xl border border-dashed border-amber-500/30 bg-amber-500/5 p-6 text-center text-sm text-amber-700 dark:text-amber-300",children:"Proxy chưa c\xf3 real vLLM endpoint. Bấm Edit topology để khai b\xe1o backend pool."})]}):t.backends?.[0]?(0,r.jsxs)("div",{className:"grid gap-4 lg:grid-cols-[220px_48px_minmax(0,1fr)] lg:items-center",children:[(0,r.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 p-4",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs font-semibold text-blue-600 dark:text-blue-300",children:[(0,r.jsx)(c,{name:"route",className:"text-[18px]"}),"Provider Base URL"]}),(0,r.jsx)("div",{className:"mt-2 break-all font-mono text-xs text-text-main",children:t.baseUrl}),(0,r.jsx)("div",{className:"mt-2 text-[11px] leading-5 text-text-muted",children:"Direct mode: Base URL được coi l\xe0 ch\xednh vLLM compute endpoint."})]}),(0,r.jsx)("div",{className:"hidden items-center lg:flex",children:(0,r.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-blue-400/30 to-primary",children:[(0,r.jsx)("span",{className:"absolute -right-1 -top-[9px] material-symbols-outlined text-[18px] text-primary",children:"arrow_forward"}),(0,r.jsx)("span",{className:"absolute left-1/2 top-1/2 h-2 w-2 -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-full bg-primary"})]})}),(0,r.jsx)(h,{backend:t.backends[0],serverMap:s,liveMap:a})]}):(0,r.jsx)("div",{className:"rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Base URL kh\xf4ng parse được th\xe0nh vLLM endpoint."})})]})}function v(){return(0,r.jsx)("div",{className:"hidden items-center justify-center lg:flex",children:(0,r.jsxs)("div",{className:"relative h-px w-full bg-gradient-to-r from-primary/20 via-primary/70 to-primary",children:[(0,r.jsx)("span",{className:"absolute left-1/3 top-1/2 h-2 w-2 -translate-y-1/2 animate-pulse rounded-full bg-primary shadow-[0_0_0_5px_rgba(59,130,246,.08)]"}),(0,r.jsx)(c,{name:"arrow_forward",className:"absolute -right-1 -top-[9px] text-[18px] text-primary"})]})})}function j({combo:e,providerMap:t,serverMap:s,liveMap:a,onEdit:l}){let i;return(0,r.jsxs)("section",{className:"grid gap-3 rounded-[28px] border border-border bg-surface-2/25 p-3 shadow-[var(--shadow-soft)] lg:grid-cols-[220px_64px_minmax(0,1fr)] lg:items-stretch",children:[(0,r.jsxs)("div",{className:"relative overflow-hidden rounded-3xl border border-primary/20 bg-gradient-to-br from-primary/10 via-background to-cyan-500/5 p-5",children:[(0,r.jsx)("div",{className:"absolute -bottom-10 -right-8 h-28 w-28 rounded-full bg-primary/8 blur-2xl"}),(0,r.jsxs)("div",{className:"relative flex h-full min-h-[150px] flex-col justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,r.jsx)("div",{className:"flex h-11 w-11 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,r.jsx)(c,{name:"translator"===(i=d(e.name).toLowerCase())?"translate":"coder-fast"===i?"bolt":"coder-high"===i?"rocket_launch":"code_blocks",className:"text-[24px]"})}),n.has(d(e.name).toLowerCase())?(0,r.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2.5 py-1 text-[10px] font-semibold text-primary",children:[(0,r.jsx)(c,{name:"star",className:"text-[13px]"})," main"]}):null]}),(0,r.jsx)("div",{className:"mt-4 text-[10px] font-semibold uppercase tracking-[0.16em] text-primary",children:"Model alias / Combo"}),(0,r.jsxs)("div",{className:"mt-1 text-2xl font-black tracking-tight text-text-main",children:[":",e.name]}),(0,r.jsxs)("div",{className:"mt-2 text-xs text-text-muted",children:[e.targets.length," configured upstream target",1===e.targets.length?"":"s"]})]}),(0,r.jsxs)("div",{className:"mt-5 flex items-center gap-2 text-[11px] text-text-subtle",children:[(0,r.jsx)(c,{name:"route",className:"text-[15px]"}),"Configured routing path"]})]})]}),(0,r.jsx)(v,{}),(0,r.jsx)("div",{className:"space-y-3",children:e.targets.length?e.targets.map(e=>{let n=e.providerId?t.get(e.providerId):null;return(0,r.jsx)(f,{target:e,provider:n,serverMap:s,liveMap:a,onEdit:l},e.id)}):(0,r.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-8 text-center text-sm text-text-muted",children:"Combo chưa c\xf3 upstream model."})})]})}function y(e={}){return{id:`endpoint-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,host:d(e.host),port:e.port?String(e.port):"",weight:void 0===e.weight||null===e.weight?"":String(e.weight),label:d(e.label)}}function N({provider:e,topology:t,open:s,onClose:n,onSaved:i}){let[o,x]=(0,a.useState)("direct"),[m,u]=(0,a.useState)([]),[b,h]=(0,a.useState)(!1),[g,f]=(0,a.useState)(!1),[v,j]=(0,a.useState)(!1),[w,k]=(0,a.useState)(""),[C,L]=(0,a.useState)(""),M=(0,a.useMemo)(()=>{let e=[];for(let s of t?.servers||[]){let t=p(s.gpus||[]);for(let r of s.vllmInstances||[])r.port&&e.push({key:`${s.id}::${r.key||r.port}`,host:s.host,port:Number(r.port),label:s.name||s.host,description:`${s.host}:${r.port} \xb7 ${t}${r.models?.length?` \xb7 ${r.models.join(", ")}`:""}`})}return e},[t]);(0,a.useEffect)(()=>{s&&e&&(x("proxy"===e.routeType?"proxy":"direct"),u(("proxy"===e.routeType&&e.backends||[]).map(y)),k(""),L(""))},[s,e]);let $=(e,t)=>{u(s=>s.map(s=>s.id===e?{...s,...t}:s))},_=()=>{let e=new Set(m.map(e=>`${d(e.host).toLowerCase()}:${Number(e.port||0)}`)),t=M.find(t=>!e.has(`${t.host.toLowerCase()}:${t.port}`));u(e=>[...e,y(t?{host:t.host,port:t.port,label:t.label}:{})])},S=async()=>{if(!e?.id||b)return;k("");let t=m.map(e=>({host:d(e.host),port:Number(e.port),weight:d(e.weight)?Number(e.weight):null,label:d(e.label)}));if("proxy"===o){if(!t.length)return void k("Proxy / Load Balancer cần \xedt nhất một real vLLM endpoint.");if(t.some(e=>!e.host||!Number.isInteger(e.port)||e.port<1||e.port>65535))return void k("Vui l\xf2ng nhập host v\xe0 port hợp lệ cho mọi vLLM endpoint.")}h(!0);try{let s=await fetch("/api/dashboard/routing-topology/config",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerId:e.id,routeType:o,realEndpoints:"proxy"===o?t:[]})}),r=await s.json().catch(()=>({}));if(!s.ok)throw Error(r.error||"Kh\xf4ng lưu được topology config");await i?.(),n?.()}catch(e){k(e?.message||"Kh\xf4ng lưu được topology config")}finally{h(!1)}},P=async()=>{if(e?.id&&!g&&!b){f(!0),k(""),L("");try{let t=await fetch(`/api/dashboard/routing-topology/config?providerId=${encodeURIComponent(e.id)}`,{method:"DELETE"}),s=await t.json().catch(()=>({}));if(!t.ok)throw Error(s.error||"Kh\xf4ng x\xf3a được topology config");let r=await i?.();if(null===r)throw Error("Đ\xe3 x\xf3a cấu h\xecnh nhưng kh\xf4ng dựng lại được sơ đồ - xem lỗi ở đầu trang.");L(s.deleted?"Đ\xe3 x\xf3a cấu h\xecnh topology. Sơ đồ b\xean dưới l\xe0 kết quả tự nhận diện mới nhất.":"Provider n\xe0y kh\xf4ng c\xf3 cấu h\xecnh n\xe0o để x\xf3a. Đ\xe3 nhận diện lại từ đầu.")}catch(e){k(e?.message||"Kh\xf4ng x\xf3a được topology config")}finally{f(!1)}}},R=async()=>{if(!v&&!b&&!g){j(!0),k(""),L("");try{let e=await i?.();if(null===e)throw Error("Kh\xf4ng dựng lại được sơ đồ - xem lỗi ở đầu trang.");L("Đ\xe3 nhận diện lại topology.")}catch(e){k(e?.message||"Kh\xf4ng nhận diện lại được topology")}finally{j(!1)}}};return e?(0,r.jsx)(l.default,{isOpen:s,onClose:n,title:`Routing topology \xb7 ${e.name}`,size:"xl",busy:b||g||v,footer:(0,r.jsxs)("div",{className:"flex w-full flex-wrap items-center justify-between gap-2",children:[(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsxs)("button",{type:"button",onClick:P,disabled:b||g||v,title:e.topologyConfigured?"X\xf3a cấu h\xecnh đ\xe3 lưu của provider n\xe0y v\xe0 nhận diện lại":"Provider n\xe0y chưa c\xf3 cấu h\xecnh lưu — bấm vẫn được, sơ đồ sẽ được nhận diện lại từ đầu",className:"inline-flex items-center gap-2 rounded-xl border border-red-500/30 px-3 py-2 text-sm font-semibold text-red-600 transition hover:bg-red-500/10 disabled:opacity-40 dark:text-red-400",children:[(0,r.jsx)(c,{name:"delete",className:`text-[18px] ${g?"animate-spin":""}`}),"X\xf3a topology"]}),(0,r.jsxs)("button",{type:"button",onClick:R,disabled:b||g||v,title:"Bỏ cache v\xe0 dựng lại sơ đồ từ Resource Monitor, kh\xf4ng đụng cấu h\xecnh đ\xe3 lưu",className:"inline-flex items-center gap-2 rounded-xl border border-border px-3 py-2 text-sm font-semibold text-text-muted transition hover:border-primary/30 hover:text-primary disabled:opacity-50",children:[(0,r.jsx)(c,{name:"restart_alt",className:`text-[18px] ${v?"animate-spin":""}`}),"Nhận diện lại"]})]}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)("button",{type:"button",onClick:n,disabled:b||g||v,className:"rounded-xl border border-border bg-surface px-4 py-2 text-sm font-semibold text-text-muted transition hover:text-text-main disabled:opacity-50",children:"Hủy"}),(0,r.jsxs)("button",{type:"button",onClick:S,disabled:b||g||v,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-50",children:[(0,r.jsx)(c,{name:b?"progress_activity":"save",className:`text-[18px] ${b?"animate-spin":""}`}),"Lưu topology"]})]})]}),children:(0,r.jsxs)("div",{className:"space-y-5",children:[(0,r.jsx)("div",{className:"rounded-2xl border border-border bg-surface-2/50 p-4",children:(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary",children:(0,r.jsx)(c,{name:"link",className:"text-[21px]"})}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Provider Base URL"}),(0,r.jsx)("div",{className:"mt-1 break-all font-mono text-xs text-text-muted",children:e.baseUrl}),(0,r.jsx)("div",{className:"mt-2 text-xs leading-5 text-text-subtle",children:"Cấu h\xecnh tại đ\xe2y chỉ phục vụ sơ đồ v\xe0 telemetry. Kh\xf4ng sửa Provider, Combo, Nginx hay routing production."})]})]})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"mb-2 text-xs font-semibold uppercase tracking-[0.13em] text-text-subtle",children:"Base URL thực chất l\xe0"}),(0,r.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,r.jsx)("button",{type:"button",onClick:()=>x("direct"),className:`rounded-2xl border p-4 text-left transition ${"direct"===o?"border-blue-500/50 bg-blue-500/8 ring-2 ring-blue-500/10":"border-border bg-surface hover:border-blue-500/25"}`,children:(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-blue-500/10 text-blue-500",children:(0,r.jsx)(c,{name:"memory",className:"text-[22px]"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"font-semibold text-text-main",children:"Direct vLLM"}),(0,r.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL ch\xednh l\xe0 vLLM endpoint. Hardware v\xe0 realtime metric lấy trực tiếp từ host/port n\xe0y."})]})]})}),(0,r.jsx)("button",{type:"button",onClick:()=>x("proxy"),className:`rounded-2xl border p-4 text-left transition ${"proxy"===o?"border-violet-500/50 bg-violet-500/8 ring-2 ring-violet-500/10":"border-border bg-surface hover:border-violet-500/25"}`,children:(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-xl bg-violet-500/10 text-violet-500",children:(0,r.jsx)(c,{name:"account_tree",className:"text-[22px]"})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"font-semibold text-text-main",children:"Proxy / Load Balancer"}),(0,r.jsx)("div",{className:"mt-1 text-xs leading-5 text-text-muted",children:"Base URL l\xe0 Nginx/HAProxy/LB. Khai b\xe1o c\xe1c real vLLM endpoint ph\xeda sau để topology v\xe0 metric đ\xfang compute node."})]})]})})]})]}),"proxy"===o?(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-sm font-semibold text-text-main",children:"Real vLLM endpoints"}),(0,r.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"C\xf3 thể chọn instance Resource Monitor đ\xe3 discover hoặc nhập IP:port thủ c\xf4ng. Weight chỉ l\xe0 metadata m\xf4 tả LB, kh\xf4ng phải % traffic cố định."})]}),(0,r.jsxs)("button",{type:"button",onClick:_,className:"inline-flex items-center gap-2 rounded-xl border border-primary/25 bg-primary/5 px-3.5 py-2 text-xs font-semibold text-primary transition hover:bg-primary/10",children:[(0,r.jsx)(c,{name:"add_circle",className:"text-[17px]"}),"Th\xeam endpoint"]})]}),m.length?(0,r.jsx)("div",{className:"space-y-3",children:m.map((e,t)=>{let s;return(0,r.jsxs)("div",{className:"rounded-2xl border border-border bg-surface p-4 shadow-[var(--shadow-soft)]",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-sm font-semibold text-text-main",children:[(0,r.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-500/10 text-xs font-bold text-emerald-600 dark:text-emerald-400",children:t+1}),"vLLM backend"]}),(0,r.jsx)("button",{type:"button",onClick:()=>u(t=>t.filter(t=>t.id!==e.id)),className:"flex h-8 w-8 items-center justify-center rounded-lg text-text-subtle transition hover:bg-red-500/10 hover:text-red-500",title:"X\xf3a endpoint",children:(0,r.jsx)(c,{name:"delete",className:"text-[18px]"})})]}),(0,r.jsxs)("div",{className:"mt-3 grid gap-3 lg:grid-cols-2",children:[(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Chọn từ Resource Monitor"}),(0,r.jsxs)("select",{value:(s=M.find(t=>d(t.host).toLowerCase()===d(e.host).toLowerCase()&&Number(t.port)===Number(e.port)),s?.key||""),onChange:t=>((e,t)=>{if(!t)return;let s=M.find(e=>e.key===t);s&&$(e,{host:s.host,port:String(s.port),label:s.label})})(e.id,t.target.value),className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition focus:border-primary",children:[(0,r.jsx)("option",{value:"",children:"Manual / giữ gi\xe1 trị b\xean dưới"}),M.map(e=>(0,r.jsxs)("option",{value:e.key,children:[e.label," \xb7 ",e.description]},e.key))]})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Nh\xe3n hiển thị"}),(0,r.jsx)("input",{value:e.label,onChange:t=>$(e.id,{label:t.target.value}),placeholder:"2\xd7 RTX 5090 TP2",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]}),(0,r.jsxs)("div",{className:"mt-3 grid gap-3 sm:grid-cols-[minmax(0,1fr)_140px_140px]",children:[(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Host / IP"}),(0,r.jsx)("input",{value:e.host,onChange:t=>$(e.id,{host:t.target.value}),placeholder:"172.16.0.71",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Port"}),(0,r.jsx)("input",{type:"number",min:"1",max:"65535",value:e.port,onChange:t=>$(e.id,{port:t.target.value}),placeholder:"8000",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]}),(0,r.jsxs)("label",{className:"block",children:[(0,r.jsx)("span",{className:"mb-1.5 block text-[11px] font-semibold text-text-muted",children:"Weight"}),(0,r.jsx)("input",{type:"number",min:"0",value:e.weight,onChange:t=>$(e.id,{weight:t.target.value}),placeholder:"50",className:"w-full rounded-xl border border-border bg-background px-3 py-2.5 font-mono text-sm text-text-main outline-none transition placeholder:text-text-subtle focus:border-primary"})]})]})]},e.id)})}):(0,r.jsxs)("button",{type:"button",onClick:_,className:"flex w-full flex-col items-center justify-center rounded-2xl border border-dashed border-border bg-surface-2/30 px-6 py-10 text-center transition hover:border-primary/30 hover:bg-primary/5",children:[(0,r.jsx)("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,r.jsx)(c,{name:"add_link",className:"text-[25px]"})}),(0,r.jsx)("div",{className:"mt-3 text-sm font-semibold text-text-main",children:"Th\xeam real vLLM endpoint đầu ti\xean"}),(0,r.jsx)("div",{className:"mt-1 text-xs text-text-muted",children:"Chọn từ Resource Monitor hoặc nhập IP:port thủ c\xf4ng."})]})]}):(0,r.jsxs)("div",{className:"rounded-2xl border border-blue-500/20 bg-blue-500/5 px-4 py-3 text-xs leading-5 text-blue-700 dark:text-blue-300",children:["Direct mode sẽ tiếp tục map ",(0,r.jsx)("span",{className:"font-mono font-semibold",children:e.baseUrl})," trực tiếp tới Resource Monitor host/port tương ứng."]}),w?(0,r.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:[(0,r.jsx)(c,{name:"error",className:"mt-0.5 text-[18px]"}),(0,r.jsx)("span",{children:w})]}):null,C?(0,r.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-emerald-500/20 bg-emerald-500/10 px-4 py-3 text-sm text-emerald-600 dark:text-emerald-300",children:[(0,r.jsx)(c,{name:"check_circle",className:"mt-0.5 text-[18px]"}),(0,r.jsx)("span",{children:C})]}):null]})}):null}function w(){let[e,t]=(0,a.useState)(null),[s,l]=(0,a.useState)(null),[n,m]=(0,a.useState)(!0),[u,p]=(0,a.useState)(!1),[b,h]=(0,a.useState)(""),[f,v]=(0,a.useState)(""),[y,w]=(0,a.useState)(!1),[k,C]=(0,a.useState)(null),L=(0,a.useCallback)(async({force:e=!1}={})=>{v(""),e&&p(!0);try{let s=await fetch(`/api/dashboard/routing-topology${e?"?refresh=1":""}`,{cache:"no-store"}),r=await s.json().catch(()=>({}));if(!s.ok)throw Error(r.error||"Kh\xf4ng tải được routing topology");return t(r),r}catch(e){return v(e?.message||"Kh\xf4ng tải được routing topology"),null}finally{m(!1),p(!1)}},[]),M=(0,a.useCallback)(async()=>{try{let e=await fetch("/api/dashboard/routing-topology/live",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Kh\xf4ng tải được realtime telemetry");l(t),h("")}catch(e){h(e?.message||"Kh\xf4ng tải được realtime telemetry")}},[]);(0,a.useEffect)(()=>{L()},[L]),(0,a.useEffect)(()=>{let e=!1,t=null,s=()=>{e||(t=setTimeout(r,4e3))},r=async()=>{e||"hidden"===document.visibilityState||await M(),s()},a=()=>{"visible"===document.visibilityState&&(clearTimeout(t),r())};return M().finally(s),document.addEventListener("visibilitychange",a),()=>{e=!0,clearTimeout(t),document.removeEventListener("visibilitychange",a)}},[M]);let $=(0,a.useMemo)(()=>new Map((e?.providers||[]).map(e=>[e.id,e])),[e]),_=(0,a.useMemo)(()=>new Map((e?.servers||[]).map(e=>[e.id,e])),[e]),S=(0,a.useMemo)(()=>new Map((s?.servers||[]).map(e=>[e.id,e])),[s]),P=(0,a.useMemo)(()=>(e?.combos||[]).filter(e=>e.isFocus),[e]),R=y||!P.length?e?.combos||[]:P,E=(0,a.useMemo)(()=>{let t=new Set,s=[];for(let r of e?.providers||[])for(let e of r.backends||[]){let r=e.vllmInstanceKey&&e.resourceServerId?`${e.resourceServerId}::${e.vllmInstanceKey}`:`${d(e.host).toLowerCase()}:${Number(e.port||0)}`;!r||t.has(r)||(t.add(r),s.push(e))}return s},[e]),T=(0,a.useMemo)(()=>g(E,_,S),[E,_,S]),I=(0,a.useCallback)(async()=>{let[e]=await Promise.all([L({force:!0}),M()]);return e},[M,L]),B=(0,a.useMemo)(()=>k?$.get(k.id)||k:null,[k,$]);return n?(0,r.jsxs)("div",{className:"flex min-h-[55vh] flex-col items-center justify-center text-sm text-text-muted",children:[(0,r.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary",children:(0,r.jsx)(c,{name:"account_tree",className:"animate-pulse text-[30px]"})}),(0,r.jsx)("div",{className:"mt-4",children:"Đang compile routing topology..."})]}):f&&!e?(0,r.jsxs)("div",{className:"rounded-3xl border border-red-500/20 bg-red-500/10 p-6 text-red-600 dark:text-red-300",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 font-semibold",children:[(0,r.jsx)(c,{name:"error"})," Kh\xf4ng tải được Routing Topology"]}),(0,r.jsx)("div",{className:"mt-2 text-sm",children:f}),(0,r.jsxs)("button",{type:"button",onClick:()=>L({force:!0}),className:"mt-4 inline-flex items-center gap-2 rounded-xl bg-red-500 px-4 py-2 text-sm font-semibold text-white",children:[(0,r.jsx)(c,{name:"refresh",className:"text-[18px]"})," Thử lại"]})]}):(0,r.jsxs)("div",{className:"space-y-6",children:[(0,r.jsxs)("section",{className:"relative overflow-hidden rounded-[30px] border border-border bg-gradient-to-br from-primary/8 via-surface to-cyan-500/7 p-6 shadow-[var(--shadow-soft)]",children:[(0,r.jsx)("div",{className:"absolute -right-20 -top-24 h-64 w-64 rounded-full bg-primary/8 blur-3xl"}),(0,r.jsx)("div",{className:"absolute -bottom-24 left-1/3 h-48 w-48 rounded-full bg-cyan-500/6 blur-3xl"}),(0,r.jsxs)("div",{className:"relative flex flex-wrap items-start justify-between gap-5",children:[(0,r.jsxs)("div",{className:"flex min-w-0 items-start gap-4",children:[(0,r.jsx)("div",{className:"flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-primary text-white shadow-lg shadow-primary/15",children:(0,r.jsx)(c,{name:"account_tree",className:"text-[31px]"})}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("h1",{className:"text-2xl font-black tracking-tight text-text-main",children:"Routing Topology"}),(0,r.jsx)("span",{className:"rounded-full bg-red-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-red-600 dark:text-red-400",children:"Admin only"}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full bg-emerald-500/10 px-2.5 py-1 text-[10px] font-bold uppercase tracking-wider text-emerald-600 dark:text-emerald-400",children:[(0,r.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-500"})," Live telemetry"]})]}),(0,r.jsx)("p",{className:"mt-2 max-w-3xl text-sm leading-6 text-text-muted",children:"Combos → local compatible providers → Direct vLLM hoặc Proxy/LB → real vLLM compute. Topology tĩnh được cache; realtime metric cập nhật ri\xeang v\xe0 tự dừng khi tab bị ẩn."}),(0,r.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-[11px] text-text-subtle",children:[(0,r.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,r.jsx)(c,{name:"fingerprint",className:"text-[14px]"})," rev ",e?.revision||"—"]}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,r.jsx)(c,{name:"schema",className:"text-[14px]"})," topology ",o(e?.generatedAt)]}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1",children:[(0,r.jsx)(c,{name:"monitor_heart",className:"text-[14px]"})," telemetry ",o(s?.generatedAt)]})]})]})]}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(e?.combos||[]).length>P.length&&P.length?(0,r.jsxs)("button",{type:"button",onClick:()=>w(e=>!e),className:"inline-flex items-center gap-2 rounded-xl border border-border bg-background/80 px-3.5 py-2.5 text-sm font-semibold text-text-muted shadow-sm transition hover:border-primary/30 hover:text-primary",children:[(0,r.jsx)(c,{name:y?"filter_alt":"view_list",className:"text-[18px]"}),y?"Chỉ combo ch\xednh":"Hiện tất cả combo"]}):null,(0,r.jsxs)("button",{type:"button",onClick:()=>L({force:!0}),disabled:u,className:"inline-flex items-center gap-2 rounded-xl bg-primary px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:brightness-105 disabled:opacity-60",children:[(0,r.jsx)(c,{name:"refresh",className:`text-[18px] ${u?"animate-spin":""}`}),"Rebuild topology"]})]})]})]}),f?(0,r.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:[(0,r.jsx)(c,{name:"warning",className:"mt-0.5 text-[18px]"})," ",f]}):null,b?(0,r.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-300",children:[(0,r.jsx)(c,{name:"wifi_off",className:"mt-0.5 text-[18px]"})," Realtime: ",b]}):null,e?.standby||s?.standby?(0,r.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-blue-500/20 bg-blue-500/10 px-4 py-3 text-sm text-blue-700 dark:text-blue-300",children:[(0,r.jsx)(c,{name:"pause_circle",className:"mt-0.5 text-[18px]"})," Standby node: topology chỉ đọc snapshot đ\xe3 c\xf3 v\xe0 kh\xf4ng cho sửa override."]}):null,(0,r.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-5",children:[(0,r.jsx)(x,{icon:"layers",label:"Combos",value:e?.summary?.comboCount??0,detail:`${e?.summary?.focusComboCount??0} main combos`,tone:"blue"}),(0,r.jsx)(x,{icon:"hub",label:"Proxy / LB",value:e?.summary?.proxyProviderCount??0,detail:`${e?.summary?.localProviderCount??0} local providers`,tone:"violet"}),(0,r.jsx)(x,{icon:"memory",label:"vLLM backends",value:`${T.online}/${T.total}`,detail:"live / configured",tone:"emerald"}),(0,r.jsx)(x,{icon:"hourglass_top",label:"Running / Waiting",value:`${i(T.running,0)} / ${i(T.waiting,0)}`,detail:"unique compute endpoints",tone:"amber"}),(0,r.jsx)(x,{icon:"speed",label:"Aggregate out",value:`${i(T.output)}${null==T.output?"":" tok/s"}`,detail:"wall-clock vLLM throughput",tone:"cyan"})]}),(0,r.jsxs)("div",{className:"grid gap-3 lg:grid-cols-2",children:[(0,r.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,r.jsxs)("div",{className:"flex items-start gap-2",children:[(0,r.jsx)(c,{name:"route",className:"mt-0.5 text-[18px] text-primary"}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"font-semibold text-text-main",children:"Configured routing:"})," đường nối m\xf4 tả cấu h\xecnh Combo/Provider. Đ\xe2y kh\xf4ng phải per-request trace, n\xean trang kh\xf4ng giả request cụ thể đ\xe3 đi qua edge n\xe0o."]})]})}),(0,r.jsx)("div",{className:"rounded-2xl border border-border bg-surface px-4 py-3 text-xs leading-5 text-text-muted shadow-[var(--shadow-soft)]",children:(0,r.jsxs)("div",{className:"flex items-start gap-2",children:[(0,r.jsx)(c,{name:"edit_square",className:"mt-0.5 text-[18px] text-violet-500"}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"font-semibold text-text-main",children:"Topology override:"})," bấm ",(0,r.jsx)("span",{className:"font-semibold",children:"Edit topology"})," ngay tr\xean provider để khai b\xe1o Direct vLLM hoặc Proxy/LB v\xe0 real endpoints. Kh\xf4ng thay đổi `/dashboard/providers`."]})]})})]}),e?.summary?.unresolvedTargets||e?.summary?.unresolvedBackends?(0,r.jsxs)("div",{className:"flex items-start gap-3 rounded-2xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-700 dark:text-amber-300",children:[(0,r.jsx)(c,{name:"warning",className:"mt-0.5 text-[20px]"}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"font-semibold",children:"Topology cần admin kiểm tra"}),(0,r.jsxs)("div",{className:"mt-1 text-xs leading-5",children:[e?.summary?.unresolvedTargets||0," combo target chưa resolve provider \xb7 ",e?.summary?.unresolvedBackends||0," compute endpoint chưa map ch\xednh x\xe1c tới vLLM instance trong Resource Monitor."]})]})]}):null,(0,r.jsx)("div",{className:"space-y-4",children:R.length?R.map(e=>(0,r.jsx)(j,{combo:e,providerMap:$,serverMap:_,liveMap:S,onEdit:C},e.id||e.name)):(0,r.jsx)("div",{className:"rounded-3xl border border-dashed border-border bg-surface p-10 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 combo n\xe0o để hiển thị."})}),(0,r.jsx)(N,{provider:B,topology:e,open:!!k,onClose:()=>C(null),onSaved:I})]})}},81127:(e,t,s)=>{"use strict";s.d(t,{ConfirmModal:()=>p,default:()=>u});var r=s(95155),a=s(12115),l=s(31474),n=s(92542),i=s(97677),o=s(46442);let d=[],c="";function x(){1===d.length?(c=document.body.style.overflow,document.body.style.overflow="hidden"):0===d.length&&(document.body.style.overflow=c)}function m(e,t){return!!e&&Object.prototype.hasOwnProperty.call(e,t)}function u({isOpen:e,onClose:t,title:s,children:n,footer:c,size:p="md",closeOnOverlay:b=!0,showTrafficLights:h=!0,busy:g=!1,className:f}){let v=(0,a.useRef)({onClose:t,busy:g}),j=(0,o.t)(),y=j?.({title:s,children:n,footer:c,size:p,className:f})||null,N=m(y,"children")?y.children:n,w=m(y,"footer")?y.footer:c,k=y?.size||p,C=(0,l.cn)(f,y?.className);v.current.onClose=t,v.current.busy=g;let L={sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl",full:"max-w-4xl"};return((0,a.useEffect)(()=>{if(!e)return;let t=v.current;d.push(t),x();let s=e=>{if("Escape"!==e.key)return;let s=d[d.length-1];s!==t||s.busy||(e.preventDefault(),s.onClose())};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s);let e=d.indexOf(t);-1!==e&&d.splice(e,1),x()}},[e]),e)?(0,r.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[(0,r.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in",onClick:b&&!g?t:void 0}),(0,r.jsxs)("div",{className:(0,l.cn)("relative w-full bg-surface","border border-border-subtle","rounded-[14px] shadow-[var(--shadow-elev)]","fade-in",L[k]||L.md,C),children:[(s||h)&&(0,r.jsxs)("div",{className:"flex items-center justify-between p-2 border-b border-border-subtle",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[h&&(0,r.jsxs)("div",{className:"hidden md:flex items-center gap-2 mr-4 ml-2",children:[(0,r.jsx)(i.default,{text:"Close",position:"top",color:"#FF5F56",children:(0,r.jsx)("button",{onClick:t,disabled:g,"aria-label":"Close",title:"Close",className:"w-4 h-4 rounded-full bg-[#FF5F56] hover:brightness-90 transition-all cursor-pointer flex items-center justify-center group/dot disabled:cursor-not-allowed disabled:opacity-50",children:(0,r.jsx)("span",{className:"text-[9px] font-bold text-white opacity-0 group-hover/dot:opacity-100 transition-opacity leading-none",children:"✕"})})}),(0,r.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"}),(0,r.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"})]}),s&&(0,r.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:s})]}),(0,r.jsx)("button",{onClick:t,disabled:g,"aria-label":"Close",className:"md:hidden p-1.5 rounded-[10px] text-text-muted hover:bg-surface-2 hover:text-text-main transition-colors disabled:cursor-not-allowed disabled:opacity-50",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,r.jsx)("div",{className:"p-6 max-h-[calc(85vh-100px)] overflow-y-auto custom-scrollbar",children:N}),w&&(0,r.jsx)("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-border-subtle",children:w})]})]}):null}function p({isOpen:e,onClose:t,onConfirm:s,title:a="Confirm",message:l,confirmText:i="Confirm",cancelText:o="Cancel",variant:d="danger",loading:c=!1}){return(0,r.jsx)(u,{isOpen:e,onClose:t,title:a,size:"sm",busy:c,footer:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.default,{variant:"ghost",onClick:t,disabled:c,children:o}),(0,r.jsx)(n.default,{variant:d,onClick:s,loading:c,children:i})]}),children:(0,r.jsx)("p",{className:"text-text-muted",children:l})})}},92542:(e,t,s)=>{"use strict";s.d(t,{default:()=>i});var r=s(95155),a=s(31474);let l={primary:"bg-brand-500 hover:bg-brand-600 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted",secondary:"bg-surface-2 hover:bg-surface-3 text-text-main border border-border disabled:opacity-50",outline:"border border-border text-text-main hover:bg-surface-2 hover:border-brand-500/40",ghost:"text-text-muted hover:bg-surface-2 hover:text-text-main",danger:"bg-red-500 hover:bg-red-600 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted",success:"bg-green-600 hover:bg-green-700 text-white shadow-sm disabled:bg-surface-3 disabled:text-text-muted"},n={sm:"h-7 px-3 text-xs rounded-[8px]",md:"h-9 px-4 text-sm rounded-[10px]",lg:"h-11 px-6 text-sm rounded-[10px]"};function i({children:e,variant:t="primary",size:s="md",icon:o,iconRight:d,disabled:c=!1,loading:x=!1,fullWidth:m=!1,className:u,...p}){return(0,r.jsxs)("button",{className:(0,a.cn)("inline-flex items-center justify-center gap-2 font-semibold transition-all duration-150 ease-out cursor-pointer","active:scale-[0.97] disabled:opacity-50 disabled:cursor-not-allowed disabled:active:scale-100",l[t],n[s],m&&"w-full",u),disabled:c||x,...p,children:[x?(0,r.jsx)("span",{className:"material-symbols-outlined animate-spin text-[18px]",children:"progress_activity"}):o?(0,r.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:o}):null,e,d&&!x&&(0,r.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:d})]})}},92788:(e,t,s)=>{Promise.resolve().then(s.bind(s,72762))},97677:(e,t,s)=>{"use strict";s.d(t,{default:()=>a});var r=s(95155);function a({text:e,children:t,position:s="top",color:l}){let n=l?"":"bg-gray-900";return(0,r.jsxs)("div",{className:"relative inline-flex group",children:[t,(0,r.jsx)("div",{className:`pointer-events-none absolute ${{top:"bottom-full left-1/2 -translate-x-1/2 mb-1.5",bottom:"top-full left-1/2 -translate-x-1/2 mt-1.5",left:"right-full top-1/2 -translate-y-1/2 mr-1.5",right:"left-full top-1/2 -translate-y-1/2 ml-1.5"}[s]} z-50 w-max max-w-56 rounded px-2 py-1 text-[11px] leading-snug ${n} text-white opacity-0 group-hover:opacity-100 transition-opacity duration-150 whitespace-normal`,style:l?{backgroundColor:l}:{},children:e})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=92788)),_N_E=e.O()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "5.4.1",
3
+ "version": "5.4.2",
4
4
  "description": "Router web dashboard",
5
5
  "private": false,
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jheavenknows/bluerouter",
3
- "version": "5.4.2",
3
+ "version": "5.4.3",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"