ui: drop model selector from split-view references panel (redundant w/ Open WebUI dropdown)
Browse files- src/kpaa/server.py +1 -58
src/kpaa/server.py
CHANGED
|
@@ -934,15 +934,11 @@ _SPLIT_HTML = """<!doctype html>
|
|
| 934 |
<header class="right-header">
|
| 935 |
<h1>참고한 자료 <span class="pulse" id="pulse"></span></h1>
|
| 936 |
<span class="muted" id="refs-count"></span>
|
| 937 |
-
<select id="model-select" title="답변 LLM 모델 — 변경 시 다음 질문부터 적용"
|
| 938 |
-
style="margin-left:auto; padding:4px 8px; border-radius:6px; border:1px solid var(--border); background:var(--card-bg); color:var(--text); font-size:0.78em; max-width: 220px;">
|
| 939 |
-
</select>
|
| 940 |
<button id="clear-btn" title="새 검색 — 우측 참고자료 초기화"
|
| 941 |
-
style="padding:4px 10px; border-radius:6px; border:1px solid var(--border); background:var(--card-bg); color:var(--text); cursor:pointer; font-size:0.78em;">
|
| 942 |
🔄 초기화
|
| 943 |
</button>
|
| 944 |
</header>
|
| 945 |
-
<div id="model-status" class="meta-line" style="display:none;"></div>
|
| 946 |
<div class="meta-line" id="meta">Open WebUI에서 질문하면 LLM이 본 근거가 여기에 표시됩니다 (1초마다 갱신).</div>
|
| 947 |
<div class="refs-list" id="refs">
|
| 948 |
<div class="refs-empty">아직 답변이 없습니다.</div>
|
|
@@ -1072,59 +1068,6 @@ async function clearRefsUI() {
|
|
| 1072 |
// 초기화 버튼 — 백엔드의 _last_refs 를 비우고 우측 패널 즉시 비움.
|
| 1073 |
document.getElementById("clear-btn").addEventListener("click", clearRefsUI);
|
| 1074 |
|
| 1075 |
-
// ─ 모델 선택 dropdown ─
|
| 1076 |
-
const modelSelect = document.getElementById("model-select");
|
| 1077 |
-
const modelStatus = document.getElementById("model-status");
|
| 1078 |
-
|
| 1079 |
-
function showModelStatus(msg, ok) {
|
| 1080 |
-
modelStatus.textContent = msg;
|
| 1081 |
-
modelStatus.style.display = "block";
|
| 1082 |
-
modelStatus.style.color = ok ? "var(--pulse)" : "#c0392b";
|
| 1083 |
-
setTimeout(() => { modelStatus.style.display = "none"; }, 4000);
|
| 1084 |
-
}
|
| 1085 |
-
|
| 1086 |
-
async function loadModels() {
|
| 1087 |
-
try {
|
| 1088 |
-
const r = await fetch("/api/models", { cache: "no-store" });
|
| 1089 |
-
if (!r.ok) return;
|
| 1090 |
-
const data = await r.json();
|
| 1091 |
-
modelSelect.innerHTML = "";
|
| 1092 |
-
for (const p of data.presets || []) {
|
| 1093 |
-
const opt = document.createElement("option");
|
| 1094 |
-
opt.value = p.id;
|
| 1095 |
-
opt.textContent = p.label;
|
| 1096 |
-
opt.title = p.short;
|
| 1097 |
-
if (p.id === data.current) opt.selected = true;
|
| 1098 |
-
modelSelect.appendChild(opt);
|
| 1099 |
-
}
|
| 1100 |
-
} catch (_) {}
|
| 1101 |
-
}
|
| 1102 |
-
|
| 1103 |
-
modelSelect.addEventListener("change", async () => {
|
| 1104 |
-
const preset_id = modelSelect.value;
|
| 1105 |
-
modelSelect.disabled = true;
|
| 1106 |
-
try {
|
| 1107 |
-
const r = await fetch("/api/select-model", {
|
| 1108 |
-
method: "POST",
|
| 1109 |
-
headers: { "Content-Type": "application/json" },
|
| 1110 |
-
body: JSON.stringify({ preset_id }),
|
| 1111 |
-
});
|
| 1112 |
-
if (!r.ok) {
|
| 1113 |
-
const txt = await r.text();
|
| 1114 |
-
showModelStatus(`모델 변경 실패: ${txt}`, false);
|
| 1115 |
-
return;
|
| 1116 |
-
}
|
| 1117 |
-
const data = await r.json();
|
| 1118 |
-
showModelStatus(`✅ 모델 변경됨 — ${data.label} (다음 질문부터 적용 · 첫 사용 시 다운로드)`, true);
|
| 1119 |
-
} catch (e) {
|
| 1120 |
-
showModelStatus(`네트워크 오류: ${e}`, false);
|
| 1121 |
-
} finally {
|
| 1122 |
-
modelSelect.disabled = false;
|
| 1123 |
-
}
|
| 1124 |
-
});
|
| 1125 |
-
|
| 1126 |
-
loadModels();
|
| 1127 |
-
|
| 1128 |
// Open WebUI iframe 의 route 변경 자동 감지.
|
| 1129 |
window.addEventListener("message", (e) => {
|
| 1130 |
console.log("[kpaa-parent] message:", e.origin, e.data);
|
|
|
|
| 934 |
<header class="right-header">
|
| 935 |
<h1>참고한 자료 <span class="pulse" id="pulse"></span></h1>
|
| 936 |
<span class="muted" id="refs-count"></span>
|
|
|
|
|
|
|
|
|
|
| 937 |
<button id="clear-btn" title="새 검색 — 우측 참고자료 초기화"
|
| 938 |
+
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;">
|
| 939 |
🔄 초기화
|
| 940 |
</button>
|
| 941 |
</header>
|
|
|
|
| 942 |
<div class="meta-line" id="meta">Open WebUI에서 질문하면 LLM이 본 근거가 여기에 표시됩니다 (1초마다 갱신).</div>
|
| 943 |
<div class="refs-list" id="refs">
|
| 944 |
<div class="refs-empty">아직 답변이 없습니다.</div>
|
|
|
|
| 1068 |
// 초기화 버튼 — 백엔드의 _last_refs 를 비우고 우측 패널 즉시 비움.
|
| 1069 |
document.getElementById("clear-btn").addEventListener("click", clearRefsUI);
|
| 1070 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1071 |
// Open WebUI iframe 의 route 변경 자동 감지.
|
| 1072 |
window.addEventListener("message", (e) => {
|
| 1073 |
console.log("[kpaa-parent] message:", e.origin, e.data);
|