Cogito Estella (v0.20.1)
Non-autoregressive decoder heads that turn sentence embeddings into knowledge-graph
triples in one forward pass. They power the full mode of cogito-mcp, a document and
code memory for agents that answers questions in a few hundred tokens.
Code, tests and benchmarks: https://github.com/DeliVali/cogito-estella
Default weights
encoders.json maps the encoder to its assets and to the decode thresholds they were
validated under; cogito-mcp --full reads it on first run and downloads these files from
the m2m100-pool/ subfolder.
| Assets | Triple F1 | Licence |
|---|---|---|
m2m100-pool/cogito-prose-ontology-m2mpool{,-s2,-s3}.safetensors + .json sidecars, pool.safetensors + pool.json, vocab-onto-m2mpool.json |
0.852 | heads and pooling Apache-2.0; M2M-100 encoder MIT (facebook/m2m100_418M, revision 55c2e61b, downloaded from its own repository) |
The ensemble decodes 76 relations over a 20k-entity vocabulary. F1 is measured on held-out sentences whose entity and relation combinations never appeared in training, on a slice untouched by threshold selection. Each safetensors file carries its contract (encoder, revision, width, normalization, vocabulary and pooling sha256, F1, step) in its header and sidecar.
The package indexes code without these heads: in full mode a code file gets its graph
(defines, contains, calls, imports, inherits) from a tree-sitter parse, and its
lines are ranked like the lite index.
Other heads on the same encoder
Standalone research assets, not part of the package's ask/ingest path:
| File | Task | Triple F1 |
|---|---|---|
m2m100-pool/cogito-prose-candidates-m2mpool{,-s2,-s3,-s4,-s5}.safetensors + vocab-candidates-m2mpool.json |
entity-conditioned prose, 60 raw-verb relations (5-model ensemble) | 0.878 |
m2m100-pool/cogito-toolcalls-m2mpool.safetensors |
tool-call extraction | 1.000 |
m2m100-pool/cogito-code-lora-m2mpool.safetensors + vocab-code-lora-m2mpool.json |
Python code lines, calls and imports, 501-name vocabulary | 0.979 |
Candidates loads through CogitoGraphExtractor unchanged (pass the checkpoints and vocab
above with threshold=0.1, adj_threshold=0.6); tool calls load through a plain
GraphDecoder (K=24, node_dim=448, V=8192, R=48). The code head adapts the encoder itself
with LoRA (r=32, α=64, dropout 0.1, every attention and feed-forward projection of the 12
encoder layers); a frozen encoder plateaued at 0.38. Its reference loader is
load_code_lora.py:
from load_code_lora import load
extract = load()
extract("import numpy as np") # [('ROOT', 'imports', 'numpy')]
Files at the repository root come from earlier versions and are kept so old releases stay reproducible; the package does not use them.
Usage
pip install cogito-estella # lite: no torch, does not use these weights
cogito-estella setup docs/ # registers the server with the agents on this machine
pip install "cogito-estella[full]" # full: these weights, resolved on first run
cogito-mcp docs/ --full --dir .cogito
Estella("docs/").ask(question, deep=True) loads these weights once inside a lite session.
The lite index does not use this repository either: for questions across languages it
keeps a vector per sentence from intfloat/multilingual-e5-small (MIT), run with ONNX
Runtime and quantized to int8 on first use (118 MB, fetched once from that repository).
In full mode one encoder pass now feeds both the graph heads and the retrieval vector:
the same facts, 1.7× faster on CPU.
from cogito_estella.integrations.llamaindex_connector import CogitoGraphExtractor
from cogito_estella.mcp.weights import resolve
w = resolve(None, None)
ex = CogitoGraphExtractor([str(c) for c in w.checkpoints], str(w.vocab), pool_path=w.pool,
threshold=w.operating_point[0], adj_threshold=w.operating_point[1])
ex.extract("The committee approved the new budget.") # [(subject, relation, object), ...]
Intended use and limitations
Structured-knowledge extraction for agent memory and GraphRAG ingestion. Entities are chosen among the nouns of a sentence (or caller-supplied candidates) within a 20k-lemma vocabulary and relations among 76 classes; content outside those spaces is not captured. The training oracle is dependency-parse SVO, so graphs over free prose inherit its noise. The pooling was trained on English sentences up to 128 tokens. All heads and the pooling are Apache-2.0.