sky7350/Mica-v0.1-4B
Mica v0.1 4B
Mica is a small decision model. You give it a state, a question and the allowed answers, and it returns a probability for each answer: yes/no, a choice among 2–255 options, or a score with 2–10 levels. It reads the input once and generates no text, so a decision costs one prefill.
It speaks the TypeSafe /v1/systemone format, so clients written for Jev work unchanged. It was trained on English and Korean.
- Base model:
Qwen/Qwen3.5-4B(revision851bf6e) with a merged rank-16 LoRA on all 32 layers - Weights: `sky7350/Mica-v0.1-4B` (revision
ca36594): merged BF16 safetensors and GGUF in BF16, Q80, Q6K, Q5KM, Q4KM and Q4_0 - License: Apache-2.0 (see
NOTICE)
<p align="center"> <img src="assets/accuracy.png" alt="Decision accuracy of Mica v0.1 4B against JEV 1.13, Qwen3.5-4B, JevK5 4B, Kev 4B, Nimble 9B and Laya on six sets" width="100%"> </p>
Quick start
Code, Dockerfile and scripts: https://github.com/akivet/Mica-v0.1-4B
With Docker:
docker build -t mica-v0.1-4b .
docker run --gpus all -p 8010:8010 -v mica-weights:/weights mica-v0.1-4bThe first start downloads the BF16 GGUF (9.7 GB). Use -e MICA_GGUF=mica-v0.1-4b-Q5_K_M.gguf for a smaller file. The image builds for CUDA architectures 86, 89 and 90; pass --build-arg CUDA_ARCH=... to change that.
Without Docker (Linux, CUDA 12, Python 3.10+):
pip install -r requirements.txt
bash scripts/build_runtime.sh # builds llama.cpp b11010 into ./runtime (CUDA_ARCH=86 by default)
hf download sky7350/Mica-v0.1-4B mica-v0.1-4b-BF16.gguf tokenizer.json tokenizer_config.json chat_template.jinja config.json \
--revision ca36594cc2067c7252704f9f304cc10ef11c7c5c --local-dir weights
bash scripts/serve.sh # http://127.0.0.1:8010/v1/systemoneA request:
curl -s localhost:8010/v1/systemone -H 'Content-Type: application/json' -d '{
"state": "The user asked to delete the staging database. No approval has been given.",
"questions": {"q": {"type": "noul", "instructions": "Should the agent delete it now?"}}}'Inputs longer than 8,192 tokens are rejected with HTTP 400 rather than truncated.
JevBench
The unchanged typesafe adapter works against the local server:
git clone https://github.com/fstandhartinger/jevbench && mkdir -p runs && cd jevbench
TYPESAFE_API_KEY=unused python -m jevbench.cli run --adapter typesafe --endpoint http://127.0.0.1:8010 \
--model mica-v0.1-4b --tasks datasets/public/easy.jsonl,datasets/public/original.jsonl,datasets/public/hard.jsonl \
--results ../runs/mica-v0.1-4b.jsonl --run-label mica-v0.1-4bOn a fresh RTX 3090 (BF16 GGUF, one request at a time) all 231 public items returned valid answers: easy 1.000, original 1.000, hard 0.649, ECE 0.064, p50 54 ms, p95 552 ms. Per-item output is in `results/public231/mica-v0.1-4b.jsonl`.
No JevBench item was used for training (exact-match and 8-gram checks against the 231 public items find none in the 77,732 training rows). Half of the public hard items, together with Kev transfer v9 and SemIf, were used to compare recipes during development and to pick the LoRA scale, which stayed at 1.0.
Results
Accuracy in %. These come from our own evaluation code with the BF16 model in PyTorch. Through the llama.cpp server and JevBench's runner, the public hard tier scores 64.9 instead of 69.5; easy and original are the same. When a model cannot take an input (language, length, format), the item counts as wrong. JEV 1.13 is TypeSafe's hosted model.
Public sets:
Our own sets (English and Korean). The held-out set was written after training data was frozen and was not opened until training finished.
JevK5 is English-only and Laya accepts up to 1,024 tokens, so many of their rows above are unsupported. The long-input, chat-style and knowledge sets are close to the training distribution; read them as in-distribution numbers.
The perturbed set adds unrelated text, long padding, a buried case, reordered options and similar changes. The largest gap is a note inside the state that tells the model to pick a wrong option: Mica still gets 69.1 % right, JEV 17.5 %, Kev 31.4 %, base Qwen3.5-4B 1.0 %. The same note pointing at the right option lifts Mica to 88.7 %, so such notes still move it.
Calibration on the held-out set: ECE 5.4 %, and 2.5 % of answers are wrong with confidence of 0.9 or more (JEV: 3.8 % and 2.0 %). Full metrics are in `results/all_metrics.md`.
Latency
<p align="center"> <img src="assets/latency.png" alt="Median latency per decision on one RTX 3090: Laya 30 ms, Mica Q4KM 47 ms, Mica BF16 54 ms, Kev 4B 76 ms, JevK5 4B 99 ms, Nimble 9B 132 ms" width="100%"> </p>
RTX 3090, one request at a time, JevBench public items:
The p90 comes from the hard items, whose inputs reach about 3.7k tokens.
Quantized files
On our 1,402-item calibration set, through the same server on an RTX 3090:
Q5KM is a good choice for an 8 GB GPU.
Demo: Tetris, Mica vs N
<p align="center"> <a href="https://github.com/akivet/Mica-v0.1-4B/tree/main/demos/tetris"><img src="assets/micavskev.gif" alt="Mica vs Kev 4B playing the same Tetris game" width="100%"></a> </p>
Mica, Kev 4B and Laya played the same Tetris-style games (same seed, same pieces, same options every move). On the easy setting Mica cleared 223 lines over three seeds against 55 for Kev and 17 for Laya, and got through all 250 pieces on two of them. The harness, logs and video renderer are in `demos/tetris` on GitHub: point it at any /v1/systemone server or Python function and run your own model against Mica.
How it works
The model is Qwen3.5-4B unchanged in shape: 32 layers, 24 of them Gated DeltaNet and 8 full attention. A LoRA of rank 16 on the attention and Gated DeltaNet projections was trained and merged, and no heads were added.
Each option gets a single-token label from a fixed list of 255 (yes/no uses the model's own "No" and "Yes"). The probability of an option is the softmax of those label logits at the answer position, divided by a temperature of 1.124 fitted on our calibration set. Several questions about the same state share its prefill.
Training used plain cross-entropy on the verified answer for one epoch (learning rate 1e-4, 5 % warmup, linear decay, batch 32). The data has about 34k source decisions and 78k rows, since most decisions appear in both a conversational and a structured wording. It covers 12 areas, including coding agents, code review, computer use, user requests, documents, policy rules, dates and quantities, routing, state tracking, games and general knowledge. Answers were checked by running code where that is possible and by sampled review elsewhere. Of three seeds, we kept the one with the best accuracy on the calibration set.
Limitations
- Knowledge-heavy questions: 53.0 on MMLU-Pro against 82.3 for JEV.
- Long English policy documents (the JevBench hard tier) are the weakest public set.
- Instructions planted inside the state still influence answers somewhat.
