여기서는 로컬에 업로드 된 파일을 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) : 저장
'프로그래밍 언어 > Python' 카테고리의 다른 글
[ Docker ] Docker Desktop 설치 및 Open WebUI 연결 (0) | 2025.09.04 |
---|---|
[ Python ] Open WebUI 커스터마이징 - csv 파일(3) (0) | 2025.09.03 |
[ Python ] Open WebUI 커스터마이징 - csv 파일(2) (0) | 2025.09.03 |
[ Python ] Open WebUI 커스터마이징 - csv 파일(1) (1) | 2025.09.03 |