@jheavenknows/bluerouter 5.5.35 → 5.5.36

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 (456) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +22 -22
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/prerender-manifest.json +3 -3
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/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/page.js.nft.json +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudcombo/page.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudcombo/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/[id]/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/embedding/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/[id]/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/[id]/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/image-to-text/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/[id]/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/[id]/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/[kind]/[id]/page_client-reference-manifest.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/web/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  62. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  64. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  65. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  66. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  67. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  68. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  70. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  71. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  72. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  73. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  74. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/audit-proxy/root-ca/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cli-model-profiles/model-catalog/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +4 -4
  95. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +2 -2
  97. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +1 -1
  98. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +1 -1
  99. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  100. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
  102. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
  103. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +1 -1
  104. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +2 -2
  106. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +2 -2
  107. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +2 -2
  108. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +2 -2
  109. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +2 -2
  110. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  111. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  112. package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js +1 -1
  113. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/codex-catalog/download/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/codex-catalog/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/codex-catalog/upload/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  151. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  153. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/personal-cloud-combos/[id]/api-key-models/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/personal-cloud-combos/[id]/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/personal-cloud-combos/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/personal-cloud-combos/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/personal-cloud-providers/account-emails/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/personal-cloud-providers/account-policy/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/personal-cloud-providers/pending-accounts/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/personal-oauth-email/verify/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/provider-nodes/combo-references/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/provider-nodes/custom-embedding/manage/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  198. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  201. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/settings/database/export/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/settings/prompt-log-db/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/settings/smtp/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  221. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  222. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  230. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  232. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/v1/rate-limits/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  247. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  249. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  251. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  253. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  255. package/app/.next-cli-build/server/app/callback.html +1 -1
  256. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  257. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  258. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  259. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  260. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  262. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  263. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  264. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  266. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  267. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  268. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  269. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  272. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  273. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  274. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
  277. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +8 -8
  278. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
  279. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  281. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  282. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  283. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  284. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  287. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  288. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  289. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  291. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  292. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  293. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  294. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  297. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  298. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  299. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
  301. package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
  302. package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +6 -6
  303. package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
  304. package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  307. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  308. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  309. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
  311. package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
  312. package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +7 -7
  313. package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
  314. package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  317. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  318. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  319. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  321. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  322. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  323. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  324. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  327. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  328. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  329. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/providers/embedding.html +1 -1
  331. package/app/.next-cli-build/server/app/dashboard/providers/embedding.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/!KGRhc2hib2FyZCk/dashboard/providers/embedding/__PAGE__.segment.rsc +7 -7
  333. package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_full.segment.rsc +7 -7
  334. package/app/.next-cli-build/server/app/dashboard/providers/embedding.segments/_tree.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.html +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.rsc +7 -7
  337. package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/!KGRhc2hib2FyZCk/dashboard/providers/image-to-text/__PAGE__.segment.rsc +7 -7
  338. package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_full.segment.rsc +7 -7
  339. package/app/.next-cli-build/server/app/dashboard/providers/image-to-text.segments/_tree.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/providers/image.html +1 -1
  341. package/app/.next-cli-build/server/app/dashboard/providers/image.rsc +7 -7
  342. package/app/.next-cli-build/server/app/dashboard/providers/image.segments/!KGRhc2hib2FyZCk/dashboard/providers/image/__PAGE__.segment.rsc +7 -7
  343. package/app/.next-cli-build/server/app/dashboard/providers/image.segments/_full.segment.rsc +7 -7
  344. package/app/.next-cli-build/server/app/dashboard/providers/image.segments/_tree.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  347. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  348. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  349. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
  352. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +7 -7
  353. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
  354. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
  357. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +7 -7
  358. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
  359. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/providers/web.html +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/providers/web.rsc +7 -7
  362. package/app/.next-cli-build/server/app/dashboard/providers/web.segments/!KGRhc2hib2FyZCk/dashboard/providers/web/__PAGE__.segment.rsc +7 -7
  363. package/app/.next-cli-build/server/app/dashboard/providers/web.segments/_full.segment.rsc +7 -7
  364. package/app/.next-cli-build/server/app/dashboard/providers/web.segments/_tree.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  366. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  367. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  368. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  369. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  372. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  373. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  374. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  376. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  377. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  378. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  379. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  380. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  381. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +6 -6
  382. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +6 -6
  383. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
  384. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  386. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  387. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  388. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  389. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  391. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  392. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  393. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  394. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  395. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  396. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  397. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  398. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  399. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  400. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  401. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  402. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  403. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  404. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  405. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  406. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  407. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  408. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  409. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  410. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  411. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  412. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  413. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  414. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  415. package/app/.next-cli-build/server/app/index.html +1 -1
  416. package/app/.next-cli-build/server/app/index.rsc +5 -5
  417. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  418. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  419. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  420. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  421. package/app/.next-cli-build/server/app/landing.html +1 -1
  422. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  423. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  424. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  425. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  426. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  427. package/app/.next-cli-build/server/app/login.html +1 -1
  428. package/app/.next-cli-build/server/app/login.rsc +6 -6
  429. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  430. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  432. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  433. package/app/.next-cli-build/server/app-paths-manifest.json +22 -22
  434. package/app/.next-cli-build/server/chunks/2428.js +1 -1
  435. package/app/.next-cli-build/server/chunks/3399.js +1 -1
  436. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  437. package/app/.next-cli-build/server/chunks/4778.js +1 -1
  438. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  439. package/app/.next-cli-build/server/chunks/6992.js +1 -1
  440. package/app/.next-cli-build/server/chunks/8946.js +2 -2
  441. package/app/.next-cli-build/server/chunks/9489.js +1 -1
  442. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  443. package/app/.next-cli-build/server/pages/404.html +1 -1
  444. package/app/.next-cli-build/server/pages/500.html +1 -1
  445. package/app/.next-cli-build/server/server-reference-manifest.js +1 -1
  446. package/app/.next-cli-build/server/server-reference-manifest.json +1 -1
  447. package/app/.next-cli-build/static/chunks/{5263-f5ceb4c05a32c83d.js → 5263-703b00aba6c5bb1f.js} +1 -1
  448. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudcombo/page-899a8a75058f3959.js +1 -0
  449. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  450. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  451. package/app/package.json +1 -1
  452. package/package.json +1 -1
  453. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/personalcloudcombo/page-49b624ecbe4f4e3f.js +0 -1
  454. /package/app/.next-cli-build/static/{rVGCgsHSCtpMPfhNHYRvX → xOi7_D4lBYmsajJ_tW7MH}/_buildManifest.js +0 -0
  455. /package/app/.next-cli-build/static/{rVGCgsHSCtpMPfhNHYRvX → xOi7_D4lBYmsajJ_tW7MH}/_ssgManifest.js +0 -0
  456. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.5.29-to-5.5.30-5.5.30-20260924-104020 → upgrade-5.5.33-to-5.5.34-5.5.34-20260924-180218}/data.sqlite +0 -0
