Model Layers
Model layers are LODE’s primary use case. They describe pools of AI models available at a given tier in the StackNet registry.
Schema
model-layer-v1.lode
{
"schema": "lode",
"version": 1,
"name": "ModelLayer",
"fields": [
{ "id": 1, "name": "name", "type": "string", "required": true },
{ "id": 2, "name": "isDefault", "type": "bool", "required": true },
{ "id": 3, "name": "models", "type": "string[]", "required": true },
{ "id": 4, "name": "defaultModel", "type": "string", "required": true },
{ "id": 5, "name": "defaults", "type": "map<string,string>", "required": false }
]
}TypeScript Interface
interface ModelLayer {
name: string; // "preview", "fast", "turbo"
isDefault: boolean; // Default for bare aliases
models: string[]; // Pool of canonical model IDs
defaultModel: string; // Default from the pool
defaults?: Record<string, string>; // Per-capability overrides
}Example Layer
preview-layer.json
{
"name": "preview",
"isDefault": true,
"models": [
"gpt-oss:20b",
"qwen3:30b",
"qwen3:8b",
"qwen3-coder:30b",
"minimax-m2.5:229b",
"qwen3-omni:30b",
"qwen3-vl:30b",
"nomic-embed-text",
"devstral:24b"
],
"defaultModel": "gpt-oss:20b",
"defaults": {
"code": "qwen3-coder:30b",
"embed": "nomic-embed-text",
"vision": "qwen3-vl:30b",
"media": "qwen3-omni:30b"
}
}Compilation
$ lodec compile preview-layer.json -s model-layer-v1.lode -o preview.vein
Compiled preview-layer.json → preview.vein (187 bytes)
Fingerprint: d4e8f1a2...The equivalent JSON is ~350 bytes (pretty-printed) or ~220 bytes (compact). The Vein binary is ~187 bytes — roughly 15% smaller than compact JSON with full type safety and verifiability.
Distribution
The registry serves model layers as Vein binaries:
// Server
app.get("/v1/registry/layers/:name/vein", (req, res) => {
const layer = registry.getLayer(req.params.name);
const schema = loadLode("model-layer-v1.lode");
const vein = compile(layer, schema);
const fp = fingerprint(layer);
res.set("Content-Type", "application/x-vein");
res.set("X-Lode-Fingerprint", fp);
res.send(Buffer.from(vein));
});Client Verification
const res = await fetch(`${registry}/v1/registry/layers/preview/vein`);
const vein = new Uint8Array(await res.arrayBuffer());
const expected = res.headers.get("X-Lode-Fingerprint");
const schema = loadLode("model-layer-v1.lode");
if (verify(vein, expected, schema)) {
const layer = decode(vein, schema);
console.log(`Using ${layer.defaultModel} from ${layer.name} layer`);
}Per-Capability Resolution
The defaults map allows capability-specific model resolution:
function resolveModel(layer: ModelLayer, capability: string): string {
return layer.defaults?.[capability] ?? layer.defaultModel;
}
resolveModel(previewLayer, "code"); // → "qwen3-coder:30b"
resolveModel(previewLayer, "vision"); // → "qwen3-vl:30b"
resolveModel(previewLayer, "chat"); // → "gpt-oss:20b" (default)Last updated on