Q-Triage-50M-Sovereign β€” Support ticket router β€” category + priority

Built by JE Horizon β€” sovereign 50M specialist

Part of the Q-Office-Suite, a family of small sovereign-base specialists trained from scratch at 50M parameters. Not bundled in the Qovaryx desktop app β€” published here for transparency + research.

Drop inbound tickets in. Get back a category and a priority. Every time.

What this model does, in one sentence

Given an inbound support ticket, return a JSON object with the assigned category (incident/sev1-3, billing, IT/account, IT/access, IT/networking, feature_request, feedback, support/general) and the priority (critical, high, medium, low). Refuses to invent labels outside the closed vocabulary.

Honest performance

  • Task: ticket triage
  • Metric: routing_label_accuracy (JSON {category, priority} exact match)
  • Holdout: n=60 rows, never seen in training, scored row-by-row
  • Score: 100.0% mean
  • Bootstrap CI 95% lower bound: 1.000
  • Gate threshold: 0.90
  • Verdict: PASS at point estimate AND at bootstrap CI lower bound

What it's used for β€” real workflows

  • Helpdesk auto-categorization β€” Ingest tickets from Zendesk/Jira/Linear/HelpScout, emit category (incident/sev1-3, billing/refund-upgrade-dispute, IT/account-networking-access, feature_request, feedback, support/general) and priority (critical/high/medium/low). Use the category to fork into the right queue.
  • Email-to-ticket routing β€” Subscribe to a support inbox, run subject + first paragraph through Q-Triage on intake, route to the engineer/ops/billing team before a human sees it.
  • Internal #help-desk Slack bot β€” A Slack bot triggers on /triage and posts the JSON inline; the on-call rotation reacts to the priority field. Reduces 'this should have been P1' arguments.
  • Closed-vocabulary discipline for compliance β€” The model refuses to invent labels outside the trained vocabulary. Auditable category dictionaries become enforceable instead of aspirational.
  • On-device privacy-sensitive triage β€” 53.5M params on CPU means even tickets containing PII or customer secrets never leave the box. No third-party API call required.

What problem this actually solves

Most support pipelines bleed time at the triage step: a human reads every inbound ticket and guesses category + priority. They get tired, they invent categories ("IT/sev_incident" instead of incident/sev2), they downgrade incidents that should page someone. Q-Triage doesn't get tired and refuses to invent labels. 100% on the held-out audit means a deterministic intake step that frees the human for the harder downstream work.

Integration paths

  • REST endpoint via the Q-Office-Suite runtime β€” POST /run/q-triage {text: "..."} returns the JSON. Single-binary deploy.
  • Direct Python load β€” Use the FinanceDecoder loader below; ~250 ms / call on CPU after warmup.
  • Zapier / n8n webhook β€” Wrap the runtime in a small HTTPS proxy and call from any workflow tool.

Example

Input:

Triage. Return JSON {category, priority}.
Subject: 502 errors since 14:00 deploy

Output:

{"category": "incident/sev2", "priority": "high"}

What this is NOT

  • Not a general-purpose chatbot. This head does one job and does it consistently. Free-text generation outside the trained task surface will degrade.
  • Not a replacement for a verifier. This is one component in the Qovaryx cluster-shell architecture. The decision-acceptance discipline lives in the wrapper, not in the head.
  • Not reproducible from this card. Weights and audit are public; the crystal corpus, eval gate constants, and training hyperparameters are not.

Proprietary Qovaryx technology β€” built on our own scratch base

This is a 53.5M-parameter sovereign specialist in the Qovaryx Compact Specialist Suite. It is full-fine-tuned from tjarvis91/qovaryx-50m-scratch-base β€” our own scratch-trained base, not a borrowed foundation model.

  • Base: Qovaryx 50M scratch base. Pretrained from random initialization on 491.5M tokens. Not SmolLM2. Not Qwen. Not Llama. Not Mistral. Not Phi. No HuggingFace foundation. No closed-source weights. Every parameter traces back to a Qovaryx training run on Qovaryx hardware.
  • Tokenizer: Qovaryx english_v1 BPE (vocab 32000), built in-house against our own pretraining corpus.
  • Architecture: Qovaryx FinanceDecoder β€” 12 decoder blocks, GQA, RoPE, SwiGLU FFN, RMSNorm, MTP heads, decision head.
  • Recipe: Qovaryx crystallization discipline β€” train the law before replaying the noise.
  • Runs on CPU. No GPU required at inference.

Architecture (Qovaryx proprietary)

  • 53.5M parameters
  • 12 decoder blocks, d_model=512, n_head=8, GQA n_kv_head=2
  • SwiGLU FFN, RoPE positional, RMSNorm
  • Multi-token prediction (MTP) auxiliary heads
  • Decision head for routed-decision tasks
  • Tokenizer: Qovaryx english_v1 BPE, vocab 32000 (in-house build)
  • Pretrained from qovaryx-50m-scratch-base step 60000 β€” 491.5M tokens
  • Full fine-tune (no LoRA, no QLoRA, no adapter): every parameter was updated on the Qovaryx crystal corpus for this specialist

How to load it (Python)

import torch
from tokenizers import Tokenizer
from bleeding_edge.model.decoder import FinanceDecoder, DecoderConfig

tok = Tokenizer.from_file("tokenizer.json")
ckpt = torch.load("pytorch_model.pt", map_location="cpu", weights_only=False)
cfg = DecoderConfig(**{k: v for k, v in ckpt["model_cfg"].items() if k in DecoderConfig.__dataclass_fields__})
cfg.vocab_size = tok.get_vocab_size()
model = FinanceDecoder(cfg).eval()
state = {k.removeprefix("_orig_mod."): v for k, v in ckpt["model_state"].items()}
model.load_state_dict(state, strict=False)

prompt = "Triage. Return JSON {category, priority}.\nSubject: 502 errors since 14:00 deploy"
ids = tok.encode(prompt).ids
cur = torch.tensor([ids], dtype=torch.long)
with torch.no_grad():
    for _ in range(120):
        nxt = int(torch.argmax(model(cur, return_decision=False).logits[:, -1, :], dim=-1))
        if nxt == 0: break
        cur = torch.cat([cur, torch.tensor([[nxt]])], dim=1)
print(tok.decode(cur[0].tolist()[len(ids):]))

License & posture

Apache 2.0 for the published weights, model card, and example code.

The Qovaryx scratch base build pipeline, the crystallization corpus, the eval gate constants, the cluster routing policy, and the protected runtime entrypoint are Qovaryx proprietary technology and are not included in this release. Same posture as every previous Qovaryx public release: ship the weights and the audit, not the recipe.

Sibling specialists in the Qovaryx Compact Specialist Suite

All ten specialists share the qovaryx-50m-scratch-base and the same audit discipline. Use one directly; use all ten through the cluster shell.

Official site & community

The full Qovaryx runtime that orchestrates this specialist behind a single decision-acceptance gate ships from:

If you find a failure mode this card doesn't cover, open a discussion on this repo or come to the Discord β€” that's how the next crystal corpus gets written.

Downloads last month
6
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for tjarvis91/Q-Triage-50M-Sovereign

Finetuned
(10)
this model