8900 commited on
Commit
00cdb16
·
verified ·
1 Parent(s): 6a9b123

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +183 -100
setup-hf-config.mjs CHANGED
@@ -1,131 +1,214 @@
1
- import fs from "node:fs";
2
  import path from "node:path";
3
  import https from "node:https";
4
 
5
- var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
6
- var STATE_DIR = path.join(HOME, ".openclaw");
 
 
 
 
7
  var CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
8
- var SPACE_HOST = (process.env.SPACE_HOST || "").trim();
9
 
10
  console.log("[setup] Starting… HOME=" + HOME);
11
 
12
- // -- helpers --
 
13
  function parseList(val) {
14
- if (!val || !val.trim()) return [];
15
- return val.split(",").map(function(s){ return s.trim(); }).filter(Boolean);
 
 
 
 
16
  }
17
- function envStr(key) { return (process.env[key] || "").trim(); }
18
 
19
- // -- auth --
20
- var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
 
21
  var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
 
22
  if (!gatewayToken && !gatewayPassword) {
23
- console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD in Secrets");
24
- process.exit(0);
25
  }
26
 
27
- // -- default model --
 
28
  var defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
29
 
30
- // -- dynamic provider key detection --
 
31
  var EXCLUDE_PREFIXES = [
32
- "OPENCLAW_", "SPACE_", "SYSTEM_", "HF_",
33
- "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_",
34
- "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"
35
  ];
36
  var INCLUDE_SUFFIXES = [
37
- "_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN",
38
- "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"
39
  ];
40
- function isProviderKey(k){
41
- for (let i=0;i<EXCLUDE_PREFIXES.length;i++){ if(k.indexOf(EXCLUDE_PREFIXES[i])===0) return false; }
42
- for (let i=0;i<INCLUDE_SUFFIXES.length;i++){
43
- let s=INCLUDE_SUFFIXES[i];
44
- if(k.length>s.length && k.indexOf(s)===k.length-s.length) return true;
45
- }
46
- return false;
 
 
 
 
47
  }
48
 
49
- var allKeys = Object.keys(process.env);
50
- var providerKeys = allKeys.filter(k => isProviderKey(k) && envStr(k));
51
- providerKeys.sort();
52
- console.log("[setup] Detected provider keys ("+providerKeys.length+"):");
53
- providerKeys.forEach(k=>console.log(" + "+k));
54
-
55
- // -- trusted proxies --
56
- var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
57
- var trustedProxies = envProxies.length>0 ? envProxies : [
58
- "10.16.0.0/12","10.20.0.0/12",
59
- "10.16.4.123","10.16.7.92","10.16.18.232",
60
- "10.16.34.155","10.16.43.133","10.16.1.206",
61
- "10.16.37.110","10.16.43.246",
62
- "10.20.1.9","10.20.1.222",
63
- "10.20.26.157","10.20.31.87",
64
- "10.20.0.1","172.17.0.1"
 
 
65
  ];
66
 
67
- // -- build config --
 
68
  var config = {
69
- gateway: {
70
- auth: gatewayToken ? { mode:"token", token:gatewayToken } : { mode:"password", password:gatewayPassword },
71
- controlUi: { allowInsecureAuth:true, allowedOrigins:["*"], dangerouslyDisableDeviceAuth:true, dangerouslyAllowHostHeaderOriginFallback:true },
72
- trustedProxies: trustedProxies
73
- },
74
- agents: { defaults:{ model:defaultModel } },
75
- env: { vars:{} }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  };
77
- providerKeys.forEach(pk=>{ config.env.vars[pk] = envStr(pk); });
78
-
79
- // -- Telegram webhook setup --
80
- async function setupTelegram(){
81
- var token = envStr("TELEGRAM_BOT_TOKEN");
82
- if(!token){ console.log("[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)"); return; }
83
-
84
- if(SPACE_HOST){
85
- var webhookUrl = "https://" + SPACE_HOST + "/tg-webhook";
86
- var r = await new Promise(resolve=>{
87
- var data = JSON.stringify({ url:webhookUrl, drop_pending_updates:true, max_connections:10 });
88
- var req = https.request({
89
- hostname: "api.telegram.org",
90
- path: "/bot"+token+"/setWebhook",
91
- method: "POST",
92
- headers: { "Content-Type":"application/json", "Content-Length": Buffer.byteLength(data) }
93
- }, res=>{
94
- let buf="";
95
- res.on("data",c=>buf+=c);
96
- res.on("end", ()=>{ try{ resolve(JSON.parse(buf)) } catch(e){ resolve(null) } });
97
- });
98
- req.on("error", ()=>resolve(null));
99
- req.setTimeout(8000, ()=>{ req.destroy(); resolve(null); });
100
- req.write(data);
101
- req.end();
102
  });
103
- if(r && r.ok) console.log("[setup] Telegram: webhook registered -> "+webhookUrl);
104
- else {
105
- console.log("[setup] Telegram: auto-registration failed (HF outbound blocked)");
106
- console.log("[setup] Telegram: open this URL in your browser once:");
107
- console.log(" https://api.telegram.org/bot"+token+"/setWebhook?url="+webhookUrl+"&drop_pending_updates=true");
108
- }
109
- } else {
110
- console.log("[setup] Telegram: set SPACE_HOST in Variables for auto webhook registration");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  }
112
 
113
- config.channels = { telegram:{ enabled:true, accounts:{ main:{ botToken:token, apiRoot:"https://api.telegram.org" } } } };
114
- console.log("[setup] Telegram: configured");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  }
116
 
