← Indice documentazione Guida all'architettura › fastpath e autopath

Metnos

fastpath e autopath — riuso sicuro dei piani già risolti
Guida all'architettura

Indice

  1. L'idea in due righe
  2. Perché serve un fastpath
  3. I due livelli e il loro confine
  4. L0 — cache prodotta dal runtime (fastpath.py)
  5. L1 — riuso per famiglia di richieste (autopath.py)
  6. Validità, invecchiamento e trasferimento degli utilizzi
  7. L'estrattore di argomenti
  8. Configurazione
  9. Promozione a executor sintetico

1. L'idea in due righe

Chiedi a Metnos con una richiesta come quella di questo esempio: «Trova i file PDF modificati oggi». Se ripeti la richiesta, Metnos può riusare il piano già riuscito; non devi scegliere o attivare manualmente il fastpath.

Prima di interpellare il pianificatore, Metnos prova a riconoscere la richiesta. Se esiste un piano riutilizzabile e ancora valido, esegue quella sequenza di executor. Se il contesto o il catalogo sono cambiati, tratta la voce come non valida e torna alla pianificazione normale.

richiesta query utente L0 fastpath query esatta o equivalente L1 autopath cluster + piano campione motore pianificatore LLM
Figura 1 — Metnos prova L0 e L1 in quest'ordine. Se non trova un piano valido, passa al motore di pianificazione.

2. Perché serve un fastpath

La pianificazione serve quando la richiesta è nuova o richiede una nuova composizione di capacità. Ripeterla quando il sistema possiede già un piano valido aggiunge invece lavoro e variabilità senza migliorare il risultato. Per esempio, una richiesta già risolta con get_urls e describe_entries può riusare quella sequenza, purché gli argomenti vengano ricavati dalla richiesta corrente.

Resta da capire come riconoscere una richiesta nota — e quando una soltanto somigliante è abbastanza vicina da trattarla allo stesso modo. Se ne occupano due livelli di riuso: riconoscono gradi diversi di somiglianza, ma hanno lo stesso scopo, eseguire un piano noto senza chiedere al pianificatore di costruirlo di nuovo.

3. I due livelli e il loro confine

I due livelli si distinguono per ciò che riconoscono del percorso. L0 riconosce l'intero piano, compresi gli argomenti: la stessa richiesta, con gli stessi valori concreti. L1 riconosce invece la struttura della soluzione, senza gli argomenti della richiesta d'origine, e può quindi servire un'intera famiglia di richieste affini.

LivelloCosa riconosceCome
L0Una richiesta già risolta. La corrispondenza esatta può conservare un piano specifico; quella semantica è limitata ai piani generalizzabili.Impronta deterministica (0a), poi similarità tramite l'embedder configurato (0b)
L1Una famiglia di richieste. Riusa un piano generale associato a un intento completo e a un cluster semantico.Intento, cluster semantico e ordinamento deterministico dei piani campione

L'ordine è fisso: prima si tenta L0; se non trova corrispondenza si passa a L1. Se mancano entrambi, la richiesta arriva al pianificatore (il motore), come sempre.

Il pianificatore non scompare: L0 e L1 sono scorciatoie controllate. Una richiesta nuova, ambigua, accompagnata da allegati o priva di una corrispondenza valida prosegue nel motore normale.

4. L0 — cache prodotta dal runtime (fastpath.py)

Il primo livello vive in runtime/engine/fastpath.py e custodisce, in un database SQLite (fastpaths.sqlite), i piani già eseguiti. Le voci nascono da sole: ogni volta che un turno va a buon fine — un piano nuovo del motore, il riuso di L1 oppure una corrispondenza semantica L0 — Metnos annota la richiesta canonica, la sua impronta, l'embedding prodotto dal modello configurato, il piano completo (la struttura, o framework) e l'intento, cioè il verbo e l'oggetto della richiesta. Non occorre un'approvazione separata: gli executor hanno già superato i controlli di ammissione e il turno ha avuto esito positivo.

Due modi di trovare la corrispondenza

La ricerca avviene in due fasi:

Una voce L0 eliminata per invecchiamento, invalidazione o riscontro negativo può essere ricreata dal successivo turno riuscito. La cancellazione non rende quindi indisponibile la capacità sottostante.

Controlli e rimedi

5. L1 — riuso per famiglia di richieste (autopath.py)

Il secondo livello vive in runtime/engine/autopath.py. Non cerca la ripetizione della stessa frase: individua una famiglia semantica, verifica che l'oggetto dell'intento coincida e riusa soltanto piani privi di argomenti letterali legati alla richiesta d'origine. Prima dell'esecuzione gli argomenti variabili vengono ricavati di nuovo dalla richiesta corrente.