@@ -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(72218);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:()=>g,IS:()=>o,JH:()=>u,MA:()=>M,Ox:()=>k,Q2:()=>C,U_:()=>T,_8:()=>v,ad:()=>h,br:()=>d,dV:()=>p,fg:()=>l,gC:()=>w,gb:()=>x,hb:()=>y,mq:()=>f,nJ:()=>s,o5:()=>A,rj:()=>m,rs:()=>I,s9:()=>n,wG:()=>K,wb:()=>P,zN:()=>c,zt:()=>U});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-3.6-flash",name:"Gemini 3.6 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:"developer_board",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com",deploymentType:"local"},"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={embedding:"/dashboard/providers/embedding",image:"/dashboard/providers/image",imageToText:"/dashboard/providers/image-to-text",tts:"/dashboard/providers/tts",stt:"/dashboard/providers/stt",webSearch:"/dashboard/providers/web",webFetch:"/dashboard/providers/web"},h={embedding:"embedding",image:"image","image-to-text":"imageToText",tts:"tts",stt:"stt"},u="openai-compatible-",g="anthropic-compatible-",b=Object.freeze({GENERIC:"generic",LLAMA_CPP:"llamacpp",VLLM:"vllm",OLLAMA:"ollama"}),y=b.LLAMA_CPP,v=[{value:b.GENERIC,label:"Generic OpenAI-compatible",description:"Only standard request fields are forwarded. Thinking/reasoning-specific fields are not injected."},{value:b.LLAMA_CPP,label:"llama.cpp / llama-server",description:"Supports chat_template_kwargs.enable_thinking, reasoning_budget and the top_k/min_p sampling fields."},{value:b.VLLM,label:"vLLM",description:"Supports chat_template_kwargs.enable_thinking, top_k/min_p and maps reasoning budget to thinking_token_budget."},{value:b.OLLAMA,label:"Ollama OpenAI-compatible",description:"Uses standard OpenAI-compatible fields only. Thinking/reasoning fields are not injected."}];function f(e){return"string"==typeof e&&e.startsWith(u)}function x(e){return"string"==typeof e&&e.startsWith(g)}function w(e){return"string"==typeof e&&e.startsWith("custom-embedding-")}function k(e){return"string"==typeof e&&e.startsWith("custom-stt-")}function T(e){return"string"==typeof e&&e.startsWith("custom-tts-")}Object.freeze({generic:b.GENERIC,default:b.GENERIC,openai:b.GENERIC,strict:b.GENERIC,llama:b.LLAMA_CPP,llamacpp:b.LLAMA_CPP,"llama.cpp":b.LLAMA_CPP,"llama-cpp":b.LLAMA_CPP,"llama-server":b.LLAMA_CPP,llamaserver:b.LLAMA_CPP,vllm:b.VLLM,"v-llm":b.VLLM,ollama:b.OLLAMA,"ollama-openai":b.OLLAMA});let C={...o,...s,...c,...l,...d},M={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"},cookie:{id:"cookie",name:"Browser Cookie",icon:"cookie"}};function U(e){for(let i of Object.values(C))if(i.alias===e||i.id===e)return i;return null}function I(e){let i=U(e);return i?.id||e}function K(e){let i=C[e];return i?.alias||e}function A(e){return Object.values(C).filter(i=>!(!(i.serviceKinds??["llm"]).includes(e)||i.hidden||i.hiddenKinds?.includes(e))).sort((e,i)=>(e.mediaPriority??100)-(i.mediaPriority??100))}Object.values(C).reduce((e,i)=>(e[i.alias]=i.id,e),{}),Object.values(C).reduce((e,i)=>(e[i.id]=i.alias,e),{});let P=["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.5.34"},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(72218);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:()=>g,IS:()=>o,JH:()=>u,MA:()=>M,Ox:()=>k,Q2:()=>C,U_:()=>T,_8:()=>v,ad:()=>h,br:()=>d,dV:()=>p,fg:()=>l,gC:()=>w,gb:()=>x,hb:()=>y,mq:()=>f,nJ:()=>s,o5:()=>A,rj:()=>m,rs:()=>I,s9:()=>n,wG:()=>K,wb:()=>P,zN:()=>c,zt:()=>U});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-3.6-flash",name:"Gemini 3.6 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:"developer_board",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com",deploymentType:"local"},"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={embedding:"/dashboard/providers/embedding",image:"/dashboard/providers/image",imageToText:"/dashboard/providers/image-to-text",tts:"/dashboard/providers/tts",stt:"/dashboard/providers/stt",webSearch:"/dashboard/providers/web",webFetch:"/dashboard/providers/web"},h={embedding:"embedding",image:"image","image-to-text":"imageToText",tts:"tts",stt:"stt"},u="openai-compatible-",g="anthropic-compatible-",b=Object.freeze({GENERIC:"generic",LLAMA_CPP:"llamacpp",VLLM:"vllm",OLLAMA:"ollama"}),y=b.LLAMA_CPP,v=[{value:b.GENERIC,label:"Generic OpenAI-compatible",description:"Only standard request fields are forwarded. Thinking/reasoning-specific fields are not injected."},{value:b.LLAMA_CPP,label:"llama.cpp / llama-server",description:"Supports chat_template_kwargs.enable_thinking, reasoning_budget and the top_k/min_p sampling fields."},{value:b.VLLM,label:"vLLM",description:"Supports chat_template_kwargs.enable_thinking, top_k/min_p and maps reasoning budget to thinking_token_budget."},{value:b.OLLAMA,label:"Ollama OpenAI-compatible",description:"Uses standard OpenAI-compatible fields only. Thinking/reasoning fields are not injected."}];function f(e){return"string"==typeof e&&e.startsWith(u)}function x(e){return"string"==typeof e&&e.startsWith(g)}function w(e){return"string"==typeof e&&e.startsWith("custom-embedding-")}function k(e){return"string"==typeof e&&e.startsWith("custom-stt-")}function T(e){return"string"==typeof e&&e.startsWith("custom-tts-")}Object.freeze({generic:b.GENERIC,default:b.GENERIC,openai:b.GENERIC,strict:b.GENERIC,llama:b.LLAMA_CPP,llamacpp:b.LLAMA_CPP,"llama.cpp":b.LLAMA_CPP,"llama-cpp":b.LLAMA_CPP,"llama-server":b.LLAMA_CPP,llamaserver:b.LLAMA_CPP,vllm:b.VLLM,"v-llm":b.VLLM,ollama:b.OLLAMA,"ollama-openai":b.OLLAMA});let C={...o,...s,...c,...l,...d},M={oauth:{id:"oauth",name:"OAuth",icon:"lock"},apikey:{id:"apikey",name:"API Key",icon:"key"},cookie:{id:"cookie",name:"Browser Cookie",icon:"cookie"}};function U(e){for(let i of Object.values(C))if(i.alias===e||i.id===e)return i;return null}function I(e){let i=U(e);return i?.id||e}function K(e){let i=C[e];return i?.alias||e}function A(e){return Object.values(C).filter(i=>!(!(i.serviceKinds??["llm"]).includes(e)||i.hidden||i.hiddenKinds?.includes(e))).sort((e,i)=>(e.mediaPriority??100)-(i.mediaPriority??100))}Object.values(C).reduce((e,i)=>(e[i.alias]=i.id,e),{}),Object.values(C).reduce((e,i)=>(e[i.id]=i.alias,e),{});let P=["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.5.35"},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([[823],{10332:(e,t,r)=>{Promise.resolve().then(r.bind(r,49711))},14051:(e,t,r)=>{e.exports=r(34701)()},31474:(e,t,r)=>{"use strict";function s(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}r.d(t,{cn:()=>s})},34701:(e,t,r)=>{"use strict";var s=r(82114);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,r,a,o,l){if(l!==s){var n=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw n.name="Invariant Violation",n}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return r.PropTypes=r,r}},46442:(e,t,r)=>{"use strict";r.d(t,{j:()=>l,t:()=>n});var s=r(95155),a=r(12115);let o=(0,a.createContext)(null);function l({resolver:e,children:t}){return(0,s.jsx)(o.Provider,{value:"function"==typeof e?e:null,children:t})}function n(){return(0,a.useContext)(o)}},49711:(e,t,r)=>{"use strict";r.d(t,{default:()=>b});var s=r(95155),a=r(12115),o=r(84588),l=r(57250),n=r(81127),d=r(92542);let i=[{id:"fallback",label:"Fallback (priority order)",icon:"swap_vert"},{id:"round-robin",label:"Round Robin",icon:"sync"}],c={fallback:"Fallback (priority order)","round-robin":"Round Robin",sticky:"Sticky","least-latency":"Least latency",p2c:"Power of two choices"};function m(e){return c[e]||e||"fallback"}function x(e){return String(e||"").trim().toLowerCase()}function u(){return{id:null,name:"",strategy:"fallback",models:[]}}function b(){let[e,t]=(0,a.useState)([]),[r,c]=(0,a.useState)([]),[b,p]=(0,a.useState)([]),[h,g]=(0,a.useState)(!0),[f,y]=(0,a.useState)(""),[v,j]=(0,a.useState)(!1),[N,k]=(0,a.useState)(""),[w,C]=(0,a.useState)(null),[A,S]=(0,a.useState)(u()),[_,P]=(0,a.useState)(""),[M,T]=(0,a.useState)(!1),[E,I]=(0,a.useState)(""),[O,F]=(0,a.useState)(""),[R,$]=(0,a.useState)(""),[L,D]=(0,a.useState)("all"),[U,z]=(0,a.useState)(null),[q,K]=(0,a.useState)([]),[B,W]=(0,a.useState)(!1),[H,J]=(0,a.useState)(""),[G,V]=(0,a.useState)(!1),[X,Y]=(0,a.useState)(""),[Q,Z]=(0,a.useState)(""),ee=(0,a.useCallback)(async()=>{g(!0),y("");try{let[e,r]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-combos?scope=all",{cache:"no-store"})]),s=await e.json().catch(()=>({})),a=await r.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Failed to load personal connections");if(!r.ok)throw Error(a.error||"Failed to load cloud combos");t(Array.isArray(s.connections)?s.connections:[]),c(Array.isArray(a.combos)?a.combos:[]),p(Array.isArray(a.localDefaultModels)?a.localDefaultModels:[]),P(a.userId||""),T("all"===a.scope)}catch(e){y(e.message||"Failed to load cloud combos")}finally{g(!1)}},[]);(0,a.useEffect)(()=>{ee()},[ee]);let et=async e=>{z(e),J(""),Y(""),Z(""),W(!0);try{let e=await fetch("/api/keys?pageSize=100&status=active",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to load API keys");K(Array.isArray(t.keys)?t.keys:[])}catch(e){Y(e.message||"Failed to load API keys"),K([])}finally{W(!1)}};function er(){z(null),J(""),Y(""),Z("")}async function es(){if(U&&H){V(!0),Y("");try{let e=await fetch(`/api/personal-cloud-combos/${encodeURIComponent(U.id)}/api-key-models`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKeyId:H})}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to add combo to API key");Z(`Đ\xe3 th\xeam "${U.name}" v\xe0o API key ${t.key?.name||""}.`)}catch(e){Y(e.message||"Failed to add combo to API key")}finally{V(!1)}}}let ea=(0,a.useMemo)(()=>{let t=new Set,r=[];for(let s of e)if(!1!==s.isActive){for(let e of Array.isArray(s?.importedModels)&&s.importedModels.length>0?s.importedModels:Array.isArray(s?.availableModels)?s.availableModels:[])!e?.routeModel||t.has(e.routeModel)||(t.add(e.routeModel),r.push({provider:s.provider,connectionLabel:s.name||s.email||s.provider,model:e}))}return r},[e]),eo=(0,a.useMemo)(()=>new Set(b),[b]),el=(0,a.useMemo)(()=>new Set(ea.map(e=>e.model.routeModel)),[ea]),en=(0,a.useCallback)(e=>!eo.has(e)&&!el.has(e),[eo,el]),ed=x(_),ei=(0,a.useCallback)(e=>!M||!!ed&&x(e?.ownerUser)===ed,[M,ed]),ec=(0,a.useMemo)(()=>{let e=new Set;for(let t of r){let r=String(t.ownerUser||"").trim();r&&e.add(r)}return[...e].sort((e,t)=>e.localeCompare(t))},[r]),em=(0,a.useMemo)(()=>[...new Set(r.map(e=>e.strategy||"fallback"))].sort((e,t)=>m(e).localeCompare(m(t))),[r]),ex=!!E.trim()||!!O||!!R||"all"!==L,eu=(0,a.useMemo)(()=>{if(!M)return r;let e=E.trim().toLowerCase();return r.filter(t=>(!O||x(t.ownerUser)===x(O))&&(!R||(t.strategy||"fallback")===R)&&("active"!==L||!1!==t.isActive)&&("inactive"!==L||!1===t.isActive)&&(!e||[t.ownerUser,t.name,t.id,...t.models||[]].join(" ").toLowerCase().includes(e)))},[r,M,E,O,R,L]);function eb(){C(null),S(u()),k("")}function ep(e){S(t=>{let r=t.models.includes(e);return{...t,models:r?t.models.filter(t=>t!==e):[...t.models,e]}})}function eh(e,t){S(r=>{let s=[...r.models],a=e+t;return a<0||a>=s.length?r:([s[e],s[a]]=[s[a],s[e]],{...r,models:s})})}async function eg(){k("");let e=A.name.trim();if(!e)return void k("Name is required");if(0===A.models.length)return void k("Select at least one model");j(!0);try{let t="new"===w,r=t?"/api/personal-cloud-combos":`/api/personal-cloud-combos/${encodeURIComponent(A.id)}`,s=await fetch(r,{method:t?"POST":"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,strategy:A.strategy,models:A.models})}),a=await s.json().catch(()=>({}));if(!s.ok){let e=Array.isArray(a.invalidModels)&&a.invalidModels.length>0?`: ${a.invalidModels.join(", ")}`:"";throw Error((a.error||"Failed to save combo")+e)}await ee(),eb()}catch(e){k(e.message||"Failed to save combo")}finally{j(!1)}}async function ef(e){if(window.confirm(`Delete cloud combo "${e.name}"? This cannot be undone.`))try{let t=await fetch(`/api/personal-cloud-combos/${encodeURIComponent(e.id)}`,{method:"DELETE"}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Failed to delete combo");await ee()}catch(e){y(e.message||"Failed to delete combo")}}return h?(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4 text-sm text-text-muted",children:"Loading cloud combos…"}):(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("section",{className:"space-y-2",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-base font-semibold text-text-main",children:"Cloud Combos"}),(0,s.jsx)("p",{className:"mt-1 max-w-2xl text-xs leading-5 text-text-muted",children:"Tạo combo (fallback / round-robin) gồm c\xe1c model từ ch\xednh c\xe1c t\xe0i khoản OAuth c\xe1 nh\xe2n của bạn (Claude, Codex/OpenAI, Grok, Kiro...) v\xe0/hoặc local model lấy từ Default models của admin. Kh\xf4ng c\xf3 sampling override."}),M&&(0,s.jsxs)("p",{className:"mt-1.5 inline-flex items-center gap-1.5 rounded-lg border border-primary/30 bg-primary/5 px-2 py-1 text-[11px] text-primary",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"admin_panel_settings"}),"Chế độ admin: đang xem ",r.length," combo của to\xe0n hệ thống (",ec.length," người d\xf9ng). Combo của người kh\xe1c chỉ xem, kh\xf4ng sửa được."]})]}),null===w&&(0,s.jsxs)("button",{type:"button",onClick:function(){S(u()),k(""),C("new")},className:"inline-flex items-center gap-1.5 rounded-lg border border-border bg-background px-3 py-1.5 text-xs font-medium text-text-main transition hover:border-primary/30 hover:bg-surface",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"add"}),"New combo"]})]}),f&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-3 text-xs text-red-600",children:f}),M&&r.length>0&&(0,s.jsxs)("div",{className:"grid gap-2 md:grid-cols-[minmax(0,1fr)_auto_auto_auto]",children:[(0,s.jsx)("input",{type:"text",value:E,onChange:e=>I(e.target.value),placeholder:"T\xecm theo owner, t\xean combo, model id...",className:"h-9 w-full rounded-lg border border-border bg-background px-3 text-xs text-text-main outline-none focus:border-primary"}),(0,s.jsxs)("select",{value:O,onChange:e=>F(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"",children:"Tất cả owner"}),ec.map(e=>(0,s.jsx)("option",{value:e,children:e},e))]}),(0,s.jsxs)("select",{value:R,onChange:e=>$(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"",children:"Tất cả strategy"}),em.map(e=>(0,s.jsx)("option",{value:e,children:m(e)},e))]}),(0,s.jsxs)("select",{value:L,onChange:e=>D(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"all",children:"Tất cả trạng th\xe1i"}),(0,s.jsx)("option",{value:"active",children:"Đang hoạt động"}),(0,s.jsx)("option",{value:"inactive",children:"Cần xử l\xfd"})]})]}),M&&ex&&(0,s.jsxs)("div",{className:"flex items-center gap-2 text-[11px] text-text-muted",children:[(0,s.jsxs)("span",{children:["Hiện ",eu.length,"/",r.length," combo"]}),(0,s.jsx)("button",{type:"button",onClick:function(){I(""),F(""),$(""),D("all")},className:"text-primary hover:underline",children:"Xo\xe1 bộ lọc"})]})]}),null!==w&&(0,s.jsxs)(o.default,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1 block text-xs font-medium text-text-muted",children:"Name"}),(0,s.jsx)("input",{type:"text",value:A.name,onChange:e=>S(t=>({...t,name:e.target.value})),placeholder:"my-claude-fallback",className:"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-text-main"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1 block text-xs font-medium text-text-muted",children:"Strategy"}),(0,s.jsx)("div",{className:"flex gap-2",children:i.map(e=>(0,s.jsxs)("button",{type:"button",onClick:()=>S(t=>({...t,strategy:e.id})),className:`inline-flex flex-1 items-center justify-center gap-1.5 rounded-lg border px-3 py-2 text-xs font-medium transition ${A.strategy===e.id?"border-primary/40 bg-primary/10 text-primary":"border-border bg-background text-text-main hover:border-primary/30"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:e.icon}),e.label]},e.id))})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-xs font-medium text-text-muted",children:"Models in this combo (order = fallback priority)"}),0===A.models.length?(0,s.jsx)("div",{className:"rounded-lg border border-dashed border-border p-3 text-xs text-text-muted",children:"Chưa chọn model n\xe0o."}):(0,s.jsx)("div",{className:"space-y-1.5",children:A.models.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-background px-3 py-1.5",children:[(0,s.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs font-mono text-text-main",children:e}),eo.has(e)&&(0,s.jsx)("span",{className:"rounded bg-sky-500/10 px-1.5 py-0.5 text-[10px] font-medium text-sky-600",children:"Local"}),en(e)&&(0,s.jsx)("span",{className:"rounded bg-amber-500/10 px-1.5 py-0.5 text-[10px] font-medium text-amber-600",title:"Kh\xf4ng c\xf2n trong Default models / OAuth của bạn — h\xe3y xo\xe1 trước khi lưu",children:"Kh\xf4ng c\xf2n khả dụng"}),(0,s.jsx)("button",{type:"button",onClick:()=>eh(t,-1),disabled:0===t,className:"text-text-muted hover:text-text-main disabled:opacity-30",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,s.jsx)("button",{type:"button",onClick:()=>eh(t,1),disabled:t===A.models.length-1,className:"text-text-muted hover:text-text-main disabled:opacity-30",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,s.jsx)("button",{type:"button",onClick:()=>{S(t=>({...t,models:t.models.filter(t=>t!==e)}))},className:"text-red-500 hover:text-red-600",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]},e))})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-xs font-medium text-text-muted",children:"Model của bạn (chỉ hiện model từ OAuth connection đang active của bạn)"}),0===ea.length?(0,s.jsx)("div",{className:"rounded-lg border border-dashed border-border p-3 text-xs text-text-muted",children:"Bạn chưa c\xf3 personal OAuth connection n\xe0o đang active. Kết nối t\xe0i khoản ở tab Personal OAuth trước."}):(0,s.jsx)("div",{className:"grid max-h-64 gap-1.5 overflow-y-auto rounded-lg border border-border p-2 sm:grid-cols-2",children:ea.map(({provider:e,connectionLabel:t,model:r})=>{let a=A.models.includes(r.routeModel),o="review"===r.quotaFamily,n=o?r.name.replace(/ Review$/,""):r.name;return(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-xs hover:bg-surface-2/50",children:[(0,s.jsx)("input",{type:"checkbox",checked:a,onChange:()=>ep(r.routeModel),className:"shrink-0"}),(0,s.jsx)(l.A,{src:`/providers/${e}.png`,alt:e,size:18,className:"shrink-0 rounded object-contain",fallbackText:String(e||"?").slice(0,2).toUpperCase()}),(0,s.jsxs)("span",{className:"min-w-0 flex-1 truncate",children:[(0,s.jsxs)("span",{className:"block truncate",children:[(0,s.jsx)("span",{className:"font-medium text-text-main",children:n}),o&&(0,s.jsx)("span",{className:"ml-1 rounded bg-amber-500/10 px-1 py-0.5 text-[10px] font-medium text-amber-600",children:"Review quota"}),(0,s.jsxs)("span",{className:"ml-1 text-text-muted",children:["\xb7 ",t]})]}),(0,s.jsx)("span",{className:"block truncate font-mono text-[10px] text-text-muted/70",children:r.routeModel})]})]},`${t}:${r.routeModel}`)})})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-xs font-medium text-text-muted",children:"Local models (từ Default models cho API key do admin cấu h\xecnh)"}),0===b.length?(0,s.jsx)("div",{className:"rounded-lg border border-dashed border-border p-3 text-xs text-text-muted",children:"Admin chưa cấu h\xecnh Default model local n\xe0o (Default models ở /dashboard/api-keys)."}):(0,s.jsx)("div",{className:"grid max-h-48 gap-1.5 overflow-y-auto rounded-lg border border-border p-2 sm:grid-cols-2",children:b.map(e=>(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-xs hover:bg-surface-2/50",children:[(0,s.jsx)("input",{type:"checkbox",checked:A.models.includes(e),onChange:()=>ep(e),className:"shrink-0"}),(0,s.jsx)("span",{className:"material-symbols-outlined shrink-0 text-[16px] text-sky-600",children:"dns"}),(0,s.jsx)("span",{className:"min-w-0 flex-1 truncate font-mono text-text-main",children:e})]},e))}),(0,s.jsx)("p",{className:"mt-1.5 text-[11px] leading-4 text-text-muted",children:"Local model chạy bằng pool hệ thống, kh\xf4ng phải t\xe0i khoản OAuth của bạn. Trộn với model cloud: thứ tự tr\xean l\xe0 thứ tự fallback; nếu admin gỡ model khỏi Default models th\xec combo sẽ bỏ qua model đ\xf3."})]}),N&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-2.5 text-xs text-red-600",children:N}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{type:"button",onClick:eb,className:"rounded-lg border border-border bg-background px-3 py-1.5 text-xs font-medium text-text-main hover:bg-surface",children:"Cancel"}),(0,s.jsx)("button",{type:"button",onClick:eg,disabled:v,className:"rounded-lg border border-primary/40 bg-primary/10 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary/20 disabled:opacity-50",children:v?"Saving…":"new"===w?"Create combo":"Save changes"})]})]}),(0,s.jsxs)("div",{className:"grid gap-3 xl:grid-cols-2",children:[0===r.length&&null===w?(0,s.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:M?"Chưa c\xf3 ai tạo cloud combo n\xe0o.":"Bạn chưa c\xf3 cloud combo n\xe0o."}):null,r.length>0&&0===eu.length?(0,s.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 combo n\xe0o khớp bộ lọc."}):null,eu.map(e=>(0,s.jsxs)(o.default,{className:"space-y-3",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("div",{className:"truncate text-sm font-semibold text-text-main",children:e.name}),!1===e.isActive&&(0,s.jsx)("span",{className:"rounded-full border border-amber-500/30 bg-amber-500/10 px-2 py-0.5 text-[10px] font-semibold text-amber-600",children:"No models left — needs attention"})]}),(0,s.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:[m(e.strategy)," \xb7 ",e.models?.length||0," model(s)"]}),M&&(0,s.jsxs)("div",{className:"mt-1 flex items-center gap-1 text-[11px] text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"person"}),(0,s.jsx)("span",{className:"truncate",children:e.ownerUser||"—"})]})]}),ei(e)?(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>et(e),className:"inline-flex items-center gap-1 rounded-lg border border-primary/30 bg-primary/5 px-2 py-1.5 text-[11px] font-medium text-primary hover:bg-primary/10",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"vpn_key"}),"Add this combo to API key"]}),(0,s.jsx)("button",{type:"button",onClick:()=>{S({id:e.id,name:e.name,strategy:e.strategy||"fallback",models:[...e.models||[]]}),k(""),C(e.id)},className:"rounded-lg border border-border bg-background p-1.5 text-text-muted hover:text-text-main",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"edit"})}),(0,s.jsx)("button",{type:"button",onClick:()=>ef(e),className:"rounded-lg border border-border bg-background p-1.5 text-red-500 hover:bg-red-500/5",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"delete"})})]}):(0,s.jsxs)("span",{className:"inline-flex shrink-0 items-center gap-1 rounded-full border border-border bg-background px-2 py-0.5 text-[10px] font-medium text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"lock"}),"Chỉ xem"]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-background px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"model id để gọi API"}),(0,s.jsx)("code",{className:"min-w-0 flex-1 truncate text-xs text-text-main",children:e.id}),(0,s.jsx)("button",{type:"button",onClick:()=>(function(e){try{navigator.clipboard?.writeText(e)}catch{}})(e.id),className:"text-text-muted hover:text-text-main",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"content_copy"})})]}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1.5",children:(e.models||[]).map(e=>(0,s.jsxs)("span",{className:"rounded-full border border-border bg-background px-2 py-0.5 text-[11px] font-mono text-text-muted",children:[eo.has(e)?(0,s.jsx)("span",{className:"mr-1 text-sky-600",children:"local"}):null,e]},e))})]},e.id))]}),(0,s.jsx)(n.default,{isOpen:!!U,onClose:er,title:`Add "${U?.name||""}" to API key`,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(d.default,{variant:"ghost",onClick:er,disabled:G,children:"Cancel"}),(0,s.jsx)(d.default,{onClick:es,loading:G,disabled:!H,children:"Add to key"})]}),children:(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsxs)("p",{className:"text-sm text-text-muted",children:["Th\xeam model id ",(0,s.jsx)("code",{className:"font-mono text-text-main",children:U?.id})," v\xe0o ",(0,s.jsx)("code",{children:"allowedModels"})," của API key đ\xe3 chọn (chỉ hiện API key của ch\xednh bạn)."]}),(0,s.jsx)("p",{className:"rounded-lg border border-primary/20 bg-primary/5 p-2.5 text-xs text-text-muted",children:"Chỉ cần cấp quyền combo: API key d\xf9ng được combo n\xe0y m\xe0 kh\xf4ng cần cấp quyền ri\xeang cho từng model b\xean trong."}),(0,s.jsxs)("label",{className:"block text-sm",children:[(0,s.jsx)("span",{className:"mb-1 block font-medium text-text-main",children:"API key"}),(0,s.jsxs)("select",{value:H,onChange:e=>J(e.target.value),className:"h-10 w-full rounded-xl border border-border bg-background px-3 text-sm text-text-main outline-none focus:border-primary",disabled:B,children:[(0,s.jsx)("option",{value:"",children:B?"Đang tải API keys...":"Chọn API key"}),q.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name||e.id},e.id))]})]}),B||0!==q.length?null:(0,s.jsx)("div",{className:"rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700",children:"Bạn chưa c\xf3 API key active n\xe0o. Tạo API key ở /dashboard/api-keys trước."}),X&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-2.5 text-xs text-red-600",children:X}),Q&&(0,s.jsx)("div",{className:"rounded-lg border border-green-500/20 bg-green-500/5 p-2.5 text-xs text-green-600",children:Q})]})})]})}},57250:(e,t,r)=>{"use strict";r.d(t,{A:()=>n});var s=r(95155),a=r(12115),o=r(14051),l=r.n(o);function n({src:e,alt:t,size:r=32,className:o="",fallbackText:l="?",fallbackColor:d}){let[i,c]=(0,a.useState)(!1);return!e||i?(0,s.jsx)("span",{className:`inline-flex items-center justify-center font-bold rounded-lg ${o}`.trim(),style:{width:r,height:r,color:d,fontSize:Math.max(10,Math.floor(.38*r))},children:l}):(0,s.jsx)("img",{src:e,alt:t,width:r,height:r,className:o,onError:()=>c(!0)})}n.propTypes={src:l().string,alt:l().string,size:l().number,className:l().string,fallbackText:l().string,fallbackColor:l().string}},81127:(e,t,r)=>{"use strict";r.d(t,{ConfirmModal:()=>b,default:()=>u});var s=r(95155),a=r(12115),o=r(31474),l=r(92542),n=r(97677),d=r(46442);let i=[],c="";function m(){1===i.length?(c=document.body.style.overflow,document.body.style.overflow="hidden"):0===i.length&&(document.body.style.overflow=c)}function x(e,t){return!!e&&Object.prototype.hasOwnProperty.call(e,t)}function u({isOpen:e,onClose:t,title:r,children:l,footer:c,size:b="md",closeOnOverlay:p=!0,showTrafficLights:h=!0,busy:g=!1,className:f}){let y=(0,a.useRef)({onClose:t,busy:g}),v=(0,d.t)(),j=v?.({title:r,children:l,footer:c,size:b,className:f})||null,N=x(j,"children")?j.children:l,k=x(j,"footer")?j.footer:c,w=j?.size||b,C=(0,o.cn)(f,j?.className);y.current.onClose=t,y.current.busy=g;let A={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=y.current;i.push(t),m();let r=e=>{if("Escape"!==e.key)return;let r=i[i.length-1];r!==t||r.busy||(e.preventDefault(),r.onClose())};return document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r);let e=i.indexOf(t);-1!==e&&i.splice(e,1),m()}},[e]),e)?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in",onClick:p&&!g?t:void 0}),(0,s.jsxs)("div",{className:(0,o.cn)("relative w-full bg-surface","border border-border-subtle","rounded-[14px] shadow-[var(--shadow-elev)]","fade-in",A[w]||A.md,C),children:[(r||h)&&(0,s.jsxs)("div",{className:"flex items-center justify-between p-2 border-b border-border-subtle",children:[(0,s.jsxs)("div",{className:"flex items-center",children:[h&&(0,s.jsxs)("div",{className:"hidden md:flex items-center gap-2 mr-4 ml-2",children:[(0,s.jsx)(n.default,{text:"Close",position:"top",color:"#FF5F56",children:(0,s.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,s.jsx)("span",{className:"text-[9px] font-bold text-white opacity-0 group-hover/dot:opacity-100 transition-opacity leading-none",children:"✕"})})}),(0,s.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"}),(0,s.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"})]}),r&&(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:r})]}),(0,s.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,s.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,s.jsx)("div",{className:"p-6 max-h-[calc(85vh-100px)] overflow-y-auto custom-scrollbar",children:N}),k&&(0,s.jsx)("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-border-subtle",children:k})]})]}):null}function b({isOpen:e,onClose:t,onConfirm:r,title:a="Confirm",message:o,confirmText:n="Confirm",cancelText:d="Cancel",variant:i="danger",loading:c=!1}){return(0,s.jsx)(u,{isOpen:e,onClose:t,title:a,size:"sm",busy:c,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(l.default,{variant:"ghost",onClick:t,disabled:c,children:d}),(0,s.jsx)(l.default,{variant:i,onClick:r,loading:c,children:n})]}),children:(0,s.jsx)("p",{className:"text-text-muted",children:o})})}},82114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},84588:(e,t,r)=>{"use strict";r.d(t,{default:()=>o});var s=r(95155),a=r(31474);function o({children:e,title:t,subtitle:r,icon:l,action:n,padding:d="md",hover:i=!1,elev:c=!1,className:m,...x}){return(0,s.jsxs)("div",{className:(0,a.cn)("bg-surface border border-border",c?"rounded-[14px] shadow-[var(--shadow-elev)]":"rounded-[14px] shadow-[0_1px_2px_rgba(15,23,42,0.045),0_12px_28px_-26px_rgba(37,99,235,0.38)]",i&&"hover:shadow-[var(--shadow-warm)] hover:border-brand-500/40 transition-all cursor-pointer",{none:"",xs:"p-3",sm:"p-4",md:"p-5",lg:"p-6"}[d],m),...x,children:[(t||n)&&(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[l&&(0,s.jsx)("div",{className:"p-2 rounded-[10px] bg-bg-alt border border-border-subtle text-text-muted",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:l})}),(0,s.jsxs)("div",{children:[t&&(0,s.jsx)("h3",{className:"text-text-main font-semibold",children:t}),r&&(0,s.jsx)("p",{className:"text-sm text-text-muted",children:r})]})]}),n]}),e]})}o.Section=function({children:e,className:t,...r}){return(0,s.jsx)("div",{className:(0,a.cn)("p-4 rounded-[10px]","bg-bg-alt border border-border",t),...r,children:e})},o.Row=function({children:e,className:t,...r}){return(0,s.jsx)("div",{className:(0,a.cn)("p-3 -mx-3 px-3 transition-colors","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50",t),...r,children:e})},o.ListItem=function({children:e,actions:t,className:r,...o}){return(0,s.jsxs)("div",{className:(0,a.cn)("group flex items-center justify-between p-3 -mx-3 px-3","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50 transition-colors",r),...o,children:[(0,s.jsx)("div",{className:"flex-1 min-w-0",children:e}),t&&(0,s.jsx)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:t})]})}},92542:(e,t,r)=>{"use strict";r.d(t,{default:()=>n});var s=r(95155),a=r(31474);let o={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"},l={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 n({children:e,variant:t="primary",size:r="md",icon:d,iconRight:i,disabled:c=!1,loading:m=!1,fullWidth:x=!1,className:u,...b}){return(0,s.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",o[t],l[r],x&&"w-full",u),disabled:c||m,...b,children:[m?(0,s.jsx)("span",{className:"material-symbols-outlined animate-spin text-[18px]",children:"progress_activity"}):d?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:d}):null,e,i&&!m&&(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:i})]})}},97677:(e,t,r)=>{"use strict";r.d(t,{default:()=>a});var s=r(95155);function a({text:e,children:t,position:r="top",color:o}){let l=o?"":"bg-gray-900";return(0,s.jsxs)("div",{className:"relative inline-flex group",children:[t,(0,s.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"}[r]} z-50 w-max max-w-56 rounded px-2 py-1 text-[11px] leading-snug ${l} text-white opacity-0 group-hover:opacity-100 transition-opacity duration-150 whitespace-normal`,style:o?{backgroundColor:o}:{},children:e})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=10332)),_N_E=e.O()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "5.5.34",
3
+ "version": "5.5.35",
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.5.35",
3
+ "version": "5.5.36",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[823],{10332:(e,t,r)=>{Promise.resolve().then(r.bind(r,49711))},14051:(e,t,r)=>{e.exports=r(34701)()},31474:(e,t,r)=>{"use strict";function s(...e){return e.filter(Boolean).join(" ").replace(/\s+/g," ").trim()}r.d(t,{cn:()=>s})},34701:(e,t,r)=>{"use strict";var s=r(82114);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,r,a,o,n){if(n!==s){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return r.PropTypes=r,r}},46442:(e,t,r)=>{"use strict";r.d(t,{j:()=>n,t:()=>l});var s=r(95155),a=r(12115);let o=(0,a.createContext)(null);function n({resolver:e,children:t}){return(0,s.jsx)(o.Provider,{value:"function"==typeof e?e:null,children:t})}function l(){return(0,a.useContext)(o)}},49711:(e,t,r)=>{"use strict";r.d(t,{default:()=>b});var s=r(95155),a=r(12115),o=r(84588),n=r(57250),l=r(81127),d=r(92542);let i=[{id:"fallback",label:"Fallback (priority order)",icon:"swap_vert"},{id:"round-robin",label:"Round Robin",icon:"sync"}],c={fallback:"Fallback (priority order)","round-robin":"Round Robin",sticky:"Sticky","least-latency":"Least latency",p2c:"Power of two choices"};function m(e){return c[e]||e||"fallback"}function x(e){return String(e||"").trim().toLowerCase()}function u(){return{id:null,name:"",strategy:"fallback",models:[]}}function b(){let[e,t]=(0,a.useState)([]),[r,c]=(0,a.useState)([]),[b,p]=(0,a.useState)(!0),[h,g]=(0,a.useState)(""),[f,y]=(0,a.useState)(!1),[v,j]=(0,a.useState)(""),[N,w]=(0,a.useState)(null),[k,C]=(0,a.useState)(u()),[S,A]=(0,a.useState)(""),[_,P]=(0,a.useState)(!1),[E,T]=(0,a.useState)(""),[I,M]=(0,a.useState)(""),[O,F]=(0,a.useState)(""),[R,$]=(0,a.useState)("all"),[L,U]=(0,a.useState)(null),[z,q]=(0,a.useState)([]),[B,D]=(0,a.useState)(!1),[K,W]=(0,a.useState)(""),[H,J]=(0,a.useState)(!1),[G,V]=(0,a.useState)(""),[X,Y]=(0,a.useState)(""),Q=(0,a.useCallback)(async()=>{p(!0),g("");try{let[e,r]=await Promise.all([fetch("/api/personal-cloud-providers",{cache:"no-store"}),fetch("/api/personal-cloud-combos?scope=all",{cache:"no-store"})]),s=await e.json().catch(()=>({})),a=await r.json().catch(()=>({}));if(!e.ok)throw Error(s.error||"Failed to load personal connections");if(!r.ok)throw Error(a.error||"Failed to load cloud combos");t(Array.isArray(s.connections)?s.connections:[]),c(Array.isArray(a.combos)?a.combos:[]),A(a.userId||""),P("all"===a.scope)}catch(e){g(e.message||"Failed to load cloud combos")}finally{p(!1)}},[]);(0,a.useEffect)(()=>{Q()},[Q]);let Z=async e=>{U(e),W(""),V(""),Y(""),D(!0);try{let e=await fetch("/api/keys?pageSize=100&status=active",{cache:"no-store"}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to load API keys");q(Array.isArray(t.keys)?t.keys:[])}catch(e){V(e.message||"Failed to load API keys"),q([])}finally{D(!1)}};function ee(){U(null),W(""),V(""),Y("")}async function et(){if(L&&K){J(!0),V("");try{let e=await fetch(`/api/personal-cloud-combos/${encodeURIComponent(L.id)}/api-key-models`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKeyId:K})}),t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||"Failed to add combo to API key");Y(`Đ\xe3 th\xeam "${L.name}" v\xe0o API key ${t.key?.name||""}.`)}catch(e){V(e.message||"Failed to add combo to API key")}finally{J(!1)}}}let er=(0,a.useMemo)(()=>{let t=new Set,r=[];for(let s of e)if(!1!==s.isActive){for(let e of Array.isArray(s?.importedModels)&&s.importedModels.length>0?s.importedModels:Array.isArray(s?.availableModels)?s.availableModels:[])!e?.routeModel||t.has(e.routeModel)||(t.add(e.routeModel),r.push({provider:s.provider,connectionLabel:s.name||s.email||s.provider,model:e}))}return r},[e]),es=x(S),ea=(0,a.useCallback)(e=>!_||!!es&&x(e?.ownerUser)===es,[_,es]),eo=(0,a.useMemo)(()=>{let e=new Set;for(let t of r){let r=String(t.ownerUser||"").trim();r&&e.add(r)}return[...e].sort((e,t)=>e.localeCompare(t))},[r]),en=(0,a.useMemo)(()=>[...new Set(r.map(e=>e.strategy||"fallback"))].sort((e,t)=>m(e).localeCompare(m(t))),[r]),el=!!E.trim()||!!I||!!O||"all"!==R,ed=(0,a.useMemo)(()=>{if(!_)return r;let e=E.trim().toLowerCase();return r.filter(t=>(!I||x(t.ownerUser)===x(I))&&(!O||(t.strategy||"fallback")===O)&&("active"!==R||!1!==t.isActive)&&("inactive"!==R||!1===t.isActive)&&(!e||[t.ownerUser,t.name,t.id,...t.models||[]].join(" ").toLowerCase().includes(e)))},[r,_,E,I,O,R]);function ei(){w(null),C(u()),j("")}function ec(e,t){C(r=>{let s=[...r.models],a=e+t;return a<0||a>=s.length?r:([s[e],s[a]]=[s[a],s[e]],{...r,models:s})})}async function em(){j("");let e=k.name.trim();if(!e)return void j("Name is required");if(0===k.models.length)return void j("Select at least one model");y(!0);try{let t="new"===N,r=t?"/api/personal-cloud-combos":`/api/personal-cloud-combos/${encodeURIComponent(k.id)}`,s=await fetch(r,{method:t?"POST":"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,strategy:k.strategy,models:k.models})}),a=await s.json().catch(()=>({}));if(!s.ok){let e=Array.isArray(a.invalidModels)&&a.invalidModels.length>0?`: ${a.invalidModels.join(", ")}`:"";throw Error((a.error||"Failed to save combo")+e)}await Q(),ei()}catch(e){j(e.message||"Failed to save combo")}finally{y(!1)}}async function ex(e){if(window.confirm(`Delete cloud combo "${e.name}"? This cannot be undone.`))try{let t=await fetch(`/api/personal-cloud-combos/${encodeURIComponent(e.id)}`,{method:"DELETE"}),r=await t.json().catch(()=>({}));if(!t.ok)throw Error(r.error||"Failed to delete combo");await Q()}catch(e){g(e.message||"Failed to delete combo")}}return b?(0,s.jsx)("div",{className:"rounded-2xl border border-border bg-surface p-4 text-sm text-text-muted",children:"Loading cloud combos…"}):(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("section",{className:"space-y-2",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-base font-semibold text-text-main",children:"Cloud Combos"}),(0,s.jsx)("p",{className:"mt-1 max-w-2xl text-xs leading-5 text-text-muted",children:"Tạo combo (fallback / round-robin) gồm c\xe1c model từ ch\xednh c\xe1c t\xe0i khoản OAuth c\xe1 nh\xe2n của bạn (Claude, Codex/OpenAI, Grok, Kiro...). Kh\xf4ng c\xf3 sampling override."}),_&&(0,s.jsxs)("p",{className:"mt-1.5 inline-flex items-center gap-1.5 rounded-lg border border-primary/30 bg-primary/5 px-2 py-1 text-[11px] text-primary",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"admin_panel_settings"}),"Chế độ admin: đang xem ",r.length," combo của to\xe0n hệ thống (",eo.length," người d\xf9ng). Combo của người kh\xe1c chỉ xem, kh\xf4ng sửa được."]})]}),null===N&&(0,s.jsxs)("button",{type:"button",onClick:function(){C(u()),j(""),w("new")},className:"inline-flex items-center gap-1.5 rounded-lg border border-border bg-background px-3 py-1.5 text-xs font-medium text-text-main transition hover:border-primary/30 hover:bg-surface",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"add"}),"New combo"]})]}),h&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-3 text-xs text-red-600",children:h}),_&&r.length>0&&(0,s.jsxs)("div",{className:"grid gap-2 md:grid-cols-[minmax(0,1fr)_auto_auto_auto]",children:[(0,s.jsx)("input",{type:"text",value:E,onChange:e=>T(e.target.value),placeholder:"T\xecm theo owner, t\xean combo, model id...",className:"h-9 w-full rounded-lg border border-border bg-background px-3 text-xs text-text-main outline-none focus:border-primary"}),(0,s.jsxs)("select",{value:I,onChange:e=>M(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"",children:"Tất cả owner"}),eo.map(e=>(0,s.jsx)("option",{value:e,children:e},e))]}),(0,s.jsxs)("select",{value:O,onChange:e=>F(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"",children:"Tất cả strategy"}),en.map(e=>(0,s.jsx)("option",{value:e,children:m(e)},e))]}),(0,s.jsxs)("select",{value:R,onChange:e=>$(e.target.value),className:"h-9 rounded-lg border border-border bg-background px-2 text-xs text-text-main outline-none focus:border-primary",children:[(0,s.jsx)("option",{value:"all",children:"Tất cả trạng th\xe1i"}),(0,s.jsx)("option",{value:"active",children:"Đang hoạt động"}),(0,s.jsx)("option",{value:"inactive",children:"Cần xử l\xfd"})]})]}),_&&el&&(0,s.jsxs)("div",{className:"flex items-center gap-2 text-[11px] text-text-muted",children:[(0,s.jsxs)("span",{children:["Hiện ",ed.length,"/",r.length," combo"]}),(0,s.jsx)("button",{type:"button",onClick:function(){T(""),M(""),F(""),$("all")},className:"text-primary hover:underline",children:"Xo\xe1 bộ lọc"})]})]}),null!==N&&(0,s.jsxs)(o.default,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1 block text-xs font-medium text-text-muted",children:"Name"}),(0,s.jsx)("input",{type:"text",value:k.name,onChange:e=>C(t=>({...t,name:e.target.value})),placeholder:"my-claude-fallback",className:"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-text-main"})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("label",{className:"mb-1 block text-xs font-medium text-text-muted",children:"Strategy"}),(0,s.jsx)("div",{className:"flex gap-2",children:i.map(e=>(0,s.jsxs)("button",{type:"button",onClick:()=>C(t=>({...t,strategy:e.id})),className:`inline-flex flex-1 items-center justify-center gap-1.5 rounded-lg border px-3 py-2 text-xs font-medium transition ${k.strategy===e.id?"border-primary/40 bg-primary/10 text-primary":"border-border bg-background text-text-main hover:border-primary/30"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:e.icon}),e.label]},e.id))})]})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-xs font-medium text-text-muted",children:"Models in this combo (order = fallback priority)"}),0===k.models.length?(0,s.jsx)("div",{className:"rounded-lg border border-dashed border-border p-3 text-xs text-text-muted",children:"Chưa chọn model n\xe0o."}):(0,s.jsx)("div",{className:"space-y-1.5",children:k.models.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-background px-3 py-1.5",children:[(0,s.jsx)("span",{className:"min-w-0 flex-1 truncate text-xs font-mono text-text-main",children:e}),(0,s.jsx)("button",{type:"button",onClick:()=>ec(t,-1),disabled:0===t,className:"text-text-muted hover:text-text-main disabled:opacity-30",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_upward"})}),(0,s.jsx)("button",{type:"button",onClick:()=>ec(t,1),disabled:t===k.models.length-1,className:"text-text-muted hover:text-text-main disabled:opacity-30",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"arrow_downward"})}),(0,s.jsx)("button",{type:"button",onClick:()=>{C(t=>({...t,models:t.models.filter(t=>t!==e)}))},className:"text-red-500 hover:text-red-600",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]},e))})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"mb-2 text-xs font-medium text-text-muted",children:"Model của bạn (chỉ hiện model từ OAuth connection đang active của bạn)"}),0===er.length?(0,s.jsx)("div",{className:"rounded-lg border border-dashed border-border p-3 text-xs text-text-muted",children:"Bạn chưa c\xf3 personal OAuth connection n\xe0o đang active. Kết nối t\xe0i khoản ở tab Personal OAuth trước."}):(0,s.jsx)("div",{className:"grid max-h-64 gap-1.5 overflow-y-auto rounded-lg border border-border p-2 sm:grid-cols-2",children:er.map(({provider:e,connectionLabel:t,model:r})=>{let a=k.models.includes(r.routeModel),o="review"===r.quotaFamily,l=o?r.name.replace(/ Review$/,""):r.name;return(0,s.jsxs)("label",{className:"flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 text-xs hover:bg-surface-2/50",children:[(0,s.jsx)("input",{type:"checkbox",checked:a,onChange:()=>{var e;return e=r.routeModel,void C(t=>{let r=t.models.includes(e);return{...t,models:r?t.models.filter(t=>t!==e):[...t.models,e]}})},className:"shrink-0"}),(0,s.jsx)(n.A,{src:`/providers/${e}.png`,alt:e,size:18,className:"shrink-0 rounded object-contain",fallbackText:String(e||"?").slice(0,2).toUpperCase()}),(0,s.jsxs)("span",{className:"min-w-0 flex-1 truncate",children:[(0,s.jsxs)("span",{className:"block truncate",children:[(0,s.jsx)("span",{className:"font-medium text-text-main",children:l}),o&&(0,s.jsx)("span",{className:"ml-1 rounded bg-amber-500/10 px-1 py-0.5 text-[10px] font-medium text-amber-600",children:"Review quota"}),(0,s.jsxs)("span",{className:"ml-1 text-text-muted",children:["\xb7 ",t]})]}),(0,s.jsx)("span",{className:"block truncate font-mono text-[10px] text-text-muted/70",children:r.routeModel})]})]},`${t}:${r.routeModel}`)})})]}),v&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-2.5 text-xs text-red-600",children:v}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)("button",{type:"button",onClick:ei,className:"rounded-lg border border-border bg-background px-3 py-1.5 text-xs font-medium text-text-main hover:bg-surface",children:"Cancel"}),(0,s.jsx)("button",{type:"button",onClick:em,disabled:f,className:"rounded-lg border border-primary/40 bg-primary/10 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary/20 disabled:opacity-50",children:f?"Saving…":"new"===N?"Create combo":"Save changes"})]})]}),(0,s.jsxs)("div",{className:"grid gap-3 xl:grid-cols-2",children:[0===r.length&&null===N?(0,s.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:_?"Chưa c\xf3 ai tạo cloud combo n\xe0o.":"Bạn chưa c\xf3 cloud combo n\xe0o."}):null,r.length>0&&0===ed.length?(0,s.jsx)("div",{className:"col-span-full rounded-2xl border border-dashed border-border p-6 text-center text-sm text-text-muted",children:"Kh\xf4ng c\xf3 combo n\xe0o khớp bộ lọc."}):null,ed.map(e=>(0,s.jsxs)(o.default,{className:"space-y-3",children:[(0,s.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("div",{className:"truncate text-sm font-semibold text-text-main",children:e.name}),!1===e.isActive&&(0,s.jsx)("span",{className:"rounded-full border border-amber-500/30 bg-amber-500/10 px-2 py-0.5 text-[10px] font-semibold text-amber-600",children:"No models left — needs attention"})]}),(0,s.jsxs)("div",{className:"mt-1 text-xs text-text-muted",children:[m(e.strategy)," \xb7 ",e.models?.length||0," model(s)"]}),_&&(0,s.jsxs)("div",{className:"mt-1 flex items-center gap-1 text-[11px] text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"person"}),(0,s.jsx)("span",{className:"truncate",children:e.ownerUser||"—"})]})]}),ea(e)?(0,s.jsxs)("div",{className:"flex items-center gap-1",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>Z(e),className:"inline-flex items-center gap-1 rounded-lg border border-primary/30 bg-primary/5 px-2 py-1.5 text-[11px] font-medium text-primary hover:bg-primary/10",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"vpn_key"}),"Add this combo to API key"]}),(0,s.jsx)("button",{type:"button",onClick:()=>{C({id:e.id,name:e.name,strategy:e.strategy||"fallback",models:[...e.models||[]]}),j(""),w(e.id)},className:"rounded-lg border border-border bg-background p-1.5 text-text-muted hover:text-text-main",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"edit"})}),(0,s.jsx)("button",{type:"button",onClick:()=>ex(e),className:"rounded-lg border border-border bg-background p-1.5 text-red-500 hover:bg-red-500/5",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"delete"})})]}):(0,s.jsxs)("span",{className:"inline-flex shrink-0 items-center gap-1 rounded-full border border-border bg-background px-2 py-0.5 text-[10px] font-medium text-text-muted",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"lock"}),"Chỉ xem"]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-background px-2.5 py-1.5",children:[(0,s.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-text-muted",children:"model id để gọi API"}),(0,s.jsx)("code",{className:"min-w-0 flex-1 truncate text-xs text-text-main",children:e.id}),(0,s.jsx)("button",{type:"button",onClick:()=>(function(e){try{navigator.clipboard?.writeText(e)}catch{}})(e.id),className:"text-text-muted hover:text-text-main",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"content_copy"})})]}),(0,s.jsx)("div",{className:"flex flex-wrap gap-1.5",children:(e.models||[]).map(e=>(0,s.jsx)("span",{className:"rounded-full border border-border bg-background px-2 py-0.5 text-[11px] font-mono text-text-muted",children:e},e))})]},e.id))]}),(0,s.jsx)(l.default,{isOpen:!!L,onClose:ee,title:`Add "${L?.name||""}" to API key`,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(d.default,{variant:"ghost",onClick:ee,disabled:H,children:"Cancel"}),(0,s.jsx)(d.default,{onClick:et,loading:H,disabled:!K,children:"Add to key"})]}),children:(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsxs)("p",{className:"text-sm text-text-muted",children:["Th\xeam model id ",(0,s.jsx)("code",{className:"font-mono text-text-main",children:L?.id})," v\xe0o ",(0,s.jsx)("code",{children:"allowedModels"})," của API key đ\xe3 chọn (chỉ hiện API key của ch\xednh bạn)."]}),(0,s.jsx)("p",{className:"rounded-lg border border-primary/20 bg-primary/5 p-2.5 text-xs text-text-muted",children:"Chỉ cần cấp quyền combo: API key d\xf9ng được combo n\xe0y m\xe0 kh\xf4ng cần cấp quyền ri\xeang cho từng model b\xean trong."}),(0,s.jsxs)("label",{className:"block text-sm",children:[(0,s.jsx)("span",{className:"mb-1 block font-medium text-text-main",children:"API key"}),(0,s.jsxs)("select",{value:K,onChange:e=>W(e.target.value),className:"h-10 w-full rounded-xl border border-border bg-background px-3 text-sm text-text-main outline-none focus:border-primary",disabled:B,children:[(0,s.jsx)("option",{value:"",children:B?"Đang tải API keys...":"Chọn API key"}),z.map(e=>(0,s.jsx)("option",{value:e.id,children:e.name||e.id},e.id))]})]}),B||0!==z.length?null:(0,s.jsx)("div",{className:"rounded-xl border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700",children:"Bạn chưa c\xf3 API key active n\xe0o. Tạo API key ở /dashboard/api-keys trước."}),G&&(0,s.jsx)("div",{className:"rounded-lg border border-red-500/20 bg-red-500/5 p-2.5 text-xs text-red-600",children:G}),X&&(0,s.jsx)("div",{className:"rounded-lg border border-green-500/20 bg-green-500/5 p-2.5 text-xs text-green-600",children:X})]})})]})}},57250:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var s=r(95155),a=r(12115),o=r(14051),n=r.n(o);function l({src:e,alt:t,size:r=32,className:o="",fallbackText:n="?",fallbackColor:d}){let[i,c]=(0,a.useState)(!1);return!e||i?(0,s.jsx)("span",{className:`inline-flex items-center justify-center font-bold rounded-lg ${o}`.trim(),style:{width:r,height:r,color:d,fontSize:Math.max(10,Math.floor(.38*r))},children:n}):(0,s.jsx)("img",{src:e,alt:t,width:r,height:r,className:o,onError:()=>c(!0)})}l.propTypes={src:n().string,alt:n().string,size:n().number,className:n().string,fallbackText:n().string,fallbackColor:n().string}},81127:(e,t,r)=>{"use strict";r.d(t,{ConfirmModal:()=>b,default:()=>u});var s=r(95155),a=r(12115),o=r(31474),n=r(92542),l=r(97677),d=r(46442);let i=[],c="";function m(){1===i.length?(c=document.body.style.overflow,document.body.style.overflow="hidden"):0===i.length&&(document.body.style.overflow=c)}function x(e,t){return!!e&&Object.prototype.hasOwnProperty.call(e,t)}function u({isOpen:e,onClose:t,title:r,children:n,footer:c,size:b="md",closeOnOverlay:p=!0,showTrafficLights:h=!0,busy:g=!1,className:f}){let y=(0,a.useRef)({onClose:t,busy:g}),v=(0,d.t)(),j=v?.({title:r,children:n,footer:c,size:b,className:f})||null,N=x(j,"children")?j.children:n,w=x(j,"footer")?j.footer:c,k=j?.size||b,C=(0,o.cn)(f,j?.className);y.current.onClose=t,y.current.busy=g;let S={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=y.current;i.push(t),m();let r=e=>{if("Escape"!==e.key)return;let r=i[i.length-1];r!==t||r.busy||(e.preventDefault(),r.onClose())};return document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r);let e=i.indexOf(t);-1!==e&&i.splice(e,1),m()}},[e]),e)?(0,s.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[(0,s.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in",onClick:p&&!g?t:void 0}),(0,s.jsxs)("div",{className:(0,o.cn)("relative w-full bg-surface","border border-border-subtle","rounded-[14px] shadow-[var(--shadow-elev)]","fade-in",S[k]||S.md,C),children:[(r||h)&&(0,s.jsxs)("div",{className:"flex items-center justify-between p-2 border-b border-border-subtle",children:[(0,s.jsxs)("div",{className:"flex items-center",children:[h&&(0,s.jsxs)("div",{className:"hidden md:flex items-center gap-2 mr-4 ml-2",children:[(0,s.jsx)(l.default,{text:"Close",position:"top",color:"#FF5F56",children:(0,s.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,s.jsx)("span",{className:"text-[9px] font-bold text-white opacity-0 group-hover/dot:opacity-100 transition-opacity leading-none",children:"✕"})})}),(0,s.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"}),(0,s.jsx)("div",{className:"w-4 h-4 rounded-full bg-[#3a3a3a]/20 dark:bg-white/15 cursor-not-allowed"})]}),r&&(0,s.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:r})]}),(0,s.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,s.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,s.jsx)("div",{className:"p-6 max-h-[calc(85vh-100px)] overflow-y-auto custom-scrollbar",children:N}),w&&(0,s.jsx)("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-border-subtle",children:w})]})]}):null}function b({isOpen:e,onClose:t,onConfirm:r,title:a="Confirm",message:o,confirmText:l="Confirm",cancelText:d="Cancel",variant:i="danger",loading:c=!1}){return(0,s.jsx)(u,{isOpen:e,onClose:t,title:a,size:"sm",busy:c,footer:(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.default,{variant:"ghost",onClick:t,disabled:c,children:d}),(0,s.jsx)(n.default,{variant:i,onClick:r,loading:c,children:l})]}),children:(0,s.jsx)("p",{className:"text-text-muted",children:o})})}},82114:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},84588:(e,t,r)=>{"use strict";r.d(t,{default:()=>o});var s=r(95155),a=r(31474);function o({children:e,title:t,subtitle:r,icon:n,action:l,padding:d="md",hover:i=!1,elev:c=!1,className:m,...x}){return(0,s.jsxs)("div",{className:(0,a.cn)("bg-surface border border-border",c?"rounded-[14px] shadow-[var(--shadow-elev)]":"rounded-[14px] shadow-[0_1px_2px_rgba(15,23,42,0.045),0_12px_28px_-26px_rgba(37,99,235,0.38)]",i&&"hover:shadow-[var(--shadow-warm)] hover:border-brand-500/40 transition-all cursor-pointer",{none:"",xs:"p-3",sm:"p-4",md:"p-5",lg:"p-6"}[d],m),...x,children:[(t||l)&&(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[n&&(0,s.jsx)("div",{className:"p-2 rounded-[10px] bg-bg-alt border border-border-subtle text-text-muted",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:n})}),(0,s.jsxs)("div",{children:[t&&(0,s.jsx)("h3",{className:"text-text-main font-semibold",children:t}),r&&(0,s.jsx)("p",{className:"text-sm text-text-muted",children:r})]})]}),l]}),e]})}o.Section=function({children:e,className:t,...r}){return(0,s.jsx)("div",{className:(0,a.cn)("p-4 rounded-[10px]","bg-bg-alt border border-border",t),...r,children:e})},o.Row=function({children:e,className:t,...r}){return(0,s.jsx)("div",{className:(0,a.cn)("p-3 -mx-3 px-3 transition-colors","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50",t),...r,children:e})},o.ListItem=function({children:e,actions:t,className:r,...o}){return(0,s.jsxs)("div",{className:(0,a.cn)("group flex items-center justify-between p-3 -mx-3 px-3","border-b border-border-subtle last:border-b-0","hover:bg-surface-2/50 transition-colors",r),...o,children:[(0,s.jsx)("div",{className:"flex-1 min-w-0",children:e}),t&&(0,s.jsx)("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:t})]})}},92542:(e,t,r)=>{"use strict";r.d(t,{default:()=>l});var s=r(95155),a=r(31474);let o={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 l({children:e,variant:t="primary",size:r="md",icon:d,iconRight:i,disabled:c=!1,loading:m=!1,fullWidth:x=!1,className:u,...b}){return(0,s.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",o[t],n[r],x&&"w-full",u),disabled:c||m,...b,children:[m?(0,s.jsx)("span",{className:"material-symbols-outlined animate-spin text-[18px]",children:"progress_activity"}):d?(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:d}):null,e,i&&!m&&(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:i})]})}},97677:(e,t,r)=>{"use strict";r.d(t,{default:()=>a});var s=r(95155);function a({text:e,children:t,position:r="top",color:o}){let n=o?"":"bg-gray-900";return(0,s.jsxs)("div",{className:"relative inline-flex group",children:[t,(0,s.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"}[r]} 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:o?{backgroundColor:o}:{},children:e})]})}}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=10332)),_N_E=e.O()}]);