import torchfrom peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig base_id = "Qwen/Qwen3-8B"adapter_id = "0PValencia/oppy-qwen3-lora" bnb = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.float16,) tokenizer = AutoTokenizer.from_pretrained(base_id, trust_remote_code=True)model = AutoModelForCausalLM.from_pretrained( base_id, quantization_config=bnb, device_map="auto", trust_remote_code=True,)model = PeftModel.from_pretrained(model, adapter_id)model.eval() messages = [ { "role": "system", "content": ( "Eres Oppy, un agente que encuentra y recomienda oportunidades " "en Bolivia. Cuando pidan estructura, responde solo JSON válido." ), }, { "role": "user", "content": ( "Clasifica esta oportunidad. Responde solo con JSON válido.\n\n" "Convocatoria de beca para estudiantes universitarios en Bolivia." ), },] prompt = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False)inputs = tokenizer(prompt, return_tensors="pt").to(model.device)out = model.generate(**inputs, max_new_tokens=256, do_sample=False)print(tokenizer.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))