diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 2f4b1ea6d7..e8bdf8e97b 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -146,7 +146,6 @@ "dashboard": "Dashboard", "providers": "Providers", "combos": "Combos", - "batch": "Batch Jobs", "usage": "Usage", "analytics": "Analytics", "costs": "Costs", @@ -491,9 +490,6 @@ "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", "mapModels": "Map Models", "testConnection": "Test Connection", - "testModel": "Test Model", - "testingModel": "Testing...", - "testModelSuccess": "Model {modelId} working. Latency: {latencyMs}ms", "connectionStatus": "Connection Status", "configureEndpoint": "Configure Endpoint", "instructions": "Instructions", @@ -639,32 +635,6 @@ "kiloManualConfiguration": "Kilo Code Manual Configuration", "whenToUseLabel": "When to use", "openToolDocs": "Open tool docs", - "toolCategories": "Tool Categories", - "toolCategoriesDesc": "Group CLIs by how OmniRoute configures or intercepts them so this page stays easier to scan.", - "autoConfiguredTab": "Auto-configured", - "guidedClientsTab": "Guided clients", - "mitmClientsTab": "MITM clients", - "customCliTab": "Custom CLI", - "allToolsTab": "All tools", - "visibleToolsCount": "{count} visible tools", - "customCliBuilderTitle": "OpenAI-compatible CLI builder", - "customCliBuilderDescription": "Generate env vars and JSON snippets for any CLI or SDK that accepts an OpenAI-compatible base URL, API key, and model ID.", - "customCliNameLabel": "CLI name", - "customCliNamePlaceholder": "e.g. My Team CLI", - "customCliDefaultModelLabel": "Default model", - "customCliDefaultModelHelp": "Use any OmniRoute model ID or combo. Most OpenAI-compatible CLIs only need the /v1 base URL plus a model string.", - "customCliKeyHelper": "For local installs OmniRoute can use sk_omniroute. In cloud mode, pick one of your management API keys.", - "customCliAliasMappingsLabel": "Alias mappings", - "customCliAliasMappingsHelp": "Optional helper aliases for wrapper scripts or config files that want stable shorthand names.", - "customCliAliasPlaceholder": "e.g. review", - "customCliTargetModelLabel": "Target model", - "customCliAddAlias": "Add alias", - "customCliNoMappings": "No alias mappings yet. Add one if your wrapper or team scripts use stable short names.", - "customCliNoModels": "Connect at least one provider to populate the model selectors.", - "customCliEndpointHintLabel": "How to wire the endpoint", - "customCliEndpointHint": "Point any OpenAI-compatible client to the OmniRoute /v1 base URL. The raw chat completions endpoint is {endpoint}. Use the JSON block when the tool wants a provider object, or the env script when it reads OPENAI_* variables.", - "customCliEnvBlockTitle": "Env / shell snippet", - "customCliJsonBlockTitle": "Provider JSON block", "toolUseCases": { "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", @@ -675,13 +645,14 @@ "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", - "amp": "Use when you want Amp shorthand workflows but still need OmniRoute aliases and routing rules behind them.", "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", - "custom": "Use when your CLI or SDK is not hardcoded in OmniRoute but still accepts an OpenAI-compatible base URL, API key, and model string." + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." }, "toolDescriptions": { "antigravity": "Google Antigravity IDE with MITM", @@ -694,11 +665,12 @@ "cursor": "Cursor AI Code Editor", "continue": "Continue AI Assistant", "opencode": "OpenCode AI coding agent (Terminal)", - "amp": "Sourcegraph Amp coding assistant CLI", "kiro": "Amazon Kiro — AI-powered IDE", "windsurf": "Windsurf AI Code Editor", "copilot": "GitHub Copilot AI Assistant", "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" }, "guides": { @@ -953,6 +925,26 @@ "when": "Use when long sessions must survive account rotation without losing the working context.", "avoid": "Avoid when account switching is rare or when you do not want extra summarization requests.", "example": "Example: Codex sessions that rotate across multiple accounts near quota exhaustion." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." } }, "advancedHelp": { @@ -1097,6 +1089,48 @@ "tip1": "Use at least 2 models for meaningful distribution.", "tip2": "Works best with equivalent-performance models.", "tip3": "Ideal for load balancing across multiple API accounts." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" } }, "templateFreeStack": "Free Stack ($0)", @@ -1123,14 +1157,26 @@ "failedReorder": "Failed to reorder models", "builderFlowTitle": "Combo Builder Flow", "builderStage": { - "basics": { "label": "Basics", "description": "Name and starting template" }, - "steps": { "label": "Steps", "description": "Provider, model, and account selection" }, - "strategy": { "label": "Strategy", "description": "Routing behavior and advanced settings" }, + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, "intelligent": { "label": "Smart Routing", "description": "Auto-routing candidate pool, presets, and scoring" }, - "review": { "label": "Review", "description": "Final validation before saving" } + "review": { + "label": "Review", + "description": "Final validation before saving" + } }, "builderStageVisited": "Stage completed", "builderStageCurrent": "Current stage", @@ -1162,39 +1208,43 @@ "reviewAdvanced": "Advanced Settings", "reviewAgentFlags": "Agent Flags", "reviewSequence": "Model Sequence", - "reviewNoSteps": "No steps configured" + "reviewNoSteps": "No steps configured", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" }, "costs": { "title": "Costs", - "pageDescription": "Track spend across providers, monitor budgets, and manage synced pricing data.", "budget": "Budget", - "overview": "Overview", - "overviewTitle": "Cost Overview", - "overviewDescription": "Global spend across all API keys, providers, and models using live usage analytics.", - "overviewLoadFailed": "Failed to load cost overview", "totalCost": "Total Cost", "breakdown": "Cost Breakdown", "noData": "No cost data", "byModel": "By Model", - "byProvider": "By Provider", - "range7d": "7D", - "range30d": "30D", - "range90d": "90D", - "rangeAll": "All", - "spendToday": "Spend Today", - "spend7d": "Spend 7D", - "spend30d": "Spend 30D", - "selectedWindow": "Selected Window", - "requestsInWindow": "Requests", - "activeProviders": "Active Providers", - "activeModels": "Active Models", - "avgCostPerRequest": "Avg Cost / Request", - "costTrend": "Daily Cost Trend", - "providerShare": "Spend by Provider", - "topProviders": "Top Providers", - "topModels": "Top Models", - "noCostDataTitle": "No spend recorded yet", - "noCostDataDescription": "Run traffic through OmniRoute or sync pricing data to populate this dashboard." + "byProvider": "By Provider" }, "endpoint": { "title": "API Endpoint", @@ -1218,8 +1268,6 @@ "embeddingsDesc": "Text embeddings for search & RAG pipelines", "imageGeneration": "Image Generation", "imageDesc": "Generate images from text prompts", - "videoGeneration": "Video Generation", - "videoDesc": "Generate videos via ComfyUI, Stable Diffusion WebUI, and compatible providers", "rerank": "Rerank", "rerankDesc": "Rerank documents by relevance to a query", "audioTranscription": "Audio Transcription", @@ -1582,11 +1630,6 @@ "running": "running", "runningCount": "{count} running", "ok": "OK", - "limitExhausted": "Exhausted", - "learnedFromHeaders": "Learned from provider headers", - "remainingOfLimit": "{remaining} / {limit} RPM remaining", - "throttleStatus": "Throttling: {value}", - "lastHeaderUpdate": "Header update: {age} ago", "activeLockouts": "Active Lockouts", "resetConfirm": "Reset all circuit breakers to healthy state? This will clear all failure counts and restore all providers to operational status.", "resetAllTitle": "Reset all circuit breakers to healthy state", @@ -1609,11 +1652,8 @@ "auditLog": "Audit Log", "console": "Console", "auditLogDesc": "Administrative actions and security events", - "runningRequests": "Running Requests", - "runningRequestsDesc": "Requests still in flight across providers and accounts, including sanitized payload previews.", "loading": "Loading...", "refresh": "Refresh", - "activeCount": "{count} active", "filterByAction": "Filter by action...", "filterByActor": "Filter by actor...", "filterEntriesAria": "Filter audit log entries", @@ -1626,32 +1666,10 @@ "search": "Search", "timestamp": "Timestamp", "action": "Action", - "status": "Status", "actor": "Actor", "target": "Target", - "resourceType": "Resource Type", "details": "Details", "ipAddress": "IP Address", - "requestId": "Request ID", - "model": "Model", - "provider": "Provider", - "account": "Account", - "elapsed": "Elapsed", - "count": "Count", - "payloads": "Payloads", - "viewPayloads": "View Payloads", - "clientPayload": "Client Request", - "upstreamPayload": "Upstream Request", - "upstreamNotSentYet": "Upstream request not dispatched yet", - "runningRequestDetailMeta": "Account: {account} • Elapsed: {elapsed}", - "viewDetails": "View Details", - "providerWarningTitle": "Provider warning captured", - "providerWarningDesc": "This request completed with a provider-side warning or sanitizer alert instead of a hard failure.", - "eventMetadata": "Event Metadata", - "eventPayload": "Event Payload", - "auditModalSubtitle": "Actor: {actor} • Target: {target}", - "totalEntries": "{count} total events", - "close": "Close", "notAvailable": "—", "noEntries": "No audit log entries found", "previous": "Previous", @@ -1726,11 +1744,6 @@ "oauthProviders": "OAuth Providers", "freeProviders": "Free Providers", "apiKeyProviders": "API Key Providers", - "llmProviders": "LLM Providers", - "localProviders": "Local / Self-Hosted", - "upstreamProxyProviders": "Upstream Proxy", - "aggregatorsGateways": "Aggregators / Gateways", - "imageProviders": "Image Generation", "compatibleProviders": "API Key Compatible Providers", "testAll": "Test All", "testAllOAuth": "Test all OAuth connections", @@ -1775,13 +1788,6 @@ "errorOccurred": "An error occurred. Please try again.", "modelStatus": "Model Status", "showConfiguredOnly": "Configured only", - "searchProviders": "Search providers...", - "searchProvidersHeading": "Search Providers", - "audioProvidersHeading": "Audio Providers", - "webCookieProviders": "Web / Cookie Providers", - "ccCompatibleLabel": "CC Compatible", - "addCcCompatible": "Add CC Compatible", - "configuredCount": "{configured} of {total} configured", "allModelsOperational": "All models operational", "modelsWithIssues": "{count} model(s) with issues", "allModelsNormal": "All models are responding normally.", @@ -1803,17 +1809,6 @@ "noActiveConnectionsInGroup": "No active connections found for this group.", "allTestsPassed": "All {total} tests passed", "testSummary": "{passed}/{total} passed, {failed} failed", - "expirationBannerExpired": "{count} Provider connection(s) expired", - "expirationBannerExpiringSoon": "{count} Provider connection(s) expiring soon", - "expirationBannerExpiredDesc": "Immediate action required. Expired connections will permanently fail.", - "expirationBannerExpiringSoonDesc": "Please review and renew expiring connections to avoid disruption.", - "zedImportButton": "Import from Zed", - "zedImporting": "Importing...", - "zedImportNone": "No supported OAuth credentials found in Zed IDE.", - "zedImportHint": "Import credentials from Zed IDE", - "zedImportSuccess": "Imported {count} credential(s) from Zed IDE ({providers}).", - "zedImportFailed": "Failed to import from Zed IDE.", - "zedImportNetworkError": "Network error while trying to import from Zed.", "nameLabel": "Name", "prefixLabel": "Prefix", "baseUrlLabel": "Base URL", @@ -2001,7 +1996,6 @@ "modelRemovedSuccess": "Model removed successfully", "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", - "ccCompatibleModelsDescription": "CC Compatible available models mirror the OAuth Claude Code provider list.", "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", "openaiCompatibleModelPlaceholder": "gpt-4o", "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", @@ -2018,8 +2012,6 @@ "save": "Save", "editConnection": "Edit Connection", "accountName": "Account name", - "accountConcurrencyCapLabel": "Provider account max concurrent requests", - "accountConcurrencyCapHint": "Maximum simultaneous requests for this provider account. Leave empty or set 0 for no limit. Helps prevent limits enforced by the provider itself before requests fail.", "email": "Email", "healthCheckMinutes": "Health Check (min)", "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", @@ -2055,121 +2047,7 @@ "statusBanned": "Banned / Sandbox Violation", "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", "showEmails": "Show all emails", - "hideEmails": "Hide all emails", - "upstreamProxyManagedTitle": "Managed via Upstream Proxy Settings", - "upstreamProxyManagedDescription": "CLIProxyAPI is configured as an upstream proxy layer, not as a direct provider connection. Manage the binary/runtime in CLI Tools and enable proxy routing on each provider via the provider proxy controls.", - "openCliTools": "Open CLI Tools", - "openSettings": "Open Settings", - "searchProvider": "Search Provider", - "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration is needed once an API key is connected.", - "perplexitySearchSharedKeyInfo": "Uses the same API key as Perplexity (chat provider). If you already have Perplexity configured, no additional setup is needed.", - "googlePseInfo": "Google Programmable Search requires two values: your API key and the Search Engine ID (cx) from the Programmable Search Engine dashboard.", - "searxngInfo": "SearXNG is self-hosted. Configure the instance base URL here. API key is optional and can be left blank for public or unauthenticated instances. Local/private URL validation requires OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true.", - "tokenExpiredTitle": "Token expired: {date}", - "tokenExpiredBadge": "Expired", - "tokenExpiresSoonTitle": "Token expires in {minutes}m", - "claudeExtraUsageToggleTitle": "Toggle Claude extra-usage blocking", - "claudeExtraUsageShort": "Block Extra", - "cpaModeEnabledTitle": "Using CLIProxyAPI for deeper Claude Code emulation (uTLS, multi-account, device profiles)", - "cpaModeDisabledTitle": "Enable CLIProxyAPI backend for deeper Claude Code OAuth emulation", - "codex5hToggleTitle": "Toggle Codex 5h limit policy", - "codexWeeklyToggleTitle": "Toggle Codex weekly limit policy", - "weeklyShort": "Weekly", - "toggleOnShort": "ON", - "toggleOffShort": "OFF", - "refreshOauthTokenTitle": "Refresh OAuth token manually", - "tokenShort": "Token", - "supportedEndpointsLabel": "Supported Endpoints", - "supportedEndpointChat": "Chat", - "supportedEndpointEmbeddings": "Embeddings", - "supportedEndpointImages": "Images", - "supportedEndpointAudio": "Audio", - "apiFormatLabel": "API Format", - "imagesShortLabel": "Images", - "audioShortLabel": "Audio", - "searchEngineIdLabel": "Search Engine ID (cx)", - "searchEngineIdHint": "Required. Find this in your Programmable Search Engine overview.", - "searchEngineIdRequired": "Programmable Search Engine ID (cx) is required.", - "ccCompatibleContext1mLabel": "CC Compatible 1M Context", - "ccCompatibleContext1mDescription": "When enabled, this connection appends `anthropic-beta: context-1m-2025-08-07`.", - "ccCompatibleValidationHint": "Validation uses the strict Claude Code-compatible bridge request for this provider.", - "ccCompatibleDetailsTitle": "CC Compatible Details", - "customUserAgentLabel": "Custom User-Agent", - "customUserAgentHint": "Optional override sent upstream as the User-Agent header for this connection.", - "routingTagsLabel": "Routing Tags", - "routingTagsPlaceholder": "fast, cheap, eu-region", - "routingTagsHint": "Comma-separated tags matched against request metadata.tags for tag-based routing.", - "excludedModelsLabel": "Excluded Models", - "excludedModelsPlaceholder": "gpt-5*, claude-opus-*, gemini-*-pro*", - "excludedModelsHint": "Comma-separated wildcard patterns. This connection will be skipped for matching models.", - "consoleApiKeyOracleLabel": "Console API Key (Oracle)", - "consoleApiKeyOraclePlaceholder": "Alibaba Console API Key", - "consoleApiKeyOracleHint": "Required for quota fetching. Do not share.", - "validationModelIdLabel": "Model ID (optional)", - "validationModelIdPlaceholder": "e.g. grok-3 or meta-llama/Llama-3.1-8B-Instruct", - "validationModelIdHint": "Used as a fallback if model listing is unavailable.", - "regionLabel": "Region", - "regionHint": "e.g. us-central1 or europe-west4. Partner models use the global region automatically.", - "accountIdLabel": "Account ID", - "accountIdPlaceholder": "Cloudflare Account ID", - "accountIdHint": "Find it in the Cloudflare dashboard URL or settings.", - "apiRegionLabel": "API Region", - "apiRegionHint": "Select the endpoint region for API access and quota tracking.", - "apiRegionInternational": "International (api.z.ai)", - "apiRegionChina": "China Mainland (open.bigmodel.cn)", - "extraApiKeysLabel": "Extra API Keys", - "extraApiKeysHint": "Round-robin rotation — optional", - "extraApiKeyMasked": "Key #{index}: {prefix}...{suffix}", - "removeThisKey": "Remove this key", - "addAnotherApiKey": "Add another API key...", - "totalKeysRotating": "{count} keys total — rotating round-robin on each request.", - "tagGroupLabel": "Tag / Group", - "tagGroupPlaceholder": "e.g. personal, work, team-a", - "tagGroupHint": "Used to group accounts in the provider view.", - "defaultThinkingStrengthLabel": "Default thinking strength", - "defaultThinkingStrengthHint": "Used when the client does not send a reasoning effort and the global Thinking Budget mode is passthrough.", - "maxConcurrentWholeNumberError": "Max concurrent must be a whole number greater than or equal to 0.", - "codexFastServiceTierLabel": "Codex Fast Service Tier", - "codexFastServiceTierDescription": "When enabled, injects `service_tier=priority` for this connection if the client leaves the tier unset.", - "openaiResponsesStoreLabel": "OpenAI Responses Store", - "openaiResponsesStoreDescription": "Preserves `store`, `previous_response_id`, and adds a stable fallback `session_id` for long Codex sessions. Enable only when the upstream account accepts stored Responses.", - "blockClaudeExtraUsageLabel": "Block Claude Extra Usage", - "blockClaudeExtraUsageDescription": "When enabled, OmniRoute marks this Claude Code account unavailable as soon as the usage API reports `extra_usage.queued`, so fallback switches to another account before extra pay-as-you-go charges continue.", - "hideEmail": "Hide email", - "showEmail": "Show email", - "vertexServiceAccountPlaceholder": "Paste the Service Account JSON here", - "personalAccessTokenLabel": "Personal Access Token", - "sessionCookieLabel": "Session Cookie", - "qoderPatPlaceholder": "Paste your Qoder Personal Access Token", - "qoderPatHint": "Supported path: PAT via qodercli. Browser OAuth remains experimental.", - "grokWebCookiePlaceholder": "Paste your sso cookie value from grok.com", - "grokWebCookieHint": "Paste the sso cookie from grok.com. A full `sso=...` value also works.", - "perplexityWebCookiePlaceholder": "Paste your __Secure-next-auth.session-token value", - "perplexityWebCookieHint": "Paste the __Secure-next-auth.session-token cookie from perplexity.ai.", - "blackboxWebCookiePlaceholder": "Paste your __Secure-authjs.session-token value", - "blackboxWebCookieHint": "Paste the __Secure-authjs.session-token cookie from app.blackbox.ai. A full cookie header also works.", - "museSparkWebCookiePlaceholder": "Paste your abra_sess value", - "museSparkWebCookieHint": "Paste the abra_sess cookie from meta.ai. A full cookie header also works.", - "apiKeyOptionalLabel": "API Key (optional)", - "apiKeyOptionalHint": "Optional. Leave blank if your SearXNG instance does not require authentication.", - "localProviderApiKeyOptionalHint": "Optional. Leave blank if your {provider} endpoint does not require authentication.", - "ccCompatibleNamePlaceholder": "CC Compatible Production", - "ccCompatibleNameHint": "Display name for this provider.", - "ccCompatiblePrefixPlaceholder": "cc", - "ccCompatiblePrefixHint": "Used for aliases such as prefix/model-id.", - "ccCompatibleBaseUrlPlaceholder": "https://example.com/v1", - "ccCompatibleBaseUrlHint": "Base URL for the CC-compatible site. Do not include /messages.", - "ccCompatibleChatPathHint": "Defaults to the strict Claude Code-compatible messages path.", - "compatUpstreamHeaderNamePlaceholder": "Authentication", - "compatUpstreamHeaderValuePlaceholder": "•••", - "azureOpenAiBaseUrlHint": "Required: paste your Azure OpenAI resource endpoint. OmniRoute will append /openai/deployments/{model}/chat/completions?api-version=....", - "bailianBaseUrlHint": "Optional: custom base URL for the bailian-coding-plan provider.", - "xiaomiMimoBaseUrlHint": "Optional: Xiaomi MiMo token-plan base URL. Examples: https://token-plan-ams.xiaomimimo.com/v1, https://token-plan-sgp.xiaomimimo.com/v1, https://token-plan-cn.xiaomimimo.com/v1. The app will append /chat/completions.", - "herokuBaseUrlHint": "Required: paste the Heroku Inference base URL. The app will append /v1/chat/completions.", - "databricksBaseUrlHint": "Required: paste the Databricks serving-endpoints base URL. The app will append /chat/completions.", - "snowflakeBaseUrlHint": "Required: paste the Snowflake account base URL. The app will append /api/v2/cortex/inference:complete.", - "searxngBaseUrlHint": "Required: paste your SearXNG instance base URL. The app will use /search and request format=json. Local/private URLs require OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true for dashboard validation.", - "localProviderBaseUrlHint": "Required: paste your {provider} OpenAI-compatible /v1 base URL (default: {baseUrl}). Local/private URLs require OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true for dashboard validation." + "hideEmails": "Hide all emails" }, "settings": { "title": "Settings", @@ -2274,7 +2152,6 @@ "pricingRates": "Pricing Rates Format", "currentPricing": "Current Pricing Overview", "loadingPricing": "Loading pricing data...", - "pricingLoadFailed": "Failed to load pricing data", "noPricing": "No pricing data available", "input": "Input", "output": "Output", @@ -2282,29 +2159,6 @@ "reasoning": "Reasoning", "cacheCreation": "Cache Creation", "customPricing": "Custom Pricing", - "pricingSyncTitle": "Pricing Sync", - "pricingSyncDescription": "Trigger LiteLLM sync, inspect sync status, and distinguish synced prices from manual overrides.", - "pricingSyncStatus": "Sync Status", - "syncEnabled": "Periodic sync enabled", - "syncDisabled": "Manual sync only", - "syncedModels": "Synced Models", - "clearSyncedPricing": "Clear Synced", - "clearSyncedPricingConfirm": "Clear all LiteLLM-synced pricing data?", - "clearSyncedPricingSuccess": "Cleared synced pricing data", - "clearSyncedPricingFailed": "Failed to clear synced pricing data", - "clearSyncedPricingFailedWithReason": "Failed to clear synced pricing data: {reason}", - "pricingSourceUser": "Override", - "pricingSourceModelsDev": "models.dev", - "pricingSourceLiteLLM": "LiteLLM", - "pricingSourceDefault": "Default", - "pricingSavedProvider": "Saved pricing for {provider}", - "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", - "pricingResetProvider": "Reset pricing for {provider}", - "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", - "pricingSyncSuccess": "Synced pricing for {count} models", - "pricingSyncFailed": "Pricing sync failed", - "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", - "unknownError": "Unknown error", "databaseSize": "Database Size", "backupDb": "Backup Database", "restoreDb": "Restore Database", @@ -2565,8 +2419,6 @@ "defaultSafetyNet": "Default Safety Net", "rpm": "RPM", "minGap": "Min Gap", - "comboConcurrencyLabel": "Combo round-robin max concurrent requests per model", - "comboConcurrencyHint": "Maximum simultaneous requests per model during combo round-robin. This setting only applies to combo strategies.", "maxConcurrent": "Max Concurrent", "activeLimiters": "Active Limiters", "noActiveLimiters": "No active rate limiters yet.", @@ -2727,12 +2579,10 @@ "realtime": "Real-Time Translation Activity", "chatTester": "Chat Tester", "testBench": "Test Bench", - "streamTransformer": "Stream Transformer", "liveMonitor": "Live Monitor", "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", - "modeDescriptionStreamTransformer": "Transform Chat Completions SSE into Responses API SSE and inspect emitted events.", "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", "recentTranslations": "Recent Translations", @@ -2789,17 +2639,13 @@ "scenarioThinking": "Thinking", "scenarioSystemPrompt": "System Prompt", "scenarioStreaming": "Streaming", - "scenarioVision": "Vision", - "scenarioSchemaCoercion": "Schema Coercion", "templateNames": { "simple-chat": "Simple Chat", "tool-calling": "Tool Calling", "multi-turn": "Multi-turn", "thinking": "Thinking", "system-prompt": "System Prompt", - "streaming": "Streaming", - "vision": "Vision", - "schema-coercion": "Schema Coercion" + "streaming": "Streaming" }, "templateDescriptions": { "simple-chat": "Basic text message", @@ -2807,9 +2653,7 @@ "multi-turn": "Conversation with history", "thinking": "Extended thinking / reasoning", "system-prompt": "Complex system instructions", - "streaming": "SSE streaming request", - "vision": "Multi-modal request with image input", - "schema-coercion": "Strict tool schema to verify request sanitization" + "streaming": "SSE streaming request" }, "templatePayloads": { "simpleChat": { @@ -2836,16 +2680,6 @@ }, "streaming": { "prompt": "Tell me a short story about a robot learning to paint." - }, - "vision": { - "system": "You are a visual assistant. Describe images with concise, concrete observations.", - "userPrompt": "Describe the image and call out notable objects or colors.", - "imageUrl": "https://images.unsplash.com/photo-1516117172878-fd2c41f4a759?auto=format&fit=crop&w=1200&q=80" - }, - "schemaCoercion": { - "userPrompt": "Check the weather for Tokyo and include hourly details.", - "toolDescription": "Look up weather details for a city", - "cityDescription": "City name to inspect" } }, "openaiCompatibleLabel": "OpenAI Compatible", @@ -2871,27 +2705,6 @@ "send": "Send", "clientRequest": "Client Request", "clientRequestDescription": "The request body as your client would send it", - "streamTransformerTitle": "Responses Stream Transformer", - "streamTransformerDescription": "Paste a chat completions SSE stream, run it through OmniRoute's Responses transformer, and inspect the emitted response.* events before wiring a client.", - "rawChatSseInput": "Raw chat completions SSE", - "transformToResponses": "Transform to Responses", - "loadTextSample": "Load text sample", - "loadToolSample": "Load tool-call sample", - "transformedResponsesSse": "Transformed Responses API SSE", - "transformedEvents": "Transformed events", - "uniqueEventTypes": "Unique event types", - "inputLines": "Input lines", - "outputLines": "Output lines", - "transformedEventTimeline": "Transformed event timeline", - "transformerTimelineHint": "Run the transformer to inspect emitted response.output_* events in order.", - "eventType": "Event type", - "eventPreview": "Preview", - "comboRouted": "Combo-routed", - "uniqueEndpoints": "Unique endpoints", - "routeDetails": "Route", - "comboBadge": "Combo", - "routeEndpointLabel": "Endpoint", - "routeConnectionLabel": "Conn", "formatDetected": "Format Detected", "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", "openaiIntermediate": "OpenAI Intermediate", @@ -2924,23 +2737,11 @@ "thisMonth": "This Month", "setLimits": "Set Limits", "dailyLimitUsd": "Daily Limit (USD)", - "weeklyLimitUsd": "Weekly Limit (USD)", "monthlyLimitUsd": "Monthly Limit (USD)", "warningThresholdPercent": "Warning Threshold (%)", "dailyLimitPlaceholder": "e.g. 5.00", - "weeklyLimitPlaceholder": "e.g. 25.00", "monthlyLimitPlaceholder": "e.g. 50.00", "warningThresholdPlaceholder": "80", - "activePeriodSpend": "Active Period Spend", - "intervalLabel": "Interval", - "resetInterval": "Reset Interval", - "resetTimeUtc": "Reset Time (UTC)", - "nextResetUtc": "Next reset (UTC): {value}", - "weeklyLimitSummary": "Weekly limit: {value}", - "notConfigured": "Not configured", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly", "saveLimits": "Save Limits", "budgetOk": "Budget OK — {remaining} remaining", "budgetExceeded": "Budget exceeded — requests may be blocked", @@ -2972,45 +2773,6 @@ "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", "evalSuites": "Evaluation Suites", "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", - "suiteBuilderNewSuite": "New Suite", - "suiteBuilderCreateTitle": "Create Custom Eval Suite", - "suiteBuilderEditTitle": "Edit Custom Eval Suite", - "suiteBuilderNameLabel": "Suite Name", - "suiteBuilderNamePlaceholder": "Customer support regression suite", - "suiteBuilderDescriptionLabel": "Description", - "suiteBuilderDescriptionPlaceholder": "Explain what this suite validates and why it matters.", - "suiteBuilderCasesTitle": "Custom Cases", - "suiteBuilderCasesHint": "Each case sends a real prompt through OmniRoute and checks the response with contains, exact, or regex matching.", - "suiteBuilderAddCase": "Add Case", - "suiteBuilderCaseCardTitle": "Case {index}", - "suiteBuilderCaseCardHint": "Define one prompt and one assertion for this regression check.", - "suiteBuilderCaseNameLabel": "Case Name", - "suiteBuilderCaseNamePlaceholder": "Refund policy response", - "suiteBuilderCaseModelLabel": "Default Model", - "suiteBuilderCaseModelPlaceholder": "gpt-4o-mini", - "suiteBuilderCaseTagsLabel": "Tags", - "suiteBuilderCaseTagsPlaceholder": "support, regression, billing", - "suiteBuilderCaseTagsHint": "Comma-separated tags stored with the case.", - "suiteBuilderCaseStrategyLabel": "Expected Strategy", - "suiteBuilderCaseSystemPromptLabel": "System Prompt", - "suiteBuilderCaseSystemPromptPlaceholder": "Optional system instruction for this case.", - "suiteBuilderCaseUserPromptLabel": "User Prompt", - "suiteBuilderCaseUserPromptPlaceholder": "Write the exact user input to replay during the eval.", - "suiteBuilderCaseExpectedLabel": "Expected Match", - "suiteBuilderCaseExpectedPlaceholder": "Text or regex that should appear in the model response.", - "suiteBuilderCreateAction": "Create Suite", - "suiteBuilderCreated": "Custom suite created", - "suiteBuilderUpdated": "Custom suite updated", - "suiteBuilderDeleted": "Custom suite deleted", - "suiteBuilderDeleteConfirm": "Delete the custom suite \"{name}\"?", - "suiteBuilderSaveFailed": "Failed to save custom suite", - "suiteBuilderDeleteFailed": "Failed to delete custom suite", - "suiteBuilderNameRequired": "Suite name is required", - "suiteBuilderCasesRequired": "Add at least one case before saving", - "suiteBuilderCaseInvalid": "Case {index} is incomplete. Fill name, model, prompt, and expected value.", - "suiteBuilderCustomBadge": "Custom", - "suiteBuilderBuiltInBadge": "Built-in", - "suiteBuilderUpdatedAt": "Updated {value}", "evalsLoading": "Loading eval suites...", "noEvalSuitesFound": "No Eval Suites Found", "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", @@ -3055,47 +2817,6 @@ "modelComparison": "Model Comparison", "regressionDetection": "Regression Detection", "latencyBenchmarks": "Latency Benchmarks", - "evalControlsTitle": "Run Targets", - "evalControlsHint": "Choose a model or combo, optionally compare two targets, and persist the run history in SQLite.", - "evalTarget": "Primary Target", - "evalTargetHint": "Suite defaults preserve the model configured on each test case.", - "evalCompareTarget": "Compare Against", - "evalCompareOptional": "No compare target", - "evalCompareHint": "Optional side-by-side comparison using the same suite.", - "evalApiKey": "Proxy API Key", - "evalApiKeyAuto": "Use dashboard session / no key", - "evalApiKeyHint": "Used only when your `/v1` endpoint requires a bearer key.", - "targetSuiteDefaults": "Suite defaults", - "targetTypeCombo": "Combo", - "targetTypeModel": "Model", - "scorecardTitle": "Persisted Scorecard", - "scorecardHint": "Latest stored pass rates across recent suite runs and targets.", - "scorecardSuites": "Tracked Runs", - "scorecardCases": "Cases Evaluated", - "scorecardPassed": "Cases Passed", - "scorecardPassRate": "Overall Pass Rate", - "recentRunsTitle": "Recent Runs", - "recentRunsHint": "History survives refreshes and now records combo-aware comparisons.", - "historyEmpty": "No persisted runs yet", - "historyLatency": "{value}ms average latency", - "historyColumnSuiteName": "Suite", - "historyColumnTarget": "Target", - "historyColumnPassRate": "Pass Rate", - "historyColumnAvgLatencyMs": "Avg Latency", - "historyColumnCreatedAt": "Ran At", - "runEvalRunning": "Running...", - "runCompletedWithScore": "Run completed at {score}% pass rate", - "compareCompletedWithScore": "Comparison completed. Primary run finished at {score}% pass rate", - "notifySelectDifferentCompareTarget": "Pick a different compare target", - "notifyEvalRunFailedWithReason": "Eval run failed: {reason}", - "notifyEvalLoadFailed": "Failed to load eval dashboard data", - "targetComparisonTitle": "Target Comparison", - "targetComparisonHint": "The same suite was executed against multiple targets.", - "suiteLatestRuns": "Latest Persisted Runs", - "suiteLatestRunsHint": "Stored runs stay available after a page refresh.", - "errorBadge": "Error", - "resultErrorLabel": "Error", - "actualOutputLabel": "Actual: {value}", "modelLockouts": "Model Lockouts", "noLockouts": "No models currently locked", "activeSessions": "Active Sessions", @@ -3370,10 +3091,9 @@ "commonUseCases": "Common Use Cases", "clientCompatibility": "Client Compatibility", "protocolsToc": "Protocols", - "mcpToolsToc": "MCP Tools", "apiReference": "API Reference", "managementApiReference": "Management API Reference", - "managementApiDescription": "Operational endpoints for provider management, runtime settings, payload rules, and proxy registry workflows.", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", "method": "Method", "path": "Path", "notes": "Notes", @@ -3384,7 +3104,7 @@ "oauthAutoRefresh": "OAuth connection with automatic token refresh.", "fullStreaming": "Full streaming support for all models.", "docsLabel": "Docs", - "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor, and 20+ more providers.", "openDashboard": "Open Dashboard", "endpointPage": "Endpoint Page", "github": "GitHub", @@ -3405,22 +3125,12 @@ "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", "featureCombosTitle": "Combos and Balancing", "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", - "featureAutoComboTitle": "AutoCombo Routing", - "featureAutoComboText": "Use intent-aware routing, emergency fallback, context-aware model selection, and resilience policies without changing the client payload.", - "featureSearchTitle": "Search, Rerank, and Multimodal APIs", - "featureSearchText": "Expose search, rerank, moderations, images, video, music, speech, and transcription endpoints behind the same OmniRoute base URL.", "featureUsageTitle": "Usage and Cost Tracking", "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", "featureAnalyticsTitle": "Analytics Dashboard", "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", "featureHealthTitle": "Health Monitoring", "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", - "featureMemoryTitle": "Memory and Context Handoffs", - "featureMemoryText": "Persist reusable facts, inject retrieved context into requests, and hand off long-running context across sessions and agent flows.", - "featureSkillsTitle": "Skills and Tool Execution", - "featureSkillsText": "Run registered skills, intercept tool calls, and expose skill execution through dashboard, MCP, and agent workflows.", - "featureAcpTitle": "ACP Workers and Local Agents", - "featureAcpText": "Detect local binaries OmniRoute can spawn as ACP workers, then coordinate them through the Agents and CLI Tools dashboards.", "featureCliTitle": "CLI Tools", "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", "featureSecurityTitle": "Security and Policies", @@ -3455,20 +3165,8 @@ "clientClaudeBullet1Prefix": "Use", "clientClaudeBullet1Middle": "(Claude) or", "clientClaudeBullet1Suffix": "(Antigravity) prefix.", - "clientWindsurfTitle": "Windsurf", - "clientWindsurfBullet1": "Use OmniRoute as the OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", - "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general chat traffic and preserve `/v1/responses` for Codex-style flows.", - "clientWindsurfBullet3": "Use Dashboard -> CLI Tools when you want a ready-to-copy Windsurf-oriented setup guide.", - "clientClineTitle": "Cline", - "clientClineBullet1": "Cline works well with explicit provider/model prefixes so the router never has to guess the backend.", - "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", - "clientClineBullet3": "Use the Providers dashboard to verify OAuth/API-key health before debugging Cline runtime issues.", - "clientKimiTitle": "Kimi Coding", - "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating provider accounts or combos underneath.", - "clientKimiBullet2": "Prefer prefixed models for coding workflows so fallback and audit trails stay explicit.", - "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-aware clients.", - "protocolsTitle": "Protocols: MCP, A2A, and ACP", - "protocolsDescription": "OmniRoute exposes MCP, A2A, and ACP-oriented worker flows in addition to OpenAI-compatible APIs.", + "protocolsTitle": "Protocols: MCP & A2A", + "protocolsDescription": "OmniRoute exposes two operational protocols in addition to OpenAI-compatible APIs: MCP for tool execution and A2A for agent-to-agent workflows.", "protocolMcpTitle": "MCP (Model Context Protocol)", "protocolMcpDesc": "Use MCP over stdio to let clients discover and call OmniRoute tools with audit visibility.", "protocolMcpStep1": "Start MCP transport with `omniroute --mcp`.", @@ -3479,60 +3177,20 @@ "protocolA2aStep1": "Read `/.well-known/agent.json` for agent discovery.", "protocolA2aStep2": "Send `message/send` or `message/stream` requests to `POST /a2a`.", "protocolA2aStep3": "Manage task lifecycle with `tasks/get` and `tasks/cancel`.", - "protocolAcpTitle": "ACP (Agent Communication Protocol Workers)", - "protocolAcpDesc": "Use ACP-backed local workers when OmniRoute should spawn and supervise a local binary instead of forwarding over HTTP.", - "protocolAcpStep1": "Open Dashboard -> Agents to verify which local binaries are installed and available as workers.", - "protocolAcpStep2": "Use Dashboard -> CLI Tools when you need client setup instead of worker spawning.", - "protocolAcpStep3": "Pair ACP workers with audit logs and health views to understand what OmniRoute launched and why.", "protocolTroubleshootingTitle": "Protocol Troubleshooting", "protocolTroubleshooting1": "If MCP status is offline, verify the stdio process is running and heartbeat file is updating.", "protocolTroubleshooting2": "If A2A tasks stay in `working`, inspect `/api/a2a/tasks/:id` and stream events for terminal state.", "protocolTroubleshooting3": "Use `/dashboard/mcp` and `/dashboard/a2a` for operational controls and audit visibility.", "endpointChatNote": "OpenAI-compatible chat endpoint (default).", "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", - "endpointCompletionsNote": "Legacy completions endpoint for clients that still send text-completions payloads.", "endpointModelsNote": "Model catalog for all connected providers.", "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", - "endpointModerationsNote": "Moderation and content-safety scoring across supported moderation providers.", - "endpointRerankNote": "Document reranking for retrieval and search post-processing.", - "endpointSearchNote": "Unified web search with provider fallback, analytics, and cost tracking.", - "endpointSearchAnalyticsNote": "Search telemetry and provider analytics for the unified search pipeline.", "endpointImagesNote": "Image generation (NanoBanana).", - "endpointVideoNote": "Video generation for ComfyUI and SD WebUI-compatible backends.", - "endpointMusicNote": "Music generation via ComfyUI workflow integrations.", - "endpointMessagesNote": "Anthropic-style messages compatibility endpoint for clients that speak message-native payloads.", - "endpointCountTokensNote": "Token counting helper for planning requests before execution.", - "endpointFilesNote": "File upload and artifact storage for batches and larger workflows.", - "endpointBatchesNote": "Batch job creation and retrieval for queued request execution.", - "endpointWsNote": "WebSocket-compatible upgrade path for real-time protocol clients.", "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", "endpointRewriteModelsNote": "Rewrite helper for model discovery without /v1.", - "mcpToolsTitle": "MCP Tool Catalog", - "mcpToolsDescription": "OmniRoute ships {count} MCP tools grouped across routing, operations, cache, memory, and skills.", - "mcpToolsCount": "{count} tools documented", - "mcpToolsRoutingTitle": "Routing and Catalog", - "mcpToolsRoutingDesc": "Read runtime health, inspect combos, check quotas, discover models, and call web search from MCP clients.", - "mcpToolsOperationsTitle": "Operations and Control", - "mcpToolsOperationsDesc": "Dry-run routing, change strategies, test combos, sync pricing, inspect session state, and diagnose runtime issues.", - "mcpToolsCacheTitle": "Cache Controls", - "mcpToolsCacheDesc": "Inspect hit rates and flush cache state without leaving the MCP client.", - "mcpToolsMemoryTitle": "Memory", - "mcpToolsMemoryDesc": "Search, add, and clear persisted OmniRoute memory entries from the same protocol surface.", - "mcpToolsSkillsTitle": "Skills", - "mcpToolsSkillsDesc": "List enabled skills, turn them on, execute them, and inspect execution history from MCP.", - "mgmtProvidersListNote": "List configured provider connections and their current status.", - "mgmtProvidersCreateNote": "Create a new managed provider connection from the dashboard control plane.", - "mgmtProvidersUpdateNote": "Update provider credentials, metadata, and operational flags.", - "mgmtProvidersDeleteNote": "Delete a provider connection and remove it from routing.", - "mgmtProvidersTestNote": "Run a live connection test against the selected provider account.", - "mgmtProvidersModelsNote": "Discover, cache, or inspect models exposed by one provider connection.", - "mgmtSettingsGetNote": "Read the main runtime settings used by the dashboard and router.", - "mgmtSettingsUpdateNote": "Update shared runtime settings without editing environment files directly.", - "mgmtPayloadRulesGetNote": "Read payload normalization and provider-specific payload rule configuration.", - "mgmtPayloadRulesUpdateNote": "Update payload rewrite rules used before provider dispatch.", "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).", "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.", "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.", @@ -3612,35 +3270,22 @@ "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." }, "agents": { - "title": "Local ACP Agents (Workers)", - "description": "Discover installed CLI binaries that OmniRoute can spawn locally as ACP workers to execute tasks, read local files, and act as the final execution proxy.", - "architectureTitle": "ACP execution flow", - "architectureDescription": "This screen is for binaries OmniRoute launches locally as workers. OmniRoute detects the binary, spawns it, and uses it as the final execution endpoint.", - "cliToolsRedirectTitle": "Looking for client configuration?", - "cliToolsRedirectDesc": "Use CLI Tools when you want your editor or terminal client to call OmniRoute over HTTP instead of being spawned locally.", - "cliToolsRedirectCta": "Go to CLI Tools", - "flowOmniRoute": "OmniRoute", - "flowSpawn": "Spawns worker", - "flowLocalBinary": "Local binary", - "flowExecute": "Executes task", + "title": "CLI Agents", + "description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.", "refresh": "Refresh", "installed": "Installed", "notFound": "Not Found", "builtIn": "Built-in", "custom": "Custom", "remove": "Remove", - "addCustomAgent": "Add Custom ACP Worker", - "addCustomAgentDesc": "Register any local binary OmniRoute should detect and manage as a worker. It will be rescanned automatically on refresh.", + "addCustomAgent": "Add Custom Agent", + "addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.", "agentName": "Agent Name", - "agentNamePlaceholder": "e.g. My Custom Worker", "binaryName": "Binary Name", - "binaryNamePlaceholder": "e.g. my-worker", "versionCommand": "Version Command", - "versionCommandPlaceholder": "e.g. my-worker --version", "spawnArgs": "Spawn Args", - "spawnArgsPlaceholder": "e.g. --quiet, --json", - "addAgent": "Add Worker", - "scanning": "Scanning local ACP workers...", + "addAgent": "Add Agent", + "scanning": "Scanning system for CLI agents...", "opencodeIntegration": "OpenCode Integration", "opencodeDetected": "opencode {version} detected", "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.", @@ -3648,10 +3293,10 @@ "downloaded": "Downloaded!", "setupGuideTitle": "Setup guide", "openCliTools": "Open CLI Tools", - "setupGuideDetectCliTitle": "Discover local binaries", - "setupGuideDetectCliDesc": "Click Refresh after installing or updating a CLI so OmniRoute can rescan binaries, versions, and worker availability.", - "setupGuideCustomAgentTitle": "Register custom worker", - "setupGuideCustomAgentDesc": "Use Add Custom ACP Worker when your binary is not in the built-in list. Provide the binary name, version command, and optional spawn args.", + "setupGuideDetectCliTitle": "Detect installed CLIs", + "setupGuideDetectCliDesc": "Click Refresh after installing or updating a CLI so OmniRoute can rescan binaries and versions.", + "setupGuideCustomAgentTitle": "Register custom binary", + "setupGuideCustomAgentDesc": "Use Add Custom Agent when your CLI is not in the built-in list. Provide binary name and version command.", "setupGuideCommandMissingTitle": "Fix 'command not found'", "setupGuideCommandMissingDesc": "Ensure the CLI command exists in PATH, open a new terminal session, and rerun Refresh." }, diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index e820d2e8d1..d59e7bdf48 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -511,7 +511,7 @@ "yearsAgoShort": "{count}年前", "runtimeCheckFailed": "运行时检查失败", "yourApiKeyPlaceholder": "你的 API 密钥", - "modelPlaceholder": "provider/model-id", + "modelPlaceholder": "提供商/模型 ID", "configurationSaved": "配置保存成功。", "failedToSave": "保存配置失败。", "noApiKeysCreateOne": "无 API 密钥 - 在“密钥”页面创建一个", @@ -649,7 +649,10 @@ "windsurf": "当您需要 Windsurf AI IDE 并通过 OmniRoute 路由模型时使用。", "antigravity": "当必须通过 MITM 拦截 Antigravity/Kiro 流量并将其路由到 OmniRoute 时使用。", "copilot": "当您想要 Copilot 聊天风格的 UX 同时强制执行 OmniRoute 键和路由规则时使用。", - "qwen": "当您需要使用阿里云 Qwen Code CLI 进行编码任务时使用。" + "qwen": "当您需要使用阿里云 Qwen Code CLI 进行编码任务时使用。", + "amp": "当您想要 Amp 简写工作流,但仍需要 OmniRoute 别名和路由规则支持时使用。", + "hermes": "当您需要轻量级终端原生 AI 助手来处理快速任务时使用。", + "custom": "用于自定义工具实现或通用 OpenAI 兼容配置。" }, "toolDescriptions": { "antigravity": "带 MITM 的 Google Antigravity IDE", @@ -665,7 +668,10 @@ "kiro": "Amazon Kiro - AI 驱动 IDE", "windsurf": "Windsurf AI Code Editor", "copilot": "GitHub Copilot AI Assistant", - "qwen": "Alibaba Qwen Code CLI" + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp 编程助手 CLI", + "hermes": "Hermes AI 终端助手", + "custom": "通用 OpenAI 兼容 CLI 或 SDK 配置生成器" }, "guides": { "cursor": { @@ -683,7 +689,7 @@ "desc": "开启 “OpenAI API key” 选项" }, "3": { - "title": "Base URL" + "title": "基础 URL" }, "4": { "title": "API密钥" @@ -735,7 +741,7 @@ "title": "选择模型" }, "5": { - "title": "Use Thinking Variant", + "title": "使用思考变体", "desc": "For thinking models, run with --variant high/low/max (example command below)." } }, @@ -768,24 +774,24 @@ "windsurf": { "steps": { "1": { - "title": "Open AI Settings", + "title": "打开 AI 设置", "desc": "Click the AI Settings icon in Windsurf or go to Settings" }, "2": { - "title": "Add Custom Provider", + "title": "添加自定义提供商", "desc": "Select \"Add custom provider\" (OpenAI-compatible)" }, "3": { - "title": "Base URL", + "title": "基础 URL", "desc": "http://127.0.0.1:20128/v1" }, "4": { - "title": "API Key", + "title": "API 密钥", "desc": "Select your OmniRoute API key" }, "5": { - "title": "Select Model", - "desc": "Choose a model from the dropdown" + "title": "选择模型", + "desc": "从下拉菜单中选择一个模型" } } } @@ -1206,7 +1212,6 @@ "builderProviderFirst": "请先选择提供商", "builderAccount": "账户", "builderPreview": "预览", - "builderAddStep": "添加步骤", "builderComboRef": "组合引用", "builderAddComboRef": "添加组合引用", "builderComboRefStep": "添加组合引用步骤", @@ -1731,7 +1736,6 @@ "errorOccurred": "发生错误。请再试一次。", "modelStatus": "模型状态", "showConfiguredOnly": "仅显示已配置", - "searchProviders": "搜索提供商...", "allModelsOperational": "所有模型运行正常", "modelsWithIssues": "{count} 有问题的模型", "allModelsNormal": "所有模型当前响应正常。", @@ -1835,7 +1839,7 @@ "connectionCountLabel": "{count, plural, one {# 个连接} other {# 个连接}}", "messagesPath": "messages", "responsesPath": "responses", - "chatCompletionsPath": "chat/completions", + "chatCompletionsPath": "聊天补全路径", "add": "添加", "edit": "编辑", "delete": "删除", @@ -1988,9 +1992,9 @@ "statusCreditsExhausted": "余额不足 / 配额已耗尽", "showEmails": "显示所有邮箱", "hideEmails": "隐藏所有邮箱", - "imagesGenerations": "Images Generations", + "imagesGenerations": "图像生成", "audioSpeech": "Audio Speech", - "audioTranscriptions": "Audio Transcriptions", + "audioTranscriptions": "音频转录", "embeddings": "Embeddings" }, "settings": { @@ -2238,7 +2242,7 @@ "stickyLimitDesc": "切换前每个账户连续处理的请求次数", "modelAliases": "模型别名", "modelAliasesTitle": "模型别名", - "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "modelAliasesDesc": "使用精确匹配或通配符模式映射模型名称。", "addCustomAlias": "添加自定义别名", "deprecatedModelId": "已弃用的模型 ID", "newModelId": "新模型 ID", @@ -2492,27 +2496,27 @@ "maintenance": "维护", "purgeExpiredLogs": "清理过期日志", "purgeLogsFailed": "清理日志失败", - "contextOpt": "Context Optimized", - "contextOptDesc": "Routes based on context window requirements and conversation length", - "priorityDesc": "Sequential fallback - tries provider 1 first, then provider 2, and so on", - "weightedDesc": "Distributes traffic by percentage weights across providers", - "modelRoutingTitle": "Model Routing Rules", - "modelRoutingDesc": "Automatically route models to specific combos using glob patterns", + "contextOpt": "上下文优化", + "contextOptDesc": "根据上下文窗口需求和对话长度路由请求。", + "priorityDesc": "顺序回退 - 先尝试提供商 1,然后提供商 2...", + "weightedDesc": "按百分比权重在提供商间分配流量。", + "modelRoutingTitle": "模型路由规则", + "modelRoutingDesc": "使用 glob 模式自动将模型路由到特定组合。", "addRule": "Add Rule", "routeToCombo": "Route to Combo", - "selectCombo": "Select combo...", - "priorityHint": "Higher = checked first. Use 10+ for specific patterns.", - "patternHint": "Use * for any chars, ? for single char. Case-insensitive.", - "noRoutingRules": "No routing rules configured. Requests use the global combo by default.", + "selectCombo": "选择组合...", + "priorityHint": "数值越高 = 优先检查。特定模式使用 10+。", + "patternHint": "使用 * 匹配任意字符,? 匹配单个字符。不区分大小写。", + "noRoutingRules": "未配置路由规则。请求将使用全局组合基准。", "routingRuleHint": "Add a rule like claude-opus* -> frontier-combo to automatically route requests.", - "deleteRoutingRule": "Delete this model routing rule?", + "deleteRoutingRule": "删除此模型路由规则?", "exactMatchMode": "Exact Match", - "wildcardPatternMode": "Wildcard Pattern", - "exactMatchModeDesc": "Use exact aliases for deprecated or renamed model IDs.", - "wildcardPatternModeDesc": "Use wildcard aliases with * and ? when a family of models should map to one target.", - "noExactAliasesConfigured": "No exact-match aliases configured.", + "wildcardPatternMode": "通配符模式", + "exactMatchModeDesc": "为已弃用或重命名的模型 ID 使用精确别名。", + "wildcardPatternModeDesc": "当一系列模型应使用相同别名时,使用带 * 和 ? 的通配符。", + "noExactAliasesConfigured": "未配置精确匹配别名。", "wildcardRulesTitle": "Wildcard Rules", - "noWildcardAliasesConfigured": "No wildcard aliases configured." + "noWildcardAliasesConfigured": "未配置通配符别名。" }, "translator": { "title": "翻译器", @@ -2932,7 +2936,7 @@ "forgotPassword": "忘记密码?", "defaultPasswordHint": "默认密码:CHANGEME(除非已设置 INITIAL_PASSWORD)", "Authorization": "Authorization", - "Content-Disposition": "Content-Disposition", + "Content-Disposition": "内容分发", "waitingForAuthorization": "正在等待授权...", "waitingForGoogleAuthorization": "正在等待 Google 授权...", "waitingForOpenAIAuthorization": "正在等待 OpenAI 授权...", @@ -3327,12 +3331,12 @@ "cacheHitRate": "缓存命中率", "cacheRate": "缓存率", "cacheRateDesc": "占总请求数", - "cachedTokens": "Cache Read Tokens", - "cacheCreationTokens": "Cache Write Tokens", + "cachedTokens": "缓存读取令牌", + "cacheCreationTokens": "缓存写入令牌", "cacheMetrics": "Prompt 缓存指标", "withCacheControl": "含缓存控制", - "cachedTokensRead": "Read from cache", - "cacheCreationWrite": "Written to cache", + "cachedTokensRead": "从缓存读取", + "cacheCreationWrite": "写入到缓存", "cacheReuseRatio": "缓存复用率", "cacheReuseRatioDesc": "Cache read tokens / 输入 Tokens 总量", "estCostSaved": "预估节省费用",