hermesinho commited on
Commit
6b4a798
·
verified ·
1 Parent(s): 6166d46

v2: src/start.py

Browse files
Files changed (1) hide show
  1. src/start.py +121 -0
src/start.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from pathlib import Path
3
+
4
+ CONFIG_DIR = Path("/data/.config")
5
+ CONFIG_FILE = CONFIG_DIR / "hermes-config.yaml"
6
+ ENV_FILE = Path("/data/.env")
7
+
8
+
9
+ def load_env():
10
+ env = {}
11
+ if not ENV_FILE.exists():
12
+ return env
13
+ for line in ENV_FILE.read_text().splitlines():
14
+ line = line.strip()
15
+ if not line or line.startswith("#"):
16
+ continue
17
+ if "=" in line:
18
+ key, _, val = line.partition("=")
19
+ env[key.strip()] = val.strip()
20
+ os.environ[key.strip()] = val.strip()
21
+ return env
22
+
23
+
24
+ def build_config(env):
25
+ provider = env.get("HERMES_PROVIDER", "openai")
26
+ model = env.get("HERMES_MODEL", "gpt-4o")
27
+
28
+ providers = {}
29
+
30
+ builtins = {
31
+ "openai": {
32
+ "base_url": lambda e: e.get("OPENAI_BASE_URL", e.get("OPENAI_API_BASE", "https://api.openai.com/v1")),
33
+ "key_env": "OPENAI_API_KEY",
34
+ },
35
+ "anthropic": {
36
+ "base_url": lambda e: e.get("ANTHROPIC_BASE_URL", "https://api.anthropic.com"),
37
+ "key_env": "ANTHROPIC_API_KEY",
38
+ },
39
+ "deepseek": {
40
+ "base_url": lambda e: e.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1"),
41
+ "key_env": "DEEPSEEK_API_KEY",
42
+ },
43
+ "gemini": {
44
+ "base_url": lambda e: e.get("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta/openai"),
45
+ "key_env": "GEMINI_API_KEY",
46
+ },
47
+ "openrouter": {
48
+ "base_url": lambda e: e.get("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1"),
49
+ "key_env": "OPENROUTER_API_KEY",
50
+ },
51
+ }
52
+
53
+ for name, cfg in builtins.items():
54
+ key_val = os.getenv(cfg["key_env"], "")
55
+ if key_val and not key_val.startswith("sk-your-"):
56
+ providers[name] = {
57
+ "name": name,
58
+ "base_url": cfg["base_url"](env),
59
+ "key_env": cfg["key_env"],
60
+ "transport": "openai_chat",
61
+ "default_model": model,
62
+ "models": [model],
63
+ }
64
+
65
+ i = 1
66
+ while True:
67
+ prefix = "CUSTOM_{}".format(i)
68
+ name = env.get("{}_NAME".format(prefix), "")
69
+ if not name:
70
+ break
71
+ base_url = env.get("{}_BASE_URL".format(prefix), "").rstrip("/")
72
+ key_env = "{}_API_KEY".format(prefix)
73
+ default_model = env.get("{}_DEFAULT_MODEL".format(prefix), "")
74
+ if base_url and os.getenv(key_env) and default_model:
75
+ providers[name] = {
76
+ "name": name,
77
+ "base_url": base_url,
78
+ "key_env": key_env,
79
+ "transport": "openai_chat",
80
+ "default_model": default_model,
81
+ "models": [default_model],
82
+ }
83
+ i += 1
84
+
85
+ lines = []
86
+ lines.append("model:")
87
+ lines.append(" provider: {}".format(provider))
88
+ lines.append(' default: "{}"'.format(model))
89
+ lines.append("")
90
+
91
+ if providers:
92
+ lines.append("providers:")
93
+ for pname, pcfg in providers.items():
94
+ lines.append(" {}:".format(pname))
95
+ for k, v in [("name", pcfg["name"]), ("base_url", pcfg["base_url"]),
96
+ ("key_env", pcfg["key_env"]), ("transport", pcfg["transport"])]:
97
+ lines.append(" {}: {}".format(k, v))
98
+ lines.append(' default_model: "{}"'.format(pcfg["default_model"]))
99
+ lines.append(" models:")
100
+ for m in pcfg["models"]:
101
+ lines.append(' "{}":'.format(m))
102
+
103
+ lines.append("")
104
+ lines.append("terminal:")
105
+ lines.append(" backend: local")
106
+
107
+ return "\n".join(lines) + "\n"
108
+
109
+
110
+ def main():
111
+ CONFIG_DIR.mkdir(parents=True, exist_ok=True)
112
+ env = load_env()
113
+ config = build_config(env)
114
+ CONFIG_FILE.write_text(config, encoding="utf-8")
115
+ print("[start.py] Config written to {}".format(CONFIG_FILE))
116
+ print("[start.py] Provider: {}".format(env.get("HERMES_PROVIDER", "openai")))
117
+ print("[start.py] Model: {}".format(env.get("HERMES_MODEL", "gpt-4o")))
118
+
119
+
120
+ if __name__ == "__main__":
121
+ main()