fix: clarify free model training disclosure

This commit is contained in:
Josh Lambert
2026-06-03 11:10:13 -04:00
parent 916c2d539a
commit e356f068d4
26 changed files with 37 additions and 30 deletions
+3 -1
View File
@@ -1,6 +1,8 @@
---
"@kilocode/cli": patch
"@kilocode/kilo-jetbrains": patch
"kilo-code": patch
"@kilocode/kilo-ui": patch
---
Use a brain circuit icon for free-model data collection disclosures.
Clarify when free-model data may be used for training and identify it with a brain circuit icon.
@@ -145,7 +145,7 @@ model.picker.no.matches=No matching models
model.picker.favorite.add=Add to favorites
model.picker.favorite.remove=Remove from favorites
model.picker.free=Free
model.picker.dataCollected=Data collected
model.picker.dataCollected=Data may be used for training
model.picker.reset=Reset model to default
reasoning.picker.tooltip=Select reasoning effort
@@ -158,9 +158,9 @@ class ModelPickerTest : BasePlatformTestCase() {
picker.setItems(listOf(item("auto", "Auto Free", "kilo", "Kilo", free = true)))
assertFalse(picker.text.contains("Data collected"))
assertFalse(picker.text.contains("Data may be used for training"))
assertSame(ModelPickerIcons.DATA_COLLECTED, picker.icon)
assertEquals("Data collected", picker.toolTipText)
assertEquals("Data may be used for training", picker.toolTipText)
}
fun `test selected non-kilo free model does not indicate data collection`() {
@@ -282,7 +282,7 @@ class ModelPickerTest : BasePlatformTestCase() {
assertTrue(renderer.badgeVisible())
assertEquals("Free", renderer.badgeText())
assertTrue(renderer.warningVisible())
assertEquals("Data collected", renderer.warningTooltip())
assertEquals("Data may be used for training", renderer.warningTooltip())
}
fun `test renderer hides data collection warning for non-kilo free model`() {
@@ -98,12 +98,12 @@ describe("sanitizeName", () => {
describe("freeDataLabel", () => {
it("uses the data collection label without repeating free", () => {
expect(freeDataLabel("Free", "Data collected")).toBe("Data collected")
expect(freeDataLabel("Free", "Data may be used for training")).toBe("Data may be used for training")
})
})
describe("isDataCollectedModel", () => {
it("only marks free Kilo Gateway models as data collected", () => {
it("only marks free Kilo Gateway models with the training disclosure", () => {
expect(isDataCollectedModel({ providerID: KILO_GATEWAY_ID, isFree: true })).toBe(true)
expect(isDataCollectedModel({ providerID: "openrouter", isFree: true })).toBe(false)
expect(isDataCollectedModel({ providerID: KILO_GATEWAY_ID, isFree: false })).toBe(false)
+1 -1
View File
@@ -174,7 +174,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "تم فصل {{provider}}",
"provider.disconnect.toast.disconnected.description": "لم تعد نماذج {{provider}} متاحة.",
"model.tag.free": "مجاني",
"model.tag.dataCollected": "يتم جمع البيانات",
"model.tag.dataCollected": "قد تُستخدم البيانات للتدريب",
"model.tag.latest": "الأحدث",
"model.group.recommended": "موصى به",
"model.group.favorites": "المفضلة",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Os modelos de {{provider}} não estão mais disponíveis.",
"model.tag.free": "Grátis",
"model.tag.dataCollected": "Dados coletados",
"model.tag.dataCollected": "Os dados podem ser usados para treinamento",
"model.tag.latest": "Mais recente",
"model.group.recommended": "Recomendado",
"model.group.favorites": "Favoritos",
+1 -1
View File
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modeli više nisu dostupni.",
"model.tag.free": "Besplatno",
"model.tag.dataCollected": "Podaci se prikupljaju",
"model.tag.dataCollected": "Podaci se mogu koristiti za obuku",
"model.tag.latest": "Najnovije",
"model.group.recommended": "Preporučeno",
"model.group.favorites": "Favoriti",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke længere tilgængelige.",
"model.tag.free": "Gratis",
"model.tag.dataCollected": "Data indsamles",
"model.tag.dataCollected": "Data kan bruges til træning",
"model.tag.latest": "Nyeste",
"model.group.recommended": "Anbefalet",
"model.group.favorites": "Favoritter",
+1 -1
View File
@@ -179,7 +179,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} getrennt",
"provider.disconnect.toast.disconnected.description": "Die {{provider}}-Modelle sind nicht mehr verfügbar.",
"model.tag.free": "Kostenlos",
"model.tag.dataCollected": "Daten erfasst",
"model.tag.dataCollected": "Daten können für das Training verwendet werden",
"model.tag.latest": "Neueste",
"model.group.recommended": "Empfohlen",
"model.group.favorites": "Favoriten",
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} models are no longer available.",
"model.tag.free": "Free",
"model.tag.dataCollected": "Data collected",
"model.tag.dataCollected": "Data may be used for training",
"model.tag.latest": "Latest",
"model.group.recommended": "Recommended",
"model.group.favorites": "Favorites",
+1 -1
View File
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
"model.tag.free": "Gratis",
"model.tag.dataCollected": "Datos recopilados",
"model.tag.dataCollected": "Los datos pueden utilizarse para entrenamiento",
"model.tag.latest": "Último",
"model.group.recommended": "Recomendado",
"model.group.favorites": "Favoritos",
+1 -1
View File
@@ -177,7 +177,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} déconnecté",
"provider.disconnect.toast.disconnected.description": "Les modèles {{provider}} ne sont plus disponibles.",
"model.tag.free": "Gratuit",
"model.tag.dataCollected": "Données collectées",
"model.tag.dataCollected": "Les données peuvent être utilisées pour lentraînement",
"model.tag.latest": "Dernier",
"model.group.recommended": "Recommandé",
"model.group.favorites": "Favoris",
+1 -1
View File
@@ -151,7 +151,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} disconnesso",
"provider.disconnect.toast.disconnected.description": "I modelli {{provider}} non sono più disponibili.",
"model.tag.free": "Gratis",
"model.tag.dataCollected": "Dati raccolti",
"model.tag.dataCollected": "I dati possono essere utilizzati per l'addestramento",
"model.tag.latest": "Più recente",
"model.group.recommended": "Consigliati",
"model.group.favorites": "Preferiti",
+1 -1
View File
@@ -174,7 +174,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}}が切断されました",
"provider.disconnect.toast.disconnected.description": "{{provider}}のモデルは利用できなくなりました。",
"model.tag.free": "無料",
"model.tag.dataCollected": "データ収集あり",
"model.tag.dataCollected": "データがトレーニングに使用される場合があります",
"model.tag.latest": "最新",
"model.group.recommended": "推奨",
"model.group.favorites": "お気に入り",
+1 -1
View File
@@ -178,7 +178,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 연결 해제됨",
"provider.disconnect.toast.disconnected.description": "{{provider}} 모델을 더 이상 사용할 수 없습니다.",
"model.tag.free": "무료",
"model.tag.dataCollected": "데이터 수집됨",
"model.tag.dataCollected": "데이터가 학습에 사용될 수 있습니다",
"model.tag.latest": "최신",
"model.group.recommended": "추천",
"model.group.favorites": "즐겨찾기",
+1 -1
View File
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modellen zijn niet langer beschikbaar.",
"model.tag.free": "Gratis",
"model.tag.dataCollected": "Gegevens verzameld",
"model.tag.dataCollected": "Gegevens kunnen worden gebruikt voor training",
"model.tag.latest": "Nieuwste",
"model.group.recommended": "Aanbevolen",
"model.group.favorites": "Favorieten",
+1 -1
View File
@@ -178,7 +178,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke lenger tilgjengelige.",
"model.tag.free": "Gratis",
"model.tag.dataCollected": "Data samles inn",
"model.tag.dataCollected": "Data kan brukes til trening",
"model.tag.latest": "Nyeste",
"model.group.recommended": "Anbefalt",
"model.group.favorites": "Favoritter",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "Rozłączono {{provider}}",
"provider.disconnect.toast.disconnected.description": "Modele {{provider}} nie są już dostępne.",
"model.tag.free": "Darmowy",
"model.tag.dataCollected": "Dane zbierane",
"model.tag.dataCollected": "Dane mogą być wykorzystywane do trenowania",
"model.tag.latest": "Najnowszy",
"model.group.recommended": "Zalecane",
"model.group.favorites": "Ulubione",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} отключён",
"provider.disconnect.toast.disconnected.description": "Модели {{provider}} больше недоступны.",
"model.tag.free": "Бесплатно",
"model.tag.dataCollected": "Данные собираются",
"model.tag.dataCollected": "Данные могут использоваться для обучения",
"model.tag.latest": "Последняя",
"model.group.recommended": "Рекомендуемые",
"model.group.favorites": "Избранное",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "โมเดล {{provider}} ไม่พร้อมใช้งานอีกต่อไป",
"model.tag.free": "ฟรี",
"model.tag.dataCollected": "มีการเก็บข้อมูล",
"model.tag.dataCollected": "ข้อมูลอาจถูกนำไปใช้ในการฝึก",
"model.tag.latest": "ล่าสุด",
"model.group.recommended": "แนะนำ",
"model.group.favorites": "รายการโปรด",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modelleri artık kullanılabilir değil.",
"model.tag.free": "Ücretsiz",
"model.tag.dataCollected": "Veri toplanır",
"model.tag.dataCollected": "Veriler eğitim için kullanılabilir",
"model.tag.latest": "En yeni",
"model.group.recommended": "Önerilen",
"model.group.favorites": "Favoriler",
+1 -1
View File
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "Моделі {{provider}} більше недоступні.",
"model.tag.free": "Безкоштовно",
"model.tag.dataCollected": "Дані збираються",
"model.tag.dataCollected": "Дані можуть використовуватися для навчання",
"model.tag.latest": "Остання",
"model.group.recommended": "Рекомендовані",
"model.group.favorites": "Обране",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 已断开连接",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免费",
"model.tag.dataCollected": "已收集数据",
"model.tag.dataCollected": "数据可能会用于训练",
"model.tag.latest": "最新",
"model.group.recommended": "推荐",
"model.group.favorites": "收藏夹",
+1 -1
View File
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 已中斷連線",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免費",
"model.tag.dataCollected": "已收集資料",
"model.tag.dataCollected": "資料可能會用於訓練",
"model.tag.latest": "最新",
"model.group.recommended": "推薦",
"model.group.favorites": "我的最愛",
@@ -1,6 +1,6 @@
export const FreeModelDisclosure = {
label: "Data collected",
panel: "Free - data collected",
label: "May train",
panel: "Free - may train",
collectsData(model: { isFree?: boolean; api?: { npm?: string } }): boolean {
return model.isFree === true && model.api?.npm === "@kilocode/kilo-gateway"
},
@@ -2,7 +2,12 @@ import { describe, expect, test } from "bun:test"
import { FreeModelDisclosure } from "../../src/kilocode/components/free-model-disclosure"
describe("FreeModelDisclosure", () => {
test("only Kilo Gateway free models collect data", () => {
test("uses compact CLI labels", () => {
expect(FreeModelDisclosure.label).toBe("May train")
expect(FreeModelDisclosure.panel).toBe("Free - may train")
})
test("only Kilo Gateway free models get the training disclosure", () => {
expect(
FreeModelDisclosure.collectsData({
isFree: true,