8900 commited on
Commit
429cf80
·
verified ·
1 Parent(s): 78ce986

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +122 -73
setup-hf-config.mjs CHANGED
@@ -9,117 +9,166 @@ 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
  var EXCLUDE_PREFIXES = [
31
- "OPENCLAW_", "SPACE_", "SYSTEM_", "HF_",
32
- "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_",
33
- "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"
34
  ];
35
-
36
  var INCLUDE_SUFFIXES = [
37
- "_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN",
38
- "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY",
39
- "_SESSION_KEY", "_COOKIE", "_TOKEN"
40
  ];
41
-
42
  function isProviderKey(k){
43
- for (let i=0;i<EXCLUDE_PREFIXES.length;i++){ if(k.indexOf(EXCLUDE_PREFIXES[i])===0) return false; }
44
- for (let i=0;i<INCLUDE_SUFFIXES.length;i++){
45
- let s=INCLUDE_SUFFIXES[i];
46
- if(k.length>s.length && k.indexOf(s)===k.length-s.length) return true;
47
- }
48
- return false;
49
  }
50
 
51
  var allKeys = Object.keys(process.env);
52
  var providerKeys = allKeys.filter(k => isProviderKey(k) && envStr(k));
53
  providerKeys.sort();
 
 
54
 
 
55
  var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
56
  var trustedProxies = envProxies.length>0 ? envProxies : [
57
- "10.16.0.0/12","10.20.0.0/12",
58
- "10.16.4.123","10.16.7.92","10.16.18.232",
59
- "10.16.34.155","10.16.43.133","10.16.1.206",
60
- "10.16.37.110","10.16.43.246",
61
- "10.20.1.9","10.20.1.222",
62
- "10.20.26.157","10.20.31.87",
63
- "10.20.0.1","172.17.0.1"
64
  ];
65
 
66
- // -- build config --
67
  var config = {
68
- gateway: {
69
- auth: gatewayToken ? { mode:"token", token:gatewayToken } : { mode:"password", password:gatewayPassword },
70
- controlUi: { allowInsecureAuth:true, allowedOrigins:["*"], dangerouslyDisableDeviceAuth:true, dangerouslyAllowHostHeaderOriginFallback:true },
71
- trustedProxies: trustedProxies
72
- },
73
- agents: { defaults:{ model:defaultModel } },
74
- env: { vars:{} }
 
75
  };
 
 
76
  providerKeys.forEach(pk=>{ config.env.vars[pk] = envStr(pk); });
77
 
78
- // 🚀 核心修复:移除不支持的根级 providers,将 Secrets 里的网页密码映射到标准环境变量中
 
 
 
79
  if (envStr("OPENAI_ACCESS_TOKEN")) {
80
- config.env.vars["OPENAI_API_KEY"] = envStr("OPENAI_ACCESS_TOKEN");
 
 
 
81
  }
 
 
82
  if (envStr("ANTHROPIC_SESSION_KEY")) {
83
- config.env.vars["ANTHROPIC_API_KEY"] = envStr("ANTHROPIC_SESSION_KEY");
 
 
84
  }
 
 
85
  if (envStr("MOONSHOT_ACCESS_TOKEN")) {
86
- config.env.vars["MOONSHOT_API_KEY"] = envStr("MOONSHOT_ACCESS_TOKEN");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
88
 
89
- // -- Telegram webhook setup --
90
  async function setupTelegram(){
91
- var token = envStr("TELEGRAM_BOT_TOKEN");
92
- if(!token){ return; }
93
-
94
- if(SPACE_HOST){
95
- var webhookUrl = "https://" + SPACE_HOST + "/tg-webhook";
96
- var r = await new Promise(resolve=>{
97
- var data = JSON.stringify({ url:webhookUrl, drop_pending_updates:true, max_connections:10 });
98
- var req = https.request({
99
- hostname: "api.telegram.org",
100
- path: "/bot"+token+"/setWebhook",
101
- method: "POST",
102
- headers: { "Content-Type":"application/json", "Content-Length": Buffer.byteLength(data) }
103
- }, res=>{
104
- let buf="";
105
- res.on("data",c=>buf+=c);
106
- res.on("end", ()=>{ try{ resolve(JSON.parse(buf)) } catch(e){ resolve(null) } });
107
- });
108
- req.on("error", ()=>resolve(null));
109
- req.setTimeout(8000, ()=>{ req.destroy(); resolve(null); });
110
- req.write(data);
111
- req.end();
112
- });
113
- }
114
- config.channels = { telegram:{ enabled:true, accounts:{ main:{ botToken:token, apiRoot:"https://api.telegram.org" } } } };
 
 
 
 
 
 
 
 
 
 
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
- console.log("[setup] Done! Providers forcefully mapped.");
125
- })().catch(e=>{ console.error("[setup] Fatal: "+e.message); process.exit(0); });
 
 
 
 
 
 
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
+ "_SESSION_KEY", "_COOKIE", "_TOKEN"
40
  ];
 
