VirtualKimi commited on
Commit
e419d9f
·
verified ·
1 Parent(s): 4538564

Upload 35 files

Browse files
index.html CHANGED
@@ -159,12 +159,12 @@
159
  <button class="settings-tab" data-tab="llm">
160
  <i class="fas fa-robot"></i> <span data-i18n="tab_llm">API & Models</span>
161
  </button>
162
- <button class="settings-tab" data-tab="personality">
163
- <i class="fas fa-brain"></i> <span data-i18n="tab_personality">Personality</span>
164
- </button>
165
  <button class="settings-tab" data-tab="appearance">
166
  <i class="fas fa-palette"></i> <span data-i18n="tab_appearance">Appearance</span>
167
  </button>
 
 
 
168
  <button class="settings-tab" data-tab="data">
169
  <i class="fas fa-database"></i> <span data-i18n="tab_data">Data</span>
170
  </button>
@@ -194,17 +194,36 @@
194
  </div>
195
  </div>
196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  <div class="config-row">
198
  <label class="config-label" data-i18n="preferred_voice">Preferred Voice</label>
199
  <div class="config-control">
200
  <select class="kimi-select" id="voice-selection" aria-label="Preferred Voice">
201
  <!-- Dynamic options inserted by KimiVoiceManager; legacy 'auto' removed -->
202
  </select>
203
- <div class="voice-extra-options">
204
- <label class="toggle-all-voices">
205
- <input type="checkbox" id="show-all-voices" />
206
- <span data-i18n="show_all_system_voices">Show all system voices</span>
207
- </label>
 
 
 
 
208
  </div>
209
  </div>
210
  </div>
@@ -262,8 +281,18 @@
262
  <div class="config-section" id="character-section">
263
  <h3><i class="fas fa-user-astronaut"></i> <span data-i18n="characters">Characters</span></h3>
264
  <div class="character-grid" id="character-grid"></div>
265
- <div class="character-actions">
266
- <button class="kimi-button" id="save-character-btn" data-i18n="save">Save</button>
 
 
 
 
 
 
 
 
 
 
267
  </div>
268
  </div>
269
 
@@ -461,15 +490,15 @@
461
  <div class="config-control">
462
  <div class="slider-container">
463
  <input type="range" class="kimi-slider" id="llm-max-tokens" min="10" max="8192"
464
- step="10" value="400" />
465
- <span class="slider-value" id="llm-max-tokens-value">400</span>
466
  </div>
467
  </div>
468
  </div>
469
  <div class="config-note-info settings">
470
  <i class="fas fa-ruler"></i>
471
  <small class="config-help" data-i18n="max_tokens_help">Maximum response length in tokens
472
- (default: 400). Higher values allow longer responses.</small>
473
  </div>
474
 
475
  <div class="config-row">
@@ -553,9 +582,6 @@
553
  </div>
554
  </div>
555
 
556
- <div class="config-row">
557
- <!-- Animations toggle removed: animations always enabled by default -->
558
- </div>
559
  </div>
560
 
561
  <div class="config-section">
@@ -1060,7 +1086,7 @@
1060
  <h3><i class="fas fa-code"></i> Technical Information</h3>
1061
  <div class="tech-info">
1062
  <p><strong>Created date :</strong> July 16, 2025</p>
1063
- <p><strong>Version :</strong> v1.1.7.1 "HF and GH version"</p>
1064
  <p><strong>Last update :</strong> November 12, 2025</p>
1065
  <p><strong>Technologies :</strong> HTML5, CSS3, JavaScript ES6+, IndexedDB, Web Speech
1066
  API</p>
 
159
  <button class="settings-tab" data-tab="llm">
160
  <i class="fas fa-robot"></i> <span data-i18n="tab_llm">API & Models</span>
161
  </button>
 
 
 
162
  <button class="settings-tab" data-tab="appearance">
163
  <i class="fas fa-palette"></i> <span data-i18n="tab_appearance">Appearance</span>
164
  </button>
165
+ <button class="settings-tab" data-tab="personality">
166
+ <i class="fas fa-brain"></i> <span data-i18n="tab_personality">Personality</span>
167
+ </button>
168
  <button class="settings-tab" data-tab="data">
169
  <i class="fas fa-database"></i> <span data-i18n="tab_data">Data</span>
170
  </button>
 
194
  </div>
195
  </div>
196
 
197
+ <div class="config-row">
198
+ <label class="config-label" data-i18n="enable_tts">Enable Text-to-Speech</label>
199
+ <div class="config-control">
200
+ <div class="toggle-switch active" id="tts-toggle" role="switch" aria-checked="true"
201
+ tabindex="0" aria-labelledby="tts-toggle-label">
202
+ </div>
203
+ </div>
204
+ </div>
205
+
206
+ <div class="config-note-info info">
207
+ <i class="fas fa-volume-up"></i>
208
+ <small class="config-help" data-i18n="enable_tts_help">Enable or disable voice synthesis
209
+ globally. When disabled, Kimi will not speak responses (default: enabled).</small>
210
+ </div>
211
+
212
  <div class="config-row">
213
  <label class="config-label" data-i18n="preferred_voice">Preferred Voice</label>
214
  <div class="config-control">
215
  <select class="kimi-select" id="voice-selection" aria-label="Preferred Voice">
216
  <!-- Dynamic options inserted by KimiVoiceManager; legacy 'auto' removed -->
217
  </select>
218
+ </div>
219
+ </div>
220
+
221
+ <div class="config-row">
222
+ <label class="config-label" data-i18n="show_all_system_voices">Show All System
223
+ Voices</label>
224
+ <div class="config-control">
225
+ <div class="toggle-switch" id="show-all-voices-toggle" role="switch"
226
+ aria-checked="false" tabindex="0" aria-labelledby="show-all-voices-label">
227
  </div>
228
  </div>
229
  </div>
 
281
  <div class="config-section" id="character-section">
282
  <h3><i class="fas fa-user-astronaut"></i> <span data-i18n="characters">Characters</span></h3>
283
  <div class="character-grid" id="character-grid"></div>
284
+
285
+ <div class="character-selection-notice">
286
+ <i class="fas fa-info-circle"></i>
287
+ <span data-i18n="character_selection_notice">Click the button below to apply your character
288
+ selection. This will reload the page.</span>
289
+ </div>
290
+
291
+ <div class="character-actions-center">
292
+ <button class="kimi-button-primary pulse-animation" id="save-character-btn">
293
+ <i class="fas fa-check-circle"></i>
294
+ <span data-i18n="apply_character">Apply Character Selection</span>
295
+ </button>
296
  </div>
297
  </div>
298
 
 
490
  <div class="config-control">
491
  <div class="slider-container">
492
  <input type="range" class="kimi-slider" id="llm-max-tokens" min="10" max="8192"
493
+ step="10" value="800" />
494
+ <span class="slider-value" id="llm-max-tokens-value">800</span>
495
  </div>
496
  </div>
497
  </div>
498
  <div class="config-note-info settings">
