A fine-tuned Gemma 3 270M model specialized in redacting Personally Identifiable Information (PII) from Android system logs (logcat, bugreports, dmesg).
1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3
4model_id = "logcat-ai/safelog-lm"
5
6tokenizer = AutoTokenizer.from_pretrained(model_id)
7model = AutoModelForCausalLM.from_pretrained(
8 model_id,
9 torch_dtype=torch.bfloat16,
10 device_map="cuda"
11)
12
13SYSTEM_PROMPT = (
14 "You are a PII redaction tool. Replace all personally identifiable information "
15 "in the input text with the appropriate tag. Preserve all other text exactly. "
16 "Tags: [IMEI], [SERIAL_NUMBER], [ANDROID_ID], [ADVERTISING_ID], [MAC_ADDRESS], "
17 "[ICCID], [IMSI], [IP_ADDRESS], [GPS_COORDINATES], [WIFI_SSID], [BLUETOOTH_NAME], "
18 "[PERSON_NAME], [EMAIL], [PHONE_NUMBER], [ACCOUNT_NAME], [PATH_USERNAME], "
19 "[ACCESS_TOKEN], [CERTIFICATE_FINGERPRINT], [URL_WITH_PII]"
20)
21
22def redact(text):
23 prompt = f"""<start_of_turn>user
24{SYSTEM_PROMPT}
25
26Input: {text}<end_of_turn>
27<start_of_turn>model
28"""
29 inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
30 outputs = model.generate(**inputs, max_new_tokens=512, do_sample=False)
31 return tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True).strip()
32
33# Example
34log_line = "I/TelephonyManager: getDeviceId() returning 358673091234567"
35print(redact(log_line))
36# Output: I/TelephonyManager: getDeviceId() returning [IMEI]
Built by
logcat.ai — AI-powered observability for Android and Linux system-level intelligence.