Un autopath può nascere in due modi. Un riscontro positivo promuove un piano riuscito quando raggiunge la soglia configurata, pari a una conferma per impostazione predefinita. In alternativa, due esecuzioni riuscite dello stesso intento possono creare un autopath shadow quando il piano appena eseguito comprende almeno quattro passi. La voce shadow è utilizzabile, ma resta distinta da un piano confermato; il primo riscontro positivo la conferma. Questa seconda via riduce il costo delle richieste ricorrenti senza far passare per approvazione umana un segnale che non lo è.

Riscontri e scelta del piano

Il confine è deliberato: L0 privilegia la ripetizione della stessa richiesta; L1 generalizza a un gruppo di intenti e può derivare da un riscontro esplicito oppure dalla semina shadow appena descritta. L0 viene prima nella cascata, ma entrambi devono superare gli stessi controlli di validità, corrispondenza degli argomenti con la richiesta e sicurezza prima dell'esecuzione.

6. Validità, invecchiamento e trasferimento degli utilizzi

Firme del contesto operativo

Ogni piano memorizzato porta due firme: una per gli executor che usa e una per la famiglia di candidati disponibile per quell'intento. La firma incorpora anche la versione delle regole di instradamento e presentazione. Al momento del riuso Metnos le ricalcola: un executor modificato o rimosso, una nuova capacità concorrente o una modifica all'instradamento trasformano la voce in un miss. Il sistema ripianifica invece di eseguire una decisione presa in un contesto ormai diverso.

Le firme sono indipendenti dall'utente e non contengono profili, affinità o preferenze personali. L1 rimane quindi una cache condivisa di decisioni di piano, con chiavi deterministiche. Gli effetti autorizzati per l'utente e la presentazione finale — lingua, tono, lunghezza e formato — si applicano fuori dalla chiave del piano.

La famiglia dei candidati deriva dal vocabolario canonico, comprese le relazioni tra contenuti specializzati e carrier del filesystem: per esempio, una nuova capacità sui files può cambiare un piano che opera su images o texts. Non vengono inserite nella firma le parole della domanda o le affinity del manifest; in questo modo l'invalidazione segue la semantica del catalogo senza rendere L1 specifica per utente o per formulazione.

I fastpath L0 vengono conservati o ritirati secondo regole fisse, senza decisioni di un modello. Ogni notte il processo task_state_reaper applica tre regole d'invecchiamento e quattro condizioni di ritiro.

Invecchiamento

RegolaCriterioDefaultEnv
Mai riusatoCreato da oltre N giorni ma mai eseguito una seconda volta14 giorniMETNOS_FASTPATH_GRACE_DAYS
Non usato di recenteUltimo uso oltre N giorni fa30 giorniMETNOS_FASTPATH_STALE_DAYS
Limite LRUNumero di voci superiore al limite; vengono rimosse prima quelle meno recenti500METNOS_FASTPATH_MAX

Ritiro (solo con catalogo completo)

CodiceCausaTrasferisce gli utilizzi
C1Uno strumento del piano non esiste più nel catalogo (ritirato, rinominato, archiviato). La riesecuzione fallirebbe.No
C2 provenienzaIl fastpath è stato promosso a executor sintetico (vedi §9) e quell'executor è ora nel catalogo.
C2 nomeEsiste un executor con nome {verbo}_{oggetto} corrispondente all'intent, ma nessuno strumento del piano appartiene a quella famiglia. Il fastpath oscurerebbe l'executor.
C2 pre-filtroPer i piani a più passi: il pre-filtro di instradamento deterministico sulla query canonica indica che un singolo executor copre l'intent (anche con nome diverso).

Trasferimento dei conteggi d'uso

Quando un fastpath viene ritirato perché un executor lo ha sostituito (le condizioni C2), i suoi conteggi d'uso (n_uses) passano a quell'executor attraverso il registro usato per il suo ciclo di vita. Gli utilizzi già osservati non vengono quindi azzerati.

La rimozione riguarda il percorso memorizzato, non gli executor. Se la stessa richiesta torna e viene risolta correttamente, L0 può registrare di nuovo il piano aggiornato.

7. L'estrattore di argomenti

Riconoscere la richiesta è metà del lavoro. L'altra metà è ricavarne i valori concreti: quali percorsi, quali URL, quale data, quale soglia. Se ne occupa un estrattore a regole (args_extractor.py), anch'esso senza modello:

8. Configurazione

