Spaces:
Running
Running
Upload 28 files
Browse files- index.html +5 -5
- kimi-js/kimi-module.js +21 -3
- kimi-js/kimi-script.js +40 -10
- kimi-locale/de.json +1 -0
- kimi-locale/en.json +2 -1
- kimi-locale/es.json +1 -0
- kimi-locale/fr.json +2 -1
- kimi-locale/it.json +1 -0
- kimi-locale/ja.json +1 -0
- kimi-locale/zh.json +1 -0
index.html
CHANGED
@@ -419,9 +419,9 @@
|
|
419 |
<div class="inline-row">
|
420 |
<button class="kimi-button" id="test-api"><i class="fas fa-wifi"></i> Test API
|
421 |
Key</button>
|
422 |
-
<span id="api-key-presence-test" class="presence-dot" aria-label="API
|
423 |
-
data-i18n-title="
|
424 |
-
title="Green = API
|
425 |
<span id="api-status" role="status" aria-live="polite"></span>
|
426 |
</div>
|
427 |
</div>
|
@@ -791,8 +791,8 @@
|
|
791 |
<i class="fas fa-coffee"></i>
|
792 |
<span>Ko-fi</span>
|
793 |
</a>
|
794 |
-
<a href="https://www.youtube.com/@VirtualKimi" target="_blank"
|
795 |
-
class="creator-link">
|
796 |
<i class="fab fa-youtube"></i>
|
797 |
<span>Youtube</span>
|
798 |
</a>
|
|
|
419 |
<div class="inline-row">
|
420 |
<button class="kimi-button" id="test-api"><i class="fas fa-wifi"></i> Test API
|
421 |
Key</button>
|
422 |
+
<span id="api-key-presence-test" class="presence-dot" aria-label="API test status"
|
423 |
+
data-i18n-title="api_key_test_hint"
|
424 |
+
title="Green = API connectivity verified. Grey = not tested or failed."></span>
|
425 |
<span id="api-status" role="status" aria-live="polite"></span>
|
426 |
</div>
|
427 |
</div>
|
|
|
791 |
<i class="fas fa-coffee"></i>
|
792 |
<span>Ko-fi</span>
|
793 |
</a>
|
794 |
+
<a href="https://www.youtube.com/@VirtualKimi" target="_blank"
|
795 |
+
rel="noopener noreferrer" class="creator-link">
|
796 |
<i class="fab fa-youtube"></i>
|
797 |
<span>Youtube</span>
|
798 |
</a>
|
kimi-js/kimi-module.js
CHANGED
@@ -898,14 +898,32 @@ async function loadSettingsData() {
|
|
898 |
|
899 |
// Update API key input
|
900 |
const apiKeyInput = document.getElementById("openrouter-api-key");
|
901 |
-
if (apiKeyInput)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
902 |
const providerSelect = document.getElementById("llm-provider");
|
903 |
if (providerSelect) providerSelect.value = provider;
|
904 |
const baseUrlInput = document.getElementById("llm-base-url");
|
905 |
if (baseUrlInput) baseUrlInput.value = baseUrl;
|
906 |
const modelIdInput = document.getElementById("llm-model-id");
|
907 |
-
if (modelIdInput)
|
908 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
909 |
const apiKeyLabel = document.getElementById("api-key-label");
|
910 |
if (apiKeyLabel) {
|
911 |
const labelByProvider = {
|
|
|
898 |
|
899 |
// Update API key input
|
900 |
const apiKeyInput = document.getElementById("openrouter-api-key");
|
901 |
+
if (apiKeyInput) {
|
902 |
+
const keyPrefMap = {
|
903 |
+
openrouter: "openrouterApiKey",
|
904 |
+
openai: "apiKey_openai",
|
905 |
+
groq: "apiKey_groq",
|
906 |
+
together: "apiKey_together",
|
907 |
+
deepseek: "apiKey_deepseek",
|
908 |
+
"openai-compatible": "apiKey_custom"
|
909 |
+
};
|
910 |
+
const keyPref = keyPrefMap[provider];
|
911 |
+
const providerKey = keyPref && preferences[keyPref] ? preferences[keyPref] : genericKey;
|
912 |
+
apiKeyInput.value = providerKey || "";
|
913 |
+
}
|
914 |
const providerSelect = document.getElementById("llm-provider");
|
915 |
if (providerSelect) providerSelect.value = provider;
|
916 |
const baseUrlInput = document.getElementById("llm-base-url");
|
917 |
if (baseUrlInput) baseUrlInput.value = baseUrl;
|
918 |
const modelIdInput = document.getElementById("llm-model-id");
|
919 |
+
if (modelIdInput) {
|
920 |
+
if (provider === "openrouter") {
|
921 |
+
modelIdInput.value = modelId;
|
922 |
+
} else {
|
923 |
+
modelIdInput.value = ""; // only placeholder for non-OpenRouter providers
|
924 |
+
}
|
925 |
+
}
|
926 |
+
// For non-OpenRouter providers we keep placeholder per provider; the value is already set above.
|
927 |
const apiKeyLabel = document.getElementById("api-key-label");
|
928 |
if (apiKeyLabel) {
|
929 |
const labelByProvider = {
|
kimi-js/kimi-script.js
CHANGED
@@ -79,10 +79,14 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
79 |
savedBadge: () => document.getElementById("api-key-saved"),
|
80 |
statusSpan: () => document.getElementById("api-status"),
|
81 |
testBtn: () => document.getElementById("test-api"),
|
|
|
82 |
setPresence(color) {
|
83 |
const dot = this.presenceDot();
|
84 |
-
const dot2 = this.presenceDotTest();
|
85 |
if (dot) dot.style.backgroundColor = color;
|
|
|
|
|
|
|
|
|
86 |
if (dot2) dot2.style.backgroundColor = color;
|
87 |
},
|
88 |
clearStatus() {
|
@@ -103,6 +107,8 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
103 |
const currentVal = (ApiUi.apiKeyInput() || {}).value || "";
|
104 |
const colorInit = currentVal && currentVal.length > 0 ? "#4caf50" : "#9e9e9e";
|
105 |
ApiUi.setPresence(colorInit);
|
|
|
|
|
106 |
}
|
107 |
|
108 |
// Initialize API config UI from saved preferences
|
@@ -126,7 +132,14 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
126 |
const modelIdInput = ApiUi.modelIdInput();
|
127 |
const apiKeyInput = ApiUi.apiKeyInput();
|
128 |
if (baseUrlInput) baseUrlInput.value = baseUrl || "";
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
// Load the provider-specific key
|
131 |
const keyPrefMap = {
|
132 |
openrouter: "openrouterApiKey",
|
@@ -140,6 +153,7 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
140 |
const storedKey = await window.kimiDB.getPreference(keyPref, "");
|
141 |
if (apiKeyInput) apiKeyInput.value = storedKey || "";
|
142 |
ApiUi.setPresence(storedKey ? "#4caf50" : "#9e9e9e");
|
|
|
143 |
const savedBadge = ApiUi.savedBadge();
|
144 |
if (savedBadge) savedBadge.style.display = storedKey ? "inline" : "none";
|
145 |
ApiUi.clearStatus();
|
@@ -206,8 +220,10 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
206 |
baseUrlInput.value = provider === "openrouter" ? "https://openrouter.ai/api/v1/chat/completions" : p.url;
|
207 |
}
|
208 |
if (apiKeyInput) apiKeyInput.placeholder = p.keyPh;
|
209 |
-
if (modelIdInput
|
210 |
modelIdInput.placeholder = p.model;
|
|
|
|
|
211 |
}
|
212 |
if (window.kimiDB) {
|
213 |
await window.kimiDB.setPreference("llmProvider", provider);
|
@@ -230,6 +246,8 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
230 |
if (apiKeyInput) apiKeyInput.value = storedKey || "";
|
231 |
const color = storedKey && storedKey.length > 0 ? "#4caf50" : "#9e9e9e";
|
232 |
ApiUi.setPresence(color);
|
|
|
|
|
233 |
ApiUi.setTestEnabled(!!(window.KIMI_VALIDATORS && window.KIMI_VALIDATORS.validateApiKey(storedKey || "")));
|
234 |
|
235 |
// Dynamic label per provider
|
@@ -656,11 +674,17 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
656 |
}
|
657 |
|
658 |
if (window.kimiDB) {
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
664 |
await window.kimiDB.setPreference("llmProvider", provider);
|
665 |
if (baseUrl) await window.kimiDB.setPreference("llmBaseUrl", baseUrl);
|
666 |
if (modelId) await window.kimiDB.setPreference("llmModelId", modelId);
|
@@ -696,11 +720,12 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
696 |
statusSpan.textContent = `Test response: \"${result.response.substring(0, 50)}...\"`;
|
697 |
}, 1000);
|
698 |
}
|
699 |
-
|
|
|
700 |
} else {
|
701 |
statusSpan.textContent = `${result.error}`;
|
702 |
statusSpan.style.color = "#ff6b6b";
|
703 |
-
|
704 |
if (result.error.includes("similaires disponibles")) {
|
705 |
setTimeout(() => {}, 1000);
|
706 |
}
|
@@ -708,11 +733,13 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
708 |
} else {
|
709 |
statusSpan.textContent = "LLM manager not initialized";
|
710 |
statusSpan.style.color = "#ff6b6b";
|
|
|
711 |
}
|
712 |
} catch (error) {
|
713 |
console.error("Error while testing API:", error);
|
714 |
statusSpan.textContent = `Error: ${error.message}`;
|
715 |
statusSpan.style.color = "#ff6b6b";
|
|
|
716 |
|
717 |
if (error.message.includes("non disponible")) {
|
718 |
setTimeout(() => {}, 1000);
|
@@ -754,6 +781,8 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
754 |
savedBadge.style.display = value ? "inline" : "none";
|
755 |
}
|
756 |
ApiUi.setPresence(value ? "#4caf50" : "#9e9e9e");
|
|
|
|
|
757 |
ApiUi.clearStatus();
|
758 |
} catch (e) {
|
759 |
// Validation error from DB
|
@@ -763,6 +792,7 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
763 |
s.style.color = "#ff6b6b";
|
764 |
}
|
765 |
ApiUi.setTestEnabled(false);
|
|
|
766 |
}
|
767 |
}
|
768 |
}, window.KIMI_SECURITY_CONFIG?.DEBOUNCE_DELAY || 300);
|
|
|
79 |
savedBadge: () => document.getElementById("api-key-saved"),
|
80 |
statusSpan: () => document.getElementById("api-status"),
|
81 |
testBtn: () => document.getElementById("test-api"),
|
82 |
+
// Saved key indicator (left dot)
|
83 |
setPresence(color) {
|
84 |
const dot = this.presenceDot();
|
|
|
85 |
if (dot) dot.style.backgroundColor = color;
|
86 |
+
},
|
87 |
+
// Test result indicator (right dot)
|
88 |
+
setTestPresence(color) {
|
89 |
+
const dot2 = this.presenceDotTest();
|
90 |
if (dot2) dot2.style.backgroundColor = color;
|
91 |
},
|
92 |
clearStatus() {
|
|
|
107 |
const currentVal = (ApiUi.apiKeyInput() || {}).value || "";
|
108 |
const colorInit = currentVal && currentVal.length > 0 ? "#4caf50" : "#9e9e9e";
|
109 |
ApiUi.setPresence(colorInit);
|
110 |
+
// On load, test status is unknown
|
111 |
+
ApiUi.setTestPresence("#9e9e9e");
|
112 |
}
|
113 |
|
114 |
// Initialize API config UI from saved preferences
|
|
|
132 |
const modelIdInput = ApiUi.modelIdInput();
|
133 |
const apiKeyInput = ApiUi.apiKeyInput();
|
134 |
if (baseUrlInput) baseUrlInput.value = baseUrl || "";
|
135 |
+
// Only prefill model for OpenRouter, others should show placeholder only
|
136 |
+
if (modelIdInput) {
|
137 |
+
if (provider === "openrouter") {
|
138 |
+
if (!modelIdInput.value) modelIdInput.value = modelId;
|
139 |
+
} else {
|
140 |
+
modelIdInput.value = "";
|
141 |
+
}
|
142 |
+
}
|
143 |
// Load the provider-specific key
|
144 |
const keyPrefMap = {
|
145 |
openrouter: "openrouterApiKey",
|
|
|
153 |
const storedKey = await window.kimiDB.getPreference(keyPref, "");
|
154 |
if (apiKeyInput) apiKeyInput.value = storedKey || "";
|
155 |
ApiUi.setPresence(storedKey ? "#4caf50" : "#9e9e9e");
|
156 |
+
ApiUi.setTestPresence("#9e9e9e");
|
157 |
const savedBadge = ApiUi.savedBadge();
|
158 |
if (savedBadge) savedBadge.style.display = storedKey ? "inline" : "none";
|
159 |
ApiUi.clearStatus();
|
|
|
220 |
baseUrlInput.value = provider === "openrouter" ? "https://openrouter.ai/api/v1/chat/completions" : p.url;
|
221 |
}
|
222 |
if (apiKeyInput) apiKeyInput.placeholder = p.keyPh;
|
223 |
+
if (modelIdInput) {
|
224 |
modelIdInput.placeholder = p.model;
|
225 |
+
// Value only for OpenRouter; others cleared to encourage provider-specific model naming
|
226 |
+
modelIdInput.value = provider === "openrouter" && window.kimiLLM ? window.kimiLLM.currentModel : "";
|
227 |
}
|
228 |
if (window.kimiDB) {
|
229 |
await window.kimiDB.setPreference("llmProvider", provider);
|
|
|
246 |
if (apiKeyInput) apiKeyInput.value = storedKey || "";
|
247 |
const color = storedKey && storedKey.length > 0 ? "#4caf50" : "#9e9e9e";
|
248 |
ApiUi.setPresence(color);
|
249 |
+
// Changing provider invalidates previous test state
|
250 |
+
ApiUi.setTestPresence("#9e9e9e");
|
251 |
ApiUi.setTestEnabled(!!(window.KIMI_VALIDATORS && window.KIMI_VALIDATORS.validateApiKey(storedKey || "")));
|
252 |
|
253 |
// Dynamic label per provider
|
|
|
674 |
}
|
675 |
|
676 |
if (window.kimiDB) {
|
677 |
+
// Save API key under provider-specific preference key
|
678 |
+
const keyPrefMap = {
|
679 |
+
openrouter: "openrouterApiKey",
|
680 |
+
openai: "apiKey_openai",
|
681 |
+
groq: "apiKey_groq",
|
682 |
+
together: "apiKey_together",
|
683 |
+
deepseek: "apiKey_deepseek",
|
684 |
+
"openai-compatible": "apiKey_custom"
|
685 |
+
};
|
686 |
+
const keyPref = keyPrefMap[provider] || "llmApiKey";
|
687 |
+
await window.kimiDB.setPreference(keyPref, apiKey);
|
688 |
await window.kimiDB.setPreference("llmProvider", provider);
|
689 |
if (baseUrl) await window.kimiDB.setPreference("llmBaseUrl", baseUrl);
|
690 |
if (modelId) await window.kimiDB.setPreference("llmModelId", modelId);
|
|
|
720 |
statusSpan.textContent = `Test response: \"${result.response.substring(0, 50)}...\"`;
|
721 |
}, 1000);
|
722 |
}
|
723 |
+
// Mark test success explicitly
|
724 |
+
ApiUi.setTestPresence("#4caf50");
|
725 |
} else {
|
726 |
statusSpan.textContent = `${result.error}`;
|
727 |
statusSpan.style.color = "#ff6b6b";
|
728 |
+
ApiUi.setTestPresence("#9e9e9e");
|
729 |
if (result.error.includes("similaires disponibles")) {
|
730 |
setTimeout(() => {}, 1000);
|
731 |
}
|
|
|
733 |
} else {
|
734 |
statusSpan.textContent = "LLM manager not initialized";
|
735 |
statusSpan.style.color = "#ff6b6b";
|
736 |
+
ApiUi.setTestPresence("#9e9e9e");
|
737 |
}
|
738 |
} catch (error) {
|
739 |
console.error("Error while testing API:", error);
|
740 |
statusSpan.textContent = `Error: ${error.message}`;
|
741 |
statusSpan.style.color = "#ff6b6b";
|
742 |
+
ApiUi.setTestPresence("#9e9e9e");
|
743 |
|
744 |
if (error.message.includes("non disponible")) {
|
745 |
setTimeout(() => {}, 1000);
|
|
|
781 |
savedBadge.style.display = value ? "inline" : "none";
|
782 |
}
|
783 |
ApiUi.setPresence(value ? "#4caf50" : "#9e9e9e");
|
784 |
+
// Any key change invalidates previous test state
|
785 |
+
ApiUi.setTestPresence("#9e9e9e");
|
786 |
ApiUi.clearStatus();
|
787 |
} catch (e) {
|
788 |
// Validation error from DB
|
|
|
792 |
s.style.color = "#ff6b6b";
|
793 |
}
|
794 |
ApiUi.setTestEnabled(false);
|
795 |
+
ApiUi.setTestPresence("#9e9e9e");
|
796 |
}
|
797 |
}
|
798 |
}, window.KIMI_SECURITY_CONFIG?.DEBOUNCE_DELAY || 300);
|
kimi-locale/de.json
CHANGED
@@ -194,6 +194,7 @@
|
|
194 |
"api_connection_failed": "❌ API-Verbindung fehlgeschlagen",
|
195 |
"voice_test_message": "Hallo mein Liebling! Hier ist meine neue Stimme, die mit allen Einstellungen konfiguriert ist! Gefällt sie dir?",
|
196 |
"api_key_presence_hint": "Grün = API-Schlüssel für aktuellen Anbieter gespeichert. Grau = kein Schlüssel gespeichert.",
|
|
|
197 |
"memory_system": "Gedächtnissystem",
|
198 |
"enable_memory": "Intelligentes Gedächtnis aktivieren",
|
199 |
"memory_stats": "Gedächtnisstatistiken",
|
|
|
194 |
"api_connection_failed": "❌ API-Verbindung fehlgeschlagen",
|
195 |
"voice_test_message": "Hallo mein Liebling! Hier ist meine neue Stimme, die mit allen Einstellungen konfiguriert ist! Gefällt sie dir?",
|
196 |
"api_key_presence_hint": "Grün = API-Schlüssel für aktuellen Anbieter gespeichert. Grau = kein Schlüssel gespeichert.",
|
197 |
+
"api_key_test_hint": "Grün = API-Konnektivität verifiziert. Grau = nicht getestet oder fehlgeschlagen.",
|
198 |
"memory_system": "Gedächtnissystem",
|
199 |
"enable_memory": "Intelligentes Gedächtnis aktivieren",
|
200 |
"memory_stats": "Gedächtnisstatistiken",
|
kimi-locale/en.json
CHANGED
@@ -201,5 +201,6 @@
|
|
201 |
"memory_management": "Memory Management",
|
202 |
"add": "Add",
|
203 |
"help_providers": "You can use multiple AI providers: OpenRouter, OpenAI, Groq, Together, DeepSeek, Custom OpenAI-compatible, or Local (Ollama). Enter the Base URL and Model ID when required, save your API key per provider, then use ‘Test API Key’.",
|
204 |
-
"api_key_presence_hint": "Green = API key saved for current provider. Grey = no key saved."
|
|
|
205 |
}
|
|
|
201 |
"memory_management": "Memory Management",
|
202 |
"add": "Add",
|
203 |
"help_providers": "You can use multiple AI providers: OpenRouter, OpenAI, Groq, Together, DeepSeek, Custom OpenAI-compatible, or Local (Ollama). Enter the Base URL and Model ID when required, save your API key per provider, then use ‘Test API Key’.",
|
204 |
+
"api_key_presence_hint": "Green = API key saved for current provider. Grey = no key saved.",
|
205 |
+
"api_key_test_hint": "Green = API connectivity verified. Grey = not tested or failed."
|
206 |
}
|
kimi-locale/es.json
CHANGED
@@ -194,6 +194,7 @@
|
|
194 |
"api_connection_failed": "¡Falló la conexión API!",
|
195 |
"voice_test_message": "¡Hola mi amor! ¡Aquí está mi nueva voz configurada con todas las configuraciones! ¿Te gusta?",
|
196 |
"api_key_presence_hint": "Verde = clave API guardada para el proveedor actual. Gris = ninguna clave guardada.",
|
|
|
197 |
"memory_system": "Sistema de Memoria",
|
198 |
"enable_memory": "Activar Memoria Inteligente",
|
199 |
"memory_stats": "Estadísticas de Memoria",
|
|
|
194 |
"api_connection_failed": "¡Falló la conexión API!",
|
195 |
"voice_test_message": "¡Hola mi amor! ¡Aquí está mi nueva voz configurada con todas las configuraciones! ¿Te gusta?",
|
196 |
"api_key_presence_hint": "Verde = clave API guardada para el proveedor actual. Gris = ninguna clave guardada.",
|
197 |
+
"api_key_test_hint": "Verde = conectividad de la API verificada. Gris = no probado o fallido.",
|
198 |
"memory_system": "Sistema de Memoria",
|
199 |
"enable_memory": "Activar Memoria Inteligente",
|
200 |
"memory_stats": "Estadísticas de Memoria",
|
kimi-locale/fr.json
CHANGED
@@ -201,5 +201,6 @@
|
|
201 |
"memory_management": "Gestion de la Mémoire",
|
202 |
"add": "Ajouter",
|
203 |
"help_providers": "Vous pouvez utiliser plusieurs fournisseurs d’IA : OpenRouter, OpenAI, Groq, Together, DeepSeek, un service OpenAI‑compatible personnalisé, ou Local (Ollama). Renseignez la Base URL et le Model ID si nécessaire, enregistrez votre clé API par fournisseur, puis utilisez ‘Test API Key’.",
|
204 |
-
"api_key_presence_hint": "Vert = clé API enregistrée pour le fournisseur courant. Gris = aucune clé enregistrée."
|
|
|
205 |
}
|
|
|
201 |
"memory_management": "Gestion de la Mémoire",
|
202 |
"add": "Ajouter",
|
203 |
"help_providers": "Vous pouvez utiliser plusieurs fournisseurs d’IA : OpenRouter, OpenAI, Groq, Together, DeepSeek, un service OpenAI‑compatible personnalisé, ou Local (Ollama). Renseignez la Base URL et le Model ID si nécessaire, enregistrez votre clé API par fournisseur, puis utilisez ‘Test API Key’.",
|
204 |
+
"api_key_presence_hint": "Vert = clé API enregistrée pour le fournisseur courant. Gris = aucune clé enregistrée.",
|
205 |
+
"api_key_test_hint": "Vert = connectivité API vérifiée. Gris = non testé ou échec."
|
206 |
}
|
kimi-locale/it.json
CHANGED
@@ -194,6 +194,7 @@
|
|
194 |
"api_connection_failed": "❌ Connessione API fallita",
|
195 |
"voice_test_message": "Ciao amore mio! Ecco la mia nuova voce configurata con tutte le impostazioni! Ti piace?",
|
196 |
"api_key_presence_hint": "Verde = chiave API salvata per il provider corrente. Grigio = nessuna chiave salvata.",
|
|
|
197 |
"memory_system": "Sistema di Memoria",
|
198 |
"enable_memory": "Abilita Memoria Intelligente",
|
199 |
"memory_stats": "Statistiche della Memoria",
|
|
|
194 |
"api_connection_failed": "❌ Connessione API fallita",
|
195 |
"voice_test_message": "Ciao amore mio! Ecco la mia nuova voce configurata con tutte le impostazioni! Ti piace?",
|
196 |
"api_key_presence_hint": "Verde = chiave API salvata per il provider corrente. Grigio = nessuna chiave salvata.",
|
197 |
+
"api_key_test_hint": "Verde = connettività API verificata. Grigio = non testata o fallita.",
|
198 |
"memory_system": "Sistema di Memoria",
|
199 |
"enable_memory": "Abilita Memoria Intelligente",
|
200 |
"memory_stats": "Statistiche della Memoria",
|
kimi-locale/ja.json
CHANGED
@@ -194,6 +194,7 @@
|
|
194 |
"api_connection_failed": "❌ API接続失敗",
|
195 |
"voice_test_message": "こんにちは、私の愛する人!これがすべての設定で構成された私の新しい声です!気に入りましたか?",
|
196 |
"api_key_presence_hint": "緑 = 現在のプロバイダー用のAPIキーが保存されています。灰色 = 保存されたキーがありません。",
|
|
|
197 |
"memory_system": "メモリシステム",
|
198 |
"enable_memory": "インテリジェントメモリを有効にする",
|
199 |
"memory_stats": "メモリ統計",
|
|
|
194 |
"api_connection_failed": "❌ API接続失敗",
|
195 |
"voice_test_message": "こんにちは、私の愛する人!これがすべての設定で構成された私の新しい声です!気に入りましたか?",
|
196 |
"api_key_presence_hint": "緑 = 現在のプロバイダー用のAPIキーが保存されています。灰色 = 保存されたキーがありません。",
|
197 |
+
"api_key_test_hint": "緑 = API接続が確認されました。灰色 = 未テストまたは失敗。",
|
198 |
"memory_system": "メモリシステム",
|
199 |
"enable_memory": "インテリジェントメモリを有効にする",
|
200 |
"memory_stats": "メモリ統計",
|
kimi-locale/zh.json
CHANGED
@@ -194,6 +194,7 @@
|
|
194 |
"api_connection_failed": "❌ API连接失败",
|
195 |
"voice_test_message": "你好我的爱人!这是我用所有设置配置的新声音!你喜欢吗?",
|
196 |
"api_key_presence_hint": "绿色 = 当前提供商已保存 API 密钥。灰色 = 未保存任何密钥。",
|
|
|
197 |
"memory_system": "记忆系统",
|
198 |
"enable_memory": "启用智能记忆",
|
199 |
"memory_stats": "记忆统计",
|
|
|
194 |
"api_connection_failed": "❌ API连接失败",
|
195 |
"voice_test_message": "你好我的爱人!这是我用所有设置配置的新声音!你喜欢吗?",
|
196 |
"api_key_presence_hint": "绿色 = 当前提供商已保存 API 密钥。灰色 = 未保存任何密钥。",
|
197 |
+
"api_key_test_hint": "绿色 = API 连接已验证。灰色 = 未测试或失败。",
|
198 |
"memory_system": "记忆系统",
|
199 |
"enable_memory": "启用智能记忆",
|
200 |
"memory_stats": "记忆统计",
|