Compare commits

..

2 Commits

108
config.py
View File

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