dev-workspace / src /start.py
hermesinho's picture
v2: src/start.py
6b4a798 verified
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()