8900 commited on
Commit
722bc6a
Β·
verified Β·
1 Parent(s): 69e5685

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +165 -106
setup-hf-config.mjs CHANGED
@@ -1,10 +1,15 @@
1
- import fs from "node:fs";
2
  import path from "node:path";
3
  import https from "node:https";
4
 
5
  // ============================================================
6
- // OpenClaw HF Spaces - GitHub Models ζ”―ζŒη‰ˆ
7
- // ζ”―ζŒι€šθΏ‡ηŽ―ε’ƒε˜ι‡ OPENCLAW_GITHUB_MODEL θ‡ͺη”±εˆ‡ζ’ε…θ΄Ήζ¨‘εž‹
 
 
 
 
 
8
  // ============================================================
9
 
10
  var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
@@ -15,128 +20,182 @@ var SPACE_HOST = (process.env.SPACE_HOST || "").trim();
15
 
16
  console.log("[setup] Starting… HOME=" + HOME);
17
 
 
 
 
 
18
  function envStr(key) { return (process.env[key] || "").trim(); }
19
 
20
  // –– auth –––––––––––––––––––––––––
21
  var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
22
  var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
23
  if (!gatewayToken && !gatewayPassword) {
24
- console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD");
25
- process.exit(0);
26
  }
27
 
28
- // –– GitHub Models ζ”―ζŒοΌˆε…θ΄Ήζ¨‘εž‹ε€§ε…¨οΌ‰ –––––––––––––––––––––––––
29
- var githubModelInput = envStr("OPENCLAW_GITHUB_MODEL") || "gpt-4o-mini";
30
-
31
- const githubModelMap = {
32
- // OpenAI η³»εˆ—οΌˆε…θ΄Ήι’εΊ¦ζœ€ι«˜δΌ˜ε…ˆζŽ¨θοΌ‰
33
- "gpt-4o": "gpt-4o",
34
- "gpt-4o-mini": "gpt-4o-mini",
35
- "o1-mini": "o1-mini",
36
- "o1": "o1",
37
-
38
- // DeepSeek η³»εˆ—οΌˆζŽ¨η†/ζ•°ε­¦/δ»£η εΎˆεΌΊοΌ‰
39
- "deepseek-r1": "deepseek-ai/DeepSeek-R1",
40
- "deepseek-v3": "deepseek-ai/DeepSeek-V3",
41
-
42
- // Meta Llama η³»εˆ—
43
- "llama-4-maverick": "meta-llama/Llama-4-Maverick-17B",
44
- "llama-4-scout": "meta-llama/Llama-4-Scout-17B",
45
- "llama-3.3-70b": "meta-llama/Llama-3.3-70B-Instruct",
46
-
47
- // Google Gemma η³»εˆ—οΌˆθ½»ι‡δΈ”εΌΊοΌ‰
48
- "gemma-4-31b": "google/gemma-4-31B-it",
49
- "gemma-4-26b": "google/gemma-4-26B-A4B-it",
50
-
51
- // Qwen η³»εˆ—οΌˆδΈ­ζ–‡+δ»£η δΌ˜η§€οΌ‰
52
- "qwen3.5-72b": "Qwen/Qwen3.5-72B-Instruct",
53
- "qwen3-coder": "Qwen/Qwen3-Coder-30B-A3B",
54
-
55
- // ε…Άδ»–εΈΈη”¨ε…θ΄Ήζ¨‘εž‹
56
- "phi-4": "microsoft/phi-4",
57
- "mistral-small": "mistralai/Mistral-Small-3.1",
58
- "glm-4": "zai-org/GLM-4",
59
- };
60
-
61
- const selectedModel = githubModelMap[githubModelInput] || githubModelInput;
62
-
63
- console.log(`[setup] Using GitHub Model: ${selectedModel} (set via OPENCLAW_GITHUB_MODEL = ${githubModelInput})`);
64
-
65
- // –– ε…Άδ»–εŽŸζœ‰ι€»θΎ‘δΏζŒδΈε˜οΌˆauth、env、telegram η­‰οΌ‰ –––––––––––––––––––––––––
66
- var EXCLUDE_PREFIXES = ["OPENCLAW_", "SPACE_", "SYSTEM_", "HF_", "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_", "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"];
67
- var INCLUDE_SUFFIXES = ["_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN", "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"];
68
-
69
  function isProviderKey(k) {
70
- for (let prefix of EXCLUDE_PREFIXES) if (k.startsWith(prefix)) return false;
71
- for (let suffix of INCLUDE_SUFFIXES) if (k.endsWith(suffix)) return true;
72
- return false;
73
  }
