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.