kingkont 0.20.42 → 0.20.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/renderer/genLogger.js +6 -2
- package/renderer/generate.js +1 -1
- package/renderer/state.js +50 -17
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kingkont",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.44",
|
|
4
4
|
"description": "KingKont \u00b7 Chatium \u2014 \u043d\u043e\u0434-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u0446\u0435\u043d \u0441 AI-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438/\u0432\u0438\u0434\u0435\u043e/\u0433\u043e\u043b\u043e\u0441/SFX/\u043c\u0443\u0437\u044b\u043a\u0430/\u0442\u0435\u043a\u0441\u0442)",
|
|
5
5
|
"main": "main.js",
|
|
6
6
|
"bin": {
|
package/renderer/genLogger.js
CHANGED
|
@@ -17,8 +17,12 @@
|
|
|
17
17
|
// автоматически вставляется из state и window.appVersion/cloudFs.
|
|
18
18
|
|
|
19
19
|
(function () {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// Юзер: «если происходят проблемы при загрузке референса — я тоже хочу
|
|
21
|
+
// знать из логов, причём ещё до того как генерация закончена». Снизили
|
|
22
|
+
// 3s → 1s, чтобы любая info-строка через секунду максимум была на сервере.
|
|
23
|
+
// event/error и сейчас flush'ятся немедленно (см. ниже).
|
|
24
|
+
const FLUSH_INTERVAL_MS = 1000;
|
|
25
|
+
const MAX_BUFFER = 50; // если буфер набил — flush сразу
|
|
22
26
|
const MAX_PER_REQUEST = 100; // server ограничивает до 100/batch
|
|
23
27
|
|
|
24
28
|
const PLATFORM = window.cloudFs ? 'electron' : 'web';
|
package/renderer/generate.js
CHANGED
|
@@ -2142,7 +2142,7 @@ async function startGenerationJob(node, kind, prompt, mediaRefs, boardHandle, bK
|
|
|
2142
2142
|
}).catch(() => {});
|
|
2143
2143
|
}, 5000);
|
|
2144
2144
|
let r, rawText, data;
|
|
2145
|
-
const provider = await plannedProvider(kind);
|
|
2145
|
+
const provider = await plannedProvider(kind, modelKey);
|
|
2146
2146
|
logJob(node.id, `→ POST /api/generate → ${provider} (kind=${kind} model=${modelKey || '—'})`);
|
|
2147
2147
|
try {
|
|
2148
2148
|
r = await fetch('/api/generate', {
|
package/renderer/state.js
CHANGED
|
@@ -690,10 +690,19 @@ function logJob(nodeId, msg) {
|
|
|
690
690
|
// Юзер: «все логи генераций должны писаться на сервер с указанием что
|
|
691
691
|
// делалось, в какой сцене — чтобы я мог считать когда говорю
|
|
692
692
|
// 'у пользователя email проблема с последней генерацией'».
|
|
693
|
+
//
|
|
694
|
+
// Уровень определяется по содержимому строки — error/event flush'атся
|
|
695
|
+
// немедленно, info ждёт обычный 1s-батч.
|
|
696
|
+
// Юзер: «если проблемы при загрузке референса — хочу знать ещё до того
|
|
697
|
+
// как генерация закончена; на любом этапе если не случилась генерация
|
|
698
|
+
// или случилась не та что ожидали — нужно знать». Поэтому ключевые
|
|
699
|
+
// milestones (upload start/done, request body, taskId, poll done) идут
|
|
700
|
+
// как event → flush сразу.
|
|
693
701
|
try {
|
|
694
|
-
const lvl =
|
|
695
|
-
|
|
696
|
-
|
|
702
|
+
const lvl =
|
|
703
|
+
/error|failed|✗\s|ошиб|reject|invalid/i.test(msg) ? 'error' :
|
|
704
|
+
/gen start|gen ERROR|✓|done\s|✓ ok|→ POST|POST \/api\/|via\s+\w+\s+HTTP|taskId=|done →|↳ ok|↳ FAILED|upload (ref|summary)|списано|cost=|i2v=|frame_images|imageInputs|provider error|video params|gen params/i.test(msg) ? 'event' :
|
|
705
|
+
'info';
|
|
697
706
|
window.kkGenLogger?.append?.({ nodeId, msg, level: lvl });
|
|
698
707
|
} catch {}
|
|
699
708
|
}
|
|
@@ -702,7 +711,7 @@ function logJob(nodeId, msg) {
|
|
|
702
711
|
// чтобы юзер ВИДЕЛ ДО запроса, на какой провайдер уйдут данные. Если
|
|
703
712
|
// настройки не позволяют ни один путь — возвращает 'none' (запрос либо
|
|
704
713
|
// упадёт 503, либо отработает дефолтом — UI всё равно покажет факт).
|
|
705
|
-
async function plannedProvider(kind) {
|
|
714
|
+
async function plannedProvider(kind, modelKey) {
|
|
706
715
|
let s;
|
|
707
716
|
try { s = await window.appSettings.get(); } catch { s = {}; }
|
|
708
717
|
const hasChatium = !!(s.useChatium && s.chatium?.token && s.chatium?.base);
|
|
@@ -722,33 +731,57 @@ async function plannedProvider(kind) {
|
|
|
722
731
|
if (hasChatium) return 'kingkont';
|
|
723
732
|
if (s.useElevenlabs === true) return 'elevenlabs';
|
|
724
733
|
return 'none';
|
|
725
|
-
case 'video':
|
|
726
|
-
// OR имеет приоритет для
|
|
727
|
-
// OPENROUTER_VIDEO_MODELS).
|
|
728
|
-
//
|
|
729
|
-
|
|
734
|
+
case 'video': {
|
|
735
|
+
// OR имеет приоритет ТОЛЬКО для моделей которые он реально поддерживает
|
|
736
|
+
// (seedance-2/seedance-2-fast, см. lib/providers.js OPENROUTER_VIDEO_MODELS).
|
|
737
|
+
// Юзер: «куда мы последний запрос отправляли? не в чатиум ведь?» —
|
|
738
|
+
// раньше говорили openrouter для ВСЕХ video если useOpenrouter=true,
|
|
739
|
+
// даже для kling-3.0 которая в OR не входит. Теперь честно.
|
|
740
|
+
const orVid = new Set(['seedance-2', 'seedance-2-fast']);
|
|
741
|
+
if (hasOpenrouter && modelKey && orVid.has(modelKey)) return 'openrouter';
|
|
730
742
|
if (hasChatium) return 'kingkont';
|
|
731
743
|
if (s.useKie === true) return 'kie';
|
|
732
744
|
return 'none';
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
//
|
|
736
|
-
//
|
|
737
|
-
//
|
|
738
|
-
|
|
745
|
+
}
|
|
746
|
+
case 'image': {
|
|
747
|
+
// OR — только nano-banana-* (см. providers.js OPENROUTER_IMAGE_MODELS).
|
|
748
|
+
// gpt-image-* / grok / seedream / flux / sdxl — не в OR, идут в
|
|
749
|
+
// Chatium/KIE. Раньше для всех говорили openrouter, что для
|
|
750
|
+
// gpt-image-2 (Chatium-only) было неверно.
|
|
751
|
+
const orImg = new Set(['nano-banana-2', 'nano-banana-pro']);
|
|
752
|
+
if (hasOpenrouter && modelKey && orImg.has(modelKey)) return 'openrouter';
|
|
753
|
+
// gpt-image-* — приоритет Chatium даже если OR включён.
|
|
754
|
+
const isGptImage = modelKey === 'gpt-image-2' || modelKey === 'gpt-image-1.5';
|
|
755
|
+
if (isGptImage && hasChatium) return 'kingkont';
|
|
739
756
|
if (hasChatium) return 'kingkont';
|
|
740
757
|
if (s.useKie === true) return 'kie';
|
|
741
758
|
return 'none';
|
|
759
|
+
}
|
|
742
760
|
default:
|
|
743
761
|
return '?';
|
|
744
762
|
}
|
|
745
763
|
}
|
|
746
|
-
// Безопасная сериализация для логов: обрезает длинные строки и убирает blob/handle
|
|
764
|
+
// Безопасная сериализация для логов: обрезает длинные строки и убирает blob/handle.
|
|
765
|
+
// Юзер: «не понимаю, использует ли openai-image-2 референсы; нужно из логов
|
|
766
|
+
// оценить» — поэтому imageInputs/videoInputs/refs/url НЕ обрезаем (URL'ы
|
|
767
|
+
// иначе превращались в '...' и нельзя было сверить hash файла). Остальные
|
|
768
|
+
// длинные строки (prompt > 500ch) урезаем как раньше.
|
|
747
769
|
function logSafe(obj) {
|
|
748
770
|
try {
|
|
771
|
+
const URL_FIELDS = new Set(['url', 'image_url', 'image_input', 'imageInputs', 'videoInputs',
|
|
772
|
+
'firstFrame', 'lastFrame', 'frame_images', 'refs',
|
|
773
|
+
'reference_image_urls', 'reference_video_urls', 'taskId']);
|
|
749
774
|
return JSON.stringify(obj, (k, v) => {
|
|
750
775
|
if (k === 'boardHandle') return v ? `<DirectoryHandle ${v.name || ''}>` : null;
|
|
751
|
-
|
|
776
|
+
// URL-поля сохраняем целиком — это часто диагностический материал.
|
|
777
|
+
if (URL_FIELDS.has(k)) return v;
|
|
778
|
+
// Внутри array URL_FIELDS (imageInputs[0], imageInputs[1]) ключи — индексы,
|
|
779
|
+
// там logSafe приходит как k='0','1',... → URL_FIELDS не сработает.
|
|
780
|
+
// Поэтому ниже специально не режем URL-подобные строки.
|
|
781
|
+
if (typeof v === 'string') {
|
|
782
|
+
if (/^https?:\/\//.test(v)) return v; // URL целиком
|
|
783
|
+
if (v.length > 500) return v.slice(0, 500) + `…(+${v.length - 500} chars)`;
|
|
784
|
+
}
|
|
752
785
|
return v;
|
|
753
786
|
});
|
|
754
787
|
} catch (e) { return String(obj); }
|