- {["chat", "embeddings", "images", "audio"].map((ep) => (
+ {["chat", "embeddings", "rerank", "images", "audio"].map((ep) => (
))}
@@ -4347,6 +4355,7 @@ function CustomModelsSection({
- {["chat", "embeddings", "images", "audio"].map((ep) => (
+ {["chat", "embeddings", "rerank", "images", "audio"].map((ep) => (
))}
@@ -5979,6 +5990,7 @@ function normalizeAndValidateHttpBaseUrl(rawValue, fallbackUrl) {
function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnectionModalProps) {
const t = useTranslations("providers");
+ const notify = useNotificationStore();
const [formData, setFormData] = useState({
name: "",
priority: 1,
@@ -6042,7 +6054,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
: t("leaveBlankKeepCurrentApiKey");
useEffect(() => {
- if (connection) {
+ if (isOpen && connection) {
const rawBaseUrl = connection.providerSpecificData?.baseUrl;
const existingBaseUrl = typeof rawBaseUrl === "string" ? rawBaseUrl : "";
const rawRegion = connection.providerSpecificData?.region;
@@ -6064,9 +6076,9 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
name: connection.name || "",
priority: connection.priority || 1,
maxConcurrent:
- connection.maxConcurrent === null || connection.maxConcurrent === undefined
- ? ""
- : String(connection.maxConcurrent),
+ connection.maxConcurrent !== null && connection.maxConcurrent !== undefined
+ ? String(connection.maxConcurrent)
+ : "",
apiKey: "",
healthCheckInterval: connection.healthCheckInterval ?? 60,
baseUrl: existingBaseUrl || defaultBaseUrl,
@@ -6103,7 +6115,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
setValidationResult(null);
setSaveError(null);
}
- }, [connection, defaultBaseUrl, isVertex]);
+ }, [isOpen, connection, defaultBaseUrl, isVertex]);
const handleTest = async () => {
if (!connection?.provider) return;
@@ -6160,6 +6172,17 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
}
};
+ const handleAddParsedExtraKeys = (raw: string) => {
+ const { added, duplicates } = parseExtraApiKeys(raw, extraApiKeys);
+ if (added.length > 0) {
+ setExtraApiKeys((prev) => [...prev, ...added]);
+ notify.success(t("bulkPasteAdded", { count: added.length }));
+ }
+ if (duplicates > 0) {
+ notify.warning(t("bulkPasteDuplicatesIgnored", { count: duplicates }));
+ }
+ };
+
const handleSubmit = async () => {
setSaving(true);
setSaveError(null);
@@ -6610,12 +6633,23 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
{/* T07: Extra API Keys for round-robin rotation */}
{!isOAuth && (
-
- {t("extraApiKeysLabel")}
-
- ({t("extraApiKeysHint")})
-
-
+
+
+ {t("extraApiKeysLabel")}
+
+ ({t("extraApiKeysHint")})
+
+
+ {extraApiKeys.length > 0 && (
+ setExtraApiKeys([])}
+ className="px-2.5 py-1.5 rounded-md bg-red-500/10 text-red-400 hover:bg-red-500/20 hover:text-red-300 text-xs font-medium transition-colors"
+ >
+ {t("deleteAllExtraApiKeys")}
+
+ )}
+
{extraApiKeys.length > 0 && (
{extraApiKeys.map((key, idx) => (
@@ -6651,6 +6685,12 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
setNewExtraKey("");
}
}}
+ onPaste={(e) => {
+ const text = e.clipboardData.getData("text");
+ if (!/\r?\n/.test(text)) return;
+ e.preventDefault();
+ handleAddParsedExtraKeys(text);
+ }}
/>
{
@@ -6665,6 +6705,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec
{t("add")}
+
{t("bulkPasteHint")}
{extraApiKeys.length > 0 && (
{t("totalKeysRotating", { count: extraApiKeys.length + 1 })}
diff --git a/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx b/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx
index 44f4c61f6c..7146fa8a9b 100644
--- a/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx
+++ b/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx
@@ -3,7 +3,10 @@
import { useState, useEffect } from "react";
import { Card, Button, Input, Toggle } from "@/shared/components";
import { cn } from "@/shared/utils/cn";
-import { ROUTING_STRATEGIES } from "@/shared/constants/routingStrategies";
+import {
+ ROUTING_STRATEGIES,
+ SETTINGS_FALLBACK_STRATEGY_VALUES,
+} from "@/shared/constants/routingStrategies";
import { useTranslations } from "next-intl";
const STRATEGY_LABEL_FALLBACKS: Record = {
@@ -15,6 +18,7 @@ const LEGACY_COMBO_RESILIENCE_KEYS = new Set([
"healthCheckEnabled",
"healthCheckTimeoutMs",
]);
+const ACCOUNT_FALLBACK_STRATEGIES = new Set(SETTINGS_FALLBACK_STRATEGY_VALUES);
function translateOrFallback(
t: ReturnType,
@@ -44,6 +48,17 @@ function sanitizeProviderOverrides(overrides?: Record | null) {
);
}
+function toGlobalRoutingPatch(strategy: string | undefined, stickyRoundRobinLimit?: number) {
+ const patch: Record = {};
+ if (strategy && ACCOUNT_FALLBACK_STRATEGIES.has(strategy)) {
+ patch.fallbackStrategy = strategy;
+ }
+ if (strategy === "round-robin" && stickyRoundRobinLimit !== undefined) {
+ patch.stickyRoundRobinLimit = stickyRoundRobinLimit;
+ }
+ return patch;
+}
+
export default function ComboDefaultsTab() {
const [comboDefaults, setComboDefaults] = useState({
strategy: "priority",
@@ -90,7 +105,7 @@ export default function ComboDefaultsTab() {
...prev,
...sanitizeComboRuntimeConfig(comboData.comboDefaults),
strategy:
- settingsData.fallbackStrategy ?? comboData.comboDefaults?.strategy ?? prev.strategy,
+ comboData.comboDefaults?.strategy ?? settingsData.fallbackStrategy ?? prev.strategy,
stickyRoundRobinLimit:
settingsData.stickyRoundRobinLimit ??
comboData.comboDefaults?.stickyRoundRobinLimit ??
@@ -109,8 +124,7 @@ export default function ComboDefaultsTab() {
};
const syncGlobalRoutingSettings = async (patch: Record) => {
- const keys = Object.keys(patch);
- if (keys.length === 0) return true;
+ if (Object.keys(patch).length === 0) return;
const res = await fetch("/api/settings", {
method: "PATCH",
@@ -121,21 +135,13 @@ export default function ComboDefaultsTab() {
if (!res.ok) {
throw new Error("Failed to sync global routing settings");
}
-
- return true;
};
const saveComboDefaults = async () => {
setSaving(true);
try {
const { stickyRoundRobinLimit, ...comboDefaultsPayload } = comboDefaults;
- const settingsPatch: Record = {};
- if (comboDefaults.strategy) {
- settingsPatch.fallbackStrategy = comboDefaults.strategy;
- }
- if (comboDefaults.strategy === "round-robin" && stickyRoundRobinLimit !== undefined) {
- settingsPatch.stickyRoundRobinLimit = stickyRoundRobinLimit;
- }
+ const settingsPatch = toGlobalRoutingPatch(comboDefaults.strategy, stickyRoundRobinLimit);
const comboDefaultsRes = await fetch("/api/settings/combo-defaults", {
method: "PATCH",
@@ -243,7 +249,7 @@ export default function ComboDefaultsTab() {
onClick={async () => {
setComboDefaults((prev) => ({ ...prev, strategy: s.value }));
try {
- await syncGlobalRoutingSettings({ fallbackStrategy: s.value });
+ await syncGlobalRoutingSettings(toGlobalRoutingPatch(s.value));
} catch (error) {
console.error("Failed to sync fallback strategy:", error);
showStatus("error", t("errorOccurred"));
diff --git a/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx b/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx
index d6f4df413a..432e855740 100644
--- a/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx
+++ b/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx
@@ -4,7 +4,8 @@ import { useState, useEffect } from "react";
import { Card, Button } from "@/shared/components";
import { useTranslations } from "next-intl";
-type CompressionMode = "off" | "lite" | "standard" | "aggressive" | "ultra";
+type CompressionMode = "off" | "lite" | "standard" | "aggressive" | "ultra" | "rtk" | "stacked";
+type CavemanIntensity = "lite" | "full" | "ultra";
interface CavemanConfig {
enabled: boolean;
@@ -12,6 +13,13 @@ interface CavemanConfig {
skipRules: string[];
minMessageLength: number;
preservePatterns: string[];
+ intensity: CavemanIntensity;
+}
+
+interface CavemanOutputModeConfig {
+ enabled: boolean;
+ intensity: CavemanIntensity;
+ autoClarity: boolean;
}
interface AggressiveConfig {
@@ -45,15 +53,27 @@ interface UltraConfig {
interface CompressionConfig {
enabled: boolean;
defaultMode: CompressionMode;
+ autoTriggerMode?: CompressionMode;
autoTriggerTokens: number;
cacheMinutes: number;
preserveSystemPrompt: boolean;
+ mcpDescriptionCompressionEnabled?: boolean;
comboOverrides: Record;
cavemanConfig?: CavemanConfig;
+ cavemanOutputMode?: CavemanOutputModeConfig;
aggressive?: AggressiveConfig;
ultra?: UltraConfig;
}
+interface RuleMetadata {
+ name: string;
+ category: string;
+ context: string;
+ minIntensity: CavemanIntensity;
+ intensities?: CavemanIntensity[];
+ description: string;
+}
+
const MODES: { value: CompressionMode; labelKey: string; descKey: string; icon: string }[] = [
{
value: "off",
@@ -85,6 +105,18 @@ const MODES: { value: CompressionMode; labelKey: string; descKey: string; icon:
descKey: "compressionModeUltraDesc",
icon: "filter_alt",
},
+ {
+ value: "rtk",
+ labelKey: "compressionModeRtk",
+ descKey: "compressionModeRtkDesc",
+ icon: "filter_list",
+ },
+ {
+ value: "stacked",
+ labelKey: "compressionModeStacked",
+ descKey: "compressionModeStackedDesc",
+ icon: "hub",
+ },
];
const ROLE_OPTIONS: { value: "user" | "assistant" | "system"; labelKey: string }[] = [
@@ -93,38 +125,6 @@ const ROLE_OPTIONS: { value: "user" | "assistant" | "system"; labelKey: string }
{ value: "system", labelKey: "compressionRoleSystem" },
];
-const ALL_CAVEMAN_RULES = [
- "polite_framing",
- "hedging",
- "verbose_instructions",
- "filler_adverbs",
- "filler_phrases",
- "redundant_openers",
- "verbose_requests",
- "self_reference",
- "excessive_gratitude",
- "qualifier_removal",
- "compound_collapse",
- "explanatory_prefix",
- "question_to_directive",
- "context_setup",
- "intent_clarification",
- "background_removal",
- "meta_commentary",
- "purpose_statement",
- "list_conjunction",
- "purpose_phrases",
- "redundant_quantifiers",
- "verbose_connectors",
- "transition_removal",
- "emphasis_removal",
- "passive_voice",
- "repeated_context",
- "repeated_question",
- "reestablished_context",
- "summary_replacement",
-];
-
export default function CompressionSettingsTab() {
const t = useTranslations("settings");
const [config, setConfig] = useState({
@@ -140,6 +140,12 @@ export default function CompressionSettingsTab() {
skipRules: [],
minMessageLength: 50,
preservePatterns: [],
+ intensity: "full",
+ },
+ cavemanOutputMode: {
+ enabled: false,
+ intensity: "full",
+ autoClarity: true,
},
aggressive: {
thresholds: { fullSummary: 5, moderate: 3, light: 2, verbatim: 2 },
@@ -165,6 +171,7 @@ export default function CompressionSettingsTab() {
const [saving, setSaving] = useState(false);
const [loading, setLoading] = useState(true);
const [status, setStatus] = useState<"" | "saved" | "error">("");
+ const [ruleMetadata, setRuleMetadata] = useState([]);
useEffect(() => {
fetch("/api/settings/compression")
@@ -174,6 +181,12 @@ export default function CompressionSettingsTab() {
})
.catch(() => {})
.finally(() => setLoading(false));
+ fetch("/api/compression/rules")
+ .then((r) => (r.ok ? r.json() : null))
+ .then((data) => {
+ if (Array.isArray(data?.rules)) setRuleMetadata(data.rules);
+ })
+ .catch(() => {});
}, []);
const save = async (updates: Partial) => {
@@ -272,7 +285,7 @@ export default function CompressionSettingsTab() {
{config.enabled && (
{t("compressionMode")}
-
+
{MODES.map((m) => (
+
+ Auto trigger mode
+ save({ autoTriggerMode: e.target.value as CompressionMode })}
+ className="w-36 px-2 py-1 text-sm rounded border border-border bg-surface text-text-main"
+ >
+ {MODES.filter((mode) => mode.value !== "off").map((mode) => (
+
+ {mode.value}
+
+ ))}
+
+
+
{t("compressionCacheTTL")}
@@ -356,6 +384,27 @@ export default function CompressionSettingsTab() {
/>
+
+
+ MCP description compression
+
+ save({
+ mcpDescriptionCompressionEnabled:
+ config.mcpDescriptionCompressionEnabled === false,
+ })
+ }
+ className={`relative w-10 h-5 rounded-full transition-colors ${
+ config.mcpDescriptionCompressionEnabled !== false ? "bg-green-500" : "bg-border"
+ }`}
+ >
+
+
+
)}
@@ -434,21 +483,42 @@ export default function CompressionSettingsTab() {
/>
+
+ Caveman intensity
+
+ save({
+ cavemanConfig: {
+ ...config.cavemanConfig!,
+ intensity: e.target.value as CavemanIntensity,
+ },
+ })
+ }
+ className="w-28 px-2 py-1 text-sm rounded border border-border bg-surface text-text-main"
+ >
+ lite
+ full
+ ultra
+
+
+
{t("compressionSkipRules")}
{t("compressionSkipRulesDesc")}
- {ALL_CAVEMAN_RULES.map((rule) => (
+ {ruleMetadata.map((rule) => (
toggleCavemanRule(rule)}
+ key={rule.name}
+ onClick={() => toggleCavemanRule(rule.name)}
+ title={`${rule.category} · ${rule.context} · ${(rule.intensities ?? [rule.minIntensity]).join("/")}`}
className={`px-2 py-1 rounded text-xs border transition-all ${
- config.cavemanConfig!.skipRules.includes(rule)
+ config.cavemanConfig!.skipRules.includes(rule.name)
? "border-red-500/50 bg-red-500/10 text-red-400 line-through"
: "border-border/50 text-text-muted hover:border-border"
}`}
>
- {rule.replace(/_/g, " ")}
+ {rule.name.replace(/_/g, " ")}
))}
@@ -482,6 +552,81 @@ export default function CompressionSettingsTab() {
)}
+ {config.enabled && config.cavemanOutputMode && (
+
+
+
+
Caveman output mode
+
+ Injects terse response instructions without rewriting provider output.
+
+
+
+ save({
+ cavemanOutputMode: {
+ ...config.cavemanOutputMode!,
+ enabled: !config.cavemanOutputMode!.enabled,
+ },
+ })
+ }
+ className={`relative w-10 h-5 rounded-full transition-colors ${
+ config.cavemanOutputMode.enabled ? "bg-green-500" : "bg-border"
+ }`}
+ >
+
+
+
+
+
+ Output intensity
+
+ save({
+ cavemanOutputMode: {
+ ...config.cavemanOutputMode!,
+ intensity: e.target.value as CavemanIntensity,
+ },
+ })
+ }
+ className="w-28 px-2 py-1 text-sm rounded border border-border bg-surface text-text-main"
+ >
+ lite
+ full
+ ultra
+
+
+
+
+ Auto clarity bypass
+
+ save({
+ cavemanOutputMode: {
+ ...config.cavemanOutputMode!,
+ autoClarity: !config.cavemanOutputMode!.autoClarity,
+ },
+ })
+ }
+ className={`relative w-10 h-5 rounded-full transition-colors ${
+ config.cavemanOutputMode.autoClarity ? "bg-green-500" : "bg-border"
+ }`}
+ >
+
+
+
+
+ )}
+
{config.enabled && config.defaultMode === "aggressive" && config.aggressive && (
diff --git a/src/app/(dashboard)/dashboard/settings/page.tsx b/src/app/(dashboard)/dashboard/settings/page.tsx
index 4077e8a04e..a2c6af481c 100644
--- a/src/app/(dashboard)/dashboard/settings/page.tsx
+++ b/src/app/(dashboard)/dashboard/settings/page.tsx
@@ -1,6 +1,7 @@
"use client";
import { useState } from "react";
+import Link from "next/link";
import { useSearchParams } from "next/navigation";
import { cn } from "@/shared/utils/cn";
import { APP_CONFIG } from "@/shared/constants/appConfig";
@@ -9,7 +10,6 @@ import SystemStorageTab from "./components/SystemStorageTab";
import SecurityTab from "./components/SecurityTab";
import RoutingTab from "./components/RoutingTab";
import ComboDefaultsTab from "./components/ComboDefaultsTab";
-import ProxyTab from "./components/ProxyTab";
import AppearanceTab from "./components/AppearanceTab";
import ThinkingBudgetTab from "./components/ThinkingBudgetTab";
import SystemPromptTab from "./components/SystemPromptTab";
@@ -21,9 +21,7 @@ import ModelsDevSyncTab from "./components/ModelsDevSyncTab";
import ResilienceTab from "./components/ResilienceTab";
import CliproxyapiSettingsTab from "./components/CliproxyapiSettingsTab";
import PayloadRulesTab from "./components/PayloadRulesTab";
-import CompressionSettingsTab from "./components/CompressionSettingsTab";
import VisionBridgeSettingsTab from "./components/VisionBridgeSettingsTab";
-import MitmProxyTab from "./components/MitmProxyTab";
import ModelRoutingSection from "@/shared/components/ModelRoutingSection";
const tabs = [
@@ -33,7 +31,6 @@ const tabs = [
{ id: "security", labelKey: "security", icon: "shield" },
{ id: "routing", labelKey: "routing", icon: "route" },
{ id: "resilience", labelKey: "resilience", icon: "electrical_services" },
- { id: "mitm", labelKey: "mitmProxy", icon: "lan" },
{ id: "advanced", labelKey: "advanced", icon: "tune" },
];
@@ -97,7 +94,25 @@ export default function SettingsPage() {
{activeTab === "ai" && (
-
+
+
+
+ compress
+
+
+
+ {t("compressionTitle")}
+
+ {t("compressionDesc")}
+
+
+
+ chevron_right
+
+
@@ -120,12 +135,9 @@ export default function SettingsPage() {
{activeTab === "resilience" &&
}
- {activeTab === "mitm" &&
}
-
{activeTab === "advanced" && (
)}
diff --git a/src/app/(dashboard)/dashboard/system/proxy/page.tsx b/src/app/(dashboard)/dashboard/system/proxy/page.tsx
new file mode 100644
index 0000000000..9ddf0c390c
--- /dev/null
+++ b/src/app/(dashboard)/dashboard/system/proxy/page.tsx
@@ -0,0 +1,79 @@
+"use client";
+
+import { useState } from "react";
+import { useTranslations } from "next-intl";
+import { cn } from "@/shared/utils/cn";
+import ProxyTab from "@/app/(dashboard)/dashboard/settings/components/ProxyTab";
+import MitmProxyTab from "@/app/(dashboard)/dashboard/settings/components/MitmProxyTab";
+import OneproxyTab from "@/app/(dashboard)/dashboard/settings/components/OneproxyTab";
+
+const subTabs = [
+ { id: "http", labelKey: "httpProxy", icon: "dns" },
+ { id: "mitm", labelKey: "mitmProxy", icon: "lan" },
+ { id: "oneproxy", labelKey: "1proxy", icon: "public" },
+];
+
+export default function ProxyPage() {
+ const t = useTranslations("settings");
+ const [activeSubTab, setActiveSubTab] = useState("http");
+
+ return (
+
+
+
+
+ {subTabs.map((subTab) => (
+ setActiveSubTab(subTab.id)}
+ className={cn(
+ "flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-all text-sm",
+ activeSubTab === subTab.id
+ ? "bg-white dark:bg-white/10 text-text-main shadow-sm"
+ : "text-text-muted hover:text-text-main"
+ )}
+ >
+
+ {subTab.icon}
+
+
+ {subTab.id === "http" ? t("proxy") : t(subTab.labelKey)}
+
+
+ ))}
+
+
+
+
t.id === activeSubTab)?.labelKey || "proxy")}
+ >
+ {activeSubTab === "http" && (
+
+ )}
+
+ {activeSubTab === "mitm" && (
+
+
+
+ )}
+
+ {activeSubTab === "oneproxy" && (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/app/api/compression/language-packs/route.ts b/src/app/api/compression/language-packs/route.ts
new file mode 100644
index 0000000000..8d1fb8c8b4
--- /dev/null
+++ b/src/app/api/compression/language-packs/route.ts
@@ -0,0 +1,16 @@
+import { NextResponse } from "next/server";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import {
+ listCavemanRulePacks,
+ listSupportedCompressionLanguages,
+} from "@omniroute/open-sse/services/compression";
+
+export async function GET(req: Request) {
+ const authError = await requireManagementAuth(req);
+ if (authError) return authError;
+
+ return NextResponse.json({
+ languages: listSupportedCompressionLanguages(),
+ packs: listCavemanRulePacks(),
+ });
+}
diff --git a/src/app/api/compression/preview/route.ts b/src/app/api/compression/preview/route.ts
index 5b966ec3f2..f368c777bf 100644
--- a/src/app/api/compression/preview/route.ts
+++ b/src/app/api/compression/preview/route.ts
@@ -1,10 +1,17 @@
import { NextResponse } from "next/server";
import { z } from "zod";
-import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { compressionPreviewConfigSchema } from "@/shared/validation/compressionConfigSchemas";
import { applyCompression } from "@omniroute/open-sse/services/compression/strategySelector";
-import type { CompressionMode } from "@omniroute/open-sse/services/compression/types";
+import type {
+ CompressionConfig,
+ CompressionMode,
+} from "@omniroute/open-sse/services/compression/types";
+import { buildCompressionPreviewDiff } from "@omniroute/open-sse/services/compression/diffHelper";
-const PreviewRequestSchema = z.object({
+export const PreviewCompressionConfigSchema = compressionPreviewConfigSchema;
+
+export const PreviewRequestSchema = z.object({
messages: z
.array(
z.object({
@@ -13,7 +20,8 @@ const PreviewRequestSchema = z.object({
})
)
.min(1),
- mode: z.enum(["off", "lite", "standard", "aggressive", "ultra"]),
+ mode: z.enum(["off", "lite", "standard", "aggressive", "ultra", "rtk", "stacked"]),
+ config: PreviewCompressionConfigSchema.optional(),
});
function countTokens(text: string): number {
@@ -30,8 +38,8 @@ function messagesToText(messages: Array<{ role: string; content: unknown }>): st
}
export async function POST(req: Request) {
- const policy = await enforceApiKeyPolicy(req, "settings");
- if (policy.rejection) return policy.rejection;
+ const authError = await requireManagementAuth(req);
+ if (authError) return authError;
let body: unknown;
try {
@@ -48,14 +56,16 @@ export async function POST(req: Request) {
);
}
- const { messages, mode } = parsed.data;
+ const { messages, mode, config } = parsed.data;
const originalText = messagesToText(messages);
const originalTokens = countTokens(originalText);
try {
const start = Date.now();
const requestBody = { messages };
- const result = await applyCompression(requestBody as Record
, mode);
+ const result = await applyCompression(requestBody as Record, mode, {
+ config: config as CompressionConfig | undefined,
+ });
const durationMs = Date.now() - start;
const compressedMessages = (result.body.messages ?? messages) as Array<{
@@ -67,6 +77,7 @@ export async function POST(req: Request) {
const tokensSaved = Math.max(0, originalTokens - compressedTokens);
const savingsPct = originalTokens > 0 ? Math.round((tokensSaved / originalTokens) * 100) : 0;
const techniquesUsed: string[] = result.stats?.techniquesUsed ?? [];
+ const diff = buildCompressionPreviewDiff(originalText, compressedText, result.stats);
return NextResponse.json({
original: originalText,
@@ -77,6 +88,23 @@ export async function POST(req: Request) {
savingsPct,
techniquesUsed,
durationMs,
+ mode,
+ intensity: null,
+ outputMode: null,
+ skippedReasons: [],
+ diff: diff.segments,
+ preservedBlocks: diff.preservedBlocks,
+ ruleRemovals: diff.ruleRemovals,
+ rulesApplied: diff.ruleRemovals,
+ validation: {
+ valid: diff.validationErrors.length === 0,
+ errors: diff.validationErrors,
+ warnings: diff.validationWarnings,
+ fallbackApplied: diff.fallbackApplied,
+ },
+ validationWarnings: diff.validationWarnings,
+ validationErrors: diff.validationErrors,
+ fallbackApplied: diff.fallbackApplied,
});
} catch (err: unknown) {
const msg = err instanceof Error ? err.message : String(err);
diff --git a/src/app/api/compression/rules/route.ts b/src/app/api/compression/rules/route.ts
new file mode 100644
index 0000000000..b1946c6adb
--- /dev/null
+++ b/src/app/api/compression/rules/route.ts
@@ -0,0 +1,12 @@
+import { NextResponse } from "next/server";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { getCavemanRuleMetadata } from "@omniroute/open-sse/services/compression/cavemanRules";
+
+export async function GET(req: Request) {
+ const authError = await requireManagementAuth(req);
+ if (authError) return authError;
+
+ return NextResponse.json({
+ rules: getCavemanRuleMetadata(),
+ });
+}
diff --git a/src/app/api/context/analytics/route.ts b/src/app/api/context/analytics/route.ts
new file mode 100644
index 0000000000..5415ae4948
--- /dev/null
+++ b/src/app/api/context/analytics/route.ts
@@ -0,0 +1 @@
+export { GET } from "@/app/api/analytics/compression/route";
diff --git a/src/app/api/context/caveman/config/route.ts b/src/app/api/context/caveman/config/route.ts
new file mode 100644
index 0000000000..44b602160f
--- /dev/null
+++ b/src/app/api/context/caveman/config/route.ts
@@ -0,0 +1 @@
+export { GET, PUT } from "@/app/api/settings/compression/route";
diff --git a/src/app/api/context/combos/[id]/assignments/route.ts b/src/app/api/context/combos/[id]/assignments/route.ts
new file mode 100644
index 0000000000..d75fe943d2
--- /dev/null
+++ b/src/app/api/context/combos/[id]/assignments/route.ts
@@ -0,0 +1,47 @@
+import { NextResponse } from "next/server";
+import { z } from "zod";
+import {
+ getAssignmentsForCompressionCombo,
+ getCompressionCombo,
+ updateAssignments,
+} from "@/lib/db/compressionCombos";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+
+export const assignmentsUpdateSchema = z
+ .object({
+ routingComboIds: z.array(z.string().trim().min(1)),
+ })
+ .strict();
+
+export async function GET(request: Request, { params }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const { id } = await params;
+ if (!getCompressionCombo(id)) {
+ return NextResponse.json({ error: "Compression combo not found" }, { status: 404 });
+ }
+ return NextResponse.json({ assignments: getAssignmentsForCompressionCombo(id) });
+}
+
+export async function PUT(request: Request, { params }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const { id } = await params;
+
+ let rawBody: unknown;
+ try {
+ rawBody = await request.json();
+ } catch {
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
+ }
+
+ const validation = validateBody(assignmentsUpdateSchema, rawBody);
+ if (isValidationFailure(validation)) {
+ return NextResponse.json({ error: validation.error }, { status: 400 });
+ }
+
+ const updated = updateAssignments(id, validation.data.routingComboIds);
+ if (!updated) return NextResponse.json({ error: "Compression combo not found" }, { status: 404 });
+ return NextResponse.json({ assignments: getAssignmentsForCompressionCombo(id) });
+}
diff --git a/src/app/api/context/combos/[id]/route.ts b/src/app/api/context/combos/[id]/route.ts
new file mode 100644
index 0000000000..83285c8229
--- /dev/null
+++ b/src/app/api/context/combos/[id]/route.ts
@@ -0,0 +1,79 @@
+import { NextResponse } from "next/server";
+import { z } from "zod";
+import {
+ deleteCompressionCombo,
+ getCompressionCombo,
+ setDefaultCompressionCombo,
+ updateCompressionCombo,
+} from "@/lib/db/compressionCombos";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import {
+ cavemanIntensitySchema,
+ stackedPipelineStepSchema,
+} from "@/shared/validation/compressionConfigSchemas";
+
+export const pipelineStepSchema = stackedPipelineStepSchema;
+
+export const compressionComboUpdateSchema = z
+ .object({
+ name: z.string().trim().min(1).max(120).optional(),
+ description: z.string().max(1000).optional(),
+ pipeline: z.array(pipelineStepSchema).min(1).optional(),
+ languagePacks: z.array(z.string().trim().min(1)).optional(),
+ outputMode: z.boolean().optional(),
+ outputModeIntensity: cavemanIntensitySchema.optional(),
+ isDefault: z.boolean().optional(),
+ })
+ .strict();
+
+export async function GET(request: Request, { params }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const { id } = await params;
+ const combo = getCompressionCombo(id);
+ if (!combo) return NextResponse.json({ error: "Compression combo not found" }, { status: 404 });
+ return NextResponse.json(combo);
+}
+
+export async function PUT(request: Request, { params }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const { id } = await params;
+
+ let rawBody: unknown;
+ try {
+ rawBody = await request.json();
+ } catch {
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
+ }
+
+ const validation = validateBody(compressionComboUpdateSchema, rawBody);
+ if (isValidationFailure(validation)) {
+ return NextResponse.json({ error: validation.error }, { status: 400 });
+ }
+
+ if (validation.data.isDefault === true) {
+ const changed = setDefaultCompressionCombo(id);
+ if (!changed)
+ return NextResponse.json({ error: "Compression combo not found" }, { status: 404 });
+ }
+
+ const combo = updateCompressionCombo(id, validation.data);
+ if (!combo) return NextResponse.json({ error: "Compression combo not found" }, { status: 404 });
+ return NextResponse.json(combo);
+}
+
+export async function DELETE(request: Request, { params }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const { id } = await params;
+ const deleted = deleteCompressionCombo(id);
+ if (!deleted) {
+ return NextResponse.json(
+ { error: "Compression combo not found or cannot delete default combo" },
+ { status: 404 }
+ );
+ }
+ return NextResponse.json({ ok: true });
+}
diff --git a/src/app/api/context/combos/route.ts b/src/app/api/context/combos/route.ts
new file mode 100644
index 0000000000..2590af0940
--- /dev/null
+++ b/src/app/api/context/combos/route.ts
@@ -0,0 +1,50 @@
+import { NextResponse } from "next/server";
+import { z } from "zod";
+import { createCompressionCombo, listCompressionCombos } from "@/lib/db/compressionCombos";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import {
+ cavemanIntensitySchema,
+ stackedPipelineStepSchema,
+} from "@/shared/validation/compressionConfigSchemas";
+
+export const pipelineStepSchema = stackedPipelineStepSchema;
+
+export const compressionComboCreateSchema = z
+ .object({
+ id: z.string().trim().min(1).optional(),
+ name: z.string().trim().min(1).max(120),
+ description: z.string().max(1000).optional(),
+ pipeline: z.array(pipelineStepSchema).min(1).optional(),
+ languagePacks: z.array(z.string().trim().min(1)).optional(),
+ outputMode: z.boolean().optional(),
+ outputModeIntensity: cavemanIntensitySchema.optional(),
+ isDefault: z.boolean().optional(),
+ })
+ .strict();
+
+export async function GET(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ return NextResponse.json({ combos: listCompressionCombos() });
+}
+
+export async function POST(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+
+ let rawBody: unknown;
+ try {
+ rawBody = await request.json();
+ } catch {
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
+ }
+
+ const validation = validateBody(compressionComboCreateSchema, rawBody);
+ if (isValidationFailure(validation)) {
+ return NextResponse.json({ error: validation.error }, { status: 400 });
+ }
+
+ const combo = createCompressionCombo(validation.data);
+ return NextResponse.json(combo, { status: 201 });
+}
diff --git a/src/app/api/context/rtk/config/route.ts b/src/app/api/context/rtk/config/route.ts
new file mode 100644
index 0000000000..2d97058bb7
--- /dev/null
+++ b/src/app/api/context/rtk/config/route.ts
@@ -0,0 +1,34 @@
+import { NextResponse } from "next/server";
+import { getCompressionSettings, updateCompressionSettings } from "@/lib/db/compression";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { rtkConfigSchema } from "@/shared/validation/compressionConfigSchemas";
+
+export { rtkConfigSchema };
+
+export async function GET(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ const settings = await getCompressionSettings();
+ return NextResponse.json(settings.rtkConfig);
+}
+
+export async function PUT(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ let rawBody: unknown;
+ try {
+ rawBody = await request.json();
+ } catch {
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
+ }
+ const validation = validateBody(rtkConfigSchema, rawBody);
+ if (isValidationFailure(validation)) {
+ return NextResponse.json({ error: validation.error }, { status: 400 });
+ }
+ const current = await getCompressionSettings();
+ const settings = await updateCompressionSettings({
+ rtkConfig: { ...current.rtkConfig, ...validation.data },
+ });
+ return NextResponse.json(settings.rtkConfig);
+}
diff --git a/src/app/api/context/rtk/filters/route.ts b/src/app/api/context/rtk/filters/route.ts
new file mode 100644
index 0000000000..0f97bcc8eb
--- /dev/null
+++ b/src/app/api/context/rtk/filters/route.ts
@@ -0,0 +1,15 @@
+import { NextResponse } from "next/server";
+import {
+ getRtkFilterCatalog,
+ getRtkFilterLoadDiagnostics,
+} from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+
+export async function GET(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+ return NextResponse.json({
+ filters: getRtkFilterCatalog(),
+ diagnostics: getRtkFilterLoadDiagnostics(),
+ });
+}
diff --git a/src/app/api/context/rtk/raw-output/[id]/route.ts b/src/app/api/context/rtk/raw-output/[id]/route.ts
new file mode 100644
index 0000000000..85084d9226
--- /dev/null
+++ b/src/app/api/context/rtk/raw-output/[id]/route.ts
@@ -0,0 +1,26 @@
+import { NextResponse } from "next/server";
+import { readRtkRawOutput } from "@omniroute/open-sse/services/compression/engines/rtk";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+
+export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+
+ const { id } = await params;
+ if (!/^[a-f0-9]{24}$/.test(id)) {
+ return NextResponse.json({ error: "Invalid raw output id" }, { status: 400 });
+ }
+
+ const content = readRtkRawOutput(id);
+ if (content === null) {
+ return NextResponse.json({ error: "Raw output not found" }, { status: 404 });
+ }
+
+ return new NextResponse(content, {
+ status: 200,
+ headers: {
+ "content-type": "text/plain; charset=utf-8",
+ "cache-control": "no-store",
+ },
+ });
+}
diff --git a/src/app/api/context/rtk/test/route.ts b/src/app/api/context/rtk/test/route.ts
new file mode 100644
index 0000000000..4307198e2c
--- /dev/null
+++ b/src/app/api/context/rtk/test/route.ts
@@ -0,0 +1,43 @@
+import { NextResponse } from "next/server";
+import { z } from "zod";
+import {
+ detectCommandType,
+ processRtkText,
+} from "@omniroute/open-sse/services/compression/engines/rtk";
+import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { rtkConfigSchema } from "@/shared/validation/compressionConfigSchemas";
+
+export const rtkTestSchema = z
+ .object({
+ text: z.string().min(1),
+ command: z.string().optional(),
+ config: rtkConfigSchema.optional(),
+ })
+ .strict();
+
+export async function POST(request: Request) {
+ const authError = await requireManagementAuth(request);
+ if (authError) return authError;
+
+ let rawBody: unknown;
+ try {
+ rawBody = await request.json();
+ } catch {
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
+ }
+
+ const validation = validateBody(rtkTestSchema, rawBody);
+ if (isValidationFailure(validation)) {
+ return NextResponse.json({ error: validation.error }, { status: 400 });
+ }
+
+ const detection = detectCommandType(validation.data.text, validation.data.command);
+ return NextResponse.json({
+ detection,
+ ...processRtkText(validation.data.text, {
+ command: validation.data.command,
+ config: validation.data.config,
+ }),
+ });
+}
diff --git a/src/app/api/models/test/route.ts b/src/app/api/models/test/route.ts
index c113bc979e..65654b4861 100644
--- a/src/app/api/models/test/route.ts
+++ b/src/app/api/models/test/route.ts
@@ -2,8 +2,10 @@ import { randomUUID } from "node:crypto";
import { NextResponse } from "next/server";
import { POST as postChatCompletion } from "@/app/api/v1/chat/completions/route";
import { handleValidatedEmbeddingRequestBody } from "@/app/api/v1/embeddings/route";
+import { POST as postRerank } from "@/app/api/v1/rerank/route";
import { buildComboTestRequestBody, extractComboTestResponseText } from "@/lib/combos/testHealth";
import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
+import { getCustomModels } from "@/lib/localDb";
import { z } from "zod";
const testModelSchema = z.object({
@@ -73,6 +75,45 @@ function buildInternalChatRequest(testBody: Record, signal: Abo
});
}
+function buildInternalRerankRequest(testBody: Record, signal: AbortSignal) {
+ return new Request(`${INTERNAL_ORIGIN}/v1/rerank`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "X-Internal-Test": "combo-health-check",
+ "X-OmniRoute-No-Cache": "true",
+ "X-Request-Id": `model-test-${randomUUID()}`,
+ },
+ body: JSON.stringify(testBody),
+ signal,
+ });
+}
+
+function stripFirstSegment(modelId: string): string | null {
+ const slashIdx = modelId.indexOf("/");
+ return slashIdx > 0 ? modelId.slice(slashIdx + 1) : null;
+}
+
+async function findCustomModelMetadata(providerId: string, modelId: string) {
+ try {
+ const customModels = await getCustomModels(providerId);
+ if (!Array.isArray(customModels)) return null;
+
+ const candidates = new Set([modelId]);
+ const stripped = stripFirstSegment(modelId);
+ if (stripped) candidates.add(stripped);
+ if (modelId.startsWith(`${providerId}/`)) candidates.add(modelId.slice(providerId.length + 1));
+
+ return (
+ customModels.find(
+ (model: any) => typeof model?.id === "string" && candidates.has(model.id)
+ ) || null
+ );
+ } catch {
+ return null;
+ }
+}
+
export async function POST(request: Request) {
const authError = await requireManagementAuth(request);
if (authError) return authError;
@@ -108,19 +149,47 @@ export async function POST(request: Request) {
}
const startTime = Date.now();
+ const customModel = await findCustomModelMetadata(providerId, fullModelStr);
+ const supportedEndpoints = Array.isArray(customModel?.supportedEndpoints)
+ ? customModel.supportedEndpoints
+ : [];
+ const apiFormat = typeof customModel?.apiFormat === "string" ? customModel.apiFormat : "";
+ const lowerModel = fullModelStr.toLowerCase();
+ const isRerank =
+ apiFormat === "rerank" ||
+ supportedEndpoints.includes("rerank") ||
+ lowerModel.includes("rerank");
const isEmbedding =
- fullModelStr.toLowerCase().includes("embedding") ||
- fullModelStr.toLowerCase().includes("bge-") ||
- fullModelStr.toLowerCase().includes("text-embed");
+ !isRerank &&
+ (apiFormat === "embeddings" ||
+ supportedEndpoints.includes("embeddings") ||
+ lowerModel.includes("embedding") ||
+ lowerModel.includes("bge-") ||
+ lowerModel.includes("text-embed") ||
+ lowerModel.includes("jina-clip") ||
+ lowerModel.includes("colbert"));
- const testBody = buildComboTestRequestBody(fullModelStr, isEmbedding);
+ const testBody = isRerank
+ ? {
+ model: fullModelStr,
+ query: "What is OmniRoute?",
+ documents: [
+ "OmniRoute routes AI requests across configured providers.",
+ "This document is unrelated to the test query.",
+ ],
+ top_n: 1,
+ return_documents: false,
+ }
+ : buildComboTestRequestBody(fullModelStr, isEmbedding);
const res = await runWithTimeout((signal) =>
isEmbedding
? handleValidatedEmbeddingRequestBody(
testBody as Record & { model: string }
)
- : postChatCompletion(buildInternalChatRequest(testBody, signal))
+ : isRerank
+ ? postRerank(buildInternalRerankRequest(testBody, signal))
+ : postChatCompletion(buildInternalChatRequest(testBody, signal))
);
const latencyMs = Date.now() - startTime;
@@ -134,6 +203,13 @@ export async function POST(request: Request) {
}
const responseText = extractComboTestResponseText(responseBody);
+ if (isRerank) {
+ return NextResponse.json({
+ status: "ok",
+ latencyMs,
+ responseText: "[Rerank completed successfully]",
+ });
+ }
if (!responseText && !isEmbedding) {
return NextResponse.json(
{
diff --git a/src/app/api/monitoring/health/route.ts b/src/app/api/monitoring/health/route.ts
index 292b86581f..fba99e7bc1 100644
--- a/src/app/api/monitoring/health/route.ts
+++ b/src/app/api/monitoring/health/route.ts
@@ -3,6 +3,7 @@ import { getProviderConnections, getSettings } from "@/lib/localDb";
import { buildHealthPayload } from "@/lib/monitoring/observability";
import { APP_CONFIG } from "@/shared/constants/config";
import { AI_PROVIDERS } from "@/shared/constants/providers";
+import { isAuthenticated } from "@/shared/utils/apiAuth";
/**
* GET /api/monitoring/health — System health overview
@@ -63,7 +64,11 @@ export async function GET() {
* Resets all provider circuit breakers to CLOSED state,
* clearing failure counts and persisted state.
*/
-export async function DELETE() {
+export async function DELETE(request: Request) {
+ if (!(await isAuthenticated(request))) {
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+ }
+
try {
const { resetAllCircuitBreakers, getAllCircuitBreakerStatuses } =
await import("@/shared/utils/circuitBreaker");
diff --git a/src/app/api/oauth/[provider]/[action]/route.ts b/src/app/api/oauth/[provider]/[action]/route.ts
index 0b31439e5c..086ef7da83 100755
--- a/src/app/api/oauth/[provider]/[action]/route.ts
+++ b/src/app/api/oauth/[provider]/[action]/route.ts
@@ -24,6 +24,7 @@ import {
oauthPollSchema,
} from "@/shared/validation/schemas";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth";
// Use globalThis to persist callback server state across Next.js HMR reloads
if (!globalThis.__codexCallbackState) {
@@ -42,6 +43,12 @@ function safeEqual(a: string | null | undefined, b: string | null | undefined):
return timingSafeEqual(ba, bb);
}
+async function requireOAuthRouteAuth(request: Request) {
+ if (!(await isAuthRequired(request))) return null;
+ if (await isAuthenticated(request)) return null;
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+}
+
/**
* Dynamic OAuth API Route
* Handles: authorize, exchange, device-code, poll, start-callback-server, poll-callback
@@ -53,6 +60,9 @@ export async function GET(
request: Request,
{ params }: { params: Promise<{ provider: string; action: string }> }
) {
+ const authResponse = await requireOAuthRouteAuth(request);
+ if (authResponse) return authResponse;
+
try {
const { provider, action } = await params;
const { searchParams } = new URL(request.url);
@@ -212,6 +222,9 @@ export async function POST(
request: Request,
{ params }: { params: Promise<{ provider: string; action: string }> }
) {
+ const authResponse = await requireOAuthRouteAuth(request);
+ if (authResponse) return authResponse;
+
try {
const { provider, action } = await params;
let rawBody: any = {};
diff --git a/src/app/api/oauth/cursor/import/route.ts b/src/app/api/oauth/cursor/import/route.ts
index a0da0c4d4e..f2ba171d62 100755
--- a/src/app/api/oauth/cursor/import/route.ts
+++ b/src/app/api/oauth/cursor/import/route.ts
@@ -5,8 +5,15 @@ import { getConsistentMachineId } from "@/shared/utils/machineId";
import { syncToCloud } from "@/lib/cloudSync";
import { cursorImportSchema } from "@/shared/validation/schemas";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth";
import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts";
+async function requireOAuthImportAuth(request: Request) {
+ if (!(await isAuthRequired(request))) return null;
+ if (await isAuthenticated(request)) return null;
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+}
+
/**
* POST /api/oauth/cursor/import
* Import and validate access token from Cursor IDE's local SQLite database
@@ -15,7 +22,10 @@ import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts";
* - accessToken: string - Access token from cursorAuth/accessToken
* - machineId: string - Machine ID from storage.serviceMachineId
*/
-export async function POST(request: any) {
+export async function POST(request: Request) {
+ const authResponse = await requireOAuthImportAuth(request);
+ if (authResponse) return authResponse;
+
let rawBody;
try {
rawBody = await request.json();
@@ -89,7 +99,10 @@ export async function POST(request: any) {
* GET /api/oauth/cursor/import
* Get instructions for importing Cursor token
*/
-export async function GET() {
+export async function GET(request: Request) {
+ const authResponse = await requireOAuthImportAuth(request);
+ if (authResponse) return authResponse;
+
const cursorService = new CursorService();
const instructions = cursorService.getTokenStorageInstructions();
diff --git a/src/app/api/oauth/kiro/import/route.ts b/src/app/api/oauth/kiro/import/route.ts
index f329b871a9..44803229e5 100755
--- a/src/app/api/oauth/kiro/import/route.ts
+++ b/src/app/api/oauth/kiro/import/route.ts
@@ -5,13 +5,23 @@ import { getConsistentMachineId } from "@/shared/utils/machineId";
import { syncToCloud } from "@/lib/cloudSync";
import { kiroImportSchema } from "@/shared/validation/schemas";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth";
import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts";
+async function requireOAuthImportAuth(request: Request) {
+ if (!(await isAuthRequired(request))) return null;
+ if (await isAuthenticated(request)) return null;
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+}
+
/**
* POST /api/oauth/kiro/import
* Import and validate refresh token from Kiro IDE
*/
-export async function POST(request: any) {
+export async function POST(request: Request) {
+ const authResponse = await requireOAuthImportAuth(request);
+ if (authResponse) return authResponse;
+
let rawBody;
try {
rawBody = await request.json();
diff --git a/src/app/api/oauth/kiro/social-authorize/route.ts b/src/app/api/oauth/kiro/social-authorize/route.ts
index 53408f2ed8..61df8219af 100755
--- a/src/app/api/oauth/kiro/social-authorize/route.ts
+++ b/src/app/api/oauth/kiro/social-authorize/route.ts
@@ -1,6 +1,7 @@
import { NextResponse } from "next/server";
import { generatePKCE } from "@/lib/oauth/utils/pkce";
import { KiroService } from "@/lib/oauth/services/kiro";
+import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth";
/**
* GET /api/oauth/kiro/social-authorize
@@ -8,6 +9,10 @@ import { KiroService } from "@/lib/oauth/services/kiro";
* Uses kiro:// custom protocol as required by AWS Cognito
*/
export async function GET(request) {
+ if ((await isAuthRequired(request)) && !(await isAuthenticated(request))) {
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+ }
+
try {
const { searchParams } = new URL(request.url);
const provider = searchParams.get("provider"); // "google" or "github"
diff --git a/src/app/api/oauth/kiro/social-exchange/route.ts b/src/app/api/oauth/kiro/social-exchange/route.ts
index dade4a67d6..950c59e8db 100755
--- a/src/app/api/oauth/kiro/social-exchange/route.ts
+++ b/src/app/api/oauth/kiro/social-exchange/route.ts
@@ -5,6 +5,7 @@ import { getConsistentMachineId } from "@/shared/utils/machineId";
import { syncToCloud } from "@/lib/cloudSync";
import { kiroSocialExchangeSchema } from "@/shared/validation/schemas";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
+import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth";
/**
* POST /api/oauth/kiro/social-exchange
@@ -12,6 +13,10 @@ import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
* Callback URL will be in format: kiro://kiro.kiroAgent/authenticate-success?code=XXX&state=YYY
*/
export async function POST(request: Request) {
+ if ((await isAuthRequired(request)) && !(await isAuthenticated(request))) {
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
+ }
+
let rawBody;
try {
rawBody = await request.json();
diff --git a/src/app/api/providers/[id]/models/route.ts b/src/app/api/providers/[id]/models/route.ts
index a980e93695..1e6e7e5962 100755
--- a/src/app/api/providers/[id]/models/route.ts
+++ b/src/app/api/providers/[id]/models/route.ts
@@ -65,7 +65,12 @@ import {
} from "@/lib/providerModels/modelDiscovery";
type JsonRecord = Record;
-type LocalCatalogModel = { id: string; name?: string };
+type LocalCatalogModel = {
+ id: string;
+ name?: string;
+ apiFormat?: string;
+ supportedEndpoints?: string[];
+};
const antigravityDiscoveryInflight = new Map<
string,
@@ -409,33 +414,41 @@ const STATIC_MODEL_PROVIDERS: Record Array<{ id: string; name: str
* @param provider - Provider ID
* @returns Array of models or undefined if provider doesn't use static models
*/
-export function getStaticModelsForProvider(
- provider: string
-): Array<{ id: string; name: string }> | undefined {
+export function getStaticModelsForProvider(provider: string): LocalCatalogModel[] | undefined {
const staticModelsFn = STATIC_MODEL_PROVIDERS[provider];
if (staticModelsFn) {
return staticModelsFn();
}
- const specialtyModels: Array<{ id: string; name: string }> = [];
- const appendModels = (models: Array<{ id: string; name?: string }>) => {
+ const specialtyModels: LocalCatalogModel[] = [];
+ const appendModels = (
+ models: Array<{ id: string; name?: string }>,
+ metadata?: Pick
+ ) => {
for (const model of models) {
if (specialtyModels.some((existing) => existing.id === model.id)) continue;
specialtyModels.push({
id: model.id,
name: model.name || model.id,
+ ...metadata,
});
}
};
const embeddingProvider = getEmbeddingProvider(provider);
if (embeddingProvider) {
- appendModels(embeddingProvider.models);
+ appendModels(embeddingProvider.models, {
+ apiFormat: "embeddings",
+ supportedEndpoints: ["embeddings"],
+ });
}
const rerankProvider = getRerankProvider(provider);
if (rerankProvider) {
- appendModels(rerankProvider.models);
+ appendModels(rerankProvider.models, {
+ apiFormat: "rerank",
+ supportedEndpoints: ["rerank"],
+ });
}
const imageProvider = getImageProvider(provider);
@@ -837,6 +850,8 @@ export async function GET(
return localCatalog.map((model) => ({
id: model.id,
name: model.name || model.id,
+ ...(model.apiFormat ? { apiFormat: model.apiFormat } : {}),
+ ...(model.supportedEndpoints ? { supportedEndpoints: model.supportedEndpoints } : {}),
...(registryCatalogModels.length > 0 ? { owned_by: provider } : {}),
}));
};
@@ -1770,6 +1785,8 @@ export async function GET(
models: localCatalog.map((m) => ({
id: m.id,
name: m.name || m.id,
+ ...(m.apiFormat ? { apiFormat: m.apiFormat } : {}),
+ ...(m.supportedEndpoints ? { supportedEndpoints: m.supportedEndpoints } : {}),
...(registryCatalogModels.length > 0 ? { owned_by: provider } : {}),
})),
source: "local_catalog",
diff --git a/src/app/api/settings/compression/route.ts b/src/app/api/settings/compression/route.ts
index 4262eb5019..97f1e3aeef 100644
--- a/src/app/api/settings/compression/route.ts
+++ b/src/app/api/settings/compression/route.ts
@@ -1,70 +1,8 @@
import { NextRequest, NextResponse } from "next/server";
-import { z } from "zod";
import { getCompressionSettings, updateCompressionSettings } from "@/lib/db/compression";
import { isAuthenticated } from "@/shared/utils/apiAuth";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
-
-const compressionModeSchema = z.enum(["off", "lite", "standard", "aggressive", "ultra"]);
-
-const cavemanConfigSchema = z
- .object({
- enabled: z.boolean().optional(),
- compressRoles: z.array(z.enum(["user", "assistant", "system"])).optional(),
- skipRules: z.array(z.string()).optional(),
- minMessageLength: z.number().int().min(0).optional(),
- preservePatterns: z.array(z.string()).optional(),
- })
- .strict();
-
-const aggressiveConfigSchema = z
- .object({
- thresholds: z
- .object({
- fullSummary: z.number().int().min(1).max(100).optional(),
- moderate: z.number().int().min(1).max(100).optional(),
- light: z.number().int().min(1).max(100).optional(),
- verbatim: z.number().int().min(1).max(100).optional(),
- })
- .optional(),
- toolStrategies: z
- .object({
- fileContent: z.boolean().optional(),
- grepSearch: z.boolean().optional(),
- shellOutput: z.boolean().optional(),
- json: z.boolean().optional(),
- errorMessage: z.boolean().optional(),
- })
- .optional(),
- summarizerEnabled: z.boolean().optional(),
- maxTokensPerMessage: z.number().int().min(256).max(32768).optional(),
- minSavingsThreshold: z.number().min(0).max(1).optional(),
- })
- .strict();
-
-const ultraConfigSchema = z
- .object({
- enabled: z.boolean().optional(),
- compressionRate: z.number().min(0).max(1).optional(),
- minScoreThreshold: z.number().min(0).max(1).optional(),
- slmFallbackToAggressive: z.boolean().optional(),
- modelPath: z.string().trim().min(1).optional(),
- maxTokensPerMessage: z.number().int().min(0).max(32768).optional(),
- })
- .strict();
-
-const compressionSettingsUpdateSchema = z
- .object({
- enabled: z.boolean().optional(),
- defaultMode: compressionModeSchema.optional(),
- autoTriggerTokens: z.number().int().min(0).optional(),
- cacheMinutes: z.number().int().min(1).max(60).optional(),
- preserveSystemPrompt: z.boolean().optional(),
- comboOverrides: z.record(z.string(), compressionModeSchema).optional(),
- cavemanConfig: cavemanConfigSchema.optional(),
- aggressive: aggressiveConfigSchema.optional(),
- ultra: ultraConfigSchema.optional(),
- })
- .strict();
+import { compressionSettingsUpdateSchema } from "@/shared/validation/compressionConfigSchemas";
export async function GET(request: NextRequest) {
if (!(await isAuthenticated(request))) {
diff --git a/src/app/api/settings/compression/rules/route.ts b/src/app/api/settings/compression/rules/route.ts
new file mode 100644
index 0000000000..7394c776be
--- /dev/null
+++ b/src/app/api/settings/compression/rules/route.ts
@@ -0,0 +1 @@
+export { GET } from "@/app/api/compression/rules/route";
diff --git a/src/app/api/usage/analytics/route.ts b/src/app/api/usage/analytics/route.ts
index 60ed43c6a1..e89d9351e2 100644
--- a/src/app/api/usage/analytics/route.ts
+++ b/src/app/api/usage/analytics/route.ts
@@ -30,12 +30,6 @@ function getRangeStartIso(range: string): string | null {
return start.toISOString();
}
-function shortModelName(model: string | null): string {
- if (!model) return "-";
- const parts = model.split(/[/:-]/);
- return parts[parts.length - 1] || model;
-}
-
const WEEKDAY_LABELS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
type PricingByProvider = Record>>;
@@ -65,28 +59,76 @@ function appendWhereCondition(whereClause: string, condition: string): string {
return whereClause ? `${whereClause} AND (${condition})` : `WHERE (${condition})`;
}
+function findKeyInsensitive(obj: Record | undefined | null, key: string): any {
+ if (!obj || !key) return undefined;
+ return obj[key.toLowerCase()];
+}
+
function resolveModelPricing(
pricingByProvider: PricingByProvider,
- provider: string,
+ providerAliasMap: Record,
+ providerRaw: string,
model: string,
normalizeModelName: (model: string) => string
): Record | null {
- const providerPricing = pricingByProvider[provider];
- if (!providerPricing) return null;
+ const pLower = (providerRaw || "").toLowerCase();
- const normalizedModel = normalizeModelName(model);
- const shortModel = shortModelName(model);
- return (
- providerPricing[model] ||
- providerPricing[normalizedModel] ||
- providerPricing[shortModel] ||
- null
- );
+ let providerPricing = findKeyInsensitive(pricingByProvider, pLower);
+ if (!providerPricing) {
+ const alias = providerAliasMap[pLower];
+ if (alias) {
+ providerPricing = findKeyInsensitive(pricingByProvider, alias);
+ } else {
+ const np = pLower.replace(/-cn$/, "");
+ if (np && np !== pLower) {
+ providerPricing = findKeyInsensitive(pricingByProvider, np);
+ }
+ }
+ }
+
+ // Hardcoded known fallbacks
+ if (!providerPricing) {
+ if (pLower === "antigravity") providerPricing = findKeyInsensitive(pricingByProvider, "ag");
+ }
+
+ const normalizedModel = normalizeModelName(model).toLowerCase();
+ const shortModel = normalizedModel; // normalizeModelName behaves exactly like shortModelName
+ const hyphenModel = model.toLowerCase().replace(/\./g, "-");
+ const hyphenNormalized = normalizedModel.replace(/\./g, "-");
+ const lowerModel = model.toLowerCase();
+
+ const tryFind = (prov: Record | null | undefined) => {
+ if (!prov || typeof prov !== "object") return null;
+ return (
+ findKeyInsensitive(prov as Record, lowerModel) ||
+ findKeyInsensitive(prov as Record, normalizedModel) ||
+ findKeyInsensitive(prov as Record, shortModel) ||
+ findKeyInsensitive(prov as Record, hyphenModel) ||
+ findKeyInsensitive(prov as Record, hyphenNormalized) ||
+ null
+ );
+ };
+
+ let pricing = providerPricing ? tryFind(providerPricing) : null;
+
+ if (!pricing) {
+ // Global fallback: search all providers for this exact model (helps with aliases)
+ for (const prov of Object.values(pricingByProvider)) {
+ const found = tryFind(prov as Record);
+ if (found) {
+ pricing = found;
+ break;
+ }
+ }
+ }
+
+ return pricing as Record | null;
}
function computeUsageRowCost(
row: Record,
pricingByProvider: PricingByProvider,
+ providerAliasMap: Record,
normalizeModelName: (model: string) => string,
computeCostFromPricing: ComputeCostFromPricing
): number {
@@ -94,7 +136,13 @@ function computeUsageRowCost(
const model = toStringValue(row.model);
if (!provider || !model) return 0;
- const pricing = resolveModelPricing(pricingByProvider, provider, model, normalizeModelName);
+ const pricing = resolveModelPricing(
+ pricingByProvider,
+ providerAliasMap,
+ provider,
+ model,
+ normalizeModelName
+ );
if (!pricing) return 0;
return computeCostFromPricing(pricing, {
@@ -163,9 +211,20 @@ export async function GET(request: Request) {
// Fetch pricing data for cost calculation (no rows loaded)
const { getPricing } = await import("@/lib/db/settings");
- const pricingByProvider = (await getPricing()) as PricingByProvider;
+ const rawPricingByProvider = (await getPricing()) as PricingByProvider;
+
+ // Pre-process pricing data to lowercase keys for O(1) lookups
+ const pricingByProvider: PricingByProvider = {};
+ for (const [providerKey, providerVal] of Object.entries(rawPricingByProvider || {})) {
+ const lowerProvider = {};
+ for (const [modelKey, modelVal] of Object.entries(providerVal || {})) {
+ (lowerProvider as any)[modelKey.toLowerCase()] = modelVal;
+ }
+ pricingByProvider[providerKey.toLowerCase()] = lowerProvider;
+ }
const { computeCostFromPricing, normalizeModelName } =
await import("@/lib/usage/costCalculator");
+ const { PROVIDER_ID_TO_ALIAS } = await import("@omniroute/open-sse/config/providerModels");
const summaryRow = db
.prepare(
@@ -210,8 +269,8 @@ export async function GET(request: Request) {
`
SELECT
DATE(timestamp) as date,
- provider,
- model,
+ LOWER(provider) as provider,
+ LOWER(model) as model,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
COALESCE(SUM(tokens_cache_read), 0) as cacheReadTokens,
@@ -219,7 +278,7 @@ export async function GET(request: Request) {
COALESCE(SUM(tokens_reasoning), 0) as reasoningTokens
FROM usage_history
${whereClause}
- GROUP BY DATE(timestamp), provider, model
+ GROUP BY DATE(timestamp), LOWER(provider), LOWER(model)
ORDER BY date ASC
`
)
@@ -263,8 +322,8 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- model,
- provider,
+ LOWER(model) as model,
+ LOWER(provider) as provider,
COUNT(*) as requests,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
@@ -277,7 +336,7 @@ export async function GET(request: Request) {
COALESCE(MAX(timestamp), '') as lastUsed
FROM usage_history
${whereClause}
- GROUP BY model, provider
+ GROUP BY LOWER(model), LOWER(provider)
ORDER BY requests DESC
LIMIT 50
`
@@ -288,8 +347,8 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- provider,
- model,
+ LOWER(provider) as provider,
+ LOWER(model) as model,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
COALESCE(SUM(tokens_cache_read), 0) as cacheReadTokens,
@@ -297,7 +356,7 @@ export async function GET(request: Request) {
COALESCE(SUM(tokens_reasoning), 0) as reasoningTokens
FROM usage_history
${whereClause}
- GROUP BY provider, model
+ GROUP BY LOWER(provider), LOWER(model)
`
)
.all(params) as Array>;
@@ -306,7 +365,7 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- provider,
+ LOWER(provider) as provider,
COUNT(*) as requests,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
@@ -315,7 +374,7 @@ export async function GET(request: Request) {
COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) as successfulRequests
FROM usage_history
${whereClause}
- GROUP BY provider
+ GROUP BY LOWER(provider)
ORDER BY requests DESC
`
)
@@ -325,17 +384,18 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- connection_id as account,
- provider,
- model,
- COALESCE(SUM(tokens_input), 0) as promptTokens,
- COALESCE(SUM(tokens_output), 0) as completionTokens,
- COALESCE(SUM(tokens_cache_read), 0) as cacheReadTokens,
- COALESCE(SUM(tokens_cache_creation), 0) as cacheCreationTokens,
- COALESCE(SUM(tokens_reasoning), 0) as reasoningTokens
+ COALESCE(NULLIF(c.display_name, ''), NULLIF(c.email, ''), NULLIF(c.name, ''), usage_history.connection_id, 'unknown') as account,
+ LOWER(usage_history.provider) as provider,
+ LOWER(usage_history.model) as model,
+ COALESCE(SUM(usage_history.tokens_input), 0) as promptTokens,
+ COALESCE(SUM(usage_history.tokens_output), 0) as completionTokens,
+ COALESCE(SUM(usage_history.tokens_cache_read), 0) as cacheReadTokens,
+ COALESCE(SUM(usage_history.tokens_cache_creation), 0) as cacheCreationTokens,
+ COALESCE(SUM(usage_history.tokens_reasoning), 0) as reasoningTokens
FROM usage_history
- ${whereClause}
- GROUP BY connection_id, provider, model
+ LEFT JOIN provider_connections c ON c.id = usage_history.connection_id
+ ${whereClause.replace(/timestamp/g, "usage_history.timestamp").replace(/api_key_/g, "usage_history.api_key_")}
+ GROUP BY account, LOWER(usage_history.provider), LOWER(usage_history.model)
`
)
.all(params) as Array>;
@@ -344,31 +404,35 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- connection_id as account,
- COUNT(*) as requests,
- COALESCE(SUM(tokens_input), 0) as promptTokens,
- COALESCE(SUM(tokens_output), 0) as completionTokens,
- COALESCE(SUM(tokens_input + tokens_output), 0) as totalTokens,
- COALESCE(AVG(latency_ms), 0) as avgLatencyMs,
- COALESCE(MAX(timestamp), '') as lastUsed
+ COALESCE(NULLIF(c.display_name, ''), NULLIF(c.email, ''), NULLIF(c.name, ''), usage_history.connection_id, 'unknown') as account,
+ COUNT(usage_history.id) as requests,
+ COALESCE(SUM(usage_history.tokens_input), 0) as promptTokens,
+ COALESCE(SUM(usage_history.tokens_output), 0) as completionTokens,
+ COALESCE(SUM(usage_history.tokens_input + usage_history.tokens_output), 0) as totalTokens,
+ COALESCE(AVG(usage_history.latency_ms), 0) as avgLatencyMs,
+ COALESCE(MAX(usage_history.timestamp), '') as lastUsed
FROM usage_history
- ${whereClause}
- GROUP BY connection_id
+ LEFT JOIN provider_connections c ON c.id = usage_history.connection_id
+ ${whereClause.replace(/timestamp/g, "usage_history.timestamp").replace(/api_key_/g, "usage_history.api_key_")}
+ GROUP BY account
ORDER BY requests DESC
LIMIT 50
`
)
.all(params) as Array>;
- const apiKeyWhereClause = whereClause;
+ const apiKeyWhereClause = appendWhereCondition(
+ whereClause,
+ "(api_key_id IS NOT NULL AND api_key_id != '') OR (api_key_name IS NOT NULL AND api_key_name != '')"
+ );
const apiKeyRows = db
.prepare(
`
SELECT
api_key_id as apiKeyId,
COALESCE(NULLIF(api_key_name, ''), NULLIF(api_key_id, ''), 'Unknown API key') as apiKeyName,
- provider,
- model,
+ LOWER(provider) as provider,
+ LOWER(model) as model,
COUNT(*) as requests,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
@@ -378,7 +442,7 @@ export async function GET(request: Request) {
COALESCE(SUM(tokens_input + tokens_output), 0) as totalTokens
FROM usage_history
${apiKeyWhereClause}
- GROUP BY api_key_id, api_key_name, provider, model
+ GROUP BY api_key_id, api_key_name, LOWER(provider), LOWER(model)
`
)
.all(params) as Array>;
@@ -471,17 +535,31 @@ export async function GET(request: Request) {
streak: 0,
};
+ const dailyByModelMap: Record> = {};
+ const allModels = new Set();
+
const dailyCostByDate = new Map();
for (const row of dailyCostRows) {
const date = toStringValue(row.date);
if (!date) continue;
+
+ // Calculate costs
const cost = computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
dailyCostByDate.set(date, (dailyCostByDate.get(date) || 0) + cost);
+
+ // Group tokens by model for the day
+ const model = normalizeModelName(row.model as string);
+ const tokens = Number(row.promptTokens) + Number(row.completionTokens);
+
+ if (!dailyByModelMap[date]) dailyByModelMap[date] = {};
+ dailyByModelMap[date][model] = (dailyByModelMap[date][model] || 0) + tokens;
+ allModels.add(model);
}
const dailyTrend = dailyRows.map((row) => ({
@@ -502,7 +580,7 @@ export async function GET(request: Request) {
const byModel = modelRows.map((row) => {
const model = row.model as string;
const provider = row.provider as string;
- const short = shortModelName(model);
+ const short = normalizeModelName(model);
const tokens = {
input: Number(row.promptTokens) || 0,
output: Number(row.completionTokens) || 0,
@@ -510,6 +588,7 @@ export async function GET(request: Request) {
const cost = computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
@@ -541,6 +620,7 @@ export async function GET(request: Request) {
const cost = computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
@@ -567,6 +647,7 @@ export async function GET(request: Request) {
const cost = computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
@@ -619,6 +700,7 @@ export async function GET(request: Request) {
existing.cost += computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
@@ -650,6 +732,11 @@ export async function GET(request: Request) {
}
}
+ const dailyByModel = Object.keys(dailyByModelMap)
+ .sort()
+ .map((date) => ({ date, ...dailyByModelMap[date] }));
+ const modelNames = Array.from(allModels);
+
const analytics = {
summary,
dailyTrend,
@@ -661,6 +748,8 @@ export async function GET(request: Request) {
weeklyPattern,
weeklyTokens,
weeklyCounts,
+ dailyByModel,
+ modelNames,
range,
} as any;
@@ -699,8 +788,8 @@ export async function GET(request: Request) {
.prepare(
`
SELECT
- model,
- provider,
+ LOWER(model) as model,
+ LOWER(provider) as provider,
COALESCE(SUM(tokens_input), 0) as promptTokens,
COALESCE(SUM(tokens_output), 0) as completionTokens,
COALESCE(SUM(tokens_cache_read), 0) as cacheReadTokens,
@@ -708,7 +797,7 @@ export async function GET(request: Request) {
COALESCE(SUM(tokens_reasoning), 0) as reasoningTokens
FROM usage_history
${presetWhere}
- GROUP BY model, provider
+ GROUP BY LOWER(model), LOWER(provider)
`
)
.all(presetParams) as Array>;
@@ -718,6 +807,7 @@ export async function GET(request: Request) {
presetTotalCost += computeUsageRowCost(
row,
pricingByProvider,
+ PROVIDER_ID_TO_ALIAS,
normalizeModelName,
computeCostFromPricing
);
diff --git a/src/app/api/v1/embeddings/route.ts b/src/app/api/v1/embeddings/route.ts
index 9992f8273e..4fbe559448 100644
--- a/src/app/api/v1/embeddings/route.ts
+++ b/src/app/api/v1/embeddings/route.ts
@@ -23,6 +23,10 @@ import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
import { getAllCustomModels, getProviderNodes } from "@/lib/localDb";
+function toProviderScopedModelId(providerId: string, modelId: string): string {
+ return modelId.startsWith(`${providerId}/`) ? modelId : `${providerId}/${modelId}`;
+}
+
/**
* Handle CORS preflight
*/
@@ -59,7 +63,7 @@ export async function GET() {
for (const model of models) {
if (!model?.id || !Array.isArray(model.supportedEndpoints)) continue;
if (!model.supportedEndpoints.includes("embeddings")) continue;
- const fullId = `${providerId}/${model.id}`;
+ const fullId = toProviderScopedModelId(providerId, model.id);
if (data.some((d) => d.id === fullId)) continue;
data.push({
id: fullId,
diff --git a/src/app/api/v1/images/generations/route.ts b/src/app/api/v1/images/generations/route.ts
index 5c051da1c0..ceb99736fc 100644
--- a/src/app/api/v1/images/generations/route.ts
+++ b/src/app/api/v1/images/generations/route.ts
@@ -19,7 +19,8 @@ import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy";
import { v1ImageGenerationSchema } from "@/shared/validation/schemas";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
-import { getAllCustomModels } from "@/lib/localDb";
+import { getAllCustomModels, resolveProxyForConnection } from "@/lib/localDb";
+import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts";
/**
* Handle CORS preflight
@@ -226,14 +227,30 @@ export async function POST(request) {
}
}
- const result = await handleImageGeneration({
- body,
- credentials,
- log,
- ...(isCustomModel && { resolvedProvider: provider }),
- signal: request.signal,
- clientHeaders: publicBaseUrlHeaders(request.headers),
- });
+ // Resolve proxy for the connection if credentials exist (#1904)
+ let proxyInfo = null;
+ if (credentials?.id) {
+ try {
+ proxyInfo = await resolveProxyForConnection(credentials.id);
+ } catch {
+ log.debug("PROXY", `Failed to resolve proxy for image provider: ${provider}`);
+ }
+ }
+
+ const generateImage = () =>
+ handleImageGeneration({
+ body,
+ credentials,
+ log,
+ ...(isCustomModel && { resolvedProvider: provider }),
+ signal: request.signal,
+ clientHeaders: publicBaseUrlHeaders(request.headers),
+ });
+
+ // Execute with proxy context when available, direct otherwise (#1904)
+ const result = await (credentials?.id
+ ? runWithProxyContext(proxyInfo?.proxy || null, generateImage)
+ : generateImage());
if (result.success) {
await clearRecoveredProviderState(credentials);
diff --git a/src/app/api/v1/models/catalog.ts b/src/app/api/v1/models/catalog.ts
index 29520bfe98..4445b0d72c 100644
--- a/src/app/api/v1/models/catalog.ts
+++ b/src/app/api/v1/models/catalog.ts
@@ -210,6 +210,12 @@ export async function getUnifiedModelsResponse(
if (authRejection) return authRejection;
const { aliasToProviderId, providerIdToAlias } = buildAliasMaps();
+ const resolveCanonicalProviderId = (aliasOrProviderId: string, fallbackProviderId?: string) =>
+ aliasToProviderId[aliasOrProviderId] ||
+ (fallbackProviderId ? aliasToProviderId[fallbackProviderId] : undefined) ||
+ FALLBACK_ALIAS_TO_PROVIDER[aliasOrProviderId] ||
+ fallbackProviderId ||
+ aliasOrProviderId;
// Issue #96: Allow blocking specific providers from the models list
const blockedProviders: Set = new Set(
@@ -322,7 +328,7 @@ export async function getUnifiedModelsResponse(
// Add provider models (chat)
for (const [alias, providerModels] of Object.entries(PROVIDER_MODELS)) {
const providerId = aliasToProviderId[alias] || alias;
- const canonicalProviderId = FALLBACK_ALIAS_TO_PROVIDER[alias] || providerId;
+ const canonicalProviderId = resolveCanonicalProviderId(alias, providerId);
// Skip blocked providers (Issue #96)
if (blockedProviders.has(alias) || blockedProviders.has(canonicalProviderId)) continue;
@@ -387,7 +393,7 @@ export async function getUnifiedModelsResponse(
const prefix = providerIdToPrefix[providerId];
const alias = prefix || providerIdToAlias[providerId] || providerId;
- const canonicalProviderId = FALLBACK_ALIAS_TO_PROVIDER[alias] || providerId;
+ const canonicalProviderId = resolveCanonicalProviderId(alias, providerId);
const parentProviderType = nodeIdToProviderType[providerId];
if (
@@ -405,12 +411,15 @@ export async function getUnifiedModelsResponse(
const aliasId = `${alias}/${sm.id}`;
const endpoints = Array.isArray(sm.supportedEndpoints) ? sm.supportedEndpoints : ["chat"];
+ const apiFormat = typeof sm.apiFormat === "string" ? sm.apiFormat : "chat-completions";
let modelType: string | undefined;
if (endpoints.includes("embeddings")) modelType = "embedding";
+ else if (endpoints.includes("rerank")) modelType = "rerank";
else if (endpoints.includes("images")) modelType = "image";
else if (endpoints.includes("audio")) modelType = "audio";
const syncedFields = {
...(modelType ? { type: modelType } : {}),
+ ...(apiFormat !== "chat-completions" ? { api_format: apiFormat } : {}),
...(modelType === "audio" ? { subtype: "transcription" } : {}),
...(sm.inputTokenLimit ? { context_length: sm.inputTokenLimit } : {}),
...(endpoints.length > 1 || !endpoints.includes("chat")
@@ -478,7 +487,7 @@ export async function getUnifiedModelsResponse(
const isProviderActive = (provider: string) => {
if (activeAliases.size === 0) return false; // No active connections = show nothing
const alias = providerIdToAlias[provider] || provider;
- const canonicalProviderId = FALLBACK_ALIAS_TO_PROVIDER[alias] || provider;
+ const canonicalProviderId = resolveCanonicalProviderId(alias, provider);
// FIX #1752: Ensure blocked providers are not returned for non-chat models
if (
@@ -492,16 +501,38 @@ export async function getUnifiedModelsResponse(
return activeAliases.has(alias) || activeAliases.has(provider);
};
+ const hasEquivalentSpecialtyModel = (
+ providerId: string,
+ rawModelId: string,
+ type: string,
+ scopedModelId: string
+ ) =>
+ models.some((model: any) => {
+ if (model?.id === scopedModelId) return true;
+ if (model?.owned_by !== providerId || model?.type !== type) return false;
+ const existingRoot =
+ typeof model?.root === "string"
+ ? model.root
+ : typeof model?.id === "string"
+ ? model.id.split("/").pop()
+ : null;
+ return existingRoot === rawModelId;
+ });
+
// Add embedding models (filtered by active providers)
for (const embModel of getAllEmbeddingModels()) {
if (!isProviderActive(embModel.provider)) continue;
const rawModelId = embModel.id.split("/").pop() || embModel.id;
if (!providerSupportsModel(embModel.provider, rawModelId)) continue;
+ if (hasEquivalentSpecialtyModel(embModel.provider, rawModelId, "embedding", embModel.id)) {
+ continue;
+ }
models.push({
id: embModel.id,
object: "model",
created: timestamp,
owned_by: embModel.provider,
+ root: rawModelId,
type: "embedding",
dimensions: embModel.dimensions,
});
@@ -530,11 +561,15 @@ export async function getUnifiedModelsResponse(
if (!isProviderActive(rerankModel.provider)) continue;
const rawModelId = rerankModel.id.split("/").pop() || rerankModel.id;
if (!providerSupportsModel(rerankModel.provider, rawModelId)) continue;
+ if (hasEquivalentSpecialtyModel(rerankModel.provider, rawModelId, "rerank", rerankModel.id)) {
+ continue;
+ }
models.push({
id: rerankModel.id,
object: "model",
created: timestamp,
owned_by: rerankModel.provider,
+ root: rawModelId,
type: "rerank",
});
}
@@ -611,7 +646,7 @@ export async function getUnifiedModelsResponse(
// For compatible providers, use the prefix from provider nodes
const prefix = providerIdToPrefix[providerId];
const alias = prefix || providerIdToAlias[providerId] || providerId;
- const canonicalProviderId = FALLBACK_ALIAS_TO_PROVIDER[alias] || providerId;
+ const canonicalProviderId = resolveCanonicalProviderId(alias, providerId);
// Only include if provider is active — check alias, canonical ID, raw providerId,
// or the parent provider type (for compatible providers whose node ID is a UUID)
@@ -649,8 +684,15 @@ export async function getUnifiedModelsResponse(
typeof model.apiFormat === "string" ? model.apiFormat : "chat-completions";
let modelType: string | undefined;
if (endpoints.includes("embeddings")) modelType = "embedding";
+ else if (endpoints.includes("rerank")) modelType = "rerank";
else if (endpoints.includes("images")) modelType = "image";
else if (endpoints.includes("audio")) modelType = "audio";
+ if (
+ modelType &&
+ hasEquivalentSpecialtyModel(canonicalProviderId, modelId, modelType, aliasId)
+ ) {
+ continue;
+ }
const visionFields =
modelType === "chat"
? getVisionCapabilityFields(aliasId) || getVisionCapabilityFields(modelId)
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json
index 7c631bc21a..f53a16b164 100644
--- a/src/i18n/messages/ar.json
+++ b/src/i18n/messages/ar.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "المواضيع",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "مترجم",
diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json
index 0d95294a9d..50647322db 100644
--- a/src/i18n/messages/bg.json
+++ b/src/i18n/messages/bg.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Теми",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Преводач",
diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/bn.json
+++ b/src/i18n/messages/bn.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json
index f40d8d6491..99baade68b 100644
--- a/src/i18n/messages/cs.json
+++ b/src/i18n/messages/cs.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Motivy",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Překladatel",
diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json
index 758d6ca328..b4cd041183 100644
--- a/src/i18n/messages/da.json
+++ b/src/i18n/messages/da.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Temaer",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Oversætter",
diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json
index dc2da758c3..aef5cdb6ca 100644
--- a/src/i18n/messages/de.json
+++ b/src/i18n/messages/de.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themen",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Übersetzer",
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index d61db2dfc3..fdb7ade61e 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -736,7 +736,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"webhooks": {
"title": "Webhooks",
@@ -2937,7 +2941,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add CC Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"enterpriseCloud": "Enterprise & Cloud",
@@ -2958,6 +2962,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Hide extra Claude usage rows reported by some providers when they duplicate primary token accounting.",
"blockClaudeExtraUsageLabel": "Block duplicate Claude usage rows",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Base URL for a Claude Code-only relay. Do not include /messages.",
"ccCompatibleBaseUrlPlaceholder": "https://relay.example.com/v1",
"ccCompatibleChatPathHint": "Defaults to Claude Code's strict Messages API path. Change only if your relay documents a different path.",
@@ -2991,6 +2998,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2998,7 +3006,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -3064,7 +3072,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3696,7 +3704,90 @@
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
"compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
- "minutes": "minutes"
+ "minutes": "minutes",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "deduplicateThreshold": "Deduplicate threshold",
+ "customFilters": "Custom filters",
+ "trustProjectFilters": "Trust project filters",
+ "rawOutputRetention": "Raw output retention",
+ "rawOutputNever": "Never",
+ "rawOutputFailures": "Failures",
+ "rawOutputAlways": "Always",
+ "rawOutputMaxBytes": "Raw output max bytes",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "bypassConditionsList": "security, irreversible, clarification, order-sensitive",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
@@ -5112,6 +5203,7 @@
"apiKey": "API Key",
"combo": "Combo",
"tokens": "Tokens",
+ "compressed": "Compression",
"tps": "TPS",
"duration": "Duration",
"time": "Time"
diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json
index c0d3a0dac5..bbaee8d63e 100644
--- a/src/i18n/messages/es.json
+++ b/src/i18n/messages/es.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Temas",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Traductor",
diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/fa.json
+++ b/src/i18n/messages/fa.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json
index bcbccd7f27..9c9ac3b3a0 100644
--- a/src/i18n/messages/fi.json
+++ b/src/i18n/messages/fi.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Teemat",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Kääntäjä",
diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json
index 29f5a12e07..864d6d0569 100644
--- a/src/i18n/messages/fr.json
+++ b/src/i18n/messages/fr.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Thèmes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Traducteur",
diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/gu.json
+++ b/src/i18n/messages/gu.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json
index 5114d855a4..3e1b0ba309 100644
--- a/src/i18n/messages/he.json
+++ b/src/i18n/messages/he.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "מתרגם",
diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json
index 4afc1f9aa6..21f523f296 100644
--- a/src/i18n/messages/hi.json
+++ b/src/i18n/messages/hi.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "अनुवादक",
diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json
index 55714b00ee..9c297547bb 100644
--- a/src/i18n/messages/hu.json
+++ b/src/i18n/messages/hu.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Témák",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Fordító",
diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json
index a4f7ab77fb..3eb7a5f1b2 100644
--- a/src/i18n/messages/id.json
+++ b/src/i18n/messages/id.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Penerjemah",
diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/in.json
+++ b/src/i18n/messages/in.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json
index eab3a5a395..74bdb97eec 100644
--- a/src/i18n/messages/it.json
+++ b/src/i18n/messages/it.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Traduttore",
diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json
index 6273245d10..53b7954beb 100644
--- a/src/i18n/messages/ja.json
+++ b/src/i18n/messages/ja.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "翻訳者",
diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json
index 5092f3ed80..c59b90e65b 100644
--- a/src/i18n/messages/ko.json
+++ b/src/i18n/messages/ko.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3283,7 +3291,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "번역기",
diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/mr.json
+++ b/src/i18n/messages/mr.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json
index 4bc7cc6c9d..a67b0035ac 100644
--- a/src/i18n/messages/ms.json
+++ b/src/i18n/messages/ms.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Penterjemah",
diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json
index c7f414fb44..86d60edfb3 100644
--- a/src/i18n/messages/nl.json
+++ b/src/i18n/messages/nl.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Vertaler",
diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json
index bd7ddc490b..f0f0fe2cbd 100644
--- a/src/i18n/messages/no.json
+++ b/src/i18n/messages/no.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Oversetter",
diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json
index 6481165823..a8320653a8 100644
--- a/src/i18n/messages/phi.json
+++ b/src/i18n/messages/phi.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Tagasalin",
diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json
index 6167244edd..01f1228530 100644
--- a/src/i18n/messages/pl.json
+++ b/src/i18n/messages/pl.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Tłumacz",
diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json
index 57c9f5d716..b683f32bea 100644
--- a/src/i18n/messages/pt-BR.json
+++ b/src/i18n/messages/pt-BR.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2735,7 +2739,7 @@
"apiRegionChina": "China Continental (open.bigmodel.cn)",
"extraApiKeysLabel": "Chaves de API Extras",
"extraApiKeysHint": "Rotação round-robin — opcional",
- "extraApiKeyMasked": "Chave #{index}: {prefix}...{suffix}",
+ "extraApiKeyMasked": "Chave {index}: {prefix}••••{suffix}",
"removeThisKey": "Remover esta chave",
"addAnotherApiKey": "Adicionar outra chave de API...",
"totalKeysRotating": "{count} chaves no total — rotacionando em round-robin a cada request.",
@@ -2743,6 +2747,7 @@
"tagGroupPlaceholder": "ex.: personal, work, team-a",
"tagGroupHint": "Usado para agrupar contas na visão do provedor.",
"defaultThinkingStrengthLabel": "Intensidade de raciocínio padrão",
+ "deleteAllExtraApiKeys": "Excluir todas",
"defaultThinkingStrengthHint": "Usada quando o cliente não envia reasoning effort e o modo global Thinking Budget está em passthrough.",
"maxConcurrentWholeNumberError": "Max concurrent deve ser um número inteiro maior ou igual a 0.",
"codexFastServiceTierLabel": "Codex Fast Service Tier",
@@ -2750,6 +2755,9 @@
"openaiResponsesStoreLabel": "OpenAI Responses Store",
"openaiResponsesStoreDescription": "Preserva `store`, `previous_response_id` e adiciona um `session_id` estável como fallback para sessões longas do Codex. Habilite apenas quando a conta upstream aceitar Responses armazenadas.",
"blockClaudeExtraUsageLabel": "Bloquear Claude Extra Usage",
+ "bulkPasteAdded": "{count, plural, one {1 chave adicionada} other {# chaves adicionadas}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicata ignorada} other {# duplicatas ignoradas}}",
+ "bulkPasteHint": "Cole uma chave de API por linha. Linhas vazias são ignoradas e chaves duplicadas são puladas.",
"blockClaudeExtraUsageDescription": "Quando habilitado, o OmniRoute marca esta conta do Claude Code como indisponível assim que a API de usage reporta `extra_usage.queued`, para que o fallback troque para outra conta antes de continuar com cobranças extras pay-as-you-go.",
"hideEmail": "Ocultar e-mail",
"showEmail": "Mostrar e-mail",
@@ -3398,7 +3406,90 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "Motor RTK",
+ "description": "Compressao sensivel a comandos para tool output, logs de terminal e builds.",
+ "enabled": "Ativo",
+ "intensity": "Intensidade",
+ "intensityMinimal": "Minima",
+ "intensityStandard": "Padrao",
+ "intensityAggressive": "Agressiva",
+ "toolResults": "Resultados de tools",
+ "assistantMessages": "Mensagens do assistente",
+ "codeBlocks": "Blocos de codigo",
+ "maxLines": "Max linhas",
+ "maxChars": "Max caracteres",
+ "deduplicateThreshold": "Limite de deduplicacao",
+ "customFilters": "Filtros customizados",
+ "trustProjectFilters": "Confiar em filtros do projeto",
+ "rawOutputRetention": "Retencao de raw output",
+ "rawOutputNever": "Nunca",
+ "rawOutputFailures": "Falhas",
+ "rawOutputAlways": "Sempre",
+ "rawOutputMaxBytes": "Max bytes de raw output",
+ "filterTesting": "Teste de filtros",
+ "pasteOutput": "Cole output de ferramenta para testar...",
+ "run": "Executar",
+ "result": "Resultado",
+ "previewEmpty": "Execute um exemplo para visualizar o RTK.",
+ "detected": "Detectado",
+ "tokensFiltered": "Tokens filtrados",
+ "filtersActive": "Filtros ativos",
+ "requests": "Requests",
+ "avgSavings": "Economia media"
+ },
+ "contextCombos": {
+ "title": "Combos de Compressao",
+ "description": "Defina como engines sao combinadas para diferentes cenarios de roteamento.",
+ "createCombo": "Criar Combo",
+ "editCombo": "Editar",
+ "deleteCombo": "Excluir",
+ "deleteConfirm": "Excluir este combo de compressao?",
+ "pipeline": "Pipeline",
+ "addStep": "Adicionar Step",
+ "removeStep": "Remover",
+ "name": "Nome",
+ "descriptionField": "Descricao",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Atribuir a Combos de Roteamento",
+ "noAssignments": "Nenhum combo de roteamento disponivel",
+ "default": "Default",
+ "setAsDefault": "Definir como default",
+ "save": "Salvar",
+ "cancel": "Cancelar",
+ "enabled": "Ativo"
+ },
+ "contextCaveman": {
+ "title": "Motor Caveman",
+ "description": "Compressao baseada em regras, language packs, analytics e output mode.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens salvos",
+ "savingsPercent": "Economia %",
+ "avgLatency": "Latencia media",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Ative regras de compressao para idiomas especificos.",
+ "enabled": "Ativo",
+ "autoDetect": "Auto-detectar idioma",
+ "rulesCount": "{count} regras",
+ "analyticsTitle": "Analytics de Compressao",
+ "noAnalytics": "Sem analytics de compressao ainda.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instrui o LLM a responder em formato curto e compacto.",
+ "autoClarity": "Bypass Auto-Clarity",
+ "bypassConditions": "Condicoes de bypass",
+ "bypassConditionsList": "seguranca, irreversivel, clarificacao, sensivel a ordem",
+ "preview": {
+ "lite": "Responda conciso. Preserve termos tecnicos, codigo, erros, URLs e identificadores.",
+ "full": "Responda seco e compacto. Preserve todo conteudo tecnico.",
+ "ultra": "Responda ultra compacto com abreviacoes tecnicas comuns. Preserve simbolos exatos."
+ }
},
"translator": {
"title": "Tradutor",
diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json
index 0153540639..eec9fd947b 100644
--- a/src/i18n/messages/pt.json
+++ b/src/i18n/messages/pt.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2627,7 +2631,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2647,6 +2651,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2680,6 +2687,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2687,7 +2695,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2750,7 +2758,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3368,7 +3376,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Tradutor",
diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json
index 02ca5bf121..114e40112c 100644
--- a/src/i18n/messages/ro.json
+++ b/src/i18n/messages/ro.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Traducător",
diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index 402d320586..ef348f3b50 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Темы",
@@ -2579,7 +2583,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2599,6 +2603,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2632,6 +2639,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2639,7 +2647,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2702,7 +2710,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3305,7 +3313,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Переводчик",
diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json
index 3eff1eb6e2..ff56cac7db 100644
--- a/src/i18n/messages/sk.json
+++ b/src/i18n/messages/sk.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Prekladateľ",
diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json
index 112f8ae4f5..94a2c94f9c 100644
--- a/src/i18n/messages/sv.json
+++ b/src/i18n/messages/sv.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Översättare",
diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/sw.json
+++ b/src/i18n/messages/sw.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/ta.json
+++ b/src/i18n/messages/ta.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/te.json
+++ b/src/i18n/messages/te.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json
index 4a3d0b470f..78b3001059 100644
--- a/src/i18n/messages/th.json
+++ b/src/i18n/messages/th.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "ธีมส์",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "นักแปล",
diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json
index 25a033a543..99039f8a4b 100644
--- a/src/i18n/messages/tr.json
+++ b/src/i18n/messages/tr.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Temalar",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Çeviri",
diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json
index 6e8426cd22..47f66c4b1b 100644
--- a/src/i18n/messages/uk-UA.json
+++ b/src/i18n/messages/uk-UA.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Перекладач",
diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json
index de75332f30..76b811bfe7 100644
--- a/src/i18n/messages/ur.json
+++ b/src/i18n/messages/ur.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2717,7 +2721,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2737,6 +2741,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2770,6 +2777,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2777,7 +2785,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2841,7 +2849,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3438,7 +3446,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json
index ade7650250..d08b9ec0c3 100644
--- a/src/i18n/messages/vi.json
+++ b/src/i18n/messages/vi.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "Themes",
@@ -2555,7 +2559,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "Add Cc Compatible",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2575,6 +2579,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
"blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint",
"ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder",
"ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint",
@@ -2608,6 +2615,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.",
"defaultThinkingStrengthLabel": "Default thinking strength",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2615,7 +2623,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2678,7 +2686,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3281,7 +3289,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "Người phiên dịch",
diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json
index 3cbf7ab6bb..a2946ad009 100644
--- a/src/i18n/messages/zh-CN.json
+++ b/src/i18n/messages/zh-CN.json
@@ -735,7 +735,11 @@
"themeCustom": "Theme Custom",
"hideHealthLogsDesc": "Hide Health Logs Desc",
"faviconPreview": "Favicon Preview",
- "changelog": "Changelog"
+ "changelog": "Changelog",
+ "contextSection": "Context & Cache",
+ "contextCaveman": "Caveman",
+ "contextRtk": "RTK",
+ "contextCombos": "Compression Combos"
},
"themesPage": {
"title": "主题",
@@ -2657,7 +2661,7 @@
"accountIdHint": "Account Id Hint",
"accountIdLabel": "Account Id Label",
"accountIdPlaceholder": "Account Id Placeholder",
- "addAnotherApiKey": "Add Another Api Key",
+ "addAnotherApiKey": "Add another API key or paste multiple keys",
"addCcCompatible": "添加 CC 兼容",
"aggregatorsGateways": "Aggregators Gateways",
"apiFormatLabel": "Api Format Label",
@@ -2677,6 +2681,9 @@
"blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
"blockClaudeExtraUsageDescription": "隐藏部分 Provider 返回的重复 Claude 额外用量记录,避免和主 token 统计重复。",
"blockClaudeExtraUsageLabel": "屏蔽重复 Claude 用量",
+ "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
+ "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
+ "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
"ccCompatibleBaseUrlHint": "Claude Code 专用中转站的 Base URL,不要包含 /messages。",
"ccCompatibleBaseUrlPlaceholder": "https://relay.example.com/v1",
"ccCompatibleChatPathHint": "默认使用 Claude Code 严格的 Messages API 路径。仅在中转站文档要求时修改。",
@@ -2710,6 +2717,7 @@
"databricksBaseUrlHint": "Databricks Base Url Hint",
"defaultThinkingStrengthHint": "请求未指定 reasoning effort 时使用。",
"defaultThinkingStrengthLabel": "默认思考强度",
+ "deleteAllExtraApiKeys": "Delete all",
"excludedModelsHint": "Excluded Models Hint",
"excludedModelsLabel": "Excluded Models Label",
"excludedModelsPlaceholder": "Excluded Models Placeholder",
@@ -2717,7 +2725,7 @@
"expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
"expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
"expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
- "extraApiKeyMasked": "Extra Api Key Masked",
+ "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
"extraApiKeysHint": "Extra Api Keys Hint",
"extraApiKeysLabel": "Extra Api Keys Label",
"googlePseInfo": "Google Pse Info",
@@ -2781,7 +2789,7 @@
"tokenExpiredTitle": "Token Expired Title",
"tokenExpiresSoonTitle": "Token Expires Soon Title",
"tokenShort": "Token Short",
- "totalKeysRotating": "Total Keys Rotating",
+ "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}",
"unhideModel": "Unhide Model",
"upstreamProxyProviders": "Upstream Proxy Providers",
"validationModelIdHint": "Validation Model Id Hint",
@@ -3390,7 +3398,81 @@
"compressionPreservePatterns": "Preserve Patterns",
"compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
"compressionLogTitle": "Compression Log",
- "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled."
+ "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
+ "compressionModeRtk": "RTK",
+ "compressionModeRtkDesc": "Command-aware tool output filtering",
+ "compressionModeStacked": "Stacked",
+ "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression"
+ },
+ "contextRtk": {
+ "title": "RTK Engine",
+ "description": "Command-aware compression for tool output, terminal logs and build results.",
+ "enabled": "Enabled",
+ "intensity": "Intensity",
+ "intensityMinimal": "Minimal",
+ "intensityStandard": "Standard",
+ "intensityAggressive": "Aggressive",
+ "toolResults": "Tool results",
+ "assistantMessages": "Assistant messages",
+ "codeBlocks": "Code blocks",
+ "maxLines": "Max lines",
+ "maxChars": "Max chars",
+ "filterTesting": "Filter Testing",
+ "pasteOutput": "Paste tool output to test filtering...",
+ "run": "Run",
+ "result": "Result",
+ "previewEmpty": "Run a sample to preview RTK output.",
+ "detected": "Detected",
+ "tokensFiltered": "Tokens filtered",
+ "filtersActive": "Filters active",
+ "requests": "Requests",
+ "avgSavings": "Avg savings"
+ },
+ "contextCombos": {
+ "title": "Compression Combos",
+ "description": "Define how engines are combined for different routing scenarios.",
+ "createCombo": "Create Compression Combo",
+ "editCombo": "Edit",
+ "deleteCombo": "Delete",
+ "deleteConfirm": "Delete this compression combo?",
+ "pipeline": "Pipeline",
+ "addStep": "Add Step",
+ "removeStep": "Remove",
+ "name": "Name",
+ "descriptionField": "Description",
+ "languagePacks": "Language Packs",
+ "outputMode": "Output Mode",
+ "assignToRouting": "Assign to Routing Combos",
+ "noAssignments": "No routing combos available",
+ "default": "Default",
+ "setAsDefault": "Set as Default",
+ "save": "Save",
+ "cancel": "Cancel",
+ "enabled": "Enabled"
+ },
+ "contextCaveman": {
+ "title": "Caveman Engine",
+ "description": "Rule-based message compression, language packs, analytics and output mode controls.",
+ "requests": "Requests",
+ "tokensSaved": "Tokens saved",
+ "savingsPercent": "Savings %",
+ "avgLatency": "Avg latency",
+ "languagePacks": "Language Packs",
+ "languagePacksDesc": "Enable compression rules for specific languages.",
+ "enabled": "Enabled",
+ "autoDetect": "Auto-detect language",
+ "rulesCount": "{count} rules",
+ "analyticsTitle": "Compression Analytics",
+ "noAnalytics": "No compression analytics yet.",
+ "outputModeTitle": "Output Mode",
+ "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
+ "autoClarity": "Auto-Clarity Bypass",
+ "bypassConditions": "Bypass conditions",
+ "preview": {
+ "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
+ "full": "Respond terse and compact. Preserve all technical substance.",
+ "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
+ }
},
"translator": {
"title": "翻译器",
diff --git a/src/lib/db/compression.ts b/src/lib/db/compression.ts
index 8d45f82f37..1a240d81d6 100644
--- a/src/lib/db/compression.ts
+++ b/src/lib/db/compression.ts
@@ -4,12 +4,19 @@ import { invalidateDbCache } from "./readCache";
import {
DEFAULT_AGGRESSIVE_CONFIG,
DEFAULT_CAVEMAN_CONFIG,
+ DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG,
+ DEFAULT_COMPRESSION_LANGUAGE_CONFIG,
DEFAULT_COMPRESSION_CONFIG,
+ DEFAULT_RTK_CONFIG,
DEFAULT_ULTRA_CONFIG,
type AggressiveConfig,
type CavemanConfig,
+ type CavemanOutputModeConfig,
+ type CompressionLanguageConfig,
+ type CompressionPipelineStep,
type CompressionConfig,
type CompressionMode,
+ type RtkConfig,
type UltraConfig,
} from "@omniroute/open-sse/services/compression/types.ts";
@@ -20,6 +27,8 @@ const COMPRESSION_MODES = new Set([
"standard",
"aggressive",
"ultra",
+ "rtk",
+ "stacked",
]);
type JsonRecord = Record;
@@ -47,6 +56,10 @@ function parseJsonSafe(raw: string | null): unknown {
function normalizeCavemanConfig(value: unknown): CavemanConfig {
const record = toRecord(value);
+ const intensity =
+ record.intensity === "lite" || record.intensity === "full" || record.intensity === "ultra"
+ ? record.intensity
+ : DEFAULT_CAVEMAN_CONFIG.intensity;
return {
...DEFAULT_CAVEMAN_CONFIG,
...record,
@@ -66,9 +79,153 @@ function normalizeCavemanConfig(value: unknown): CavemanConfig {
preservePatterns: Array.isArray(record.preservePatterns)
? record.preservePatterns.filter((pattern): pattern is string => typeof pattern === "string")
: DEFAULT_CAVEMAN_CONFIG.preservePatterns,
+ intensity,
};
}
+function normalizeCavemanOutputModeConfig(value: unknown): CavemanOutputModeConfig {
+ const record = toRecord(value);
+ return {
+ ...DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG,
+ enabled:
+ typeof record.enabled === "boolean"
+ ? record.enabled
+ : DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG.enabled,
+ intensity:
+ record.intensity === "lite" || record.intensity === "full" || record.intensity === "ultra"
+ ? record.intensity
+ : DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG.intensity,
+ autoClarity:
+ typeof record.autoClarity === "boolean"
+ ? record.autoClarity
+ : DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG.autoClarity,
+ };
+}
+
+function normalizeRtkConfig(value: unknown): RtkConfig {
+ const record = toRecord(value);
+ return {
+ ...DEFAULT_RTK_CONFIG,
+ enabled: typeof record.enabled === "boolean" ? record.enabled : DEFAULT_RTK_CONFIG.enabled,
+ intensity:
+ record.intensity === "minimal" ||
+ record.intensity === "standard" ||
+ record.intensity === "aggressive"
+ ? record.intensity
+ : DEFAULT_RTK_CONFIG.intensity,
+ applyToToolResults:
+ typeof record.applyToToolResults === "boolean"
+ ? record.applyToToolResults
+ : DEFAULT_RTK_CONFIG.applyToToolResults,
+ applyToCodeBlocks:
+ typeof record.applyToCodeBlocks === "boolean"
+ ? record.applyToCodeBlocks
+ : DEFAULT_RTK_CONFIG.applyToCodeBlocks,
+ applyToAssistantMessages:
+ typeof record.applyToAssistantMessages === "boolean"
+ ? record.applyToAssistantMessages
+ : DEFAULT_RTK_CONFIG.applyToAssistantMessages,
+ enabledFilters: Array.isArray(record.enabledFilters)
+ ? record.enabledFilters.filter((filter): filter is string => typeof filter === "string")
+ : DEFAULT_RTK_CONFIG.enabledFilters,
+ disabledFilters: Array.isArray(record.disabledFilters)
+ ? record.disabledFilters.filter((filter): filter is string => typeof filter === "string")
+ : DEFAULT_RTK_CONFIG.disabledFilters,
+ maxLinesPerResult: boundedInt(
+ record.maxLinesPerResult,
+ DEFAULT_RTK_CONFIG.maxLinesPerResult,
+ 0,
+ 100000
+ ),
+ maxCharsPerResult: boundedInt(
+ record.maxCharsPerResult,
+ DEFAULT_RTK_CONFIG.maxCharsPerResult,
+ 0,
+ 1000000
+ ),
+ deduplicateThreshold: boundedInt(
+ record.deduplicateThreshold,
+ DEFAULT_RTK_CONFIG.deduplicateThreshold,
+ 2,
+ 100
+ ),
+ customFiltersEnabled:
+ typeof record.customFiltersEnabled === "boolean"
+ ? record.customFiltersEnabled
+ : DEFAULT_RTK_CONFIG.customFiltersEnabled,
+ trustProjectFilters:
+ typeof record.trustProjectFilters === "boolean"
+ ? record.trustProjectFilters
+ : DEFAULT_RTK_CONFIG.trustProjectFilters,
+ rawOutputRetention:
+ record.rawOutputRetention === "never" ||
+ record.rawOutputRetention === "failures" ||
+ record.rawOutputRetention === "always"
+ ? record.rawOutputRetention
+ : DEFAULT_RTK_CONFIG.rawOutputRetention,
+ rawOutputMaxBytes: boundedInt(
+ record.rawOutputMaxBytes,
+ DEFAULT_RTK_CONFIG.rawOutputMaxBytes,
+ 1024,
+ 10_000_000
+ ),
+ };
+}
+
+function normalizeLanguageConfig(value: unknown): CompressionLanguageConfig {
+ const record = toRecord(value);
+ const defaultLanguage =
+ typeof record.defaultLanguage === "string" && record.defaultLanguage.trim()
+ ? record.defaultLanguage.trim()
+ : DEFAULT_COMPRESSION_LANGUAGE_CONFIG.defaultLanguage;
+ const enabledPacks = Array.isArray(record.enabledPacks)
+ ? record.enabledPacks
+ .filter((pack): pack is string => typeof pack === "string" && pack.trim().length > 0)
+ .map((pack) => pack.trim())
+ : DEFAULT_COMPRESSION_LANGUAGE_CONFIG.enabledPacks;
+ return {
+ ...DEFAULT_COMPRESSION_LANGUAGE_CONFIG,
+ enabled:
+ typeof record.enabled === "boolean"
+ ? record.enabled
+ : DEFAULT_COMPRESSION_LANGUAGE_CONFIG.enabled,
+ defaultLanguage,
+ autoDetect:
+ typeof record.autoDetect === "boolean"
+ ? record.autoDetect
+ : DEFAULT_COMPRESSION_LANGUAGE_CONFIG.autoDetect,
+ enabledPacks: [...new Set(enabledPacks.length > 0 ? enabledPacks : ["en"])],
+ };
+}
+
+function normalizeStackedPipeline(value: unknown): CompressionPipelineStep[] {
+ const source = Array.isArray(value) ? value : (DEFAULT_COMPRESSION_CONFIG.stackedPipeline ?? []);
+ const pipeline: CompressionPipelineStep[] = [];
+ for (const entry of source) {
+ const record = toRecord(entry);
+ const engine = record.engine;
+ if (
+ engine !== "lite" &&
+ engine !== "caveman" &&
+ engine !== "aggressive" &&
+ engine !== "ultra" &&
+ engine !== "rtk"
+ ) {
+ continue;
+ }
+ pipeline.push({
+ engine,
+ ...(typeof record.intensity === "string"
+ ? { intensity: record.intensity as CompressionPipelineStep["intensity"] }
+ : {}),
+ ...(record.config && typeof record.config === "object"
+ ? { config: record.config as Record }
+ : {}),
+ });
+ }
+ return pipeline.length > 0 ? pipeline : (DEFAULT_COMPRESSION_CONFIG.stackedPipeline ?? []);
+}
+
function boundedInt(value: unknown, fallback: number, min: number, max: number): number {
if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
return Math.min(max, Math.max(min, Math.floor(value)));
@@ -196,6 +353,10 @@ export async function getCompressionSettings(): Promise {
const config: CompressionConfig = {
...DEFAULT_COMPRESSION_CONFIG,
cavemanConfig: { ...DEFAULT_CAVEMAN_CONFIG },
+ cavemanOutputMode: { ...DEFAULT_CAVEMAN_OUTPUT_MODE_CONFIG },
+ rtkConfig: { ...DEFAULT_RTK_CONFIG },
+ languageConfig: { ...DEFAULT_COMPRESSION_LANGUAGE_CONFIG },
+ stackedPipeline: normalizeStackedPipeline(undefined),
aggressive: normalizeAggressiveConfig(undefined),
ultra: normalizeUltraConfig(undefined),
};
@@ -217,6 +378,11 @@ export async function getCompressionSettings(): Promise {
config.defaultMode = parsed as CompressionMode;
}
break;
+ case "autoTriggerMode":
+ if (typeof parsed === "string" && COMPRESSION_MODES.has(parsed as CompressionMode)) {
+ config.autoTriggerMode = parsed as CompressionMode;
+ }
+ break;
case "autoTriggerTokens":
config.autoTriggerTokens =
typeof parsed === "number" && Number.isFinite(parsed)
@@ -232,6 +398,9 @@ export async function getCompressionSettings(): Promise {
case "preserveSystemPrompt":
config.preserveSystemPrompt = parsed !== false;
break;
+ case "mcpDescriptionCompressionEnabled":
+ config.mcpDescriptionCompressionEnabled = parsed !== false;
+ break;
case "comboOverrides":
if (parsed && typeof parsed === "object") {
const overrides: Record = {};
@@ -243,9 +412,25 @@ export async function getCompressionSettings(): Promise {
config.comboOverrides = overrides;
}
break;
+ case "compressionComboId":
+ config.compressionComboId =
+ typeof parsed === "string" && parsed.trim() ? parsed.trim() : null;
+ break;
+ case "stackedPipeline":
+ config.stackedPipeline = normalizeStackedPipeline(parsed);
+ break;
case "cavemanConfig":
config.cavemanConfig = normalizeCavemanConfig(parsed);
break;
+ case "cavemanOutputMode":
+ config.cavemanOutputMode = normalizeCavemanOutputModeConfig(parsed);
+ break;
+ case "rtkConfig":
+ config.rtkConfig = normalizeRtkConfig(parsed);
+ break;
+ case "languageConfig":
+ config.languageConfig = normalizeLanguageConfig(parsed);
+ break;
case "aggressive":
case "aggressiveConfig":
config.aggressive = normalizeAggressiveConfig(parsed);
@@ -300,3 +485,7 @@ export function getDefaultAggressiveConfig(): AggressiveConfig {
export function getDefaultUltraConfig(): UltraConfig {
return { ...DEFAULT_ULTRA_CONFIG };
}
+
+export function getDefaultRtkConfig(): RtkConfig {
+ return { ...DEFAULT_RTK_CONFIG };
+}
diff --git a/src/lib/db/compressionAnalytics.ts b/src/lib/db/compressionAnalytics.ts
index f587a915ae..16a5b51415 100644
--- a/src/lib/db/compressionAnalytics.ts
+++ b/src/lib/db/compressionAnalytics.ts
@@ -4,6 +4,8 @@ export interface CompressionAnalyticsRow {
id?: number;
timestamp: string;
combo_id?: string | null;
+ compression_combo_id?: string | null;
+ engine?: string | null;
provider?: string | null;
mode: string;
original_tokens: number;
@@ -11,6 +13,19 @@ export interface CompressionAnalyticsRow {
tokens_saved: number;
duration_ms?: number | null;
request_id?: string | null;
+ actual_prompt_tokens?: number | null;
+ actual_completion_tokens?: number | null;
+ actual_total_tokens?: number | null;
+ actual_cache_read_tokens?: number | null;
+ actual_cache_write_tokens?: number | null;
+ estimated_usd_saved?: number | null;
+ mcp_description_tokens_saved?: number | null;
+ multimodal_skip_count?: number | null;
+ receipt_source?: string | null;
+ validation_fallback?: boolean | number | null;
+ output_mode?: string | null;
+ rtk_raw_output_pointer?: string | null;
+ rtk_raw_output_bytes?: number | null;
}
export interface CompressionAnalyticsSummary {
@@ -19,32 +34,204 @@ export interface CompressionAnalyticsSummary {
avgSavingsPct: number;
avgDurationMs: number;
byMode: Record;
+ byEngine: Record;
+ byCompressionCombo: Record;
byProvider: Record;
last24h: Array<{ hour: string; count: number; tokensSaved: number }>;
+ validationFallbacks: number;
+ realUsage: {
+ requestsWithReceipts: number;
+ promptTokens: number;
+ completionTokens: number;
+ totalTokens: number;
+ cacheReadTokens: number;
+ cacheWriteTokens: number;
+ estimatedUsdSaved: number;
+ bySource: Record;
+ };
+ mcpDescriptionCompression: {
+ snapshots: number;
+ estimatedTokensSaved: number;
+ };
+}
+
+let columnsEnsuredForDb: unknown = null;
+
+function ensureCompressionAnalyticsColumns(): void {
+ const db = getDbInstance();
+ if (columnsEnsuredForDb === db) return;
+ const rows = db.prepare("PRAGMA table_info(compression_analytics)").all() as Array<{
+ name: string;
+ }>;
+ const columns = new Set(rows.map((row) => row.name));
+ const addColumn = (name: string, sql: string) => {
+ if (!columns.has(name)) db.exec(sql);
+ };
+ addColumn(
+ "actual_prompt_tokens",
+ "ALTER TABLE compression_analytics ADD COLUMN actual_prompt_tokens INTEGER"
+ );
+ addColumn(
+ "actual_completion_tokens",
+ "ALTER TABLE compression_analytics ADD COLUMN actual_completion_tokens INTEGER"
+ );
+ addColumn(
+ "actual_total_tokens",
+ "ALTER TABLE compression_analytics ADD COLUMN actual_total_tokens INTEGER"
+ );
+ addColumn(
+ "actual_cache_read_tokens",
+ "ALTER TABLE compression_analytics ADD COLUMN actual_cache_read_tokens INTEGER"
+ );
+ addColumn(
+ "actual_cache_write_tokens",
+ "ALTER TABLE compression_analytics ADD COLUMN actual_cache_write_tokens INTEGER"
+ );
+ addColumn(
+ "estimated_usd_saved",
+ "ALTER TABLE compression_analytics ADD COLUMN estimated_usd_saved REAL"
+ );
+ addColumn(
+ "mcp_description_tokens_saved",
+ "ALTER TABLE compression_analytics ADD COLUMN mcp_description_tokens_saved INTEGER DEFAULT 0"
+ );
+ addColumn(
+ "multimodal_skip_count",
+ "ALTER TABLE compression_analytics ADD COLUMN multimodal_skip_count INTEGER DEFAULT 0"
+ );
+ addColumn("receipt_source", "ALTER TABLE compression_analytics ADD COLUMN receipt_source TEXT");
+ addColumn(
+ "validation_fallback",
+ "ALTER TABLE compression_analytics ADD COLUMN validation_fallback INTEGER DEFAULT 0"
+ );
+ addColumn("output_mode", "ALTER TABLE compression_analytics ADD COLUMN output_mode TEXT");
+ addColumn(
+ "compression_combo_id",
+ "ALTER TABLE compression_analytics ADD COLUMN compression_combo_id TEXT"
+ );
+ addColumn("engine", "ALTER TABLE compression_analytics ADD COLUMN engine TEXT");
+ addColumn(
+ "rtk_raw_output_pointer",
+ "ALTER TABLE compression_analytics ADD COLUMN rtk_raw_output_pointer TEXT"
+ );
+ addColumn(
+ "rtk_raw_output_bytes",
+ "ALTER TABLE compression_analytics ADD COLUMN rtk_raw_output_bytes INTEGER"
+ );
+ columnsEnsuredForDb = db;
}
export function insertCompressionAnalyticsRow(row: CompressionAnalyticsRow): void {
const db = getDbInstance();
+ ensureCompressionAnalyticsColumns();
db.prepare(
`
- INSERT INTO compression_analytics (timestamp, combo_id, provider, mode, original_tokens, compressed_tokens, tokens_saved, duration_ms, request_id)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
+ INSERT INTO compression_analytics (
+ timestamp, combo_id, compression_combo_id, engine, provider, mode, original_tokens, compressed_tokens, tokens_saved,
+ duration_ms, request_id, actual_prompt_tokens, actual_completion_tokens,
+ actual_total_tokens, actual_cache_read_tokens, actual_cache_write_tokens,
+ estimated_usd_saved, mcp_description_tokens_saved, multimodal_skip_count,
+ receipt_source, validation_fallback, output_mode, rtk_raw_output_pointer, rtk_raw_output_bytes
+ )
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`
).run(
row.timestamp,
row.combo_id ?? null,
+ row.compression_combo_id ?? null,
+ row.engine ?? row.mode,
row.provider ?? null,
row.mode,
row.original_tokens,
row.compressed_tokens,
row.tokens_saved,
row.duration_ms ?? null,
- row.request_id ?? null
+ row.request_id ?? null,
+ row.actual_prompt_tokens ?? null,
+ row.actual_completion_tokens ?? null,
+ row.actual_total_tokens ?? null,
+ row.actual_cache_read_tokens ?? null,
+ row.actual_cache_write_tokens ?? null,
+ row.estimated_usd_saved ?? null,
+ row.mcp_description_tokens_saved ?? 0,
+ row.multimodal_skip_count ?? 0,
+ row.receipt_source ?? null,
+ row.validation_fallback ? 1 : 0,
+ row.output_mode ?? null,
+ row.rtk_raw_output_pointer ?? null,
+ row.rtk_raw_output_bytes ?? null
);
}
+export function attachCompressionUsageReceipt(
+ requestId: string | null | undefined,
+ usage: Record | null | undefined,
+ source: "provider" | "estimated" | "stream" = "provider"
+): void {
+ if (!requestId || !usage || typeof usage !== "object") return;
+ const promptTokens = toFiniteInt(usage.prompt_tokens);
+ const completionTokens = toFiniteInt(usage.completion_tokens);
+ const totalTokens =
+ toFiniteInt(usage.total_tokens) ?? (promptTokens ?? 0) + (completionTokens ?? 0);
+ const promptDetails =
+ usage.prompt_tokens_details && typeof usage.prompt_tokens_details === "object"
+ ? (usage.prompt_tokens_details as Record)
+ : {};
+ const cacheReadTokens = toFiniteInt(
+ usage.cache_read_input_tokens ?? usage.cached_tokens ?? promptDetails.cached_tokens
+ );
+ const cacheWriteTokens = toFiniteInt(
+ usage.cache_creation_input_tokens ?? promptDetails.cache_creation_tokens
+ );
+ if (promptTokens === null && completionTokens === null && totalTokens <= 0) return;
+
+ const db = getDbInstance();
+ ensureCompressionAnalyticsColumns();
+ db.prepare(
+ `
+ UPDATE compression_analytics
+ SET actual_prompt_tokens = ?,
+ actual_completion_tokens = ?,
+ actual_total_tokens = ?,
+ actual_cache_read_tokens = ?,
+ actual_cache_write_tokens = ?,
+ receipt_source = ?
+ WHERE request_id = ?
+ AND id = (
+ SELECT id FROM compression_analytics
+ WHERE request_id = ?
+ ORDER BY id DESC
+ LIMIT 1
+ )
+ `
+ ).run(
+ promptTokens,
+ completionTokens,
+ totalTokens,
+ cacheReadTokens,
+ cacheWriteTokens,
+ source,
+ requestId,
+ requestId
+ );
+}
+
+function toFiniteInt(value: unknown): number | null {
+ if (typeof value === "number" && Number.isFinite(value)) return Math.max(0, Math.floor(value));
+ if (typeof value === "string" && value.trim()) {
+ const parsed = Number(value);
+ if (Number.isFinite(parsed)) return Math.max(0, Math.floor(parsed));
+ }
+ return null;
+}
+
+function appendCondition(whereClause: string, condition: string): string {
+ return whereClause ? `${whereClause} AND ${condition}` : `WHERE ${condition}`;
+}
+
export function getCompressionAnalyticsSummary(since?: string): CompressionAnalyticsSummary {
const db = getDbInstance();
+ ensureCompressionAnalyticsColumns();
let cutoff: string | null = null;
if (since === "24h") {
@@ -88,6 +275,44 @@ export function getCompressionAnalyticsSummary(since?: string): CompressionAnaly
byMode[r.mode] = { count: r.cnt, tokensSaved: r.saved, avgSavingsPct: Math.round(r.avgPct) };
}
+ const engineRows = db
+ .prepare(
+ `
+ SELECT COALESCE(engine, mode) as engine, COUNT(*) as cnt, COALESCE(SUM(tokens_saved), 0) as saved,
+ COALESCE(AVG(CASE WHEN original_tokens > 0 THEN CAST(tokens_saved AS REAL) / original_tokens * 100 ELSE 0 END), 0) as avgPct
+ FROM compression_analytics ${whereClause}
+ GROUP BY COALESCE(engine, mode)
+ `
+ )
+ .all(...params) as Array<{ engine: string; cnt: number; saved: number; avgPct: number }>;
+
+ const byEngine: Record =
+ {};
+ for (const r of engineRows) {
+ byEngine[r.engine] = {
+ count: r.cnt,
+ tokensSaved: r.saved,
+ avgSavingsPct: Math.round(r.avgPct),
+ };
+ }
+
+ const compressionComboRows = db
+ .prepare(
+ `
+ SELECT compression_combo_id as compressionComboId, COUNT(*) as cnt,
+ COALESCE(SUM(tokens_saved), 0) as saved
+ FROM compression_analytics ${appendCondition(whereClause, "compression_combo_id IS NOT NULL")}
+ GROUP BY compression_combo_id ORDER BY cnt DESC
+ `
+ )
+ .all(...params) as Array<{ compressionComboId: string | null; cnt: number; saved: number }>;
+
+ const byCompressionCombo: Record = {};
+ for (const r of compressionComboRows) {
+ const key = r.compressionComboId ?? "unknown";
+ byCompressionCombo[key] = { count: r.cnt, tokensSaved: r.saved };
+ }
+
const provRows = db
.prepare(
`
@@ -136,13 +361,86 @@ export function getCompressionAnalyticsSummary(since?: string): CompressionAnaly
const last24h = Array.from(last24hMap.values());
+ const receiptRows = db
+ .prepare(
+ `
+ SELECT receipt_source as source, COUNT(*) as cnt,
+ COALESCE(SUM(actual_prompt_tokens), 0) as prompt,
+ COALESCE(SUM(actual_completion_tokens), 0) as completion,
+ COALESCE(SUM(actual_total_tokens), 0) as total,
+ COALESCE(SUM(actual_cache_read_tokens), 0) as cacheRead,
+ COALESCE(SUM(actual_cache_write_tokens), 0) as cacheWrite,
+ COALESCE(SUM(estimated_usd_saved), 0) as usdSaved
+ FROM compression_analytics ${appendCondition(whereClause, "receipt_source IS NOT NULL")}
+ GROUP BY receipt_source
+ `
+ )
+ .all(...params) as Array<{
+ source: string | null;
+ cnt: number;
+ prompt: number;
+ completion: number;
+ total: number;
+ cacheRead: number;
+ cacheWrite: number;
+ usdSaved: number;
+ }>;
+
+ const realUsage = {
+ requestsWithReceipts: 0,
+ promptTokens: 0,
+ completionTokens: 0,
+ totalTokens: 0,
+ cacheReadTokens: 0,
+ cacheWriteTokens: 0,
+ estimatedUsdSaved: 0,
+ bySource: {} as Record,
+ };
+ for (const row of receiptRows) {
+ const source = row.source ?? "unknown";
+ realUsage.requestsWithReceipts += row.cnt;
+ realUsage.promptTokens += row.prompt;
+ realUsage.completionTokens += row.completion;
+ realUsage.totalTokens += row.total;
+ realUsage.cacheReadTokens += row.cacheRead;
+ realUsage.cacheWriteTokens += row.cacheWrite;
+ realUsage.estimatedUsdSaved += row.usdSaved;
+ realUsage.bySource[source] = row.cnt;
+ }
+
+ const fallbackRow = db
+ .prepare(
+ `
+ SELECT COUNT(*) as cnt
+ FROM compression_analytics ${appendCondition(whereClause, "validation_fallback = 1")}
+ `
+ )
+ .get(...params) as { cnt: number } | undefined;
+
+ const mcpDescriptionRow = db
+ .prepare(
+ `
+ SELECT COUNT(*) as cnt, COALESCE(SUM(mcp_description_tokens_saved), 0) as saved
+ FROM compression_analytics ${appendCondition(whereClause, "mcp_description_tokens_saved > 0")}
+ `
+ )
+ .get(...params) as { cnt: number; saved: number } | undefined;
+
return {
totalRequests: scalar?.total ?? 0,
totalTokensSaved: scalar?.totalSaved ?? 0,
avgSavingsPct: Math.round(scalar?.avgPct ?? 0),
avgDurationMs: Math.round(scalar?.avgDur ?? 0),
byMode,
+ byEngine,
+ byCompressionCombo,
byProvider,
last24h,
+ validationFallbacks: fallbackRow?.cnt ?? 0,
+ realUsage,
+ mcpDescriptionCompression: {
+ snapshots: mcpDescriptionRow?.cnt ?? 0,
+ estimatedTokensSaved: mcpDescriptionRow?.saved ?? 0,
+ },
};
}
diff --git a/src/lib/db/compressionCombos.ts b/src/lib/db/compressionCombos.ts
new file mode 100644
index 0000000000..940cb3a908
--- /dev/null
+++ b/src/lib/db/compressionCombos.ts
@@ -0,0 +1,420 @@
+import { v4 as uuidv4 } from "uuid";
+import type { CompressionPipelineStep } from "@omniroute/open-sse/services/compression/types.ts";
+
+import { backupDbFile } from "./backup";
+import { getDbInstance, rowToCamel } from "./core";
+
+export interface CompressionCombo {
+ id: string;
+ name: string;
+ description: string;
+ pipeline: CompressionPipelineStep[];
+ languagePacks: string[];
+ outputMode: boolean;
+ outputModeIntensity: string;
+ isDefault: boolean;
+ createdAt: string;
+ updatedAt: string;
+}
+
+export interface CompressionComboAssignment {
+ id: string;
+ compressionComboId: string;
+ routingComboId: string;
+ createdAt: string;
+}
+
+type JsonRecord = Record;
+
+const DEFAULT_COMPRESSION_COMBO_ID = "default-caveman";
+const DEFAULT_COMPRESSION_COMBO_NAME = "Standard Savings";
+const DEFAULT_COMPRESSION_COMBO_DESCRIPTION = "Default RTK + Caveman compression pipeline";
+const LEGACY_DEFAULT_COMPRESSION_COMBO_DESCRIPTION = "Default Caveman compression pipeline";
+
+function defaultCompressionComboPipeline(): CompressionPipelineStep[] {
+ return [
+ { engine: "rtk", intensity: "standard" },
+ { engine: "caveman", intensity: "full" },
+ ];
+}
+
+function toRecord(value: unknown): JsonRecord {
+ return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {};
+}
+
+function parseJsonArray(value: unknown, fallback: T[]): T[] {
+ if (Array.isArray(value)) return value as T[];
+ if (typeof value !== "string") return fallback;
+ try {
+ const parsed = JSON.parse(value);
+ return Array.isArray(parsed) ? (parsed as T[]) : fallback;
+ } catch {
+ return fallback;
+ }
+}
+
+function normalizePipeline(value: unknown): CompressionPipelineStep[] {
+ return parseJsonArray(value, []).filter((step) => {
+ return (
+ step &&
+ typeof step === "object" &&
+ ["lite", "caveman", "aggressive", "ultra", "rtk"].includes(String(step.engine))
+ );
+ });
+}
+
+function normalizeLanguagePacks(value: unknown): string[] {
+ const packs = parseJsonArray(value, ["en"]).filter(
+ (pack): pack is string => typeof pack === "string" && pack.trim().length > 0
+ );
+ return [...new Set(packs.length > 0 ? packs.map((pack) => pack.trim()) : ["en"])];
+}
+
+function isLegacySeededDefaultPipeline(pipeline: CompressionPipelineStep[]): boolean {
+ if (pipeline.length !== 1) return false;
+ const [step] = pipeline;
+ return step.engine === "caveman" && (step.intensity === undefined || step.intensity === "full");
+}
+
+function upgradeLegacySeededDefaultCompressionCombo(): void {
+ const db = getDbInstance();
+ const row = db
+ .prepare("SELECT name, description, pipeline FROM compression_combos WHERE id = ?")
+ .get(DEFAULT_COMPRESSION_COMBO_ID) as
+ | { name?: string; description?: string; pipeline?: string }
+ | undefined;
+
+ if (!row) return;
+
+ const description = String(row.description ?? "");
+ const isSeededMetadata =
+ String(row.name ?? "") === DEFAULT_COMPRESSION_COMBO_NAME &&
+ (description === LEGACY_DEFAULT_COMPRESSION_COMBO_DESCRIPTION ||
+ description === DEFAULT_COMPRESSION_COMBO_DESCRIPTION);
+
+ if (!isSeededMetadata || !isLegacySeededDefaultPipeline(normalizePipeline(row.pipeline))) return;
+
+ db.prepare(
+ `
+ UPDATE compression_combos
+ SET description = ?, pipeline = ?, updated_at = ?
+ WHERE id = ?
+ `
+ ).run(
+ DEFAULT_COMPRESSION_COMBO_DESCRIPTION,
+ JSON.stringify(defaultCompressionComboPipeline()),
+ new Date().toISOString(),
+ DEFAULT_COMPRESSION_COMBO_ID
+ );
+}
+
+function ensureCompressionComboTables(): void {
+ const db = getDbInstance();
+ db.exec(`
+ CREATE TABLE IF NOT EXISTS compression_combos (
+ id TEXT PRIMARY KEY,
+ name TEXT NOT NULL,
+ description TEXT DEFAULT '',
+ pipeline TEXT NOT NULL DEFAULT '[]',
+ language_packs TEXT DEFAULT '["en"]',
+ output_mode INTEGER DEFAULT 0,
+ output_mode_intensity TEXT DEFAULT 'full',
+ is_default INTEGER DEFAULT 0,
+ created_at TEXT DEFAULT (datetime('now')),
+ updated_at TEXT DEFAULT (datetime('now'))
+ );
+
+ CREATE TABLE IF NOT EXISTS compression_combo_assignments (
+ id TEXT PRIMARY KEY,
+ compression_combo_id TEXT NOT NULL REFERENCES compression_combos(id) ON DELETE CASCADE,
+ routing_combo_id TEXT NOT NULL,
+ created_at TEXT DEFAULT (datetime('now')),
+ UNIQUE(routing_combo_id)
+ );
+
+ CREATE INDEX IF NOT EXISTS idx_compression_combos_default
+ ON compression_combos(is_default);
+ CREATE INDEX IF NOT EXISTS idx_compression_combo_assignments_combo
+ ON compression_combo_assignments(compression_combo_id);
+ CREATE INDEX IF NOT EXISTS idx_compression_combo_assignments_routing
+ ON compression_combo_assignments(routing_combo_id);
+ `);
+ db.prepare(
+ `
+ INSERT OR IGNORE INTO compression_combos (
+ id, name, description, pipeline, language_packs, output_mode, output_mode_intensity, is_default
+ )
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
+ `
+ ).run(
+ DEFAULT_COMPRESSION_COMBO_ID,
+ DEFAULT_COMPRESSION_COMBO_NAME,
+ DEFAULT_COMPRESSION_COMBO_DESCRIPTION,
+ JSON.stringify(defaultCompressionComboPipeline()),
+ JSON.stringify(["en"]),
+ 0,
+ "full",
+ 1
+ );
+ upgradeLegacySeededDefaultCompressionCombo();
+}
+
+function rowToCompressionCombo(row: unknown): CompressionCombo | null {
+ if (!row) return null;
+ const camel = rowToCamel(row as Record) as JsonRecord;
+ return {
+ id: String(camel.id),
+ name: String(camel.name ?? ""),
+ description: String(camel.description ?? ""),
+ pipeline: normalizePipeline(camel.pipeline),
+ languagePacks: normalizeLanguagePacks(camel.languagePacks),
+ outputMode: Boolean(camel.outputMode),
+ outputModeIntensity: String(camel.outputModeIntensity ?? "full"),
+ isDefault: Boolean(camel.isDefault),
+ createdAt: String(camel.createdAt ?? ""),
+ updatedAt: String(camel.updatedAt ?? ""),
+ };
+}
+
+function rowToAssignment(row: unknown): CompressionComboAssignment | null {
+ if (!row) return null;
+ const camel = rowToCamel(row as Record) as JsonRecord;
+ return {
+ id: String(camel.id),
+ compressionComboId: String(camel.compressionComboId),
+ routingComboId: String(camel.routingComboId),
+ createdAt: String(camel.createdAt ?? ""),
+ };
+}
+
+function buildComboPayload(data: Partial, existing?: CompressionCombo) {
+ const now = new Date().toISOString();
+ return {
+ id: existing?.id ?? data.id ?? uuidv4(),
+ name: data.name?.trim() || existing?.name || "Compression Combo",
+ description: data.description ?? existing?.description ?? "",
+ pipeline:
+ data.pipeline && data.pipeline.length > 0
+ ? data.pipeline
+ : existing?.pipeline && existing.pipeline.length > 0
+ ? existing.pipeline
+ : defaultCompressionComboPipeline(),
+ languagePacks:
+ data.languagePacks && data.languagePacks.length > 0
+ ? data.languagePacks
+ : existing?.languagePacks && existing.languagePacks.length > 0
+ ? existing.languagePacks
+ : ["en"],
+ outputMode: data.outputMode ?? existing?.outputMode ?? false,
+ outputModeIntensity: data.outputModeIntensity ?? existing?.outputModeIntensity ?? "full",
+ isDefault: data.isDefault ?? existing?.isDefault ?? false,
+ createdAt: existing?.createdAt ?? now,
+ updatedAt: now,
+ };
+}
+
+export function listCompressionCombos(): CompressionCombo[] {
+ ensureCompressionComboTables();
+ const db = getDbInstance();
+ return db
+ .prepare("SELECT * FROM compression_combos ORDER BY is_default DESC, name COLLATE NOCASE ASC")
+ .all()
+ .map(rowToCompressionCombo)
+ .filter((combo): combo is CompressionCombo => combo !== null);
+}
+
+export function getCompressionCombo(id: string): CompressionCombo | null {
+ ensureCompressionComboTables();
+ const row = getDbInstance().prepare("SELECT * FROM compression_combos WHERE id = ?").get(id);
+ return rowToCompressionCombo(row);
+}
+
+export function getDefaultCompressionCombo(): CompressionCombo | null {
+ ensureCompressionComboTables();
+ const row = getDbInstance()
+ .prepare(
+ "SELECT * FROM compression_combos WHERE is_default = 1 ORDER BY updated_at DESC LIMIT 1"
+ )
+ .get();
+ return rowToCompressionCombo(row);
+}
+
+export function createCompressionCombo(data: Partial): CompressionCombo {
+ ensureCompressionComboTables();
+ const db = getDbInstance();
+ const combo = buildComboPayload(data);
+ const tx = db.transaction(() => {
+ if (combo.isDefault) db.prepare("UPDATE compression_combos SET is_default = 0").run();
+ db.prepare(
+ `
+ INSERT INTO compression_combos (
+ id, name, description, pipeline, language_packs, output_mode, output_mode_intensity,
+ is_default, created_at, updated_at
+ )
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ `
+ ).run(
+ combo.id,
+ combo.name,
+ combo.description,
+ JSON.stringify(combo.pipeline),
+ JSON.stringify(combo.languagePacks),
+ combo.outputMode ? 1 : 0,
+ combo.outputModeIntensity,
+ combo.isDefault ? 1 : 0,
+ combo.createdAt,
+ combo.updatedAt
+ );
+ });
+ tx();
+ backupDbFile("pre-write");
+ return getCompressionCombo(combo.id) as CompressionCombo;
+}
+
+export function updateCompressionCombo(
+ id: string,
+ data: Partial
+): CompressionCombo | null {
+ ensureCompressionComboTables();
+ const existing = getCompressionCombo(id);
+ if (!existing) return null;
+ const combo = buildComboPayload(data, existing);
+ const db = getDbInstance();
+ const tx = db.transaction(() => {
+ if (combo.isDefault) db.prepare("UPDATE compression_combos SET is_default = 0").run();
+ db.prepare(
+ `
+ UPDATE compression_combos
+ SET name = ?, description = ?, pipeline = ?, language_packs = ?, output_mode = ?,
+ output_mode_intensity = ?, is_default = ?, updated_at = ?
+ WHERE id = ?
+ `
+ ).run(
+ combo.name,
+ combo.description,
+ JSON.stringify(combo.pipeline),
+ JSON.stringify(combo.languagePacks),
+ combo.outputMode ? 1 : 0,
+ combo.outputModeIntensity,
+ combo.isDefault ? 1 : 0,
+ combo.updatedAt,
+ id
+ );
+ });
+ tx();
+ backupDbFile("pre-write");
+ return getCompressionCombo(id);
+}
+
+export function deleteCompressionCombo(id: string): boolean {
+ ensureCompressionComboTables();
+ const existing = getCompressionCombo(id);
+ if (!existing || existing.isDefault) return false;
+ const result = getDbInstance().prepare("DELETE FROM compression_combos WHERE id = ?").run(id);
+ if (result.changes > 0) backupDbFile("pre-write");
+ return result.changes > 0;
+}
+
+export function setDefaultCompressionCombo(id: string): boolean {
+ ensureCompressionComboTables();
+ if (!getCompressionCombo(id)) return false;
+ const db = getDbInstance();
+ const now = new Date().toISOString();
+ db.transaction(() => {
+ db.prepare("UPDATE compression_combos SET is_default = 0").run();
+ db.prepare("UPDATE compression_combos SET is_default = 1, updated_at = ? WHERE id = ?").run(
+ now,
+ id
+ );
+ })();
+ backupDbFile("pre-write");
+ return true;
+}
+
+export function getAssignmentsForCompressionCombo(id: string): CompressionComboAssignment[] {
+ ensureCompressionComboTables();
+ return getDbInstance()
+ .prepare(
+ "SELECT * FROM compression_combo_assignments WHERE compression_combo_id = ? ORDER BY routing_combo_id"
+ )
+ .all(id)
+ .map(rowToAssignment)
+ .filter((assignment): assignment is CompressionComboAssignment => assignment !== null);
+}
+
+export function getCompressionComboForRoutingCombo(
+ routingComboId: string
+): CompressionCombo | null {
+ ensureCompressionComboTables();
+ const row = getDbInstance()
+ .prepare(
+ `
+ SELECT c.*
+ FROM compression_combos c
+ JOIN compression_combo_assignments a ON a.compression_combo_id = c.id
+ WHERE a.routing_combo_id = ?
+ LIMIT 1
+ `
+ )
+ .get(routingComboId);
+ return rowToCompressionCombo(row);
+}
+
+export function assignRoutingCombo(compressionComboId: string, routingComboId: string): boolean {
+ ensureCompressionComboTables();
+ if (!getCompressionCombo(compressionComboId) || !routingComboId.trim()) return false;
+ getDbInstance()
+ .prepare(
+ `
+ INSERT OR REPLACE INTO compression_combo_assignments (
+ id, compression_combo_id, routing_combo_id, created_at
+ )
+ VALUES (?, ?, ?, ?)
+ `
+ )
+ .run(uuidv4(), compressionComboId, routingComboId.trim(), new Date().toISOString());
+ backupDbFile("pre-write");
+ return true;
+}
+
+export function unassignRoutingCombo(compressionComboId: string, routingComboId: string): boolean {
+ ensureCompressionComboTables();
+ const result = getDbInstance()
+ .prepare(
+ "DELETE FROM compression_combo_assignments WHERE compression_combo_id = ? AND routing_combo_id = ?"
+ )
+ .run(compressionComboId, routingComboId);
+ if (result.changes > 0) backupDbFile("pre-write");
+ return result.changes > 0;
+}
+
+export function updateAssignments(compressionComboId: string, routingComboIds: string[]): boolean {
+ ensureCompressionComboTables();
+ if (!getCompressionCombo(compressionComboId)) return false;
+ const cleanedIds = [...new Set(routingComboIds.map((id) => id.trim()).filter(Boolean))];
+ const db = getDbInstance();
+ db.transaction(() => {
+ db.prepare("DELETE FROM compression_combo_assignments WHERE compression_combo_id = ?").run(
+ compressionComboId
+ );
+ if (cleanedIds.length > 0) {
+ const deleteExisting = db.prepare(
+ "DELETE FROM compression_combo_assignments WHERE routing_combo_id = ?"
+ );
+ const insert = db.prepare(
+ `
+ INSERT INTO compression_combo_assignments (
+ id, compression_combo_id, routing_combo_id, created_at
+ )
+ VALUES (?, ?, ?, ?)
+ `
+ );
+ for (const routingComboId of cleanedIds) {
+ deleteExisting.run(routingComboId);
+ insert.run(uuidv4(), compressionComboId, routingComboId, new Date().toISOString());
+ }
+ }
+ })();
+ backupDbFile("pre-write");
+ return true;
+}
diff --git a/src/lib/db/core.ts b/src/lib/db/core.ts
index 80d5a030b5..6d7ae9553e 100644
--- a/src/lib/db/core.ts
+++ b/src/lib/db/core.ts
@@ -232,6 +232,7 @@ const SCHEMA_SQL = `
tokens_cache_read INTEGER DEFAULT NULL,
tokens_cache_creation INTEGER DEFAULT NULL,
tokens_reasoning INTEGER DEFAULT NULL,
+ tokens_compressed INTEGER DEFAULT NULL,
cache_source TEXT DEFAULT "upstream",
request_type TEXT,
source_format TEXT,
@@ -787,6 +788,7 @@ function offloadLegacyCallLogDetails(db: SqliteDatabase) {
tokens_cache_read: number | null;
tokens_cache_creation: number | null;
tokens_reasoning: number | null;
+ tokens_compressed: number | null;
request_type: string | null;
source_format: string | null;
target_format: string | null;
@@ -838,7 +840,7 @@ function offloadLegacyCallLogDetails(db: SqliteDatabase) {
const tx = db.transaction(() => {
for (const row of pendingRows) {
const artifact: CallLogArtifact = {
- schemaVersion: 4,
+ schemaVersion: 5,
summary: {
id: row.id,
timestamp: row.timestamp || new Date().toISOString(),
@@ -857,6 +859,7 @@ function offloadLegacyCallLogDetails(db: SqliteDatabase) {
cacheRead: row.tokens_cache_read ?? null,
cacheWrite: row.tokens_cache_creation ?? null,
reasoning: row.tokens_reasoning ?? null,
+ compressed: row.tokens_compressed ?? null,
},
requestType: row.request_type || null,
sourceFormat: row.source_format || null,
diff --git a/src/lib/db/jsonMigration.ts b/src/lib/db/jsonMigration.ts
index b3128cdd9c..5e6e237485 100644
--- a/src/lib/db/jsonMigration.ts
+++ b/src/lib/db/jsonMigration.ts
@@ -12,6 +12,7 @@
*/
import type Database from "better-sqlite3";
+import { normalizeRoutingStrategy } from "@/shared/constants/routingStrategies";
type SqliteDatabase = InstanceType