Spaces:
Sleeping
Sleeping
| 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() | |