Improve Model Option
This commit is contained in:
parent
6703468dd8
commit
d663d2dbd8
@ -76,8 +76,7 @@ class HendrikTUI:
|
|||||||
except Exception:
|
except Exception:
|
||||||
return "-"
|
return "-"
|
||||||
|
|
||||||
def switch_model_set(self, set_id):
|
def switch_model_set(self, set_id, type_name="llm"):
|
||||||
default_chain = moop.default_chain(None, "llm")
|
|
||||||
target = moop.get_set(None, set_id)
|
target = moop.get_set(None, set_id)
|
||||||
if not target:
|
if not target:
|
||||||
return
|
return
|
||||||
@ -85,17 +84,22 @@ class HendrikTUI:
|
|||||||
if not chain:
|
if not chain:
|
||||||
log(self, "error", "Model set tidak memiliki model yang aktif.")
|
log(self, "error", "Model set tidak memiliki model yang aktif.")
|
||||||
return
|
return
|
||||||
if not default_chain:
|
|
||||||
moop.set_default(None, "llm", set_id)
|
moop.set_default(None, type_name, set_id)
|
||||||
self.llm.set_chains({"llm": chain})
|
|
||||||
self.model_set_name = target.get("name") or self._lookup_model_set_name()
|
if type_name in ("llm", "imagevision"):
|
||||||
|
self.llm.set_type_chain(type_name, chain)
|
||||||
if self.current_session:
|
if self.current_session:
|
||||||
self.session_mgr.update_model_info(
|
self.session_mgr.update_model_info(
|
||||||
self.current_session.doc_id, self._model_info()
|
self.current_session.doc_id, self._model_info()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if type_name == "llm":
|
||||||
|
self.model_set_name = target.get("name") or self._lookup_model_set_name()
|
||||||
|
|
||||||
candidate = chain[0]
|
candidate = chain[0]
|
||||||
log(self, "system",
|
log(self, "system",
|
||||||
f"Model \u2192 {candidate['provider']} / {candidate['model']}")
|
f"[{type_name}] Model \u2192 {candidate['provider']} / {candidate['model']}")
|
||||||
|
|
||||||
def _model_info(self) -> dict:
|
def _model_info(self) -> dict:
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -243,46 +243,92 @@ def _first_model_desc(set_id):
|
|||||||
|
|
||||||
# ---------------------------------------------------------- select model ---
|
# ---------------------------------------------------------- select model ---
|
||||||
|
|
||||||
def model_selector_popup(app, stdscr):
|
_TYPE_LABELS = {
|
||||||
|
"llm": "LLM",
|
||||||
|
"embedding": "Embedding",
|
||||||
|
"imagegen": "Image Generation",
|
||||||
|
"imagevision": "Image Vision",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _type_active_desc(type_name):
|
||||||
|
"""Deskripsi 'set [model]' yang sedang aktif untuk satu tipe."""
|
||||||
|
default_id = moop.get_default_set_id(None, type_name)
|
||||||
|
if not default_id:
|
||||||
|
return None
|
||||||
|
s = moop.get_set(None, default_id)
|
||||||
|
if not s:
|
||||||
|
return None
|
||||||
|
desc = s["name"] or "-"
|
||||||
|
model = _first_model_desc(default_id)
|
||||||
|
if model:
|
||||||
|
desc += f" [{model}]"
|
||||||
|
return desc
|
||||||
|
|
||||||
|
|
||||||
|
def _pick_set_for_type(app, stdscr, type_name):
|
||||||
|
"""Pilih model set yang menjadi default untuk satu tipe."""
|
||||||
|
label = _TYPE_LABELS.get(type_name, type_name)
|
||||||
while True:
|
while True:
|
||||||
sets = moop.list_sets(None)
|
sets = moop.list_sets(None)
|
||||||
ids = []
|
ids = []
|
||||||
items = []
|
items = []
|
||||||
flags = []
|
flags = []
|
||||||
current = 0
|
current = 0
|
||||||
default_id = moop.get_default_set_id(None, "llm")
|
default_id = moop.get_default_set_id(None, type_name)
|
||||||
|
|
||||||
for s in sets:
|
for s in sets:
|
||||||
if "llm" not in s["types"]:
|
if type_name not in s["types"]:
|
||||||
continue
|
continue
|
||||||
ids.append(s["id"])
|
ids.append(s["id"])
|
||||||
label = s["name"]
|
row = s["name"]
|
||||||
if s["id"] == default_id:
|
if s["id"] == default_id:
|
||||||
label += " [default]"
|
row += " [default]"
|
||||||
first = _first_model_desc(s["id"])
|
first = _first_model_desc(s["id"])
|
||||||
if first:
|
if first:
|
||||||
label += f" ({first})"
|
row += f" ({first})"
|
||||||
items.append(label)
|
items.append(row)
|
||||||
flags.append(s["id"] == default_id)
|
flags.append(s["id"] == default_id)
|
||||||
if s["id"] == default_id:
|
if s["id"] == default_id:
|
||||||
current = len(items) - 1
|
current = len(items) - 1
|
||||||
|
|
||||||
if not items:
|
if not items:
|
||||||
log(app, "error", "Tidak ada model set tipe 'llm'. Atur via Model > Manage Sets.")
|
if _confirm(app, stdscr,
|
||||||
|
f"Belum ada model set tipe '{label}'. Buka Model > Manage Sets?"):
|
||||||
|
sets_manage_popup(app, stdscr)
|
||||||
return
|
return
|
||||||
|
|
||||||
idx, key = _run_list_popup(
|
idx, key = _run_list_popup(
|
||||||
app, stdscr, "Pilih Model Set (LLM)", items,
|
app, stdscr, f"Pilih Model Set ({label})", items,
|
||||||
footer=" \u2191\u2193 nav \u21b5 select esc close ",
|
footer=" \u2191\u2193 nav \u21b5 select esc back ",
|
||||||
current_idx=current, active_flags=flags,
|
current_idx=current, active_flags=flags,
|
||||||
)
|
)
|
||||||
if key == 27:
|
if key == 27:
|
||||||
return
|
return
|
||||||
elif key in (10, 13, curses.KEY_ENTER):
|
elif key in (10, 13, curses.KEY_ENTER):
|
||||||
app.switch_model_set(ids[idx])
|
app.switch_model_set(ids[idx], type_name)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def model_selector_popup(app, stdscr):
|
||||||
|
while True:
|
||||||
|
items = []
|
||||||
|
types = []
|
||||||
|
for t in MODEL_TYPES:
|
||||||
|
types.append(t)
|
||||||
|
active = _type_active_desc(t)
|
||||||
|
items.append(f"{_TYPE_LABELS.get(t, t)} \u2192 {active or '-'}")
|
||||||
|
|
||||||
|
idx, key = _run_list_popup(
|
||||||
|
app, stdscr, "Pilih Tipe Model Set", items,
|
||||||
|
footer=" \u2191\u2193 nav \u21b5 pilih esc close ",
|
||||||
|
)
|
||||||
|
if key == 27:
|
||||||
|
return
|
||||||
|
elif key in (10, 13, curses.KEY_ENTER):
|
||||||
|
_pick_set_for_type(app, stdscr, types[idx])
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------ manage sets ---
|
# ------------------------------------------------------------ manage sets ---
|
||||||
|
|
||||||
def sets_manage_popup(app, stdscr):
|
def sets_manage_popup(app, stdscr):
|
||||||
|
|||||||
@ -58,6 +58,28 @@ class LLMClient:
|
|||||||
self.model = ""
|
self.model = ""
|
||||||
self.api_key = ""
|
self.api_key = ""
|
||||||
|
|
||||||
|
def set_type_chain(self, type_name, chain):
|
||||||
|
"""Perbarui satu tipe chain tanpa menimpa tipe lain.
|
||||||
|
|
||||||
|
Setelah update, kandidat pertama chain 'llm' kembali diterapkan
|
||||||
|
ke base_url/model/api_key aktif (jika ada)."""
|
||||||
|
chains = dict(self._chains or {})
|
||||||
|
chains[type_name] = chain or []
|
||||||
|
self._chains = chains
|
||||||
|
self._chain = None
|
||||||
|
self._chain_key = None
|
||||||
|
self._chain_index = 0
|
||||||
|
llm = self._chains.get("llm") or []
|
||||||
|
vision = self._chains.get("imagevision") or []
|
||||||
|
if llm:
|
||||||
|
self._apply_candidate(llm[0])
|
||||||
|
elif vision:
|
||||||
|
self._apply_candidate(vision[0])
|
||||||
|
else:
|
||||||
|
self.base_url = ""
|
||||||
|
self.model = ""
|
||||||
|
self.api_key = ""
|
||||||
|
|
||||||
def has_chain(self, type_name="llm"):
|
def has_chain(self, type_name="llm"):
|
||||||
return bool(self._chains.get(type_name))
|
return bool(self._chains.get(type_name))
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user