83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
#!/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.")
|