499
  <i class="fas fa-ruler"></i>
500
  <small class="config-help" data-i18n="max_tokens_help">Maximum response length in tokens
501
+ (default: 800). Higher values allow longer responses.</small>
502
  </div>
503
 
504
  <div class="config-row">
 
582
  </div>
583
  </div>
584
 
 
 
 
585
  </div>
586
 
587
  <div class="config-section">
 
1086
  <h3><i class="fas fa-code"></i> Technical Information</h3>
1087
  <div class="tech-info">
1088
  <p><strong>Created date :</strong> July 16, 2025</p>
1089
+ <p><strong>Version :</strong> v1.1.7.1 "HuggingFace and Github version"</p>
1090
  <p><strong>Last update :</strong> November 12, 2025</p>
1091
  <p><strong>Technologies :</strong> HTML5, CSS3, JavaScript ES6+, IndexedDB, Web Speech
1092
  API</p>
kimi-css/kimi-settings.css CHANGED
@@ -1312,6 +1312,114 @@
1312
  }
1313
  }
1314
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1315
  .character-card {
1316
  background: var(--card-bg);
1317
  border: 2px solid transparent;
 
1312
  }
1313
  }
1314
 
1315
+ /* Character Selection Notice */
1316
+ .character-selection-notice {
1317
+ display: flex;
1318
+ align-items: center;
1319
+ justify-content: center;
1320
+ gap: 10px;
1321
+ padding: 12px 20px;
1322
+ margin: 20px auto 16px;
1323
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.1), rgba(59, 130, 246, 0.1));
1324
+ border: 1px solid rgba(139, 92, 246, 0.3);
1325
+ border-radius: 12px;
1326
+ color: var(--text-color);
1327
+ font-size: 0.9rem;
1328
+ max-width: 600px;
1329
+ }
1330
+
1331
+ .character-selection-notice i {
1332
+ color: var(--primary-color);
1333
+ font-size: 1.1rem;
1334
+ flex-shrink: 0;
1335
+ }
1336
+
1337
+ /* Character Actions Center */
1338
+ .character-actions-center {
1339
+ display: flex;
1340
+ justify-content: center;
1341
+ margin: 24px 0 32px;
1342
+ }
1343
+
1344
+ /* Primary CTA Button for Character Selection */
1345
+ .kimi-button-primary {
1346
+ display: inline-flex;
1347
+ align-items: center;
1348
+ justify-content: center;
1349
+ gap: 12px;
1350
+ padding: 16px 40px;
1351
+ font-size: 1.05rem;
1352
+ font-weight: 600;
1353
+ color: white;
1354
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
1355
+ border: none;
1356
+ border-radius: 14px;
1357
+ cursor: pointer;
1358
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1359
+ box-shadow: 0 4px 20px rgba(139, 92, 246, 0.3);
1360
+ position: relative;
1361
+ overflow: hidden;
1362
+ min-width: 280px;
1363
+ }
1364
+
1365
+ .kimi-button-primary::before {
1366
+ content: "";
1367
+ position: absolute;
1368
+ top: 0;
1369
+ left: -100%;
1370
+ width: 100%;
1371
+ height: 100%;
1372
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
1373
+ transition: left 0.5s;
1374
+ }
1375
+
1376
+ .kimi-button-primary:hover {
1377
+ transform: translateY(-2px);
1378
+ box-shadow: 0 8px 30px rgba(139, 92, 246, 0.5);
1379
+ }
1380
+
1381
+ .kimi-button-primary:hover::before {
1382
+ left: 100%;
1383
+ }
1384
+
1385
+ .kimi-button-primary:active {
1386
+ transform: translateY(0);
1387
+ }
1388
+
1389
+ .kimi-button-primary i {
1390
+ font-size: 1.2rem;
1391
+ }
1392
+
1393
+ .kimi-button-primary.success {
1394
+ background: linear-gradient(135deg, #10b981, #059669);
1395
+ box-shadow: 0 4px 20px rgba(16, 185, 129, 0.4);
1396
+ }
1397
+
1398
+ .kimi-button-primary:disabled {
1399
+ opacity: 0.6;
1400
+ cursor: not-allowed;
1401
+ transform: none;
1402
+ }
1403
+
1404
+ /* Pulse Animation for CTA */
1405
+ @keyframes pulse-glow {
1406
+ 0%,
1407
+ 100% {
1408
+ box-shadow: 0 4px 20px rgba(139, 92, 246, 0.3);
1409
+ }
1410
+ 50% {
1411
+ box-shadow: 0 4px 30px rgba(139, 92, 246, 0.6);
1412
+ }
1413
+ }
1414
+
1415
+ .kimi-button-primary.pulse-animation {
1416
+ animation: pulse-glow 2s ease-in-out infinite;
1417
+ }
1418
+
1419
+ .kimi-button-primary.pulse-animation:hover {
1420
+ animation: none;
1421
+ }
1422
+
1423
  .character-card {
1424
  background: var(--card-bg);
1425
  border: 2px solid transparent;
kimi-js/kimi-config.js CHANGED
@@ -9,8 +9,9 @@ window.KIMI_CONFIG = {
9
  VOICE_RATE: 1.1,
10
  VOICE_PITCH: 1.1,
11
  VOICE_VOLUME: 0.8,
 
12
  LLM_TEMPERATURE: 0.9,
13
- LLM_MAX_TOKENS: 400,
14
  LLM_TOP_P: 0.9,
15
  LLM_FREQUENCY_PENALTY: 0.9,
16
  LLM_PRESENCE_PENALTY: 0.8,
 
9
  VOICE_RATE: 1.1,
10
  VOICE_PITCH: 1.1,
11
  VOICE_VOLUME: 0.8,
12
+ TTS_ENABLED: true,
13
  LLM_TEMPERATURE: 0.9,
14
+ LLM_MAX_TOKENS: 800,
15
  LLM_TOP_P: 0.9,
16
  LLM_FREQUENCY_PENALTY: 0.9,
17
  LLM_PRESENCE_PENALTY: 0.8,
kimi-js/kimi-database.js CHANGED
@@ -39,7 +39,7 @@ class KimiDatabase {
39
  category: "llm",
40
  settings: {
41
  temperature: 0.9,
42
- maxTokens: 400,
43
  top_p: 0.9,
44
  frequency_penalty: 0.9,
45
  presence_penalty: 0.8
@@ -59,7 +59,7 @@ class KimiDatabase {
59
  name: "Mistral Small 3.2",
60
  provider: "openrouter",
61
  apiKey: "",
62
- config: { temperature: 0.9, maxTokens: 400 },
63
  added: new Date().toISOString(),
64
  lastUsed: null
65
  });
@@ -289,7 +289,7 @@ class KimiDatabase {
289
  category: "llm",
290
  settings: {
291
  temperature: 0.9,
292
- maxTokens: 400,
293
  top_p: 0.9,
294
  frequency_penalty: 0.9,
295
  presence_penalty: 0.8
@@ -317,7 +317,7 @@ class KimiDatabase {
317
  name: "Mistral Small 3.2",
318
  provider: "openrouter",
319
  apiKey: "",
320
- config: { temperature: 0.9, maxTokens: 400 },
321
  added: new Date().toISOString(),
322
  lastUsed: null
323
  }
 
39
  category: "llm",
40
  settings: {
41
  temperature: 0.9,
42
+ maxTokens: 800,
43
  top_p: 0.9,
44
  frequency_penalty: 0.9,
45
  presence_penalty: 0.8
 
59
  name: "Mistral Small 3.2",
60
  provider: "openrouter",
61
  apiKey: "",
62
+ config: { temperature: 0.9, maxTokens: 800 },
63
  added: new Date().toISOString(),
64
  lastUsed: null
65
  });
 
289
  category: "llm",
290
  settings: {
291
  temperature: 0.9,
292
+ maxTokens: 800,
293
  top_p: 0.9,
294
  frequency_penalty: 0.9,
295
  presence_penalty: 0.8
 
317
  name: "Mistral Small 3.2",
318
  provider: "openrouter",
319
  apiKey: "",
320
+ config: { temperature: 0.9, maxTokens: 800 },
321
  added: new Date().toISOString(),
322
  lastUsed: null
323
  }
kimi-js/kimi-llm-manager.js CHANGED
@@ -481,7 +481,7 @@ class KimiLLMManager {
481
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
482
  const llmSettings = {
483
  temperature: await this.db.getPreference("llmTemperature", 0.9),
484
- maxTokens: await this.db.getPreference("llmMaxTokens", 400),
485
  top_p: await this.db.getPreference("llmTopP", 0.9),
486
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
487
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
@@ -523,7 +523,7 @@ class KimiLLMManager {
523
  async chatDirectly(userMessage, options = {}) {
524
  const llmSettings = {
525
  temperature: await this.db.getPreference("llmTemperature", 0.9),
526
- maxTokens: await this.db.getPreference("llmMaxTokens", 400),
527
  top_p: await this.db.getPreference("llmTopP", 0.9),
528
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
529
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
@@ -559,7 +559,7 @@ class KimiLLMManager {
559
  // Get LLM settings from individual preferences
560
  const llmSettings = {
561
  temperature: await this.db.getPreference("llmTemperature", 0.9),
562
- maxTokens: await this.db.getPreference("llmMaxTokens", 400),
563
  top_p: await this.db.getPreference("llmTopP", 0.9),
564
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
565
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
@@ -617,13 +617,13 @@ class KimiLLMManager {
617
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
618
  const llmSettings = {
619
  temperature: await this.db.getPreference("llmTemperature", 0.9),
620
- maxTokens: await this.db.getPreference("llmMaxTokens", 400),
621
  top_p: await this.db.getPreference("llmTopP", 0.9),
622
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
623
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
624
  };
625
  // Unified fallback defaults (must stay consistent with database defaults)
626
- const unifiedDefaults = { temperature: 0.9, maxTokens: 400, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
627
  const payload = {
628
  model: modelId,
629
  messages: [
@@ -718,12 +718,12 @@ class KimiLLMManager {
718
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
719
  const llmSettings = {
720
  temperature: await this.db.getPreference("llmTemperature", 0.9),
721
- maxTokens: await this.db.getPreference("llmMaxTokens", 400),
722
  top_p: await this.db.getPreference("llmTopP", 0.9),
723
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
724
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
725
  };
726
- const unifiedDefaults = { temperature: 0.9, maxTokens: 400, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
727
  const payload = {
728
  model: this.currentModel,
729
  messages: messages,
@@ -1017,7 +1017,7 @@ class KimiLLMManager {
1017
  // Get unified defaults and options
1018
  const unifiedDefaults = window.getUnifiedDefaults
1019
  ? window.getUnifiedDefaults()
1020
- : { temperature: 0.9, maxTokens: 400, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
1021
 
1022
  const enableStreaming = await this.db.getPreference("enableStreaming", true);
1023
 
@@ -1155,7 +1155,7 @@ class KimiLLMManager {
1155
 
1156
  const unifiedDefaults = window.getUnifiedDefaults
1157
  ? window.getUnifiedDefaults()
1158
- : { temperature: 0.9, maxTokens: 400, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
1159
 
1160
  const enableStreaming = await this.db.getPreference("enableStreaming", true);
1161
 
 
481
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
482
  const llmSettings = {
483
  temperature: await this.db.getPreference("llmTemperature", 0.9),
484
+ maxTokens: await this.db.getPreference("llmMaxTokens", 800),
485
  top_p: await this.db.getPreference("llmTopP", 0.9),
486
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
487
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
 
523
  async chatDirectly(userMessage, options = {}) {
524
  const llmSettings = {
525
  temperature: await this.db.getPreference("llmTemperature", 0.9),
526
+ maxTokens: await this.db.getPreference("llmMaxTokens", 800),
527
  top_p: await this.db.getPreference("llmTopP", 0.9),
528
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
529
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
 
559
  // Get LLM settings from individual preferences
560
  const llmSettings = {
561
  temperature: await this.db.getPreference("llmTemperature", 0.9),
562
+ maxTokens: await this.db.getPreference("llmMaxTokens", 800),
563
  top_p: await this.db.getPreference("llmTopP", 0.9),
564
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
565
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
 
617
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
618
  const llmSettings = {
619
  temperature: await this.db.getPreference("llmTemperature", 0.9),
620
+ maxTokens: await this.db.getPreference("llmMaxTokens", 800),
621
  top_p: await this.db.getPreference("llmTopP", 0.9),
622
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
623
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
624
  };
625
  // Unified fallback defaults (must stay consistent with database defaults)
626
+ const unifiedDefaults = { temperature: 0.9, maxTokens: 800, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
627
  const payload = {
628
  model: modelId,
629
  messages: [
 
718
  // Get LLM settings from individual preferences (FIXED: was using grouped settings)
719
  const llmSettings = {
720
  temperature: await this.db.getPreference("llmTemperature", 0.9),
721
+ maxTokens: await this.db.getPreference("llmMaxTokens", 800),
722
  top_p: await this.db.getPreference("llmTopP", 0.9),
723
  frequency_penalty: await this.db.getPreference("llmFrequencyPenalty", 0.9),
724
  presence_penalty: await this.db.getPreference("llmPresencePenalty", 0.8)
725
  };
726
+ const unifiedDefaults = { temperature: 0.9, maxTokens: 800, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
727
  const payload = {
728
  model: this.currentModel,
729
  messages: messages,
 
1017
  // Get unified defaults and options
1018
  const unifiedDefaults = window.getUnifiedDefaults
1019
  ? window.getUnifiedDefaults()
1020
+ : { temperature: 0.9, maxTokens: 800, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
1021
 
1022
  const enableStreaming = await this.db.getPreference("enableStreaming", true);
1023
 
 
1155
 
1156
  const unifiedDefaults = window.getUnifiedDefaults
1157
  ? window.getUnifiedDefaults()
1158
+ : { temperature: 0.9, maxTokens: 800, top_p: 0.9, frequency_penalty: 0.9, presence_penalty: 0.8 };
1159
 
1160
  const enableStreaming = await this.db.getPreference("enableStreaming", true);
1161
 
kimi-js/kimi-module.js CHANGED
@@ -636,7 +636,7 @@ async function loadSettingsData() {
636
  const modelId = preferences.llmModelId || (window.kimiLLM ? window.kimiLLM.currentModel : "");
637
  const selectedCharacter = preferences.selectedCharacter || "kimi";
638
  const llmTemperature = preferences.llmTemperature !== undefined ? preferences.llmTemperature : 0.9;
639
- const llmMaxTokens = preferences.llmMaxTokens !== undefined ? preferences.llmMaxTokens : 400;
640
  const llmTopP = preferences.llmTopP !== undefined ? preferences.llmTopP : 0.9;
641
  const llmFrequencyPenalty = preferences.llmFrequencyPenalty !== undefined ? preferences.llmFrequencyPenalty : 0.9;
642
  const llmPresencePenalty = preferences.llmPresencePenalty !== undefined ? preferences.llmPresencePenalty : 0.8;
@@ -877,7 +877,7 @@ async function syncLLMMaxTokensSlider() {
877
  const llmMaxTokensSlider = document.getElementById("llm-max-tokens");
878
  const llmMaxTokensValue = document.getElementById("llm-max-tokens-value");
879
  if (llmMaxTokensSlider && llmMaxTokensValue && kimiDB) {
880
- const saved = await kimiDB.getPreference("llmMaxTokens", 400);
881
  llmMaxTokensSlider.value = saved;
882
  llmMaxTokensValue.textContent = saved;
883
  }
@@ -1591,7 +1591,7 @@ function setupSettingsListeners(kimiDB, kimiMemory) {
1591
  if (llmMaxTokensSlider) {
1592
  const listener = e => {
1593
  const validation = window.KimiValidationUtils?.validateRange(e.target.value, "llmMaxTokens");
1594
- const value = validation?.value || parseInt(e.target.value) || 400;
1595
 
1596
  document.getElementById("llm-max-tokens-value").textContent = value;
1597
  e.target.value = value;
 
636
  const modelId = preferences.llmModelId || (window.kimiLLM ? window.kimiLLM.currentModel : "");
637
  const selectedCharacter = preferences.selectedCharacter || "kimi";
638
  const llmTemperature = preferences.llmTemperature !== undefined ? preferences.llmTemperature : 0.9;
639
+ const llmMaxTokens = preferences.llmMaxTokens !== undefined ? preferences.llmMaxTokens : 800;
640
  const llmTopP = preferences.llmTopP !== undefined ? preferences.llmTopP : 0.9;
641
  const llmFrequencyPenalty = preferences.llmFrequencyPenalty !== undefined ? preferences.llmFrequencyPenalty : 0.9;
642
  const llmPresencePenalty = preferences.llmPresencePenalty !== undefined ? preferences.llmPresencePenalty : 0.8;
 
877
  const llmMaxTokensSlider = document.getElementById("llm-max-tokens");
878
  const llmMaxTokensValue = document.getElementById("llm-max-tokens-value");
879
  if (llmMaxTokensSlider && llmMaxTokensValue && kimiDB) {
880
+ const saved = await kimiDB.getPreference("llmMaxTokens", 800);
881
  llmMaxTokensSlider.value = saved;
882
  llmMaxTokensValue.textContent = saved;
883
  }
 
1591
  if (llmMaxTokensSlider) {
1592
  const listener = e => {
1593
  const validation = window.KimiValidationUtils?.validateRange(e.target.value, "llmMaxTokens");
1594
+ const value = validation?.value || parseInt(e.target.value) || 800;
1595
 
1596
  document.getElementById("llm-max-tokens-value").textContent = value;
1597
  e.target.value = value;
kimi-js/kimi-script.js CHANGED
@@ -456,11 +456,12 @@ document.addEventListener("DOMContentLoaded", async function () {
456
  await window.kimiMemoryUI.updateMemoryStats();
457
  }
458
  if (window.setI18n) window.setI18n(saveCharacterBtn, "saved");
 
459
  saveCharacterBtn.classList.add("success");
460
  saveCharacterBtn.disabled = true;
461
 
462
  setTimeout(() => {
463
- if (window.setI18n) window.setI18n(saveCharacterBtn, "save");
464
  saveCharacterBtn.classList.remove("success");
465
  saveCharacterBtn.disabled = false;
466
  }, 1000);
 
456
  await window.kimiMemoryUI.updateMemoryStats();
457
  }
458
  if (window.setI18n) window.setI18n(saveCharacterBtn, "saved");
459
+ saveCharacterBtn.classList.remove("pulse-animation");
460
  saveCharacterBtn.classList.add("success");
461
  saveCharacterBtn.disabled = true;
462
 
463
  setTimeout(() => {
464
+ if (window.setI18n) window.setI18n(saveCharacterBtn, "apply_character");
465
  saveCharacterBtn.classList.remove("success");
466
  saveCharacterBtn.disabled = false;
467
  }, 1000);
kimi-js/kimi-utils.js CHANGED
@@ -188,7 +188,7 @@ window.KimiValidationUtils = {
188
  voicePitch: { min: 0.5, max: 2, def: 1.1 },
189
  voiceVolume: { min: 0, max: 1, def: 0.8 },
190
  llmTemperature: { min: 0, max: 1, def: 0.9 },
191
- llmMaxTokens: { min: 1, max: 8192, def: 400 },
192
  llmTopP: { min: 0, max: 1, def: 0.9 },
193
  llmFrequencyPenalty: { min: 0, max: 2, def: 0.9 },
194
  llmPresencePenalty: { min: 0, max: 2, def: 0.8 },
 
188
  voicePitch: { min: 0.5, max: 2, def: 1.1 },
189
  voiceVolume: { min: 0, max: 1, def: 0.8 },
190
  llmTemperature: { min: 0, max: 1, def: 0.9 },
191
+ llmMaxTokens: { min: 1, max: 8192, def: 800 },
192
  llmTopP: { min: 0, max: 1, def: 0.9 },
193
  llmFrequencyPenalty: { min: 0, max: 2, def: 0.9 },
194
  llmPresencePenalty: { min: 0, max: 2, def: 0.8 },
kimi-js/kimi-voices.js CHANGED
@@ -6,6 +6,7 @@ class KimiVoiceManager {
6
  this.isInitialized = false;
7
  // Removed cross-language reuse: voices must match selected language strictly
8
  this.showAllVoices = false; // user toggle to display every system voice
 
9
  // Refactor 2025-09: Simplified voice/language handling (removed 'auto' gendered selection)
10
 
11
  // Capability flags (added 2025-09)
@@ -128,6 +129,7 @@ class KimiVoiceManager {
128
 
129
  this.setupLanguageSelector();
130
  this.setupShowAllVoicesToggle();
 
131
 
132
  // Initialize speech recognition only if available
133
  if (this.hasSR) {
@@ -159,17 +161,72 @@ class KimiVoiceManager {
159
  }
160
 
161
  setupShowAllVoicesToggle() {
162
- const checkbox = document.getElementById("show-all-voices");
163
- if (!checkbox) return;
164
- checkbox.checked = this.showAllVoices;
165
- checkbox.addEventListener("change", () => {
166
- this.showAllVoices = checkbox.checked;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  // Persist preference
168
  this.db?.setPreference("showAllVoices", String(this.showAllVoices));
169
  this.updateVoiceSelector();
170
  });
171
  }
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  _applySpeechRecognitionCapabilityUI() {
174
  if (!this.micButton) return;
175
  if (!this.hasSR) {
@@ -593,6 +650,14 @@ class KimiVoiceManager {
593
  }
594
 
595
  async speak(text, options = {}) {
 
 
 
 
 
 
 
 
596
  // If no text or voice not ready, attempt short retries for voice initialization
597
  if (!text) {
598
  console.warn("Unable to speak: empty text");
 
6
  this.isInitialized = false;
7
  // Removed cross-language reuse: voices must match selected language strictly
8
  this.showAllVoices = false; // user toggle to display every system voice
9
+ this.ttsEnabled = true; // global TTS enable/disable toggle
10
  // Refactor 2025-09: Simplified voice/language handling (removed 'auto' gendered selection)
11
 
12
  // Capability flags (added 2025-09)
 
129
 
130
  this.setupLanguageSelector();
131
  this.setupShowAllVoicesToggle();
132
+ this.setupTtsToggle();
133
 
134
  // Initialize speech recognition only if available
135
  if (this.hasSR) {
 
161
  }
162
 
163
  setupShowAllVoicesToggle() {
164
+ const toggleSwitch = document.getElementById("show-all-voices-toggle");
165
+ if (!toggleSwitch) return;
166
+
167
+ // Set initial state
168
+ if (this.showAllVoices) {
169
+ toggleSwitch.classList.add("active");
170
+ toggleSwitch.setAttribute("aria-checked", "true");
171
+ } else {
172
+ toggleSwitch.classList.remove("active");
173
+ toggleSwitch.setAttribute("aria-checked", "false");
174
+ }
175
+
176
+ // Handle click event
177
+ toggleSwitch.addEventListener("click", () => {
178
+ this.showAllVoices = !this.showAllVoices;
179
+
180
+ // Update UI
181
+ if (this.showAllVoices) {
182
+ toggleSwitch.classList.add("active");
183
+ toggleSwitch.setAttribute("aria-checked", "true");
184
+ } else {
185
+ toggleSwitch.classList.remove("active");
186
+ toggleSwitch.setAttribute("aria-checked", "false");
187
+ }
188
+
189
  // Persist preference
190
  this.db?.setPreference("showAllVoices", String(this.showAllVoices));
191
  this.updateVoiceSelector();
192
  });
193
  }
194
 
195
+ setupTtsToggle() {
196
+ const toggleSwitch = document.getElementById("tts-toggle");
197
+ if (!toggleSwitch) return;
198
+
199
+ // Set initial state
200
+ if (this.ttsEnabled) {
201
+ toggleSwitch.classList.add("active");
202
+ toggleSwitch.setAttribute("aria-checked", "true");
203
+ } else {
204
+ toggleSwitch.classList.remove("active");
205
+ toggleSwitch.setAttribute("aria-checked", "false");
206
+ }
207
+
208
+ // Handle click event
209
+ toggleSwitch.addEventListener("click", () => {
210
+ this.ttsEnabled = !this.ttsEnabled;
211
+
212
+ // Update UI
213
+ if (this.ttsEnabled) {
214
+ toggleSwitch.classList.add("active");
215
+ toggleSwitch.setAttribute("aria-checked", "true");
216
+ } else {
217
+ toggleSwitch.classList.remove("active");
218
+ toggleSwitch.setAttribute("aria-checked", "false");
219
+ // Cancel any ongoing speech
220
+ if (this.speechSynthesis && this.speechSynthesis.speaking) {
221
+ this.speechSynthesis.cancel();
222
+ }
223
+ }
224
+
225
+ // Persist preference
226
+ this.db?.setPreference("ttsEnabled", String(this.ttsEnabled));
227
+ });
228
+ }
229
+
230
  _applySpeechRecognitionCapabilityUI() {
231
  if (!this.micButton) return;
232
  if (!this.hasSR) {
 
650
  }
651
 
652
  async speak(text, options = {}) {
653
+ // Check if TTS is globally enabled
654
+ if (!this.ttsEnabled) {
655
+ if (window.KIMI_CONFIG?.DEBUG?.VOICE) {
656
+ console.log("TTS is disabled globally, skipping speak");
657
+ }
658
+ return;
659
+ }
660
+
661
  // If no text or voice not ready, attempt short retries for voice initialization
662
  if (!text) {
663
  console.warn("Unable to speak: empty text");
kimi-locale/de.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "Über Kimi",
130
  "characters": "Charaktere",
131
  "save": "Speichern",
 
 
132
  "reset_to_default": "Auf Standard Zurücksetzen",
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Häufigkeitsstrafe",
135
  "presence_penalty": "Anwesenheitsstrafe",
136
  "temperature_help": "Steuert Zufälligkeit und Kreativität (Standard: 0,9).",
137
- "max_tokens_help": "Maximale Antwortlänge in Token (Standard: 400).",
138
  "top_p_help": "Steuert die Vielfalt der Wortauswahl (Standard: 0,9).",
139
  "frequency_penalty_help": "Reduziert Wiederholung bereits verwendeter Wörter (Standard: 0,9).",
140
  "presence_penalty_help": "Ermutigt die Diskussion neuer Themen (Standard: 0,8).",
@@ -189,6 +191,8 @@
189
  "language_portuguese": "Portugiesisch (Brasilien)",
190
  "automatic": "Automatisch",
191
  "show_all_system_voices": "Alle Systemstimmen anzeigen",
 
 
192
  "trait_description_affection": "Liebevoll und fürsorglich sein.",
193
  "trait_description_romance": "Romantisch und süß sein.",
194
  "trait_description_empathy": "Empathisch und verständnisvoll sein.",
 
129
  "about_kimi": "Über Kimi",
130
  "characters": "Charaktere",
131
  "save": "Speichern",
132
+ "apply_character": "Charakterauswahl Anwenden",
133
+ "character_selection_notice": "Klicken Sie auf die Schaltfläche unten, um Ihre Charakterauswahl anzuwenden. Dies lädt die Seite neu.",
134
  "reset_to_default": "Auf Standard Zurücksetzen",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Häufigkeitsstrafe",
137
  "presence_penalty": "Anwesenheitsstrafe",
138
  "temperature_help": "Steuert Zufälligkeit und Kreativität (Standard: 0,9).",
139
+ "max_tokens_help": "Maximale Antwortlänge in Token (Standard: 800).",
140
  "top_p_help": "Steuert die Vielfalt der Wortauswahl (Standard: 0,9).",
141
  "frequency_penalty_help": "Reduziert Wiederholung bereits verwendeter Wörter (Standard: 0,9).",
142
  "presence_penalty_help": "Ermutigt die Diskussion neuer Themen (Standard: 0,8).",
 
191
  "language_portuguese": "Portugiesisch (Brasilien)",
192
  "automatic": "Automatisch",
193
  "show_all_system_voices": "Alle Systemstimmen anzeigen",
194
+ "enable_tts": "Text-zu-Sprache Aktivieren",
195
+ "enable_tts_help": "Aktiviert oder deaktiviert die Sprachsynthese global. Wenn deaktiviert, wird Kimi nicht sprechen (Standard: aktiviert).",
196
  "trait_description_affection": "Liebevoll und fürsorglich sein.",
197
  "trait_description_romance": "Romantisch und süß sein.",
198
  "trait_description_empathy": "Empathisch und verständnisvoll sein.",
kimi-locale/en.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "About Kimi",
130
  "characters": "Characters",
131
  "save": "Save",
 
 
132
  "reset_to_default": "Reset to Default",
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Frequency Penalty",
135
  "presence_penalty": "Presence Penalty",
136
  "temperature_help": "Controls randomness and creativity (default: 0.9).",
137
- "max_tokens_help": "Maximum response length in tokens (default: 400).",
138
  "top_p_help": "Controls diversity of word selection (default: 0.9).",
139
  "frequency_penalty_help": "Reduces repetition of words already used (default: 0.9).",
140
  "presence_penalty_help": "Encourages discussing new topics (default: 0.8).",
@@ -189,6 +191,8 @@
189
  "language_portuguese": "Portuguese (BR)",
190
  "automatic": "Automatic",
191
  "show_all_system_voices": "Show all system voices",
 
 
192
  "trait_description_affection": "Be loving and caring.",
193
  "trait_description_romance": "Be romantic and sweet.",
194
  "trait_description_empathy": "Be empathetic and understanding.",
 
129
  "about_kimi": "About Kimi",
130
  "characters": "Characters",
131
  "save": "Save",
132
+ "apply_character": "Apply Character Selection",
133
+ "character_selection_notice": "Click the button below to apply your character selection. This will reload the page.",
134
  "reset_to_default": "Reset to Default",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Frequency Penalty",
137
  "presence_penalty": "Presence Penalty",
138
  "temperature_help": "Controls randomness and creativity (default: 0.9).",
139
+ "max_tokens_help": "Maximum response length in tokens (default: 800).",
140
  "top_p_help": "Controls diversity of word selection (default: 0.9).",
141
  "frequency_penalty_help": "Reduces repetition of words already used (default: 0.9).",
142
  "presence_penalty_help": "Encourages discussing new topics (default: 0.8).",
 
191
  "language_portuguese": "Portuguese (BR)",
192
  "automatic": "Automatic",
193
  "show_all_system_voices": "Show all system voices",
194
+ "enable_tts": "Enable Text-to-Speech",
195
+ "enable_tts_help": "Enable or disable voice synthesis globally. When disabled, Kimi will not speak responses (default: enabled).",
196
  "trait_description_affection": "Be loving and caring.",
197
  "trait_description_romance": "Be romantic and sweet.",
198
  "trait_description_empathy": "Be empathetic and understanding.",
kimi-locale/es.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "Acerca de Kimi",
130
  "characters": "Personajes",
131
  "save": "Guardar",
132
- "reset_to_default": "Restaurar Valores Predeterminados",
 
 
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Penalización de Frecuencia",
135
  "presence_penalty": "Penalización de Presencia",
136
  "temperature_help": "Controla la aleatoriedad y creatividad (por defecto: 0,9).",
137
- "max_tokens_help": "Longitud máxima de respuesta en tokens (por defecto: 400).",
138
  "top_p_help": "Controla la diversidad de selección de palabras (por defecto: 0,9).",
139
  "frequency_penalty_help": "Reduce la repetición de palabras ya usadas (por defecto: 0,9).",
140
  "presence_penalty_help": "Fomenta la discusión de nuevos temas (por defecto: 0,8).",
@@ -189,6 +191,8 @@
189
  "language_portuguese": "Portugués (Brasil)",
190
  "automatic": "Automático",
191
  "show_all_system_voices": "Mostrar todas las voces del sistema",
 
 
192
  "trait_description_affection": "Ser amoroso y cariñoso.",
193
  "trait_description_romance": "Ser romántico y dulce.",
194
  "trait_description_empathy": "Ser empático y comprensivo.",
 
129
  "about_kimi": "Acerca de Kimi",
130
  "characters": "Personajes",
131
  "save": "Guardar",
132
+ "apply_character": "Aplicar Selección de Personaje",
133
+ "character_selection_notice": "Haz clic en el botón de abajo para aplicar tu selección de personaje. Esto recargará la página.",
134
+ "reset_to_default": "Restablecer Valores Predeterminados",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Penalización de Frecuencia",
137
  "presence_penalty": "Penalización de Presencia",
138
  "temperature_help": "Controla la aleatoriedad y creatividad (por defecto: 0,9).",
139
+ "max_tokens_help": "Longitud máxima de respuesta en tokens (por defecto: 800).",
140
  "top_p_help": "Controla la diversidad de selección de palabras (por defecto: 0,9).",
141
  "frequency_penalty_help": "Reduce la repetición de palabras ya usadas (por defecto: 0,9).",
142
  "presence_penalty_help": "Fomenta la discusión de nuevos temas (por defecto: 0,8).",
 
191
  "language_portuguese": "Portugués (Brasil)",
192
  "automatic": "Automático",
193
  "show_all_system_voices": "Mostrar todas las voces del sistema",
194
+ "enable_tts": "Activar Síntesis de Voz",
195
+ "enable_tts_help": "Activa o desactiva la síntesis de voz globalmente. Cuando está desactivado, Kimi no hablará (predeterminado: activado).",
196
  "trait_description_affection": "Ser amoroso y cariñoso.",
197
  "trait_description_romance": "Ser romántico y dulce.",
198
  "trait_description_empathy": "Ser empático y comprensivo.",
kimi-locale/fr.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "À propos de Kimi",
130
  "characters": "Personnages",
131
  "save": "Sauvegarder",
 
 
132
  "reset_to_default": "Remettre par défaut",
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Pénalité de fréquence",
135
  "presence_penalty": "Pénalité de présence",
136
  "temperature_help": "Contrôle le caractère aléatoire et la créativité (défaut : 0,9).",
137
- "max_tokens_help": "Longueur maximale de réponse en jetons (défaut : 400).",
138
  "top_p_help": "Contrôle la diversité de sélection des mots (défaut : 0,9).",
139
  "frequency_penalty_help": "Réduit la répétition de mots déjà utilisés (défaut : 0,9).",
140
  "presence_penalty_help": "Encourage la discussion de nouveaux sujets (défaut : 0,8).",
@@ -191,6 +193,8 @@
191
  "language_portuguese": "Portugais (Brésil)",
192
  "automatic": "Automatique",
193
  "show_all_system_voices": "Afficher toutes les voix système",
 
 
194
  "trait_description_affection": "Être aimante et attentionnée.",
195
  "trait_description_romance": "Être romantique et douce.",
196
  "trait_description_empathy": "Être empathique et compréhensive.",
 
129
  "about_kimi": "À propos de Kimi",
130
  "characters": "Personnages",
131
  "save": "Sauvegarder",
132
+ "apply_character": "Appliquer la Sélection du Personnage",
133
+ "character_selection_notice": "Cliquez sur le bouton ci-dessous pour appliquer votre sélection de personnage. Cela rechargera la page.",
134
  "reset_to_default": "Remettre par défaut",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Pénalité de fréquence",
137
  "presence_penalty": "Pénalité de présence",
138
  "temperature_help": "Contrôle le caractère aléatoire et la créativité (défaut : 0,9).",
139
+ "max_tokens_help": "Longueur maximale de réponse en jetons (défaut : 800).",
140
  "top_p_help": "Contrôle la diversité de sélection des mots (défaut : 0,9).",
141
  "frequency_penalty_help": "Réduit la répétition de mots déjà utilisés (défaut : 0,9).",
142
  "presence_penalty_help": "Encourage la discussion de nouveaux sujets (défaut : 0,8).",
 
193
  "language_portuguese": "Portugais (Brésil)",
194
  "automatic": "Automatique",
195
  "show_all_system_voices": "Afficher toutes les voix système",
196
+ "enable_tts": "Activer la Synthèse Vocale",
197
+ "enable_tts_help": "Active ou désactive la synthèse vocale globalement. Lorsque désactivé, Kimi ne parlera pas (par défaut : activé).",
198
  "trait_description_affection": "Être aimante et attentionnée.",
199
  "trait_description_romance": "Être romantique et douce.",
200
  "trait_description_empathy": "Être empathique et compréhensive.",
kimi-locale/it.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "Informazioni su Kimi",
130
  "characters": "Personaggi",
131
  "save": "Salva",
132
- "reset_to_default": "Ripristina Predefiniti",
 
 
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Penalità di Frequenza",
135
  "presence_penalty": "Penalità di Presenza",
136
  "temperature_help": "Controlla casualità e creatività (predefinito: 0,9).",
137
- "max_tokens_help": "Lunghezza massima della risposta in token (predefinito: 400).",
138
  "top_p_help": "Controlla la diversità di selezione delle parole (predefinito: 0,9).",
139
  "frequency_penalty_help": "Riduce la ripetizione di parole già usate (predefinito: 0,9).",
140
  "presence_penalty_help": "Incoraggia la discussione di nuovi argomenti (predefinito: 0,8).",
@@ -189,7 +191,9 @@
189
  "language_portuguese": "Portoghese (Brasile)",
190
  "automatic": "Automatico",
191
  "show_all_system_voices": "Mostra tutte le voci di sistema",
192
- "trait_description_affection": "Essere amorevole e premurosa.",
 
 
193
  "trait_description_romance": "Essere romantica e dolce.",
194
  "trait_description_empathy": "Essere empatica e comprensiva.",
195
  "trait_description_playfulness": "Essere occasionalmente giocosa.",
 
129
  "about_kimi": "Informazioni su Kimi",
130
  "characters": "Personaggi",
131
  "save": "Salva",
132
+ "apply_character": "Applica Selezione Personaggio",
133
+ "character_selection_notice": "Fai clic sul pulsante qui sotto per applicare la selezione del personaggio. Questo ricaricherà la pagina.",
134
+ "reset_to_default": "Ripristina Predefinite",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Penalità di Frequenza",
137
  "presence_penalty": "Penalità di Presenza",
138
  "temperature_help": "Controlla casualità e creatività (predefinito: 0,9).",
139
+ "max_tokens_help": "Lunghezza massima della risposta in token (predefinito: 800).",
140
  "top_p_help": "Controlla la diversità di selezione delle parole (predefinito: 0,9).",
141
  "frequency_penalty_help": "Riduce la ripetizione di parole già usate (predefinito: 0,9).",
142
  "presence_penalty_help": "Incoraggia la discussione di nuovi argomenti (predefinito: 0,8).",
 
191
  "language_portuguese": "Portoghese (Brasile)",
192
  "automatic": "Automatico",
193
  "show_all_system_voices": "Mostra tutte le voci di sistema",
194
+ "enable_tts": "Abilita Sintesi Vocale",
195
+ "enable_tts_help": "Abilita o disabilita la sintesi vocale globalmente. Quando disabilitato, Kimi non parlerà (predefinito: abilitato).",
196
+ "trait_description_affection": "Essere amorevole e premuroso.",
197
  "trait_description_romance": "Essere romantica e dolce.",
198
  "trait_description_empathy": "Essere empatica e comprensiva.",
199
  "trait_description_playfulness": "Essere occasionalmente giocosa.",
kimi-locale/ja.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "Kimiについて",
130
  "characters": "キャラクター",
131
  "save": "保存",
 
 
132
  "reset_to_default": "デフォルトにリセット",
133
  "top_p": "Top-p",
134
  "frequency_penalty": "頻度ペナルティ",
135
  "presence_penalty": "存在ペナルティ",
136
  "temperature_help": "ランダム性と創造性を制御します(デフォルト: 0.9)。",
137
- "max_tokens_help": "トークン単位での最大応答長(デフォルト: 400)。",
138
  "top_p_help": "単語選択の多様性を制御します(デフォルト: 0.9)。値が低いほど応答が集中します。",
139
  "frequency_penalty_help": "既に使用された単語の繰り返しを減らします(デフォルト: 0.9)。",
140
  "presence_penalty_help": "新しいトピックの議論を促進します(デフォルト: 0.8)。",
@@ -189,7 +191,9 @@
189
  "language_portuguese": "ポルトガル語 (ブラジル)",
190
  "automatic": "自動",
191
  "show_all_system_voices": "すべてのシステム音声を表示",
192
- "trait_description_affection": "愛情深く思いやりがある。",
 
 
193
  "trait_description_romance": "ロマンチックで優しい。",
194
  "trait_description_empathy": "共感的で理解がある。",
195
  "trait_description_playfulness": "時々遊び心がある。",
 
129
  "about_kimi": "Kimiについて",
130
  "characters": "キャラクター",
131
  "save": "保存",
132
+ "apply_character": "キャラクター選択を適用",
133
+ "character_selection_notice": "下のボタンをクリックしてキャラクター選択を適用します。ページがリロードされます。",
134
  "reset_to_default": "デフォルトにリセット",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "頻度ペナルティ",
137
  "presence_penalty": "存在ペナルティ",
138
  "temperature_help": "ランダム性と創造性を制御します(デフォルト: 0.9)。",
139
+ "max_tokens_help": "トークン単位での最大応答長(デフォルト: 800)。",
140
  "top_p_help": "単語選択の多様性を制御します(デフォルト: 0.9)。値が低いほど応答が集中します。",
141
  "frequency_penalty_help": "既に使用された単語の繰り返しを減らします(デフォルト: 0.9)。",
142
  "presence_penalty_help": "新しいトピックの議論を促進します(デフォルト: 0.8)。",
 
191
  "language_portuguese": "ポルトガル語 (ブラジル)",
192
  "automatic": "自動",
193
  "show_all_system_voices": "すべてのシステム音声を表示",
194
+ "enable_tts": "音声合成を有効化",
195
+ "enable_tts_help": "音声合成をグローバルに有効または無効にします。無効にすると、Kimiは話しません(デフォルト:有効)。",
196
+ "trait_description_affection": "愛情深く思いやりを持つ。",
197
  "trait_description_romance": "ロマンチックで優しい。",
198
  "trait_description_empathy": "共感的で理解がある。",
199
  "trait_description_playfulness": "時々遊び心がある。",
kimi-locale/pt.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "Sobre a Kimi",
130
  "characters": "Personagens",
131
  "save": "Salvar",
 
 
132
  "reset_to_default": "Restaurar Padrão",
133
  "top_p": "Top-p",
134
  "frequency_penalty": "Penalidade de Frequência",
135
  "presence_penalty": "Penalidade de Presença",
136
  "temperature_help": "Controla aleatoriedade e criatividade (padrão: 0.9).",
137
- "max_tokens_help": "Comprimento máximo da resposta em tokens (padrão: 400).",
138
  "top_p_help": "Controla a diversidade da seleção de palavras (padrão: 0.9).",
139
  "frequency_penalty_help": "Reduz a repetição de palavras já usadas (padrão: 0.9).",
140
  "presence_penalty_help": "Incentiva a discussão de novos tópicos (padrão: 0.8).",
@@ -189,7 +191,9 @@
189
  "language_portuguese": "Português (Brasil)",
190
  "automatic": "Automático",
191
  "show_all_system_voices": "Mostrar todas as vozes do sistema",
192
- "trait_description_affection": "Seja amoroso e carinhoso.",
 
 
193
  "trait_description_romance": "Seja romântico e doce.",
194
  "trait_description_empathy": "Seja empático e compreensivo.",
195
  "trait_description_playfulness": "Seja ocasionalmente brincalhão.",
 
129
  "about_kimi": "Sobre a Kimi",
130
  "characters": "Personagens",
131
  "save": "Salvar",
132
+ "apply_character": "Aplicar Seleção de Personagem",
133
+ "character_selection_notice": "Clique no botão abaixo para aplicar sua seleção de personagem. Isso recarregará a página.",
134
  "reset_to_default": "Restaurar Padrão",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "Penalidade de Frequência",
137
  "presence_penalty": "Penalidade de Presença",
138
  "temperature_help": "Controla aleatoriedade e criatividade (padrão: 0.9).",
139
+ "max_tokens_help": "Comprimento máximo da resposta em tokens (padrão: 800).",
140
  "top_p_help": "Controla a diversidade da seleção de palavras (padrão: 0.9).",
141
  "frequency_penalty_help": "Reduz a repetição de palavras já usadas (padrão: 0.9).",
142
  "presence_penalty_help": "Incentiva a discussão de novos tópicos (padrão: 0.8).",
 
191
  "language_portuguese": "Português (Brasil)",
192
  "automatic": "Automático",
193
  "show_all_system_voices": "Mostrar todas as vozes do sistema",
194
+ "enable_tts": "Ativar Síntese de Fala",
195
+ "enable_tts_help": "Ativa ou desativa a síntese de fala globalmente. Quando desativado, Kimi não falará (padrão: ativado).",
196
+ "trait_description_affection": "Ser amoroso e carinhoso.",
197
  "trait_description_romance": "Seja romântico e doce.",
198
  "trait_description_empathy": "Seja empático e compreensivo.",
199
  "trait_description_playfulness": "Seja ocasionalmente brincalhão.",
kimi-locale/zh.json CHANGED
@@ -129,12 +129,14 @@
129
  "about_kimi": "关于Kimi",
130
  "characters": "角色",
131
  "save": "保存",
132
- "reset_to_default": "重置为默认",
 
 
133
  "top_p": "Top-p",
134
  "frequency_penalty": "频率惩罚",
135
  "presence_penalty": "存在惩罚",
136
  "temperature_help": "控制随机性和创造性(默认:0.9)。",
137
- "max_tokens_help": "以令牌为单位的最大响应长度(默认:400)。",
138
  "top_p_help": "控制单词选择的多样性(默认:0.9)。",
139
  "frequency_penalty_help": "减少已使用单词的重复(默认:0.9)。",
140
  "presence_penalty_help": "鼓励讨论新话题(默认:0.8)。",
@@ -189,7 +191,9 @@
189
  "language_portuguese": "葡萄牙语(巴西)",
190
  "automatic": "自动",
191
  "show_all_system_voices": "显示所有系统语音",
192
- "trait_description_affection": "要有爱心和关怀。",
 
 
193
  "trait_description_romance": "要浪漫和甜蜜。",
194
  "trait_description_empathy": "要有同情心和理解力。",
195
  "trait_description_playfulness": "偶尔要顽皮。",
 
129
  "about_kimi": "关于Kimi",
130
  "characters": "角色",
131
  "save": "保存",
132
+ "apply_character": "应用角色选择",
133
+ "character_selection_notice": "点击下方按钮应用您的角色选择。这将重新加载页面。",
134
+ "reset_to_default": "恢复默认",
135
  "top_p": "Top-p",
136
  "frequency_penalty": "频率惩罚",
137
  "presence_penalty": "存在惩罚",
138
  "temperature_help": "控制随机性和创造性(默认:0.9)。",
139
+ "max_tokens_help": "以令牌为单位的最大响应长度(默认:800)。",
140
  "top_p_help": "控制单词选择的多样性(默认:0.9)。",
141
  "frequency_penalty_help": "减少已使用单词的重复(默认:0.9)。",
142
  "presence_penalty_help": "鼓励讨论新话题(默认:0.8)。",
 
191
  "language_portuguese": "葡萄牙语(巴西)",
192
  "automatic": "自动",
193
  "show_all_system_voices": "显示所有系统语音",
194
+ "enable_tts": "启用文本转语音",
195
+ "enable_tts_help": "全局启用或禁用语音合成。禁用时,Kimi将不会说话(默认:启用)。",
196
+ "trait_description_affection": "充满爱心和关怀。",
197
  "trait_description_romance": "要浪漫和甜蜜。",
198
  "trait_description_empathy": "要有同情心和理解力。",
199
  "trait_description_playfulness": "偶尔要顽皮。",