Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| import sys | |
| from pathlib import Path | |
| HERMES_DIR = Path(os.getenv("HERMES_HOME", "/data/.hermes")) | |
| CONFIG_FILE = HERMES_DIR / "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") | |
| config_parts = [] | |
| model_section = "model:\n provider: {}\n default: \"{}\"".format(provider, model) | |
| config_parts.append(model_section) | |
| providers_lines = ["providers:"] | |
| provider_configs = { | |
| "openai": { | |
| "name": "openai", | |
| "base_url": env.get("OPENAI_BASE_URL", env.get("OPENAI_API_BASE", "https://api.openai.com/v1")), | |
| "key_env": "OPENAI_API_KEY", | |
| "models": [model], | |
| }, | |
| "anthropic": { | |
| "name": "anthropic", | |
| "base_url": env.get("ANTHROPIC_BASE_URL", "https://api.anthropic.com"), | |
| "key_env": "ANTHROPIC_API_KEY", | |
| "models": [model], | |
| }, | |
| "deepseek": { | |
| "name": "deepseek", | |
| "base_url": env.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1"), | |
| "key_env": "DEEPSEEK_API_KEY", | |
| "models": [model], | |
| }, | |
| "gemini": { | |
| "name": "gemini", | |
| "base_url": env.get("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta/openai"), | |
| "key_env": "GEMINI_API_KEY", | |
| "models": [model], | |
| }, | |
| "openrouter": { | |
| "name": "openrouter", | |
| "base_url": env.get("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1"), | |
| "key_env": "OPENROUTER_API_KEY", | |
| "models": [model], | |
| }, | |
| } | |
| for pname, pcfg in provider_configs.items(): | |
| key = os.getenv(pcfg["key_env"], "") | |
| placeholder = "sk-your-{}-key-here".format(pname) | |
| if key and key != placeholder: | |
| providers_lines.append(" {}:".format(pcfg["name"])) | |
| providers_lines.append(" name: {}".format(pcfg["name"])) | |
| providers_lines.append(" base_url: {}".format(pcfg["base_url"])) | |
| providers_lines.append(" key_env: {}".format(pcfg["key_env"])) | |
| providers_lines.append(" transport: openai_chat") | |
| providers_lines.append(' default_model: "{}"'.format(pcfg["models"][0])) | |
| providers_lines.append(" models:") | |
| for m in pcfg["models"]: | |
| providers_lines.append(' "{}":'.format(m)) | |
| 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_lines.append(" {}:".format(name)) | |
| providers_lines.append(" name: {}".format(name)) | |
| providers_lines.append(" base_url: {}".format(base_url)) | |
| providers_lines.append(" key_env: {}".format(key_env)) | |
| providers_lines.append(" transport: openai_chat") | |
| providers_lines.append(' default_model: "{}"'.format(default_model)) | |
| providers_lines.append(" models:") | |
| providers_lines.append(' "{}":'.format(default_model)) | |
| i += 1 | |
| if len(providers_lines) > 1: | |
| config_parts.append("\n".join(providers_lines)) | |
| config_parts.append("terminal:\n backend: local") | |
| telegram_token = env.get("TELEGRAM_BOT_TOKEN", "") | |
| if telegram_token and telegram_token != "YOUR_TELEGRAM_BOT_TOKEN": | |
| channels = [] | |
| channels.append("channels:") | |
| channels.append(" telegram:") | |
| channels.append(" token_env: TELEGRAM_BOT_TOKEN") | |
| channels.append(" polling: true") | |
| channels.append(" enabled: true") | |
| config_parts.append("\n".join(channels)) | |
| return "\n\n".join(config_parts) + "\n" | |
| def main(): | |
| HERMES_DIR.mkdir(parents=True, exist_ok=True) | |
| for sub in ["sessions", "workspace", "skills", "memory", "agents", | |
| "credentials", "cache", "logs", "history", "conversations"]: | |
| (HERMES_DIR / sub).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"))) | |
| tg = env.get("TELEGRAM_BOT_TOKEN", "") | |
| if tg and tg != "YOUR_TELEGRAM_BOT_TOKEN": | |
| print("[start.py] Telegram: configured") | |
| else: | |
| print("[start.py] Telegram: not configured") | |
| if __name__ == "__main__": | |
| main() | |