Fixing metadata import errors

This commit is contained in:
2025-09-24 11:38:53 +02:00
parent 73e89b9a67
commit 6240e86650
6 changed files with 294 additions and 53 deletions

View File

@@ -97,6 +97,10 @@ DEFAULT_TRANSCRIPT_LANG = os.getenv("DEFAULT_TRANSCRIPT_LANG", "en").strip() or
OWUI_URL = os.getenv("OPENWEBUI_URL", "").rstrip("/")
OWUI_KEY = os.getenv("OPENWEBUI_API_KEY", "")
OWUI_KB = os.getenv("OPENWEBUI_KB_NAME", "Homelab Library")
OWUI_AUTO_FIX_METADATA = os.getenv("OPENWEBUI_AUTO_FIX_METADATA", "1").strip().lower() not in ("0", "false", "no")
OWUI_METADATA_TEMPLATE_JSON = os.getenv("OPENWEBUI_METADATA_TEMPLATE_JSON", "").strip()
_OWUI_TEMPLATE_PATCHED: set[str] = set()
# Redis-backed job queue settings and offload toggle
REDIS_URL = os.getenv("REDIS_URL", "redis://redis:6379/0").strip()
@@ -1355,6 +1359,56 @@ def is_media_url(url: str):
def owui_headers():
return {"Authorization": f"Bearer {OWUI_KEY}"} if OWUI_KEY else {}
def _owui_metadata_template_payload():
"""Return the metadata template payload to apply when auto-fix is enabled."""
if not OWUI_METADATA_TEMPLATE_JSON:
return {}
try:
return json.loads(OWUI_METADATA_TEMPLATE_JSON)
except Exception:
# Treat value as a raw string template if parsing fails
return OWUI_METADATA_TEMPLATE_JSON
def owui_fix_metadata_template(kb_id: str, force: bool = False) -> bool:
"""Ensure the target knowledge base has a safe metadata template.
Attempts PATCH/PUT with either a user-provided template or an empty object.
Returns True if an update succeeded; False otherwise.
"""
if not OWUI_AUTO_FIX_METADATA or not OWUI_URL or not OWUI_KEY or not kb_id:
return False
if not force and kb_id in _OWUI_TEMPLATE_PATCHED:
return False
payload_variants: list[object] = []
template_payload = _owui_metadata_template_payload()
payload_variants.append({"metadata_template": template_payload})
if template_payload not in ({}, "", None):
payload_variants.append({"metadata_template": {}})
payload_variants.append({"metadata_template": None})
headers = {**owui_headers(), "Content-Type": "application/json"}
url = f"{OWUI_URL}/api/v1/knowledge/{kb_id}"
success_codes = {200, 201, 202, 204}
for payload in payload_variants:
try:
body = orjson.dumps(payload)
except Exception:
body = json.dumps(payload).encode("utf-8")
for method in ("PATCH", "PUT"):
try:
resp = requests.request(method, url, headers=headers, data=body, timeout=15)
except Exception:
continue
if resp.status_code in success_codes:
print(f"[owui] metadata template adjusted via {method} for KB {kb_id}", flush=True)
_OWUI_TEMPLATE_PATCHED.add(kb_id)
return True
return False
def owui_get_or_create_kb():
"""Return a KB id for OWUI_KB without creating duplicates.
Honors OPENWEBUI_KB_ID, and tolerates both list and {"data": ...} response shapes.
@@ -1413,6 +1467,8 @@ def owui_get_or_create_kb():
return None
def owui_upload_and_attach(path: Path, kb_id: str):
if OWUI_AUTO_FIX_METADATA:
owui_fix_metadata_template(kb_id)
with open(path, "rb") as f:
r = requests.post(f"{OWUI_URL}/api/v1/files/", headers=owui_headers(), files={"file": (path.name, f)}, timeout=60*10)
r.raise_for_status()
@@ -1420,12 +1476,28 @@ def owui_upload_and_attach(path: Path, kb_id: str):
file_id = (up.get("id") or (up.get("data") or {}).get("id"))
if not file_id:
raise RuntimeError(f"OWUI upload: could not get file id from response: {up}")
payload = {"file_id": file_id}
attach_headers = {**owui_headers(), "Content-Type": "application/json"}
body = orjson.dumps(payload)
r = requests.post(
f"{OWUI_URL}/api/v1/knowledge/{kb_id}/file/add",
headers={**owui_headers(), "Content-Type": "application/json"},
data=orjson.dumps({"file_id": file_id}),
headers=attach_headers,
data=body,
timeout=180,
)
if r.status_code == 400 and OWUI_AUTO_FIX_METADATA:
txt = ""
try:
txt = r.text.lower()
except Exception:
txt = str(r.content).lower()
if "metadata" in txt and owui_fix_metadata_template(kb_id, force=True):
r = requests.post(
f"{OWUI_URL}/api/v1/knowledge/{kb_id}/file/add",
headers=attach_headers,
data=body,
timeout=180,
)
r.raise_for_status()
try:
time.sleep(0.5)
@@ -1441,6 +1513,7 @@ def publish_to_openwebui(paths):
if not kb_id:
print("[owui] KB resolve failed; skipping attach to avoid accidental duplicates", flush=True)
return
owui_fix_metadata_template(kb_id)
for p in paths:
p = Path(p)
if not p.exists():