diff --git a/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx b/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx
index eadae5ca44..33696fbd1d 100644
--- a/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx
+++ b/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx
@@ -33,6 +33,16 @@ export default function QuotaConceptCard() {
+
+
)}
@@ -50,3 +60,17 @@ function ConceptItem({ icon, text }: { icon: string; text: string }) {
);
}
+
+function ConceptItemWithDesc({ icon, title, desc }: { icon: string; title: string; desc: string }) {
+ return (
+
+
+ {icon}
+
+
+ {title}
+ {desc}
+
+
+ );
+}
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index 4e3bcd5e88..e8302601d5 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -7855,6 +7855,10 @@
"conceptBorrowing": "Borrowing: keys can consume free balance from others without breaching the cap",
"conceptGlobalCap": "Hard global cap: the provider's absolute limit is never exceeded",
"conceptWindows": "Windows: 5h, hourly, daily, weekly, monthly — each tracked independently",
+ "conceptKeyHowTitle": "Enabling a key for quota",
+ "conceptKeyHowDesc": "Create the key normally in the API Manager — it appears in the wizard's key step automatically. Tick Exclusive there to make it quota-only. No separate enable step.",
+ "conceptExclusiveTitle": "What \"Exclusive\" does",
+ "conceptExclusiveDesc": "An exclusive key only sees/uses the pool's quotaShared-* models — every other model is hidden from its /v1/models and blocked.",
"burnRateTitle": "Burn rate",
"burnRateExhaustsIn": "Exhausts in",
"dimensionResetIn": "Resets in",
diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json
index 5f04ca5e3d..32d5274cee 100644
--- a/src/i18n/messages/pt-BR.json
+++ b/src/i18n/messages/pt-BR.json
@@ -5365,6 +5365,10 @@
"conceptBorrowing": "Empréstimo: keys podem usar saldo livre de outras sem ultrapassar o teto",
"conceptGlobalCap": "Teto intransponível: o cap absoluto do provider nunca é excedido",
"conceptWindows": "Janelas: 5h, horária, diária, semanal, mensal — cada uma rastreada independentemente",
+ "conceptKeyHowTitle": "Habilitando uma key para cota",
+ "conceptKeyHowDesc": "Crie a key normalmente no Gerenciador de APIs — ela aparece automaticamente na etapa de keys do wizard. Marque Exclusiva lá para torná-la somente-cota. Não há etapa de ativação separada.",
+ "conceptExclusiveTitle": "O que \"Exclusiva\" faz",
+ "conceptExclusiveDesc": "Uma key exclusiva enxerga/usa apenas os modelos quotaShared-* do pool — todos os outros modelos ficam ocultos no seu /v1/models e bloqueados.",
"burnRateTitle": "Taxa de consumo",
"burnRateExhaustsIn": "Esgota em",
"dimensionResetIn": "Reset em",
diff --git a/tests/unit/quota-concept-card-i18n.test.ts b/tests/unit/quota-concept-card-i18n.test.ts
new file mode 100644
index 0000000000..024716f0fd
--- /dev/null
+++ b/tests/unit/quota-concept-card-i18n.test.ts
@@ -0,0 +1,12 @@
+import test from "node:test";
+import assert from "node:assert/strict";
+import en from "../../src/i18n/messages/en.json" with { type: "json" };
+import pt from "../../src/i18n/messages/pt-BR.json" with { type: "json" };
+
+const KEYS = ["conceptKeyHowTitle","conceptKeyHowDesc","conceptExclusiveTitle","conceptExclusiveDesc"];
+test("explanatory card i18n keys exist + parity", () => {
+ for (const k of KEYS) {
+ assert.equal(typeof (en as any).quotaShare[k], "string", `en missing ${k}`);
+ assert.equal(typeof (pt as any).quotaShare[k], "string", `pt missing ${k}`);
+ }
+});