openfox 2.0.0-beta.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/{chat-handler-XIAY7O5X.js → chat-handler-LJMW4OK3.js} +9 -9
- package/dist/{chunk-QN5ST54E.js → chunk-32GQUDLN.js} +118 -97
- package/dist/{chunk-IGSZUXQP.js → chunk-7ZMMDZU7.js} +435 -33
- package/dist/{chunk-CDDMHSZF.js → chunk-CK6LGE7G.js} +10 -6
- package/dist/{chunk-7FDY3EOH.js → chunk-FFEAEPJB.js} +80 -226
- package/dist/{chunk-2ZS2B5HW.js → chunk-HPCGVAS4.js} +21 -45
- package/dist/{chunk-XJEOP6XU.js → chunk-ITWVFGFV.js} +1 -30
- package/dist/{chunk-DFITQ75T.js → chunk-LEDG5WAN.js} +29 -35
- package/dist/{chunk-GJ47CMZM.js → chunk-MFUPS6UE.js} +6 -6
- package/dist/{chunk-NPHYEUYE.js → chunk-XEK3KII6.js} +55 -4
- package/dist/{chunk-GJ34YIOL.js → chunk-ZDY4WMZJ.js} +185 -71
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{config-QUT7YZQ7.js → config-BU66P4KX.js} +2 -7
- package/dist/{events-PQ3KTI5H.js → events-ZKWAKWI7.js} +3 -3
- package/dist/{folding-CXORTBAU.js → folding-YOCGTZYH.js} +2 -2
- package/dist/{orchestrator-GAOENX5Q.js → orchestrator-LX6FKB6L.js} +8 -8
- package/dist/package.json +2 -1
- package/dist/{processor-6VIYGURD.js → processor-NMYSEBC7.js} +11 -6
- package/dist/{protocol-CDOV1pyc.d.ts → protocol-D59sCy9L.d.ts} +15 -6
- package/dist/{provider-4T6BVPMD.js → provider-DTNQYCMV.js} +9 -20
- package/dist/provider-manager-LMHAHLIF.js +15 -0
- package/dist/{serve-2V7T6GDG.js → serve-SGNL43UL.js} +14 -15
- package/dist/server/index.d.ts +22 -16
- package/dist/server/index.js +9 -10
- package/dist/shared/index.d.ts +2 -2
- package/dist/{tools-SDXWIYSA.js → tools-BOE5T3KC.js} +7 -7
- package/dist/web/assets/index-Bego8SwT.js +299 -0
- package/dist/web/assets/{index-CSOB8dwI.css → index-Sdax8ayU.css} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-EMJGF3A7.js +0 -466
- package/dist/web/assets/index-BJuF4wi7.js +0 -299
|
@@ -1,175 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
logger
|
|
3
|
-
} from "./chunk-K44MW7JJ.js";
|
|
4
|
-
|
|
5
|
-
// src/server/llm/backend.ts
|
|
6
|
-
var BACKEND_CAPABILITIES = {
|
|
7
|
-
vllm: {
|
|
8
|
-
supportsReasoningField: true,
|
|
9
|
-
supportsChatTemplateKwargs: true,
|
|
10
|
-
supportsTopK: true
|
|
11
|
-
},
|
|
12
|
-
sglang: {
|
|
13
|
-
supportsReasoningField: true,
|
|
14
|
-
supportsChatTemplateKwargs: true,
|
|
15
|
-
supportsTopK: true
|
|
16
|
-
},
|
|
17
|
-
ollama: {
|
|
18
|
-
supportsReasoningField: false,
|
|
19
|
-
supportsChatTemplateKwargs: false,
|
|
20
|
-
supportsTopK: false
|
|
21
|
-
},
|
|
22
|
-
llamacpp: {
|
|
23
|
-
supportsReasoningField: false,
|
|
24
|
-
supportsChatTemplateKwargs: false,
|
|
25
|
-
supportsTopK: true
|
|
26
|
-
},
|
|
27
|
-
"opencode-go": {
|
|
28
|
-
supportsReasoningField: false,
|
|
29
|
-
supportsChatTemplateKwargs: false,
|
|
30
|
-
supportsTopK: true
|
|
31
|
-
},
|
|
32
|
-
unknown: {
|
|
33
|
-
// Assume vLLM-like for unknown backends
|
|
34
|
-
supportsReasoningField: true,
|
|
35
|
-
supportsChatTemplateKwargs: true,
|
|
36
|
-
supportsTopK: true
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
function getBackendCapabilities(backend) {
|
|
40
|
-
return BACKEND_CAPABILITIES[backend];
|
|
41
|
-
}
|
|
42
|
-
async function detectBackend(baseUrl, explicitBackend, silent = false) {
|
|
43
|
-
if (explicitBackend && explicitBackend !== "unknown") {
|
|
44
|
-
if (silent) {
|
|
45
|
-
logger.debug("Using explicit backend", { backend: explicitBackend });
|
|
46
|
-
} else {
|
|
47
|
-
logger.info("Using explicit backend", { backend: explicitBackend });
|
|
48
|
-
}
|
|
49
|
-
return explicitBackend;
|
|
50
|
-
}
|
|
51
|
-
const probeUrl = baseUrl.replace(/\/v1\/?$/, "");
|
|
52
|
-
try {
|
|
53
|
-
if (await probeOllama(probeUrl)) {
|
|
54
|
-
if (silent) {
|
|
55
|
-
logger.debug("Detected Ollama backend", { url: probeUrl });
|
|
56
|
-
} else {
|
|
57
|
-
logger.info("Detected Ollama backend", { url: probeUrl });
|
|
58
|
-
}
|
|
59
|
-
return "ollama";
|
|
60
|
-
}
|
|
61
|
-
if (await probeLlamaCpp(probeUrl)) {
|
|
62
|
-
if (silent) {
|
|
63
|
-
logger.debug("Detected llama.cpp backend", { url: probeUrl });
|
|
64
|
-
} else {
|
|
65
|
-
logger.info("Detected llama.cpp backend", { url: probeUrl });
|
|
66
|
-
}
|
|
67
|
-
return "llamacpp";
|
|
68
|
-
}
|
|
69
|
-
if (await probeSGLang(probeUrl)) {
|
|
70
|
-
if (silent) {
|
|
71
|
-
logger.debug("Detected SGLang backend", { url: probeUrl });
|
|
72
|
-
} else {
|
|
73
|
-
logger.info("Detected SGLang backend", { url: probeUrl });
|
|
74
|
-
}
|
|
75
|
-
return "sglang";
|
|
76
|
-
}
|
|
77
|
-
if (await probeOpenAI(baseUrl)) {
|
|
78
|
-
if (silent) {
|
|
79
|
-
logger.debug("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
|
|
80
|
-
} else {
|
|
81
|
-
logger.info("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
|
|
82
|
-
}
|
|
83
|
-
return "vllm";
|
|
84
|
-
}
|
|
85
|
-
if (silent) {
|
|
86
|
-
logger.debug("Could not detect backend, using unknown", { url: baseUrl });
|
|
87
|
-
} else {
|
|
88
|
-
logger.warn("Could not detect backend, using unknown", { url: baseUrl });
|
|
89
|
-
}
|
|
90
|
-
return "unknown";
|
|
91
|
-
} catch (error) {
|
|
92
|
-
if (silent) {
|
|
93
|
-
logger.debug("Backend detection failed", {
|
|
94
|
-
url: baseUrl,
|
|
95
|
-
error: error instanceof Error ? error.message : String(error)
|
|
96
|
-
});
|
|
97
|
-
} else {
|
|
98
|
-
logger.warn("Backend detection failed", {
|
|
99
|
-
url: baseUrl,
|
|
100
|
-
error: error instanceof Error ? error.message : String(error)
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
return "unknown";
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
async function probeOllama(baseUrl) {
|
|
107
|
-
try {
|
|
108
|
-
const response = await fetch(`${baseUrl}/api/tags`, {
|
|
109
|
-
signal: AbortSignal.timeout(5e3)
|
|
110
|
-
});
|
|
111
|
-
return response.ok;
|
|
112
|
-
} catch {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
async function probeLlamaCpp(baseUrl) {
|
|
117
|
-
try {
|
|
118
|
-
const response = await fetch(`${baseUrl}/health`, {
|
|
119
|
-
signal: AbortSignal.timeout(5e3)
|
|
120
|
-
});
|
|
121
|
-
if (!response.ok) return false;
|
|
122
|
-
const data = await response.json();
|
|
123
|
-
return "slots_idle" in data || "slots_processing" in data;
|
|
124
|
-
} catch {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
async function probeSGLang(baseUrl) {
|
|
129
|
-
try {
|
|
130
|
-
const response = await fetch(`${baseUrl}/get_model_info`, {
|
|
131
|
-
signal: AbortSignal.timeout(5e3)
|
|
132
|
-
});
|
|
133
|
-
return response.ok;
|
|
134
|
-
} catch {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
async function probeOpenAI(baseUrl) {
|
|
139
|
-
try {
|
|
140
|
-
const url = baseUrl.includes("/v1") ? baseUrl : `${baseUrl}/v1`;
|
|
141
|
-
const response = await fetch(`${url}/models`, {
|
|
142
|
-
signal: AbortSignal.timeout(5e3)
|
|
143
|
-
});
|
|
144
|
-
return response.ok;
|
|
145
|
-
} catch {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
function getBackendDisplayName(backend) {
|
|
150
|
-
switch (backend) {
|
|
151
|
-
case "vllm":
|
|
152
|
-
return "vLLM";
|
|
153
|
-
case "sglang":
|
|
154
|
-
return "SGLang";
|
|
155
|
-
case "ollama":
|
|
156
|
-
return "Ollama";
|
|
157
|
-
case "llamacpp":
|
|
158
|
-
return "llama.cpp";
|
|
159
|
-
case "opencode-go":
|
|
160
|
-
return "OpenCode Go";
|
|
161
|
-
case "unknown":
|
|
162
|
-
return "Unknown";
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
1
|
// src/server/llm/profiles.ts
|
|
167
2
|
var DEFAULT_PROFILE = {
|
|
168
3
|
name: "default",
|
|
169
4
|
temperature: 0.7,
|
|
170
5
|
topP: 0.9,
|
|
171
|
-
supportsReasoning: false,
|
|
172
|
-
reasoningAsContent: false,
|
|
173
6
|
defaultMaxTokens: 4096,
|
|
174
7
|
supportsVision: true
|
|
175
8
|
};
|
|
@@ -177,8 +10,6 @@ var MOCK_PROFILE = {
|
|
|
177
10
|
name: "mock",
|
|
178
11
|
temperature: 0.7,
|
|
179
12
|
topP: 0.9,
|
|
180
|
-
supportsReasoning: false,
|
|
181
|
-
reasoningAsContent: false,
|
|
182
13
|
defaultMaxTokens: 1024,
|
|
183
14
|
supportsVision: false
|
|
184
15
|
};
|
|
@@ -189,8 +20,6 @@ var MODEL_PROFILES = [
|
|
|
189
20
|
name: "Mistral",
|
|
190
21
|
temperature: 0.7,
|
|
191
22
|
topP: 0.9,
|
|
192
|
-
supportsReasoning: false,
|
|
193
|
-
reasoningAsContent: false,
|
|
194
23
|
defaultMaxTokens: 16384,
|
|
195
24
|
supportsVision: false
|
|
196
25
|
}
|
|
@@ -204,8 +33,6 @@ var MODEL_PROFILES = [
|
|
|
204
33
|
topP: 0.95,
|
|
205
34
|
topK: 40,
|
|
206
35
|
// "This model supports only non-thinking mode and does not generate <think></think> blocks"
|
|
207
|
-
supportsReasoning: false,
|
|
208
|
-
reasoningAsContent: false,
|
|
209
36
|
defaultMaxTokens: 16384,
|
|
210
37
|
supportsVision: false
|
|
211
38
|
}
|
|
@@ -216,8 +43,6 @@ var MODEL_PROFILES = [
|
|
|
216
43
|
name: "Qwen3",
|
|
217
44
|
temperature: 0.7,
|
|
218
45
|
topP: 0.9,
|
|
219
|
-
supportsReasoning: true,
|
|
220
|
-
reasoningAsContent: false,
|
|
221
46
|
defaultMaxTokens: 16384,
|
|
222
47
|
supportsVision: false
|
|
223
48
|
}
|
|
@@ -228,8 +53,6 @@ var MODEL_PROFILES = [
|
|
|
228
53
|
name: "Qwen3-VL",
|
|
229
54
|
temperature: 0.7,
|
|
230
55
|
topP: 0.9,
|
|
231
|
-
supportsReasoning: true,
|
|
232
|
-
reasoningAsContent: false,
|
|
233
56
|
defaultMaxTokens: 16384,
|
|
234
57
|
supportsVision: true
|
|
235
58
|
}
|
|
@@ -240,8 +63,6 @@ var MODEL_PROFILES = [
|
|
|
240
63
|
name: "DeepSeek",
|
|
241
64
|
temperature: 0.6,
|
|
242
65
|
topP: 0.95,
|
|
243
|
-
supportsReasoning: true,
|
|
244
|
-
reasoningAsContent: false,
|
|
245
66
|
defaultMaxTokens: 16384,
|
|
246
67
|
supportsVision: false
|
|
247
68
|
}
|
|
@@ -253,8 +74,6 @@ var MODEL_PROFILES = [
|
|
|
253
74
|
temperature: 1,
|
|
254
75
|
topP: 0.95,
|
|
255
76
|
topK: 40,
|
|
256
|
-
supportsReasoning: true,
|
|
257
|
-
reasoningAsContent: false,
|
|
258
77
|
defaultMaxTokens: 16384,
|
|
259
78
|
supportsVision: false
|
|
260
79
|
}
|
|
@@ -266,8 +85,6 @@ var MODEL_PROFILES = [
|
|
|
266
85
|
temperature: 1,
|
|
267
86
|
topP: 0.95,
|
|
268
87
|
topK: 40,
|
|
269
|
-
supportsReasoning: true,
|
|
270
|
-
reasoningAsContent: false,
|
|
271
88
|
defaultMaxTokens: 16384,
|
|
272
89
|
supportsVision: false
|
|
273
90
|
}
|
|
@@ -279,8 +96,6 @@ var MODEL_PROFILES = [
|
|
|
279
96
|
temperature: 1,
|
|
280
97
|
topP: 0.95,
|
|
281
98
|
topK: 40,
|
|
282
|
-
supportsReasoning: true,
|
|
283
|
-
reasoningAsContent: false,
|
|
284
99
|
defaultMaxTokens: 16384,
|
|
285
100
|
supportsVision: false
|
|
286
101
|
}
|
|
@@ -292,8 +107,6 @@ var MODEL_PROFILES = [
|
|
|
292
107
|
temperature: 1,
|
|
293
108
|
topP: 0.95,
|
|
294
109
|
topK: 40,
|
|
295
|
-
supportsReasoning: true,
|
|
296
|
-
reasoningAsContent: false,
|
|
297
110
|
defaultMaxTokens: 16384,
|
|
298
111
|
supportsVision: true
|
|
299
112
|
}
|
|
@@ -304,8 +117,6 @@ var MODEL_PROFILES = [
|
|
|
304
117
|
name: "LLaVA",
|
|
305
118
|
temperature: 0.7,
|
|
306
119
|
topP: 0.9,
|
|
307
|
-
supportsReasoning: false,
|
|
308
|
-
reasoningAsContent: false,
|
|
309
120
|
defaultMaxTokens: 16384,
|
|
310
121
|
supportsVision: true
|
|
311
122
|
}
|
|
@@ -316,8 +127,6 @@ var MODEL_PROFILES = [
|
|
|
316
127
|
name: "Llama",
|
|
317
128
|
temperature: 0.7,
|
|
318
129
|
topP: 0.9,
|
|
319
|
-
supportsReasoning: false,
|
|
320
|
-
reasoningAsContent: false,
|
|
321
130
|
defaultMaxTokens: 16384,
|
|
322
131
|
supportsVision: false
|
|
323
132
|
}
|
|
@@ -328,8 +137,6 @@ var MODEL_PROFILES = [
|
|
|
328
137
|
name: "Claude",
|
|
329
138
|
temperature: 0.7,
|
|
330
139
|
topP: 0.9,
|
|
331
|
-
supportsReasoning: true,
|
|
332
|
-
reasoningAsContent: false,
|
|
333
140
|
defaultMaxTokens: 16384,
|
|
334
141
|
supportsVision: false
|
|
335
142
|
}
|
|
@@ -340,8 +147,6 @@ var MODEL_PROFILES = [
|
|
|
340
147
|
name: "Gemma 4",
|
|
341
148
|
temperature: 0.7,
|
|
342
149
|
topP: 0.9,
|
|
343
|
-
supportsReasoning: true,
|
|
344
|
-
reasoningAsContent: false,
|
|
345
150
|
defaultMaxTokens: 16384,
|
|
346
151
|
supportsVision: true
|
|
347
152
|
}
|
|
@@ -363,6 +168,53 @@ function modelSupportsVision(modelName) {
|
|
|
363
168
|
return getModelProfile(modelName).supportsVision;
|
|
364
169
|
}
|
|
365
170
|
|
|
171
|
+
// src/server/llm/backend.ts
|
|
172
|
+
var BACKEND_CAPABILITIES = {
|
|
173
|
+
vllm: {
|
|
174
|
+
supportsChatTemplateKwargs: true,
|
|
175
|
+
supportsTopK: true
|
|
176
|
+
},
|
|
177
|
+
sglang: {
|
|
178
|
+
supportsChatTemplateKwargs: true,
|
|
179
|
+
supportsTopK: true
|
|
180
|
+
},
|
|
181
|
+
ollama: {
|
|
182
|
+
supportsChatTemplateKwargs: false,
|
|
183
|
+
supportsTopK: false
|
|
184
|
+
},
|
|
185
|
+
llamacpp: {
|
|
186
|
+
supportsChatTemplateKwargs: false,
|
|
187
|
+
supportsTopK: true
|
|
188
|
+
},
|
|
189
|
+
"opencode-go": {
|
|
190
|
+
supportsChatTemplateKwargs: false,
|
|
191
|
+
supportsTopK: true
|
|
192
|
+
},
|
|
193
|
+
unknown: {
|
|
194
|
+
supportsChatTemplateKwargs: true,
|
|
195
|
+
supportsTopK: true
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
function getBackendCapabilities(backend) {
|
|
199
|
+
return BACKEND_CAPABILITIES[backend];
|
|
200
|
+
}
|
|
201
|
+
function getBackendDisplayName(backend) {
|
|
202
|
+
switch (backend) {
|
|
203
|
+
case "vllm":
|
|
204
|
+
return "vLLM";
|
|
205
|
+
case "sglang":
|
|
206
|
+
return "SGLang";
|
|
207
|
+
case "ollama":
|
|
208
|
+
return "Ollama";
|
|
209
|
+
case "llamacpp":
|
|
210
|
+
return "llama.cpp";
|
|
211
|
+
case "opencode-go":
|
|
212
|
+
return "OpenCode Go";
|
|
213
|
+
case "unknown":
|
|
214
|
+
return "Unknown";
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
366
218
|
// src/server/llm/client-pure.ts
|
|
367
219
|
function buildModelParams(params) {
|
|
368
220
|
return {
|
|
@@ -392,7 +244,14 @@ function convertToolCalls(toolCalls) {
|
|
|
392
244
|
}
|
|
393
245
|
}));
|
|
394
246
|
}
|
|
395
|
-
function
|
|
247
|
+
function getThinking(msg, override) {
|
|
248
|
+
if (override) {
|
|
249
|
+
const val = msg[override];
|
|
250
|
+
if (val) return val;
|
|
251
|
+
}
|
|
252
|
+
return msg["reasoning"] ?? msg["reasoning_content"] ?? msg["thinking"];
|
|
253
|
+
}
|
|
254
|
+
function buildAssistantMessage(msg, thinkingField) {
|
|
396
255
|
const result = {
|
|
397
256
|
role: "assistant",
|
|
398
257
|
content: msg.content || null
|
|
@@ -401,7 +260,7 @@ function buildAssistantMessage(msg) {
|
|
|
401
260
|
result["tool_calls"] = convertToolCalls(msg.toolCalls);
|
|
402
261
|
}
|
|
403
262
|
if (msg.thinkingContent) {
|
|
404
|
-
result["
|
|
263
|
+
result[thinkingField ?? "reasoning"] = msg.thinkingContent;
|
|
405
264
|
}
|
|
406
265
|
return result;
|
|
407
266
|
}
|
|
@@ -417,7 +276,7 @@ function convertAttachmentSync(attachment, modelSupportsVision2) {
|
|
|
417
276
|
text: `[Image: ${attachment.filename || "image"}] (vision not supported, cannot describe)`
|
|
418
277
|
};
|
|
419
278
|
}
|
|
420
|
-
function convertMessages(messages, modelSupportsVision2) {
|
|
279
|
+
function convertMessages(messages, modelSupportsVision2, thinkingField) {
|
|
421
280
|
const filtered = messages.filter((msg) => {
|
|
422
281
|
return !(msg.role === "assistant" && !msg.content?.trim() && (!msg.toolCalls || msg.toolCalls.length === 0));
|
|
423
282
|
});
|
|
@@ -438,7 +297,7 @@ function convertMessages(messages, modelSupportsVision2) {
|
|
|
438
297
|
};
|
|
439
298
|
}
|
|
440
299
|
if (msg.role === "assistant") {
|
|
441
|
-
return buildAssistantMessage(msg);
|
|
300
|
+
return buildAssistantMessage(msg, thinkingField);
|
|
442
301
|
}
|
|
443
302
|
if (msg.role === "user" && msg.attachments && msg.attachments.length > 0) {
|
|
444
303
|
const content = buildAttachmentContent(msg.content, msg.attachments, modelSupportsVision2);
|
|
@@ -463,10 +322,10 @@ function convertTools(tools) {
|
|
|
463
322
|
}
|
|
464
323
|
}));
|
|
465
324
|
}
|
|
466
|
-
async function buildChatCompletionCreateParams(model, request, profile, capabilities,
|
|
325
|
+
async function buildChatCompletionCreateParams(model, request, profile, capabilities, reasoningEffort, isStreaming, thinkingField) {
|
|
467
326
|
const userVisionOverride = request.modelSettings?.supportsVision;
|
|
468
327
|
const modelSupportsVision2 = userVisionOverride ?? profile.supportsVision ?? false;
|
|
469
|
-
const convertedMessages = convertMessages(request.messages, modelSupportsVision2);
|
|
328
|
+
const convertedMessages = convertMessages(request.messages, modelSupportsVision2, thinkingField);
|
|
470
329
|
const temperature = request.modelSettings?.temperature ?? request.temperature ?? profile.temperature;
|
|
471
330
|
const maxTokens = request.modelSettings?.maxTokens ?? request.maxTokens ?? profile.defaultMaxTokens;
|
|
472
331
|
const topP = request.modelSettings?.topP ?? profile.topP;
|
|
@@ -486,23 +345,34 @@ async function buildChatCompletionCreateParams(model, request, profile, capabili
|
|
|
486
345
|
;
|
|
487
346
|
params["top_k"] = topK;
|
|
488
347
|
}
|
|
489
|
-
const
|
|
490
|
-
if (
|
|
348
|
+
const resolvedEffort = reasoningEffort ?? request.reasoningEffort;
|
|
349
|
+
if (resolvedEffort) {
|
|
491
350
|
;
|
|
492
|
-
params["
|
|
351
|
+
params["reasoning_effort"] = resolvedEffort;
|
|
352
|
+
const chatTemplateKwargs = request.modelSettings?.chatTemplateKwargs;
|
|
353
|
+
if (chatTemplateKwargs) {
|
|
354
|
+
;
|
|
355
|
+
params["chat_template_kwargs"] = chatTemplateKwargs;
|
|
356
|
+
} else if (capabilities.supportsChatTemplateKwargs) {
|
|
357
|
+
;
|
|
358
|
+
params["chat_template_kwargs"] = {
|
|
359
|
+
enable_thinking: resolvedEffort !== "none"
|
|
360
|
+
};
|
|
361
|
+
}
|
|
493
362
|
}
|
|
494
363
|
const modelParams = buildModelParams({ temperature, topP, topK, maxTokens });
|
|
495
364
|
return { params, modelParams };
|
|
496
365
|
}
|
|
497
366
|
async function buildCreateParamsFromInput(input, isStreaming) {
|
|
498
|
-
const { model, request, profile, capabilities,
|
|
367
|
+
const { model, request, profile, capabilities, reasoningEffort, thinkingField } = input;
|
|
499
368
|
return buildChatCompletionCreateParams(
|
|
500
369
|
model,
|
|
501
370
|
request,
|
|
502
371
|
profile,
|
|
503
372
|
capabilities,
|
|
504
|
-
|
|
505
|
-
isStreaming
|
|
373
|
+
reasoningEffort,
|
|
374
|
+
isStreaming,
|
|
375
|
+
thinkingField
|
|
506
376
|
);
|
|
507
377
|
}
|
|
508
378
|
var buildNonStreamingCreateParams = (input) => buildCreateParamsFromInput(input, false);
|
|
@@ -521,20 +391,6 @@ function mapFinishReason(reason) {
|
|
|
521
391
|
return "stop";
|
|
522
392
|
}
|
|
523
393
|
}
|
|
524
|
-
function extractThinking(content) {
|
|
525
|
-
const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
|
|
526
|
-
let thinkingContent = "";
|
|
527
|
-
let cleanContent = content;
|
|
528
|
-
let match;
|
|
529
|
-
while ((match = thinkRegex.exec(content)) !== null) {
|
|
530
|
-
thinkingContent += match[1];
|
|
531
|
-
cleanContent = cleanContent.replace(match[0], "");
|
|
532
|
-
}
|
|
533
|
-
return {
|
|
534
|
-
content: cleanContent.trim(),
|
|
535
|
-
thinkingContent: thinkingContent.trim() || null
|
|
536
|
-
};
|
|
537
|
-
}
|
|
538
394
|
|
|
539
395
|
// src/server/llm/streaming.ts
|
|
540
396
|
async function* streamWithSegments(client, request) {
|
|
@@ -614,10 +470,9 @@ async function* streamWithSegments(client, request) {
|
|
|
614
470
|
const ttft = ((firstTokenTime ?? endTime) - startTime) / 1e3;
|
|
615
471
|
const completionTime = (endTime - (firstTokenTime ?? startTime)) / 1e3;
|
|
616
472
|
const { promptTokens, completionTokens } = response.usage;
|
|
617
|
-
const effectiveThinkingContent = thinkingContent || content === "" && response.reasoning_content || "";
|
|
618
473
|
return {
|
|
619
474
|
content,
|
|
620
|
-
thinkingContent
|
|
475
|
+
thinkingContent,
|
|
621
476
|
toolCalls,
|
|
622
477
|
response,
|
|
623
478
|
segments,
|
|
@@ -634,13 +489,12 @@ export {
|
|
|
634
489
|
getModelProfile,
|
|
635
490
|
modelSupportsVision,
|
|
636
491
|
getBackendCapabilities,
|
|
637
|
-
detectBackend,
|
|
638
492
|
getBackendDisplayName,
|
|
639
493
|
buildModelParams,
|
|
494
|
+
getThinking,
|
|
640
495
|
buildNonStreamingCreateParams,
|
|
641
496
|
buildStreamingCreateParams,
|
|
642
497
|
mapFinishReason,
|
|
643
|
-
extractThinking,
|
|
644
498
|
streamWithSegments
|
|
645
499
|
};
|
|
646
|
-
//# sourceMappingURL=chunk-
|
|
500
|
+
//# sourceMappingURL=chunk-FFEAEPJB.js.map
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
detectModel
|
|
3
|
-
} from "./chunk-EMJGF3A7.js";
|
|
4
|
-
import {
|
|
5
|
-
detectBackend
|
|
6
|
-
} from "./chunk-7FDY3EOH.js";
|
|
7
1
|
import {
|
|
8
2
|
getGlobalConfigPath
|
|
9
3
|
} from "./chunk-CQGTEGKL.js";
|
|
@@ -13,26 +7,6 @@ import { z } from "zod";
|
|
|
13
7
|
import { randomUUID } from "crypto";
|
|
14
8
|
import { readFile, writeFile, mkdir, access } from "fs/promises";
|
|
15
9
|
import { dirname } from "path";
|
|
16
|
-
var SMART_DEFAULTS = ["http://localhost:8000", "http://localhost:11434", "http://localhost:8080"];
|
|
17
|
-
async function trySmartDefaults(_mode) {
|
|
18
|
-
const results = await Promise.all(
|
|
19
|
-
SMART_DEFAULTS.map(async (url) => {
|
|
20
|
-
try {
|
|
21
|
-
const [backend, model] = await Promise.all([
|
|
22
|
-
detectBackend(url, void 0, true),
|
|
23
|
-
detectModel(url, 1, true)
|
|
24
|
-
// Only 1 retry attempt
|
|
25
|
-
]);
|
|
26
|
-
if (backend !== "unknown" && model) {
|
|
27
|
-
return { url, backend, model };
|
|
28
|
-
}
|
|
29
|
-
} catch {
|
|
30
|
-
}
|
|
31
|
-
return null;
|
|
32
|
-
})
|
|
33
|
-
);
|
|
34
|
-
return results.find((r) => r !== null) || null;
|
|
35
|
-
}
|
|
36
10
|
async function configFileExists(mode) {
|
|
37
11
|
const configPath = getGlobalConfigPath(mode);
|
|
38
12
|
try {
|
|
@@ -42,17 +16,7 @@ async function configFileExists(mode) {
|
|
|
42
16
|
return false;
|
|
43
17
|
}
|
|
44
18
|
}
|
|
45
|
-
var backendSchema = z.enum([
|
|
46
|
-
"auto",
|
|
47
|
-
"vllm",
|
|
48
|
-
"sglang",
|
|
49
|
-
"ollama",
|
|
50
|
-
"llamacpp",
|
|
51
|
-
"openai",
|
|
52
|
-
"anthropic",
|
|
53
|
-
"opencode-go",
|
|
54
|
-
"unknown"
|
|
55
|
-
]);
|
|
19
|
+
var backendSchema = z.enum(["vllm", "sglang", "ollama", "llamacpp", "openai", "anthropic", "opencode-go", "unknown"]);
|
|
56
20
|
var modelConfigSchema = z.object({
|
|
57
21
|
id: z.string(),
|
|
58
22
|
contextWindow: z.number(),
|
|
@@ -122,10 +86,17 @@ var configSchema = z.object({
|
|
|
122
86
|
var oldLlmSchema = z.object({
|
|
123
87
|
url: z.string().url().default("http://localhost:8000/v1"),
|
|
124
88
|
model: z.string().default("auto"),
|
|
125
|
-
backend: z.enum(["
|
|
89
|
+
backend: z.enum(["vllm", "sglang", "ollama", "llamacpp", "unknown"]).default("unknown"),
|
|
126
90
|
maxContext: z.number().default(2e5),
|
|
127
|
-
|
|
91
|
+
// Deprecated: use reasoningEffort instead
|
|
92
|
+
disableThinking: z.boolean().optional(),
|
|
93
|
+
reasoningEffort: z.string().optional(),
|
|
128
94
|
apiKey: z.string().optional()
|
|
95
|
+
}).transform((data) => {
|
|
96
|
+
if (data.disableThinking && !data.reasoningEffort) {
|
|
97
|
+
return { ...data, reasoningEffort: "none", disableThinking: void 0 };
|
|
98
|
+
}
|
|
99
|
+
return { ...data, disableThinking: void 0 };
|
|
129
100
|
});
|
|
130
101
|
var oldConfigSchema = z.object({
|
|
131
102
|
llm: oldLlmSchema,
|
|
@@ -141,7 +112,8 @@ function migrateConfig(raw) {
|
|
|
141
112
|
const obj = raw;
|
|
142
113
|
let migrationOccurred = false;
|
|
143
114
|
const providers = obj.providers.map((p) => {
|
|
144
|
-
const { model, maxContext, models: existingModels, ...rest } = p;
|
|
115
|
+
const { model, maxContext, models: existingModels, backend, ...rest } = p;
|
|
116
|
+
const normalizedBackend = backend === "auto" ? "unknown" : backend;
|
|
145
117
|
let models = existingModels ?? [];
|
|
146
118
|
if (maxContext !== void 0 && (existingModels === void 0 || existingModels.length === 0)) {
|
|
147
119
|
migrationOccurred = true;
|
|
@@ -155,6 +127,7 @@ function migrateConfig(raw) {
|
|
|
155
127
|
}
|
|
156
128
|
return {
|
|
157
129
|
...rest,
|
|
130
|
+
backend: normalizedBackend,
|
|
158
131
|
models
|
|
159
132
|
};
|
|
160
133
|
});
|
|
@@ -189,6 +162,11 @@ function migrateConfig(raw) {
|
|
|
189
162
|
};
|
|
190
163
|
}
|
|
191
164
|
if (typeof raw === "object" && raw !== null && "llm" in raw) {
|
|
165
|
+
const rawObj = raw;
|
|
166
|
+
const llm = rawObj["llm"];
|
|
167
|
+
if (llm && llm["backend"] === "auto") {
|
|
168
|
+
llm["backend"] = "unknown";
|
|
169
|
+
}
|
|
192
170
|
const oldConfig = oldConfigSchema.parse(raw);
|
|
193
171
|
const providerId = randomUUID();
|
|
194
172
|
const models = [
|
|
@@ -415,9 +393,8 @@ function mergeConfigs(...configs) {
|
|
|
415
393
|
llm: {
|
|
416
394
|
url: "http://localhost:8000/v1",
|
|
417
395
|
model: "auto",
|
|
418
|
-
backend: "
|
|
419
|
-
maxContext: 2e5
|
|
420
|
-
disableThinking: false
|
|
396
|
+
backend: "unknown",
|
|
397
|
+
maxContext: 2e5
|
|
421
398
|
},
|
|
422
399
|
server: { port: 10369, host: "127.0.0.1", openBrowser: true },
|
|
423
400
|
logging: { level: "error" }
|
|
@@ -427,7 +404,6 @@ function mergeConfigs(...configs) {
|
|
|
427
404
|
}
|
|
428
405
|
|
|
429
406
|
export {
|
|
430
|
-
trySmartDefaults,
|
|
431
407
|
configFileExists,
|
|
432
408
|
getVisionFallback,
|
|
433
409
|
migrateConfig,
|
|
@@ -443,4 +419,4 @@ export {
|
|
|
443
419
|
activateProvider,
|
|
444
420
|
mergeConfigs
|
|
445
421
|
};
|
|
446
|
-
//# sourceMappingURL=chunk-
|
|
422
|
+
//# sourceMappingURL=chunk-HPCGVAS4.js.map
|
|
@@ -621,30 +621,12 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
|
|
|
621
621
|
dynamicContextChanged: false
|
|
622
622
|
};
|
|
623
623
|
const contextState = baseContextState.compactionCount !== contextResult.compactionCount || baseContextState.maxTokens !== maxTokens ? { ...baseContextState, compactionCount: contextResult.compactionCount, maxTokens } : { ...baseContextState, maxTokens };
|
|
624
|
-
let messageReminderMode;
|
|
625
|
-
let snapshotReminderMode;
|
|
626
624
|
let cachedSystemPrompt;
|
|
627
625
|
let dynamicContextHash;
|
|
628
626
|
for (let i = events.length - 1; i >= 0; i--) {
|
|
629
627
|
const event = events[i];
|
|
630
|
-
if (event.type === "message.start") {
|
|
631
|
-
const data = event.data;
|
|
632
|
-
if (data.role === "user" && data.messageKind === "auto-prompt" && data.content?.includes("<system-reminder>")) {
|
|
633
|
-
if (data.content.includes("Plan Mode")) {
|
|
634
|
-
messageReminderMode = { seq: event.seq, mode: "planner" };
|
|
635
|
-
} else if (data.content.includes("Build Mode")) {
|
|
636
|
-
messageReminderMode = { seq: event.seq, mode: "builder" };
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
628
|
if (event.type === "turn.snapshot") {
|
|
641
629
|
const snapshotData = event.data;
|
|
642
|
-
if (snapshotData.lastModeWithReminder) {
|
|
643
|
-
snapshotReminderMode = {
|
|
644
|
-
seq: event.seq,
|
|
645
|
-
mode: snapshotData.lastModeWithReminder
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
630
|
if (snapshotData.cachedSystemPrompt && !cachedSystemPrompt) {
|
|
649
631
|
cachedSystemPrompt = snapshotData.cachedSystemPrompt;
|
|
650
632
|
}
|
|
@@ -656,14 +638,6 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
|
|
|
656
638
|
}
|
|
657
639
|
}
|
|
658
640
|
}
|
|
659
|
-
let lastModeWithReminder;
|
|
660
|
-
if (messageReminderMode && snapshotReminderMode) {
|
|
661
|
-
lastModeWithReminder = messageReminderMode.seq > snapshotReminderMode.seq ? messageReminderMode.mode : snapshotReminderMode.mode;
|
|
662
|
-
} else if (snapshotReminderMode) {
|
|
663
|
-
lastModeWithReminder = snapshotReminderMode.mode;
|
|
664
|
-
} else if (messageReminderMode) {
|
|
665
|
-
lastModeWithReminder = messageReminderMode.mode;
|
|
666
|
-
}
|
|
667
641
|
let sessionInit;
|
|
668
642
|
let sessionTitle;
|
|
669
643
|
const visionFallbacks = [];
|
|
@@ -758,7 +732,6 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages) {
|
|
|
758
732
|
contextState,
|
|
759
733
|
currentContextWindowId: contextResult.currentContextWindowId,
|
|
760
734
|
readFiles: contextResult.readFiles,
|
|
761
|
-
...lastModeWithReminder !== void 0 && { lastModeWithReminder },
|
|
762
735
|
...cachedSystemPrompt !== void 0 && { cachedSystemPrompt },
|
|
763
736
|
...dynamicContextHash !== void 0 && { dynamicContextHash },
|
|
764
737
|
pendingConfirmations,
|
|
@@ -784,7 +757,6 @@ function buildSnapshot(foldedState, latestSeq, snapshotAt = Date.now()) {
|
|
|
784
757
|
currentContextWindowId: foldedState.currentContextWindowId,
|
|
785
758
|
todos: foldedState.todos,
|
|
786
759
|
readFiles: foldedState.readFiles,
|
|
787
|
-
...foldedState.lastModeWithReminder !== void 0 && { lastModeWithReminder: foldedState.lastModeWithReminder },
|
|
788
760
|
...foldedState.cachedSystemPrompt !== void 0 && { cachedSystemPrompt: foldedState.cachedSystemPrompt },
|
|
789
761
|
...foldedState.dynamicContextHash !== void 0 && { dynamicContextHash: foldedState.dynamicContextHash },
|
|
790
762
|
snapshotSeq: latestSeq,
|
|
@@ -841,7 +813,6 @@ function buildSnapshotFromSessionState(input) {
|
|
|
841
813
|
snapshotSeq: latestSeq,
|
|
842
814
|
snapshotAt,
|
|
843
815
|
...foldedState.sessionInit !== void 0 && { sessionInit: foldedState.sessionInit },
|
|
844
|
-
...foldedState.lastModeWithReminder !== void 0 && { lastModeWithReminder: foldedState.lastModeWithReminder },
|
|
845
816
|
...input.cachedSystemPrompt !== void 0 ? { cachedSystemPrompt: input.cachedSystemPrompt } : foldedState.cachedSystemPrompt !== void 0 ? { cachedSystemPrompt: foldedState.cachedSystemPrompt } : {},
|
|
846
817
|
...input.dynamicContextHash !== void 0 ? { dynamicContextHash: input.dynamicContextHash } : foldedState.dynamicContextHash !== void 0 ? { dynamicContextHash: foldedState.dynamicContextHash } : {}
|
|
847
818
|
};
|
|
@@ -885,4 +856,4 @@ export {
|
|
|
885
856
|
getMessagesForWindow,
|
|
886
857
|
buildContextMessagesFromMessages
|
|
887
858
|
};
|
|
888
|
-
//# sourceMappingURL=chunk-
|
|
859
|
+
//# sourceMappingURL=chunk-ITWVFGFV.js.map
|