diff --git a/package-lock.json b/package-lock.json index 12bd2d8f95..0e90a983ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10697,6 +10697,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -15527,9 +15528,9 @@ } }, "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.0.tgz", + "integrity": "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg==", "license": "MIT", "funding": { "type": "opencollective", diff --git a/package.json b/package.json index c433f0f8ae..e81c13254e 100644 --- a/package.json +++ b/package.json @@ -161,6 +161,7 @@ ] }, "overrides": { - "dompurify": "^3.3.2" + "dompurify": "^3.3.2", + "path-to-regexp": "^8.4.0" } } diff --git a/src/app/(dashboard)/dashboard/cache/page.tsx b/src/app/(dashboard)/dashboard/cache/page.tsx new file mode 100644 index 0000000000..eaa51e4ad6 --- /dev/null +++ b/src/app/(dashboard)/dashboard/cache/page.tsx @@ -0,0 +1,340 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Card, Button, EmptyState } from "@/shared/components"; +import { useNotificationStore } from "@/store/notificationStore"; +import { useTranslations } from "next-intl"; + +// ─── Types ─────────────────────────────────────────────────────────────────── + +interface SemanticCacheStats { + memoryEntries: number; + dbEntries: number; + hits: number; + misses: number; + hitRate: string; + tokensSaved: number; +} + +interface IdempotencyStats { + activeKeys: number; + windowMs: number; +} + +interface CacheStats { + semanticCache: SemanticCacheStats; + idempotency: IdempotencyStats; +} + +// ─── Sub-components ────────────────────────────────────────────────────────── + +function StatCard({ + icon, + label, + value, + sub, + valueClass = "text-text", +}: { + icon: string; + label: string; + value: string | number; + sub?: string; + valueClass?: string; +}) { + return ( +
+
+ + {label} +
+
{value}
+ {sub &&
{sub}
} +
+ ); +} + +function HitRateBar({ hitRate, label }: { hitRate: number; label: string }) { + const colorClass = hitRate >= 70 ? "bg-green-500" : hitRate >= 40 ? "bg-amber-400" : "bg-red-500"; + const textClass = + hitRate >= 70 ? "text-green-500" : hitRate >= 40 ? "text-amber-400" : "text-red-500"; + + return ( +
+
+ {label} + {hitRate.toFixed(1)}% +
+
+
+
+
+ ); +} + +function InfoRow({ icon, children }: { icon: string; children: React.ReactNode }) { + return ( +
+ + {children} +
+ ); +} + +// ─── Page ──────────────────────────────────────────────────────────────────── + +const REFRESH_INTERVAL_MS = 10_000; +const REFRESH_INTERVAL_SECONDS = REFRESH_INTERVAL_MS / 1000; + +export default function CachePage() { + const t = useTranslations("cache"); + const [stats, setStats] = useState(null); + const [loading, setLoading] = useState(true); + const [clearing, setClearing] = useState(false); + const notify = useNotificationStore(); + + const fetchStats = useCallback(async () => { + try { + const res = await fetch("/api/cache"); + if (res.ok) { + const data: CacheStats = await res.json(); + setStats(data); + } + } catch (error) { + // Network error — keep stale stats rather than clearing the UI + console.error("[CachePage] Failed to fetch cache stats:", error); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + void fetchStats(); + const id = setInterval(() => void fetchStats(), REFRESH_INTERVAL_MS); + return () => clearInterval(id); + }, [fetchStats]); + + const handleClearAll = async () => { + setClearing(true); + try { + const res = await fetch("/api/cache", { method: "DELETE" }); + if (res.ok) { + const data = await res.json(); + notify.add({ + type: "success", + message: t("clearSuccess", { count: data.expiredRemoved ?? 0 }), + }); + await fetchStats(); + } else { + notify.add({ type: "error", message: t("clearError") }); + } + } catch (error) { + console.error("[CachePage] Failed to clear cache:", error); + notify.add({ type: "error", message: t("clearError") }); + } finally { + setClearing(false); + } + }; + + const sc = stats?.semanticCache; + const idp = stats?.idempotency; + const hitRate = sc ? parseFloat(sc.hitRate) : 0; + const totalRequests = sc ? sc.hits + sc.misses : 0; + + return ( +
+ {/* Header */} +
+
+

