106 lines
5.5 KiB
Python
106 lines
5.5 KiB
Python
import os
|
|
from dotenv import load_dotenv
|
|
from pathlib import Path
|
|
|
|
load_dotenv()
|
|
|
|
llm_baseurl = os.getenv("LLM_BASE_URL", default="http://localhost:11434/v1" )
|
|
llm_model = os.getenv("LLM_MODEL", default="granite4.1:8b" )
|
|
llm_api_key = os.getenv("LLM_API_KEY", default="ollama" )
|
|
llm_timeout = int( os.getenv("LLM_TIMEOUT", default="600" ) )
|
|
|
|
AGENT_MAX_ITERATIONS = int( os.getenv("AGENT_MAX_ITERATIONS", default="30" ) )
|
|
|
|
AGENT_MAX_TOOL_OUTPUT = int( os.getenv("AGENT_MAX_TOOL_OUTPUT", default="40000" ) )
|
|
|
|
RAG_PERSIST_DIR = os.getenv("RAG_PERSIST_DIR", default="chroma_db" ) # Embedding: ChromaDB ONNX default (all-MiniLM-L6-v2, lokal, tidak perlu API call)
|
|
|
|
XMPP_ENABLED = os.getenv("XMPP_ENABLED", default="False" ).strip().lower() in ("true", "1", "yes")
|
|
XMPP_USERNAME = os.getenv("XMPP_USERNAME", default="" )
|
|
XMPP_PASSWORD = os.getenv("XMPP_PASSWORD", default="" )
|
|
XMPP_MUC_ROOMS = os.getenv("XMPP_MUC_ROOMS", default="" )
|
|
XMPP_NICKNAME = os.getenv("XMPP_NICKNAME", default="" ) # custom nick MUC (empty = use username)
|
|
|
|
# ─── Persona / Mode Configuration ────────────────────────────────────────────
|
|
# Pilihan mode AI:
|
|
# "programmer" → AI Agent untuk koding (default), tool-focused
|
|
# "roleplayer" → Teman ngobrol / chat companion, conversational
|
|
PERSONA_MODE = os.getenv("PERSONA_MODE", default="programmer").strip().lower()
|
|
|
|
# Personality — nama panggilan AI (default: "OWL")
|
|
PERSONA_NAME = os.getenv("PERSONA_NAME", default="OWL").strip() or "OWL"
|
|
|
|
# Persona age (optional)
|
|
PERSONA_AGE = os.getenv("PERSONA_AGE", default="").strip()
|
|
|
|
# Persona gender (optional)
|
|
PERSONA_GENDER = os.getenv("PERSONA_GENDER", default="").strip()
|
|
|
|
# Gaya bicara: "casual" | "formal" | "playful" | "warm"
|
|
PERSONA_TONE = os.getenv("PERSONA_TONE", default="casual").strip().lower() or "casual"
|
|
|
|
# Panjang jawaban: "concise" | "balanced" | "detailed"
|
|
PERSONA_VERBOSITY = os.getenv("PERSONA_VERBOSITY", default="balanced").strip().lower() or "balanced"
|
|
|
|
# Humor: "none" | "light" | "witty"
|
|
PERSONA_HUMOR = os.getenv("PERSONA_HUMOR", default="light").strip().lower() or "light"
|
|
|
|
# Bahasa: "id" | "en" | "" (auto)
|
|
PERSONA_LANGUAGE = os.getenv("PERSONA_LANGUAGE", default="id").strip().lower() or "id"
|
|
|
|
# Mood: "cheerful" | "calm" | "energetic" | "sarcastic"
|
|
PERSONA_MOOD = os.getenv("PERSONA_MOOD", default="cheerful").strip().lower() or "cheerful"
|
|
|
|
# Catchphrases khas AI (comma-separated)
|
|
# Contoh: "Siap bro!, Haha~, Wkwkwk"
|
|
PERSONA_CATCHPHRASES = os.getenv("PERSONA_CATCHPHRASES", default="").strip()
|
|
|
|
# Character preset — baca dari directory character/<AGENT_CHARACTER>
|
|
CHARACTER_DIR = Path(__file__).resolve().parent / "character"
|
|
AGENT_CHARACTER = os.getenv("AGENT_CHARACTER", default="").strip().lower()
|
|
CHARACTER_CONFIG_PATH = CHARACTER_DIR / AGENT_CHARACTER if AGENT_CHARACTER else None
|
|
if CHARACTER_CONFIG_PATH and CHARACTER_CONFIG_PATH.is_file():
|
|
_character_env = {}
|
|
for line in CHARACTER_CONFIG_PATH.read_text(encoding="utf-8").splitlines():
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
if "=" in line:
|
|
key, value = line.split("=", 1)
|
|
_character_env[key.strip()] = value.strip()
|
|
|
|
_character_overrides = {
|
|
"PERSONA_MODE": PERSONA_MODE,
|
|
"PERSONA_NAME": PERSONA_NAME,
|
|
"PERSONA_AGE": PERSONA_AGE,
|
|
"PERSONA_GENDER": PERSONA_GENDER,
|
|
"PERSONA_TONE": PERSONA_TONE,
|
|
"PERSONA_VERBOSITY": PERSONA_VERBOSITY,
|
|
"PERSONA_HUMOR": PERSONA_HUMOR,
|
|
"PERSONA_LANGUAGE": PERSONA_LANGUAGE,
|
|
"PERSONA_MOOD": PERSONA_MOOD,
|
|
"PERSONA_CATCHPHRASES": PERSONA_CATCHPHRASES,
|
|
}
|
|
for key, fallback in _character_overrides.items():
|
|
value = _character_env.get(key, fallback).strip()
|
|
if key in {"PERSONA_MODE", "PERSONA_TONE", "PERSONA_VERBOSITY", "PERSONA_HUMOR", "PERSONA_LANGUAGE", "PERSONA_MOOD"}:
|
|
value = value.lower() or fallback
|
|
if key == "PERSONA_NAME" and not value:
|
|
value = fallback
|
|
_character_overrides[key] = value
|
|
|
|
for key, value in _character_overrides.items():
|
|
globals()[key] = value
|
|
os.environ[key] = value
|
|
|
|
# Selective response: true = roleplayer hanya respon kalau ada mention/relevansi (default).
|
|
# false = roleplayer semua pesan ikut respon (seperti biasa, tanpa filter).
|
|
XMPP_SELECTIVE_RESPONSE = os.getenv("XMPP_SELECTIVE_RESPONSE", default="true").strip().lower() in ("true", "1", "yes")
|
|
|
|
# Humanize Delay Configuration (anti-bot detection)
|
|
READ_DELAY_MIN = float( os.getenv("READ_DELAY_MIN", default="1.0" ) ) # min reading delay (second)
|
|
READ_DELAY_MAX = float( os.getenv("READ_DELAY_MAX", default="2.0" ) ) # max reading delay (second)
|
|
TYPING_SPEED = float( os.getenv("TYPING_SPEED", default="15.0" ) ) # characters per second
|
|
TYPING_MAX = float( os.getenv("TYPING_MAX", default="10.0" ) ) # max typing delay limit (second)
|
|
|