odant-work 1.0.15 → 1.0.17
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/#system/package-manifest.json +57 -49
- package/$server/$folder/handlers/methods/create/$handler/class.js +83 -2
- package/$server/$folder/handlers/pages/form/$handler/form.js +2 -1
- package/$server/$folder/lib/icon/icon.js +14 -0
- package/$server/$folder/lib/node/node.js +51 -1
- package/$server/$folder/lib/tree/tree.js +5 -1
- package/.secretsignore +4 -0
- package/MODELS/$ai/$folder/$class/$ai/class.js +58 -3
- package/MODELS/$ai/$folder/$class/$ai/handlers/pages/form/trainer/$handler/class.js +6 -4
- package/MODELS/$ai/$folder/$class/$ai/handlers/pages/form/trainer/$handler/trainer.js +344 -3
- package/MODELS/$ai/$folder/$class/$provider/class.js +1 -1
- package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/class.js +13 -0
- package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/provider.js +479 -0
- package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/class.js +3 -3
- package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/trainer.js +530 -920
- package/MODELS/GigaChat/$provider/$folder/$class/$ai/class.js +10 -20
- package/MODELS/GigaChat/$provider/class.js +10 -7
- package/MODELS/GigaChat/GigaChat 2 Lite/$ai/class.js +15 -0
- package/MODELS/GigaChat/GigaChat 2 Max/$ai/class.js +16 -0
- package/MODELS/GigaChat/GigaChat 2 Pro/$ai/class.js +15 -0
- package/MODELS/GigaChat/GigaChat Embeddings/$ai/class.js +13 -0
- package/MODELS/Local/$provider/$folder/$class/$ai/class.js +3 -3
- package/MODELS/Local/$provider/class.js +7 -3
- package/MODELS/MTS-AI/$provider/$folder/$class/$ai/class.js +8 -0
- package/MODELS/MTS-AI/$provider/class.js +8 -0
- package/MODELS/MTS-AI/Cotype Lite/$ai/class.js +15 -0
- package/MODELS/MTS-AI/Cotype Pro 2/$ai/class.js +15 -0
- package/MODELS/MTS-AI/Cotype Vision/$ai/class.js +14 -0
- package/MODELS/T-Bank/$provider/$folder/$class/$ai/class.js +8 -0
- package/MODELS/T-Bank/$provider/class.js +8 -0
- package/MODELS/T-Bank/T-Lite 2.0/$ai/class.js +15 -0
- package/MODELS/T-Bank/T-Pro 2.0/$ai/class.js +16 -0
- package/MODELS/T-Bank/T-VoiceKit ASR/$ai/class.js +13 -0
- package/MODELS/T-Bank/T-VoiceKit TTS/$ai/class.js +13 -0
- package/MODELS/Yandex/$provider/$folder/$class/$ai/class.js +9 -0
- package/MODELS/Yandex/$provider/class.js +9 -0
- package/MODELS/Yandex/Alice AI (YandexGPT 5 Pro)/$ai/class.js +15 -0
- package/MODELS/Yandex/Yandex Embeddings/$ai/class.js +13 -0
- package/MODELS/Yandex/Yandex SpeechKit ASR/$ai/class.js +13 -0
- package/MODELS/Yandex/Yandex SpeechKit TTS/$ai/class.js +13 -0
- package/MODELS/Yandex/YandexART/$ai/class.js +13 -0
- package/MODELS/Yandex/YandexGPT 5 Lite/$ai/class.js +15 -0
- package/MODELS/Yandex/YandexGPT Reasoning/$ai/class.js +22 -0
- package/oda/tools/icons/lib/svg/ai.svg +20 -0
- package/package.json +1 -1
- package/scripts/check-ignored-code.mjs +3 -0
- package/scripts/check-secrets.mjs +1 -1
- package/sources/data/progress.md +24 -0
- package/sources/host/watch.js +13 -2
- package/sources/modules/agent/index.js +23 -2
- package/sources/modules/trainer/halogen.js +128 -29
- package/sources/modules/trainer/huggingface.js +11 -5
- package/sources/modules/trainer/index.js +176 -3
- package/sources/modules/trainer/local-engine.js +67 -1
- package/sources/modules/trainer/providers.js +1213 -0
- package/sources/modules/trainer/runner.js +47 -1
- package/sources/server/class.js +55 -3
- package/MODELS/GigaChat/GigaChat Light/$ai/class.js +0 -15
- package/MODELS/GigaChat/GigaChat Pro/$ai/class.js +0 -15
- package/MODELS/Halogen/$provider/$folder/$class/$ai/class.js +0 -11
- package/MODELS/Halogen/$provider/class.js +0 -16
- package/MODELS/Halogen/$provider/readme.md +0 -28
- package/MODELS/Halogen/Decider-NPU/$ai/class.js +0 -22
- package/MODELS/Halogen/Flux2-Klein-NPU/$ai/class.js +0 -21
- package/MODELS/Halogen/Qwen3-ASR-NPU/$ai/class.js +0 -21
- package/MODELS/Halogen/Qwen3-Embedding-NPU/$ai/class.js +0 -22
- package/MODELS/Halogen/Qwen3-Reranker-NPU/$ai/class.js +0 -21
- package/MODELS/Halogen/Qwen3-TTS-NPU/$ai/class.js +0 -26
- package/MODELS/Halogen/Qwen3.5-2B-NPU/$ai/class.js +0 -23
- package/MODELS/Halogen/Qwen3.8-Flash-Next/$ai/class.js +0 -31
- package/MODELS/Local/Flux-Image/$ai/class.js +0 -20
- package/MODELS/Local/Qwen3-0.6B/$ai/class.js +0 -26
- package/MODELS/Local/Qwen3-14B/$ai/class.js +0 -27
- package/MODELS/Local/Qwen3-30B-A3B/$ai/class.js +0 -30
- package/MODELS/Local/Qwen3-Embedding/$ai/class.js +0 -21
- package/MODELS/Local/Qwen3-Voice/$ai/class.js +0 -26
- package/MODELS/odant/$provider/$folder/$class/$ai/class.js +0 -11
- package/MODELS/odant/$provider/class.js +0 -75
- package/MODELS/odant/$provider/readme.md +0 -21
- package/MODELS/odant/Qwen3-ASR/$ai/class.js +0 -15
- package/MODELS/odant/Qwen3-TTS/$ai/class.js +0 -22
- package/MODELS/odant/Qwen3.8 27b/$ai/class.js +0 -11
- package/MODELS/odant/Z-Image-Turbo/$ai/class.js +0 -8
- package/MODELS/odant/Z-Image-Turbo/$ai/readme.md +0 -24
|
@@ -230,22 +230,68 @@ export async function listLocalModelsAndAdapters(rootDir = process.cwd()) {
|
|
|
230
230
|
const aiClassFile = path.join(localRoot, e.name, '$ai', 'class.js');
|
|
231
231
|
const weightsDir = path.join(localRoot, e.name, '#weights');
|
|
232
232
|
let weightFiles = [];
|
|
233
|
+
let sizeBytes = 0;
|
|
233
234
|
if (fs.existsSync(weightsDir)) {
|
|
234
235
|
const wf = await fsp.readdir(weightsDir).catch(() => []);
|
|
235
|
-
weightFiles = wf.filter(f => !f.endsWith('.part'));
|
|
236
|
+
weightFiles = wf.filter(f => !f.endsWith('.part') && f !== 'hf-manifest.json');
|
|
237
|
+
for (const f of weightFiles) {
|
|
238
|
+
try {
|
|
239
|
+
const st = await fsp.stat(path.join(weightsDir, f));
|
|
240
|
+
sizeBytes += st.size || 0;
|
|
241
|
+
}
|
|
242
|
+
catch { /* ignore */ }
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
let meta = {};
|
|
246
|
+
if (fs.existsSync(aiClassFile)) {
|
|
247
|
+
try {
|
|
248
|
+
const raw = await fsp.readFile(aiClassFile, 'utf-8');
|
|
249
|
+
const jsonPart = raw.replace(/^[^{]*/, '').replace(/;\s*$/, '');
|
|
250
|
+
meta = JSON.parse(jsonPart);
|
|
251
|
+
}
|
|
252
|
+
catch { /* non-json class.js */ }
|
|
236
253
|
}
|
|
237
254
|
if (fs.existsSync(aiClassFile) || weightFiles.length) {
|
|
255
|
+
const enabled = meta.enabled !== false;
|
|
256
|
+
const hasWeights = weightFiles.length > 0;
|
|
238
257
|
models.push({
|
|
239
258
|
id: e.name,
|
|
259
|
+
label: meta.label || e.name,
|
|
260
|
+
icon: meta.icon || 'ai:ollama',
|
|
261
|
+
modality: meta.modality || 'llm',
|
|
262
|
+
model: meta.model || meta.hfRepo || e.name,
|
|
263
|
+
capabilities: Array.isArray(meta.capabilities) ? meta.capabilities : ['chat', 'stream'],
|
|
264
|
+
maxTokens: meta.maxTokens || 16384,
|
|
265
|
+
enabled,
|
|
266
|
+
active: enabled && hasWeights,
|
|
240
267
|
path: `/MODELS/Local/${e.name}`,
|
|
241
268
|
hasClass: fs.existsSync(aiClassFile),
|
|
242
269
|
weightFiles,
|
|
270
|
+
sizeGb: +(sizeBytes / (1024 ** 3)).toFixed(2),
|
|
243
271
|
});
|
|
244
272
|
}
|
|
245
273
|
}
|
|
246
274
|
return { models, adapters };
|
|
247
275
|
}
|
|
248
276
|
|
|
277
|
+
/**
|
|
278
|
+
* Полностью удалить локальную модель `/MODELS/Local/<modelId>` вместе с её весами `#weights` и узлом `$ai`.
|
|
279
|
+
*/
|
|
280
|
+
export async function deleteLocalModel({ rootDir = process.cwd(), modelId } = {}) {
|
|
281
|
+
const cleanId = String(modelId || '').replace(/^\/?MODELS\/Local\//i, '').replace(/[<>:"/\\|?*]/g, '').trim();
|
|
282
|
+
if (!cleanId || cleanId.startsWith('$') || cleanId.startsWith('.'))
|
|
283
|
+
throw new Error('Некорректное имя удаляемой модели: ' + modelId);
|
|
284
|
+
const targetDir = path.join(rootDir, 'MODELS', 'Local', cleanId);
|
|
285
|
+
const localRoot = path.join(rootDir, 'MODELS', 'Local');
|
|
286
|
+
const rel = path.relative(localRoot, targetDir);
|
|
287
|
+
if (!rel || rel.startsWith('..') || path.isAbsolute(rel))
|
|
288
|
+
throw new Error('Запрещённый путь удаления: ' + targetDir);
|
|
289
|
+
if (fs.existsSync(targetDir)) {
|
|
290
|
+
await fsp.rm(targetDir, { recursive: true, force: true });
|
|
291
|
+
}
|
|
292
|
+
return { ok: true, deletedId: cleanId, deletedPath: `/MODELS/Local/${cleanId}` };
|
|
293
|
+
}
|
|
294
|
+
|
|
249
295
|
/**
|
|
250
296
|
* Запустить задачу дообучения Unsloth (`mode: 'sft' | 'grpo'`), адаптируя параметры по умолчанию под реальное железо.
|
|
251
297
|
*/
|
package/sources/server/class.js
CHANGED
|
@@ -19,7 +19,14 @@ import * as POLICY from './access/policy.js';
|
|
|
19
19
|
import * as LINKS from './access/links.js';
|
|
20
20
|
import * as WORKPLACES from './access/workplaces.js';
|
|
21
21
|
import { DATA_METHODS, classHasObjects, classObjectCount, markClassesDirty } from '../data/api.js';
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
TRAINER_METHODS,
|
|
24
|
+
localStreamChat,
|
|
25
|
+
halogenFallback,
|
|
26
|
+
evaluateAiNodeActivitySync,
|
|
27
|
+
scaffoldProviderOnDiskSync,
|
|
28
|
+
findProviderPreset,
|
|
29
|
+
} from '../modules/trainer/index.js';
|
|
23
30
|
import { LICENSE_METHODS } from '../modules/license/index.js';
|
|
24
31
|
import { NOTIFY_METHODS, resolveBotForPoint, sanitizeBotForUi } from '../modules/notify/index.js';
|
|
25
32
|
import { DATA_TYPES } from '../data/classes.js';
|
|
@@ -156,6 +163,20 @@ export class $class extends $folder {
|
|
|
156
163
|
return undefined;
|
|
157
164
|
return this.DATA?.modality ?? this.DATA?.$public?.modality;
|
|
158
165
|
},
|
|
166
|
+
get aiActive() {
|
|
167
|
+
if (this.type !== '$ai' && this.type !== '$provider')
|
|
168
|
+
return undefined;
|
|
169
|
+
if (typeof this.DATA?.aiActive === 'boolean')
|
|
170
|
+
return this.DATA.aiActive;
|
|
171
|
+
return evaluateAiNodeActivitySync(this).active;
|
|
172
|
+
},
|
|
173
|
+
get aiStatusReason() {
|
|
174
|
+
if (this.type !== '$ai' && this.type !== '$provider')
|
|
175
|
+
return undefined;
|
|
176
|
+
if (typeof this.DATA?.aiStatusReason === 'string')
|
|
177
|
+
return this.DATA.aiStatusReason;
|
|
178
|
+
return evaluateAiNodeActivitySync(this).reason;
|
|
179
|
+
},
|
|
159
180
|
};
|
|
160
181
|
}
|
|
161
182
|
|
|
@@ -196,6 +217,11 @@ export class $class extends $folder {
|
|
|
196
217
|
this.DATA.systemBlocked = sysBlocked;
|
|
197
218
|
this.DATA.enabled = localEnabled && !sysBlocked;
|
|
198
219
|
}
|
|
220
|
+
if ((this.type === '$provider' || this.type === '$ai') && this.DATA) {
|
|
221
|
+
const act = evaluateAiNodeActivitySync(this);
|
|
222
|
+
this.DATA.aiActive = act.active;
|
|
223
|
+
this.DATA.aiStatusReason = act.reason;
|
|
224
|
+
}
|
|
199
225
|
const arg = Object.assign({}, p);
|
|
200
226
|
return super.info(arg);
|
|
201
227
|
}
|
|
@@ -477,11 +503,14 @@ export class $class extends $folder {
|
|
|
477
503
|
|
|
478
504
|
get meta_folder() {
|
|
479
505
|
try {
|
|
480
|
-
if (!fs.existsSync(this.real_dir))
|
|
506
|
+
if (!fs.existsSync(this.real_dir)) {
|
|
507
|
+
if (this.constructor.name === '$class')
|
|
508
|
+
return undefined;
|
|
481
509
|
fs.mkdirSync(this.real_dir + '/' + this.constructor.name, { recursive: true });
|
|
510
|
+
}
|
|
482
511
|
const metaId = fs.readdirSync(this.real_dir).find(f => f[0] === '$')
|
|
483
512
|
|| (this instanceof FS.$handler ? this.constructor.name : undefined);
|
|
484
|
-
return FS.$folder.build(metaId, this);
|
|
513
|
+
return metaId ? FS.$folder.build(metaId, this) : undefined;
|
|
485
514
|
}
|
|
486
515
|
catch (e) {
|
|
487
516
|
console.warn('[WORK] meta_folder:', e.message);
|
|
@@ -687,6 +716,29 @@ export class $class extends $folder {
|
|
|
687
716
|
this.reset();
|
|
688
717
|
}
|
|
689
718
|
}
|
|
719
|
+
const inModels = this.path === '/MODELS' || String(this.path || '').startsWith('/MODELS/');
|
|
720
|
+
if (allowScaffold && inModels && type === '$provider' && p.post == null) {
|
|
721
|
+
const preset = findProviderPreset(p.providerPreset || id);
|
|
722
|
+
if (preset || p.baseUrl || p.protocol || p.apiKey) {
|
|
723
|
+
scaffoldProviderOnDiskSync({
|
|
724
|
+
providerId: id,
|
|
725
|
+
presetId: p.providerPreset || id,
|
|
726
|
+
label: p.label || preset?.label || id,
|
|
727
|
+
baseUrl: p.baseUrl || preset?.baseUrl || '',
|
|
728
|
+
protocol: p.protocol || preset?.protocol || 'openai',
|
|
729
|
+
icon: explicitIcon || preset?.icon || 'carbon:api',
|
|
730
|
+
apiKey: p.apiKey || '',
|
|
731
|
+
folderId: p.folderId || '',
|
|
732
|
+
includeDefaultModels: p.includeDefaultModels !== false && p.includeDefaultModels !== 'false',
|
|
733
|
+
});
|
|
734
|
+
const createdItem = await this._get_next_item(id, ctor);
|
|
735
|
+
if (createdItem) {
|
|
736
|
+
createdItem.reset?.();
|
|
737
|
+
createdItem.DATA = await createdItem.import?.();
|
|
738
|
+
}
|
|
739
|
+
this.reset();
|
|
740
|
+
}
|
|
741
|
+
}
|
|
690
742
|
markClassesDirty();
|
|
691
743
|
return log;
|
|
692
744
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GigaChat Light — облегчённая модель GigaChat.
|
|
3
|
-
*
|
|
4
|
-
* Наследует настройки провайдера из родителя (models/GigaChat).
|
|
5
|
-
* Здесь только модельные параметры: model, maxTokens, capabilities.
|
|
6
|
-
*/
|
|
7
|
-
export default {
|
|
8
|
-
label: 'GigaChat Light',
|
|
9
|
-
|
|
10
|
-
model: 'GigaChat-2',
|
|
11
|
-
|
|
12
|
-
maxTokens: 32768,
|
|
13
|
-
capabilities: ['chat', 'stream', 'functions'],
|
|
14
|
-
functionCalling: true,
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GigaChat Pro — продвинутая модель GigaChat.
|
|
3
|
-
*
|
|
4
|
-
* Наследует настройки провайдера из родителя (models/GigaChat).
|
|
5
|
-
* Здесь только модельные параметры: model, maxTokens, capabilities.
|
|
6
|
-
*/
|
|
7
|
-
export default {
|
|
8
|
-
label: 'GigaChat Pro',
|
|
9
|
-
|
|
10
|
-
model: 'GigaChat-Pro',
|
|
11
|
-
|
|
12
|
-
maxTokens: 4096,
|
|
13
|
-
capabilities: ['chat', 'stream', 'functions'],
|
|
14
|
-
functionCalling: true,
|
|
15
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Halogen — прототип моделей ($ai) гибридного провайдера /MODELS/Halogen.
|
|
3
|
-
* Наследуется всеми моделями в /MODELS/Halogen/* через tilde (cross-type $provider → $ai).
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
icon: 'ai:qwen',
|
|
7
|
-
description: 'Гибридная модель Halogen (AMD Ryzen AI 495 Pro 192 GB: iGPU + NPU)',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/chat/completions',
|
|
10
|
-
functionCalling: true,
|
|
11
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Halogen — гибридный провайдер ($provider) локального инференса (iGPU Radeon 8065S gfx1151 + Ryzen AI NPU 55 TOPS)
|
|
3
|
-
* для ПАК ODANT-WORK на базе AMD Ryzen™ AI Max+ PRO 495 · 192 ГБ Unified Memory.
|
|
4
|
-
*
|
|
5
|
-
* Реализует Вариант 3 (Универсальный гибрид):
|
|
6
|
-
* - на Linux: прямое подключение к `halogen-flash-server` (:8731);
|
|
7
|
-
* - на Windows 11: локальный `llama-server` (ROCm/Vulkan) с Prompt Cache и Speculative Decoding + NPU/DirectML-контур;
|
|
8
|
-
* - при отсутствии внешнего процесса на :8731 автоматически работает через встроенный движок WORK.
|
|
9
|
-
*/
|
|
10
|
-
export default {
|
|
11
|
-
icon: 'carbon:chip',
|
|
12
|
-
label: 'Halogen (Ryzen AI 192 GB)',
|
|
13
|
-
protocol: 'halogen',
|
|
14
|
-
form: 'trainer',
|
|
15
|
-
baseUrl: 'http://127.0.0.1:8731/v1/chat/completions',
|
|
16
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Провайдер `/MODELS/Halogen` (AMD Ryzen AI Max+ PRO 495 · 192 ГБ Unified Memory)
|
|
2
|
-
|
|
3
|
-
Универсальный гибридный провайдер локального ИИ по архитектуре [`peonist-ai/halogen-flash-server`](https://github.com/peonist-ai/halogen-flash-server), объединяющий за единым портом `8731` основную агентскую модель на iGPU (`Radeon 8065S / gfx1151`) и семейство специализированных моделей на нейропроцессоре **AMD Ryzen AI NPU (`55 TOPS`)**.
|
|
4
|
-
|
|
5
|
-
## Режимы работы (Универсальный гибрид)
|
|
6
|
-
|
|
7
|
-
1. **Linux Native (`halogen-flash-server:0.19.1`):**
|
|
8
|
-
- прямая регистрация 62 ГБ весов `Qwen3.8-Flash-Next` в памяти GPU через `/dev/kfd` (`CONFIG_HSA_AMD_SVM`, `HALOGEN_WEIGHTS_LOCK=1`);
|
|
9
|
-
- KV-пул на `524 288` токенов (`4` слота), `47.7 ГБ` FP8 n-gram lookup-таблица целиком в ОЗУ;
|
|
10
|
-
- аппаратный NPU (`/dev/accel/accel0`, `amdxdna`) для малых моделей (`HALOGEN_NPU_MODELS`).
|
|
11
|
-
2. **Windows 11 Hybrid (`llama-server.exe` ROCm/Vulkan + WORK NPU Engine):**
|
|
12
|
-
- запуск `Qwen3.8-Flash-Next` / `Qwen3` в GGUF на iGPU с общим пулом памяти до 175 ГБ, Prompt Cache (`--cache-reuse 256`), Speculative Lookup (`--lookup-cache-dynamic`) и сохранением слотов;
|
|
13
|
-
- обслуживание NPU-моделей (TTS, ASR, Image, Embeddings, Rerank, Decider) без вымывания кэша основной модели.
|
|
14
|
-
3. **Встроенный фоллбэк WORK (`work-embedded-fallback`):**
|
|
15
|
-
- если внешний сервер на `:8731` не запущен, все вызовы моделей `/MODELS/Halogen/*` автоматически обрабатываются встроенным локальным контуром WORK (`localStreamChat` + `halogenFallback`).
|
|
16
|
-
|
|
17
|
-
## Состав моделей в `/MODELS/Halogen`
|
|
18
|
-
|
|
19
|
-
| Узел WORK | Модель (`model`) | Вычислитель | Назначение в WORK |
|
|
20
|
-
| :--- | :--- | :--- | :--- |
|
|
21
|
-
| `/MODELS/Halogen/Qwen3.8-Flash-Next` | `halogen-qwen3.8-flash-next` | iGPU (`gfx1151`) | Основная модель агента (`ai/config.js → model`), 262k контекст, `tools`, `vision`, `effort`, `fork` |
|
|
22
|
-
| `/MODELS/Halogen/Qwen3.5-2B-NPU` | `qwen3.5-2b` | Ryzen AI NPU | Быстрое сжатие контекста (`ai/config.js → compactModel`) и сводки без нагрузки на GPU |
|
|
23
|
-
| `/MODELS/Halogen/Qwen3-ASR-NPU` | `qwen3-asr-1.7b` | Ryzen AI NPU | Распознавание речи в голосовом режиме задачи (`ai/config.js → sttModel`) |
|
|
24
|
-
| `/MODELS/Halogen/Qwen3-TTS-NPU` | `qwen3-tts-1.7b-customvoice` | Ryzen AI NPU | Попредложенческий синтез речи с поддержкой Barge-In (`ai/config.js → ttsModel`) |
|
|
25
|
-
| `/MODELS/Halogen/Flux2-Klein-NPU` | `flux2-klein-4b` | Ryzen AI NPU | Генерация и редактирование иллюстраций до 1024×1024 (`ai/config.js → imageModel`) |
|
|
26
|
-
| `/MODELS/Halogen/Qwen3-Embedding-NPU` | `qwen3-embedding-0.6b` | Ryzen AI NPU | Векторные эмбеддинги 1024d для семантического поиска (RAG) |
|
|
27
|
-
| `/MODELS/Halogen/Qwen3-Reranker-NPU` | `qwen3-reranker-0.6b` | Ryzen AI NPU | Семантическое ранжирование документов (`/v1/rerank`) |
|
|
28
|
-
| `/MODELS/Halogen/Decider-NPU` | `decider-0.8b` | Ryzen AI NPU | Однопроходный классификатор System One (`/v1/systemone`, ~45 мс) |
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Однопроходный классификатор на NPU: Decider-0.8B (`/v1/systemone`)
|
|
3
|
-
* Назначение: сверхбыстрые решения (choice / score / noul за ~45 мс) для маршрутизации запросов и голосового AI Barge-In.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Decider 0.8B (NPU SystemOne)',
|
|
7
|
-
icon: 'carbon:decision-tree',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/systemone',
|
|
10
|
-
model: 'decider-0.8b',
|
|
11
|
-
modality: 'llm',
|
|
12
|
-
maxTokens: 8192,
|
|
13
|
-
maxOutput: 512,
|
|
14
|
-
functionCalling: false,
|
|
15
|
-
capabilities: [
|
|
16
|
-
'decide',
|
|
17
|
-
'classify',
|
|
18
|
-
],
|
|
19
|
-
hfRepo: 'peonist-ai/halogen-npu-decider-0.8b',
|
|
20
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
21
|
-
trustLevel: 0,
|
|
22
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Генерация и редактирование изображений на NPU: FLUX.2-klein-4B (`/v1/images/generations`, `/v1/images/edits`)
|
|
3
|
-
* Назначение: создание иконок, схем, иллюстраций и карточек номенклатуры до 1024×1024 за 4 шага (`ai/config.js → imageModel`).
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'FLUX.2-klein 4B (NPU Image)',
|
|
7
|
-
icon: 'ai:stablediffusion',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/images/generations',
|
|
10
|
-
model: 'flux2-klein-4b',
|
|
11
|
-
modality: 'image',
|
|
12
|
-
maxTokens: 4096,
|
|
13
|
-
functionCalling: false,
|
|
14
|
-
capabilities: [
|
|
15
|
-
'image',
|
|
16
|
-
'text-to-image',
|
|
17
|
-
],
|
|
18
|
-
hfRepo: 'peonist-ai/halogen-npu-flux2-klein-4b',
|
|
19
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
20
|
-
trustLevel: 0,
|
|
21
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Распознавание речи на NPU: Qwen3-ASR-1.7B (`/v1/audio/transcriptions`)
|
|
3
|
-
* Назначение: голосовой режим задачи (`ai/config.js → sttModel`), записи WAV до 20 минут.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen3-ASR 1.7B (NPU STT)',
|
|
7
|
-
icon: 'carbon:microphone',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/audio/transcriptions',
|
|
10
|
-
model: 'qwen3-asr-1.7b',
|
|
11
|
-
modality: 'audio',
|
|
12
|
-
maxTokens: 4096,
|
|
13
|
-
capabilities: [
|
|
14
|
-
'stt',
|
|
15
|
-
'asr',
|
|
16
|
-
],
|
|
17
|
-
language: 'ru',
|
|
18
|
-
hfRepo: 'peonist-ai/halogen-npu-qwen3-asr-1.7b',
|
|
19
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
20
|
-
trustLevel: 0,
|
|
21
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Векторные эмбеддинги на NPU: Qwen3-Embedding-0.6B (`/v1/embeddings`)
|
|
3
|
-
* Назначение: семантический поиск (RAG) по документам, задачам `.task` и справочникам WORK (~52 мс на запрос).
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen3-Embedding 0.6B (NPU RAG)',
|
|
7
|
-
icon: 'carbon:search-locate',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/embeddings',
|
|
10
|
-
model: 'qwen3-embedding-0.6b',
|
|
11
|
-
modality: 'embed',
|
|
12
|
-
maxTokens: 8192,
|
|
13
|
-
functionCalling: false,
|
|
14
|
-
capabilities: [
|
|
15
|
-
'embeddings',
|
|
16
|
-
'embedding',
|
|
17
|
-
'rag',
|
|
18
|
-
],
|
|
19
|
-
hfRepo: 'peonist-ai/halogen-npu-qwen3-embedding-0.6b',
|
|
20
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
21
|
-
trustLevel: 0,
|
|
22
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Семантический реранкер на NPU: Qwen3-Reranker-0.6B (`/v1/rerank`)
|
|
3
|
-
* Назначение: точное ранжирование найденных фрагментов документов и объектов учёта по релевантности запросу.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen3-Reranker 0.6B (NPU Rerank)',
|
|
7
|
-
icon: 'carbon:filter',
|
|
8
|
-
protocol: 'halogen',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8731/v1/rerank',
|
|
10
|
-
model: 'qwen3-reranker-0.6b',
|
|
11
|
-
modality: 'embed',
|
|
12
|
-
maxTokens: 8192,
|
|
13
|
-
functionCalling: false,
|
|
14
|
-
capabilities: [
|
|
15
|
-
'rerank',
|
|
16
|
-
'rag',
|
|
17
|
-
],
|
|
18
|
-
hfRepo: 'peonist-ai/halogen-npu-qwen3-reranker-0.6b',
|
|
19
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
20
|
-
trustLevel: 0,
|
|
21
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Синтез речи на NPU: Qwen3-TTS-1.7B CustomVoice (`/v1/audio/speech`)
|
|
3
|
-
* Назначение: озвучивание ответов агента в голосовом режиме задачи (`ai/config.js → ttsModel`),
|
|
4
|
-
* первый звук через ~350 мс, поддержка живого перебивания (Barge-In).
|
|
5
|
-
*/
|
|
6
|
-
export default {
|
|
7
|
-
label: 'Qwen3-TTS 1.7B (NPU Voice)',
|
|
8
|
-
icon: 'carbon:volume-up',
|
|
9
|
-
protocol: 'halogen',
|
|
10
|
-
baseUrl: 'http://127.0.0.1:8731/v1/audio/speech',
|
|
11
|
-
model: 'qwen3-tts-1.7b-customvoice',
|
|
12
|
-
modality: 'audio',
|
|
13
|
-
maxTokens: 4096,
|
|
14
|
-
capabilities: [
|
|
15
|
-
'tts',
|
|
16
|
-
'voice',
|
|
17
|
-
],
|
|
18
|
-
ttsTask: 'CustomVoice',
|
|
19
|
-
voice: 'serena',
|
|
20
|
-
language: 'russian',
|
|
21
|
-
seed: 42,
|
|
22
|
-
instructions: 'Calm, confident, friendly business assistant, clear studio diction, moderate conversational pace.',
|
|
23
|
-
hfRepo: 'peonist-ai/halogen-npu-qwen3-tts-1.7b-customvoice',
|
|
24
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
25
|
-
trustLevel: 0,
|
|
26
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Малая генеративная модель на NPU: Qwen3.5-2B (Ryzen AI NPU sidecar)
|
|
3
|
-
* Назначение: мгновенное фоновое сжатие контекста (`ai/config.js → compactModel`) и краткие сводки
|
|
4
|
-
* (~39 tok/s на NPU без вымывания KV-пула основной модели на GPU).
|
|
5
|
-
*/
|
|
6
|
-
export default {
|
|
7
|
-
label: 'Qwen3.5-2B (NPU Compact)',
|
|
8
|
-
icon: 'ai:qwen',
|
|
9
|
-
protocol: 'halogen',
|
|
10
|
-
baseUrl: 'http://127.0.0.1:8731/v1/chat/completions',
|
|
11
|
-
model: 'qwen3.5-2b',
|
|
12
|
-
modality: 'llm',
|
|
13
|
-
maxTokens: 32768,
|
|
14
|
-
maxOutput: 4096,
|
|
15
|
-
functionCalling: false,
|
|
16
|
-
capabilities: [
|
|
17
|
-
'chat',
|
|
18
|
-
'stream',
|
|
19
|
-
],
|
|
20
|
-
hfRepo: 'peonist-ai/halogen-npu-qwen3.5-2b',
|
|
21
|
-
device: 'Ryzen AI NPU (55 TOPS)',
|
|
22
|
-
trustLevel: 0,
|
|
23
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Флагманская модель Halogen: Qwen3.8-Flash-Next (180B MoE, 4.16 bpw + FP8 n-gram lookup table)
|
|
3
|
-
* Вычислитель: iGPU AMD Radeon 8065S (gfx1151) · 192 ГБ Unified Memory
|
|
4
|
-
* Скорость: 73–94 tok/s decode, ~1800 tok/s prefill, первый токен в длинной агентской сессии за ~1.6 с.
|
|
5
|
-
*/
|
|
6
|
-
export default {
|
|
7
|
-
label: 'Qwen3.8-Flash-Next (180B MoE)',
|
|
8
|
-
icon: 'ai:qwen',
|
|
9
|
-
protocol: 'halogen',
|
|
10
|
-
baseUrl: 'http://127.0.0.1:8731/v1/chat/completions',
|
|
11
|
-
model: 'halogen-qwen3.8-flash-next',
|
|
12
|
-
modality: 'llm',
|
|
13
|
-
maxTokens: 262144,
|
|
14
|
-
maxOutput: 32768,
|
|
15
|
-
efforts: ['off', 'low', 'medium', 'high'],
|
|
16
|
-
effort: 'low',
|
|
17
|
-
functionCalling: true,
|
|
18
|
-
capabilities: [
|
|
19
|
-
'chat',
|
|
20
|
-
'stream',
|
|
21
|
-
'tools',
|
|
22
|
-
'functions',
|
|
23
|
-
'vision',
|
|
24
|
-
'effort',
|
|
25
|
-
'thinking',
|
|
26
|
-
'fork',
|
|
27
|
-
],
|
|
28
|
-
hfRepo: 'peonist-ai/halogen-qwen3.8-flash-next',
|
|
29
|
-
device: 'iGPU Radeon 8065S (gfx1151)',
|
|
30
|
-
trustLevel: 0,
|
|
31
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Предустановленная модель ПАК WORK: Генерация изображений (FLUX.1-schnell)
|
|
3
|
-
* Назначение: локальный синтез иллюстраций, карточек номенклатуры, схем и визуальных материалов.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Flux-Image (Генерация изображений)',
|
|
7
|
-
icon: 'ai:stablediffusion',
|
|
8
|
-
protocol: 'local',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8080/v1/images/generations',
|
|
10
|
-
model: 'black-forest-labs/FLUX.1-schnell',
|
|
11
|
-
modality: 'image',
|
|
12
|
-
capabilities: [
|
|
13
|
-
'image',
|
|
14
|
-
'text-to-image',
|
|
15
|
-
],
|
|
16
|
-
hfRepo: 'black-forest-labs/FLUX.1-schnell',
|
|
17
|
-
weightsDir: 'MODELS/Local/Flux-Image/#weights',
|
|
18
|
-
primaryFile: 'flux1-schnell.safetensors',
|
|
19
|
-
pakPreinstalled: true,
|
|
20
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Локальная модель ИИ: Qwen3-0.6B (llm)
|
|
3
|
-
* Репозиторий Hugging Face: Qwen/Qwen3-0.6B
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
"label": "Qwen3-0.6B",
|
|
7
|
-
"icon": "ai:qwen",
|
|
8
|
-
"protocol": "local",
|
|
9
|
-
"baseUrl": "http://127.0.0.1:8080/v1/chat/completions",
|
|
10
|
-
"model": "Qwen/Qwen3-0.6B",
|
|
11
|
-
"modality": "llm",
|
|
12
|
-
"maxTokens": 16384,
|
|
13
|
-
"maxOutput": 8192,
|
|
14
|
-
"functionCalling": true,
|
|
15
|
-
"capabilities": [
|
|
16
|
-
"chat",
|
|
17
|
-
"stream",
|
|
18
|
-
"tools",
|
|
19
|
-
"functions",
|
|
20
|
-
"thinking",
|
|
21
|
-
"lora"
|
|
22
|
-
],
|
|
23
|
-
"hfRepo": "Qwen/Qwen3-0.6B",
|
|
24
|
-
"weightsDir": "MODELS/Local/Qwen3-0.6B/#weights",
|
|
25
|
-
"primaryFile": "model.safetensors"
|
|
26
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Локальная модель ИИ: Qwen3-14B (llm)
|
|
3
|
-
* Репозиторий Hugging Face: Qwen/Qwen3-14B
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
"label": "Qwen3-14B",
|
|
7
|
-
"icon": "ai:qwen",
|
|
8
|
-
"protocol": "local",
|
|
9
|
-
"baseUrl": "http://127.0.0.1:8080/v1/chat/completions",
|
|
10
|
-
"model": "Qwen/Qwen3-14B",
|
|
11
|
-
"modality": "llm",
|
|
12
|
-
"maxTokens": 16384,
|
|
13
|
-
"maxOutput": 8192,
|
|
14
|
-
"functionCalling": true,
|
|
15
|
-
"capabilities": [
|
|
16
|
-
"chat",
|
|
17
|
-
"tools",
|
|
18
|
-
"thinking",
|
|
19
|
-
"coding",
|
|
20
|
-
"lora",
|
|
21
|
-
"stream",
|
|
22
|
-
"functions"
|
|
23
|
-
],
|
|
24
|
-
"hfRepo": "Qwen/Qwen3-14B",
|
|
25
|
-
"weightsDir": "MODELS/Local/Qwen3-14B/#weights",
|
|
26
|
-
"primaryFile": "model-00001-of-00008.safetensors"
|
|
27
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Предустановленная модель ПАК WORK: Qwen 3 30B (MoE A3B)
|
|
3
|
-
* Назначение: основная языковая модель (диалог, ИИ-агент, учётные операции, аналитика, код).
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen 3 30B',
|
|
7
|
-
icon: 'ai:qwen',
|
|
8
|
-
protocol: 'local',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8080/v1/chat/completions',
|
|
10
|
-
model: 'Qwen/Qwen3-30B-A3B',
|
|
11
|
-
modality: 'llm',
|
|
12
|
-
maxTokens: 131072,
|
|
13
|
-
maxOutput: 32768,
|
|
14
|
-
functionCalling: true,
|
|
15
|
-
efforts: ['off', 'low', 'medium', 'high'],
|
|
16
|
-
effort: 'low',
|
|
17
|
-
capabilities: [
|
|
18
|
-
'chat',
|
|
19
|
-
'stream',
|
|
20
|
-
'tools',
|
|
21
|
-
'functions',
|
|
22
|
-
'effort',
|
|
23
|
-
'thinking',
|
|
24
|
-
'lora',
|
|
25
|
-
],
|
|
26
|
-
hfRepo: 'Qwen/Qwen3-30B-A3B',
|
|
27
|
-
weightsDir: 'MODELS/Local/Qwen3-30B-A3B/#weights',
|
|
28
|
-
primaryFile: 'model-00001-of-00016.safetensors',
|
|
29
|
-
pakPreinstalled: true,
|
|
30
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Предустановленная модель ПАК WORK: Embedding (Qwen3-Embedding-4B)
|
|
3
|
-
* Назначение: семантический векторный поиск и RAG по документам, договорам и учётной базе.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen3-Embedding (RAG)',
|
|
7
|
-
icon: 'carbon:search-locate',
|
|
8
|
-
protocol: 'local',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8080/v1/embeddings',
|
|
10
|
-
model: 'Qwen/Qwen3-Embedding-4B',
|
|
11
|
-
modality: 'embedding',
|
|
12
|
-
capabilities: [
|
|
13
|
-
'embedding',
|
|
14
|
-
'rag',
|
|
15
|
-
'rerank',
|
|
16
|
-
],
|
|
17
|
-
hfRepo: 'Qwen/Qwen3-Embedding-4B',
|
|
18
|
-
weightsDir: 'MODELS/Local/Qwen3-Embedding/#weights',
|
|
19
|
-
primaryFile: 'model.safetensors',
|
|
20
|
-
pakPreinstalled: true,
|
|
21
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Предустановленная модель ПАК WORK: Голосовой контур (Qwen3-ASR + Qwen3-TTS)
|
|
3
|
-
* Назначение: полнодуплексный голосовой диалог с перебиванием, распознавание и синтез речи.
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
label: 'Qwen3-Voice (ASR + TTS)',
|
|
7
|
-
icon: 'carbon:microphone',
|
|
8
|
-
protocol: 'local',
|
|
9
|
-
baseUrl: 'http://127.0.0.1:8080/v1/audio/speech',
|
|
10
|
-
model: 'Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign',
|
|
11
|
-
modality: 'audio',
|
|
12
|
-
capabilities: [
|
|
13
|
-
'asr',
|
|
14
|
-
'tts',
|
|
15
|
-
'voice',
|
|
16
|
-
],
|
|
17
|
-
seed: 42,
|
|
18
|
-
temperature: 0.2,
|
|
19
|
-
top_p: 0.6,
|
|
20
|
-
top_k: 20,
|
|
21
|
-
voice: 'Warm, calm, friendly adult female Russian speaker, consistent natural timbre, clear studio diction, moderate conversational pace.',
|
|
22
|
-
hfRepo: 'Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign',
|
|
23
|
-
weightsDir: 'MODELS/Local/Qwen3-Voice/#weights',
|
|
24
|
-
primaryFile: 'model.safetensors',
|
|
25
|
-
pakPreinstalled: true,
|
|
26
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* odant — прототип моделей ($ai) провайдера odant.
|
|
3
|
-
* Канал: protocol/baseUrl/apiKey наследуются моделями через tilde (cross-type $provider→$ai).
|
|
4
|
-
*/
|
|
5
|
-
export default {
|
|
6
|
-
icon: 'odant:logo',
|
|
7
|
-
description: 'Провайдер odant',
|
|
8
|
-
protocol: 'openai',
|
|
9
|
-
baseUrl: 'https://models.odant.org/v1/chat/completions',
|
|
10
|
-
apiKey: 'secret:odant.json',
|
|
11
|
-
}
|