scvcoder commited on
Commit
e4a9e2f
ยท
verified ยท
1 Parent(s): f2aee39

Add /api/clear-references + ๐Ÿ”„ ์ดˆ๊ธฐํ™” button on right pane

Browse files
Files changed (1) hide show
  1. src/kpaa/server.py +31 -0
src/kpaa/server.py CHANGED
@@ -619,6 +619,22 @@ def create_app() -> FastAPI:
619
  async def api_last_refs() -> dict[str, Any]:
620
  return dict(_last_refs)
621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
622
  @app.get("/api/chat")
623
  async def api_chat(q: str = Query(..., min_length=1, max_length=2000)):
624
  """SSE: token + references + done events. EventSource ํ˜ธํ™˜."""
@@ -796,6 +812,10 @@ _SPLIT_HTML = """<!doctype html>
796
  <header class="right-header">
797
  <h1>์ฐธ๊ณ ํ•œ ์ž๋ฃŒ <span class="pulse" id="pulse"></span></h1>
798
  <span class="muted" id="refs-count"></span>
 
 
 
 
799
  </header>
800
  <div class="meta-line" id="meta">Open WebUI์—์„œ ์งˆ๋ฌธํ•˜๋ฉด LLM์ด ๋ณธ ๊ทผ๊ฑฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (1์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ ).</div>
801
  <div class="refs-list" id="refs">
@@ -911,6 +931,17 @@ async function poll() {
911
  }
912
  setInterval(poll, 1000);
913
  poll();
 
 
 
 
 
 
 
 
 
 
 
914
  </script>
915
  </body></html>"""
916
 
 
619
  async def api_last_refs() -> dict[str, Any]:
620
  return dict(_last_refs)
621
 
622
+ @app.post("/api/clear-references")
623
+ async def api_clear_refs() -> dict[str, str]:
624
+ """์šฐ์ธก ์ฐธ๊ณ ์ž๋ฃŒ ํŒจ๋„ ์ดˆ๊ธฐํ™” โ€” Open WebUI ์ƒˆ ์ฑ„ํŒ… ๋“ฑ์—์„œ ์‚ฌ์šฉ."""
625
+ _last_refs.update({
626
+ "ts": time.time(), # ๊ฐฑ์‹ ํ•ด์„œ ํด๋ง์ด ๋ณ€๊ฒฝ ๊ฐ์ง€ํ•˜๋„๋ก
627
+ "query": "",
628
+ "intents": [],
629
+ "jo_targets": [],
630
+ "elapsed_ms": 0,
631
+ "excerpts": [],
632
+ "cited_citations": [],
633
+ "llm_excerpt_citations": [],
634
+ "geungeo_indices_in_answer": [],
635
+ })
636
+ return {"status": "cleared"}
637
+
638
  @app.get("/api/chat")
639
  async def api_chat(q: str = Query(..., min_length=1, max_length=2000)):
640
  """SSE: token + references + done events. EventSource ํ˜ธํ™˜."""
 
812
  <header class="right-header">
813
  <h1>์ฐธ๊ณ ํ•œ ์ž๋ฃŒ <span class="pulse" id="pulse"></span></h1>
814
  <span class="muted" id="refs-count"></span>
815
+ <button id="clear-btn" title="์ƒˆ ๊ฒ€์ƒ‰ โ€” ์šฐ์ธก ์ฐธ๊ณ ์ž๋ฃŒ ์ดˆ๊ธฐํ™”"
816
+ style="margin-left:auto; padding:4px 10px; border-radius:6px; border:1px solid var(--border); background:var(--card-bg); color:var(--text); cursor:pointer; font-size:0.78em;">
817
+ ๐Ÿ”„ ์ดˆ๊ธฐํ™”
818
+ </button>
819
  </header>
820
  <div class="meta-line" id="meta">Open WebUI์—์„œ ์งˆ๋ฌธํ•˜๋ฉด LLM์ด ๋ณธ ๊ทผ๊ฑฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (1์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ ).</div>
821
  <div class="refs-list" id="refs">
 
931
  }
932
  setInterval(poll, 1000);
933
  poll();
934
+
935
+ // ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ โ€” ๋ฐฑ์—”๋“œ์˜ _last_refs ๋ฅผ ๋น„์šฐ๊ณ  ์šฐ์ธก ํŒจ๋„ ์ฆ‰์‹œ ๋น„์›€.
936
+ document.getElementById("clear-btn").addEventListener("click", async () => {
937
+ try {
938
+ await fetch("/api/clear-references", { method: "POST", cache: "no-store" });
939
+ } catch (_) {}
940
+ // ์ฆ‰์‹œ UI ๋น„์šฐ๊ธฐ (๋‹ค์Œ polling ์œผ๋กœ๋„ ์ƒˆ ๋นˆ ๋ฐ์ดํ„ฐ ๋„์ฐฉ)
941
+ refsEl.innerHTML = '<div class="refs-empty">์ƒˆ ๊ฒ€์ƒ‰ ๋Œ€๊ธฐ ์ค‘โ€ฆ</div>';
942
+ refsCountEl.textContent = "";
943
+ metaEl.textContent = "Open WebUI์—์„œ ์งˆ๋ฌธํ•˜๋ฉด LLM์ด ๋ณธ ๊ทผ๊ฑฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.";
944
+ });
945
  </script>
946
  </body></html>"""
947