Switch LLM engine to Ornith-1.5-9B (Spark X2.5-4B not loadable in Ollama); robust nested-JSON parsing; update README

This commit is contained in:
n1kt4r committed 2026-09-14 17:28:40 +05:00
1 parent 89b73db8a4
commit a01f183680
5 files changed
+27 -99

No files matched your search

+16 -6
View File
@@ -3,10 +3,10 @@
* Mind не выполняет долгую работу сам — он оркестратор:
* думает, чувствует, решает, делегирует саб-агентам.
*
* Spark X2.5-4B как движок:
* - через llama.cpp/Ollama (OpenAI-compatible server)
* Ornith-1.5-9B как движок:
* - через Ollama (OpenAI-compatible /v1/server)
* - поддерживает tool-calling (саб-агенты)
* - 1M контекст, но для heartbeat держим 4K-16K + внешняя память
* - 262K контекст, но для heartbeat держим 4K-16K + внешняя память
*/
import { Heartbeat, TickTrigger } from './heartbeat.js';
@@ -102,15 +102,17 @@ function parseSparkOutput(content: string): LLMResult {
}
if (parsed && typeof parsed === 'object') {
const thoughts = tryParseJson(parsed.thoughts);
const reply = tryParseJson(parsed.decision?.reply ?? parsed.reply);
return {
text: parsed.text ?? parsed.reply ?? '',
thoughts: parsed.thoughts ?? '',
text: typeof parsed.text === 'string' ? parsed.text : '',
thoughts: typeof thoughts === 'string' ? thoughts : typeof thoughts === 'object' ? JSON.stringify(thoughts) : '',
emotion: {
valence: clampNum(parsed.emotion?.valence ?? parsed.valence, 0.5),
arousal: clampNum(parsed.emotion?.arousal ?? parsed.arousal, 0.5),
},
decision: {
reply: parsed.decision?.reply ?? parsed.reply ?? null,
reply: typeof reply === 'string' ? reply : reply ? JSON.stringify(reply) : null,
subAgent: parsed.decision?.subAgent ?? parsed.subAgent ?? undefined,
action: parsed.decision?.action ?? parsed.action ?? undefined,
},
@@ -130,6 +132,14 @@ function clampNum(v: number, fallback: number): number {
return typeof v === 'number' && !Number.isNaN(v) ? v : fallback;
}
/** Если значение — строка с JSON (модель запарила вложенный объект), распарсим. */
function tryParseJson(v: unknown): unknown {
if (typeof v !== 'string') return v;
const trimmed = v.trim();
if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return v;
try { return JSON.parse(trimmed); } catch { return v; }
}
export class Mind {
private heartbeat: Heartbeat;
private memory: MemorySystem;