Compare commits

..

No commits in common. "e8379c609f07100e4b3ee8a2f52963bdeba0449a" and "7c05c5c9a366b3b22814c478547a58ae9ec8f490" have entirely different histories.

108
config.py
View File

@ -9,67 +9,72 @@ load_dotenv()
def _yaml_get(*keys, default=None): def _yaml_get(*keys, default=None):
_CONFIG_PATH = Path(__file__).resolve().parent / "config.yaml" _CONFIG_PATH = Path(__file__).resolve().parent / "config.yaml"
_yaml = {} _yaml: dict = {}
if _CONFIG_PATH.is_file(): if _CONFIG_PATH.is_file():
with open(_CONFIG_PATH, "r", encoding="utf-8") as file_object: with open(_CONFIG_PATH, "r", encoding="utf-8") as f:
_yaml = yaml.safe_load(file_object) or {} _yaml = yaml.safe_load(f) or {}
current = _yaml d = _yaml
for key in keys: for k in keys:
if key in current: if isinstance(d, dict) and k in d:
current = current[key] d = d[k]
else: else:
return default return default
return current if current is not None else default return d if d is not None else default
llm_timeout = int(_yaml_get("llm", "timeout", default=600)) # Credential / Secret (only from .env)
_providers = _yaml_get("llm", "providers", default=[]) llm_baseurl = os.getenv("LLM_BASE_URL", default="")
MODELS_ITEMS = [] llm_model = os.getenv("LLM_MODEL", default="")
llm_api_key = os.getenv("LLM_API_KEY", default="")
for prov in _providers: llm_timeout = int(_yaml_get("llm", "timeout", default=600))
pname = prov.get("name", "")
base_url = prov.get("base_url", "").rstrip("/")
api_key = prov.get("api_key", "")
models = prov.get("models", [])
for m in models:
model_name = m.get("name", "")
is_default = m.get("default", False)
MODELS_ITEMS.append({
"model" : model_name,
"provider" : pname,
"base_url" : base_url,
"api_key" : api_key,
"default" : is_default,
})
XMPP_USERNAME = os.getenv("XMPP_USERNAME", default="")
XMPP_PASSWORD = os.getenv("XMPP_PASSWORD", default="")
MODELS_ITEMS: list[dict] = []
_providers = _yaml_get("llm", "providers", default=[])
if isinstance(_providers, list):
for prov in _providers:
if not isinstance(prov, dict):
continue
pname = prov.get("name", "")
base_url = prov.get("base_url", "").rstrip("/")
api_key = prov.get("api_key", "") or llm_api_key
models = prov.get("models", [])
if isinstance(models, list):
for m in models:
if not isinstance(m, dict):
continue
model_name = m.get("name", "")
is_default = m.get("default", False)
MODELS_ITEMS.append({
"model": model_name,
"provider": pname,
"base_url": base_url,
"api_key": api_key,
"default": is_default,
})
def resolve_provider(base_url: str, model: str) -> str | None: def resolve_provider(base_url: str, model: str) -> str | None:
"""Cari nama provider yg cocok dengan (base_url, model) dari MODELS_ITEMS."""
base_url = base_url.rstrip("/") base_url = base_url.rstrip("/")
for item in MODELS_ITEMS: for item in MODELS_ITEMS:
if item["base_url"] == base_url and item["model"] == model: if item["base_url"] == base_url and item["model"] == model:
return item["provider"] return item["provider"]
return None return None
_has_match = any(
# Cari model default — pertama yg marked default: true, fallback ke yg pertama item["model"] == llm_model and item["base_url"] == llm_baseurl.rstrip("/")
llm_baseurl = "" for item in MODELS_ITEMS
llm_model = "" )
llm_api_key = "" if not _has_match:
for item in MODELS_ITEMS: for item in MODELS_ITEMS:
if item.get("default"): if item.get("default"):
llm_baseurl = item["base_url" ] llm_model = item["model"]
llm_model = item["model" ] llm_baseurl = item["base_url"]
llm_api_key = item["api_key" ] llm_api_key = item["api_key"]
break break
if not llm_model and MODELS_ITEMS:
llm_baseurl = MODELS_ITEMS[0]["base_url" ]
llm_model = MODELS_ITEMS[0]["model" ]
llm_api_key = MODELS_ITEMS[0]["api_key" ]
XMPP_USERNAME = os.getenv("XMPP_USERNAME", default="")
XMPP_PASSWORD = os.getenv("XMPP_PASSWORD", default="")
AGENT_MAX_ITERATIONS = int(os.getenv("AGENT_MAX_ITERATIONS", default=_yaml_get("agent", "max_iterations", default="30"))) AGENT_MAX_ITERATIONS = int(os.getenv("AGENT_MAX_ITERATIONS", default=_yaml_get("agent", "max_iterations", default="30")))
AGENT_MAX_TOOL_OUTPUT = int(os.getenv("AGENT_MAX_TOOL_OUTPUT", default=_yaml_get("agent", "max_tool_output", default="40000"))) AGENT_MAX_TOOL_OUTPUT = int(os.getenv("AGENT_MAX_TOOL_OUTPUT", default=_yaml_get("agent", "max_tool_output", default="40000")))
@ -125,11 +130,12 @@ RAG_MODEL_PATH = os.path.expanduser(
) )
# Humanize Delay (YAML) # ─── Humanize Delay (YAML) ─────────────────────────────────────────────────────
READ_DELAY_MIN = float( _yaml_get("delay", "read_min", default="1.0" ) )
READ_DELAY_MAX = float( _yaml_get("delay", "read_max", default="2.0" ) ) READ_DELAY_MIN = float(os.getenv("READ_DELAY_MIN", default=_yaml_get("delay", "read_min", default="1.0")))
TYPING_SPEED = float( _yaml_get("delay", "typing_speed", default="15.0" ) ) READ_DELAY_MAX = float(os.getenv("READ_DELAY_MAX", default=_yaml_get("delay", "read_max", default="2.0")))
TYPING_MAX = float( _yaml_get("delay", "typing_max", default="10.0" ) ) TYPING_SPEED = float(os.getenv("TYPING_SPEED", default=_yaml_get("delay", "typing_speed", default="15.0")))
TYPING_MAX = float(os.getenv("TYPING_MAX", default=_yaml_get("delay", "typing_max", default="10.0")))
# ─── Character Preset Override ────────────────────────────────────────────────── # ─── Character Preset Override ──────────────────────────────────────────────────