In questa sezione

CapDAG separa il runtime delle cartucce, neutrale rispetto al linguaggio, dai contratti dati a livello di cartuccia. Usa CapDAG per costruire e ospitare una cartuccia. Aggiungi un SDK per cartucce CapDAG quando servono i payload LLM condivisi, la policy dei prompt, la selezione delle pagine, la policy di retry o gli altri helper condivisi.

Scegli un pacchetto

Linguaggio Runtime e protocollo Pacchetto per cartucce CapDAG
Rust capdag capdag-cartridge-sdk
Go capdag-go capdag-cartridge-sdk-go
Swift / Objective-C capdag-objc (prodotti CapDAG e Bifaci) capdag-cartridge-sdk-objc
Python capdag Runtime e contratti delle cartucce in un unico pacchetto

Le implementazioni CapDAG Rust, Go, Swift/Objective-C, Python e JavaScript condividono i contratti di URN, definizioni, dispatch e planning. Gli scaffold del runtime delle cartucce sono disponibili per Rust, Go, Swift e Python; JavaScript offre oggi la parità della libreria protocollo e del planner, non uno scaffold per cartucce.

Inizia da Costruisci la tua prima cartuccia. Il riferimento CapDAG documenta runtime, input e output, peer invocation e progresso e logging.

Runtime Python

Installa Python 3.11 o successivo e il runtime pubblico:

python3 -m pip install capdag

Il progetto creato da capdag new NOME --python è l’esempio operativo canonico. Il suo schema centrale è:

from capdag.bifaci.cartridge_runtime import Request, WET_KEY_REQUEST
from ops import DryContext, Op, OpMetadata, WetContext

class MyOp(Op):
    async def perform(self, dry: DryContext, wet: WetContext) -> None:
        request: Request = wet.get_required(WET_KEY_REQUEST)
        payload = request.take_input().collect_all_bytes()
        output = request.emitter()
        output.start(False)
        output.finish(1.0, "complete")
        output.emit_cbor(payload.decode("utf-8"))

    def metadata(self) -> OpMetadata:
        return OpMetadata.builder("MyOp").build()

take_input() trasferisce la proprietà del pacchetto di input e può essere chiamato una sola volta. collect_all_bytes() è adatto a un input scalare e limitato; usa le API stream del riferimento CapDAG quando i dati devono restare incrementali. emitter() restituisce l’emettitore della risposta. Un handler che delega il lavoro usa request.peer() e deve inoltrare correttamente il progresso quando il peer emette log.

Costruisci il manifest con CapManifest, Cap, CapArg, CapOutput e le sorgenti degli argomenti. Ogni manifest include CAP_IDENTITY; il runtime ne fornisce l’handler. Costruisci una Cap URN personalizzata con CapUrnBuilder, conserva la stringa canonica .to_string() e registra l’operazione con quel valore esatto:

runtime = CartridgeRuntime.with_manifest(build_manifest())
runtime.register_op_type(CAP_URN, MyOp)
runtime.run()

Il runtime crea una nuova operazione registrata per ogni richiesta. Conserva lo stato della richiesta nelle variabili locali o nel WetContext.

SDK di prodotto Rust

capdag-cartridge-sdk riesporta capdag e aggiunge questi moduli:

Modulo Contratto
llm Richieste, stream, vocabolario, informazioni modello, Media URN, Cap URN e classificazione backend.
prompt Classificazione della strategia prompt e system prompt condiviso.
pages Selezione pagine one-based con ordine, deduplicazione e clamp.
net_retry Policy condivisa e limitata per errori HTTP transitori.
structured_queries Definizioni, rendering, registry e risultati delle query strutturate.

Richiesta LLM

use capdag_cartridge_sdk::llm::LlmGenerationRequest;

let request = LlmGenerationRequest::with_defaults(
    "Riassumi questo documento",
    "hf:Qwen/Qwen2.5-0.5B-Instruct",
);
let json = request.to_json();

prompt e model_spec sono obbligatori. I campi opzionali sono request_type, system_prompt, request_id, max_tokens, temperature, top_k, top_p, min_p, seed, grammar, json_schema, constraint, chat_template, stop_sequences, max_context_length, batch_size, rope_freq_base, rope_freq_scale, repeat_penalty e hf_token. Il token Hugging Face serve per un repository gated e viene inoltrato al download.

with_defaults seleziona la generazione e imposta max_tokens=512, temperature=0.7, top_k=40, top_p=0.9, min_p=0.05, seed=42, max_context_length=0 (dimensionamento automatico), batch_size=2048, rope_freq_base=10000, rope_freq_scale=1 e repeat_penalty=1.1.

