#!/usr/bin/env python3 """ config.py — LLM configuration loading and accessors for The Chaos engine. """ from __future__ import annotations import json import sys from pathlib import Path from .paths import CONFIG_PATH DEFAULT_CONFIG: dict = { "llm": { "model": "ollama/llama3.1", "api_key": None, "api_base": None, "temperature": 0.8, "max_tokens": 300, } } def load_config(path: Path = CONFIG_PATH) -> dict: """Load config from path, creating default if missing. Returns config dict.""" if not path.exists(): print( "No session/config.json found. Creating default.\n" "Edit the model field (e.g. 'ollama/llama3.1', 'openai/gpt-4', " "'anthropic/claude-sonnet-4-20250514') and set api_key if needed.", file=sys.stderr, ) cfg = dict(DEFAULT_CONFIG) save_config(cfg, path) return cfg raw = path.read_text() cfg = json.loads(raw) llm = cfg.get("llm", {}) if not llm.get("api_key"): llm["api_key"] = None return cfg def save_config(config: dict, path: Path = CONFIG_PATH) -> None: """Save config dict to path.""" path.parent.mkdir(parents=True, exist_ok=True) path.write_text(json.dumps(config, indent=2) + "\n") # ── Accessors ────────────────────────────────────────────────────────────── def get_model(config: dict) -> str: return config.get("llm", {}).get("model", "ollama/llama3.1") def get_api_key(config: dict) -> str | None: return config.get("llm", {}).get("api_key") def get_api_base(config: dict) -> str | None: return config.get("llm", {}).get("api_base") def get_temperature(config: dict) -> float: return config.get("llm", {}).get("temperature", 0.8) def get_max_tokens(config: dict) -> int: return config.get("llm", {}).get("max_tokens", 512) def get_timeout(config: dict) -> int: return config.get("llm", {}).get("timeout", 120)