hermes-memory-pgvector 1.0.0 è disponibile. È la prima versione in cui promettiamo di non rompere le parti contro cui scrivi script. Questo articolo copre cos'è il plugin, cosa garantisce la 1.0, cosa ha evidenziato la revisione pre-rilascio e come effettuare l'aggiornamento.
Cos'è
hermes-memory-pgvector è un provider di memoria Postgres + pgvector per hermes-agent. È uno strato di memoria condivisa per una flotta di agenti cooperanti, costruito su un'istanza Postgres e un endpoint di embedding che probabilmente esegui già.
Le regole di progettazione non sono cambiate rispetto a il primo write-up:
- Strato di archiviazione, non un modello di memoria. Gli agenti continuano a chiamare il tool
memoryintegrato. Il plugin rispecchia quelle scritture in Postgres e memorizza i turni di chat sostanziali per la ricerca semantica. - Nessun LLM nel percorso critico della memoria. Gli embedding sono matematica vettoriale. Non c'è nessun deriver, nessun ciclo dialettico, nessun ciclo di dream.
- Temi per agente per impostazione predefinita. Ogni riga trasporta un
agent_identity. Il richiamo resta all'interno del tema corrente a meno che l'agente non richiedascope='all'. - Fail-soft. Se l'endpoint di embedding è giù, le scritture degradano a solo testo. Se la coda di scrittura è piena, la scrittura viene scartata con un avviso una tantum. Se il database è giù, il plugin registra e salta. Nessuna eccezione raggiunge il ciclo dell'agente.
- Separazione admin/runtime. Il DDL viene eseguito una volta come superutente tramite
hermes-pgvector migrate. Il ruolo di runtime ottiene solo il DML.
Cosa significa 1.0
Dalla 1.0.0 il progetto segue il semantic versioning sulla sua superficie pubblica:
- chiavi di configurazione
plugins.pgvector.* - nomi e parametri dei tool (
recall_memory,recall_conversation) - comandi CLI, flag e codici di uscita
- nomi di tabelle e colonne del database
- il nome del provider
pgvectore l'entry point pip
All'interno di 1.x quella superficie può crescere, ma nulla nella lista viene rinominato o rimosso, e nessun default cambia comportamento, senza una 2.0. MemoryStore e le altre classi e moduli Python sono interni e non sono coperti. Un file di migrazione rilasciato non viene mai modificato in loco; le modifiche allo schema vengono distribuite come una nuova migrazione numerata.
La matrice di supporto è testata in CI su ogni push: Python 3.11, 3.12 e 3.13 contro PostgreSQL 16, 17 e 18 con pgvector 0.5.0 o più recente. Una suite di conformità hermes-agent upstream viene eseguita contro un ref pinnato, con un controllo di drift settimanale non bloccante contro l'upstream main.
Cosa ha trovato la revisione
La 1.0.0 non è un nuovo tag della release candidate, che non è mai stata pubblicata su PyPI. Prima del rilascio abbiamo eseguito una revisione multi-pass sull'intero codebase: diversi passaggi con agenti revisori AI paralleli, dove un riscontro necessitava di una riproduzione concreta o di una verifica indipendente prima che qualcuno agisse su di esso. La 0.6.0 è uscita da una precedente revisione di preparazione alla 1.0.
Ha trovato un bug di gravità Alta, ed era un bug di perdita di dati. hermes-pgvector remap --old X --new X --execute eliminava ogni riga di memory_entries per il tema X e usciva con 0. Ogni riga era in conflitto con sé stessa sull'inserimento, poi l'eliminazione rimuoveva gli originali. remap ora rifiuta --old e --new vuoti o identici con exit 1, anche in dry-run.
I riscontri di gravità Media e Bassa meritano una scorsa se lo gestisci in produzione:
identity_signature()leggeva la configurazione congelata all'avvio, quindi le modifiche aallowed_themesoidentity_aliasesnon raggiungevano gli agenti gateway in cache fino a un riavvio. Ora rileggeconfig.yamlad ogni modifica.- Il backstop
on_session_endpoteva scrivere i turni utente multimodali due volte e poteva memorizzare scaffolding/skilldi grandi dimensioni. replace()con unold_textvuoto sovrascriveva una riga arbitraria.- Il client di embedding accettava vettori contenenti NaN, Infinity o null. Il database li rifiutava e la riga durabile andava persa. Ora degradano a una riga solo testo come qualsiasi altro errore di embedding.
backfillriprovava per sempre righe vuote composte da whitespace non ASCII, e falliva ogni riga su databaseSQL_ASCII.- Un
--configesplicito che non poteva essere letto prima avvertiva e ricadeva silenziosamente sul DSN predefinito. Ora è un errore. - Le chat del forum Telegram (topic), le room LINE e le sessioni webhook non venivano riconosciute come sessioni multi-parte, quindi le loro chiavi di sessione grezze, incluso un id partecipante, diventavano temi a sé stanti. Ora finiscono nel bucket condiviso
external-groupcome altro traffico di gruppo.
La suite di test è cresciuta da 442 a più di 500 test, inclusi circa 80 test di regressione per queste correzioni. La CI li esegue contro Postgres 16, 17 e 18 live, e ora fallisce su qualsiasi test skippato, quindi un ambiente rotto non può più passare verde.
Installazione e aggiornamento
pip install hermes-memory-pgvector
hermes-pgvector migrate --admin-dsn \
"dbname=<your-memory-db> user=postgres host=/var/run/postgresql"
hermes config set memory.provider pgvector
hermes memory status
Se arrivi dalla 0.6.0, non ci sono modifiche allo schema e nessuna nuova migrazione. Aggiorna il pacchetto, riavvia e leggi le note di aggiornamento 1.0.0 nel CHANGELOG. Questi cambiamenti modificano il comportamento:
remaprifiuta--old/--newvuoti o identici.- Un
--configesplicito che non può essere letto o parsato ora è un errore invece di un fallback silenzioso al DSN predefinito. - Le chiavi di configurazione booleane accettano solo
1/true/yes/one0/false/no/off. Valori vuoti o non riconosciuti ora significano il default della chiave. prefetch_budget,prefetch_limitemin_similarityvengono clampati ai loro intervalli documentati.- Le nuove scritture da sessioni del forum Telegram, room LINE e webhook vanno al tema
external-group; le righe già scritte sotto le loro chiavi grezze restano dove sono. - I backup di installazione ora si spostano in una directory nascosta
plugins/.pgvector.bak-<ts>. Rimuovi qualsiasi vecchia directory visibilepgvector.bak*così hermes-agent non la scopra come secondo provider.
Arrivando da qualsiasi versione più vecchia della 0.6.0, leggi prima le note della 0.6.0 e segui la regola di ordinamento lì: aggiorna il pacchetto su ogni host che scrive sul database prima di eseguire migrate. docs/upgrading.md ha la procedura completa.
Link
Il progetto è BSD-3-Clause, copyright Green Yoga Inc. Bug report e PR mirati sono i benvenuti.
