53 lines
1.9 KiB
Python
Executable File
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()
|