41
  function isProviderKey(k){
42
+ for (let i=0;i<EXCLUDE_PREFIXES.length;i++){ if(k.indexOf(EXCLUDE_PREFIXES[i])===0) return false; }
43
+ for (let i=0;i<INCLUDE_SUFFIXES.length;i++){
44
+ let s=INCLUDE_SUFFIXES[i];
45
+ if(k.length>s.length && k.indexOf(s)===k.length-s.length) return true;
46
+ }
47
+ return false;
48
  }
49
 
50
  var allKeys = Object.keys(process.env);
51
  var providerKeys = allKeys.filter(k => isProviderKey(k) && envStr(k));
52
  providerKeys.sort();
53
+ console.log("[setup] Detected provider keys ("+providerKeys.length+"):");
54
+ providerKeys.forEach(k=>console.log(" + "+k));
55
 
56
+ // – trusted proxies –
57
  var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
58
  var trustedProxies = envProxies.length>0 ? envProxies : [
59
+ "10.16.0.0/12","10.20.0.0/12",
60
+ "10.16.4.123","10.16.7.92","10.16.18.232",
61
+ "10.16.34.155","10.16.43.133","10.16.1.206",
62
+ "10.16.37.110","10.16.43.246",
63
+ "10.20.1.9","10.20.1.222",
64
+ "10.20.26.157","10.20.31.87",
65
+ "10.20.0.1","172.17.0.1"
66
  ];
67
 
68
+ // – build config –
69
  var config = {
70
+ gateway: {
71
+ auth: gatewayToken ? { mode:"token", token:gatewayToken } : { mode:"password", password:gatewayPassword },
72
+ controlUi: { allowInsecureAuth:true, allowedOrigins:["*"], dangerouslyDisableDeviceAuth:true, dangerouslyAllowHostHeaderOriginFallback:true },
73
+ trustedProxies: trustedProxies
74
+ },
75
+ agents: { defaults:{ model:defaultModel } },
76
+ env: { vars:{} },
77
+ providers: {}
78
  };
79
+
80
+ // 添加所有检测到的 provider keys 到环境变量
81
  providerKeys.forEach(pk=>{ config.env.vars[pk] = envStr(pk); });
82
 
83
+ // ⭐ 关键修复:直接在 providers 配置中绑定 Token
84
+ // 这样 OpenClaw 就知道如何使用这些 Token 了
85
+
86
+ // OpenAI 家族(支持多个变体)
87
  if (envStr("OPENAI_ACCESS_TOKEN")) {
88
+ var openaiToken = envStr("OPENAI_ACCESS_TOKEN");
89
+ config.providers["openai"] = { auth: { mode: "token", token: openaiToken } };
90
+ config.providers["openai-codex"] = { auth: { mode: "token", token: openaiToken } };
91
+ console.log("[setup] ✓ OpenAI token bound to providers: openai, openai-codex");
92
  }
93
+
94
+ // Anthropic Claude
95
  if (envStr("ANTHROPIC_SESSION_KEY")) {
96
+ var claudeToken = envStr("ANTHROPIC_SESSION_KEY");
97
+ config.providers["anthropic"] = { auth: { mode: "token", token: claudeToken } };
98
+ console.log("[setup] ✓ Anthropic token bound to provider: anthropic");
99
  }
