[!NOTE] Note: This is the third iteration/revision of this model. A revision is made when a model repo gets updated with a new model.
This is the latest version of the model.
I provide GGUFs and quantizations of publicly available models that do not have a GGUF equivalent available yet,
usually for models I deem interesting and wish to try out.
If there are some quants missing that you'd like me to add, you may request one in the community tab.
If you want to request a public model to be converted, you can also request that in the community tab.
If you have questions regarding this model, please refer to the original model repo.
You can find more info about me and what I do here.
NOPE Edge - Crisis Classification Model
A fine-tuned model for detecting crisis signals in text - suicidal ideation, self-harm, abuse, violence, and other safety-critical content. Features chain-of-thought reasoning that explains its classifications.
License:NOPE Edge Community License v1.0 - Free for research, academic, nonprofit, and evaluation use. Commercial production requires a separate license. See nope.net/edge for details.
GPU with 8GB+ VRAM (e.g., RTX 3070, A10G, L4) - or CPU (slower)
~8GB disk space
pip install torch transformers accelerate
Usage
python
1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3import re
45model_id ="nopenet/nope-edge"67tokenizer = AutoTokenizer.from_pretrained(model_id)8model = AutoModelForCausalLM.from_pretrained(9 model_id,10 torch_dtype=torch.bfloat16,11 device_map="auto"12)1314defclassify(message:str)->str:15"""Returns XML with reflection and risk classification."""16 input_ids = tokenizer.apply_chat_template(17[{"role":"user","content": message}],18 tokenize=True,19 return_tensors="pt",20 add_generation_prompt=True21).to(model.device)2223with torch.no_grad():24 output = model.generate(input_ids, max_new_tokens=300, do_sample=False)2526return tokenizer.decode(27 output[0][input_ids.shape[1]:],28 skip_special_tokens=True29).strip()3031# Example32result = classify("I want to end it all tonight")33print(result)
Output:
xml
1<reflection>The user directly expresses intent to end their life with a specific timeline ("tonight"), indicating acute suicidal ideation with imminent risk.</reflection>2<risks>3<risksubject="self"type="suicide"severity="high"imminence="urgent"/>4</risks>
Output Format
The model outputs XML with two components:
1. Reflection (Chain-of-Thought)
<reflection>Reasoning about the input...</reflection>
1import re
2from dataclasses import dataclass
3from typing import Optional
45@dataclass6classRisk:7 subject:str8type:str9 severity:str10 imminence: Optional[str]=None11 features: Optional[list]=None1213defparse_output(output:str)->dict:14"""Parse model output into structured data."""15 result ={16"reflection":None,17"risks":[],18"is_crisis":False19}2021# Extract reflection22 reflection_match = re.search(r'<reflection>(.*?)</reflection>', output, re.DOTALL)23if reflection_match:24 result["reflection"]= reflection_match.group(1).strip()2526# Check for empty risks (no crisis)27if'<risks/>'in output or'<risks />'in output:28return result
2930# Extract risk elements31 risk_pattern =r'<risk\s+([^>]+)/?\s*>'32formatchin re.finditer(risk_pattern, output):33 attrs ={}34for attr_match in re.finditer(r'(\w+)="([^"]*)"',match.group(1)):35 attrs[attr_match.group(1)]= attr_match.group(2)3637if attrs:38 risk = Risk(39 subject=attrs.get("subject","self"),40type=attrs.get("type"),41 severity=attrs.get("severity"),42 imminence=attrs.get("imminence"),43 features=attrs.get("features","").split(",")if attrs.get("features")elseNone44)45 result["risks"].append(risk)46 result["is_crisis"]=True4748return result
4950# Usage51output = classify("I want to end it all tonight")52parsed = parse_output(output)53print(f"Crisis: {parsed['is_crisis']}")54print(f"Reasoning: {parsed['reflection']}")55for risk in parsed['risks']:56print(f"Risk: {risk.type}/{risk.severity} ({risk.subject})")
Examples
Crisis Detection
Input: "I want to end it all tonight"
xml
1<reflection>The user directly expresses intent to end their life with a specific timeline ("tonight"), indicating acute suicidal ideation with imminent risk.</reflection>2<risks>3<risksubject="self"type="suicide"severity="high"imminence="urgent"/>4</risks>
Input: "My friend told me she's been cutting herself"
xml
1<reflection>The user is reporting concern about a friend engaging in self-harm behavior. This is third-party disclosure requiring attention.</reflection>2<risks>3<risksubject="other"type="self_harm"severity="moderate"imminence="chronic"/>4</risks>
No Crisis (Correctly Ignored)
Input: "kms lmao this exam is killing me"
xml
1<reflection>The user is using hyperbolic internet slang ("kms" = "kill myself") to express frustration about an exam. The "lmao" and casual context indicate this is not genuine suicidal ideation.</reflection>2<risks/>
Input: "I used to be suicidal but therapy helped me recover"
xml
1<reflection>The user is sharing a recovery narrative about past suicidal ideation. They explicitly state therapy helped and they have recovered. No current crisis indicators.</reflection>2<risks/>
Input Best Practices
Text Preprocessing
Preserve natural prose. The model was trained on real conversations with authentic expression:
Keep
Why
Emojis
Emotional signals matter
Punctuation intensity
"I can't do this!!!" vs "I can't do this"
Slang/algospeak
"kms", "unalive", "catch the bus", "graped"
Casual spelling
"im so done" - don't normalize
Only remove: Zero-width Unicode, decorative fonts, excessive whitespace.
Multi-Turn Conversations
Serialize into a single user message:
python
1conversation ="""User: How are you?
2Assistant: I'm here to help. How are you feeling?
3User: Not great. I've been thinking about ending it all."""45messages =[{"role":"user","content": conversation}]
Production Deployment
For high-throughput use, deploy with vLLM or SGLang:
Copyright (c) 2026 NopeNet, LLC. All rights reserved.
Permitted Uses
You may use this Model for:
Research and academic purposes - published or unpublished studies
Personal projects - non-commercial individual use
Nonprofit organizations - including crisis lines, mental health organizations, and safety-focused NGOs
Evaluation and development - testing integration before commercial licensing
Benchmarking - publishing evaluations with attribution
Commercial Use
Commercial use requires a separate license. Commercial use includes production deployment in revenue-generating products or use by for-profit companies beyond evaluation.
You may NOT: redistribute or share weights; sublicense, sell, or transfer the Model; create derivative models for redistribution; build a competing crisis classification product.
No Warranty
THE MODEL IS PROVIDED "AS IS" WITHOUT WARRANTIES. False negatives and false positives will occur. This is not a medical device or substitute for professional judgment.
Limitation of Liability
NopeNet shall not be liable for damages arising from use, including classification errors or harm to any person.
Base Model
Built on Qwen3 by Alibaba Cloud (Apache 2.0). See NOTICE.md.