Merge branch 'master' into product/public

This commit is contained in:
Dita Aji Pratama 2026-09-28 20:29:30 +07:00
commit a3e22f4bb1
6 changed files with 30 additions and 14 deletions

View File

@ -11,6 +11,7 @@ xmpp:
nickname: "" # custom MUC nickname (empty = use username) nickname: "" # custom MUC nickname (empty = use username)
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll) debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll)
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)
telegram: telegram:
enabled: false enabled: false
@ -19,3 +20,4 @@ telegram:
# - "123456789" # - "123456789"
# - "987654321" # - "987654321"
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)

View File

@ -11,6 +11,7 @@ xmpp:
nickname: "" # custom MUC nickname (empty = use username) nickname: "" # custom MUC nickname (empty = use username)
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll) debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll)
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)
telegram: telegram:
enabled: false enabled: false
@ -19,3 +20,4 @@ telegram:
# - "123456789" # - "123456789"
# - "987654321" # - "987654321"
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)

View File

@ -38,6 +38,7 @@ xmpp:
nickname: "" # custom MUC nickname (empty = use username) nickname: "" # custom MUC nickname (empty = use username)
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll) debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll)
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)
telegram: telegram:
enabled: false enabled: false
@ -46,3 +47,4 @@ telegram:
# - "123456789" # - "123456789"
# - "987654321" # - "987654321"
selective_response: true # true = only response if mentioned/relevant selective_response: true # true = only response if mentioned/relevant
mute_session_end: false # true = tidak kirim pesan saat sesi berakhir (timeout)

View File

@ -63,6 +63,7 @@ XMPP_MUC_ROOMS = _as_list(_yaml_get("xmpp", "muc_rooms", default=[]))
XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip() XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip()
XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes") XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes")
XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
XMPP_MUTE_SESSION_END = str(_yaml_get("xmpp", "mute_session_end", default="false")).strip().lower() in ("true", "1", "yes")
# ─── Telegram ────────────────────────────────────────────────────────────────── # ─── Telegram ──────────────────────────────────────────────────────────────────
@ -71,6 +72,7 @@ TELEGRAM_ENABLED = str(_yaml_get("telegram", "enabled", default="false")).strip(
TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="") TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="")
TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[])) TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[]))
TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
TELEGRAM_MUTE_SESSION_END = str(_yaml_get("telegram", "mute_session_end", default="false")).strip().lower() in ("true", "1", "yes")
# ─── Session (TinyDB) ──────────────────────────────────────────────────────────── # ─── Session (TinyDB) ────────────────────────────────────────────────────────────
@ -155,9 +157,9 @@ SERVICE_YAML_PATH = None # Path service.yaml milik karakter aktif, jika ada
def _reset_service_from_config(): def _reset_service_from_config():
"""Reset konfigurasi service (xmpp/telegram) dari config.yaml global.""" """Reset konfigurasi service (xmpp/telegram) dari config.yaml global."""
global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS
global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE, XMPP_MUTE_SESSION_END
global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS
global TELEGRAM_SELECTIVE_RESPONSE, SERVICE_YAML_PATH global TELEGRAM_SELECTIVE_RESPONSE, TELEGRAM_MUTE_SESSION_END, SERVICE_YAML_PATH
XMPP_USERNAME = _yaml_get("xmpp", "username", default="") XMPP_USERNAME = _yaml_get("xmpp", "username", default="")
XMPP_PASSWORD = _yaml_get("xmpp", "password", default="") XMPP_PASSWORD = _yaml_get("xmpp", "password", default="")
@ -166,11 +168,13 @@ def _reset_service_from_config():
XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip() XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip()
XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes") XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes")
XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
XMPP_MUTE_SESSION_END = str(_yaml_get("xmpp", "mute_session_end", default="false")).strip().lower() in ("true", "1", "yes")
TELEGRAM_ENABLED = str(_yaml_get("telegram", "enabled", default="false")).strip().lower() in ("true", "1", "yes") TELEGRAM_ENABLED = str(_yaml_get("telegram", "enabled", default="false")).strip().lower() in ("true", "1", "yes")
TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="") TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="")
TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[])) TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[]))
TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes")
TELEGRAM_MUTE_SESSION_END = str(_yaml_get("telegram", "mute_session_end", default="false")).strip().lower() in ("true", "1", "yes")
SERVICE_YAML_PATH = None SERVICE_YAML_PATH = None
@ -180,9 +184,9 @@ def load_service_config(char_override=None):
karakter aktif, jika file tersebut ada di agent/characters/<char>/. karakter aktif, jika file tersebut ada di agent/characters/<char>/.
Memanggil load_character() bila char_override diberikan.""" Memanggil load_character() bila char_override diberikan."""
global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS
global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE, XMPP_MUTE_SESSION_END
global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS
global TELEGRAM_SELECTIVE_RESPONSE, SERVICE_YAML_PATH global TELEGRAM_SELECTIVE_RESPONSE, TELEGRAM_MUTE_SESSION_END, SERVICE_YAML_PATH
_reset_service_from_config() _reset_service_from_config()
@ -225,6 +229,8 @@ def load_service_config(char_override=None):
XMPP_DEBUG = str(xmpp_data["debug"]).strip().lower() in ("true", "1", "yes") XMPP_DEBUG = str(xmpp_data["debug"]).strip().lower() in ("true", "1", "yes")
if "selective_response" in xmpp_data: if "selective_response" in xmpp_data:
XMPP_SELECTIVE_RESPONSE = str(xmpp_data["selective_response"]).strip().lower() in ("true", "1", "yes") XMPP_SELECTIVE_RESPONSE = str(xmpp_data["selective_response"]).strip().lower() in ("true", "1", "yes")
if "mute_session_end" in xmpp_data:
XMPP_MUTE_SESSION_END = str(xmpp_data["mute_session_end"]).strip().lower() in ("true", "1", "yes")
telegram_data = data.get("telegram") or {} telegram_data = data.get("telegram") or {}
if "enabled" in telegram_data: if "enabled" in telegram_data:
@ -235,6 +241,8 @@ def load_service_config(char_override=None):
TELEGRAM_ALLOWED_GROUP_IDS = _as_list(telegram_data["allowed_group_ids"]) TELEGRAM_ALLOWED_GROUP_IDS = _as_list(telegram_data["allowed_group_ids"])
if "selective_response" in telegram_data: if "selective_response" in telegram_data:
TELEGRAM_SELECTIVE_RESPONSE = str(telegram_data["selective_response"]).strip().lower() in ("true", "1", "yes") TELEGRAM_SELECTIVE_RESPONSE = str(telegram_data["selective_response"]).strip().lower() in ("true", "1", "yes")
if "mute_session_end" in telegram_data:
TELEGRAM_MUTE_SESSION_END = str(telegram_data["mute_session_end"]).strip().lower() in ("true", "1", "yes")
# ─── Model Config (model.yaml per karakter) ──────────────────────────────────── # ─── Model Config (model.yaml per karakter) ────────────────────────────────────