100
+
101
+ // Moonshot Kimi
102
  if (envStr("MOONSHOT_ACCESS_TOKEN")) {
103
+ var kimiToken = envStr("MOONSHOT_ACCESS_TOKEN");
104
+ config.providers["moonshot"] = { auth: { mode: "token", token: kimiToken } };
105
+ console.log("[setup] ✓ Moonshot token bound to provider: moonshot");
106
+ }
107
+
108
+ // Google Gemini(通过 Cookie)
109
+ if (envStr("GOOGLE_GEMINI_COOKIE")) {
110
+ var geminiCookie = envStr("GOOGLE_GEMINI_COOKIE");
111
+ config.providers["google"] = { auth: { mode: "cookie", cookie: geminiCookie } };
112
+ config.providers["google-gemini-cli"] = { auth: { mode: "cookie", cookie: geminiCookie } };
113
+ console.log("[setup] ✓ Google Gemini cookie bound to providers: google, google-gemini-cli");
114
+ }
115
+
116
+ // 阿里通义千问
117
+ if (envStr("QWEN_COOKIE")) {
118
+ var qwenCookie = envStr("QWEN_COOKIE");
119
+ config.providers["qianwen"] = { auth: { mode: "cookie", cookie: qwenCookie } };
120
+ console.log("[setup] ✓ Qwen cookie bound to provider: qianwen");
121
  }
122
 
123
+ // – Telegram webhook setup –
124
  async function setupTelegram(){
125
+ var token = envStr("TELEGRAM_BOT_TOKEN");
126
+ if(!token){ console.log("[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)"); return; }
127
+
128
+ if(SPACE_HOST){
129
+ var webhookUrl = "https://" + SPACE_HOST + "/tg-webhook";
130
+ var r = await new Promise(resolve=>{
131
+ var data = JSON.stringify({ url:webhookUrl, drop_pending_updates:true, max_connections:10 });
132
+ var req = https.request({
133
+ hostname: "api.telegram.org",
134
+ path: "/bot"+token+"/setWebhook",
135
+ method: "POST",
136
+ headers: { "Content-Type":"application/json", "Content-Length": Buffer.byteLength(data) }
137
+ }, res=>{
138
+ let buf="";
139
+ res.on("data",c=>buf+=c);
140
+ res.on("end", ()=>{ try{ resolve(JSON.parse(buf)) } catch(e){ resolve(null) } });
141
+ });
142
+ req.on("error", ()=>resolve(null));
143
+ req.setTimeout(8000, ()=>{ req.destroy(); resolve(null); });
144
+ req.write(data);
145
+ req.end();
146
+ });
147
+ if(r && r.ok) console.log("[setup] Telegram: webhook registered -> "+webhookUrl);
148
+ else {
149
+ console.log("[setup] Telegram: auto-registration failed (HF outbound blocked)");
150
+ console.log("[setup] Telegram: open this URL in your browser once:");
151
+ console.log(" https://api.telegram.org/bot"+token+"/setWebhook?url="+webhookUrl+"&drop_pending_updates=true");
152
+ }
153
+ } else {
154
+ console.log("[setup] Telegram: set SPACE_HOST in Variables for auto webhook registration");
155
+ }
156
+
157
+ config.channels = { telegram:{ enabled:true, accounts:{ main:{ botToken:token, apiRoot:"https://api.telegram.org" } } } };
158
+ console.log("[setup] Telegram: configured");
159
  }
160
 
161
  (async function main(){
162
+ await setupTelegram();
163
+ try{
164
+ fs.mkdirSync(STATE_DIR,{recursive:true});
165
+ if(fs.existsSync(CONFIG_PATH)) fs.copyFileSync(CONFIG_PATH, CONFIG_PATH+".bak");
166
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config,null,2),"utf-8");
167
+ }catch(e){ console.error("[setup] Write failed: "+e.message); process.exit(0); }
168
+
169
+ console.log("[setup] Done! All provider tokens forcefully bound.");
170
+ console.log("[setup] auth = "+(gatewayToken?"token":"password"));
171
+ console.log("[setup] default model= "+defaultModel);
172
+ console.log("[setup] providers = "+Object.keys(config.providers).length);
173
+ console.log("[setup] config = "+CONFIG_PATH);
174
+ })().catch(e=>{ console.error("[setup] Fatal: "+e.message); process.exit(0); });