import json
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
base_id = "Qwen/Qwen3-4B"
revision = "1cfa9a7208912126459214e8b04321603b3df60c"
adapter_id = "thunderjordi/mifidbrain-qwen3-4b-lora-v0"
tokenizer = AutoTokenizer.from_pretrained(base_id, revision=revision)
base = AutoModelForCausalLM.from_pretrained(
base_id, revision=revision, device_map={"": 0}, dtype=torch.float16,
quantization_config=BitsAndBytesConfig(
load_in_4bit=True, bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.float16,
),
)
model = PeftModel.from_pretrained(base, adapter_id, revision="v0.5").eval()
facts = {
"as_of_date": "2026-08-31", "firm_type": "UK investment firm",
"firm_jurisdiction": "UK", "activity": "purchase",
"instrument_reportable": True, "transmitted_order": False,
"transmission_conditions_met": None, "venue_country": "GB",
"execution_decision_country": "GB", "asset_class": "equity",
}
prompt = (
"Classify supplied facts under the MiFIDBrain simplified research rules. "
"Return only JSON with key determination and one of: "
"REPORTABLE, NOT_REPORTABLE, INSUFFICIENT_INFORMATION, FUTURE_RULES_UNPUBLISHED"
". Unknown is distinct from false. Do not infer instrument scope from venue.\n"
+ json.dumps(facts, separators=(",", ":"), ensure_ascii=False)
)
text = tokenizer.apply_chat_template(
[{"role": "user", "content": prompt}], tokenize=False,
add_generation_prompt=True, enable_thinking=False,
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.inference_mode():
output = model.generate(**inputs, max_new_tokens=64, do_sample=False)
print(tokenizer.decode(output[0, inputs.input_ids.shape[1]:], skip_special_tokens=True))