morris5444 commited on
Commit
7e6cb75
·
verified ·
1 Parent(s): deadde8

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +144 -11
setup-hf-config.mjs CHANGED
@@ -4,8 +4,10 @@ import fs from "node:fs";
4
  import path from "node:path";
5
 
6
  const home = process.env.OPENCLAW_HOME || process.env.HOME || "/app";
7
- const stateDir = path.join(home, ".openclaw");
8
  const configPath = path.join(stateDir, "openclaw.json");
 
 
9
 
10
  function splitCsv(val) {
11
  return String(val || "")
@@ -22,6 +24,12 @@ function firstNonEmpty(...vals) {
22
  return "";
23
  }
24
 
 
 
 
 
 
 
25
  const gatewayToken = firstNonEmpty(
26
  process.env.OPENCLAW_GATEWAY_TOKEN,
27
  process.env.OPENCLAW_TOKEN
@@ -33,8 +41,6 @@ const defaultModel =
33
  firstNonEmpty(process.env.OPENCLAW_HF_DEFAULT_MODEL) ||
34
  "huggingface/Qwen/Qwen2.5-Coder-32B-Instruct";
35
 
36
- // Falls OPENCLAW_CONTROL_UI_ALLOWED_ORIGINS nicht gesetzt ist,
37
- // wird automatisch https://<SPACE_HOST> verwendet (wenn verfügbar)
38
  const inferredOrigin = process.env.SPACE_HOST
39
  ? `https://${process.env.SPACE_HOST}`
40
  : "";
@@ -46,8 +52,6 @@ const allowedOrigins = splitCsv(
46
  )
47
  );
48
 
49
- // In dieser Architektur läuft OpenClaw nur intern auf loopback.
50
- // Darum sind nur localhost-Proxies relevant.
51
  const trustedProxies = splitCsv(
52
  firstNonEmpty(
53
  process.env.OPENCLAW_GATEWAY_TRUSTED_PROXIES,
@@ -55,6 +59,53 @@ const trustedProxies = splitCsv(
55
  )
56
  );
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  let config = {};
59
  if (fs.existsSync(configPath)) {
60
  try {
@@ -87,24 +138,106 @@ if (allowedOrigins.length > 0) {
87
 
88
  config.gateway.trustedProxies = trustedProxies;
89
 
90
- // WICHTIG: offizielles HTTP-Chat-API einschalten
91
  config.gateway.http ??= {};
92
  config.gateway.http.endpoints ??= {};
93
  config.gateway.http.endpoints.chatCompletions ??= {};
94
  config.gateway.http.endpoints.chatCompletions.enabled = true;
95
 
96
- // Standardmodell setzen
 
 
 
97
  config.agents ??= {};
98
  config.agents.defaults ??= {};
99
  config.agents.defaults.model ??= {};
100
  config.agents.defaults.model.primary = defaultModel;
101
 
102
- // ABSICHTLICH KEIN agents.defaults.identity
103
- // identity gehört laut Config-Referenz nur unter agents.list[].identity
104
-
105
  fs.mkdirSync(stateDir, { recursive: true });
106
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf8");
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  console.log(
109
- `[openclaw-hf-setup] wrote ${configPath} allowedOrigins=${allowedOrigins.length} trustedProxies=${trustedProxies.length} chatCompletions=enabled`
110
  );
 
4
  import path from "node:path";
5
 
6
  const home = process.env.OPENCLAW_HOME || process.env.HOME || "/app";
7
+ const stateDir = process.env.OPENCLAW_STATE_DIR || path.join(home, ".openclaw");
8
  const configPath = path.join(stateDir, "openclaw.json");
9
+ const runtimeConfigPath = path.join(stateDir, "worker-runtime.json");
10
+ const usageLogPath = path.join(stateDir, "worker-usage.jsonl");
11
 
12
  function splitCsv(val) {
13
  return String(val || "")
 
24
  return "";
25
  }
26
 
27
+ function ensureFile(pathname, content) {
28
+ if (!fs.existsSync(pathname)) {
29
+ fs.writeFileSync(pathname, content, "utf8");
30
+ }
31
+ }
32
+
33
  const gatewayToken = firstNonEmpty(
34
  process.env.OPENCLAW_GATEWAY_TOKEN,
35
  process.env.OPENCLAW_TOKEN
 
41
  firstNonEmpty(process.env.OPENCLAW_HF_DEFAULT_MODEL) ||
42
  "huggingface/Qwen/Qwen2.5-Coder-32B-Instruct";
43
 
 
 
44
  const inferredOrigin = process.env.SPACE_HOST
45
  ? `https://${process.env.SPACE_HOST}`
46
  : "";
 
52
  )
53
  );
54
 
 
 
55
  const trustedProxies = splitCsv(
56
  firstNonEmpty(
57
  process.env.OPENCLAW_GATEWAY_TRUSTED_PROXIES,
 
59
  )
60
  );
61
 
62
+ const defaultProvider = firstNonEmpty(
63
+ process.env.OPENCLAW_DEFAULT_PROVIDER,
64
+ "openclaw"
65
+ );
66
+
67
+ const defaultAgent = firstNonEmpty(
68
+ process.env.OPENCLAW_WORKER_DEFAULT_AGENT,
69
+ "main"
70
+ );
71
+
72
+ const defaultSessionKey = firstNonEmpty(
73
+ process.env.OPENCLAW_WORKER_DEFAULT_SESSION_KEY,
74
+ "webchat:languageapp"
75
+ );
76
+
77
+ const defaultTimeoutMs = Number(
78
+ firstNonEmpty(process.env.OPENCLAW_WORKER_DEFAULT_TIMEOUT_MS, "120000")
79
+ );
80
+
81
+ const defaultTemperature = Number(
82
+ firstNonEmpty(process.env.OPENCLAW_WORKER_DEFAULT_TEMPERATURE, "0.2")
83
+ );
84
+
85
+ const defaultMaxTokensRaw = firstNonEmpty(
86
+ process.env.OPENCLAW_WORKER_DEFAULT_MAX_TOKENS,
87
+ ""
88
+ );
89
+ const defaultMaxTokens = defaultMaxTokensRaw ? Number(defaultMaxTokensRaw) : null;
90
+
91
+ const openclawAgents = splitCsv(
92
+ firstNonEmpty(process.env.OPENCLAW_OPENCLAW_AGENTS, "main")
93
+ );
94
+
95
+ const groqModels = splitCsv(
96
+ firstNonEmpty(
97
+ process.env.OPENCLAW_GROQ_MODELS,
98
+ "openai/gpt-oss-120b,llama-3.3-70b-versatile"
99
+ )
100
+ );
101
+
102
+ const huggingFaceModels = splitCsv(
103
+ firstNonEmpty(
104
+ process.env.OPENCLAW_HUGGINGFACE_MODELS,
105
+ "Qwen/Qwen2.5-Coder-32B-Instruct,Qwen/Qwen3-235B-A22B-Instruct-2507"
106
+ )
107
+ );
108
+
109
  let config = {};
110
  if (fs.existsSync(configPath)) {
111
  try {
 
138
 
139
  config.gateway.trustedProxies = trustedProxies;
140
 
 
141
  config.gateway.http ??= {};
142
  config.gateway.http.endpoints ??= {};
143
  config.gateway.http.endpoints.chatCompletions ??= {};
144
  config.gateway.http.endpoints.chatCompletions.enabled = true;
145
 
146
+ // optional, falls du später zusätzlich /v1/responses nutzen willst
147
+ config.gateway.http.endpoints.responses ??= {};
148
+ config.gateway.http.endpoints.responses.enabled = true;
149
+
150
  config.agents ??= {};
151
  config.agents.defaults ??= {};
152
  config.agents.defaults.model ??= {};
153
  config.agents.defaults.model.primary = defaultModel;
154
 
 
 
 
155
  fs.mkdirSync(stateDir, { recursive: true });
156
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf8");
157
 
158
+ let runtimeConfig = {};
159
+ if (fs.existsSync(runtimeConfigPath)) {
160
+ try {
161
+ runtimeConfig = JSON.parse(fs.readFileSync(runtimeConfigPath, "utf8"));
162
+ } catch {
163
+ runtimeConfig = {};
164
+ }
165
+ }
166
+
167
+ runtimeConfig.version = 1;
168
+ runtimeConfig.updatedAt = new Date().toISOString();
169
+
170
+ runtimeConfig.defaults = {
171
+ provider: runtimeConfig.defaults?.provider || defaultProvider,
172
+ agentId: runtimeConfig.defaults?.agentId || defaultAgent,
173
+ model: runtimeConfig.defaults?.model || "",
174
+ sessionKey: runtimeConfig.defaults?.sessionKey || defaultSessionKey,
175
+ timeoutMs:
176
+ Number(runtimeConfig.defaults?.timeoutMs) > 0
177
+ ? Number(runtimeConfig.defaults.timeoutMs)
178
+ : defaultTimeoutMs,
179
+ temperature:
180
+ Number.isFinite(Number(runtimeConfig.defaults?.temperature))
181
+ ? Number(runtimeConfig.defaults.temperature)
182
+ : defaultTemperature,
183
+ maxTokens:
184
+ runtimeConfig.defaults?.maxTokens === null ||
185
+ runtimeConfig.defaults?.maxTokens === undefined
186
+ ? defaultMaxTokens
187
+ : Number(runtimeConfig.defaults.maxTokens),
188
+ };
189
+
190
+ runtimeConfig.providers = {
191
+ openclaw: {
192
+ enabled: true,
193
+ label: "OpenClaw (internal)",
194
+ defaultAgent: defaultAgent,
195
+ models: openclawAgents.map((agentId) => ({
196
+ id: `openclaw:${agentId}`,
197
+ provider: "openclaw",
198
+ label: `OpenClaw Agent: ${agentId}`,
199
+ agentId,
200
+ })),
201
+ },
202
+ groq: {
203
+ enabled: Boolean(firstNonEmpty(process.env.GROQ_API_KEY)),
204
+ label: "Groq",
205
+ baseUrl:
206
+ firstNonEmpty(process.env.OPENCLAW_GROQ_BASE_URL) ||
207
+ "https://api.groq.com/openai/v1/chat/completions",
208
+ models: groqModels.map((model) => ({
209
+ id: model,
210
+ provider: "groq",
211
+ label: model,
212
+ })),
213
+ },
214
+ huggingface: {
215
+ enabled: Boolean(
216
+ firstNonEmpty(
217
+ process.env.OPENCLAW_HUGGINGFACE_API_KEY,
218
+ process.env.HF_TOKEN
219
+ )
220
+ ),
221
+ label: "Hugging Face",
222
+ baseUrl:
223
+ firstNonEmpty(process.env.OPENCLAW_HUGGINGFACE_BASE_URL) ||
224
+ "https://router.huggingface.co/v1/chat/completions",
225
+ models: huggingFaceModels.map((model) => ({
226
+ id: model,
227
+ provider: "huggingface",
228
+ label: model,
229
+ })),
230
+ },
231
+ };
232
+
233
+ runtimeConfig.meta = {
234
+ note:
235
+ "Runtime config is container-local. Persist long-term source-of-truth in your Vercel app / database.",
236
+ };
237
+
238
+ fs.writeFileSync(runtimeConfigPath, JSON.stringify(runtimeConfig, null, 2), "utf8");
239
+ ensureFile(usageLogPath, "");
240
+
241
  console.log(
242
+ `[openclaw-hf-setup] wrote ${configPath} allowedOrigins=${allowedOrigins.length} trustedProxies=${trustedProxies.length} chatCompletions=enabled runtimeConfig=ready`
243
  );