본문 바로가기

안녕하세요!

프로그래밍 언어/Python

[ Python ] Open WebUI 커스터마이징 - file upload(2)

여기서는 로컬에 업로드 된 파일을 Open WebUI의 특정 지식기반 id로 연결하는 작업을 서버에 요청한다.

 

add_to_kb


 

def add_to_kb(file_id: str):
    return requests.post(
        f"{WEBUI}/api/v1/knowledge/{KB_ID}/file/add",
        headers=HDR_JSON,
        json={"file_id": file_id},
        timeout=30,
    )

POST /api/v1/knowledge/{KB_ID}/file/add
  - WebUI에 있는 지식기반에 접속하면 url 끝에 id 값이 붙어있음
  - {KB_ID} 값은 .env에 설정돼 있으며 해당 값을 호출해 적용

 

HDR_JSON : json 형태로 body를 호출

json={"file_id": file_id} : 업로드한 파일은 서버에서 id 생성해 제공하고 이를 원하는 지식기반에 파일을 동기화

 

_load_map


 

def _load_map():
    try:
        with open(MAP_PATH, "r", encoding="utf-8") as f:
            return json.load(f)
    except Exception:
        return {}

 

open(MAP_PATH, "r", encoding="utf-8")
  - 경로 MAP_PATH(=backend/data/filemap.json)를 읽기 모드로 엶
  - encoding="utf-8"이라 한글 키/값도 안전하게 읽힘.


json.load(f)
  - 파일 내용을 JSON으로 파싱해서 파이썬 dict로 반환

 

_save_map


 

def _save_map(m):
    tmp = MAP_PATH + ".tmp"
    with open(tmp, "w", encoding="utf-8") as f:
        json.dump(m, f, ensure_ascii=False, indent=2)
    os.replace(tmp, MAP_PATH)

 

tmp = MAP_PATH + ".tmp" : 최종 파일 옆에 임시 파일 경로를 잡음

with open(tmp, "w", encoding="utf-8") as f
  - 임시 파일을 쓰기 모드로 엶
  - 아직 진짜 파일(filemap.json)은 손대지 않음

json.dump(m, f, ensure_ascii=False, indent=2)
  - dict m을 JSON으로 씀
  - ensure_ascii=False : 한글을 \uAC00 같은 이스케이프가 아니라 그대로 저장
  - ident=2 : 들여쓰기

os.replace(tmp, MAP_PATH)
  - 임시 파일을 한 번에 최종 파일로 교체
  - 같은 폴더 안에서 원자적으로 발생, 즉 다른 프로세스가 보는 입장에서 구 버전 혹은 새 버전 둘 중 하나로 보게 됨

 

map_put


 

def map_put(local_path, file_id, kb_id):
    m = _load_map()
    key = os.path.abspath(local_path)
    m[key] = {"file_id": file_id, "kb_id": kb_id}
    _save_map(m)

 

이 함수는 on_created에서 업로드 성공 후, file_id를 받자마자 저장할 때 사용

key = os.path.abspath(local_path)
: 항상 절대 경로화 하여 키를 통일

m[key] : 기존 맵 m = _load_map()을 file_id와 kb_id로 덮어쓰기

 _save_map(m) : 파일 전체를 원자적으로 갱신

 

map_get_by_local


 

def map_get_by_local(local_path):
    m = _load_map()
    return m.get(os.path.abspath(local_path))

 

이 함수는 on_deleted에서 로컬 파일이 지워졌을 때, 서버에 지울 file_id를 찾을 때 사용

m.get(os.path.abspath(local_path))
  - 절대 경로로 키를 통일해서 한 번에 가져오기
  - 없으면 None

 

map_del_by_local


 

def map_del_by_local(local_path):
    m = _load_map()
    key = os.path.abspath(local_path)
    if key in m:
        del m[key]
        _save_map(m)

 

이 함수는 서버에서 로컬로의 동기화 루프에서 서버에 해당 파일이 없을 시, 로컬에 있는 파일을 정리할 때 사용

del m[key] : 매핑하고 있던 절대 경로 항목을 삭제

_save_map(m) :  저장

 


loading