kingkont 0.7.13 → 0.7.14
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/index.html +4 -4
- package/package.json +1 -1
- package/server.js +31 -31
package/index.html
CHANGED
|
@@ -1824,19 +1824,19 @@ async function plannedProvider(kind) {
|
|
|
1824
1824
|
const hasChatium = !!(s.useChatium && s.chatium?.token && s.chatium?.base);
|
|
1825
1825
|
switch (kind) {
|
|
1826
1826
|
case 'text':
|
|
1827
|
-
if (hasChatium) return '
|
|
1827
|
+
if (hasChatium) return 'kingkont';
|
|
1828
1828
|
if (s.useOpenrouter !== false) return 'openrouter';
|
|
1829
1829
|
return 'none';
|
|
1830
1830
|
case 'audio': case 'tts': case 'sfx': case 'music':
|
|
1831
|
-
if (hasChatium) return '
|
|
1831
|
+
if (hasChatium) return 'kingkont';
|
|
1832
1832
|
if (s.useElevenlabs !== false) return 'elevenlabs';
|
|
1833
1833
|
return 'none';
|
|
1834
1834
|
case 'video':
|
|
1835
|
-
if (hasChatium) return '
|
|
1835
|
+
if (hasChatium) return 'kingkont';
|
|
1836
1836
|
if (s.useKie !== false) return 'kie';
|
|
1837
1837
|
return 'none';
|
|
1838
1838
|
case 'image':
|
|
1839
|
-
if (hasChatium) return '
|
|
1839
|
+
if (hasChatium) return 'kingkont';
|
|
1840
1840
|
if (s.useKie !== false) return 'kie';
|
|
1841
1841
|
return 'none';
|
|
1842
1842
|
default:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kingkont",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.14",
|
|
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/server.js
CHANGED
|
@@ -308,18 +308,18 @@ async function handleGenerate(req, res) {
|
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
const taskId = await chatiumStart(s, chatiumKind, chatiumBody);
|
|
311
|
-
return send(res, 200, { taskId: 'chatium:' + taskId }, { 'X-Provider': '
|
|
311
|
+
return send(res, 200, { taskId: 'chatium:' + taskId }, { 'X-Provider': 'kingkont' });
|
|
312
312
|
} catch (e) {
|
|
313
313
|
logProviderCall('ERR ', 'Chatium', `/api/${kind}`, e.message);
|
|
314
|
-
return send(res, 502, { error: '
|
|
314
|
+
return send(res, 502, { error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
|
|
318
318
|
// Прямой KIE (image и video).
|
|
319
319
|
if (!s.useKie) {
|
|
320
320
|
return send(res, 503, { error: kind === 'video'
|
|
321
|
-
? '
|
|
322
|
-
: '
|
|
321
|
+
? 'Войдите в KingKont или KIE для видео.'
|
|
322
|
+
: 'Войдите в KingKont или KIE для картинок.' });
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
const input = { prompt };
|
|
@@ -382,14 +382,14 @@ async function handlePoll(res, url) {
|
|
|
382
382
|
const realId = taskId.slice('chatium:'.length);
|
|
383
383
|
const s = getSettings();
|
|
384
384
|
if (!s.chatium?.token || !s.chatium?.base) {
|
|
385
|
-
return send(res, 401, { status: 'error', error: 'Нет Chatium-сессии' }, { 'X-Provider': '
|
|
385
|
+
return send(res, 401, { status: 'error', error: 'Нет Chatium-сессии' }, { 'X-Provider': 'kingkont' });
|
|
386
386
|
}
|
|
387
387
|
try {
|
|
388
388
|
let d = await chatiumPoll(s, realId);
|
|
389
|
-
const provider = { 'X-Provider': '
|
|
389
|
+
const provider = { 'X-Provider': 'kingkont' };
|
|
390
390
|
if (d.status === 'completed') {
|
|
391
391
|
const url2 = d.result?.urls?.[0];
|
|
392
|
-
if (!url2) return send(res, 200, { status: 'error', error: '
|
|
392
|
+
if (!url2) return send(res, 200, { status: 'error', error: 'KingKont вернул без URL' }, provider);
|
|
393
393
|
// Билинг приходит ОТДЕЛЬНЫМ callback'ом. Если creditsCharged ещё
|
|
394
394
|
// null, ждём до 5 сек — обычно billed подоспеет за секунду-две.
|
|
395
395
|
if (typeof d.creditsCharged !== 'number') {
|
|
@@ -411,7 +411,7 @@ async function handlePoll(res, url) {
|
|
|
411
411
|
}
|
|
412
412
|
return send(res, 200, { status: 'pending', state: d.status }, provider);
|
|
413
413
|
} catch (e) {
|
|
414
|
-
return send(res, 502, { status: 'error', error: '
|
|
414
|
+
return send(res, 502, { status: 'error', error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
417
|
|
|
@@ -459,11 +459,11 @@ async function handleUpload(req, res) {
|
|
|
459
459
|
});
|
|
460
460
|
if (!ru.ok) {
|
|
461
461
|
const t = await ru.text();
|
|
462
|
-
return send(res, ru.status, { error: '
|
|
462
|
+
return send(res, ru.status, { error: 'KingKont upload-url: ' + t.slice(0, 200) }, { 'X-Provider': 'kingkont' });
|
|
463
463
|
}
|
|
464
464
|
const { uploadUrl } = await ru.json();
|
|
465
465
|
if (!uploadUrl) {
|
|
466
|
-
return send(res, 502, { error: '
|
|
466
|
+
return send(res, 502, { error: 'KingKont не вернул uploadUrl' }, { 'X-Provider': 'kingkont' });
|
|
467
467
|
}
|
|
468
468
|
// 2) Multipart-POST с полем "Filedata" — формат Chatium-fileservice.
|
|
469
469
|
logProviderCall('POST', 'Chatium', uploadUrl, `file=${filename} size=${buf.length}`);
|
|
@@ -474,7 +474,7 @@ async function handleUpload(req, res) {
|
|
|
474
474
|
if (!ru2.ok || !hashOrErr) {
|
|
475
475
|
return send(res, ru2.status || 502, {
|
|
476
476
|
error: `Chatium upload HTTP ${ru2.status}: ${hashOrErr.slice(0, 200)}`,
|
|
477
|
-
}, { 'X-Provider': '
|
|
477
|
+
}, { 'X-Provider': 'kingkont' });
|
|
478
478
|
}
|
|
479
479
|
// Response = plain text hash.
|
|
480
480
|
return send(res, 200, {
|
|
@@ -482,16 +482,16 @@ async function handleUpload(req, res) {
|
|
|
482
482
|
fileName: filename,
|
|
483
483
|
size: buf.length,
|
|
484
484
|
hash: hashOrErr,
|
|
485
|
-
}, { 'X-Provider': '
|
|
485
|
+
}, { 'X-Provider': 'kingkont' });
|
|
486
486
|
} catch (e) {
|
|
487
487
|
logProviderCall('ERR ', 'Chatium', '/api/upload', e.message);
|
|
488
|
-
return send(res, 502, { error: '
|
|
488
|
+
return send(res, 502, { error: 'KingKont upload: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
489
489
|
}
|
|
490
490
|
}
|
|
491
491
|
|
|
492
492
|
// Прямой KIE (fallback).
|
|
493
493
|
if (!s.useKie) {
|
|
494
|
-
return send(res, 503, { error: '
|
|
494
|
+
return send(res, 503, { error: 'Войдите в KingKont или KIE для загрузки файлов.' });
|
|
495
495
|
}
|
|
496
496
|
if (buf.length > 10 * 1024 * 1024) {
|
|
497
497
|
return send(res, 413, { error: `файл слишком большой для KIE (${(buf.length/1024/1024).toFixed(1)} MB), лимит 10MB` });
|
|
@@ -588,16 +588,16 @@ async function handleText(req, res) {
|
|
|
588
588
|
text: result.result?.text || '',
|
|
589
589
|
model,
|
|
590
590
|
cost: typeof result.creditsCharged === 'number' ? result.creditsCharged : null,
|
|
591
|
-
}, { 'X-Provider': '
|
|
591
|
+
}, { 'X-Provider': 'kingkont' });
|
|
592
592
|
} catch (e) {
|
|
593
593
|
logProviderCall('ERR ', 'Chatium', '/api/text', e.message);
|
|
594
|
-
return send(res, 502, { error: '
|
|
594
|
+
return send(res, 502, { error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
597
|
|
|
598
598
|
// Прямой OpenRouter (если useOpenrouter включён).
|
|
599
599
|
if (!s.useOpenrouter) {
|
|
600
|
-
return send(res, 503, { error: '
|
|
600
|
+
return send(res, 503, { error: 'Войдите в KingKont или OpenRouter для генерации текста.' });
|
|
601
601
|
}
|
|
602
602
|
const key = process.env.OPENROUTER_API_KEY;
|
|
603
603
|
if (!key) return send(res, 500, { error: 'OPENROUTER_API_KEY не задан' });
|
|
@@ -638,7 +638,7 @@ async function handleText(req, res) {
|
|
|
638
638
|
async function handleTransactions(req, res) {
|
|
639
639
|
const s = getSettings();
|
|
640
640
|
if (!s.useChatium || !s.chatium?.token || !s.chatium?.base) {
|
|
641
|
-
return send(res, 503, { error: '
|
|
641
|
+
return send(res, 503, { error: 'KingKont не подключён' });
|
|
642
642
|
}
|
|
643
643
|
const url = s.chatium.base.replace(/\/$/, '') + CHATIUM_PATHS.transactions;
|
|
644
644
|
logProviderCall('GET ', 'Chatium', url);
|
|
@@ -649,11 +649,11 @@ async function handleTransactions(req, res) {
|
|
|
649
649
|
if (!r.ok) {
|
|
650
650
|
return send(res, r.status, {
|
|
651
651
|
error: data?.reason || data?.error || `HTTP ${r.status}`,
|
|
652
|
-
}, { 'X-Provider': '
|
|
652
|
+
}, { 'X-Provider': 'kingkont' });
|
|
653
653
|
}
|
|
654
|
-
send(res, 200, data, { 'X-Provider': '
|
|
654
|
+
send(res, 200, data, { 'X-Provider': 'kingkont' });
|
|
655
655
|
} catch (e) {
|
|
656
|
-
send(res, 502, { error: '
|
|
656
|
+
send(res, 502, { error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
657
657
|
}
|
|
658
658
|
}
|
|
659
659
|
|
|
@@ -661,7 +661,7 @@ async function handleTransactions(req, res) {
|
|
|
661
661
|
async function handleBalance(req, res) {
|
|
662
662
|
const s = getSettings();
|
|
663
663
|
if (!s.useChatium || !s.chatium?.token || !s.chatium?.base) {
|
|
664
|
-
return send(res, 503, { error: '
|
|
664
|
+
return send(res, 503, { error: 'KingKont не подключён' });
|
|
665
665
|
}
|
|
666
666
|
const url = s.chatium.base.replace(/\/$/, '') + CHATIUM_PATHS.balance;
|
|
667
667
|
logProviderCall('GET ', 'Chatium', url);
|
|
@@ -674,11 +674,11 @@ async function handleBalance(req, res) {
|
|
|
674
674
|
if (!r.ok) {
|
|
675
675
|
return send(res, r.status, {
|
|
676
676
|
error: data?.reason || data?.error || `HTTP ${r.status}`,
|
|
677
|
-
}, { 'X-Provider': '
|
|
677
|
+
}, { 'X-Provider': 'kingkont' });
|
|
678
678
|
}
|
|
679
|
-
send(res, 200, data, { 'X-Provider': '
|
|
679
|
+
send(res, 200, data, { 'X-Provider': 'kingkont' });
|
|
680
680
|
} catch (e) {
|
|
681
|
-
send(res, 502, { error: '
|
|
681
|
+
send(res, 502, { error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
682
682
|
}
|
|
683
683
|
}
|
|
684
684
|
|
|
@@ -692,7 +692,7 @@ async function handleSfx(req, res) {
|
|
|
692
692
|
return handleAudioViaChatium(res, s, { kind: 'sfx', text, durationSeconds });
|
|
693
693
|
}
|
|
694
694
|
if (!s.useElevenlabs) {
|
|
695
|
-
return send(res, 503, { error: '
|
|
695
|
+
return send(res, 503, { error: 'Войдите в KingKont или ElevenLabs для аудио.' });
|
|
696
696
|
}
|
|
697
697
|
const key = process.env.ELEVENLABS_API_KEY;
|
|
698
698
|
if (!key) return send(res, 500, { error: 'ELEVENLABS_API_KEY не задан' });
|
|
@@ -722,7 +722,7 @@ async function handleMusic(req, res) {
|
|
|
722
722
|
return handleAudioViaChatium(res, s, { kind: 'music', prompt, durationMs });
|
|
723
723
|
}
|
|
724
724
|
if (!s.useElevenlabs) {
|
|
725
|
-
return send(res, 503, { error: '
|
|
725
|
+
return send(res, 503, { error: 'Войдите в KingKont или ElevenLabs для аудио.' });
|
|
726
726
|
}
|
|
727
727
|
const key = process.env.ELEVENLABS_API_KEY;
|
|
728
728
|
if (!key) return send(res, 500, { error: 'ELEVENLABS_API_KEY не задан' });
|
|
@@ -793,7 +793,7 @@ async function handleTts(req, res) {
|
|
|
793
793
|
|
|
794
794
|
// Прямой ElevenLabs (только eleven_v3, остальные модели только через Chatium).
|
|
795
795
|
if (!s.useElevenlabs) {
|
|
796
|
-
return send(res, 503, { error: '
|
|
796
|
+
return send(res, 503, { error: 'Войдите в KingKont или ElevenLabs для аудио.' });
|
|
797
797
|
}
|
|
798
798
|
const key = process.env.ELEVENLABS_API_KEY;
|
|
799
799
|
if (!key) return send(res, 500, { error: 'ELEVENLABS_API_KEY не задан' });
|
|
@@ -821,10 +821,10 @@ async function handleAudioViaChatium(res, s, body) {
|
|
|
821
821
|
const result = await chatiumWait(s, taskId, 180000);
|
|
822
822
|
const url = result.result?.urls?.[0];
|
|
823
823
|
if (!url) {
|
|
824
|
-
return send(res, 502, { error: 'Chatium завершил аудио-задачу без URL результата' }, { 'X-Provider': '
|
|
824
|
+
return send(res, 502, { error: 'Chatium завершил аудио-задачу без URL результата' }, { 'X-Provider': 'kingkont' });
|
|
825
825
|
}
|
|
826
826
|
logProviderCall('GET ', 'Chatium', url, '(downloading audio)');
|
|
827
|
-
const headers = { 'X-Provider': '
|
|
827
|
+
const headers = { 'X-Provider': 'kingkont' };
|
|
828
828
|
if (typeof result.creditsCharged === 'number') {
|
|
829
829
|
headers['X-Cost-Credits'] = String(result.creditsCharged);
|
|
830
830
|
}
|
|
@@ -832,7 +832,7 @@ async function handleAudioViaChatium(res, s, body) {
|
|
|
832
832
|
} catch (e) {
|
|
833
833
|
logProviderCall('ERR ', 'Chatium', '/api/audio', e.message);
|
|
834
834
|
if (!res.headersSent) {
|
|
835
|
-
send(res, 502, { error: '
|
|
835
|
+
send(res, 502, { error: 'KingKont: ' + e.message }, { 'X-Provider': 'kingkont' });
|
|
836
836
|
} else {
|
|
837
837
|
res.end();
|
|
838
838
|
}
|