hendrik/config.py

137 lines
5.5 KiB
Python
Raw Normal View History

2026-05-02 21:08:42 +07:00
import os
2026-06-11 15:17:26 +07:00
from pathlib import Path
2026-05-02 21:08:42 +07:00
import yaml
2026-05-02 21:08:42 +07:00
def _yaml_get(*keys, default=None):
2026-06-16 14:59:40 +07:00
_CONFIG_PATH = Path(__file__).resolve().parent / "config.yaml"
_yaml = {}
2026-06-16 14:59:40 +07:00
if _CONFIG_PATH.is_file():
with open(_CONFIG_PATH, "r", encoding="utf-8") as file_object:
_yaml = yaml.safe_load(file_object) or {}
current = _yaml
for key in keys:
if key in current:
current = current[key]
else:
return default
return current if current is not None else default
def _as_list(value):
if isinstance(value, list):
return [str(v).strip() for v in value if str(v).strip()]
if value:
print(f"[config] Warning: '{value}' bukan YAML list, diabaikan. Gunakan format list.", flush=True)
return []
2026-07-20 11:42:46 +07:00
TUI_USER_ID = _yaml_get("user", "id", default=None)
2026-07-07 06:03:21 +07:00
ragroleplay_db_path = _yaml_get("ragroleplay", "db_path", default="./.ragroleplay" )
ragroleplay_vector_size = _yaml_get("ragroleplay", "vector_size", default=768 ) # used on table create only
2026-08-13 21:06:42 +07:00
# Model Option (moop) — penyimpanan model/provider/key pindah ke sqlite.
moop_db_path = os.path.expanduser(
_yaml_get("moop", "db_path", default="~/.config/hendrik/moop.sqlite3")
)
llm_timeout = int(_yaml_get("llm", "timeout", default=600))
2026-07-12 15:01:17 +07:00
XMPP_USERNAME = _yaml_get("xmpp", "username", default="")
XMPP_PASSWORD = _yaml_get("xmpp", "password", default="")
2026-07-12 15:01:17 +07:00
AGENT_MAX_ITERATIONS = int(_yaml_get("agent", "max_iterations", default="30"))
AGENT_MAX_TOOL_OUTPUT = int(_yaml_get("agent", "max_tool_output", default="40000"))
2026-08-17 06:44:19 +07:00
PERSONALITY_NAME = ""
PERSONALITY_CODENAME = ""
2026-07-12 14:51:58 +07:00
# ─── Character & Skills ────────────────────────────────────────────────────────
2026-07-12 14:51:58 +07:00
AGENT_CHARACTER = _yaml_get("agent", "character", default="").strip().lower()
2026-07-12 15:01:17 +07:00
AGENT_SKILLS = _yaml_get("agent", "skills", default="").strip().lower()
2026-07-12 15:01:17 +07:00
# ─── XMPP ──────────────────────────────────────────────────────────────────────
2026-07-12 15:01:17 +07:00
XMPP_ENABLED = str(_yaml_get("xmpp", "enabled", default="false")).strip().lower() in ("true", "1", "yes")
XMPP_MUC_ROOMS = _as_list(_yaml_get("xmpp", "muc_rooms", default=[]))
2026-07-12 15:01:17 +07:00
XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip()
2026-08-02 23:38:50 +07:00
XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes")
2026-07-12 15:01:17 +07:00
XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
2026-07-12 15:01:17 +07:00
# ─── Telegram ──────────────────────────────────────────────────────────────────
2026-06-16 22:44:10 +07:00
2026-07-12 15:01:17 +07:00
TELEGRAM_ENABLED = str(_yaml_get("telegram", "enabled", default="false")).strip().lower() in ("true", "1", "yes")
TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="")
TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[]))
2026-07-12 15:01:17 +07:00
TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
2026-06-16 22:44:10 +07:00
2026-06-17 16:00:26 +07:00
# ─── Session (TinyDB) ────────────────────────────────────────────────────────────
SESSION_DB_PATH = os.path.expanduser(
2026-07-12 15:01:17 +07:00
_yaml_get("session", "db_path", default="~/.config/hendrik/sessions.json")
2026-06-17 16:00:26 +07:00
)
# 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" ) )
2026-07-26 07:18:33 +07:00
# ─── Image Generation (OpenRouter) ──────────────────────────────────────────────
2026-08-13 21:06:42 +07:00
# IMAGEGEN model kini dikelola via moop (sqlite), bukan config.yaml.
2026-07-26 07:18:33 +07:00
2026-07-12 14:51:58 +07:00
# ─── Character Loader ──────────────────────────────────────────────────────────
2026-07-12 14:51:58 +07:00
CHARACTERS_DIR = Path(__file__).resolve().parent / "agent" / "characters"
2026-07-12 14:51:58 +07:00
def load_character(char_override=None):
2026-08-17 06:44:19 +07:00
"""Load character info dari info.yaml. Bisa di-call ulang untuk override."""
global AGENT_CHARACTER, PERSONALITY_NAME, PERSONALITY_CODENAME
2026-07-12 14:51:58 +07:00
if char_override:
AGENT_CHARACTER = char_override.strip().lower()
if not AGENT_CHARACTER:
return
2026-08-17 06:44:19 +07:00
info_yaml_path = CHARACTERS_DIR / AGENT_CHARACTER / "info.yaml"
if not info_yaml_path.is_file():
2026-07-12 14:51:58 +07:00
return
2026-08-17 06:44:19 +07:00
try:
data = yaml.safe_load(info_yaml_path.read_text(encoding="utf-8")) or {}
if not isinstance(data, dict):
data = {}
except Exception as _e:
print(f"[config] Warning: gagal load info.yaml untuk '{AGENT_CHARACTER}': {_e}", flush=True)
data = {}
if not data:
2026-07-12 14:51:58 +07:00
return
2026-08-17 06:44:19 +07:00
name = str(data.get("name", "")).strip()
codename = str(data.get("codename", "")).strip()
if name:
PERSONALITY_NAME = name
if codename:
PERSONALITY_CODENAME = codename
elif name:
PERSONALITY_CODENAME = name
2026-07-12 14:51:58 +07:00
# Load character dari config.yaml saat import time
load_character()