74
-
75
- var providerKeys = Object.keys(process.env).filter(k => isProviderKey(k) && envStr(k)).sort();
76
-
77
- var trustedProxies = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.1"];
78
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  function buildAuth() {
80
- return gatewayToken ? { mode: "token", token: gatewayToken } : { mode: "password", password: gatewayPassword };
 
 
81
  }
82
-
83
  function buildEnvVars() {
84
- var vars = {};
85
- providerKeys.forEach(pk => { vars[pk] = envStr(pk); });
86
- return vars;
87
  }
88
-
89
  function buildTelegramChannel(token) {
90
- return { telegram: { enabled: true, accounts: { main: { botToken: token, apiRoot: "https://api.telegram.org" } } } };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }
92
 
93
  // –– main –––––––––––––––––––––––––
94
  (async function() {
95
- fs.mkdirSync(STATE_DIR, { recursive: true });
96
- fs.mkdirSync(WORKSPACE, { recursive: true });
97
- fs.mkdirSync(path.join(WORKSPACE, "memory"), { recursive: true });
98
-
99
- var token = envStr("TELEGRAM_BOT_TOKEN");
100
-
101
- if (fs.existsSync(CONFIG_PATH)) {
102
- var raw = fs.readFileSync(CONFIG_PATH, "utf-8").trim();
103
- var parsed = null;
104
- try { parsed = JSON.parse(raw); } catch (e) {}
105
-
106
- if (parsed) {
107
- parsed.gateway = parsed.gateway || {};
108
- parsed.gateway.auth = buildAuth();
109
- parsed.gateway.trustedProxies = trustedProxies;
110
- parsed.agents = parsed.agents || {};
111
- parsed.agents.defaults = parsed.agents.defaults || {};
112
- parsed.agents.defaults.model = selectedModel;
113
- parsed.agents.defaults.workspace = WORKSPACE;
114
- parsed.env = parsed.env || {};
115
- parsed.env.vars = buildEnvVars();
116
- if (token) parsed.channels = buildTelegramChannel(token);
117
-
118
- fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + ".bak");
119
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(parsed, null, 2), "utf-8");
120
- console.log(`[setup] Patched with model: ${selectedModel}`);
121
- return;
122
- }
 
 
 
 
 
 
123
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- // Fresh mode
126
- var config = {
127
- gateway: {
128
- auth: buildAuth(),
129
- controlUi: { allowInsecureAuth: true, allowedOrigins: ["*"], dangerouslyDisableDeviceAuth: true, dangerouslyAllowHostHeaderOriginFallback: true },
130
- trustedProxies: trustedProxies
131
- },
132
- agents: { defaults: { model: selectedModel, workspace: WORKSPACE } },
133
- env: { vars: buildEnvVars() }
134
- };
135
- if (token) config.channels = buildTelegramChannel(token);
136
-
137
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
138
- console.log(`[setup] Fresh config created with model: ${selectedModel}`);
139
- })().catch(e => {
140
- console.error("[setup] Fatal: " + e.message);
141
- process.exit(0);
 
 
 
 
 
 
 
 
 
 
 
142
  });
 
1
+ import fs from "node:fs";
2
  import path from "node:path";
3
  import https from "node:https";
4
 
5
  // ============================================================
6
+ // OpenClaw HF Spaces - Production Config Writer
7
+ //
8
+ // PATCH MODE: if openclaw.json already exists and is valid JSON,
9
+ // only update: auth, env.vars, channels, workspace path.
10
+ // ALL user settings from Control UI are preserved.
11
+ //
12
+ // FRESH MODE: if no config exists, write full template.
13
  // ============================================================