ConstraintSpec supporta JSON Schema, espressioni regolari, grammatiche e tool call. RequestType può essere Generate, GetVocab o GetInfo; un valore assente equivale a Generate.

Stream e metadati LLM

Il tipo di output è media:fmt=ndjson;llm-text-stream. Ogni riga è un LlmStreamMessage: Token, Status, Complete, ToolRequest o Error. to_line() e from_line() serializzano e analizzano un record NDJSON.

LlmVocabResponse contiene vocab e vocab_size opzionale. LlmModelInfo contiene model_spec e vocab_size obbligatori, oltre a context_length, embedding_dim, file_size_bytes, head_count, layer_count, supports_chat e supports_tools opzionali.

Le costanti media corrispondenti sono MEDIA_LLM_GENERATION_REQUEST, MEDIA_LLM_TEXT_STREAM, MEDIA_LLM_VOCAB_RESPONSE e MEDIA_LLM_MODEL_INFO_RESPONSE. Lo SDK esporta anche le Cap URN per inferenza GGUF, MLX, Candle e vincolata, vocabolario, informazioni modello, embedding, dimensioni embedding e descrizione immagini. Usa le costanti invece di copiarne i valori serializzati.

backend_for_model_spec sceglie MLX per mlx-community o ;mlx, GGUF per una specifica che contiene gguf, e Candle negli altri casi.

Policy condivise

parse_index_range accetta segmenti one-based N, A-B e A- separati da virgole. Conserva l’ordine scritto, elimina i duplicati successivi, limita una fine oltre il documento e rifiuta zero, intervalli inversi, segmenti non validi, documenti vuoti e intervalli che iniziano dopo l’ultima pagina. Gli indici restituiti sono zero-based. Una selezione assente o vuota restituisce tutte le pagine.

La policy di retry predefinita compie quattro tentativi totali, parte da 250 ms, limita il backoff esponenziale a 10 secondi e rispetta un Retry-After numerico fino a 30 secondi. La policy di download compie cinque tentativi con base 500 ms, limite di backoff 30 secondi e limite Retry-After 60 secondi. Gli status HTTP ripetibili sono 408, 425, 429, 500, 502, 503 e 504; sono transitori anche timeout, errori di connessione, DNS e invio della richiesta. Errori di autenticazione, 404, altre risposte permanenti e l’ultimo tentativo fallito ritornano invariati al chiamante.

La classificazione prompt usa il template chat solo per chat-template-jinja e chat-template-short. Un template assente o ignoto usa testo completion grezzo e scarta il system prompt. La cartuccia backend esegue il rendering; lo SDK condivide la decisione.

SDK di prodotto Go

go get github.com/machinefabric/capdag-cartridge-sdk-go
import "github.com/machinefabric/capdag-cartridge-sdk-go/llm"

request := llm.NewGenerationRequestWithDefaults(
    "Riassumi questo documento",
    "hf:Qwen/Qwen2.5-0.5B-Instruct",
)
body := request.ToJSON()

Il pacchetto Go rispecchia i contratti Rust per richiesta, vincoli, tool, stream, vocabolario, informazioni modello, costanti Media e Cap e classificazione backend. I valori opzionali usano puntatori. Analizza un record stream con llm.FromLine e serializzalo con ToLine. Lo SDK Rust definisce questi tipi wire specifici di CapDAG.

SDK di prodotto Swift e Objective-C

import CapDAGCartridgeSDK
import CapDAGCartridgeSDKSwift

CapDAGCartridgeSDK dipende dai prodotti CapDAG e Bifaci di capdag-objc. CSCartridgeCaps è una collezione ordinata e secure-codable di valori CSCap. addCap(_:) aggiunge una capacità, caps restituisce i valori ordinati e capUrns() restituisce le loro stringhe URN. Analizza quelle stringhe con CSCapUrn; non instradarle confrontando stringhe grezze.

Il prodotto solo Swift rispecchia RefinedDims, PromptStrategy, classifyPrompt e DEFAULT_SYSTEM_PROMPT del modulo prompt Rust.

Regole per le URN

Cap e Media URN sono Tagged URN, non stringhe MIME ad hoc. Le virgolette attorno ai valori direzionali fanno parte della Cap URN canonica e l’ordine dei tag viene normalizzato. Costruisci e analizza le URN con le API CapDAG. Consulta i riferimenti normativi struttura Cap URN e Media URN.