117
- (async function main(){
118
- await setupTelegram();
119
- try{
120
- fs.mkdirSync(STATE_DIR,{recursive:true});
121
- if(fs.existsSync(CONFIG_PATH)) fs.copyFileSync(CONFIG_PATH, CONFIG_PATH+".bak");
122
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config,null,2),"utf-8");
123
- }catch(e){ console.error("[setup] Write failed: "+e.message); process.exit(0); }
124
-
125
- console.log("[setup] Done.");
126
- console.log("[setup] auth = "+(gatewayToken?"token":"password"));
127
- console.log("[setup] model = "+defaultModel);
128
- console.log("[setup] proxies = "+trustedProxies.length);
129
- console.log("[setup] env.vars = "+providerKeys.length);
130
- console.log("[setup] config = "+CONFIG_PATH);
131
- })().catch(e=>{ console.error("[setup] Fatal: "+e.message); process.exit(0); });
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
9
+ var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
10
+ var STATE_DIR = path.join(HOME, ".openclaw");
11
  var CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
12
+ var SPACE_HOST = (process.env.SPACE_HOST || "").trim();
13
 
14
  console.log("[setup] Starting… HOME=" + HOME);
15
 
16
+ // -- helpers ----------------------------------
17
+
18
  function parseList(val) {
19
+ if (!val || !val.trim()) return [];
20
+ return val.split(",").map(function(s) { return s.trim(); }).filter(Boolean);
21
+ }
22
+
23
+ function envStr(key) {
24
+ return (process.env[key] || "").trim();
25
  }
 
26
 
27
+ // -- auth ------------------------------------
28
+
29
+ var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
30
  var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
31
+
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
+
39
  var defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
40
 
41
+ // -- dynamic provider key detection ----------
42
+
43
  var EXCLUDE_PREFIXES = [
44
+ "OPENCLAW_", "SPACE_", "SYSTEM_", "HF_",
45
+ "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_",
46
+ "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"
47
  ];
48
  var INCLUDE_SUFFIXES = [
49
+ "_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN",
50
+ "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"
51
  ];
52
+
53
+ function isProviderKey(k) {
54
+ var i;
55
+ for (i = 0; i < EXCLUDE_PREFIXES.length; i++) {
56
+ if (k.indexOf(EXCLUDE_PREFIXES[i]) === 0) return false;
57
+ }
58
+ for (i = 0; i < INCLUDE_SUFFIXES.length; i++) {
59
+ var s = INCLUDE_SUFFIXES[i];
60
+ if (k.length > s.length && k.indexOf(s) === k.length - s.length) return true;
61
+ }
62
+ return false;
63
  }
64
 
65
+ var providerKeys = Object.keys(process.env).filter(function(k) {
66
+ return isProviderKey(k) && (process.env[k] || "").trim();
67
+ }).sort();
68
+
69
+ console.log("[setup] Detected provider keys (" + providerKeys.length + "):");
70
+ providerKeys.forEach(function(k) { console.log(" + " + k); });
71
+
72
+ // -- trusted proxies -------------------------
73
+
74
+ var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
75
+ var trustedProxies = envProxies.length > 0 ? envProxies : [
76
+ "10.16.0.0/12", "10.20.0.0/12",
77
+ "10.16.4.123", "10.16.7.92", "10.16.18.232",
78
+ "10.16.34.155", "10.16.43.133", "10.16.1.206",
79
+ "10.16.37.110", "10.16.43.246",
80
+ "10.20.1.9", "10.20.1.222",
81
+ "10.20.26.157", "10.20.31.87",
82
+ "10.20.0.1", "172.17.0.1"
83
  ];
84
 
