Angel-Actor
Angel-Actor role-plays a psychotherapy patient across a multi-turn conversation. You are the therapist; it answers in character, keeps some things back, and opens up gradually. It is stage 2 of Angel, a two-stage simulator of psychotherapy patients: Angel-Observer first turns a short patient description into a detailed profile and symptom network, and the Actor plays that patient.
🎮 Live demo: talk to a patient · 💻 Code: ANGEL-UserSim · 🕸️ Angel-Observer
short description ──► Angel-Observer ──► long profile + symptom network ──► Angel-Actor ──► patient replies
How to use
The quickest way is the live demo. To run it yourself, use the code repository, which builds the patient prompt from a profile and downloads both models from Hugging Face on first use:
git clone https://github.com/Scarelette/ANGEL-UserSim.git && cd ANGEL-UserSim
pip install -r model_usage/requirements-usage.txt
python -m model_usage.angel chat --short-profile-file model_usage/examples/example_short_profile.txt
From Python:
from model_usage.angel import AngelModel
with AngelModel() as model:
note = open("model_usage/examples/example_short_profile.txt").read()
print(model.send("me", "Hi, what brings you in today?", short_profile=note)["reply"])
print(model.send("me", "How long has that been going on?")["reply"])
Both models together need a GPU with about 40 GB. Details:
model_usage/.
Output format. The patient's description goes in the system prompt, and
therapist turns are user turns. Each reply has two parts:
<state>…</state> is the patient's inner state (hidden from the therapist)
and <word>…</word> is what the patient says. model_usage shows only the
<word> part. Use the Qwen3 chat template with thinking off
(enable_thinking=False).
Training
Qwen3-8B, trained in two stages on synthetic therapy conversations:
| Stage | Data | Settings |
|---|---|---|
| SFT (QLoRA) | 423 conversations between a prompted Qwen3-30B-A3B patient and an LLM therapist | LoRA r=64 / α=16, lr 1e-4, 5 epochs, loss on patient turns |
| DPO | 6,901 preference pairs: at each turn the SFT model sampled up to 5 replies and a Claude judge picked the best and worst | LoRA r=16 / α=32, lr 2e-6, β 0.1, 2 epochs; reference = the SFT model |
Each conversation followed a symptom network from Angel-Observer in which
part of the network was masked: those mechanisms start out unrecognised
by the patient and surface as the conversation goes on. The networks come
from PSYCHE, our graph-grounded dataset for psychological user
simulation (release coming soon). The judge scored replies on safety,
structure, specificity, state alignment, consistency with the history,
progress and naturalness. Full recipe:
model_training/actor/.
Intended use and limitations
- Research use: simulated patients for training and evaluating therapy-support systems, and for practice by clinicians-in-training.
- Not therapy, and not a real person. It is a simulation and can break character, contradict its profile or behave unlike a real patient. Asking it to summarise the session, give advice or plan the next session tends to pull it out of role.
- Sensitive content. By design it portrays depression, anxiety, trauma, substance use and passive suicidal thoughts. Its training prompts keep suicidality passive and vague (no intent, plans or methods), but outputs are not guaranteed to follow that. Use appropriate safeguards and don't expose it to vulnerable users as if it were a support tool.
- English only.
Citation
Coming soon.