from functools import lru_cache from pathlib import Path from openai import AsyncOpenAI from app.config import settings PROMPTS_DIR = Path(__file__).parent / "prompts" @lru_cache def get_dm_system_prompt() -> str: return (PROMPTS_DIR / "dm_system_prompt.txt").read_text(encoding="utf-8") @lru_cache def get_game_setup_prompt() -> str: return (PROMPTS_DIR / "game_setup_prompt.txt").read_text(encoding="utf-8") @lru_cache def get_llm_client() -> AsyncOpenAI: if settings.llm_provider == "lmstudio": # LM Studio's local server accepts any non-empty string when no key is configured. return AsyncOpenAI( api_key=settings.lmstudio_api_key or "lm-studio", base_url=settings.lmstudio_base_url ) return AsyncOpenAI(api_key=settings.xai_api_key, base_url=settings.xai_base_url)