14
 
15
  var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
 
20
 
21
  console.log("[setup] Starting… HOME=" + HOME);
22
 
23
+ function parseList(val) {
24
+ if (!val || !val.trim()) return [];
25
+ return val.split(",").map(function(s) { return s.trim(); }).filter(Boolean);
26
+ }
27
  function envStr(key) { return (process.env[key] || "").trim(); }
28
 
29
  // –– auth –––––––––––––––––––––––––
30
  var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
31
  var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
32
  if (!gatewayToken && !gatewayPassword) {
33
+ console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD");
34
+ process.exit(0);
35
  }
36
 
37
+ // –– model ———————————————––
38
+ var defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
39
+
40
+ // –– provider keys —————————————–
41
+ var EXCLUDE_PREFIXES = [
42
+ "OPENCLAW_", "SPACE_", "SYSTEM_", "HF_",
43
+ "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_",
44
+ "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"
45
+ ];
46
+ var INCLUDE_SUFFIXES = [
47
+ "_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN",
48
+ "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"
49
+ ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  function isProviderKey(k) {
51
+ var i;
52
+ for (i = 0; i < EXCLUDE_PREFIXES.length; i++) {
53
+ if (k.indexOf(EXCLUDE_PREFIXES[i]) === 0) return false;
54
  }
55
+ for (i = 0; i < INCLUDE_SUFFIXES.length; i++) {
56
+ var s = INCLUDE_SUFFIXES[i];
57
+ if (k.length > s.length && k.indexOf(s) === k.length - s.length) return true;
58
+ }
59
+ return false;
60
+ }
61
+ var providerKeys = Object.keys(process.env).filter(function(k) {
62
+ return isProviderKey(k) && (process.env[k] || "").trim();
63
+ }).sort();
64
+
65
+ console.log("[setup] Provider keys (" + providerKeys.length + "): " + providerKeys.join(", "));
66
+
67
+ // –– trusted proxies β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
68
+ var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
69
+ var trustedProxies = envProxies.length > 0 ? envProxies : [
70
+ "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16",
71
+ "10.16.0.0/12", "10.20.0.0/12",
72
+ "10.16.4.123", "10.16.7.92", "10.16.18.232",
73
+ "10.16.34.155", "10.16.43.133", "10.16.1.206",
74
+ "10.16.37.110", "10.16.43.246",
75
+ "10.20.1.9", "10.20.1.222",
76
+ "10.20.26.157", "10.20.31.87",
77
+ "10.20.0.1", "172.17.0.1", "127.0.0.1"
78
+ ];
79
+
80
+ // –– helpers ———————————————–
81
  function buildAuth() {
82
+ return gatewayToken
83
+ ? { mode: "token", token: gatewayToken }
84
+ : { mode: "password", password: gatewayPassword };
85
  }
 
86
  function buildEnvVars() {
87
+ var vars = {};
88
+ providerKeys.forEach(function(pk) { vars[pk] = (process.env[pk] || "").trim(); });
89
+ return vars;
90
  }
 
91
  function buildTelegramChannel(token) {
92
+ return {
93
+ telegram: {
94
+ enabled: true,
95
+ accounts: { main: { botToken: token, apiRoot: "https://api.telegram.org" } }
96
+ }
97
+ };
98
+ }
99
+
100
+ function tgRequest(token, method, body) {
101
+ return new Promise(function(resolve) {
102
+ var data = JSON.stringify(body || {});
103
+ var req = https.request({
104
+ hostname: "api.telegram.org",
105
+ path: "/bot" + token + "/" + method,
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(data) }
108
+ }, function(res) {
109
+ var buf = "";
110
+ res.on("data", function(c) { buf += c; });
111
+ res.on("end", function() { try { resolve(JSON.parse(buf)); } catch (e) { resolve(null); } });
112
+ });
113
+ req.on("error", function() { resolve(null); });
114
+ req.setTimeout(8000, function() { req.destroy(); resolve(null); });
115
+ req.write(data);
116
+ req.end();
117
+ });
118
  }
