gitextract_1lp6o7pe/ ├── .cursor/ │ └── rules/ │ └── project.mdc ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── bug_report_en.md │ │ ├── config.yml │ │ ├── feature_request.md │ │ └── feature_request_en.md │ ├── PULL_REQUEST_TEMPLATE/ │ │ └── pull_request_template.md │ ├── SECURITY.md │ └── workflows/ │ ├── docker-image-alpha.yml │ ├── docker-image-arm64.yml │ ├── electron-build.yml │ ├── release.yml │ └── sync-to-gitee.yml ├── .gitignore ├── AGENTS.md ├── CLAUDE.md ├── Dockerfile ├── LICENSE ├── README.fr.md ├── README.ja.md ├── README.md ├── README.zh_CN.md ├── README.zh_TW.md ├── VERSION ├── bin/ │ ├── migration_v0.2-v0.3.sql │ ├── migration_v0.3-v0.4.sql │ └── time_test.sh ├── common/ │ ├── api_type.go │ ├── audio.go │ ├── body_storage.go │ ├── constants.go │ ├── copy.go │ ├── crypto.go │ ├── custom-event.go │ ├── database.go │ ├── disk_cache.go │ ├── disk_cache_config.go │ ├── email-outlook-auth.go │ ├── email.go │ ├── embed-file-system.go │ ├── endpoint_defaults.go │ ├── endpoint_type.go │ ├── env.go │ ├── gin.go │ ├── go-channel.go │ ├── gopool.go │ ├── hash.go │ ├── init.go │ ├── ip.go │ ├── json.go │ ├── limiter/ │ │ ├── limiter.go │ │ └── lua/ │ │ └── rate_limit.lua │ ├── model.go │ ├── page_info.go │ ├── performance_config.go │ ├── pprof.go │ ├── pyro.go │ ├── quota.go │ ├── rate-limit.go │ ├── redis.go │ ├── ssrf_protection.go │ ├── str.go │ ├── sys_log.go │ ├── system_monitor.go │ ├── system_monitor_unix.go │ ├── system_monitor_windows.go │ ├── topup-ratio.go │ ├── totp.go │ ├── url_validator.go │ ├── url_validator_test.go │ ├── utils.go │ ├── validate.go │ └── verification.go ├── constant/ │ ├── README.md │ ├── api_type.go │ ├── azure.go │ ├── cache_key.go │ ├── channel.go │ ├── context_key.go │ ├── endpoint_type.go │ ├── env.go │ ├── finish_reason.go │ ├── midjourney.go │ ├── multi_key_mode.go │ ├── setup.go │ ├── task.go │ └── waffo_pay_method.go ├── controller/ │ ├── billing.go │ ├── channel-billing.go │ ├── channel-test.go │ ├── channel.go │ ├── channel_affinity_cache.go │ ├── channel_upstream_update.go │ ├── channel_upstream_update_test.go │ ├── checkin.go │ ├── codex_oauth.go │ ├── codex_usage.go │ ├── console_migrate.go │ ├── custom_oauth.go │ ├── deployment.go │ ├── group.go │ ├── image.go │ ├── log.go │ ├── midjourney.go │ ├── misc.go │ ├── missing_models.go │ ├── model.go │ ├── model_meta.go │ ├── model_sync.go │ ├── oauth.go │ ├── option.go │ ├── passkey.go │ ├── performance.go │ ├── playground.go │ ├── prefill_group.go │ ├── pricing.go │ ├── ratio_config.go │ ├── ratio_sync.go │ ├── redemption.go │ ├── relay.go │ ├── secure_verification.go │ ├── setup.go │ ├── subscription.go │ ├── subscription_payment_creem.go │ ├── subscription_payment_epay.go │ ├── subscription_payment_stripe.go │ ├── swag_video.go │ ├── task.go │ ├── telegram.go │ ├── token.go │ ├── token_test.go │ ├── topup.go │ ├── topup_creem.go │ ├── topup_stripe.go │ ├── topup_waffo.go │ ├── twofa.go │ ├── uptime_kuma.go │ ├── usedata.go │ ├── user.go │ ├── vendor_meta.go │ ├── video_proxy.go │ ├── video_proxy_gemini.go │ └── wechat.go ├── docker-compose.yml ├── docs/ │ ├── channel/ │ │ └── other_setting.md │ ├── installation/ │ │ └── BT.md │ ├── ionet-client.md │ ├── openapi/ │ │ ├── api.json │ │ └── relay.json │ ├── translation-glossary.fr.md │ ├── translation-glossary.md │ └── translation-glossary.ru.md ├── dto/ │ ├── audio.go │ ├── channel_settings.go │ ├── claude.go │ ├── embedding.go │ ├── error.go │ ├── gemini.go │ ├── gemini_generation_config_test.go │ ├── midjourney.go │ ├── notify.go │ ├── openai_compaction.go │ ├── openai_image.go │ ├── openai_request.go │ ├── openai_request_zero_value_test.go │ ├── openai_response.go │ ├── openai_responses_compaction_request.go │ ├── openai_video.go │ ├── playground.go │ ├── pricing.go │ ├── ratio_sync.go │ ├── realtime.go │ ├── request_common.go │ ├── rerank.go │ ├── sensitive.go │ ├── suno.go │ ├── task.go │ ├── user_settings.go │ ├── values.go │ └── video.go ├── electron/ │ ├── README.md │ ├── build.sh │ ├── create-tray-icon.js │ ├── entitlements.mac.plist │ ├── main.js │ ├── package.json │ └── preload.js ├── go.mod ├── go.sum ├── i18n/ │ ├── i18n.go │ ├── keys.go │ └── locales/ │ ├── en.yaml │ ├── zh-CN.yaml │ └── zh-TW.yaml ├── logger/ │ └── logger.go ├── main.go ├── makefile ├── middleware/ │ ├── auth.go │ ├── body_cleanup.go │ ├── cache.go │ ├── cors.go │ ├── disable-cache.go │ ├── distributor.go │ ├── email-verification-rate-limit.go │ ├── gzip.go │ ├── i18n.go │ ├── jimeng_adapter.go │ ├── kling_adapter.go │ ├── logger.go │ ├── model-rate-limit.go │ ├── performance.go │ ├── rate-limit.go │ ├── recover.go │ ├── request-id.go │ ├── secure_verification.go │ ├── stats.go │ ├── turnstile-check.go │ └── utils.go ├── model/ │ ├── ability.go │ ├── channel.go │ ├── channel_cache.go │ ├── channel_satisfy.go │ ├── checkin.go │ ├── custom_oauth_provider.go │ ├── db_time.go │ ├── log.go │ ├── main.go │ ├── midjourney.go │ ├── missing_models.go │ ├── model_extra.go │ ├── model_meta.go │ ├── option.go │ ├── passkey.go │ ├── prefill_group.go │ ├── pricing.go │ ├── pricing_default.go │ ├── pricing_refresh.go │ ├── redemption.go │ ├── setup.go │ ├── subscription.go │ ├── task.go │ ├── task_cas_test.go │ ├── token.go │ ├── token_cache.go │ ├── topup.go │ ├── twofa.go │ ├── usedata.go │ ├── user.go │ ├── user_cache.go │ ├── user_oauth_binding.go │ ├── utils.go │ └── vendor_meta.go ├── new-api.service ├── oauth/ │ ├── discord.go │ ├── generic.go │ ├── github.go │ ├── linuxdo.go │ ├── oidc.go │ ├── provider.go │ ├── registry.go │ └── types.go ├── pkg/ │ ├── cachex/ │ │ ├── codec.go │ │ ├── hybrid_cache.go │ │ └── namespace.go │ └── ionet/ │ ├── client.go │ ├── container.go │ ├── deployment.go │ ├── hardware.go │ ├── jsonutil.go │ └── types.go ├── relay/ │ ├── audio_handler.go │ ├── channel/ │ │ ├── adapter.go │ │ ├── ai360/ │ │ │ └── constants.go │ │ ├── ali/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ ├── image.go │ │ │ ├── image_wan.go │ │ │ ├── rerank.go │ │ │ └── text.go │ │ ├── api_request.go │ │ ├── api_request_test.go │ │ ├── aws/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ ├── relay-aws.go │ │ │ └── relay_aws_test.go │ │ ├── baidu/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-baidu.go │ │ ├── baidu_v2/ │ │ │ ├── adaptor.go │ │ │ └── constants.go │ │ ├── claude/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ ├── message_delta_usage_patch_test.go │ │ │ ├── relay-claude.go │ │ │ └── relay_claude_test.go │ │ ├── cloudflare/ │ │ │ ├── adaptor.go │ │ │ ├── constant.go │ │ │ ├── dto.go │ │ │ └── relay_cloudflare.go │ │ ├── codex/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ └── oauth_key.go │ │ ├── cohere/ │ │ │ ├── adaptor.go │ │ │ ├── constant.go │ │ │ ├── dto.go │ │ │ └── relay-cohere.go │ │ ├── coze/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-coze.go │ │ ├── deepseek/ │ │ │ ├── adaptor.go │ │ │ └── constants.go │ │ ├── dify/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-dify.go │ │ ├── gemini/ │ │ │ ├── adaptor.go │ │ │ ├── constant.go │ │ │ ├── relay-gemini-native.go │ │ │ ├── relay-gemini.go │ │ │ └── relay_gemini_usage_test.go │ │ ├── jimeng/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── image.go │ │ │ └── sign.go │ │ ├── jina/ │ │ │ ├── adaptor.go │ │ │ ├── constant.go │ │ │ └── relay-jina.go │ │ ├── lingyiwanwu/ │ │ │ └── constrants.go │ │ ├── minimax/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── relay-minimax.go │ │ │ └── tts.go │ │ ├── mistral/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ └── text.go │ │ ├── mokaai/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ └── relay-mokaai.go │ │ ├── moonshot/ │ │ │ ├── adaptor.go │ │ │ └── constants.go │ │ ├── ollama/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ ├── relay-ollama.go │ │ │ └── stream.go │ │ ├── openai/ │ │ │ ├── adaptor.go │ │ │ ├── audio.go │ │ │ ├── chat_via_responses.go │ │ │ ├── constant.go │ │ │ ├── helper.go │ │ │ ├── relay-openai.go │ │ │ ├── relay_responses.go │ │ │ └── relay_responses_compact.go │ │ ├── openrouter/ │ │ │ ├── constant.go │ │ │ └── dto.go │ │ ├── palm/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-palm.go │ │ ├── perplexity/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ └── relay-perplexity.go │ │ ├── replicate/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ └── dto.go │ │ ├── siliconflow/ │ │ │ ├── adaptor.go │ │ │ ├── constant.go │ │ │ ├── dto.go │ │ │ └── relay-siliconflow.go │ │ ├── submodel/ │ │ │ ├── adaptor.go │ │ │ └── constants.go │ │ ├── task/ │ │ │ ├── ali/ │ │ │ │ ├── adaptor.go │ │ │ │ └── constants.go │ │ │ ├── doubao/ │ │ │ │ ├── adaptor.go │ │ │ │ └── constants.go │ │ │ ├── gemini/ │ │ │ │ ├── adaptor.go │ │ │ │ ├── billing.go │ │ │ │ ├── dto.go │ │ │ │ └── image.go │ │ │ ├── hailuo/ │ │ │ │ ├── adaptor.go │ │ │ │ ├── constants.go │ │ │ │ └── models.go │ │ │ ├── jimeng/ │ │ │ │ └── adaptor.go │ │ │ ├── kling/ │ │ │ │ └── adaptor.go │ │ │ ├── sora/ │ │ │ │ ├── adaptor.go │ │ │ │ └── constants.go │ │ │ ├── suno/ │ │ │ │ ├── adaptor.go │ │ │ │ └── models.go │ │ │ ├── taskcommon/ │ │ │ │ └── helpers.go │ │ │ ├── vertex/ │ │ │ │ └── adaptor.go │ │ │ └── vidu/ │ │ │ └── adaptor.go │ │ ├── tencent/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-tencent.go │ │ ├── vertex/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ ├── relay-vertex.go │ │ │ └── service_account.go │ │ ├── volcengine/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── protocols.go │ │ │ └── tts.go │ │ ├── xai/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── text.go │ │ ├── xinference/ │ │ │ ├── constant.go │ │ │ └── dto.go │ │ ├── xunfei/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-xunfei.go │ │ ├── zhipu/ │ │ │ ├── adaptor.go │ │ │ ├── constants.go │ │ │ ├── dto.go │ │ │ └── relay-zhipu.go │ │ └── zhipu_4v/ │ │ ├── adaptor.go │ │ ├── constants.go │ │ ├── dto.go │ │ ├── image.go │ │ └── relay-zhipu_v4.go │ ├── chat_completions_via_responses.go │ ├── claude_handler.go │ ├── common/ │ │ ├── billing.go │ │ ├── override.go │ │ ├── override_test.go │ │ ├── relay_info.go │ │ ├── relay_info_test.go │ │ ├── relay_utils.go │ │ └── request_conversion.go │ ├── common_handler/ │ │ └── rerank.go │ ├── compatible_handler.go │ ├── constant/ │ │ └── relay_mode.go │ ├── embedding_handler.go │ ├── gemini_handler.go │ ├── helper/ │ │ ├── common.go │ │ ├── model_mapped.go │ │ ├── price.go │ │ ├── stream_scanner.go │ │ ├── stream_scanner_test.go │ │ └── valid_request.go │ ├── image_handler.go │ ├── mjproxy_handler.go │ ├── param_override_error.go │ ├── reasonmap/ │ │ └── reasonmap.go │ ├── relay_adaptor.go │ ├── relay_task.go │ ├── rerank_handler.go │ ├── responses_handler.go │ └── websocket.go ├── router/ │ ├── api-router.go │ ├── dashboard.go │ ├── main.go │ ├── relay-router.go │ ├── video-router.go │ └── web-router.go ├── service/ │ ├── audio.go │ ├── billing.go │ ├── billing_session.go │ ├── channel.go │ ├── channel_affinity.go │ ├── channel_affinity_template_test.go │ ├── channel_affinity_usage_cache_test.go │ ├── channel_select.go │ ├── codex_credential_refresh.go │ ├── codex_credential_refresh_task.go │ ├── codex_oauth.go │ ├── codex_wham_usage.go │ ├── convert.go │ ├── download.go │ ├── epay.go │ ├── error.go │ ├── error_test.go │ ├── file_decoder.go │ ├── file_service.go │ ├── funding_source.go │ ├── group.go │ ├── http.go │ ├── http_client.go │ ├── image.go │ ├── log_info_generate.go │ ├── midjourney.go │ ├── notify-limit.go │ ├── openai_chat_responses_compat.go │ ├── openai_chat_responses_mode.go │ ├── openaicompat/ │ │ ├── chat_to_responses.go │ │ ├── policy.go │ │ ├── regex.go │ │ └── responses_to_chat.go │ ├── passkey/ │ │ ├── service.go │ │ ├── session.go │ │ └── user.go │ ├── quota.go │ ├── sensitive.go │ ├── str.go │ ├── subscription_reset_task.go │ ├── task.go │ ├── task_billing.go │ ├── task_billing_test.go │ ├── task_polling.go │ ├── token_counter.go │ ├── token_estimator.go │ ├── tokenizer.go │ ├── usage_helpr.go │ ├── user_notify.go │ ├── violation_fee.go │ └── webhook.go ├── setting/ │ ├── auto_group.go │ ├── chat.go │ ├── config/ │ │ └── config.go │ ├── console_setting/ │ │ ├── config.go │ │ └── validation.go │ ├── midjourney.go │ ├── model_setting/ │ │ ├── claude.go │ │ ├── gemini.go │ │ ├── global.go │ │ ├── grok.go │ │ └── qwen.go │ ├── operation_setting/ │ │ ├── channel_affinity_setting.go │ │ ├── checkin_setting.go │ │ ├── general_setting.go │ │ ├── monitor_setting.go │ │ ├── operation_setting.go │ │ ├── payment_setting.go │ │ ├── payment_setting_old.go │ │ ├── quota_setting.go │ │ ├── status_code_ranges.go │ │ ├── status_code_ranges_test.go │ │ ├── token_setting.go │ │ └── tools.go │ ├── payment_creem.go │ ├── payment_stripe.go │ ├── payment_waffo.go │ ├── performance_setting/ │ │ └── config.go │ ├── rate_limit.go │ ├── ratio_setting/ │ │ ├── cache_ratio.go │ │ ├── compact_suffix.go │ │ ├── expose_ratio.go │ │ ├── exposed_cache.go │ │ ├── group_ratio.go │ │ └── model_ratio.go │ ├── reasoning/ │ │ └── suffix.go │ ├── sensitive.go │ ├── system_setting/ │ │ ├── discord.go │ │ ├── fetch_setting.go │ │ ├── legal.go │ │ ├── oidc.go │ │ ├── passkey.go │ │ └── system_setting_old.go │ └── user_usable_group.go ├── types/ │ ├── channel_error.go │ ├── error.go │ ├── file_data.go │ ├── file_source.go │ ├── price_data.go │ ├── relay_format.go │ ├── request_meta.go │ ├── rw_map.go │ └── set.go └── web/ ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc.mjs ├── i18next.config.js ├── index.html ├── jsconfig.json ├── package.json ├── postcss.config.js ├── public/ │ └── robots.txt ├── src/ │ ├── App.jsx │ ├── components/ │ │ ├── auth/ │ │ │ ├── LoginForm.jsx │ │ │ ├── OAuth2Callback.jsx │ │ │ ├── PasswordResetConfirm.jsx │ │ │ ├── PasswordResetForm.jsx │ │ │ ├── RegisterForm.jsx │ │ │ └── TwoFAVerification.jsx │ │ ├── common/ │ │ │ ├── DocumentRenderer/ │ │ │ │ └── index.jsx │ │ │ ├── logo/ │ │ │ │ ├── LinuxDoIcon.jsx │ │ │ │ ├── OIDCIcon.jsx │ │ │ │ └── WeChatIcon.jsx │ │ │ ├── markdown/ │ │ │ │ ├── MarkdownRenderer.jsx │ │ │ │ └── markdown.css │ │ │ ├── modals/ │ │ │ │ ├── RiskAcknowledgementModal.jsx │ │ │ │ └── SecureVerificationModal.jsx │ │ │ └── ui/ │ │ │ ├── CardPro.jsx │ │ │ ├── CardTable.jsx │ │ │ ├── ChannelKeyDisplay.jsx │ │ │ ├── CompactModeToggle.jsx │ │ │ ├── JSONEditor.jsx │ │ │ ├── Loading.jsx │ │ │ ├── RenderUtils.jsx │ │ │ ├── ScrollableContainer.jsx │ │ │ └── SelectableButtonGroup.jsx │ │ ├── dashboard/ │ │ │ ├── AnnouncementsPanel.jsx │ │ │ ├── ApiInfoPanel.jsx │ │ │ ├── ChartsPanel.jsx │ │ │ ├── DashboardHeader.jsx │ │ │ ├── FaqPanel.jsx │ │ │ ├── StatsCards.jsx │ │ │ ├── UptimePanel.jsx │ │ │ ├── index.jsx │ │ │ └── modals/ │ │ │ └── SearchModal.jsx │ │ ├── layout/ │ │ │ ├── Footer.jsx │ │ │ ├── NoticeModal.jsx │ │ │ ├── PageLayout.jsx │ │ │ ├── SetupCheck.js │ │ │ ├── SiderBar.jsx │ │ │ ├── components/ │ │ │ │ └── SkeletonWrapper.jsx │ │ │ └── headerbar/ │ │ │ ├── ActionButtons.jsx │ │ │ ├── HeaderLogo.jsx │ │ │ ├── LanguageSelector.jsx │ │ │ ├── MobileMenuButton.jsx │ │ │ ├── Navigation.jsx │ │ │ ├── NewYearButton.jsx │ │ │ ├── NotificationButton.jsx │ │ │ ├── ThemeToggle.jsx │ │ │ ├── UserArea.jsx │ │ │ └── index.jsx │ │ ├── model-deployments/ │ │ │ └── DeploymentAccessGuard.jsx │ │ ├── playground/ │ │ │ ├── ChatArea.jsx │ │ │ ├── CodeViewer.jsx │ │ │ ├── ConfigManager.jsx │ │ │ ├── CustomInputRender.jsx │ │ │ ├── CustomRequestEditor.jsx │ │ │ ├── DebugPanel.jsx │ │ │ ├── FloatingButtons.jsx │ │ │ ├── ImageUrlInput.jsx │ │ │ ├── MessageActions.jsx │ │ │ ├── MessageContent.jsx │ │ │ ├── OptimizedComponents.js │ │ │ ├── ParameterControl.jsx │ │ │ ├── SSEViewer.jsx │ │ │ ├── SettingsPanel.jsx │ │ │ ├── ThinkingContent.jsx │ │ │ └── configStorage.js │ │ ├── settings/ │ │ │ ├── ChannelSelectorModal.jsx │ │ │ ├── ChatsSetting.jsx │ │ │ ├── CustomOAuthSetting.jsx │ │ │ ├── DashboardSetting.jsx │ │ │ ├── DrawingSetting.jsx │ │ │ ├── HttpStatusCodeRulesInput.jsx │ │ │ ├── ModelDeploymentSetting.jsx │ │ │ ├── ModelSetting.jsx │ │ │ ├── OperationSetting.jsx │ │ │ ├── OtherSetting.jsx │ │ │ ├── PaymentSetting.jsx │ │ │ ├── PerformanceSetting.jsx │ │ │ ├── PersonalSetting.jsx │ │ │ ├── RateLimitSetting.jsx │ │ │ ├── RatioSetting.jsx │ │ │ ├── SystemSetting.jsx │ │ │ └── personal/ │ │ │ ├── cards/ │ │ │ │ ├── AccountManagement.jsx │ │ │ │ ├── CheckinCalendar.jsx │ │ │ │ ├── NotificationSettings.jsx │ │ │ │ └── PreferencesSettings.jsx │ │ │ ├── components/ │ │ │ │ ├── TwoFASetting.jsx │ │ │ │ └── UserInfoHeader.jsx │ │ │ └── modals/ │ │ │ ├── AccountDeleteModal.jsx │ │ │ ├── ChangePasswordModal.jsx │ │ │ ├── EmailBindModal.jsx │ │ │ └── WeChatBindModal.jsx │ │ ├── setup/ │ │ │ ├── SetupWizard.jsx │ │ │ ├── components/ │ │ │ │ ├── StepNavigation.jsx │ │ │ │ └── steps/ │ │ │ │ ├── AdminStep.jsx │ │ │ │ ├── CompleteStep.jsx │ │ │ │ ├── DatabaseStep.jsx │ │ │ │ └── UsageModeStep.jsx │ │ │ └── index.jsx │ │ ├── table/ │ │ │ ├── channels/ │ │ │ │ ├── ChannelsActions.jsx │ │ │ │ ├── ChannelsColumnDefs.jsx │ │ │ │ ├── ChannelsFilters.jsx │ │ │ │ ├── ChannelsTable.jsx │ │ │ │ ├── ChannelsTabs.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── BatchTagModal.jsx │ │ │ │ ├── ChannelUpstreamUpdateModal.jsx │ │ │ │ ├── CodexOAuthModal.jsx │ │ │ │ ├── CodexUsageModal.jsx │ │ │ │ ├── ColumnSelectorModal.jsx │ │ │ │ ├── EditChannelModal.jsx │ │ │ │ ├── EditTagModal.jsx │ │ │ │ ├── ModelSelectModal.jsx │ │ │ │ ├── ModelTestModal.jsx │ │ │ │ ├── MultiKeyManageModal.jsx │ │ │ │ ├── OllamaModelModal.jsx │ │ │ │ ├── ParamOverrideEditorModal.jsx │ │ │ │ ├── SingleModelSelectModal.jsx │ │ │ │ ├── StatusCodeRiskGuardModal.jsx │ │ │ │ └── statusCodeRiskGuard.js │ │ │ ├── mj-logs/ │ │ │ │ ├── MjLogsActions.jsx │ │ │ │ ├── MjLogsColumnDefs.jsx │ │ │ │ ├── MjLogsFilters.jsx │ │ │ │ ├── MjLogsTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── ColumnSelectorModal.jsx │ │ │ │ └── ContentModal.jsx │ │ │ ├── model-deployments/ │ │ │ │ ├── DeploymentsActions.jsx │ │ │ │ ├── DeploymentsColumnDefs.jsx │ │ │ │ ├── DeploymentsFilters.jsx │ │ │ │ ├── DeploymentsTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── ColumnSelectorModal.jsx │ │ │ │ ├── ConfirmationDialog.jsx │ │ │ │ ├── CreateDeploymentModal.jsx │ │ │ │ ├── EditDeploymentModal.jsx │ │ │ │ ├── ExtendDurationModal.jsx │ │ │ │ ├── UpdateConfigModal.jsx │ │ │ │ ├── ViewDetailsModal.jsx │ │ │ │ └── ViewLogsModal.jsx │ │ │ ├── model-pricing/ │ │ │ │ ├── filter/ │ │ │ │ │ ├── PricingDisplaySettings.jsx │ │ │ │ │ ├── PricingEndpointTypes.jsx │ │ │ │ │ ├── PricingGroups.jsx │ │ │ │ │ ├── PricingQuotaTypes.jsx │ │ │ │ │ ├── PricingTags.jsx │ │ │ │ │ └── PricingVendors.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── PricingPage.jsx │ │ │ │ │ ├── PricingSidebar.jsx │ │ │ │ │ ├── content/ │ │ │ │ │ │ ├── PricingContent.jsx │ │ │ │ │ │ └── PricingView.jsx │ │ │ │ │ └── header/ │ │ │ │ │ ├── PricingTopSection.jsx │ │ │ │ │ ├── PricingVendorIntro.jsx │ │ │ │ │ ├── PricingVendorIntroSkeleton.jsx │ │ │ │ │ ├── PricingVendorIntroWithSkeleton.jsx │ │ │ │ │ └── SearchActions.jsx │ │ │ │ ├── modal/ │ │ │ │ │ ├── ModelDetailSideSheet.jsx │ │ │ │ │ ├── PricingFilterModal.jsx │ │ │ │ │ └── components/ │ │ │ │ │ ├── FilterModalContent.jsx │ │ │ │ │ ├── FilterModalFooter.jsx │ │ │ │ │ ├── ModelBasicInfo.jsx │ │ │ │ │ ├── ModelEndpoints.jsx │ │ │ │ │ ├── ModelHeader.jsx │ │ │ │ │ └── ModelPricingTable.jsx │ │ │ │ └── view/ │ │ │ │ ├── card/ │ │ │ │ │ ├── PricingCardSkeleton.jsx │ │ │ │ │ └── PricingCardView.jsx │ │ │ │ └── table/ │ │ │ │ ├── PricingTable.jsx │ │ │ │ └── PricingTableColumns.jsx │ │ │ ├── models/ │ │ │ │ ├── ModelsActions.jsx │ │ │ │ ├── ModelsColumnDefs.jsx │ │ │ │ ├── ModelsFilters.jsx │ │ │ │ ├── ModelsTable.jsx │ │ │ │ ├── ModelsTabs.jsx │ │ │ │ ├── components/ │ │ │ │ │ └── SelectionNotification.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── EditModelModal.jsx │ │ │ │ ├── EditPrefillGroupModal.jsx │ │ │ │ ├── EditVendorModal.jsx │ │ │ │ ├── MissingModelsModal.jsx │ │ │ │ ├── PrefillGroupManagement.jsx │ │ │ │ ├── SyncWizardModal.jsx │ │ │ │ └── UpstreamConflictModal.jsx │ │ │ ├── redemptions/ │ │ │ │ ├── RedemptionsActions.jsx │ │ │ │ ├── RedemptionsColumnDefs.jsx │ │ │ │ ├── RedemptionsDescription.jsx │ │ │ │ ├── RedemptionsFilters.jsx │ │ │ │ ├── RedemptionsTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── DeleteRedemptionModal.jsx │ │ │ │ └── EditRedemptionModal.jsx │ │ │ ├── subscriptions/ │ │ │ │ ├── SubscriptionsActions.jsx │ │ │ │ ├── SubscriptionsColumnDefs.jsx │ │ │ │ ├── SubscriptionsDescription.jsx │ │ │ │ ├── SubscriptionsTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ └── AddEditSubscriptionModal.jsx │ │ │ ├── task-logs/ │ │ │ │ ├── TaskLogsActions.jsx │ │ │ │ ├── TaskLogsColumnDefs.jsx │ │ │ │ ├── TaskLogsFilters.jsx │ │ │ │ ├── TaskLogsTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── AudioPreviewModal.jsx │ │ │ │ ├── ColumnSelectorModal.jsx │ │ │ │ └── ContentModal.jsx │ │ │ ├── tokens/ │ │ │ │ ├── TokensActions.jsx │ │ │ │ ├── TokensColumnDefs.jsx │ │ │ │ ├── TokensDescription.jsx │ │ │ │ ├── TokensFilters.jsx │ │ │ │ ├── TokensTable.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── CCSwitchModal.jsx │ │ │ │ ├── CopyTokensModal.jsx │ │ │ │ ├── DeleteTokensModal.jsx │ │ │ │ └── EditTokenModal.jsx │ │ │ ├── usage-logs/ │ │ │ │ ├── UsageLogsActions.jsx │ │ │ │ ├── UsageLogsColumnDefs.jsx │ │ │ │ ├── UsageLogsFilters.jsx │ │ │ │ ├── UsageLogsTable.jsx │ │ │ │ ├── components/ │ │ │ │ │ └── ParamOverrideEntry.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── modals/ │ │ │ │ ├── ChannelAffinityUsageCacheModal.jsx │ │ │ │ ├── ColumnSelectorModal.jsx │ │ │ │ ├── ParamOverrideModal.jsx │ │ │ │ └── UserInfoModal.jsx │ │ │ └── users/ │ │ │ ├── UsersActions.jsx │ │ │ ├── UsersColumnDefs.jsx │ │ │ ├── UsersDescription.jsx │ │ │ ├── UsersFilters.jsx │ │ │ ├── UsersTable.jsx │ │ │ ├── index.jsx │ │ │ └── modals/ │ │ │ ├── AddUserModal.jsx │ │ │ ├── DeleteUserModal.jsx │ │ │ ├── DemoteUserModal.jsx │ │ │ ├── EditUserModal.jsx │ │ │ ├── EnableDisableUserModal.jsx │ │ │ ├── PromoteUserModal.jsx │ │ │ ├── ResetPasskeyModal.jsx │ │ │ ├── ResetTwoFAModal.jsx │ │ │ ├── UserBindingManagementModal.jsx │ │ │ └── UserSubscriptionsModal.jsx │ │ └── topup/ │ │ ├── InvitationCard.jsx │ │ ├── RechargeCard.jsx │ │ ├── SubscriptionPlansCard.jsx │ │ ├── index.jsx │ │ └── modals/ │ │ ├── PaymentConfirmModal.jsx │ │ ├── SubscriptionPurchaseModal.jsx │ │ ├── TopupHistoryModal.jsx │ │ └── TransferModal.jsx │ ├── constants/ │ │ ├── channel-affinity-template.constants.js │ │ ├── channel.constants.js │ │ ├── common.constant.js │ │ ├── console.constants.js │ │ ├── dashboard.constants.js │ │ ├── index.js │ │ ├── playground.constants.js │ │ ├── redemption.constants.js │ │ ├── toast.constants.js │ │ └── user.constants.js │ ├── context/ │ │ ├── Status/ │ │ │ ├── index.jsx │ │ │ └── reducer.js │ │ ├── Theme/ │ │ │ └── index.jsx │ │ └── User/ │ │ ├── index.jsx │ │ └── reducer.js │ ├── contexts/ │ │ └── PlaygroundContext.jsx │ ├── helpers/ │ │ ├── api.js │ │ ├── auth.jsx │ │ ├── base64.js │ │ ├── boolean.js │ │ ├── dashboard.jsx │ │ ├── data.js │ │ ├── history.js │ │ ├── index.js │ │ ├── log.js │ │ ├── passkey.js │ │ ├── quota.js │ │ ├── render.jsx │ │ ├── secureApiCall.js │ │ ├── statusCodeRules.js │ │ ├── subscriptionFormat.js │ │ ├── token.js │ │ └── utils.jsx │ ├── hooks/ │ │ ├── channels/ │ │ │ ├── upstreamUpdateUtils.js │ │ │ ├── useChannelUpstreamUpdates.jsx │ │ │ └── useChannelsData.jsx │ │ ├── chat/ │ │ │ └── useTokenKeys.js │ │ ├── common/ │ │ │ ├── useContainerWidth.js │ │ │ ├── useHeaderBar.js │ │ │ ├── useIsMobile.js │ │ │ ├── useMinimumLoadingTime.js │ │ │ ├── useNavigation.js │ │ │ ├── useNotifications.js │ │ │ ├── useSecureVerification.jsx │ │ │ ├── useSidebar.js │ │ │ ├── useSidebarCollapsed.js │ │ │ ├── useTableCompactMode.js │ │ │ └── useUserPermissions.js │ │ ├── dashboard/ │ │ │ ├── useDashboardCharts.jsx │ │ │ ├── useDashboardData.js │ │ │ └── useDashboardStats.jsx │ │ ├── mj-logs/ │ │ │ └── useMjLogsData.js │ │ ├── model-deployments/ │ │ │ ├── useDeploymentsData.jsx │ │ │ └── useModelDeploymentSettings.js │ │ ├── model-pricing/ │ │ │ ├── useModelPricingData.jsx │ │ │ └── usePricingFilterCounts.js │ │ ├── models/ │ │ │ └── useModelsData.jsx │ │ ├── playground/ │ │ │ ├── useApiRequest.jsx │ │ │ ├── useDataLoader.js │ │ │ ├── useMessageActions.jsx │ │ │ ├── useMessageEdit.jsx │ │ │ ├── usePlaygroundState.js │ │ │ └── useSyncMessageAndCustomBody.js │ │ ├── redemptions/ │ │ │ └── useRedemptionsData.jsx │ │ ├── subscriptions/ │ │ │ └── useSubscriptionsData.jsx │ │ ├── task-logs/ │ │ │ └── useTaskLogsData.js │ │ ├── tokens/ │ │ │ └── useTokensData.jsx │ │ ├── usage-logs/ │ │ │ └── useUsageLogsData.jsx │ │ └── users/ │ │ └── useUsersData.jsx │ ├── i18n/ │ │ ├── i18n.js │ │ ├── language.js │ │ └── locales/ │ │ ├── en.json │ │ ├── fr.json │ │ ├── ja.json │ │ ├── ru.json │ │ ├── vi.json │ │ ├── zh-CN.json │ │ └── zh-TW.json │ ├── index.css │ ├── index.jsx │ ├── pages/ │ │ ├── About/ │ │ │ └── index.jsx │ │ ├── Channel/ │ │ │ └── index.jsx │ │ ├── Chat/ │ │ │ └── index.jsx │ │ ├── Chat2Link/ │ │ │ └── index.jsx │ │ ├── Dashboard/ │ │ │ └── index.jsx │ │ ├── Forbidden/ │ │ │ └── index.jsx │ │ ├── Home/ │ │ │ └── index.jsx │ │ ├── Log/ │ │ │ └── index.jsx │ │ ├── Midjourney/ │ │ │ └── index.jsx │ │ ├── Model/ │ │ │ └── index.jsx │ │ ├── ModelDeployment/ │ │ │ └── index.jsx │ │ ├── NotFound/ │ │ │ └── index.jsx │ │ ├── Playground/ │ │ │ └── index.jsx │ │ ├── Pricing/ │ │ │ └── index.jsx │ │ ├── PrivacyPolicy/ │ │ │ └── index.jsx │ │ ├── Redemption/ │ │ │ └── index.jsx │ │ ├── Setting/ │ │ │ ├── Chat/ │ │ │ │ └── SettingsChats.jsx │ │ │ ├── Dashboard/ │ │ │ │ ├── SettingsAPIInfo.jsx │ │ │ │ ├── SettingsAnnouncements.jsx │ │ │ │ ├── SettingsDataDashboard.jsx │ │ │ │ ├── SettingsFAQ.jsx │ │ │ │ └── SettingsUptimeKuma.jsx │ │ │ ├── Drawing/ │ │ │ │ └── SettingsDrawing.jsx │ │ │ ├── Model/ │ │ │ │ ├── SettingClaudeModel.jsx │ │ │ │ ├── SettingGeminiModel.jsx │ │ │ │ ├── SettingGlobalModel.jsx │ │ │ │ ├── SettingGrokModel.jsx │ │ │ │ └── SettingModelDeployment.jsx │ │ │ ├── Operation/ │ │ │ │ ├── SettingsChannelAffinity.jsx │ │ │ │ ├── SettingsCheckin.jsx │ │ │ │ ├── SettingsCreditLimit.jsx │ │ │ │ ├── SettingsGeneral.jsx │ │ │ │ ├── SettingsHeaderNavModules.jsx │ │ │ │ ├── SettingsLog.jsx │ │ │ │ ├── SettingsMonitoring.jsx │ │ │ │ ├── SettingsSensitiveWords.jsx │ │ │ │ └── SettingsSidebarModulesAdmin.jsx │ │ │ ├── Payment/ │ │ │ │ ├── SettingsGeneralPayment.jsx │ │ │ │ ├── SettingsPaymentGateway.jsx │ │ │ │ ├── SettingsPaymentGatewayCreem.jsx │ │ │ │ ├── SettingsPaymentGatewayStripe.jsx │ │ │ │ └── SettingsPaymentGatewayWaffo.jsx │ │ │ ├── Performance/ │ │ │ │ └── SettingsPerformance.jsx │ │ │ ├── RateLimit/ │ │ │ │ └── SettingsRequestRateLimit.jsx │ │ │ ├── Ratio/ │ │ │ │ ├── GroupRatioSettings.jsx │ │ │ │ ├── ModelRatioSettings.jsx │ │ │ │ ├── ModelRationNotSetEditor.jsx │ │ │ │ ├── ModelSettingsVisualEditor.jsx │ │ │ │ ├── UpstreamRatioSync.jsx │ │ │ │ ├── components/ │ │ │ │ │ └── ModelPricingEditor.jsx │ │ │ │ └── hooks/ │ │ │ │ └── useModelPricingEditorState.js │ │ │ └── index.jsx │ │ ├── Setup/ │ │ │ └── index.jsx │ │ ├── Subscription/ │ │ │ └── index.jsx │ │ ├── Task/ │ │ │ └── index.jsx │ │ ├── Token/ │ │ │ └── index.jsx │ │ ├── TopUp/ │ │ │ └── index.js │ │ ├── User/ │ │ │ └── index.jsx │ │ └── UserAgreement/ │ │ └── index.jsx │ └── services/ │ └── secureVerification.js ├── tailwind.config.js ├── vercel.json └── vite.config.js