Le soglie di fastpath e autopath sono lette dalle variabili d'ambiente del processo Metnos; se una variabile manca, vale il valore predefinito nel modulo. Le vecchie sezioni [fast_path] e [multi_tool_fast_path] di ~/.config/metnos/runtime.toml sono state ritirate e vengono ignorate. La pagina Praxis permette di osservare e svuotare le cache, ma non modifica queste soglie. Per rendere permanente un override, va quindi inserito nella configurazione del servizio; le costanti lette all'importazione richiedono il riavvio del processo.

Livello 0 (fastpath)

VariabileValore predefinitoSignificato
METNOS_FASTPATH1Abilita L0; il valore 0 lo disabilita
METNOS_CLUSTER_COSINE_HIGH0,90Soglia semantica di base; il confronto L0 usa questa soglia più 0,02
METNOS_FASTPATH_STALE_DAYS30Giorni dopo cui viene rimossa una voce non usata
METNOS_FASTPATH_GRACE_DAYS14Periodo di conservazione delle voci mai riusate
METNOS_FASTPATH_MAX500Numero massimo di righe, con rimozione LRU

Livello 1 (autopath)

VariabileValore predefinitoSignificato
METNOS_AUTOPATH1Abilita L1; il valore 0 lo disabilita
METNOS_AUTOPATH_MIN_OBS1Osservazioni positive minime per promuovere un autopath
METNOS_AUTOPATH_FLOOR0,87Similarità semantica minima nel ripiego per intento
METNOS_AUTOPATH_TTL_ANTI2592000 (30 gg)Durata di un'anti-autopath in secondi
METNOS_AUTOPATH_TTL_REPEAT3600 (1 h)Esclusione temporanea dopo una richiesta di ripetizione
METNOS_AUTOPATH_KEEP_OBS5000Numero massimo di osservazioni recenti senza verdetto conservate
METNOS_AUTOPATH_STALE_DAYS90Inattività dopo cui un autopath attivo viene rimosso
METNOS_AUTOPATH_DEMOTED_TTL_DAYS30Conservazione di un autopath retrocesso
METNOS_SEED_STEPS4Numero minimo di passi per la semina shadow
METNOS_SEED_REPEAT2Osservazioni riuscite dello stesso intento richieste per la semina shadow

Promozione a executor

VariabileValore predefinitoSignificato
METNOS_FP_PROMOTE_MIN_CLUSTER3Numero minimo di fastpath distinti nel gruppo
METNOS_FP_PROMOTE_MIN_USES15Numero minimo di utilizzi complessivi
METNOS_FP_PROMOTE_MIN_AGE_DAYS30Età minima del gruppo
METNOS_FP_PROMOTE_MAX_PER_NIGHT3Massimo di nuove proposte per notte
METNOS_FASTPATH_AUTOPROMOTEoffAbilita l'auto-promozione di Modalità 2 (senza approvazione)
METNOS_FP_AUTOPROMOTE_MIN_CLUSTER5Fastpath distinti minimi per l'auto-promozione
METNOS_FP_AUTOPROMOTE_MIN_USES50Utilizzi cumulativi minimi per l'auto-promozione
METNOS_FP_AUTOPROMOTE_MIN_NIGHTS3Notti in cui la stessa proposta deve essere stata osservata

9. Promozione a executor sintetico

Quando più fastpath L0 ricorrenti condividono la stessa struttura di piano (l'impronta dello scheletro) e lo stesso intent, ogni notte il processo task_fastpath_promotion li valuta come candidati a diventare un executor sintetico. Conta il gruppo, non la singola voce: servono almeno tre fastpath distinti, quindici utilizzi complessivi e trenta giorni di età. Sono ammessi soltanto i piani a più passi: una sequenza di un solo passo corrisponde già a un executor e il fastpath evita soltanto una nuova chiamata al pianificatore.

Perché da L0 e non da L1. L'analisi guarda i fastpath L0, non gli autopath L1, perché la traccia delle richieste reali è in L0: quante richieste concrete e distinte tornano, quante volte, da quanto tempo (i tre numeri qui sopra). L1 è già generale e nasce dal riscontro dell'utente oppure dalla semina shadow, ma non conserva quel conteggio di richieste distinte. La generalizzazione avviene quindi qui, raggruppando i fastpath L0 per forma del piano e intento.

Due modalità di promozione

Da dove viene un executor

Per i candidati la cui famiglia è libera, Metnos annota nella tabella promotions gli identificatori e le impronte dei fastpath di origine. Quando il nuovo executor entra nel catalogo, il processo notturno usa quel legame per ritirare esattamente le voci che lo hanno generato. I candidati di composizione non ricevono questa provenienza automatica, perché il loro nome finale dipende dal qualificatore scelto da una persona; le relative voci L0 restano gestibili da Impostazioni > Memoria > Praxis.

© 2026 Roberto Brunialti · documentazione Metnos