← Indice documentazione Guida all'architettura › scratchpad

Metnos

Scratchpad delle osservazioni
Ciò che il modulo offre e ciò che il runtime usa davvero.

runtime/scratchpad.py implementa un archivio temporaneo pensato per tenere fuori dal contesto del modello i risultati troppo grandi. Potrebbe conservare il risultato completo e lasciarne nel piano soltanto un riepilogo con un identificatore. L'API esiste, ma il motore corrente non la usa per archiviare automaticamente le osservazioni e non espone scratchpad_read nel catalogo ordinario. È quindi un componente disponibile, non una funzione attiva del prodotto.

Indice

  1. Comportamento corrente
  2. API disponibile
  3. Archivio e durata
  4. Il riepilogo prodotto dal modulo
  5. Lettura a porzioni
  6. Cosa occorre per collegarlo
  7. Verifiche necessarie
  8. Confini di sicurezza

1. Comportamento corrente

L'idea è semplice. Se un executor restituisse, per esempio, mille righe di testo, lo scratchpad potrebbe conservarle e mostrare al modello soltanto «mille righe disponibili, identificatore X». Il modello potrebbe poi leggere solo l'inizio, la fine o l'intervallo che gli serve. Questo evita di riempire il contesto con dati che potrebbero non essere necessari.

Nel motore attivo, i risultati dei passi restano nella cronologia di esecuzione del turno. Un passo successivo li riusa con from_step o con un riferimento ${stepN.campo}; il runtime risolve il valore effettivo senza chiedere al modello di ricopiarlo. La sintesi finale proietta e limita i campi testuali che presenta al modello, mentre i dati completi restano nel risultato del passo.

Nel codice il termine scratchpad compare anche, in senso più generico, per indicare la cronologia dei passi usata durante un turno o la sua copia durante la ripresa di un dialogo. Quella cronologia è attiva, ma non è il database SQLite descritto in questa pagina.

All'inizio di un turno agent_runtime apre il database dello scratchpad ed elimina le voci scadute. Nel percorso corrente, però, non chiama Scratchpad.put. Anche il parametro storico scratchpad_threshold non governa l'esecuzione del motore. Di conseguenza non è corretto affermare che ogni osservazione sopra i 4 KB venga scaricata automaticamente nel database.

2. API disponibile

Metodo o valoreFunzione
Scratchpad.open(path)Apre o crea il database SQLite e il relativo schema.
put(turn_id, step_num, executor_name, observation, ttl_seconds)Salva l'osservazione e restituisce una rappresentazione sintetica.
get(id)Restituisce la riga completa corrispondente all'identificatore.
read(id, mode, n, start, end)Restituisce tutto il contenuto oppure una porzione iniziale, finale o compresa in un intervallo.
list_for_turn(turn_id)Elenca metadati e riassunti delle voci appartenenti a un turno.
gc(now)Elimina le righe la cui scadenza è trascorsa.
stats()Conta voci e byte conservati.
SCRATCHPAD_READ_TOOLDescrive il possibile strumento incorporato, ma la sola costante non lo rende visibile al pianificatore corrente.

3. Archivio e durata

Il percorso predefinito è PATH_USER_DATA/scratchpad.db. La tabella conserva:

id · turn_id · step_num · executor_name · content_kind
content · size_bytes · summary · created_at · expires_at

Il valore predefinito di put è una durata di un'ora. L'eliminazione non è un processo autonomo: avviene soltanto quando un chiamante esegue gc. Una voce scaduta può quindi restare su disco fino alla pulizia successiva.

4. Il riepilogo prodotto dal modulo

Quando viene chiamato put, un testo lungo viene conservato per intero e il riepilogo ne mostra l'inizio e la fine. Per dati binari il modulo registra i byte e mostra dimensione e prefisso dell'impronta SHA-256. Per un risultato strutturato cerca campi quali entries, matches o results e comunica conteggio e schema, senza riversare gli elementi nel riepilogo.

Il riepilogo può mantenere anche valori semplici utili, per esempio conteggi, stato di troncamento, dimensione, messaggio ed errore. Il campo ref_hint spiega come riusare il risultato di un passo o come chiedere una porzione del contenuto.

5. Lettura a porzioni

ModalitàRisultato
fullContenuto completo.
headPrimi n caratteri o byte; il valore predefinito dichiarato dallo strumento è 2000.
tailUltimi n caratteri o byte.
rangeIntervallo da start incluso a end escluso.

Il testo viene restituito come UTF-8 con sostituzione dei byte non validi. Il contenuto binario viene codificato in Base64. I metadati indicano dimensione completa, dimensione restituita, tipo e modalità di lettura.

6. Cosa occorre per collegarlo

Un'integrazione corretta nel motore richiede almeno:

  1. un solo punto di decisione che confronti la dimensione dell'osservazione con una configurazione canonica;
  2. la chiamata a put prima di costruire il contesto visibile al modello;
  3. l'esposizione di scratchpad_read soltanto quando esistono voci accessibili al turno e all'utente correnti;
  4. un controllo di proprietà su ogni get, read e list_for_turn;
  5. limiti sulla lettura full, che oggi non ha un tetto proprio, così una voce grande non rientra interamente nel contesto che si voleva proteggere;
  6. pulizia, osservabilità e prove di ripresa dopo un dialogo sospeso.

7. Verifiche necessarie

Il collegamento automatico fra motore e database non è attivo. La sua attivazione richiede prove dedicate su testo, binari, risultati strutturati, intervalli, scadenza, concorrenza e ripresa del turno.

La verifica più importante è multiutente: un identificatore ottenuto da un utente non deve permettere di leggere una voce appartenente a un altro, nemmeno passando direttamente l'identificatore all'API incorporata.

8. Confini di sicurezza

Per questi motivi il modulo può essere studiato e collaudato come componente, ma non deve essere collegato a una superficie multiutente senza prima aggiungere proprietà, autorizzazione e prove di isolamento.