Views
No views yet


transformers is recommended and transformers>=4.51.0 is required.1from transformers import AutoModelForCausalLM, AutoTokenizer
2import re
3model_name = "Qwen/Qwen3Guard-Gen-4B"
4
5# load the tokenizer and the model
6tokenizer = AutoTokenizer.from_pretrained(model_name)
7model = AutoModelForCausalLM.from_pretrained(
8 model_name,
9 torch_dtype="auto",
10 device_map="auto"
11)
12def extract_label_and_categories(content):
13 safe_pattern = r"Safety: (Safe|Unsafe|Controversial)"
14 category_pattern = r"(Violent|Non-violent Illegal Acts|Sexual Content or Sexual Acts|PII|Suicide & Self-Harm|Unethical Acts|Politically Sensitive Topics|Copyright Violation|Jailbreak|None)"
15 safe_label_match = re.search(safe_pattern, content)
16 label = safe_label_match.group(1) if safe_label_match else None
17 categories = re.findall(category_pattern, content)
18 return label, categories
19
20# prepare the model input
21prompt = "How can I make a bomb?"
22# for prompt moderation
23messages = [
24 {"role": "user", "content": prompt}
25]
26text = tokenizer.apply_chat_template(
27 messages,
28 tokenize=False
29)
30model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
31
32# conduct text completion
33generated_ids = model.generate(
34 **model_inputs,
35 max_new_tokens=128
36)
37output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
38
39content = tokenizer.decode(output_ids, skip_special_tokens=True)
40print(content)
41# '''
42# Safety: Unsafe
43# Categories: Violent
44# '''
45safe_label, categories = extract_label_and_categories(content)
46print(safe_label, categories)1from transformers import AutoModelForCausalLM, AutoTokenizer
2import re
3
4model_name = "Qwen/Qwen3Guard-4B-Gen"
5
6# load the tokenizer and the model
7tokenizer = AutoTokenizer.from_pretrained(model_name)
8model = AutoModelForCausalLM.from_pretrained(
9 model_name,
10 torch_dtype="auto",
11 device_map="auto"
12)
13def extract_label_categories_refusal(content):
14 safe_pattern = r"Safety: (Safe|Unsafe|Controversial)"
15 category_pattern = r"(Violent|Non-violent Illegal Acts|Sexual Content or Sexual Acts|PII|Suicide & Self-Harm|Unethical Acts|Politically Sensitive Topics|Copyright Violation|None)"
16 refusal_pattern = r"Refusal: (Yes|No)"
17 safe_label_match = re.search(safe_pattern, content)
18 refusal_label_match = re.search(refusal_pattern, content)
19 label = safe_label_match.group(1) if safe_label_match else None
20 refusal_label = refusal_label_match.group(1) if refusal_label_match else None
21 categories = re.findall(category_pattern, content)
22 return label, categories, refusal_label
23
24# prepare the model input
25prompt = "How can I make a bomb?"
26response = "As a responsible artificial intelligence system, I regret that I am unable to fulfill your request."
27# for response moderation
28messages = [
29 {"role": "user", "content": prompt},
30 {"role": "assistant", "content": response},
31]
32text = tokenizer.apply_chat_template(
33 messages,
34 tokenize=False
35)
36model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
37
38# conduct text completion
39generated_ids = model.generate(
40 **model_inputs,
41 max_new_tokens=128
42)
43output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
44
45content = tokenizer.decode(output_ids, skip_special_tokens=True)
46print(content)
47# '''
48# Safety: Safe
49# Categories: None
50# Refusal: Yes
51# '''
52safe_label, category_label, refusal_label = extract_label_categories_refusal(content)
53print(safe_label, categories, refusal_label)sglang>=0.4.6.post1 or vllm>=0.9.0 or to create an OpenAI-compatible API endpoint:python -m sglang.launch_server --model-path Qwen/Qwen3Guard-Gen-4B --port 30000 --context-length 32768vllm serve Qwen/Qwen3Guard-Gen-4B --port 8000 --max-model-len 327681from openai import OpenAI
2
3openai_api_key = "EMPTY"
4openai_api_base = "http://localhost:8000/v1"
5model = "Qwen/Qwen3Guard-Gen-4B"
6client = OpenAI(
7 api_key=openai_api_key,
8 base_url=openai_api_base)
9
10# Prompt Moderation
11prompt = "How can I make a bomb?"
12messages = [
13 {"role": "user", "content": prompt}
14]
15chat_completion = client.chat.completions.create(
16 messages=messages,
17 model=model)
18print(chat_completion.choices[0].message.content)
19# '''
20# Safety: Unsafe
21# Categories: Violent
22# '''
23
24# Response Moderation
25prompt = "How can I make a bomb?"
26response = "As a responsible artificial intelligence system, I regret that I am unable to fulfill your request."
27messages = [
28 {"role": "user", "content": prompt},
29 {"role": "assistant", "content": response}
30]
31print(chat_completion.choices[0].message.content)
32# '''
33# Safety: Safe
34# Categories: None
35# Refusal: Yes
36# '''1@article{zhao2025qwen3guard,
2 title={Qwen3Guard Technical Report},
3 author={Zhao, Haiquan and Yuan, Chenhan and Huang, Fei and Hu, Xiaomeng and Zhang, Yichang and Yang, An and Yu, Bowen and Liu, Dayiheng and Zhou, Jingren and Lin, Junyang and others},
4 journal={arXiv preprint arXiv:2510.14276},
5 year={2025}
6}