perf(qmem): A2 schemi tool in inglese compatto — testo model-visible 2242→462 token (-79%) col tokenizer Qwen3.8; nomi/parametri/enum/default invariati, promptGuidelines duplicate rimosse (già in QMEM_RULES)

This commit is contained in:
enne2
2026-08-28 16:27:49 +02:00
parent 6c1c4f526f
commit ca89679b3c
6 changed files with 56 additions and 117 deletions
+20 -37
View File
@@ -1,80 +1,63 @@
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { gatewayRequest, loadConfig, MACHINE } from "../shared";
import { gatewayRequest, loadConfig } from "../shared";
export function registerQmemStore(pi: ExtensionAPI) {
pi.registerTool({
name: "qmem_store",
label: "Qmem memory store",
description:
"Salva un record di memoria nella memoria centralizzata condivisa (Qdrant + BGE-M3 su brain.vpn). " +
"Nessun LLM in scrittura: salva fatti, decisioni, preferenze o episodi deliberati e strutturati. " +
"Usa kind=decision per scelte con motivazione, kind=fact per fatti stabili, kind=preference per " +
"preferenze utente, kind=episode per esiti di azioni completate. Non salvare transcript grezzi: " +
"salva un record compatto e ad alto segnale per evento significativo. " +
"project_id è OBBLIGATORIO: consulta qmem_meta per i progetti esistenti e riusa l'id appropriato.",
promptGuidelines: [
"qmem_store: project_id è OBBLIGATORIO — consulta qmem_meta per riusare l'id esistente (fallback pi-qmem per conoscenza trasversale, mai vuoto).",
"qmem_store: salva record compatti e ad alto segnale, mai transcript grezzi.",
`qmem_store: per record macchina-specifici (percorsi, porte, servizi, config locali) includi nel testo il prefisso 'MACCHINA: <hostname> (<OS>, <GPU>)' e usa project host-<hostname> per dettagli strettamente locali. Macchina corrente (rilevata dall'estensione): ${MACHINE}.`,
],
"Store one compact, high-signal memory record. project_id is required; do not store raw transcripts.",
parameters: Type.Object({
text: Type.String({ description: "Il contenuto del record di memoria (compatto, ad alto segnale)." }),
text: Type.String({ description: "Compact memory content." }),
kind: Type.Optional(
Type.Union(
[Type.Literal("decision"), Type.Literal("fact"), Type.Literal("episode"), Type.Literal("preference")],
{ description: "Tipo di memoria (default: fact)." },
{ description: "Record kind; default fact." },
),
),
agent_id: Type.Optional(Type.String({ description: "Nome dell'agente che scrive (solo provenienza, nessun isolamento)." })),
agent_id: Type.Optional(Type.String({ description: "Writer provenance." })),
project_id: Type.String({
description:
"OBBLIGATORIO: progetto/dominio di appartenenza (kebab-case, es. pi-qmem, domotics, frigate-tts). " +
"Consulta qmem_meta per i progetti esistenti e riusa l'id appropriato; per domini nuovi crea un id coerente.",
description: "Required project ID, kebab-case.",
}),
scope: Type.Optional(
Type.Union([Type.Literal("agent"), Type.Literal("project"), Type.Literal("org")], {
description: "Scope organizzativo (default: agent).",
description: "Scope; default agent.",
}),
),
confidence: Type.Optional(
Type.Union([Type.Literal("high"), Type.Literal("medium"), Type.Literal("low")], {
description: "Affidabilità del record: high = verificato (fonte autorevole/conferma), medium = probabile, low = osservazione non confermata (default: medium).",
description: "Confidence; default medium.",
}),
),
source: Type.Optional(Type.String({ description: "Origine del record (es. conversazione, file, ticket)." })),
source: Type.Optional(Type.String({ description: "Source label." })),
expires_at: Type.Optional(
Type.String({
description:
"Scadenza ISO 8601 (es. 2026-09-01T00:00:00Z) per memoria VOLATILE. Se omesso, la memoria è PERMANENTE: " +
"non verrà mai cancellata dal cleanup automatico. Usalo solo quando la memoria deve scadere.",
description: "ISO 8601 expiry; omit for permanent records.",
}),
),
supersedes_id: Type.Optional(Type.String({ description: "UUID del record da supersedere (correzione): il nuovo record diventa la versione attiva, il vecchio resta in archivio marcato superseded." })),
supersede_reason: Type.Optional(Type.String({ description: "Motivo della correzione (visibile in audit e sul vecchio record)." })),
parent_id: Type.Optional(Type.String({ description: "UUID del record genitore per organizzazione gerarchica/subtopic." })),
supersedes_id: Type.Optional(Type.String({ description: "UUID replaced by this record." })),
supersede_reason: Type.Optional(Type.String({ description: "Reason for replacement." })),
parent_id: Type.Optional(Type.String({ description: "Parent UUID." })),
level: Type.Optional(
Type.Union([Type.Literal("L1_ROOT"), Type.Literal("L2_SUBTOPIC"), Type.Literal("L3_DETAIL")], {
description: "Livello gerarchico (L1_ROOT = indice macro-topic, L2_SUBTOPIC = dettaglio specialistico, L3_DETAIL).",
description: "Hierarchy level.",
}),
),
topic: Type.Optional(Type.String({ description: "Topic ID gerarchico (es. ALFA-ROMEO-GT-1300-JUNIOR/SPECS)." })),
topic: Type.Optional(Type.String({ description: "Hierarchy topic ID." })),
private: Type.Optional(
Type.Boolean({
description:
"RISERVATO: se true, il record è escluso dalle ricerche standard (invisibile a qmem_search/qmem_tree/meta) " +
"e accessibile solo con qmem_search include_private=true. Usalo per dati personali/sensibili che non devono " +
"finire nei prompt dei modelli. NON usarlo per conoscenza normale.",
description: "Hide from standard search; use only for sensitive data.",
}),
),
links: Type.Optional(
Type.Array(
Type.Object({
target_id: Type.String({ description: "UUID del record target collegato." }),
predicate: Type.Optional(Type.String({ description: "Tipo di relazione (parent_of, part_of, relates_to, supersedes...)." })),
weight: Type.Optional(Type.Number({ description: "Peso della relazione (default: 1.0)." })),
target_id: Type.String({ description: "Target UUID." }),
predicate: Type.Optional(Type.String({ description: "Relation type." })),
weight: Type.Optional(Type.Number({ description: "Relation weight; default 1.0." })),
}),
{ description: "Collegamenti relazionali espliciti verso altri record." },
{ description: "Related records." },
),
),
}),