85
+ // -- build config ----------------------------
86
+
87
  var config = {
88
+ gateway: {
89
+ auth: gatewayToken
90
+ ? { mode: "token", token: gatewayToken }
91
+ : { mode: "password", password: gatewayPassword },
92
+ controlUi: {
93
+ allowInsecureAuth: true,
94
+ allowedOrigins: ["*"],
95
+ dangerouslyDisableDeviceAuth: true,
96
+ dangerouslyAllowHostHeaderOriginFallback: true
97
+ },
98
+ trustedProxies: trustedProxies
99
+ },
100
+ agents: {
101
+ defaults: {
102
+ model: defaultModel
103
+ }
104
+ },
105
+ // Chinese language setting
106
+ // OpenClaw uses identity.language for UI locale
107
+ // systemPrompt instructs the AI to reply in Chinese
108
+ identity: {
109
+ language: "zh-CN"
110
+ },
111
+ messages: {
112
+ systemPrompt: envStr("OPENCLAW_SYSTEM_PROMPT") ||
113
+ "You are a helpful assistant. Always reply in Chinese (Simplified). " +
114
+ "Your responses must be in Simplified Chinese unless the user explicitly asks otherwise."
115
+ },
116
+ env: { vars: {} }
117
  };
118
+
119
+ providerKeys.forEach(function(pk) {
120
+ config.env.vars[pk] = (process.env[pk] || "").trim();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  });
122
+
123
+ // -- Telegram webhook setup ------------------
124
+
125
+ function tgRequest(token, method, body) {
126
+ return new Promise(function(resolve) {
127
+ var data = JSON.stringify(body || {});
128
+ var req = https.request({
129
+ hostname: "api.telegram.org",
130
+ path: "/bot" + token + "/" + method,
131
+ method: "POST",
132
+ headers: {
133
+ "Content-Type": "application/json",
134
+ "Content-Length": Buffer.byteLength(data)
135
+ }
136
+ }, function(res) {
137
+ var buf = "";
138
+ res.on("data", function(c) { buf += c; });
139
+ res.on("end", function() {
140
+ try { resolve(JSON.parse(buf)); } catch (e) { resolve(null); }
141
+ });
142
+ });
143
+ req.on("error", function() { resolve(null); });
144
+ req.setTimeout(8000, function() { req.destroy(); resolve(null); });
145
+ req.write(data);
146
+ req.end();
147
+ });
148
  }
149
 
150
+ async function setupTelegram() {
151
+ var token = envStr("TELEGRAM_BOT_TOKEN");
152
+ if (!token) {
153
+ console.log("[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)");
154
+ return;
155
+ }
156
+
157
+ if (SPACE_HOST) {
158
+ var webhookUrl = "https://" + SPACE_HOST + "/tg-webhook";
159
+ var r = await tgRequest(token, "setWebhook", {
160
+ url: webhookUrl,
161
+ drop_pending_updates: true,
162
+ max_connections: 10
163
+ });
164
+ if (r && r.ok) {
165
+ console.log("[setup] Telegram: webhook registered -> " + webhookUrl);
166
+ } else {
167
+ console.log("[setup] Telegram: auto-registration failed (HF outbound blocked)");
168
+ console.log("[setup] Open this URL in your browser once:");
169
+ console.log(" https://api.telegram.org/bot" + token +
170
+ "/setWebhook?url=" + webhookUrl + "&drop_pending_updates=true");
171
+ }
172
+ } else {
173
+ console.log("[setup] Telegram: set SPACE_HOST in Variables for auto webhook registration");
174
+ console.log("[setup] e.g. SPACE_HOST=echo8900-xia.hf.space");
175
+ }
176
+
177
+ config.channels = {
178
+ telegram: {
179
+ enabled: true,
180
+ accounts: {
181
+ main: { botToken: token, apiRoot: "https://api.telegram.org" }
182
+ }
183
+ }
184
+ };
185
+ console.log("[setup] Telegram: configured");
186
  }
187
 
188
+ // -- main ------------------------------------
189
+
190
+ (async function main() {
191
+ await setupTelegram();
192
+
193
+ try {
194
+ fs.mkdirSync(STATE_DIR, { recursive: true });
195
+ if (fs.existsSync(CONFIG_PATH)) {
196
+ fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + ".bak");
197
+ }
198
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
199
+ } catch (e) {
200
+ console.error("[setup] Write failed: " + e.message);
201
+ process.exit(0);
202
+ }
203
+
204
+ console.log("[setup] Done.");
205
+ console.log("[setup] auth = " + (gatewayToken ? "token" : "password"));
206
+ console.log("[setup] model = " + defaultModel);
207
+ console.log("[setup] language = zh-CN");
208
+ console.log("[setup] proxies = " + trustedProxies.length);
209
+ console.log("[setup] env.vars = " + providerKeys.length);
210
+ console.log("[setup] config = " + CONFIG_PATH);
211
+ })().catch(function(e) {
212
+ console.error("[setup] Fatal: " + e.message);
213
+ process.exit(0);
214
+ });