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:
1 parent
89b73db8a4
commit
a01f183680
5 files changed
+27
-99
No files matched your search
+16
-6
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user