119
 
120
  // –– main –––––––––––––––––––––––––
121
  (async function() {
122
+ fs.mkdirSync(STATE_DIR, { recursive: true });
123
+ fs.mkdirSync(WORKSPACE, { recursive: true });
124
+ fs.mkdirSync(path.join(WORKSPACE, "memory"), { recursive: true });
125
+
126
+ var token = envStr("TELEGRAM_BOT_TOKEN");
127
+
128
+ // Register webhook if possible
129
+ if (token && SPACE_HOST) {
130
+ var url = "https://" + SPACE_HOST + "/tg-webhook";
131
+ var r = await tgRequest(token, "setWebhook", {
132
+ url: url, drop_pending_updates: true, max_connections: 10
133
+ });
134
+ if (r && r.ok) {
135
+ console.log("[setup] Telegram: webhook registered -> " + url);
136
+ } else {
137
+ console.log("[setup] Telegram: webhook failed. Open in browser:");
138
+ console.log(" https://api.telegram.org/bot" + token +
139
+ "/setWebhook?url=" + url + "&drop_pending_updates=true");
140
+ }
141
+ } else if (!token) {
142
+ console.log("[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)");
143
+ }
144
+
145
+ // –– PATCH MODE: existing valid config found ––
146
+ if (fs.existsSync(CONFIG_PATH)) {
147
+ var raw = fs.readFileSync(CONFIG_PATH, "utf-8").trim();
148
+ var parsed = null;
149
+ try { parsed = JSON.parse(raw); } catch (e) { /* fall through to fresh write */ }
150
+
151
+ if (parsed) {
152
+ parsed.gateway = parsed.gateway || {};
153
+ parsed.gateway.auth = buildAuth();
154
+ if (!parsed.gateway.trustedProxies || parsed.gateway.trustedProxies.length < 5) {
155
+ parsed.gateway.trustedProxies = trustedProxies;
156
  }
157
+ parsed.agents = parsed.agents || {};
158
+ parsed.agents.defaults = parsed.agents.defaults || {};
159
+ parsed.agents.defaults.workspace = WORKSPACE;
160
+ parsed.env = parsed.env || {};
161
+ parsed.env.vars = buildEnvVars();
162
+ if (token) parsed.channels = buildTelegramChannel(token);
163
+
164
+ fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + ".bak");
165
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(parsed, null, 2), "utf-8");
166
+ console.log("[setup] Patched existing config (user settings preserved)");
167
+ console.log("[setup] env.vars = " + providerKeys.length);
168
+ console.log("[setup] workspace = " + WORKSPACE);
169
+ return;
170
+ }
171
+ }
172
 
173
+ // –– FRESH MODE: no config or invalid config ––
174
+ console.log("[setup] Writing fresh config template");
175
+ var config = {
176
+ gateway: {
177
+ auth: buildAuth(),
178
+ controlUi: {
179
+ allowInsecureAuth: true,
180
+ allowedOrigins: ["*"],
181
+ dangerouslyDisableDeviceAuth: true,
182
+ dangerouslyAllowHostHeaderOriginFallback: true
183
+ },
184
+ trustedProxies: trustedProxies
185
+ },
186
+ agents: { defaults: { model: defaultModel, workspace: WORKSPACE } },
187
+ env: { vars: buildEnvVars() }
188
+ };
189
+ if (token) config.channels = buildTelegramChannel(token);
190
+
191
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
192
+ console.log("[setup] Done.");
193
+ console.log("[setup] auth = " + (gatewayToken ? "token" : "password"));
194
+ console.log("[setup] model = " + defaultModel);
195
+ console.log("[setup] workspace = " + WORKSPACE);
196
+ console.log("[setup] proxies = " + trustedProxies.length);
197
+ console.log("[setup] env.vars = " + providerKeys.length);
198
+ })().catch(function(e) {
199
+ console.error("[setup] Fatal: " + e.message);
200
+ process.exit(0);
201
  });