What it does
Same shape as v8 — reads a dialogue turn, emits an AffectDelta JSON.
What changed:
- Base bumped to Qwen3-4B — broader Chinese coverage, sharper
context handling.
- Label vocab expanded to 50. v8's 24 labels collapsed bittersweet
and wistful; v9 separates them. New labels span four regions:
- Fine-grained high arousal (excited → thrilled / euphoric /
exhilarated)
- Fine-grained negative (angry / scared / panicked / indignant
differentiated from frustrated)
- Anticipation-class (dreading / longing / anticipating / nostalgic)
- Social affect (embarrassed / proud / envious / grateful / ashamed)
- Anticipation as a first-class field. v8 hinted at it; v9 outputs
anticipation: {valence, arousal, weight} so the consumer can model
forward-looking mood, not just present.
Why v9 over v8
Table with columns: use case, adapter| use case | adapter |
|---|
| Tight inter-rater on 24 labels, consumer GPU, fast | v8 |
| Finer mixed-feeling resolution, anticipation modeling, 4B GPU available | v9 |
Training data — not released
~800 SFT samples, hand-curated Chinese-first dialogue snippets. Data
not released to protect contributor privacy. The schema and label
vocabulary are documented; reproduction requires your own corpus.
Label vocab — 50 labels (v9)
24 v8 labels retained (backward-compatible) plus 26 new. Anchor table
follows the same (valence, arousal) format as v8 — see
label_anchors_v9.json in this repo for the full table.
Usage
from peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizer base = "Qwen/Qwen3-4B"tok = AutoTokenizer.from_pretrained(base)mdl = AutoModelForCausalLM.from_pretrained( base, device_map="auto", torch_dtype="auto",)mdl = PeftModel.from_pretrained(mdl, "kaishuiji/vheart-affect-v9")mdl.eval()
With feltstate
from feltstate import Enginefrom feltstate.sources import VheartSource eng = Engine(source=VheartSource("kaishuiji/vheart-affect-v9"))eng.observe("今晚跑通了三周的实验。")print(eng.state.mood.mixed_blend)
Limitations
- GPU required. 4B + LoRA is ~6GB VRAM in fp16. v8 if you don't
have one.
- Chinese-first. Same caveat as v8.
- Single-character measurement. Same caveat as v8.
- Schema bound to feltstate. Same caveat as v8.
- v9 vs v8 isn't a clean win on every metric. Internal stress test
(mve_v02 baseline) had v8 slightly ahead on simple emotion_score;
v9 wins on mixed-feeling and anticipation tasks. Pick what you
measure for.
Citation
@software{feltstate_vheart_v9, author = {morephine}, title = {feltstate / vheart-affect-v9}, url = {https://huggingface.co/kaishuiji/vheart-affect-v9}, year = {2026}}
License
Apache 2.0 (matches Qwen3 base).