@jheavenknows/bluerouter 5.3.1 → 5.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +9 -9
- package/app/.next-cli-build/build-manifest.json +3 -3
- package/app/.next-cli-build/prerender-manifest.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js +254 -31
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/analytics.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +8 -7
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +8 -7
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +8 -7
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -1
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +5 -5
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +5 -5
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +6 -6
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +9 -9
- package/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/6328.js +1 -1
- package/app/.next-cli-build/server/chunks/6759.js +1 -1
- package/app/.next-cli-build/server/chunks/6811.js +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/{5263-89b1b568677a5ad1.js → 5263-8c1958a0d9344686.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/template-eecb5d00bb376ac8.js +478 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/page-4dbf414f535f4d56.js +1 -0
- package/app/.next-cli-build/static/chunks/{webpack-c4a3128f7e9eda51.js → webpack-83c647b2ac8f2bf9.js} +1 -1
- package/app/.next-cli-build/static/css/ecece8453e592e06.css +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.2.86-to-5.2.87-5.2.87-20260815-180816 → upgrade-5.3.0-to-5.3.1-5.3.1-20260815-182751}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.2.87-to-5.2.88-5.2.88-20260815-182203 → upgrade-5.3.1-to-5.3.2-5.3.2-20260815-183321}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/resource-monitor/template-d8c264229683c5ea.js +0 -185
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/page-343d8f15a1ea9d95.js +0 -1
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.2.88-to-5.3.0-5.3.0-20260815-182310/data.sqlite +0 -0
- /package/app/.next-cli-build/static/{KFhYCfDioPjRLz4o9iFXL → G5HT5afoeNcjPfyGOalc3}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{KFhYCfDioPjRLz4o9iFXL → G5HT5afoeNcjPfyGOalc3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[770],{6202:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>v});var a=t(95155),i=t(12115);let o="button[data-resource-server-id]",n="resource-vllm-metric-guide",s="resource-monitor-live-metrics";function l(e){let r=Number(e)||0;return .001>Math.abs(r-Math.round(r))?String(Math.round(r)):r.toFixed(1)}function c(e){let r=Number(e);return Number.isFinite(r)?Math.max(0,Math.min(100,r)):0}function u(e){let r=Number(e);return Number.isFinite(r)?r:null}function d(e){return String(e??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function p(e,r,t,a="primary"){let i=c(r);return`
|
|
2
|
+
<div class="resource-live-bar resource-live-bar-${a}">
|
|
3
|
+
<div class="resource-live-bar-head">
|
|
4
|
+
<span>${d(e)}</span>
|
|
5
|
+
<strong>${d(t)}</strong>
|
|
6
|
+
</div>
|
|
7
|
+
<div class="resource-live-bar-track" aria-hidden="true">
|
|
8
|
+
<span class="resource-live-bar-fill" style="width:${i.toFixed(1)}%"></span>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
`}function m(e){let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port??"?"}`,t=e.endpoint||"",a=Array.isArray(e.models)?e.models.filter(Boolean):[];if(!1===e.metricsAvailable)return`
|
|
12
|
+
<div class="resource-vllm-instance resource-vllm-instance-muted">
|
|
13
|
+
<div class="resource-vllm-instance-title">${d(r)}</div>
|
|
14
|
+
<div class="resource-vllm-instance-sub">${t?`${d(t)} \xb7 `:""}chưa đọc được /metrics</div>
|
|
15
|
+
</div>
|
|
16
|
+
`;let i=u(e.kvCacheUsagePercent),o=Object.prototype.hasOwnProperty.call(e||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(e||{},"waitingDeferred");return`
|
|
17
|
+
<div class="resource-vllm-instance">
|
|
18
|
+
<div class="resource-vllm-instance-head">
|
|
19
|
+
<span class="resource-vllm-instance-title">${d(r)}</span>
|
|
20
|
+
${a.length?`<span class="resource-vllm-model">${d(a.join(", "))}</span>`:""}
|
|
21
|
+
</div>
|
|
22
|
+
${t?`<div class="resource-vllm-instance-sub">${d(t)}</div>`:""}
|
|
23
|
+
<div class="resource-vllm-instance-stats">
|
|
24
|
+
<span>R <b>${d(l(e.running))}</b></span>
|
|
25
|
+
<span>W <b>${d(l(e.waiting))}</b></span>
|
|
26
|
+
${o?`<span>Cap <b>${d(l(e.waitingCapacity))}</b></span><span>Def <b>${d(l(e.waitingDeferred))}</b></span>`:""}
|
|
27
|
+
<span>KV <b>${null===i?"—":`${i.toFixed(1)}%`}</b></span>
|
|
28
|
+
<span>Pre <b>${d(l(e.preemptions))}</b></span>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
`}function g(){document.getElementById(n)?.remove()}function v({children:e}){let r=(0,i.useRef)([]),t=(0,i.useRef)(new Map);return(0,i.useEffect)(()=>{let e=!1,a=null,i=null,v=()=>{let e=r.current;if(!e.length)return void g();let a=new Map(e.map(e=>[String(e.id),e])),i=Date.now();for(let e of document.querySelectorAll(o)){let r=String(e.dataset.resourceServerId||""),o=a.get(r),n=t.current.get(r),g=function(e,r=0){let t=e?.lastStatus;if(!t)return null;let a=t.vllm;if(!a)return{state:"upgrade",summary:"vLLM metrics \xb7 cần cập nhật agent",detail:"Agent hiện tại chưa c\xf3 vLLM monitor. Mở Sửa server v\xe0 c\xe0i lại agent một lần.",showReasons:!1,instances:[],count:0,metricsCount:0,discoveryLabel:"",pressureDetail:""};let i=Array.isArray(a.instances)?a.instances:[],o=a.summary||{},n=Number(o.instanceCount??i.length)||0,s=Number(o.metricsInstanceCount??n)||0,c=Number(o.running)||0,u=Number(o.waiting)||0,d=Number(o.waitingCapacity)||0,p=Number(o.waitingDeferred)||0,m=Object.prototype.hasOwnProperty.call(o||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(o||{},"waitingDeferred")||i.some(e=>Object.prototype.hasOwnProperty.call(e||{},"waitingCapacity")||Object.prototype.hasOwnProperty.call(e||{},"waitingDeferred")),g=Number(o.preemptions)||0,v=Number.isFinite(Number(o.kvCacheUsagePercent))?Number(o.kvCacheUsagePercent):null,b="docker"===a.discovery?"Docker-aware discovery":"Socket fallback discovery";if(!n)return{state:"none",summary:"vLLM \xb7 0 instance đang chạy",detail:"docker"===a.discovery?"Agent đ\xe3 kiểm tra Docker nhưng chưa ph\xe1t hiện container vLLM đang chạy.":"Agent chưa ph\xe1t hiện endpoint /metrics của vLLM tr\xean host.",showReasons:!1,instances:i,count:n,metricsCount:s,running:c,waiting:u,waitingCapacity:d,waitingDeferred:p,preemptions:g,kv:v,discoveryLabel:b,pressureDetail:"Kh\xf4ng c\xf3 queue pressure"};let x=i.map(e=>{let r=e.containerName?`${e.containerName}${e.containerId?` (${e.containerId})`:""}`:`:${e.port}`;if(!1===e.metricsAvailable)return`${r} \xb7 đang chạy nhưng chưa đọc được /metrics`;let t=Number.isFinite(Number(e.kvCacheUsagePercent))?`${Number(e.kvCacheUsagePercent).toFixed(1)}%`:"—",a=Array.isArray(e.models)&&e.models.length?` \xb7 ${e.models.join(", ")}`:"",i=e.endpoint?` \xb7 ${e.endpoint}`:"",o=Object.prototype.hasOwnProperty.call(e,"waitingCapacity")||Object.prototype.hasOwnProperty.call(e,"waitingDeferred")?` \xb7 Capacity ${l(e.waitingCapacity)} \xb7 Deferred ${l(e.waitingDeferred)}`:"";return`${r}${i} \xb7 Running ${l(e.running)} \xb7 Waiting ${l(e.waiting)}${o} \xb7 KV ${t} \xb7 Preempt ${l(e.preemptions)}${a}`}),h=s<n,f=d>0&&r>=8e3,w=d>0&&!f,y=h?"partial":f?"pressure":w?"transient":null!==v&&v>=90?"hot":"active",$=h?`${n} vLLM (${s} metrics)`:`${n} vLLM`,k=m&&u>0,M=k?`
|
|
32
|
+
Capacity ${l(d)} \xb7 Deferred ${l(p)}`:"",C=f?`Capacity pressure li\xean tục ${Math.max(1,Math.round(r/1e3))}s`:w?"Capacity waiting mới xuất hiện; chưa coi l\xe0 overload":u>0?"Waiting hiện tại chưa tạo capacity pressure":"Kh\xf4ng c\xf3 queue pressure";return{state:y,summary:`${$} \xb7 Running ${l(c)} \xb7 Waiting ${l(u)}${M}
|
|
33
|
+
KV ${null===v?"—":`${v.toFixed(1)}%`} \xb7 Preempt ${l(g)}`,detail:[`${b} \xb7 ${n} instance`,C,...x].join("\n"),showReasons:k,instances:i,count:n,metricsCount:s,running:c,waiting:u,waitingCapacity:d,waitingDeferred:p,preemptions:g,kv:v,discoveryLabel:b,pressureDetail:C}}(o,n?Math.max(0,i-n):0);if(!o){e.querySelector(`.${s}`)?.remove(),delete e.dataset.vllmState,delete e.dataset.vllmReasons,delete e.dataset.resourceLiveSignature;continue}g?(e.dataset.vllmState=g.state,e.dataset.vllmReasons=g.showReasons?"1":"0"):(delete e.dataset.vllmState,delete e.dataset.vllmReasons),e.dataset.vllmBaseTitle||(e.dataset.vllmBaseTitle=e.title||"Linux host"),e.title=e.dataset.vllmBaseTitle,function(e,r,t){let a,i;if(!r?.lastStatus){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let o=`${function(e){if(!e)return"";if("upgrade"===e.state||"none"===e.state)return`
|
|
34
|
+
<section class="resource-live-section resource-vllm-block" data-state="${d(e.state)}">
|
|
35
|
+
<div class="resource-live-section-head">
|
|
36
|
+
<span class="resource-live-section-title"><span class="resource-live-state-dot"></span>vLLM</span>
|
|
37
|
+
<span class="resource-live-muted">${d(e.summary)}</span>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="resource-live-caption">${d(e.detail)}</div>
|
|
40
|
+
</section>
|
|
41
|
+
`;let r=e.showReasons?`<span>Capacity <b>${d(l(e.waitingCapacity))}</b></span><span>Deferred <b>${d(l(e.waitingDeferred))}</b></span>`:"";return`
|
|
42
|
+
<section class="resource-live-section resource-vllm-block" data-state="${d(e.state)}">
|
|
43
|
+
<div class="resource-live-section-head">
|
|
44
|
+
<span class="resource-live-section-title"><span class="resource-live-state-dot"></span>vLLM</span>
|
|
45
|
+
<span class="resource-live-badge">${e.metricsCount<e.count?`${e.metricsCount}/${e.count} metrics`:`${e.count} instance`}</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="resource-vllm-summary-grid">
|
|
48
|
+
<span>Running <b>${d(l(e.running))}</b></span>
|
|
49
|
+
<span>Waiting <b>${d(l(e.waiting))}</b></span>
|
|
50
|
+
${r}
|
|
51
|
+
<span>Preempt <b>${d(l(e.preemptions))}</b></span>
|
|
52
|
+
</div>
|
|
53
|
+
${null===e.kv?"":p("KV cache",e.kv,`${e.kv.toFixed(1)}%`,e.kv>=90?"warning":"emerald")}
|
|
54
|
+
<div class="resource-live-caption">${d(e.discoveryLabel)} \xb7 ${d(e.pressureDetail)}</div>
|
|
55
|
+
${e.instances.length?`<div class="resource-vllm-instances">${e.instances.map(m).join("")}</div>`:""}
|
|
56
|
+
</section>
|
|
57
|
+
`}(t)}${function(e){let r=Array.isArray(e?.lastStatus?.gpus)?e.lastStatus.gpus:[];if(!r.length)return"";let t=r.map(e=>{let r=c(e.usagePercent),t=c(e.memoryUsagePercent),a=u(e.powerDrawW),i=u(e.powerLimitW),o=null!==a&&i&&i>0?c(a/i*100):0,n=u(e.temperatureC),s=null===a?"—":i&&i>0?`${a.toFixed(+(a<10))} / ${i.toFixed(0)} W`:`${a.toFixed(+(a<10))} W`;return`
|
|
58
|
+
<div class="resource-gpu-row">
|
|
59
|
+
<div class="resource-gpu-head">
|
|
60
|
+
<span class="resource-gpu-name">GPU ${d(e.index??"?")}</span>
|
|
61
|
+
<span class="resource-gpu-temp"><span class="material-symbols-outlined" aria-hidden="true">device_thermostat</span>${null===n?"—":`${n.toFixed(0)}\xb0C`}</span>
|
|
62
|
+
</div>
|
|
63
|
+
${p("GPU load",r,`${r.toFixed(+(r<10))}%`,r>=90?"warning":"emerald")}
|
|
64
|
+
${p("VRAM",t,`${t.toFixed(1)}%`,t>=95?"warning":"cyan")}
|
|
65
|
+
${i&&i>0?p("Power",o,s,o>=95?"warning":"violet"):`<div class="resource-live-value-row"><span>Power</span><strong>${d(s)}</strong></div>`}
|
|
66
|
+
</div>
|
|
67
|
+
`}).join("");return`
|
|
68
|
+
<section class="resource-live-section resource-gpu-block">
|
|
69
|
+
<div class="resource-live-section-head">
|
|
70
|
+
<span class="resource-live-section-title"><span class="material-symbols-outlined resource-live-section-icon" aria-hidden="true">memory</span>GPU</span>
|
|
71
|
+
<span class="resource-live-badge">${r.length} card</span>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="resource-gpu-list">${t}</div>
|
|
74
|
+
</section>
|
|
75
|
+
`}(r)}`;if(!o){e.querySelector(`.${s}`)?.remove(),delete e.dataset.resourceLiveSignature;return}let n=(a=((r?.lastStatus||{}).gpus||[]).map(e=>[e.index,e.usagePercent,e.memoryUsagePercent,e.temperatureC,e.powerDrawW,e.powerLimitW]),i=(t?.instances||[]).map(e=>[e.containerName,e.containerId,e.endpoint,e.running,e.waiting,e.waitingCapacity,e.waitingDeferred,e.kvCacheUsagePercent,e.preemptions,e.metricsAvailable,e.models]),JSON.stringify([r?.lastStatusAt,t?.state,t?.running,t?.waiting,t?.waitingCapacity,t?.waitingDeferred,t?.preemptions,t?.kv,t?.pressureDetail,i,a]));if(e.dataset.resourceLiveSignature===n)return;let g=e.querySelector(`.${s}`);g||((g=document.createElement("div")).className=s,g.setAttribute("aria-label","Realtime vLLM v\xe0 GPU metrics"),e.appendChild(g)),g.innerHTML=o,e.dataset.resourceLiveSignature=n}(e,o,g)}!function(){let e=document.querySelector(o),r=e?.closest(".scroll-thin-x");if(!r)return g();let t=document.getElementById(n);if(t){t.previousElementSibling!==r&&r.insertAdjacentElement("afterend",t);return}let a=document.createElement("section");a.id=n,a.className="resource-vllm-metric-guide",a.setAttribute("aria-label","Giải th\xedch chỉ số vLLM"),a.innerHTML=`
|
|
76
|
+
<div class="resource-vllm-guide-heading">
|
|
77
|
+
<span class="material-symbols-outlined resource-vllm-guide-icon" aria-hidden="true">info</span>
|
|
78
|
+
<div>
|
|
79
|
+
<div class="resource-vllm-guide-title">C\xe1ch đọc chỉ số vLLM</div>
|
|
80
|
+
<div class="resource-vllm-guide-subtitle">C\xe1c số tr\xean card l\xe0 snapshot realtime của to\xe0n bộ vLLM instance tr\xean Linux host.</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="resource-vllm-guide-grid">
|
|
84
|
+
<div class="resource-vllm-guide-item">
|
|
85
|
+
<strong>Running</strong>
|
|
86
|
+
<span>Số request đang được scheduler xử l\xfd.</span>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="resource-vllm-guide-item">
|
|
89
|
+
<strong>Waiting</strong>
|
|
90
|
+
<span>Số request đang chờ. Một nhịp Waiting ngắn chưa c\xf3 nghĩa l\xe0 qu\xe1 tải.</span>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="resource-vllm-guide-item">
|
|
93
|
+
<strong>Capacity</strong>
|
|
94
|
+
<span>Request chờ v\xec scheduler/KV admission chưa đủ capacity. K\xe9o d\xe0i mới l\xe0 pressure.</span>
|
|
95
|
+
</div>
|
|
96
|
+
<div class="resource-vllm-guide-item">
|
|
97
|
+
<strong>Deferred</strong>
|
|
98
|
+
<span>Request bị ho\xe3n bởi constraint nội bộ kh\xe1c; kh\xf4ng mặc định đồng nghĩa thiếu GPU.</span>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="resource-vllm-guide-item">
|
|
101
|
+
<strong>KV Cache</strong>
|
|
102
|
+
<span>% KV cache pool đang d\xf9ng, kh\xf4ng phải % tổng VRAM của GPU.</span>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="resource-vllm-guide-item">
|
|
105
|
+
<strong>Preempt</strong>
|
|
106
|
+
<span>Counter t\xedch lũy số lần request phải nhường t\xe0i nguy\xean; tốc độ tăng quan trọng hơn tổng số.</span>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="resource-vllm-guide-note">
|
|
110
|
+
<span class="material-symbols-outlined" aria-hidden="true">monitoring</span>
|
|
111
|
+
<span><strong>Đọc cảnh b\xe1o:</strong> Waiting tho\xe1ng qua vẫn b\xecnh thường. Dashboard chỉ coi <strong>Capacity > 0 li\xean tục từ 8 gi\xe2y</strong> l\xe0 pressure; KV cao hoặc Preempt tăng li\xean tục cũng cần theo d\xf5i.</span>
|
|
112
|
+
</div>
|
|
113
|
+
`,r.insertAdjacentElement("afterend",a)}()},b=async()=>{try{let a=await fetch("/api/resource-monitor?snapshot=1",{cache:"no-store"}),i=await a.json().catch(()=>({}));if(!a.ok||e)return;let o=Array.isArray(i.servers)?i.servers:[];r.current=o;let n=Date.now(),s=new Set;for(let e of o){let r=String(e?.id||"");r&&(s.add(r),(Number(e?.lastStatus?.vllm?.summary?.waitingCapacity)||0)>0?t.current.has(r)||t.current.set(r,n):t.current.delete(r))}for(let e of t.current.keys())s.has(e)||t.current.delete(e);v()}catch{}},x=new MutationObserver(()=>{i&&window.clearTimeout(i),i=window.setTimeout(v,80)});x.observe(document.body,{childList:!0,subtree:!0}),a=window.setInterval(b,4e3);let h=window.setTimeout(b,500);return()=>{e=!0,x.disconnect(),window.clearInterval(a),window.clearTimeout(h),i&&window.clearTimeout(i),g(),document.querySelectorAll(`.${s}`).forEach(e=>e.remove())}},[]),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:`
|
|
114
|
+
.resource-monitor-sortable-host {
|
|
115
|
+
min-width: 332px !important;
|
|
116
|
+
overflow: hidden;
|
|
117
|
+
}
|
|
118
|
+
.resource-monitor-live-metrics {
|
|
119
|
+
display: grid;
|
|
120
|
+
gap: 10px;
|
|
121
|
+
margin-top: 12px;
|
|
122
|
+
border-top: 1px solid var(--color-border-subtle);
|
|
123
|
+
padding-top: 10px;
|
|
124
|
+
padding-right: 2px;
|
|
125
|
+
pointer-events: none;
|
|
126
|
+
text-align: left;
|
|
127
|
+
}
|
|
128
|
+
.resource-live-section {
|
|
129
|
+
min-width: 0;
|
|
130
|
+
border: 1px solid var(--color-border-subtle);
|
|
131
|
+
border-radius: 12px;
|
|
132
|
+
background: color-mix(in srgb, var(--color-surface-2) 62%, var(--color-surface));
|
|
133
|
+
padding: 9px 10px;
|
|
134
|
+
}
|
|
135
|
+
.resource-live-section-head {
|
|
136
|
+
display: flex;
|
|
137
|
+
min-width: 0;
|
|
138
|
+
align-items: center;
|
|
139
|
+
justify-content: space-between;
|
|
140
|
+
gap: 8px;
|
|
141
|
+
margin-bottom: 7px;
|
|
142
|
+
}
|
|
143
|
+
.resource-live-section-title {
|
|
144
|
+
display: inline-flex;
|
|
145
|
+
min-width: 0;
|
|
146
|
+
align-items: center;
|
|
147
|
+
gap: 6px;
|
|
148
|
+
color: var(--color-text-main);
|
|
149
|
+
font-size: 11px;
|
|
150
|
+
font-weight: 750;
|
|
151
|
+
letter-spacing: .01em;
|
|
152
|
+
}
|
|
153
|
+
.resource-live-section-icon {
|
|
154
|
+
color: #10b981;
|
|
155
|
+
font-size: 15px;
|
|
156
|
+
}
|
|
157
|
+
.resource-live-state-dot {
|
|
158
|
+
width: 7px;
|
|
159
|
+
height: 7px;
|
|
160
|
+
flex: 0 0 auto;
|
|
161
|
+
border-radius: 999px;
|
|
162
|
+
background: #10b981;
|
|
163
|
+
box-shadow: 0 0 0 3px rgba(16,185,129,.10);
|
|
164
|
+
}
|
|
165
|
+
.resource-vllm-block[data-state="pressure"] .resource-live-state-dot {
|
|
166
|
+
background: #ef4444;
|
|
167
|
+
box-shadow: 0 0 0 3px rgba(239,68,68,.10);
|
|
168
|
+
}
|
|
169
|
+
.resource-vllm-block[data-state="transient"] .resource-live-state-dot,
|
|
170
|
+
.resource-vllm-block[data-state="hot"] .resource-live-state-dot,
|
|
171
|
+
.resource-vllm-block[data-state="partial"] .resource-live-state-dot,
|
|
172
|
+
.resource-vllm-block[data-state="upgrade"] .resource-live-state-dot {
|
|
173
|
+
background: #f59e0b;
|
|
174
|
+
box-shadow: 0 0 0 3px rgba(245,158,11,.10);
|
|
175
|
+
}
|
|
176
|
+
.resource-vllm-block[data-state="none"] .resource-live-state-dot {
|
|
177
|
+
background: var(--color-text-subtle);
|
|
178
|
+
box-shadow: none;
|
|
179
|
+
}
|
|
180
|
+
.resource-live-badge {
|
|
181
|
+
flex: 0 0 auto;
|
|
182
|
+
border-radius: 999px;
|
|
183
|
+
background: var(--color-surface);
|
|
184
|
+
padding: 2px 7px;
|
|
185
|
+
color: var(--color-text-muted);
|
|
186
|
+
font-size: 9.5px;
|
|
187
|
+
font-weight: 700;
|
|
188
|
+
}
|
|
189
|
+
.resource-live-muted {
|
|
190
|
+
min-width: 0;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
color: var(--color-text-subtle);
|
|
193
|
+
font-size: 9.5px;
|
|
194
|
+
text-overflow: ellipsis;
|
|
195
|
+
white-space: nowrap;
|
|
196
|
+
}
|
|
197
|
+
.resource-vllm-summary-grid {
|
|
198
|
+
display: flex;
|
|
199
|
+
flex-wrap: wrap;
|
|
200
|
+
gap: 4px 7px;
|
|
201
|
+
margin-bottom: 7px;
|
|
202
|
+
color: var(--color-text-muted);
|
|
203
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
204
|
+
font-size: 9.5px;
|
|
205
|
+
line-height: 1.35;
|
|
206
|
+
}
|
|
207
|
+
.resource-vllm-summary-grid span {
|
|
208
|
+
white-space: nowrap;
|
|
209
|
+
}
|
|
210
|
+
.resource-vllm-summary-grid b {
|
|
211
|
+
color: var(--color-text-main);
|
|
212
|
+
font-weight: 750;
|
|
213
|
+
}
|
|
214
|
+
.resource-live-caption {
|
|
215
|
+
margin-top: 6px;
|
|
216
|
+
color: var(--color-text-subtle);
|
|
217
|
+
font-size: 9px;
|
|
218
|
+
line-height: 1.35;
|
|
219
|
+
}
|
|
220
|
+
.resource-vllm-instances {
|
|
221
|
+
display: grid;
|
|
222
|
+
gap: 5px;
|
|
223
|
+
margin-top: 7px;
|
|
224
|
+
}
|
|
225
|
+
.resource-vllm-instance {
|
|
226
|
+
min-width: 0;
|
|
227
|
+
border-top: 1px dashed var(--color-border-subtle);
|
|
228
|
+
padding-top: 6px;
|
|
229
|
+
}
|
|
230
|
+
.resource-vllm-instance:first-child {
|
|
231
|
+
border-top: 0;
|
|
232
|
+
padding-top: 0;
|
|
233
|
+
}
|
|
234
|
+
.resource-vllm-instance-head {
|
|
235
|
+
display: flex;
|
|
236
|
+
min-width: 0;
|
|
237
|
+
align-items: center;
|
|
238
|
+
justify-content: space-between;
|
|
239
|
+
gap: 7px;
|
|
240
|
+
}
|
|
241
|
+
.resource-vllm-instance-title {
|
|
242
|
+
min-width: 0;
|
|
243
|
+
overflow: hidden;
|
|
244
|
+
color: var(--color-text-main);
|
|
245
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
246
|
+
font-size: 9.5px;
|
|
247
|
+
font-weight: 700;
|
|
248
|
+
text-overflow: ellipsis;
|
|
249
|
+
white-space: nowrap;
|
|
250
|
+
}
|
|
251
|
+
.resource-vllm-model {
|
|
252
|
+
max-width: 48%;
|
|
253
|
+
overflow: hidden;
|
|
254
|
+
border-radius: 999px;
|
|
255
|
+
background: color-mix(in srgb, var(--color-brand-500) 8%, transparent);
|
|
256
|
+
padding: 2px 6px;
|
|
257
|
+
color: var(--color-primary);
|
|
258
|
+
font-size: 8.5px;
|
|
259
|
+
font-weight: 650;
|
|
260
|
+
text-overflow: ellipsis;
|
|
261
|
+
white-space: nowrap;
|
|
262
|
+
}
|
|
263
|
+
.resource-vllm-instance-sub {
|
|
264
|
+
margin-top: 2px;
|
|
265
|
+
overflow: hidden;
|
|
266
|
+
color: var(--color-text-subtle);
|
|
267
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
268
|
+
font-size: 8.5px;
|
|
269
|
+
text-overflow: ellipsis;
|
|
270
|
+
white-space: nowrap;
|
|
271
|
+
}
|
|
272
|
+
.resource-vllm-instance-stats {
|
|
273
|
+
display: flex;
|
|
274
|
+
flex-wrap: wrap;
|
|
275
|
+
gap: 3px 7px;
|
|
276
|
+
margin-top: 4px;
|
|
277
|
+
color: var(--color-text-muted);
|
|
278
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
279
|
+
font-size: 8.8px;
|
|
280
|
+
}
|
|
281
|
+
.resource-vllm-instance-stats b {
|
|
282
|
+
color: var(--color-text-main);
|
|
283
|
+
font-weight: 750;
|
|
284
|
+
}
|
|
285
|
+
.resource-vllm-instance-muted {
|
|
286
|
+
color: var(--color-text-subtle);
|
|
287
|
+
}
|
|
288
|
+
.resource-live-bar + .resource-live-bar {
|
|
289
|
+
margin-top: 6px;
|
|
290
|
+
}
|
|
291
|
+
.resource-live-bar-head,
|
|
292
|
+
.resource-live-value-row {
|
|
293
|
+
display: flex;
|
|
294
|
+
align-items: center;
|
|
295
|
+
justify-content: space-between;
|
|
296
|
+
gap: 8px;
|
|
297
|
+
margin-bottom: 3px;
|
|
298
|
+
color: var(--color-text-muted);
|
|
299
|
+
font-size: 9px;
|
|
300
|
+
line-height: 1.2;
|
|
301
|
+
}
|
|
302
|
+
.resource-live-bar-head strong,
|
|
303
|
+
.resource-live-value-row strong {
|
|
304
|
+
color: var(--color-text-main);
|
|
305
|
+
font-weight: 750;
|
|
306
|
+
white-space: nowrap;
|
|
307
|
+
}
|
|
308
|
+
.resource-live-bar-track {
|
|
309
|
+
height: 4px;
|
|
310
|
+
overflow: hidden;
|
|
311
|
+
border-radius: 999px;
|
|
312
|
+
background: color-mix(in srgb, var(--color-border) 58%, transparent);
|
|
313
|
+
}
|
|
314
|
+
.resource-live-bar-fill {
|
|
315
|
+
display: block;
|
|
316
|
+
height: 100%;
|
|
317
|
+
min-width: 0;
|
|
318
|
+
border-radius: inherit;
|
|
319
|
+
background: var(--resource-bar-color, var(--color-primary));
|
|
320
|
+
transition: width 500ms ease;
|
|
321
|
+
}
|
|
322
|
+
.resource-live-bar-emerald { --resource-bar-color: #10b981; }
|
|
323
|
+
.resource-live-bar-cyan { --resource-bar-color: #06b6d4; }
|
|
324
|
+
.resource-live-bar-violet { --resource-bar-color: #8b5cf6; }
|
|
325
|
+
.resource-live-bar-primary { --resource-bar-color: var(--color-primary); }
|
|
326
|
+
.resource-live-bar-warning { --resource-bar-color: #f59e0b; }
|
|
327
|
+
.resource-gpu-list {
|
|
328
|
+
display: grid;
|
|
329
|
+
gap: 8px;
|
|
330
|
+
}
|
|
331
|
+
.resource-gpu-row {
|
|
332
|
+
min-width: 0;
|
|
333
|
+
}
|
|
334
|
+
.resource-gpu-row + .resource-gpu-row {
|
|
335
|
+
border-top: 1px dashed var(--color-border-subtle);
|
|
336
|
+
padding-top: 8px;
|
|
337
|
+
}
|
|
338
|
+
.resource-gpu-head {
|
|
339
|
+
display: flex;
|
|
340
|
+
align-items: center;
|
|
341
|
+
justify-content: space-between;
|
|
342
|
+
gap: 8px;
|
|
343
|
+
margin-bottom: 6px;
|
|
344
|
+
}
|
|
345
|
+
.resource-gpu-name {
|
|
346
|
+
color: var(--color-text-main);
|
|
347
|
+
font-size: 9.5px;
|
|
348
|
+
font-weight: 750;
|
|
349
|
+
}
|
|
350
|
+
.resource-gpu-temp {
|
|
351
|
+
display: inline-flex;
|
|
352
|
+
align-items: center;
|
|
353
|
+
gap: 2px;
|
|
354
|
+
border-radius: 999px;
|
|
355
|
+
background: color-mix(in srgb, #f59e0b 8%, transparent);
|
|
356
|
+
padding: 2px 6px;
|
|
357
|
+
color: #b45309;
|
|
358
|
+
font-size: 9px;
|
|
359
|
+
font-weight: 700;
|
|
360
|
+
}
|
|
361
|
+
.resource-gpu-temp .material-symbols-outlined {
|
|
362
|
+
font-size: 12px;
|
|
363
|
+
}
|
|
364
|
+
.resource-vllm-metric-guide {
|
|
365
|
+
margin-top: 10px;
|
|
366
|
+
border: 1px solid var(--color-border);
|
|
367
|
+
border-radius: 18px;
|
|
368
|
+
background: var(--color-surface);
|
|
369
|
+
padding: 15px 16px;
|
|
370
|
+
box-shadow: var(--shadow-soft);
|
|
371
|
+
}
|
|
372
|
+
.resource-vllm-guide-heading {
|
|
373
|
+
display: flex;
|
|
374
|
+
align-items: flex-start;
|
|
375
|
+
gap: 10px;
|
|
376
|
+
}
|
|
377
|
+
.resource-vllm-guide-icon {
|
|
378
|
+
display: inline-flex;
|
|
379
|
+
height: 30px;
|
|
380
|
+
width: 30px;
|
|
381
|
+
flex: 0 0 auto;
|
|
382
|
+
align-items: center;
|
|
383
|
+
justify-content: center;
|
|
384
|
+
border-radius: 10px;
|
|
385
|
+
background: color-mix(in srgb, var(--color-brand-500) 12%, transparent);
|
|
386
|
+
color: var(--color-brand-500);
|
|
387
|
+
font-size: 19px;
|
|
388
|
+
}
|
|
389
|
+
.resource-vllm-guide-title {
|
|
390
|
+
color: var(--color-text-main);
|
|
391
|
+
font-size: 14px;
|
|
392
|
+
font-weight: 700;
|
|
393
|
+
line-height: 1.3;
|
|
394
|
+
}
|
|
395
|
+
.resource-vllm-guide-subtitle {
|
|
396
|
+
margin-top: 3px;
|
|
397
|
+
color: var(--color-text-muted);
|
|
398
|
+
font-size: 12px;
|
|
399
|
+
line-height: 1.45;
|
|
400
|
+
}
|
|
401
|
+
.resource-vllm-guide-grid {
|
|
402
|
+
display: grid;
|
|
403
|
+
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
404
|
+
gap: 8px;
|
|
405
|
+
margin-top: 12px;
|
|
406
|
+
}
|
|
407
|
+
.resource-vllm-guide-item {
|
|
408
|
+
min-width: 0;
|
|
409
|
+
border: 1px solid var(--color-border-subtle);
|
|
410
|
+
border-radius: 12px;
|
|
411
|
+
background: var(--color-surface-2);
|
|
412
|
+
padding: 10px 11px;
|
|
413
|
+
}
|
|
414
|
+
.resource-vllm-guide-item strong {
|
|
415
|
+
display: block;
|
|
416
|
+
margin-bottom: 4px;
|
|
417
|
+
color: var(--color-text-main);
|
|
418
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
|
|
419
|
+
font-size: 11px;
|
|
420
|
+
font-weight: 700;
|
|
421
|
+
}
|
|
422
|
+
.resource-vllm-guide-item span {
|
|
423
|
+
display: block;
|
|
424
|
+
color: var(--color-text-muted);
|
|
425
|
+
font-size: 10.5px;
|
|
426
|
+
line-height: 1.45;
|
|
427
|
+
}
|
|
428
|
+
.resource-vllm-guide-note {
|
|
429
|
+
display: flex;
|
|
430
|
+
align-items: flex-start;
|
|
431
|
+
gap: 8px;
|
|
432
|
+
margin-top: 10px;
|
|
433
|
+
border-radius: 11px;
|
|
434
|
+
background: color-mix(in srgb, #f59e0b 9%, transparent);
|
|
435
|
+
padding: 8px 10px;
|
|
436
|
+
color: var(--color-text-muted);
|
|
437
|
+
font-size: 11px;
|
|
438
|
+
line-height: 1.5;
|
|
439
|
+
}
|
|
440
|
+
.resource-vllm-guide-note .material-symbols-outlined {
|
|
441
|
+
flex: 0 0 auto;
|
|
442
|
+
color: #d97706;
|
|
443
|
+
font-size: 17px;
|
|
444
|
+
}
|
|
445
|
+
.resource-vllm-guide-note strong {
|
|
446
|
+
color: var(--color-text-main);
|
|
447
|
+
font-weight: 700;
|
|
448
|
+
}
|
|
449
|
+
.dark .resource-live-section {
|
|
450
|
+
background: color-mix(in srgb, var(--color-surface-2) 72%, var(--color-surface));
|
|
451
|
+
}
|
|
452
|
+
.dark .resource-gpu-temp {
|
|
453
|
+
color: #fbbf24;
|
|
454
|
+
}
|
|
455
|
+
@media (max-width: 1400px) {
|
|
456
|
+
.resource-vllm-guide-grid {
|
|
457
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
@media (max-width: 760px) {
|
|
461
|
+
.resource-monitor-sortable-host {
|
|
462
|
+
min-width: min(332px, calc(100vw - 48px)) !important;
|
|
463
|
+
}
|
|
464
|
+
.resource-vllm-guide-grid {
|
|
465
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
@media (max-width: 520px) {
|
|
469
|
+
.resource-vllm-guide-grid {
|
|
470
|
+
grid-template-columns: 1fr;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
@media (prefers-reduced-motion: reduce) {
|
|
474
|
+
.resource-live-bar-fill {
|
|
475
|
+
transition: none;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
`}),e]})}},90490:(e,r,t)=>{Promise.resolve().then(t.bind(t,6202))}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=90490)),_N_E=e.O()}]);
|
package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/page-4dbf414f535f4d56.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2825],{21007:(e,t,s)=>{Promise.resolve().then(s.bind(s,81772))},62146:()=>{},81772:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>w});var a=s(95155),l=s(12115),n=s(73321),r=s(35497),i=s(94027),o=s(84588),d=s(92542),c=s(31474);function x({isOpen:e,onClose:t,title:s,children:n,width:r="md",className:i}){let o={sm:"w-[400px]",md:"w-[500px]",lg:"w-[600px]",xl:"w-[800px]",full:"w-full"};return((0,l.useEffect)(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[e]),(0,l.useEffect)(()=>{let s=s=>{"Escape"===s.key&&e&&t()};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[e,t]),e)?(0,a.jsxs)("div",{className:"fixed inset-0 z-50",children:[(0,a.jsx)("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-[2px] fade-in cursor-pointer",onClick:t,"aria-hidden":"true"}),(0,a.jsxs)("div",{className:(0,c.cn)("absolute right-0 top-0 h-full bg-surface flex flex-col","shadow-[var(--shadow-elev)]","slide-in-right","border-l border-border-subtle",o[r]||o.md,i),children:[(0,a.jsxs)("div",{className:"flex items-center justify-between p-6 border-b border-border-subtle flex-shrink-0",children:[(0,a.jsx)("div",{className:"flex items-center gap-3",children:s&&(0,a.jsx)("h2",{className:"text-lg font-semibold text-text-main",children:s})}),(0,a.jsx)("button",{type:"button",onClick:t,className:"p-1.5 rounded-[10px] text-text-muted hover:bg-surface-2 hover:text-text-main transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,a.jsx)("div",{className:"flex-1 overflow-y-auto p-6 custom-scrollbar",children:n})]})]}):null}function m({currentPage:e,pageSize:t,totalItems:s,onPageChange:l,onPageSizeChange:n,className:r}){let i=Math.ceil(s/t),o=s>0?(e-1)*t+1:0,x=Math.min(e*t,s),u=(()=>{let t=[],s=Math.max(1,e-2),a=Math.min(i,s+5-1);a-s+1<5&&(s=Math.max(1,a-5+1));for(let e=s;e<=a;e++)t.push(e);return t})();return(0,a.jsxs)("div",{className:(0,c.cn)("flex flex-col sm:flex-row items-center justify-between gap-4 py-4 px-2",r),children:[s>0&&(0,a.jsxs)("div",{className:"text-sm text-text-muted",children:["Showing ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:o})," to"," ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:x})," of"," ",(0,a.jsx)("span",{className:"font-medium text-text-main",children:s})," results"]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-center gap-2 sm:gap-4",children:[n&&(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-sm text-text-muted",children:"Rows:"}),(0,a.jsx)("select",{value:t,onChange:e=>n(Number(e.target.value)),className:(0,c.cn)("h-9 rounded-lg border border-black/10 dark:border-white/10 bg-surface","text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20","cursor-pointer"),style:{colorScheme:"auto"},children:[10,20,50].map(e=>(0,a.jsx)("option",{value:e,children:e},e))})]}),i>1&&(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(d.default,{variant:"outline",size:"sm",onClick:()=>l(e-1),disabled:1===e,className:"w-9 px-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"chevron_left"})}),u[0]>1&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d.default,{variant:"ghost",size:"sm",onClick:()=>l(1),className:"w-9 px-0 hidden sm:inline-flex",children:"1"}),u[0]>2&&(0,a.jsx)("span",{className:"text-text-muted px-1 hidden sm:inline",children:"..."})]}),u.map(t=>(0,a.jsx)(d.default,{variant:e===t?"primary":"ghost",size:"sm",onClick:()=>l(t),className:(0,c.cn)("w-9 px-0",e===t?"inline-flex":"hidden sm:inline-flex"),children:t},t)),u[u.length-1]<i&&(0,a.jsxs)(a.Fragment,{children:[u[u.length-1]<i-1&&(0,a.jsx)("span",{className:"text-text-muted px-1 hidden sm:inline",children:"..."}),(0,a.jsx)(d.default,{variant:"ghost",size:"sm",onClick:()=>l(i),className:"w-9 px-0 hidden sm:inline-flex",children:i})]}),(0,a.jsx)(d.default,{variant:"outline",size:"sm",onClick:()=>l(e+1),disabled:e===i,className:"w-9 px-0",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"chevron_right"})})]})]})]})}var u=s(52679);let p=null,h=null;async function f({force:e=!1}={}){if(!e&&p&&h)return{providerNameCache:p,providerNodesCache:h};let t=await fetch("/api/provider-nodes",{cache:"no-store"}),s=(await t.json()).nodes||[];for(let e of(h={},s))h[e.id]=e.name;return{providerNameCache:p={...u.Q2,...h},providerNodesCache:h}}function b(e,t){if(!e||!t)return e;let s=t[e];if("string"==typeof s)return s;if(s?.name)return s.name;let a=(0,u.zt)(e)||u.Q2[e];return a?.name||e}function g({title:e,children:t,defaultOpen:s=!1,icon:n=null}){let[r,i]=(0,l.useState)(s);return(0,a.jsxs)("div",{className:"border border-black/5 dark:border-white/5 rounded-lg overflow-hidden",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>i(!r),className:"w-full flex items-center justify-between p-3 bg-black/[0.02] dark:bg-white/[0.02] hover:bg-black/[0.04] dark:hover:bg-white/[0.04] transition-colors",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[n&&(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px] text-text-muted",children:n}),(0,a.jsx)("span",{className:"font-semibold text-sm text-text-main",children:e})]}),(0,a.jsx)("span",{className:(0,c.cn)("material-symbols-outlined text-[20px] text-text-muted transition-transform duration-200",r?"rotate-90":""),children:"chevron_right"})]}),r&&(0,a.jsx)("div",{className:"p-4 border-t border-black/5 dark:border-white/5",children:t})]})}function j(e){let t=e?.display_total_input_tokens,s=Number(t);if(null!=t&&""!==t&&Number.isFinite(s)&&s>=0)return s;let a=Number(e?.prompt_tokens??e?.input_tokens??0)||0,l=Number(e?.display_cached_input_tokens??e?.cached_tokens??e?.cache_read_input_tokens??e?.input_tokens_details?.cached_tokens??e?.prompt_tokens_details?.cached_tokens??0)||0,n=Number(e?.display_cache_creation_input_tokens??e?.cache_creation_input_tokens??e?.input_tokens_details?.cache_creation_tokens??e?.prompt_tokens_details?.cache_creation_tokens??0)||0,r=e?.cache_read_input_tokens!=null||e?.cache_creation_input_tokens!=null,i=!!(e?.input_tokens_details||e?.prompt_tokens_details),o=e?.prompt_tokens!=null&&e?.input_tokens!=null&&Number(e.prompt_tokens)!==Number(e.input_tokens);return!r||i||o?a:a+l+n}function v(){let[e,t]=(0,l.useState)([]),[s,n]=(0,l.useState)({page:1,pageSize:20,totalItems:0,totalPages:0}),[r,i]=(0,l.useState)(!1),[u,p]=(0,l.useState)(null),[h,v]=(0,l.useState)(!1),[N,w]=(0,l.useState)([]),[k,y]=(0,l.useState)(null),[_,S]=(0,l.useState)({provider:"",startDate:"",endDate:""}),C=(0,l.useCallback)(async({force:e=!1}={})=>{try{let t=await fetch("/api/usage/providers",{cache:"no-store"}),s=await t.json();w(s.providers||[]);let a=await f({force:e});y(a.providerNameCache)}catch(e){console.error("Failed to fetch providers:",e)}},[]),D=(0,l.useCallback)(async({force:e=!1}={})=>{i(!0);try{let a=new URLSearchParams({page:s.page.toString(),pageSize:s.pageSize.toString()});_.provider&&a.append("provider",_.provider),_.startDate&&a.append("startDate",_.startDate),_.endDate&&a.append("endDate",_.endDate),e&&a.set("_refresh",Date.now().toString());let l=await fetch(`/api/usage/request-details?${a}`,{cache:"no-store"}),r=await l.json();t(r.details||[]),n(e=>({...e,...r.pagination}))}catch(e){console.error("Failed to fetch request details:",e)}finally{i(!1)}},[s.page,s.pageSize,_]);(0,l.useEffect)(()=>{C()},[C]),(0,l.useEffect)(()=>{D()},[D]);let z=(0,l.useCallback)(async()=>{await Promise.all([C({force:!0}),D({force:!0})])},[C,D]);return(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-6",children:[(0,a.jsx)(o.default,{padding:"md",children:(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"provider-filter",className:"text-sm font-medium text-text-main",children:"Provider"}),(0,a.jsxs)("select",{id:"provider-filter",value:_.provider,onChange:e=>S({..._,provider:e.target.value}),className:(0,c.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20","w-full min-w-0 cursor-pointer"),style:{colorScheme:"auto"},children:[(0,a.jsx)("option",{value:"",children:"All Providers"}),N.map(e=>(0,a.jsx)("option",{value:e.id,children:e.name},e.id))]})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"start-date-filter",className:"text-sm font-medium text-text-main",children:"Start Date"}),(0,a.jsx)("input",{id:"start-date-filter",type:"datetime-local",value:_.startDate,onChange:e=>S({..._,startDate:e.target.value}),className:(0,c.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20")})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2",children:[(0,a.jsx)("label",{htmlFor:"end-date-filter",className:"text-sm font-medium text-text-main",children:"End Date"}),(0,a.jsx)("input",{id:"end-date-filter",type:"datetime-local",value:_.endDate,onChange:e=>S({..._,endDate:e.target.value}),className:(0,c.cn)("h-9 px-3 rounded-lg border border-black/10 dark:border-white/10 bg-surface","w-full min-w-0 text-sm text-text-main focus:outline-none focus:ring-2 focus:ring-primary/20")})]}),(0,a.jsxs)("div",{className:"flex min-w-0 flex-col gap-2 sm:col-span-2 lg:col-span-1",children:[(0,a.jsx)("span",{className:"hidden text-sm font-medium text-text-main opacity-0 lg:block","aria-hidden":"true",children:"Actions"}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,a.jsx)(d.default,{variant:"outline",onClick:z,loading:r,className:"w-full",icon:"refresh",children:"Refresh"}),(0,a.jsx)(d.default,{variant:"ghost",onClick:()=>{S({provider:"",startDate:"",endDate:""})},disabled:!_.provider&&!_.startDate&&!_.endDate,className:"w-full",children:"Clear"})]})]})]})}),(0,a.jsxs)(o.default,{padding:"none",children:[(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full min-w-[880px]",children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5",children:[(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Timestamp"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Model"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Provider"}),(0,a.jsx)("th",{className:"text-right p-4 text-sm font-semibold text-text-main",children:"Input Tokens"}),(0,a.jsx)("th",{className:"text-right p-4 text-sm font-semibold text-text-main",children:"Output Tokens"}),(0,a.jsx)("th",{className:"text-left p-4 text-sm font-semibold text-text-main",children:"Latency"}),(0,a.jsx)("th",{className:"text-center p-4 text-sm font-semibold text-text-main",children:"Action"})]})}),(0,a.jsx)("tbody",{children:r?(0,a.jsx)("tr",{children:(0,a.jsx)("td",{colSpan:"7",className:"p-8 text-center text-text-muted",children:(0,a.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined animate-spin text-[20px]",children:"progress_activity"}),"Loading..."]})})}):0===e.length?(0,a.jsx)("tr",{children:(0,a.jsx)("td",{colSpan:"7",className:"p-8 text-center text-text-muted",children:"No request details found"})}):e.map((e,t)=>(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5 last:border-b-0 hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors",children:[(0,a.jsx)("td",{className:"whitespace-nowrap p-4 text-sm text-text-main",children:new Date(e.timestamp).toLocaleString()}),(0,a.jsx)("td",{className:"max-w-[260px] truncate p-4 font-mono text-sm text-text-main",children:e.model}),(0,a.jsx)("td",{className:"max-w-[180px] truncate p-4 text-sm text-text-main",children:(0,a.jsx)("span",{className:"font-medium",children:b(e.provider,k)})}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-main text-right font-mono",children:j(e.tokens).toLocaleString()}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-main text-right font-mono",children:e.tokens?.completion_tokens?.toLocaleString()||0}),(0,a.jsx)("td",{className:"p-4 text-sm text-text-muted",children:(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[(0,a.jsxs)("div",{children:["TTFT: ",(0,a.jsxs)("span",{className:"font-mono",children:[e.latency?.ttft||0,"ms"]})]}),(0,a.jsxs)("div",{children:["Total: ",(0,a.jsxs)("span",{className:"font-mono",children:[e.latency?.total||0,"ms"]})]})]})}),(0,a.jsx)("td",{className:"p-4 text-center",children:(0,a.jsx)(d.default,{variant:"outline",size:"sm",onClick:()=>{p(e),v(!0)},children:"Detail"})})]},`${e.id}-${t}`))})]})}),!r&&e.length>0&&(0,a.jsx)("div",{className:"border-t border-black/5 dark:border-white/5",children:(0,a.jsx)(m,{currentPage:s.page,pageSize:s.pageSize,totalItems:s.totalItems,onPageChange:e=>{n(t=>({...t,page:e}))},onPageSizeChange:e=>{n(t=>({...t,pageSize:e,page:1}))}})})]}),(0,a.jsx)(x,{isOpen:h,onClose:()=>v(!1),title:"Request Details",width:"lg",children:u&&(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"grid min-w-0 grid-cols-1 gap-4 text-sm sm:grid-cols-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"ID:"})," ",(0,a.jsx)("span",{className:"break-all font-mono text-text-main",children:u.id})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Timestamp:"})," ",(0,a.jsx)("span",{className:"text-text-main",children:new Date(u.timestamp).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Provider:"})," ",(0,a.jsx)("span",{className:"text-text-main font-medium",children:b(u.provider,k)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Model:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:u.model})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Status:"})," ",(0,a.jsx)("span",{className:(0,c.cn)("font-medium","success"===u.status?"text-green-600":"text-red-600"),children:u.status})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Latency:"})," ",(0,a.jsxs)("span",{className:"text-text-main font-mono",children:["TTFT ",u.latency?.ttft||0,"ms / Total ",u.latency?.total||0,"ms"]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Input Tokens:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:j(u.tokens).toLocaleString()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-text-muted",children:"Output Tokens:"})," ",(0,a.jsx)("span",{className:"text-text-main font-mono",children:u.tokens?.completion_tokens?.toLocaleString()||0})]})]}),(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)(g,{title:"1. Client Request (Input)",defaultOpen:!0,icon:"input",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:JSON.stringify(u.request,null,2)})}),u.providerRequest&&(0,a.jsx)(g,{title:"2. Provider Request (Translated)",icon:"translate",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:JSON.stringify(u.providerRequest,null,2)})}),u.providerResponse&&(0,a.jsx)(g,{title:"3. Provider Response (Raw)",icon:"data_object",children:(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:"object"==typeof u.providerResponse?JSON.stringify(u.providerResponse,null,2):u.providerResponse})}),(0,a.jsxs)(g,{title:"4. Client Response (Final)",defaultOpen:!0,icon:"output",children:[u.response?.thinking&&(0,a.jsxs)("div",{className:"mb-4",children:[(0,a.jsxs)("h4",{className:"font-semibold text-text-main mb-2 flex items-center gap-2 text-xs uppercase tracking-wide opacity-70",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"psychology"}),"Thinking Process"]}),(0,a.jsx)("pre",{className:"max-h-[200px] max-w-full overflow-auto rounded-lg border border-amber-200 bg-amber-50 p-3 font-mono text-xs text-amber-900 dark:border-amber-800 dark:bg-amber-950/30 dark:text-amber-100 sm:p-4",children:u.response.thinking})]}),(0,a.jsx)("h4",{className:"font-semibold text-text-main mb-2 text-xs uppercase tracking-wide opacity-70",children:"Content"}),(0,a.jsx)("pre",{className:"max-h-[300px] max-w-full overflow-auto rounded-lg border border-black/5 bg-black/5 p-3 font-mono text-xs text-text-main dark:border-white/5 dark:bg-white/5 sm:p-4",children:u.response?.content||"[No content]"})]})]})]})})]})}s(62146);let N=[{value:"today",label:"Today"},{value:"24h",label:"24h"},{value:"7d",label:"7D"},{value:"30d",label:"30D"},{value:"60d",label:"60D"}];function w(){return(0,a.jsx)(l.Suspense,{fallback:(0,a.jsx)(r.Qv,{}),children:(0,a.jsx)(k,{})})}function k(){let e=(0,n.useSearchParams)(),t=(0,n.useRouter)(),{isAdmin:s}=(0,i.s)(),[o,d]=(0,l.useState)("today"),c=e.get("tab"),x=c&&["overview","logs","details"].includes(c)&&("details"!==c||s)?c:"overview";(0,l.useEffect)(()=>{if("details"===c&&!s){let s=new URLSearchParams(e);s.set("tab","overview"),t.replace(`/dashboard/usage?${s.toString()}`,{scroll:!1})}},[c,s,t,e]);let m=[{value:"overview",label:"Overview"},...s?[{value:"details",label:"Details"}]:[]];return(0,a.jsxs)("div",{className:"usage-page flex min-w-0 flex-col gap-6 px-1 sm:px-0",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)(r.Iz,{options:m,value:x,onChange:s=>{if(s===x)return;let a=new URLSearchParams(e);a.set("tab",s),t.push(`/dashboard/usage?${a.toString()}`,{scroll:!1})},className:"w-full sm:w-auto"}),"overview"===x&&(0,a.jsx)(r.Iz,{options:N,value:o,onChange:d,size:"sm",className:"w-full sm:w-auto"})]}),"overview"===x&&(0,a.jsx)(l.Suspense,{fallback:(0,a.jsx)(r.Qv,{}),children:(0,a.jsx)(r.jK,{period:o,setPeriod:d,hidePeriodSelector:!0})}),"logs"===x&&(0,a.jsx)(r.gM,{}),"details"===x&&(0,a.jsx)(v,{})]})}}},e=>{e.O(0,[9906,8243,3862,9893,9959,1997,5564,5263,7033,5497,8441,3794,7358],()=>e(e.s=21007)),_N_E=e.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e,t,r,o,n,a,i,u,l={},c={};function s(e){var t=c[e];if(void 0!==t)return t.exports;var r=c[e]={exports:{}},o=!0;try{l[e].call(r.exports,r,r.exports,s),o=!1}finally{o&&delete c[e]}return r.exports}s.m=l,e=[],s.O=(t,r,o,n)=>{if(r){n=n||0;for(var a=e.length;a>0&&e[a-1][2]>n;a--)e[a]=e[a-1];e[a]=[r,o,n];return}for(var i=1/0,a=0;a<e.length;a++){for(var[r,o,n]=e[a],u=!0,l=0;l<r.length;l++)(!1&n||i>=n)&&Object.keys(s.O).every(e=>s.O[e](r[l]))?r.splice(l--,1):(u=!1,n<i&&(i=n));if(u){e.splice(a--,1);var c=o();void 0!==c&&(t=c)}}return t},s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(e,o){if(1&o&&(e=this(e)),8&o||"object"==typeof e&&e&&(4&o&&e.__esModule||16&o&&"function"==typeof e.then))return e;var n=Object.create(null);s.r(n);var a={};t=t||[null,r({}),r([]),r(r)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(t=>a[t]=()=>e[t]);return a.default=()=>e,s.d(n,a),n},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((t,r)=>(s.f[r](e,t),t),[])),s.u=e=>"static/chunks/"+e+"."+({1966:"b8f83f7ba376c962",3899:"d4d0ae202f418161",8202:"1ffc6ce531e066ce"})[e]+".js",s.miniCssF=e=>{},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},s.l=(e,t,r,n)=>{if(o[e])return void o[e].push(t);if(void 0!==r)for(var a,i,u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var c=u[l];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")=="_N_E:"+r){a=c;break}}a||(i=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,s.nc&&a.setAttribute("nonce",s.nc),a.setAttribute("data-webpack","_N_E:"+r),a.src=s.tu(e)),o[e]=[t];var f=(t,r)=>{a.onerror=a.onload=null,clearTimeout(d);var n=o[e];if(delete o[e],a.parentNode&&a.parentNode.removeChild(a),n&&n.forEach(e=>e(r)),t)return t(r)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),i&&document.head.appendChild(a)},s.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=()=>(void 0===n&&(n={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(n=trustedTypes.createPolicy("nextjs#bundler",n))),n),s.tu=e=>s.tt().createScriptURL(e),s.p="/_next/",a={8068:0,4652:0,3334:0,9906:0,646:0},s.f.j=(e,t)=>{var r=s.o(a,e)?a[e]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(3334|4652|646|8068|9906)$/.test(e))a[e]=0;else{var o=new Promise((t,o)=>r=a[e]=[t,o]);t.push(r[2]=o);var n=s.p+s.u(e),i=Error();s.l(n,t=>{if(s.o(a,e)&&(0!==(r=a[e])&&(a[e]=void 0),r)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,r[1](i)}},"chunk-"+e,e)}},s.O.j=e=>0===a[e],i=(e,t)=>{var r,o,[n,i,u]=t,l=0;if(n.some(e=>0!==a[e])){for(r in i)s.o(i,r)&&(s.m[r]=i[r]);if(u)var c=u(s)}for(e&&e(t);l<n.length;l++)o=n[l],s.o(a,o)&&a[o]&&a[o][0](),a[o]=0;return s.O(c)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))})();
|
|
1
|
+
(()=>{"use strict";var e,t,r,o,n,a,i,u,l={},c={};function s(e){var t=c[e];if(void 0!==t)return t.exports;var r=c[e]={exports:{}},o=!0;try{l[e].call(r.exports,r,r.exports,s),o=!1}finally{o&&delete c[e]}return r.exports}s.m=l,e=[],s.O=(t,r,o,n)=>{if(r){n=n||0;for(var a=e.length;a>0&&e[a-1][2]>n;a--)e[a]=e[a-1];e[a]=[r,o,n];return}for(var i=1/0,a=0;a<e.length;a++){for(var[r,o,n]=e[a],u=!0,l=0;l<r.length;l++)(!1&n||i>=n)&&Object.keys(s.O).every(e=>s.O[e](r[l]))?r.splice(l--,1):(u=!1,n<i&&(i=n));if(u){e.splice(a--,1);var c=o();void 0!==c&&(t=c)}}return t},s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(e,o){if(1&o&&(e=this(e)),8&o||"object"==typeof e&&e&&(4&o&&e.__esModule||16&o&&"function"==typeof e.then))return e;var n=Object.create(null);s.r(n);var a={};t=t||[null,r({}),r([]),r(r)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(t=>a[t]=()=>e[t]);return a.default=()=>e,s.d(n,a),n},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((t,r)=>(s.f[r](e,t),t),[])),s.u=e=>"static/chunks/"+e+"."+({1966:"b8f83f7ba376c962",3899:"d4d0ae202f418161",8202:"1ffc6ce531e066ce"})[e]+".js",s.miniCssF=e=>{},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},s.l=(e,t,r,n)=>{if(o[e])return void o[e].push(t);if(void 0!==r)for(var a,i,u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var c=u[l];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")=="_N_E:"+r){a=c;break}}a||(i=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,s.nc&&a.setAttribute("nonce",s.nc),a.setAttribute("data-webpack","_N_E:"+r),a.src=s.tu(e)),o[e]=[t];var f=(t,r)=>{a.onerror=a.onload=null,clearTimeout(d);var n=o[e];if(delete o[e],a.parentNode&&a.parentNode.removeChild(a),n&&n.forEach(e=>e(r)),t)return t(r)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),i&&document.head.appendChild(a)},s.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=()=>(void 0===n&&(n={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(n=trustedTypes.createPolicy("nextjs#bundler",n))),n),s.tu=e=>s.tt().createScriptURL(e),s.p="/_next/",a={8068:0,4652:0,3334:0,9906:0,646:0,8243:0},s.f.j=(e,t)=>{var r=s.o(a,e)?a[e]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(3334|4652|646|8068|8243|9906)$/.test(e))a[e]=0;else{var o=new Promise((t,o)=>r=a[e]=[t,o]);t.push(r[2]=o);var n=s.p+s.u(e),i=Error();s.l(n,t=>{if(s.o(a,e)&&(0!==(r=a[e])&&(a[e]=void 0),r)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,r[1](i)}},"chunk-"+e,e)}},s.O.j=e=>0===a[e],i=(e,t)=>{var r,o,[n,i,u]=t,l=0;if(n.some(e=>0!==a[e])){for(r in i)s.o(i,r)&&(s.m[r]=i[r]);if(u)var c=u(s)}for(e&&e(t);l<n.length;l++)o=n[l],s.o(a,o)&&a[o]&&a[o][0](),a[o]=0;return s.O(c)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.usage-page .react-flow{background:var(--color-surface);border-radius:13px}.usage-page .react-flow__pane,.usage-page .react-flow__renderer,.usage-page .react-flow__viewport{background:transparent}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/app/package.json
CHANGED