From 346223d1a2f5c35f0efcee375e4b8d4a403b6d3e Mon Sep 17 00:00:00 2001 From: Dita Aji Pratama Date: Mon, 14 Sep 2026 12:49:54 +0700 Subject: [PATCH] baca-baca dikit, sambil rubah-rubah dikit --- services/llm_client.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/services/llm_client.py b/services/llm_client.py index 1da24f4..c32c60e 100644 --- a/services/llm_client.py +++ b/services/llm_client.py @@ -5,25 +5,16 @@ import urllib.request import urllib.error class _LLMFail(Exception): - """Kegagalan network dari satu kandidat chain. - - kind: - - 'auth' : 401/403 → rotasi key (coba key berikutnya di provider yang sama) - - 'unreachable' : koneksi gagal / timeout / 5xx / 429 / 404 → pindah model/provider + """ + - 'auth' : 401/403 → rotasi key (coba key berikutnya di provider yang sama) + - 'unreachable' : koneksi gagal / timeout / 5xx / 429 / 404 → pindah model/provider """ def __init__(self, kind, message): super().__init__(message) self.kind = kind self.message = message - class LLMClient: - class Message: - def __init__(self, msg): - raw_content = msg.get('content', '') # Ambil konten mentah - self.content = gadget.strip_thinking(raw_content) if isinstance(raw_content, str) else raw_content # Auto-strip dari content - self.tool_calls = msg.get('tool_calls', None) # Ambil tool calls - self.warning = None def __init__(self, base_url, model, api_key, timeout=600): self.base_url = (base_url or "").rstrip('/') @@ -32,12 +23,19 @@ class LLMClient: self.timeout = timeout self.cancel_requested = False - # Chain kandidat per tipe ('llm', 'imagevision', ...) + # Chaining kandidat set model per tipe ('llm', 'imagevision', ...) self._chains: dict[str, list[dict]] = {} self._chain: list[dict] | None = None self._chain_key: str | None = None self._chain_index = 0 + class Message: + def __init__(self, msg): + raw_content = msg.get('content', '') # Ambil konten mentah + self.content = gadget.strip_thinking(raw_content) if isinstance(raw_content, str) else raw_content # Auto-strip dari content + self.tool_calls = msg.get('tool_calls', None) # Ambil tool calls + self.warning = None + # ------------------------------------------------------------ config --- def set_chains(self, chains): @@ -108,11 +106,15 @@ class LLMClient: return "llm" def chat(self, messages, tools=None, on_stream_chunk=None, disable_reasoning=False, tool_reminder=None): - if not self._chains: + + if not self._chains: # kalau bukan chain return self._chat_once( - self.base_url, self.model, self.api_key, messages, - tools=tools, on_stream_chunk=on_stream_chunk, - disable_reasoning=disable_reasoning, tool_reminder=tool_reminder, + self.base_url, self.model, self.api_key, + messages, + tools=tools, + on_stream_chunk=on_stream_chunk, + disable_reasoning=disable_reasoning, + tool_reminder=tool_reminder, ) chain_type = self._pick_chain_type(messages)