{t("title")}

+

{t("description")}

+
+
+ + +
+
+ + {/* Loading skeleton */} + {loading && ( +
+ {Array.from({ length: 4 }).map((_, i) => ( +
+ ))} +
+ )} + + {/* Error / empty state */} + {!loading && !stats && ( + void fetchStats()} + /> + )} + + {/* Main content */} + {!loading && stats && ( + <> + {/* Stats grid */} +
+ + + + +
+ + {/* Hit rate + breakdown */} + +
+
+

{t("performance")}

+ + {t("autoRefresh", { seconds: REFRESH_INTERVAL_SECONDS })} + +
+ +
+
+
+ {sc?.hits ?? 0} +
+
{t("hits")}
+
+
+
+ {sc?.misses ?? 0} +
+
{t("misses")}
+
+
+
{totalRequests}
+
{t("total")}
+
+
+
+
+ + {/* Cache behavior */} + +
+

{t("behavior")}

+
+ {t("behaviorDeterministic")} + + {t.rich("behaviorBypass", { + header: () => ( + + X-OmniRoute-No-Cache: true + + ), + })} + + {t("behaviorTwoTier")} + + {t.rich("behaviorTtl", { + envVar: () => ( + + SEMANTIC_CACHE_TTL_MS + + ), + })} + +
+
+
+ + {/* Idempotency */} + +
+
+ +

{t("idempotency")}

+
+
+
+
{idp?.activeKeys ?? 0}
+
{t("activeDedupKeys")}
+
+
+
+ {idp ? `${(idp.windowMs / 1000).toFixed(0)}s` : "—"} +
+
{t("dedupWindow")}
+
+
+
+
+ + )} +
+ ); +} diff --git a/src/app/api/cache/route.ts b/src/app/api/cache/route.ts index 2d759f351f..ebb02dc2f4 100644 --- a/src/app/api/cache/route.ts +++ b/src/app/api/cache/route.ts @@ -1,7 +1,18 @@ -import { NextResponse } from "next/server"; -import { getCacheStats, clearCache, cleanExpiredEntries } from "@/lib/semanticCache"; +import { NextRequest, NextResponse } from "next/server"; +import { + getCacheStats, + clearCache, + cleanExpiredEntries, + invalidateByModel, + invalidateBySignature, + invalidateStale, +} from "@/lib/semanticCache"; import { getIdempotencyStats } from "@/lib/idempotencyLayer"; +function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + /** * GET /api/cache — Cache statistics */ @@ -15,19 +26,67 @@ export async function GET() { idempotency: idempotencyStats, }); } catch (error) { - return NextResponse.json({ error: error.message }, { status: 500 }); + return NextResponse.json({ error: errorMessage(error) }, { status: 500 }); } } /** - * DELETE /api/cache — Clear all caches + * DELETE /api/cache — Clear all caches or targeted invalidation. + * + * Exactly one optional query parameter may be provided: + * ?model= — invalidate all entries for a specific model + * ?signature= — invalidate a single entry by its SHA-256 signature + * ?staleMs= — invalidate entries older than N milliseconds + * (no params) — clear all cache entries + * + * Providing more than one parameter returns 400 Bad Request. */ -export async function DELETE() { +export async function DELETE(req: NextRequest) { try { + const { searchParams } = new URL(req.url); + const model = searchParams.get("model"); + const signature = searchParams.get("signature"); + const staleMsParam = searchParams.get("staleMs"); + + // Enforce mutual exclusivity — only one invalidation mode per request + const paramCount = [model, signature, staleMsParam].filter(Boolean).length; + if (paramCount > 1) { + return NextResponse.json( + { + error: + "Only one invalidation parameter (model, signature, or staleMs) may be provided per request.", + }, + { status: 400 } + ); + } + + if (model) { + const removed = invalidateByModel(model); + return NextResponse.json({ ok: true, invalidated: removed, scope: "model", model }); + } + + if (signature) { + const removed = invalidateBySignature(signature); + return NextResponse.json({ ok: true, invalidated: removed ? 1 : 0, scope: "signature" }); + } + + if (staleMsParam) { + const maxAgeMs = parseInt(staleMsParam, 10); + if (Number.isNaN(maxAgeMs) || maxAgeMs <= 0) { + return NextResponse.json( + { error: "staleMs must be a positive integer (milliseconds)." }, + { status: 400 } + ); + } + const removed = invalidateStale(maxAgeMs); + return NextResponse.json({ ok: true, invalidated: removed, scope: "stale", maxAgeMs }); + } + + // Full clear clearCache(); - const cleaned = cleanExpiredEntries(); - return NextResponse.json({ ok: true, expiredRemoved: cleaned }); + const expiredRemoved = cleanExpiredEntries(); + return NextResponse.json({ ok: true, expiredRemoved, scope: "all" }); } catch (error) { - return NextResponse.json({ error: error.message }, { status: 500 }); + return NextResponse.json({ error: errorMessage(error) }, { status: 500 }); } } diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index f83044ce85..c32e7a8e93 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -185,7 +185,9 @@ "agents": "وكلاء", "cliToolsShort": "أدوات", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "المواضيع", @@ -2847,5 +2849,37 @@ "userInitial": "انا بحاجة الى مساعدة مع", "userFollowUp": "هل يمكنك توضيح ذلك؟" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index 0fa7a693a0..b6c4878290 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -185,7 +185,9 @@ "agents": "Агенти", "cliToolsShort": "Инструменти", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Теми", @@ -2847,5 +2849,37 @@ "userInitial": "Имам нужда от помощ за", "userFollowUp": "Можете ли да разкажете по-подробно за това?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index fe874c5e17..702fd2b320 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -185,7 +185,9 @@ "themeViolet": "Fialová", "themeOrange": "Oranžová", "themeCyan": "Azurová", - "cliToolsShort": "Nástroje" + "cliToolsShort": "Nástroje", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Motivy", @@ -2847,5 +2849,37 @@ "userInitial": "Potřebuji pomoct", "userFollowUp": "Můžete to upřesnit?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index 93ccc43bc4..47515358d6 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -185,7 +185,9 @@ "agents": "Agenter", "cliToolsShort": "Værktøjer", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Temaer", @@ -2847,5 +2849,37 @@ "userInitial": "Jeg har brug for hjælp til", "userFollowUp": "Kan du uddybe det?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index ae5d22a5ef..393c1c34fd 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -185,7 +185,9 @@ "agents": "Agenten", "cliToolsShort": "Werkzeuge", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themen", @@ -2847,5 +2849,37 @@ "userInitial": "Ich brauche Hilfe dabei", "userFollowUp": "Können Sie das näher erläutern?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 6e11c136c2..c5b3d79207 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -185,7 +185,9 @@ "themeViolet": "Violet", "themeOrange": "Orange", "themeCyan": "Cyan", - "cliToolsShort": "Tools" + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2849,5 +2851,37 @@ "userInitial": "I need help with", "userFollowUp": "Can you elaborate on that?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "memoryEntriesSub": "In-memory LRU", + "dbEntries": "DB Entries", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHits": "Cache Hits", + "cacheHitsSub": "of {total} total", + "tokensSaved": "Tokens Saved", + "tokensSavedSub": "Estimated from hits", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behavior": "Cache Behavior", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "idempotency": "Idempotency Layer", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running." } } diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index ac9164c944..19a9488af0 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -185,7 +185,9 @@ "agents": "Agentes", "cliToolsShort": "Herramientas", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Temas", @@ -2847,5 +2849,37 @@ "userInitial": "necesito ayuda con", "userFollowUp": "¿Puedes dar más detalles sobre eso?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index 07a26af0f0..f27bb8c497 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -185,7 +185,9 @@ "agents": "Agentit", "cliToolsShort": "Työkalut", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Teemat", @@ -2847,5 +2849,37 @@ "userInitial": "Tarvitsen apua", "userFollowUp": "Voitko tarkentaa sitä?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index deaf426564..273e04c4e0 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -185,7 +185,9 @@ "agents": "Agents", "cliToolsShort": "Outils", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Thèmes", @@ -2847,5 +2849,37 @@ "userInitial": "J'ai besoin d'aide pour", "userFollowUp": "Pouvez-vous développer cela ?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 66d7eb9958..2654c8f598 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -185,7 +185,9 @@ "agents": "סוכנים", "cliToolsShort": "כלים", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "אני צריך עזרה עם", "userFollowUp": "אתה יכול לפרט על זה?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 3fe453e86f..e8713cf7aa 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -107,7 +107,9 @@ "agents": "एजेंट", "cliToolsShort": "उपकरण", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2689,5 +2691,37 @@ "domainPlaceholder": "example.com", "requestTimedOut": "Request timed out ({seconds}s)", "networkError": "Network error" + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index 713c66e87d..5dcb1dcd22 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -185,7 +185,9 @@ "agents": "Ügynökök", "cliToolsShort": "Eszközök", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Témák", @@ -2847,5 +2849,37 @@ "userInitial": "Segítségre van szükségem", "userFollowUp": "Kifejtenéd ezt bővebben?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index 17182baa20..5a842d263e 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -185,7 +185,9 @@ "agents": "Agen", "cliToolsShort": "Alat", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Saya butuh bantuan", "userFollowUp": "Bisakah Anda menjelaskannya lebih lanjut?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json index 556ec1db53..b71c764458 100644 --- a/src/i18n/messages/in.json +++ b/src/i18n/messages/in.json @@ -185,7 +185,9 @@ "themeViolet": "बैंगनी", "themeOrange": "नारंगी", "themeCyan": "सियान", - "cliToolsShort": "उपकरण" + "cliToolsShort": "उपकरण", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "थीम्स", @@ -2843,5 +2845,37 @@ "userInitial": "मुझे मदद चाहिए", "userFollowUp": "क्या आप इसके बारे में विस्तार से बता सकते हैं?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 7522e01614..0a8a1b7b71 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -185,7 +185,9 @@ "agents": "Agenti", "cliToolsShort": "Strumenti", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Ho bisogno di aiuto con", "userFollowUp": "Puoi approfondire questo argomento?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 8562a0940e..e95de736a7 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -185,7 +185,9 @@ "agents": "エージェント", "cliToolsShort": "ツール", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "助けが必要です", "userFollowUp": "それについて詳しく教えてもらえますか?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 3ce258c5b9..8bf5e6f603 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -185,7 +185,9 @@ "agents": "에이전트", "cliToolsShort": "도구", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "도움이 필요해요", "userFollowUp": "그것에 대해 자세히 설명해주실 수 있나요?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index d0eec9f859..65ee78cbb3 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -185,7 +185,9 @@ "agents": "Ejen", "cliToolsShort": "Alat", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Saya perlukan bantuan", "userFollowUp": "Bolehkah anda menghuraikan perkara itu?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index e5ac8c15ac..6d4091a272 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -185,7 +185,9 @@ "agents": "Agenten", "cliToolsShort": "Gereedschap", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Ik heb hulp nodig bij", "userFollowUp": "Kunt u dat nader toelichten?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index 913273accb..83f6fa6531 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -185,7 +185,9 @@ "agents": "Agenter", "cliToolsShort": "Verktøy", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Jeg trenger hjelp med", "userFollowUp": "Kan du utdype det?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index cd75715b22..1a52ab7911 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -185,7 +185,9 @@ "agents": "Mga Agent", "cliToolsShort": "Mga Tool", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Kailangan ko ng tulong sa", "userFollowUp": "Maaari mo bang ipaliwanag iyon?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 912782ac93..ba10dfdc41 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -185,7 +185,9 @@ "agents": "Agenci", "cliToolsShort": "Narzędzia", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Potrzebuję pomocy", "userFollowUp": "Możesz to rozwinąć?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 247e6815bb..9580eb8410 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -185,7 +185,9 @@ "playground": "Playground", "agents": "Agentes", "cliToolsShort": "Ferramentas", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2865,5 +2867,37 @@ "userInitial": "preciso de ajuda com", "userFollowUp": "Você pode explicar isso?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 56c17b371c..06f9ca808f 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -185,7 +185,9 @@ "agents": "Agentes", "cliToolsShort": "Ferramentas", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "preciso de ajuda com", "userFollowUp": "Você pode explicar isso?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 094ffb737d..724d4773d7 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -185,7 +185,9 @@ "agents": "Agenți", "cliToolsShort": "Instrumente", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Am nevoie de ajutor cu", "userFollowUp": "Puteți detalia asta?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 0051c1f4d8..de34de5cda 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -185,7 +185,9 @@ "agents": "Агенты", "cliToolsShort": "Инструменты", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Темы", @@ -2847,5 +2849,37 @@ "userInitial": "мне нужна помощь с", "userFollowUp": "Можете ли вы рассказать об этом подробнее?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index 4d09320aa5..ecd64092f4 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -185,7 +185,9 @@ "agents": "Agenti", "cliToolsShort": "Nástroje", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Potrebujem pomoc s", "userFollowUp": "Môžete to upresniť?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 47647d700e..faa78450da 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -185,7 +185,9 @@ "agents": "Agenter", "cliToolsShort": "Verktyg", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Jag behöver hjälp med", "userFollowUp": "Kan du utveckla det?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 638536fdf0..65d0d1cdfb 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -185,7 +185,9 @@ "agents": "เอเจนต์", "cliToolsShort": "เครื่องมือ", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "ธีมส์", @@ -2847,5 +2849,37 @@ "userInitial": "ฉันต้องการความช่วยเหลือเกี่ยวกับ", "userFollowUp": "คุณช่วยอธิบายรายละเอียดเกี่ยวกับเรื่องนั้นได้ไหม?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index e284cb6a17..03bf90b266 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -185,7 +185,9 @@ "agents": "Агенти", "cliToolsShort": "Інструменти", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Мені потрібна допомога з", "userFollowUp": "Чи можете ви розповісти про це?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index 60272e01be..d0ea7b6160 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -185,7 +185,9 @@ "agents": "Tác nhân", "cliToolsShort": "Công cụ", "autoCombo": "Auto Combo", - "searchTools": "Search Tools" + "searchTools": "Search Tools", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "Themes", @@ -2847,5 +2849,37 @@ "userInitial": "Tôi cần giúp đỡ với", "userFollowUp": "Bạn có thể giải thích về điều đó?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index f2dcc08de7..44ea4b62cb 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -185,7 +185,9 @@ "themeViolet": "紫罗兰", "themeOrange": "橙色", "themeCyan": "青色", - "cliToolsShort": "工具" + "cliToolsShort": "工具", + "cache": "Cache", + "cacheShort": "Cache" }, "themesPage": { "title": "主题", @@ -2843,5 +2845,37 @@ "userInitial": "我需要帮助来处理", "userFollowUp": "你可以再详细说明一下吗?" } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor and manage semantic response cache, hit rates, and token savings.", + "refresh": "Refresh", + "clearAll": "Clear All", + "memoryEntries": "Memory Entries", + "dbEntries": "DB Entries", + "cacheHits": "Cache Hits", + "tokensSaved": "Tokens Saved", + "hitRate": "Hit Rate", + "performance": "Cache Performance", + "behavior": "Cache Behavior", + "idempotency": "Idempotency Layer", + "clearSuccess": "Cache cleared. {count} expired entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "memoryEntriesSub": "In-memory LRU", + "dbEntriesSub": "Persisted (SQLite)", + "cacheHitsSub": "of {total} total", + "tokensSavedSub": "Estimated from hits", + "autoRefresh": "Auto-refreshes every {seconds}s", + "hits": "Hits", + "misses": "Misses", + "total": "Total", + "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", + "behaviorBypass": "Bypass with header {header}.", + "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", + "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", + "activeDedupKeys": "Active Dedup Keys", + "dedupWindow": "Dedup Window" } } diff --git a/src/shared/components/Sidebar.tsx b/src/shared/components/Sidebar.tsx index 74dc85b895..24165899dc 100644 --- a/src/shared/components/Sidebar.tsx +++ b/src/shared/components/Sidebar.tsx @@ -21,6 +21,7 @@ const navItemDefs = [ { href: "/dashboard/costs", i18nKey: "costs", icon: "account_balance_wallet" }, { href: "/dashboard/analytics", i18nKey: "analytics", icon: "analytics" }, { href: "/dashboard/limits", i18nKey: "limits", icon: "tune" }, + { href: "/dashboard/cache", i18nKey: "cache", icon: "cached" }, ]; const cliItemDefs = [