import os from pathlib import Path CONFIG_DIR = Path("/data/.config") CONFIG_FILE = CONFIG_DIR / "hermes-config.yaml" ENV_FILE = Path("/data/.env") def load_env(): env = {} if not ENV_FILE.exists(): return env for line in ENV_FILE.read_text().splitlines(): line = line.strip() if not line or line.startswith("#"): continue if "=" in line: key, _, val = line.partition("=") env[key.strip()] = val.strip() os.environ[key.strip()] = val.strip() return env def build_config(env): provider = env.get("HERMES_PROVIDER", "openai") model = env.get("HERMES_MODEL", "gpt-4o") providers = {} builtins = { "openai": { "base_url": lambda e: e.get("OPENAI_BASE_URL", e.get("OPENAI_API_BASE", "https://api.openai.com/v1")), "key_env": "OPENAI_API_KEY", }, "anthropic": { "base_url": lambda e: e.get("ANTHROPIC_BASE_URL", "https://api.anthropic.com"), "key_env": "ANTHROPIC_API_KEY", }, "deepseek": { "base_url": lambda e: e.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1"), "key_env": "DEEPSEEK_API_KEY", }, "gemini": { "base_url": lambda e: e.get("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta/openai"), "key_env": "GEMINI_API_KEY", }, "openrouter": { "base_url": lambda e: e.get("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1"), "key_env": "OPENROUTER_API_KEY", }, } for name, cfg in builtins.items(): key_val = os.getenv(cfg["key_env"], "") if key_val and not key_val.startswith("sk-your-"): providers[name] = { "name": name, "base_url": cfg["base_url"](env), "key_env": cfg["key_env"], "transport": "openai_chat", "default_model": model, "models": [model], } i = 1 while True: prefix = "CUSTOM_{}".format(i) name = env.get("{}_NAME".format(prefix), "") if not name: break base_url = env.get("{}_BASE_URL".format(prefix), "").rstrip("/") key_env = "{}_API_KEY".format(prefix) default_model = env.get("{}_DEFAULT_MODEL".format(prefix), "") if base_url and os.getenv(key_env) and default_model: providers[name] = { "name": name, "base_url": base_url, "key_env": key_env, "transport": "openai_chat", "default_model": default_model, "models": [default_model], } i += 1 lines = [] lines.append("model:") lines.append(" provider: {}".format(provider)) lines.append(' default: "{}"'.format(model)) lines.append("") if providers: lines.append("providers:") for pname, pcfg in providers.items(): lines.append(" {}:".format(pname)) for k, v in [("name", pcfg["name"]), ("base_url", pcfg["base_url"]), ("key_env", pcfg["key_env"]), ("transport", pcfg["transport"])]: lines.append(" {}: {}".format(k, v)) lines.append(' default_model: "{}"'.format(pcfg["default_model"])) lines.append(" models:") for m in pcfg["models"]: lines.append(' "{}":'.format(m)) lines.append("") lines.append("terminal:") lines.append(" backend: local") return "\n".join(lines) + "\n" def main(): CONFIG_DIR.mkdir(parents=True, exist_ok=True) env = load_env() config = build_config(env) CONFIG_FILE.write_text(config, encoding="utf-8") print("[start.py] Config written to {}".format(CONFIG_FILE)) print("[start.py] Provider: {}".format(env.get("HERMES_PROVIDER", "openai"))) print("[start.py] Model: {}".format(env.get("HERMES_MODEL", "gpt-4o"))) if __name__ == "__main__": main()