Fixing metadata import errors
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
#!/usr/bin/env python3
|
||||
import os, sys
|
||||
import os, sys, json
|
||||
from pathlib import Path
|
||||
import requests, orjson
|
||||
|
||||
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()
|
||||
|
||||
_TEMPLATE_PATCHED = False
|
||||
|
||||
LIB = Path(os.getenv("LIBRARY_ROOT", "./library"))
|
||||
TRN = Path(os.getenv("TRANSCRIPT_ROOT", "./transcripts"))
|
||||
@@ -28,19 +32,76 @@ def get_or_create_kb():
|
||||
r.raise_for_status()
|
||||
return r.json()["data"]["id"]
|
||||
|
||||
|
||||
def metadata_template_payload():
|
||||
if not OWUI_METADATA_TEMPLATE_JSON:
|
||||
return {}
|
||||
try:
|
||||
return json.loads(OWUI_METADATA_TEMPLATE_JSON)
|
||||
except Exception:
|
||||
return OWUI_METADATA_TEMPLATE_JSON
|
||||
|
||||
|
||||
def ensure_metadata_template(kb_id: str, force: bool = False) -> bool:
|
||||
global _TEMPLATE_PATCHED
|
||||
if not OWUI_AUTO_FIX_METADATA or not kb_id:
|
||||
return False
|
||||
if not force and _TEMPLATE_PATCHED:
|
||||
return False
|
||||
|
||||
payload_variants = []
|
||||
template_payload = 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})
|
||||
|
||||
hdrs = {**headers(), "Content-Type": "application/json"}
|
||||
url = f"{OWUI_URL}/api/v1/knowledge/{kb_id}"
|
||||
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=hdrs, data=body, timeout=10)
|
||||
except Exception:
|
||||
continue
|
||||
if resp.status_code in (200, 201, 202, 204):
|
||||
_TEMPLATE_PATCHED = True
|
||||
print(f"Applied metadata template via {method} for KB {kb_id}")
|
||||
return True
|
||||
return False
|
||||
|
||||
def upload_and_attach(path: Path, kb_id: str):
|
||||
ensure_metadata_template(kb_id)
|
||||
with open(path, "rb") as f:
|
||||
r = requests.post(f"{OWUI_URL}/api/v1/files/", headers=headers(), files={"file": (path.name, f)}, timeout=60*10)
|
||||
r.raise_for_status()
|
||||
file_id = r.json()["data"]["id"]
|
||||
payload = {"file_id": file_id}
|
||||
body = orjson.dumps(payload)
|
||||
hdrs = {**headers(), "Content-Type": "application/json"}
|
||||
r = requests.post(f"{OWUI_URL}/api/v1/knowledge/{kb_id}/file/add",
|
||||
headers={**headers(), "Content-Type":"application/json"},
|
||||
data=orjson.dumps({"file_id": file_id}), timeout=60)
|
||||
headers=hdrs,
|
||||
data=body, timeout=60)
|
||||
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 ensure_metadata_template(kb_id, force=True):
|
||||
r = requests.post(f"{OWUI_URL}/api/v1/knowledge/{kb_id}/file/add",
|
||||
headers=hdrs,
|
||||
data=body, timeout=60)
|
||||
r.raise_for_status()
|
||||
print(f"Uploaded {path}")
|
||||
|
||||
def main():
|
||||
kb_id = get_or_create_kb()
|
||||
ensure_metadata_template(kb_id)
|
||||
# transcripts
|
||||
for txt in TRN.glob("*.txt"):
|
||||
upload_and_attach(txt, kb_id)
|
||||
|
Reference in New Issue
Block a user