Files
podx/scripts/backfill_openwebui.py
2025-09-07 10:42:27 +02:00

53 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python3
import os, sys
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")
LIB = Path(os.getenv("LIBRARY_ROOT", "./library"))
TRN = Path(os.getenv("TRANSCRIPT_ROOT", "./transcripts"))
def headers():
return {"Authorization": f"Bearer {OWUI_KEY}"} if OWUI_KEY else {}
def get_or_create_kb():
if not OWUI_URL or not OWUI_KEY:
print("OpenWebUI not configured.")
sys.exit(1)
r = requests.get(f"{OWUI_URL}/api/v1/knowledge/list", headers=headers(), timeout=15)
r.raise_for_status()
for kb in r.json().get("data", []):
if kb.get("name") == OWUI_KB:
return kb["id"]
r = requests.post(f"{OWUI_URL}/api/v1/knowledge/create",
headers={**headers(), "Content-Type":"application/json"},
data=orjson.dumps({"name": OWUI_KB, "description": "All local content indexed by podx"}))
r.raise_for_status()
return r.json()["data"]["id"]
def upload_and_attach(path: Path, kb_id: str):
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"]
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)
r.raise_for_status()
print(f"Uploaded {path}")
def main():
kb_id = get_or_create_kb()
# transcripts
for txt in TRN.glob("*.txt"):
upload_and_attach(txt, kb_id)
# web snapshots
for txt in LIB.glob("web/**/*.txt"):
upload_and_attach(txt, kb_id)
if __name__ == "__main__":
main()