View File

@ -332,7 +332,7 @@ class TelegramClient:
loggorilla.prcss('telegram', f'Natural close triggered for {chat_id}') loggorilla.prcss('telegram', f'Natural close triggered for {chat_id}')
self._session_mgr.reset(str(chat_id)) self._session_mgr.reset(str(chat_id))
else: else:
timeout = 86400 if chat_type == 'private' else 300 timeout = 86400 if chat_type == 'private' else 1800
session.start_timer(timeout, self._timeout_session, chat_id) session.start_timer(timeout, self._timeout_session, chat_id)
def _schedule_send(self, chat_id, text, reply_to_msg_id=None): def _schedule_send(self, chat_id, text, reply_to_msg_id=None):
@ -355,6 +355,7 @@ class TelegramClient:
def _timeout_session(self, chat_id): def _timeout_session(self, chat_id):
loggorilla.fyinf('telegram', f'Session timeout: {chat_id}') loggorilla.fyinf('telegram', f'Session timeout: {chat_id}')
if not config.TELEGRAM_MUTE_SESSION_END:
body = '*session end*' if 'roleplayer' in self._skill else 'Sesi ditutup. Sampai jumpa' body = '*session end*' if 'roleplayer' in self._skill else 'Sesi ditutup. Sampai jumpa'
self._schedule_send(chat_id, body) self._schedule_send(chat_id, body)
self._session_mgr.reset(str(chat_id)) self._session_mgr.reset(str(chat_id))

View File

@ -652,7 +652,7 @@ class XMPPClient(ClientXMPP):
print(f'[{_ts()}] Natural close triggered for {jid}', flush=True) print(f'[{_ts()}] Natural close triggered for {jid}', flush=True)
self._session_mgr.reset(jid) self._session_mgr.reset(jid)
else: else:
# DM: timeout 24 jam (efektif tidak auto-close), MUC tetap 5 menit # DM: timeout 24 jam (efektif tidak auto-close), MUC 30 menit
session.start_timer(86400, self._timeout_session, jid, 'chat') session.start_timer(86400, self._timeout_session, jid, 'chat')
async def _process_muc_async(self, room, nick, body): async def _process_muc_async(self, room, nick, body):
@ -692,7 +692,7 @@ class XMPPClient(ClientXMPP):
) )
if not gate_ok: if not gate_ok:
print(f'[{_ts()}] MUC: need_response=False → staying silent', flush=True) print(f'[{_ts()}] MUC: need_response=False → staying silent', flush=True)
session.start_timer(300, self._timeout_session, room, 'groupchat') session.start_timer(1800, self._timeout_session, room, 'groupchat')
return return
# Delay 1: simulasi membaca pesan user (hanya saat akan merespon) # Delay 1: simulasi membaca pesan user (hanya saat akan merespon)
@ -772,7 +772,7 @@ class XMPPClient(ClientXMPP):
self._session_mgr.reset(room) self._session_mgr.reset(room)
return return
session.start_timer(300, self._timeout_session, room, 'groupchat') session.start_timer(1800, self._timeout_session, room, 'groupchat')
def _execute_tool(self, tool_call): def _execute_tool(self, tool_call):
from lib.agent_loop import execute_tool from lib.agent_loop import execute_tool
@ -879,6 +879,7 @@ class XMPPClient(ClientXMPP):
def _timeout_session(self, session_id, mtype): def _timeout_session(self, session_id, mtype):
print(f'[{_ts()}] Session timeout: {session_id}', flush=True) print(f'[{_ts()}] Session timeout: {session_id}', flush=True)
if not config.XMPP_MUTE_SESSION_END:
body = '*session end*' if 'roleplayer' in self._skill else 'Sesi ditutup. Sampai jumpa' body = '*session end*' if 'roleplayer' in self._skill else 'Sesi ditutup. Sampai jumpa'
self._schedule_send(session_id, body, mtype) self._schedule_send(session_id, body, mtype)
self._session_mgr.reset(session_id) self._session_mgr.reset(session_id)