zevairouter 1.0.36 → 1.0.37
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/CHANGELOG.md +14 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +2 -2
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/chunks/2777.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3110.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/318.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/4404.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5024.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5681.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7153.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8895.js +3 -3
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/1321-1c8d1bf3bb5f6953.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-41ea0d0c8e98a115.js +3 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/open-sse/config/providerModels.js +32 -1
- package/open-sse/config/providers.js +14 -0
- package/open-sse/executors/codebuddy-cn.js +31 -0
- package/open-sse/executors/index.js +7 -0
- package/open-sse/executors/mimo-free.js +156 -0
- package/open-sse/handlers/chatCore.js +12 -21
- package/open-sse/services/model.js +5 -0
- package/open-sse/services/usage.js +76 -24
- package/open-sse/utils/stream.js +14 -0
- package/open-sse/utils/thinkingSuffix.js +64 -0
- package/package.json +1 -1
- package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +7 -3
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +17 -16
- package/src/shared/constants/providers.js +59 -1
- package/cli/app/.next-cli-build/static/chunks/1321-1915f34ac5033b82.js +0 -1
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-00b727c93ebc0e37.js +0 -3
- /package/cli/app/.next-cli-build/static/{w0R4xFPIyjPTTgiJ8h4Lz → Jh26f1tVQgrKUbeB6pi5A}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{w0R4xFPIyjPTTgiJ8h4Lz → Jh26f1tVQgrKUbeB6pi5A}/_ssgManifest.js +0 -0
|
@@ -191,11 +191,16 @@ export const PROVIDER_MODELS = {
|
|
|
191
191
|
{ id: "kimi-k2.6", name: "Kimi-K2.6", maxInputTokens: 256000, maxOutputTokens: 32000 },
|
|
192
192
|
{ id: "kimi-k2.5", name: "Kimi-K2.5", maxInputTokens: 164000, maxOutputTokens: 32000 },
|
|
193
193
|
],
|
|
194
|
-
"cb-cn": [ // CodeBuddy CN - verified available on copilot.tencent.com
|
|
194
|
+
"cb-cn": [ // CodeBuddy CN - verified available on copilot.tencent.com / www.codebuddy.cn
|
|
195
195
|
{ id: "default-model-lite", name: "Default-Lite", maxInputTokens: 176000, maxOutputTokens: 24000 },
|
|
196
|
+
{ id: "default-model", name: "Default", maxInputTokens: 176000, maxOutputTokens: 24000 },
|
|
196
197
|
{ id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", maxInputTokens: 128000, maxOutputTokens: 8192, strip: ["image", "audio"] },
|
|
197
198
|
{ id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", maxInputTokens: 128000, maxOutputTokens: 8192, strip: ["image", "audio"] },
|
|
198
199
|
{ id: "glm-5.0", name: "GLM-5.0", maxInputTokens: 200000, maxOutputTokens: 48000, strip: ["image", "audio"] },
|
|
200
|
+
{ id: "glm-5.1", name: "GLM-5.1", maxInputTokens: 200000, maxOutputTokens: 48000, strip: ["image", "audio"] },
|
|
201
|
+
{ id: "kimi-k2.5", name: "Kimi-K2.5", maxInputTokens: 164000, maxOutputTokens: 32000 },
|
|
202
|
+
{ id: "kimi-k2.6", name: "Kimi-K2.6", maxInputTokens: 256000, maxOutputTokens: 32000 },
|
|
203
|
+
{ id: "minimax-m2.5", name: "MiniMax-M2.5", maxInputTokens: 200000, maxOutputTokens: 32000, strip: ["image", "audio"] },
|
|
199
204
|
],
|
|
200
205
|
cu: [ // Cursor IDE
|
|
201
206
|
{ id: "default", name: "Auto (Server Picks)" },
|
|
@@ -534,6 +539,29 @@ export const PROVIDER_MODELS = {
|
|
|
534
539
|
{ id: "accounts/fireworks/models/qwen3-235b-a22b", name: "Qwen3 235B" },
|
|
535
540
|
{ id: "nomic-ai/nomic-embed-text-v1.5", name: "Nomic Embed Text v1.5", type: "embedding" },
|
|
536
541
|
],
|
|
542
|
+
// Wave-1 ports from 9router (keys = provider alias used by getModelsByProviderId)
|
|
543
|
+
mmf: [
|
|
544
|
+
{ id: "mimo-auto", name: "MiMo Auto" },
|
|
545
|
+
],
|
|
546
|
+
venice: [
|
|
547
|
+
{ id: "venice-uncensored-1-2", name: "Venice Uncensored 1.2" },
|
|
548
|
+
{ id: "zai-org-glm-5", name: "GLM-5" },
|
|
549
|
+
{ id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct" },
|
|
550
|
+
{ id: "qwen3-coder-480b-a35b-instruct-turbo", name: "Qwen3 Coder 480B A35B Turbo" },
|
|
551
|
+
{ id: "deepseek-v4-pro", name: "DeepSeek V4 Pro" },
|
|
552
|
+
{ id: "llama-3.3-70b", name: "Llama 3.3 70B" },
|
|
553
|
+
{ id: "text-embedding-3-large", name: "Text Embedding 3 Large", type: "embedding" },
|
|
554
|
+
{ id: "text-embedding-bge-m3", name: "BGE-M3 Embedding", type: "embedding" },
|
|
555
|
+
],
|
|
556
|
+
fl: [
|
|
557
|
+
{ id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro" },
|
|
558
|
+
{ id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash" },
|
|
559
|
+
{ id: "zai-org/GLM-5.2", name: "GLM 5.2" },
|
|
560
|
+
{ id: "zai-org/GLM-5.1", name: "GLM 5.1" },
|
|
561
|
+
{ id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code" },
|
|
562
|
+
{ id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" },
|
|
563
|
+
{ id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" },
|
|
564
|
+
],
|
|
537
565
|
cerebras: [
|
|
538
566
|
{ id: "gpt-oss-120b", name: "GPT OSS 120B" },
|
|
539
567
|
{ id: "zai-glm-4.7", name: "ZAI GLM 4.7" },
|
|
@@ -939,6 +967,9 @@ const OAUTH_ALIASES = {
|
|
|
939
967
|
"codebuddy-cn": "cb-cn",
|
|
940
968
|
vertex: "vertex",
|
|
941
969
|
"vertex-partner": "vertex-partner",
|
|
970
|
+
"mimo-free": "mmf",
|
|
971
|
+
venice: "venice",
|
|
972
|
+
featherless: "fl",
|
|
942
973
|
};
|
|
943
974
|
|
|
944
975
|
// Derived from PROVIDERS — no need to maintain manually
|
|
@@ -416,6 +416,20 @@ export const PROVIDERS = {
|
|
|
416
416
|
baseUrl: "https://token-plan-sgp.xiaomimimo.com/v1/chat/completions",
|
|
417
417
|
format: "openai"
|
|
418
418
|
},
|
|
419
|
+
// Free Xiaomi MiMo Code (no user key; executor bootstraps JWT)
|
|
420
|
+
"mimo-free": {
|
|
421
|
+
baseUrl: "https://api.xiaomimimo.com/api/free-ai/openai/chat",
|
|
422
|
+
format: "openai",
|
|
423
|
+
noAuth: true,
|
|
424
|
+
},
|
|
425
|
+
venice: {
|
|
426
|
+
baseUrl: "https://api.venice.ai/api/v1/chat/completions",
|
|
427
|
+
format: "openai",
|
|
428
|
+
},
|
|
429
|
+
featherless: {
|
|
430
|
+
baseUrl: "https://api.featherless.ai/v1/chat/completions",
|
|
431
|
+
format: "openai",
|
|
432
|
+
},
|
|
419
433
|
// Region map for Xiaomi MiMo Token Plan (keys are cluster-specific)
|
|
420
434
|
// Used by resolveXiaomiTokenplanBaseUrl below
|
|
421
435
|
// === Free-tier providers (synced from OmniRoute) ===
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DefaultExecutor } from "./default.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CodeBuddy CN — OpenAI-compatible gateway at codebuddy.cn / copilot.tencent.com.
|
|
5
|
+
*
|
|
6
|
+
* Forces streaming (upstream rejects non-stream chat with 11101) and only
|
|
7
|
+
* attaches reasoning_summary when the client asked for reasoning_effort
|
|
8
|
+
* (forcing reasoning on plain requests trips content filters).
|
|
9
|
+
*
|
|
10
|
+
* Ported from 9router executors/codebuddy-cn.js.
|
|
11
|
+
*/
|
|
12
|
+
export class CodeBuddyCnExecutor extends DefaultExecutor {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("codebuddy-cn");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
transformRequest(model, body, stream, credentials) {
|
|
18
|
+
const transformed = super.transformRequest(model, body, stream, credentials);
|
|
19
|
+
transformed.stream = true;
|
|
20
|
+
|
|
21
|
+
const eff = transformed.reasoning_effort;
|
|
22
|
+
if (eff === "none" || eff === "off") {
|
|
23
|
+
delete transformed.reasoning_effort;
|
|
24
|
+
} else if (eff) {
|
|
25
|
+
transformed.reasoning_summary = "auto";
|
|
26
|
+
}
|
|
27
|
+
return transformed;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default CodeBuddyCnExecutor;
|
|
@@ -17,6 +17,8 @@ import { OllamaLocalExecutor } from "./ollama-local.js";
|
|
|
17
17
|
import { CommandCodeExecutor } from "./commandcode.js";
|
|
18
18
|
import { XiaomiTokenplanExecutor } from "./xiaomi-tokenplan.js";
|
|
19
19
|
import { AutoClawExecutor } from "./autoclaw.js";
|
|
20
|
+
import { MimoFreeExecutor } from "./mimo-free.js";
|
|
21
|
+
import { CodeBuddyCnExecutor } from "./codebuddy-cn.js";
|
|
20
22
|
import { DefaultExecutor } from "./default.js";
|
|
21
23
|
|
|
22
24
|
const executors = {
|
|
@@ -41,6 +43,9 @@ const executors = {
|
|
|
41
43
|
commandcode: new CommandCodeExecutor(),
|
|
42
44
|
"xiaomi-tokenplan": new XiaomiTokenplanExecutor(),
|
|
43
45
|
autoclaw: new AutoClawExecutor(),
|
|
46
|
+
"mimo-free": new MimoFreeExecutor(),
|
|
47
|
+
mmf: new MimoFreeExecutor(),
|
|
48
|
+
"codebuddy-cn": new CodeBuddyCnExecutor(),
|
|
44
49
|
};
|
|
45
50
|
|
|
46
51
|
const defaultCache = new Map();
|
|
@@ -76,3 +81,5 @@ export { OllamaLocalExecutor } from "./ollama-local.js";
|
|
|
76
81
|
export { CommandCodeExecutor } from "./commandcode.js";
|
|
77
82
|
export { XiaomiTokenplanExecutor } from "./xiaomi-tokenplan.js";
|
|
78
83
|
export { AutoClawExecutor } from "./autoclaw.js";
|
|
84
|
+
export { MimoFreeExecutor } from "./mimo-free.js";
|
|
85
|
+
export { CodeBuddyCnExecutor } from "./codebuddy-cn.js";
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { BaseExecutor } from "./base.js";
|
|
2
|
+
import { PROVIDERS } from "../config/providers.js";
|
|
3
|
+
import { proxyAwareFetch } from "../utils/proxyFetch.js";
|
|
4
|
+
import { createHash } from "crypto";
|
|
5
|
+
import os from "os";
|
|
6
|
+
|
|
7
|
+
const BOOTSTRAP_URL = "https://api.xiaomimimo.com/api/free-ai/bootstrap";
|
|
8
|
+
const CHAT_URL = PROVIDERS["mimo-free"]?.baseUrl || "https://api.xiaomimimo.com/api/free-ai/openai/chat";
|
|
9
|
+
const SESSION_AFFINITY_PREFIX = "ses_";
|
|
10
|
+
const SESSION_ID_LENGTH = 24;
|
|
11
|
+
const JWT_FALLBACK_TTL_SEC = 3000;
|
|
12
|
+
const JWT_EXPIRY_BUFFER_MS = 300000;
|
|
13
|
+
const SESSION_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
14
|
+
|
|
15
|
+
// Anti-abuse gate: upstream rejects requests without a Chrome-like User-Agent with 403 "Illegal access"
|
|
16
|
+
const USER_AGENTS = [
|
|
17
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
|
18
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
|
19
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// Anti-abuse gate marker: free chat endpoint returns 403 unless a system message contains this.
|
|
23
|
+
export const MIMO_SYSTEM_MARKER =
|
|
24
|
+
"You are MiMoCode, an interactive CLI tool that helps users with software engineering tasks.";
|
|
25
|
+
|
|
26
|
+
let cachedJwt = null;
|
|
27
|
+
let jwtExpiresAt = 0;
|
|
28
|
+
|
|
29
|
+
function generateFingerprint() {
|
|
30
|
+
let username = "unknown-user";
|
|
31
|
+
try {
|
|
32
|
+
username = os.userInfo().username;
|
|
33
|
+
} catch {
|
|
34
|
+
// ignore
|
|
35
|
+
}
|
|
36
|
+
const cpu = (os.cpus()[0]?.model || "unknown-cpu").trim();
|
|
37
|
+
const seed = `${os.hostname()}|${os.platform()}|${os.arch()}|${cpu}|${username}`;
|
|
38
|
+
return createHash("sha256").update(seed).digest("hex");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function generateSessionId() {
|
|
42
|
+
let id = SESSION_AFFINITY_PREFIX;
|
|
43
|
+
for (let i = 0; i < SESSION_ID_LENGTH; i++) {
|
|
44
|
+
id += SESSION_CHARS[Math.floor(Math.random() * SESSION_CHARS.length)];
|
|
45
|
+
}
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function parseJwtExp(jwt) {
|
|
50
|
+
try {
|
|
51
|
+
const payload = JSON.parse(Buffer.from(jwt.split(".")[1], "base64").toString());
|
|
52
|
+
if (payload.exp) return payload.exp * 1000;
|
|
53
|
+
} catch {
|
|
54
|
+
// ignore
|
|
55
|
+
}
|
|
56
|
+
return Date.now() + JWT_FALLBACK_TTL_SEC * 1000;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function injectSystemMarker(body) {
|
|
60
|
+
const messages = body?.messages;
|
|
61
|
+
if (!Array.isArray(messages)) return body;
|
|
62
|
+
const hasMarker = messages.some(
|
|
63
|
+
(m) => m?.role === "system" && typeof m.content === "string" && m.content.includes(MIMO_SYSTEM_MARKER),
|
|
64
|
+
);
|
|
65
|
+
if (hasMarker) return body;
|
|
66
|
+
return { ...body, messages: [{ role: "system", content: MIMO_SYSTEM_MARKER }, ...messages] };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function resetJwtCache() {
|
|
70
|
+
cachedJwt = null;
|
|
71
|
+
jwtExpiresAt = 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function bootstrapJwt(proxyOptions = null) {
|
|
75
|
+
if (cachedJwt && Date.now() < jwtExpiresAt - JWT_EXPIRY_BUFFER_MS) {
|
|
76
|
+
return cachedJwt;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const response = await proxyAwareFetch(BOOTSTRAP_URL, {
|
|
80
|
+
method: "POST",
|
|
81
|
+
headers: {
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
"User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
|
|
84
|
+
},
|
|
85
|
+
body: JSON.stringify({ client: generateFingerprint() }),
|
|
86
|
+
}, proxyOptions);
|
|
87
|
+
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
throw new Error(`MiMo bootstrap failed: ${response.status}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
if (!data.jwt) {
|
|
94
|
+
throw new Error("MiMo bootstrap returned no JWT");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
cachedJwt = data.jwt;
|
|
98
|
+
jwtExpiresAt = parseJwtExp(data.jwt);
|
|
99
|
+
return cachedJwt;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export class MimoFreeExecutor extends BaseExecutor {
|
|
103
|
+
constructor() {
|
|
104
|
+
super("mimo-free", PROVIDERS["mimo-free"]);
|
|
105
|
+
this.sessionId = generateSessionId();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
buildUrl() {
|
|
109
|
+
return CHAT_URL;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
buildHeaders(credentials, stream = true) {
|
|
113
|
+
return {
|
|
114
|
+
"Content-Type": "application/json",
|
|
115
|
+
"X-Mimo-Source": "mimocode-cli-free",
|
|
116
|
+
"User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
|
|
117
|
+
"x-session-affinity": this.sessionId,
|
|
118
|
+
Accept: stream ? "text/event-stream" : "application/json",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
transformRequest(model, body) {
|
|
123
|
+
return injectSystemMarker(body);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async execute({ model, body, stream, credentials, signal, log, proxyOptions = null }) {
|
|
127
|
+
let jwt;
|
|
128
|
+
try {
|
|
129
|
+
jwt = await bootstrapJwt(proxyOptions);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
log?.error?.("AUTH", `MiMo bootstrap failed: ${error.message}`);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const url = this.buildUrl();
|
|
136
|
+
const transformedBody = this.transformRequest(model, body);
|
|
137
|
+
const headers = { ...this.buildHeaders(credentials, stream), Authorization: `Bearer ${jwt}` };
|
|
138
|
+
const bodyStr = JSON.stringify(transformedBody);
|
|
139
|
+
log?.debug?.("FETCH", `MIMO-FREE → ${url} | body=${bodyStr.length}B`);
|
|
140
|
+
|
|
141
|
+
const response = await proxyAwareFetch(url, { method: "POST", headers, body: bodyStr, signal }, proxyOptions);
|
|
142
|
+
|
|
143
|
+
if (response.status === 401 || response.status === 403) {
|
|
144
|
+
log?.debug?.("AUTH", `MiMo auth failed (${response.status}), re-bootstrapping...`);
|
|
145
|
+
resetJwtCache();
|
|
146
|
+
jwt = await bootstrapJwt(proxyOptions);
|
|
147
|
+
headers.Authorization = `Bearer ${jwt}`;
|
|
148
|
+
const retryResponse = await proxyAwareFetch(url, { method: "POST", headers, body: bodyStr, signal }, proxyOptions);
|
|
149
|
+
return { response: retryResponse, url, headers, transformedBody };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return { response, url, headers, transformedBody };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export default MimoFreeExecutor;
|
|
@@ -22,6 +22,7 @@ import { injectCaveman } from "../rtk/caveman.js";
|
|
|
22
22
|
import { injectPonytail } from "../rtk/ponytail.js";
|
|
23
23
|
import { injectContextFiles } from "../context/injectContext.js";
|
|
24
24
|
import { compressMessages, formatRtkLog } from "../rtk/index.js";
|
|
25
|
+
import { applyThinkingFromModelAndSettings, stripThinkingSuffix } from "../utils/thinkingSuffix.js";
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Core chat handler - shared between SSE and Worker
|
|
@@ -31,38 +32,28 @@ import { compressMessages, formatRtkLog } from "../rtk/index.js";
|
|
|
31
32
|
* @param {string} options.sourceFormatOverride - Override detected source format (e.g. "openai-responses")
|
|
32
33
|
*/
|
|
33
34
|
export async function handleChatCore({ body, modelInfo, credentials, log, onCredentialsRefreshed, onRequestSuccess, onDisconnect, clientRawRequest, connectionId, userAgent, apiKey, ccFilterNaming, rtkEnabled, cavemanEnabled, cavemanLevel, contextInjectionEnabled, ponytailEnabled, ponytailLevel, sourceFormatOverride, providerThinking }) {
|
|
34
|
-
const { provider
|
|
35
|
+
const { provider } = modelInfo;
|
|
35
36
|
const requestStartTime = Date.now();
|
|
36
37
|
|
|
37
38
|
const sourceFormat = sourceFormatOverride || detectFormat(body);
|
|
38
39
|
|
|
39
40
|
// Check for bypass patterns (warmup, skip, cc naming)
|
|
40
|
-
const bypassResponse = handleBypassRequest(body, model, userAgent, ccFilterNaming);
|
|
41
|
+
const bypassResponse = handleBypassRequest(body, modelInfo.model, userAgent, ccFilterNaming);
|
|
41
42
|
if (bypassResponse) return bypassResponse;
|
|
42
43
|
|
|
44
|
+
// model(high) suffix + per-provider thinking settings → reasoning_effort / thinking
|
|
45
|
+
const thinkingApplied = applyThinkingFromModelAndSettings(modelInfo.model, body, providerThinking);
|
|
46
|
+
body = thinkingApplied.body;
|
|
47
|
+
const model = thinkingApplied.cleanModel;
|
|
48
|
+
if (thinkingApplied.applied) {
|
|
49
|
+
log?.debug?.("THINKING", `Applied thinking mode=${thinkingApplied.applied} (model=${modelInfo.model})`);
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
const alias = PROVIDER_ID_TO_ALIAS[provider] || provider;
|
|
44
53
|
const modelTargetFormat = getModelTargetFormat(alias, model);
|
|
45
54
|
const targetFormat = modelTargetFormat || getTargetFormat(provider);
|
|
46
55
|
const stripList = getModelStrip(alias, model);
|
|
47
|
-
const upstreamModel = getModelUpstreamId(alias, model);
|
|
48
|
-
|
|
49
|
-
// Inject provider-level thinking config override (only if client hasn't set)
|
|
50
|
-
// on/off → extended type (body.thinking), none/low/medium/high → effort type (body.reasoning_effort)
|
|
51
|
-
if (providerThinking?.mode && providerThinking.mode !== "auto") {
|
|
52
|
-
const mode = providerThinking.mode;
|
|
53
|
-
if (mode === "on" && !body.thinking) {
|
|
54
|
-
console.log("Injecting provider-level thinking config override: on");
|
|
55
|
-
body = { ...body, thinking: { type: "enabled", budget_tokens: 10000 } };
|
|
56
|
-
} else if (mode === "off") {
|
|
57
|
-
body = { ...body, thinking: { type: "disabled" } };
|
|
58
|
-
delete body.reasoning_effort;
|
|
59
|
-
if (body.reasoning && typeof body.reasoning === "object") {
|
|
60
|
-
body.reasoning = { ...body.reasoning, effort: "none" };
|
|
61
|
-
}
|
|
62
|
-
} else if (!body.reasoning_effort) {
|
|
63
|
-
body = { ...body, reasoning_effort: mode };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
56
|
+
const upstreamModel = stripThinkingSuffix(getModelUpstreamId(alias, model));
|
|
66
57
|
|
|
67
58
|
const clientRequestedStreaming = body.stream === true || sourceFormat === FORMATS.ANTIGRAVITY || sourceFormat === FORMATS.GEMINI || sourceFormat === FORMATS.GEMINI_CLI;
|
|
68
59
|
const providerRequiresStreaming = provider === "openai" || provider === "codex" || provider === "commandcode";
|
|
@@ -81,6 +81,11 @@ const ALIAS_TO_PROVIDER_ID = {
|
|
|
81
81
|
"xiaomi-mimo": "xiaomi-mimo",
|
|
82
82
|
xmtp: "xiaomi-tokenplan",
|
|
83
83
|
"xiaomi-tokenplan": "xiaomi-tokenplan",
|
|
84
|
+
mmf: "mimo-free",
|
|
85
|
+
"mimo-free": "mimo-free",
|
|
86
|
+
venice: "venice",
|
|
87
|
+
fl: "featherless",
|
|
88
|
+
featherless: "featherless",
|
|
84
89
|
cf: "cloudflare-ai",
|
|
85
90
|
"cloudflare-ai": "cloudflare-ai",
|
|
86
91
|
// Image/video providers
|
|
@@ -343,21 +343,33 @@ function parseCodeBuddyUsage(payload) {
|
|
|
343
343
|
};
|
|
344
344
|
}
|
|
345
345
|
|
|
346
|
+
// Split refill packs (monthly cycle resets) vs one-shot bonus packs so the UI
|
|
347
|
+
// does not imply bonus credits replenish every month (ported from 9router).
|
|
348
|
+
const REFILL_GAP_MS = 2 * 24 * 60 * 60 * 1000;
|
|
349
|
+
const cycleEndMs = (acc) => {
|
|
350
|
+
const r = parseResetTime(acc.CycleEndTime);
|
|
351
|
+
return r ? new Date(r).getTime() : Number.POSITIVE_INFINITY;
|
|
352
|
+
};
|
|
353
|
+
const isRefill = (acc) => {
|
|
354
|
+
const ce = cycleEndMs(acc);
|
|
355
|
+
const de = Number(acc.DeductionEndTime);
|
|
356
|
+
return Number.isFinite(ce) && Number.isFinite(de) && de - ce > REFILL_GAP_MS;
|
|
357
|
+
};
|
|
358
|
+
const byExpiry = (a, b) => cycleEndMs(a) - cycleEndMs(b);
|
|
359
|
+
|
|
360
|
+
const refills = accounts.filter(isRefill).sort(byExpiry);
|
|
361
|
+
const bonuses = accounts.filter((a) => !isRefill(a)).sort(byExpiry);
|
|
362
|
+
|
|
346
363
|
const quotas = {};
|
|
347
364
|
let hasProPackage = false;
|
|
348
365
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
if (
|
|
353
|
-
|
|
354
|
-
if (account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proMon || account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proYear) {
|
|
366
|
+
const addQuota = (label, account, { recurring }) => {
|
|
367
|
+
const quota = getCodeBuddyQuotaValues(account, { useCycle: recurring });
|
|
368
|
+
if (!quota) return;
|
|
369
|
+
if (account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proMon
|
|
370
|
+
|| account.PackageCode === CODEBUDDY_CONFIG.packageCodes.proYear) {
|
|
355
371
|
hasProPackage = true;
|
|
356
372
|
}
|
|
357
|
-
|
|
358
|
-
const quota = getCodeBuddyQuotaValues(account);
|
|
359
|
-
if (!quota) continue;
|
|
360
|
-
|
|
361
373
|
if (!quotas[label]) {
|
|
362
374
|
quotas[label] = {
|
|
363
375
|
used: 0,
|
|
@@ -366,13 +378,37 @@ function parseCodeBuddyUsage(payload) {
|
|
|
366
378
|
resetAt: null,
|
|
367
379
|
unit: "credits",
|
|
368
380
|
unlimited: false,
|
|
381
|
+
recurring,
|
|
369
382
|
};
|
|
370
383
|
}
|
|
371
|
-
|
|
372
384
|
quotas[label].used += quota.used;
|
|
373
385
|
quotas[label].total += quota.total;
|
|
374
386
|
quotas[label].remaining += quota.remaining;
|
|
375
387
|
quotas[label].resetAt = getEarlierReset(quotas[label].resetAt, quota.resetAt);
|
|
388
|
+
quotas[label].recurring = quotas[label].recurring && recurring;
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
// Aggregate ALL refill packs into one Monthly row and ALL bonus packs into one
|
|
392
|
+
// Bonus row — Tencent often returns many small gift packages (10–20 rows) for a
|
|
393
|
+
// single account, which flooded the dashboard as Bonus Pack 1..N.
|
|
394
|
+
for (const account of refills) {
|
|
395
|
+
addQuota("Monthly Credits", account, { recurring: true });
|
|
396
|
+
}
|
|
397
|
+
for (const account of bonuses) {
|
|
398
|
+
addQuota("Bonus Credits", account, { recurring: false });
|
|
399
|
+
}
|
|
400
|
+
if (bonuses.length > 0 && quotas["Bonus Credits"]) {
|
|
401
|
+
quotas["Bonus Credits"].packCount = bonuses.length;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Fallback: if classification produced nothing, keep old package-label merge.
|
|
405
|
+
if (Object.keys(quotas).length === 0) {
|
|
406
|
+
for (const account of accounts) {
|
|
407
|
+
if (!account || typeof account !== "object") continue;
|
|
408
|
+
const label = getCodeBuddyQuotaLabel(account.PackageCode) || "Other Credits";
|
|
409
|
+
const recurring = label !== "Activity Credits" && label !== "Gift Credits";
|
|
410
|
+
addQuota(recurring ? "Monthly Credits" : "Bonus Credits", account, { recurring });
|
|
411
|
+
}
|
|
376
412
|
}
|
|
377
413
|
|
|
378
414
|
if (Object.keys(quotas).length === 0) {
|
|
@@ -389,8 +425,10 @@ function parseCodeBuddyUsage(payload) {
|
|
|
389
425
|
: 0;
|
|
390
426
|
}
|
|
391
427
|
|
|
428
|
+
const plan = hasProPackage ? "Pro" : "Free";
|
|
392
429
|
return {
|
|
393
|
-
plan
|
|
430
|
+
plan,
|
|
431
|
+
// packCount stays on Bonus Credits for UI/detail if needed; no noisy top-level message
|
|
394
432
|
quotas,
|
|
395
433
|
};
|
|
396
434
|
}
|
|
@@ -414,18 +452,32 @@ function getCodeBuddyQuotaLabel(packageCode) {
|
|
|
414
452
|
}
|
|
415
453
|
}
|
|
416
454
|
|
|
417
|
-
function getCodeBuddyQuotaValues(account) {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
455
|
+
function getCodeBuddyQuotaValues(account, { useCycle = true } = {}) {
|
|
456
|
+
// Refill packs: Cycle* fields = current period. Bonus packs: plain Capacity* = lifetime one-shot.
|
|
457
|
+
const total = useCycle
|
|
458
|
+
? firstFiniteNumber(
|
|
459
|
+
account.CycleCapacitySizePrecise,
|
|
460
|
+
account.CycleCapacitySize,
|
|
461
|
+
account.CapacitySizePrecise,
|
|
462
|
+
account.CapacitySize,
|
|
463
|
+
)
|
|
464
|
+
: firstFiniteNumber(
|
|
465
|
+
account.CapacitySizePrecise,
|
|
466
|
+
account.CapacitySize,
|
|
467
|
+
account.CycleCapacitySizePrecise,
|
|
468
|
+
account.CycleCapacitySize,
|
|
469
|
+
);
|
|
470
|
+
const remaining = useCycle
|
|
471
|
+
? firstFiniteNumber(
|
|
472
|
+
account.CycleCapacityRemainPrecise,
|
|
473
|
+
account.CapacityRemainPrecise,
|
|
474
|
+
account.CapacityRemain,
|
|
475
|
+
)
|
|
476
|
+
: firstFiniteNumber(
|
|
477
|
+
account.CapacityRemainPrecise,
|
|
478
|
+
account.CapacityRemain,
|
|
479
|
+
account.CycleCapacityRemainPrecise,
|
|
480
|
+
);
|
|
429
481
|
const used = firstFiniteNumber(
|
|
430
482
|
account.CapacityUsedPrecise,
|
|
431
483
|
account.CapacityUsed,
|
package/open-sse/utils/stream.js
CHANGED
|
@@ -126,6 +126,20 @@ export function createSSEStream(options = {}) {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
// Strip empty tool_calls arrays that break AI SDK reasoning tracking.
|
|
130
|
+
// Some providers (e.g. CodeBuddy CN) include `"tool_calls": []` in
|
|
131
|
+
// every streaming delta. @ai-sdk/openai-compatible checks
|
|
132
|
+
// `delta.tool_calls != null` — an empty array passes this check,
|
|
133
|
+
// causing premature `reasoning-end` on every chunk.
|
|
134
|
+
if (parsed?.choices) {
|
|
135
|
+
for (const choice of parsed.choices) {
|
|
136
|
+
if (choice.delta?.tool_calls && Array.isArray(choice.delta.tool_calls) && choice.delta.tool_calls.length === 0) {
|
|
137
|
+
delete choice.delta.tool_calls;
|
|
138
|
+
fieldsInjected = true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
129
143
|
if (!hasValuableContent(parsed, FORMATS.OPENAI)) {
|
|
130
144
|
continue;
|
|
131
145
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-name thinking suffix helpers: `provider/model(high)` → clean model + effort.
|
|
3
|
+
* Lightweight port of 9router thinkingUnified strip/parse (no full capabilities matrix).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const KNOWN_LEVELS = new Set([
|
|
7
|
+
"none", "off", "auto", "minimal", "low", "medium", "high", "xhigh", "max", "on", "thinking",
|
|
8
|
+
]);
|
|
9
|
+
|
|
10
|
+
/** Strip trailing `model(value)` → `model` (no-op when absent). */
|
|
11
|
+
export function stripThinkingSuffix(model) {
|
|
12
|
+
if (typeof model !== "string") return model;
|
|
13
|
+
const m = model.match(/^(.*)\([^()]+\)\s*$/);
|
|
14
|
+
return m ? m[1].trim() : model;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Parse `model(value)` → { cleanModel, level }.
|
|
19
|
+
* level is null when no valid suffix is present.
|
|
20
|
+
*/
|
|
21
|
+
export function parseThinkingSuffix(model) {
|
|
22
|
+
if (typeof model !== "string") return { cleanModel: model, level: null };
|
|
23
|
+
const m = model.match(/^(.*)\(([^()]+)\)\s*$/);
|
|
24
|
+
if (!m) return { cleanModel: model, level: null };
|
|
25
|
+
const cleanModel = m[1].trim();
|
|
26
|
+
const raw = m[2].trim().toLowerCase();
|
|
27
|
+
if (!KNOWN_LEVELS.has(raw) && !/^\d+$/.test(raw)) {
|
|
28
|
+
return { cleanModel: model, level: null };
|
|
29
|
+
}
|
|
30
|
+
if (raw === "off") return { cleanModel, level: "none" };
|
|
31
|
+
if (raw === "on" || raw === "thinking") return { cleanModel, level: "high" };
|
|
32
|
+
return { cleanModel, level: raw };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Apply parsed suffix (or providerThinking.mode) onto body as reasoning_effort / thinking.
|
|
37
|
+
* Mutates a shallow copy of body; returns { body, cleanModel }.
|
|
38
|
+
*/
|
|
39
|
+
export function applyThinkingFromModelAndSettings(model, body, providerThinking) {
|
|
40
|
+
const { cleanModel, level: suffixLevel } = parseThinkingSuffix(model);
|
|
41
|
+
let next = body && typeof body === "object" ? { ...body } : body || {};
|
|
42
|
+
|
|
43
|
+
const mode = suffixLevel || (providerThinking?.mode && providerThinking.mode !== "auto"
|
|
44
|
+
? providerThinking.mode
|
|
45
|
+
: null);
|
|
46
|
+
|
|
47
|
+
if (!mode) {
|
|
48
|
+
return { body: next, cleanModel, applied: null };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (mode === "on") {
|
|
52
|
+
if (!next.thinking) next = { ...next, thinking: { type: "enabled", budget_tokens: 10000 } };
|
|
53
|
+
} else if (mode === "off" || mode === "none") {
|
|
54
|
+
next = { ...next, thinking: { type: "disabled" } };
|
|
55
|
+
delete next.reasoning_effort;
|
|
56
|
+
if (next.reasoning && typeof next.reasoning === "object") {
|
|
57
|
+
next.reasoning = { ...next.reasoning, effort: "none" };
|
|
58
|
+
}
|
|
59
|
+
} else if (!next.reasoning_effort) {
|
|
60
|
+
next = { ...next, reasoning_effort: mode };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { body: next, cleanModel, applied: mode };
|
|
64
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import PropTypes from "prop-types";
|
|
2
2
|
|
|
3
|
-
export default function ModelRow({ model, fullModel, alias, copied, onCopy, testStatus, isCustom, isFree, onDeleteAlias, onTest, isTesting, onDisable }) {
|
|
3
|
+
export default function ModelRow({ model, fullModel, alias, copied, onCopy, testStatus, isCustom, isFree, onDeleteAlias, onTest, isTesting, onDisable, thinkingSuffix }) {
|
|
4
4
|
const borderColor = testStatus === "ok"
|
|
5
5
|
? "border-green-500/40"
|
|
6
6
|
: testStatus === "error"
|
|
@@ -13,6 +13,9 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
|
|
|
13
13
|
? "#ef4444"
|
|
14
14
|
: undefined;
|
|
15
15
|
|
|
16
|
+
// Copy/display includes optional thinking level: alias/model(high)
|
|
17
|
+
const displayModel = thinkingSuffix ? `${fullModel}(${thinkingSuffix})` : fullModel;
|
|
18
|
+
|
|
16
19
|
return (
|
|
17
20
|
<div className={`group min-w-0 max-w-full rounded-lg border px-3 py-2 ${borderColor} hover:bg-sidebar/50`}>
|
|
18
21
|
<div className="flex min-w-0 items-start gap-2 sm:items-center">
|
|
@@ -23,7 +26,7 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
|
|
|
23
26
|
{testStatus === "ok" ? "check_circle" : testStatus === "error" ? "cancel" : "smart_toy"}
|
|
24
27
|
</span>
|
|
25
28
|
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
26
|
-
<code className="max-w-[72vw] truncate rounded bg-sidebar px-1.5 py-0.5 font-mono text-xs text-text-muted sm:max-w-[360px]">{
|
|
29
|
+
<code className="max-w-[72vw] truncate rounded bg-sidebar px-1.5 py-0.5 font-mono text-xs text-text-muted sm:max-w-[360px]">{displayModel}</code>
|
|
27
30
|
{model.name && <span className="truncate pl-1 text-[9px] italic text-text-muted/70">{model.name}</span>}
|
|
28
31
|
</div>
|
|
29
32
|
{onTest && (
|
|
@@ -44,7 +47,7 @@ export default function ModelRow({ model, fullModel, alias, copied, onCopy, test
|
|
|
44
47
|
)}
|
|
45
48
|
<div className="relative shrink-0 group/btn">
|
|
46
49
|
<button
|
|
47
|
-
onClick={() => onCopy(
|
|
50
|
+
onClick={() => onCopy(displayModel, `model-${model.id}`)}
|
|
48
51
|
className="rounded p-0.5 text-text-muted hover:bg-sidebar hover:text-primary"
|
|
49
52
|
>
|
|
50
53
|
<span className="material-symbols-outlined text-sm">
|
|
@@ -92,4 +95,5 @@ ModelRow.propTypes = {
|
|
|
92
95
|
onTest: PropTypes.func,
|
|
93
96
|
isTesting: PropTypes.bool,
|
|
94
97
|
onDisable: PropTypes.func,
|
|
98
|
+
thinkingSuffix: PropTypes.string,
|
|
95
99
|
};
|