#!/usr/bin/env python3 """ test_connection.py - Isoliert testen, ob der vLLM-Server antwortet. Schrittweise, damit wir sehen, WO es haengt: 1. reiner Text-Call (kein Bild, kein guided_json) 2. Text-Call MIT guided_json 3. Bild-Call ohne Extras 4. Bild-Call MIT vision-budget Aufruf: python test_connection.py \ --api http://192.168.100.160:8000/v1 \ --model "google/gemma-4-12b-it" \ --pdf "/mnt/bizmatch-nas/AA Buyers NDA's/Buyers NDA's A-Z/S/Snody, Troy Notes 101706.pdf" """ import argparse, io, base64, json, time, sys from openai import OpenAI from pdf2image import convert_from_path ap = argparse.ArgumentParser() ap.add_argument("--api", default="http://192.168.100.160:8000/v1") ap.add_argument("--model", default="google/gemma-4-12b-it") ap.add_argument("--pdf", required=True) args = ap.parse_args() client = OpenAI(base_url=args.api, api_key="test-key", timeout=60, max_retries=0) SCHEMA = {"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]} def run(label, **kwargs): print(f"\n--- {label} ---") t0 = time.time() try: r = client.chat.completions.create(**kwargs) dt = time.time() - t0 print(f"OK ({dt:.1f}s): {r.choices[0].message.content[:200]}") return True except Exception as e: dt = time.time() - t0 print(f"FEHLER nach {dt:.1f}s: {type(e).__name__}: {e}") return False # 1. Reiner Text run("1. Text, keine Extras", model=args.model, max_tokens=50, temperature=0.0, messages=[{"role":"user","content":"Antworte mit genau einem Wort: Hallo"}]) # 2. Text + guided_json run("2. Text + guided_json", model=args.model, max_tokens=50, temperature=0.0, messages=[{"role":"user","content":"Gib JSON {\"ok\": true} zurueck"}], extra_body={"guided_json": SCHEMA}) # Bild vorbereiten (nur 1. Seite, moderate Groesse) print("\n(bereite Bild vor: 1. Seite, dpi=150)") try: imgs = convert_from_path(args.pdf, first_page=1, last_page=1, dpi=150) buf = io.BytesIO(); imgs[0].convert("RGB").save(buf, format="JPEG", quality=80) b64 = base64.b64encode(buf.getvalue()).decode() print(f" Bildgroesse base64: {len(b64):,} Zeichen") except Exception as e: print(f" Bildkonvertierung fehlgeschlagen: {e}") sys.exit(1) img_content = [ {"type":"text","text":"Was steht oben auf dieser Seite? Ein Satz."}, {"type":"image_url","image_url":{"url":f"data:image/jpeg;base64,{b64}"}}, ] # 3. Bild ohne Extras run("3. Bild, keine Extras", model=args.model, max_tokens=100, temperature=0.0, messages=[{"role":"user","content":img_content}]) # 4. Bild + vision budget run("4. Bild + max_soft_tokens=1120", model=args.model, max_tokens=100, temperature=0.0, messages=[{"role":"user","content":img_content}], extra_body={"mm_processor_kwargs":{"max_soft_tokens":1120}}) print("\nFertig. Welche Schritte OK/FEHLER waren, sagt uns die Ursache.")