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:
+20
-37
@@ -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." },
|
||||
),
|
||||
),
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user