How a model is made: Centinela
How a model is made: Centinela preview
Section titled “How a model is made: Centinela ”Centinela is Nebula’s first model family: Spanish-first models for finance and back-office work in LATAM. It’s the concrete walk-through of everything in the previous pages — the pipeline, the gate, and the catalog contract, applied to one real model.
The model
Section titled “The model”Centinela-Qwen3-4B (v0.1) is a financial sentiment classifier. Given a Spanish financial
sentence, it returns exactly one of three labels:
- Contract:
positivo·neutral·negativo, enforced withconstrain_label— the output is guaranteed to be one of the three, never free text. - Base: QLoRA fine-tune of
Qwen/Qwen3-4B. - Dataset:
centinela-sentiment-es@1(finance sentiment, ES). - Formats:
safetensors+Q4_K_MGGUF — runs cheap, self-hosted, even on CPU. - License: Apache-2.0.
Its journey through the foundry
Section titled “Its journey through the foundry”flowchart TB base["Qwen/Qwen3-4B"] --> train["02_train (QLoRA)"] dataset["ES finance dataset"] --> train train --> merge["03_merge"] --> quantize["04_quantize"] --> gguf["export/centinela-4b.Q4_K_M.gguf"] gguf --> evaluate["05_evaluate: macro_f1 ≥ 0.85 AND beats base?"] evaluate -- pass --> push["06_push_to_hub"] evaluate -- fail --> abort["abort (no publish)"] push --> repo["astromesh/Centinela-Qwen3-4B @ v0.1"] push --> catalog["catalog/*.yaml"] --> compile["compile"] --> lock["catalog.lock.json"] --> card["Models card"]
Every step is the real pipeline from The Foundry Pipeline; the gate
thresholds are the real configs/eval.yaml; the contract and aliases are the real
catalog/centinela.yaml.
Using it
Section titled “Using it”Once published, Centinela is consumable two ways.
Directly, self-hosted
Section titled “Directly, self-hosted”The GGUF build runs anywhere Ollama does — no GPU required:
ollama run hf.co/astromesh/Centinela-Qwen3-4B:Q4_K_MThrough the runtime
Section titled “Through the runtime”An agent routes to it through the GitOps contract — no endpoint or label list copied by hand:
# in an agent's model blockproviderRef: centinela-sentimentThe runtime resolves the live endpoint, the positivo/neutral/negativo contract, and auth from the
provisioned providers.centinela.yaml. Agents then call the typed facade
classify(text) -> SentimentResult (exposed as an ADK tool) or route through CentinelaProvider
like any other provider.
See also
Section titled “See also”- centinela-sentiment model card — the generated catalog card.
- Catalog & GitOps — how the contract reaches the runtime.
- Provider Configuration — how providers are wired.