Fixing metadata import errors
This commit is contained in:
@@ -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():
|
||||
|
Reference in New Issue
Block a user