File size: 4,068 Bytes
6b4a798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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()