NEXON / backend /config.py
ashishMenon05
fix: resolve _default_roles scope error in config.py
0815f50
import json
import os
from pathlib import Path
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent
ROOT_DIR = BASE_DIR.parent
# Load environment variables, checking both backend/ and project root
if (BASE_DIR / ".env").exists():
load_dotenv(BASE_DIR / ".env")
elif (ROOT_DIR / ".env").exists():
load_dotenv(ROOT_DIR / ".env")
elif (ROOT_DIR / "default.env").exists():
load_dotenv(ROOT_DIR / "default.env")
else:
load_dotenv() # Fallback to standard search
# Helper data for agent configuration
_BUILT_IN_ROLES = ["INVESTIGATOR", "VALIDATOR", "FORENSIC_ANALYST", "NETWORK_ENGINEER", "SYSTEM_ADMIN", "SECURITY_ARCHITECT", "COMPLIANCE_OFFICER"]
_DEFAULT_ROLES = ["INVESTIGATOR", "VALIDATOR", "FORENSIC_ANALYST", "NETWORK_ENGINEER"]
def _build_agents_from_env():
import json
agents = []
suffix_map = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9}
for suffix, idx in suffix_map.items():
model_key = f"AGENT_{suffix.upper()}_MODEL"
provider_key = f"AGENT_{suffix.upper()}_PROVIDER"
role_key = f"AGENT_{suffix.upper()}_ROLE"
prompt_key = f"AGENT_{suffix.upper()}_SYSTEM_PROMPT"
temp_key = f"AGENT_{suffix.upper()}_TEMPERATURE"
model = os.getenv(model_key, "")
if model:
role_idx = idx % len(_DEFAULT_ROLES)
agents.append({
"id": f"agent_{suffix}",
"model": model,
"provider": os.getenv(provider_key, "ollama"),
"role": os.getenv(role_key, _DEFAULT_ROLES[role_idx]),
"system_prompt": os.getenv(prompt_key, ""),
"temperature": float(os.getenv(temp_key, str(0.7 - idx * 0.05)))
})
if not agents:
agents = [
{
"id": "agent_a",
"model": os.getenv("AGENT_A_MODEL", "meta-llama/Llama-3.1-8B-Instruct"),
"provider": os.getenv("AGENT_A_PROVIDER", "hf"),
"role": "INVESTIGATOR",
"system_prompt": "",
"temperature": 0.7
},
{
"id": "agent_b",
"model": os.getenv("AGENT_B_MODEL", "meta-llama/Llama-3.2-1B-Instruct"),
"provider": os.getenv("AGENT_B_PROVIDER", "hf"),
"role": "VALIDATOR",
"system_prompt": "",
"temperature": 0.6
}
]
return agents
class Settings:
# OLLAMA
OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1")
OLLAMA_API_KEY = os.getenv("OLLAMA_API_KEY", "ollama")
# AGENTS (Dynamic N-Agent Support)
try:
AGENTS_JSON = os.getenv("AGENTS_JSON")
AGENTS = json.loads(AGENTS_JSON) if AGENTS_JSON else _build_agents_from_env()
except:
AGENTS = _build_agents_from_env()
# EXECUTION ENVIRONMENT
EXECUTION_MODE = os.getenv("EXECUTION_MODE", "simulated")
SSH_HOST = os.getenv("SSH_HOST", "")
SSH_PORT = int(os.getenv("SSH_PORT", "22"))
SSH_USER = os.getenv("SSH_USER", "")
SSH_PASSWORD = os.getenv("SSH_PASSWORD", "")
# HUGGINGFACE
API_KEY = os.getenv("API_KEY", "ollama")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
HF_TOKEN = os.getenv("HF_TOKEN", "")
HF_INFERENCE_URL = os.getenv("HF_INFERENCE_URL", "https://router.huggingface.co/v1")
# OPENROUTER
OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY", "")
OPENROUTER_BASE_URL = os.getenv("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1")
# SERVER
HOST = os.getenv("HOST", "0.0.0.0")
PORT = int(os.getenv("PORT", "7860"))
DEBUG = os.getenv("DEBUG", "true").lower() in ("true", "1", "yes")
ENVIRONMENT = os.getenv("ENVIRONMENT", "local")
# EPISODE
MAX_STEPS = int(os.getenv("MAX_STEPS", "1000"))
MAX_EPISODE_TIME_SECONDS = int(os.getenv("MAX_EPISODE_TIME_SECONDS", "1200"))
SUCCESS_SCORE_THRESHOLD = float(os.getenv("SUCCESS_SCORE_THRESHOLD", "0.5"))
# MCP TOOL SERVER
MCP_SERVER_PORT = int(os.getenv("MCP_SERVER_PORT", "8001"))
MCP_SERVER_URL = os.getenv("MCP_SERVER_URL", "http://localhost:8001")
# CUSTOM MODEL
CUSTOM_MODEL_ENABLED = os.getenv("CUSTOM_MODEL_ENABLED", "false").lower() in ("true", "1", "yes")
CUSTOM_MODEL_BASE_URL = os.getenv("CUSTOM_MODEL_BASE_URL", "")
CUSTOM_MODEL_API_KEY = os.getenv("CUSTOM_MODEL_API_KEY", "")
CUSTOM_MODEL_NAME = os.getenv("CUSTOM_MODEL_NAME", "")
CUSTOM_MODEL_AGENT = os.getenv("CUSTOM_MODEL_AGENT", "")
settings = Settings()