from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path def load_env_file(path: Path) -> None: if not path.exists(): return for raw_line in path.read_text(encoding="utf-8").splitlines(): line = raw_line.strip() if not line or line.startswith("#") or "=" not in line: continue key, value = line.split("=", 1) os.environ.setdefault(key.strip(), value.strip()) @dataclass(slots=True) class ServerConfig: host: str port: int model: str workspace_root: Path session_dir: Path system_prompt: str max_tool_rounds: int @classmethod def load(cls) -> "ServerConfig": base_dir = Path(__file__).resolve().parent load_env_file(base_dir / ".env") workspace_root = Path( os.environ.get("NEW_QWEN_WORKSPACE_ROOT", str(Path.cwd())) ).expanduser() session_dir = Path( os.environ.get( "NEW_QWEN_SESSION_DIR", str(base_dir.parent / ".new-qwen" / "sessions"), ) ).expanduser() return cls( host=os.environ.get("NEW_QWEN_HOST", "127.0.0.1"), port=int(os.environ.get("NEW_QWEN_PORT", "8080")), model=os.environ.get("NEW_QWEN_MODEL", "qwen3.6-plus"), workspace_root=workspace_root.resolve(), session_dir=session_dir.resolve(), system_prompt=os.environ.get("NEW_QWEN_SYSTEM_PROMPT", "").strip(), max_tool_rounds=int(os.environ.get("NEW_QWEN_MAX_TOOL_ROUNDS", "8")), )