La parte difficile di un sistema di plugin indipendente dal linguaggio non è avviare un altro processo. È fare in modo che ogni implementazione concordi su nomi, tipi, routing, stream, errori e ciclo di vita.
Perché le cartucce sono processi
Gli strumenti per documenti e modelli attraversano gli ecosistemi Rust, C++, Swift, Go e Python. Scegliere un solo linguaggio per le estensioni costringerebbe gli autori ad abbandonare la libreria migliore o a incapsularla in un altro protocollo privato.
MachineFabric considera invece una cartuccia come un eseguibile. Legge standard input, scrive standard output e parla Bifaci, un protocollo CBOR a frame con handshake, stream multiplexati, flow control, peer invocation, cancellazione, errori e keepalive. L’host non carica il codice della cartuccia nei processi dell’engine o della UI.
Il comando capdag new genera oggi runtime di cartuccia in Rust, Go, Swift e
Python. L’implementazione JavaScript partecipa al comportamento di URN,
notazione e planner ma, per scelta, non contiene runtime, host o relay.
Cosa identifica CapDAG
CapDAG è il livello di indirizzamento e composizione tipizzato sopra Bifaci. Una cartuccia dichiara capacità come:
cap:disbind;in="media:document;ext=pdf";out="media:enc=utf-8;ext=txt;page;plain-text"
cap:describe-image;in="media:ext=png;image";out="media:enc=utf-8;image-description"
cap:in="media:enc=utf-8";out="media:enc=utf-8;plain-text";summarize
Un Cap URN ha quattro coordinate: media di input, media di output, tag non direzionali di operazione/raffinamento ed effetto. Per servire una richiesta:
- l’input della richiesta deve conformarsi a ciò che il candidato accetta (controvarianza);
- l’output del candidato deve conformarsi a ciò che la richiesta richiede (covarianza);
- il candidato deve soddisfare i vincoli espliciti dei tag; e
- gli effetti devono coincidere, salvo che la richiesta lasci esplicitamente aperto l’effetto.
Un effetto omesso significa declared; l’identità categorica è la capacità
esplicita cap:effect=none. La
specifica del dispatch definisce il
predicato e il ranking definisce la
selezione tra candidati validi. Nel matcher una parità di specificità si risolve
con l’ordine di registrazione; le altre superfici di ranking usano le proprie
regole documentate.
La pianificazione è una ricerca su grafo
Se nessuna cartuccia serve direttamente «riassumi questo PDF», il planner cerca nel grafo delle capacità un percorso tipizzato: PDF, testo delle pagine, riassunto. Il grafo è finito e fissato dalla registrazione. Il risultato è Machine Notation che identifica ogni passo, input e output, quindi il percorso può essere mostrato prima dell’esecuzione. Nessun modello linguistico sceglie gli strumenti in questo ciclo di pianificazione.
Alcuni tipi possono essere raffinati solo dopo aver ispezionato un valore. I file adapter esaminano una porzione limitata di contenuto per raffinare tag strutturali; i value adapter esaminano stringhe come le specifiche dei modelli per raffinare tag semantici. Entrambi i registri usano la stessa forma longest-prefix e refine-or-pass-through, ma ispezionano valori diversi.
Il raffinamento della famiglia di modelli è importante perché famiglie diverse richiedono template di prompt diversi. Considerare la specifica del modello una stringa non esaminata può instradare la richiesta a un formatter incompatibile e produrre comunque testo plausibile ma errato.
Cinque implementazioni, confini espliciti
Rust è il riferimento comportamentale. Go, Python, Swift/Objective-C e JavaScript rispecchiano le parti che implementano, con test numerati condivisi per il comportamento comune. Il fatto che JavaScript si fermi al planner è intenzionale. I test di interoperabilità runtime usano oggi router Rust e Swift; relay host Rust, Go e Swift; e cartucce Rust, Go, Python e Swift. Il repository traccia esplicitamente le combinazioni protocol-v4 mancanti invece di dichiarare completa una matrice mai eseguita.
L’accordo importante è semantico: lo stesso URN normalizzato, richiesta di dispatch o macchina deve avere lo stesso significato ovunque quella funzione sia implementata. Threading e struttura dell’host possono differire senza cambiare il contratto.
Capacità locali e remote
MachineFabric fornisce isolamento specifico per piattaforma. Su macOS le cartucce girano sotto un host XPC e i pacchetti distribuiti usano firma e notarizzazione Apple. Linux e Windows usano i propri daemon host e formati di pacchetto. Il protocollo permette anche a una cartuccia di fare proxy verso un servizio remoto. Una pipeline può quindi combinare trasformazioni locali e remote mantenendo lo stesso percorso tipizzato e lo stesso modello di avanzamento; la policy di deployment decide dove avviene il lavoro.
Capacità e definizioni di media vengono proposte tramite
capfab. I pacchetti cartuccia vengono
proposti tramite cartridge-shelf.
Entrambi vengono revisionati prima di entrare nei registri pubblicati.
Inizia da Costruisci la tua prima cartuccia o leggi la specifica CapDAG per il contratto formale.