74 lines
2.1 KiB
Python
74 lines
2.1 KiB
Python
import base64
|
|
import os
|
|
import time
|
|
from typing import Any, Dict, List
|
|
|
|
import requests
|
|
|
|
|
|
OLLAMA_URL = os.getenv("OLLAMA_URL", "http://192.168.1.250:11434")
|
|
DEFAULT_MODEL = os.getenv("VLM_MODEL", "qwen2.5vl:32b")
|
|
|
|
|
|
def _img_to_data_uri(path: str) -> str:
|
|
with open(path, "rb") as f:
|
|
b64 = base64.b64encode(f.read()).decode("utf-8")
|
|
return f"data:image/jpeg;base64,{b64}"
|
|
|
|
|
|
def chat_vision(
|
|
prompt: str,
|
|
image_paths: List[str],
|
|
*,
|
|
temperature: float = 0.1,
|
|
options: Dict[str, Any] | None = None,
|
|
model: str = DEFAULT_MODEL,
|
|
timeout_sec: int = 120,
|
|
) -> str:
|
|
# Logging: request summary before heavy work
|
|
try:
|
|
img_sizes = []
|
|
for p in image_paths:
|
|
try:
|
|
img_sizes.append(os.path.getsize(p))
|
|
except Exception:
|
|
img_sizes.append(-1)
|
|
print(
|
|
f"[Ollama] Prepare chat url={OLLAMA_URL}/api/chat model={model} temp={temperature} "
|
|
f"images={len(image_paths)} sizes={img_sizes} timeout={timeout_sec}s"
|
|
)
|
|
except Exception:
|
|
pass
|
|
|
|
images = [_img_to_data_uri(p) for p in image_paths]
|
|
payload: Dict[str, Any] = {
|
|
"model": model,
|
|
"messages": [
|
|
{
|
|
"role": "user",
|
|
"content": prompt,
|
|
"images": images,
|
|
}
|
|
],
|
|
"options": {"temperature": temperature, **(options or {})},
|
|
"stream": False,
|
|
}
|
|
|
|
t0 = time.time()
|
|
try:
|
|
resp = requests.post(f"{OLLAMA_URL}/api/chat", json=payload, timeout=timeout_sec)
|
|
dt = time.time() - t0
|
|
print(f"[Ollama] Response status={resp.status_code} elapsed={dt:.2f}s")
|
|
resp.raise_for_status()
|
|
data = resp.json()
|
|
text = (data.get("message") or {}).get("content", "")
|
|
_preview = (text[:120]).replace("\n", " ")
|
|
print(f"[Ollama] Text length={len(text)} preview={_preview}...")
|
|
return text
|
|
except Exception as e:
|
|
dt = time.time() - t0
|
|
print(f"[Ollama][Error] during request elapsed={dt:.2f}s: {e}")
|
|
raise
|
|
|
|
|