openfox 2.0.0-beta.9 → 2.0.1
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-6COBLIDR.js → chat-handler-LJMW4OK3.js} +9 -9
- package/dist/{chunk-LR5R7EEE.js → chunk-32GQUDLN.js} +22 -18
- package/dist/{chunk-DMH6JVPF.js → chunk-7ZMMDZU7.js} +431 -32
- package/dist/{chunk-CDDMHSZF.js → chunk-CK6LGE7G.js} +10 -6
- package/dist/{chunk-VIIRNJDT.js → chunk-FFEAEPJB.js} +80 -245
- package/dist/{chunk-EZUR7OEP.js → chunk-HPCGVAS4.js} +21 -45
- package/dist/{chunk-XJEOP6XU.js → chunk-ITWVFGFV.js} +1 -30
- package/dist/{chunk-C75I2KZM.js → chunk-LEDG5WAN.js} +29 -35
- package/dist/{chunk-KUG27ZUR.js → chunk-MFUPS6UE.js} +6 -6
- package/dist/{chunk-NPHYEUYE.js → chunk-XEK3KII6.js} +55 -4
- package/dist/{chunk-J2FFLZ5Z.js → chunk-ZDY4WMZJ.js} +184 -71
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{config-TDVA7MQN.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-ZNGTMZ7W.js → orchestrator-LX6FKB6L.js} +8 -8
- package/dist/package.json +2 -1
- package/dist/{processor-WMAU4C2N.js → processor-NMYSEBC7.js} +11 -6
- package/dist/{protocol-CDOV1pyc.d.ts → protocol-D59sCy9L.d.ts} +15 -6
- package/dist/{provider-BGH4MBLH.js → provider-DTNQYCMV.js} +9 -20
- package/dist/provider-manager-LMHAHLIF.js +15 -0
- package/dist/{serve-N3LBZUVN.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-CQGEU3JK.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-UKTPL5ZG.js +0 -469
- package/dist/web/assets/index-BJuF4wi7.js +0 -299
|
@@ -1,191 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
logger
|
|
3
|
-
} from "./chunk-K44MW7JJ.js";
|
|
4
|
-
|
|
5
|
-
// src/server/llm/url-utils.ts
|
|
6
|
-
var VERSION_PREFIX_REGEX = /\/v\d+(\/|$)/;
|
|
7
|
-
function hasVersionPrefix(url) {
|
|
8
|
-
return VERSION_PREFIX_REGEX.test(url);
|
|
9
|
-
}
|
|
10
|
-
function ensureVersionPrefix(url, defaultVersion = "/v1") {
|
|
11
|
-
if (hasVersionPrefix(url)) return url;
|
|
12
|
-
return `${url.replace(/\/+$/, "")}${defaultVersion}`;
|
|
13
|
-
}
|
|
14
|
-
function stripVersionPrefix(url) {
|
|
15
|
-
return url.replace(/\/v\d+\/?$/, "");
|
|
16
|
-
}
|
|
17
|
-
function buildModelsUrl(baseUrl) {
|
|
18
|
-
return `${ensureVersionPrefix(baseUrl)}/models`;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// src/server/llm/backend.ts
|
|
22
|
-
var BACKEND_CAPABILITIES = {
|
|
23
|
-
vllm: {
|
|
24
|
-
supportsReasoningField: true,
|
|
25
|
-
supportsChatTemplateKwargs: true,
|
|
26
|
-
supportsTopK: true
|
|
27
|
-
},
|
|
28
|
-
sglang: {
|
|
29
|
-
supportsReasoningField: true,
|
|
30
|
-
supportsChatTemplateKwargs: true,
|
|
31
|
-
supportsTopK: true
|
|
32
|
-
},
|
|
33
|
-
ollama: {
|
|
34
|
-
supportsReasoningField: false,
|
|
35
|
-
supportsChatTemplateKwargs: false,
|
|
36
|
-
supportsTopK: false
|
|
37
|
-
},
|
|
38
|
-
llamacpp: {
|
|
39
|
-
supportsReasoningField: false,
|
|
40
|
-
supportsChatTemplateKwargs: false,
|
|
41
|
-
supportsTopK: true
|
|
42
|
-
},
|
|
43
|
-
"opencode-go": {
|
|
44
|
-
supportsReasoningField: false,
|
|
45
|
-
supportsChatTemplateKwargs: false,
|
|
46
|
-
supportsTopK: true
|
|
47
|
-
},
|
|
48
|
-
unknown: {
|
|
49
|
-
// Assume vLLM-like for unknown backends
|
|
50
|
-
supportsReasoningField: true,
|
|
51
|
-
supportsChatTemplateKwargs: true,
|
|
52
|
-
supportsTopK: true
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
function getBackendCapabilities(backend) {
|
|
56
|
-
return BACKEND_CAPABILITIES[backend];
|
|
57
|
-
}
|
|
58
|
-
async function detectBackend(baseUrl, explicitBackend, silent = false) {
|
|
59
|
-
if (explicitBackend && explicitBackend !== "unknown") {
|
|
60
|
-
if (silent) {
|
|
61
|
-
logger.debug("Using explicit backend", { backend: explicitBackend });
|
|
62
|
-
} else {
|
|
63
|
-
logger.info("Using explicit backend", { backend: explicitBackend });
|
|
64
|
-
}
|
|
65
|
-
return explicitBackend;
|
|
66
|
-
}
|
|
67
|
-
const probeUrl = stripVersionPrefix(baseUrl);
|
|
68
|
-
try {
|
|
69
|
-
if (await probeOllama(probeUrl)) {
|
|
70
|
-
if (silent) {
|
|
71
|
-
logger.debug("Detected Ollama backend", { url: probeUrl });
|
|
72
|
-
} else {
|
|
73
|
-
logger.info("Detected Ollama backend", { url: probeUrl });
|
|
74
|
-
}
|
|
75
|
-
return "ollama";
|
|
76
|
-
}
|
|
77
|
-
if (await probeLlamaCpp(probeUrl)) {
|
|
78
|
-
if (silent) {
|
|
79
|
-
logger.debug("Detected llama.cpp backend", { url: probeUrl });
|
|
80
|
-
} else {
|
|
81
|
-
logger.info("Detected llama.cpp backend", { url: probeUrl });
|
|
82
|
-
}
|
|
83
|
-
return "llamacpp";
|
|
84
|
-
}
|
|
85
|
-
if (await probeSGLang(probeUrl)) {
|
|
86
|
-
if (silent) {
|
|
87
|
-
logger.debug("Detected SGLang backend", { url: probeUrl });
|
|
88
|
-
} else {
|
|
89
|
-
logger.info("Detected SGLang backend", { url: probeUrl });
|
|
90
|
-
}
|
|
91
|
-
return "sglang";
|
|
92
|
-
}
|
|
93
|
-
if (await probeOpenAI(baseUrl)) {
|
|
94
|
-
if (silent) {
|
|
95
|
-
logger.debug("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
|
|
96
|
-
} else {
|
|
97
|
-
logger.info("Detected vLLM backend (OpenAI-compatible)", { url: baseUrl });
|
|
98
|
-
}
|
|
99
|
-
return "vllm";
|
|
100
|
-
}
|
|
101
|
-
if (silent) {
|
|
102
|
-
logger.debug("Could not detect backend, using unknown", { url: baseUrl });
|
|
103
|
-
} else {
|
|
104
|
-
logger.warn("Could not detect backend, using unknown", { url: baseUrl });
|
|
105
|
-
}
|
|
106
|
-
return "unknown";
|
|
107
|
-
} catch (error) {
|
|
108
|
-
if (silent) {
|
|
109
|
-
logger.debug("Backend detection failed", {
|
|
110
|
-
url: baseUrl,
|
|
111
|
-
error: error instanceof Error ? error.message : String(error)
|
|
112
|
-
});
|
|
113
|
-
} else {
|
|
114
|
-
logger.warn("Backend detection failed", {
|
|
115
|
-
url: baseUrl,
|
|
116
|
-
error: error instanceof Error ? error.message : String(error)
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
return "unknown";
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
async function probeOllama(baseUrl) {
|
|
123
|
-
try {
|
|
124
|
-
const response = await fetch(`${baseUrl}/api/tags`, {
|
|
125
|
-
signal: AbortSignal.timeout(5e3)
|
|
126
|
-
});
|
|
127
|
-
return response.ok;
|
|
128
|
-
} catch {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async function probeLlamaCpp(baseUrl) {
|
|
133
|
-
try {
|
|
134
|
-
const response = await fetch(`${baseUrl}/health`, {
|
|
135
|
-
signal: AbortSignal.timeout(5e3)
|
|
136
|
-
});
|
|
137
|
-
if (!response.ok) return false;
|
|
138
|
-
const data = await response.json();
|
|
139
|
-
return "slots_idle" in data || "slots_processing" in data;
|
|
140
|
-
} catch {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async function probeSGLang(baseUrl) {
|
|
145
|
-
try {
|
|
146
|
-
const response = await fetch(`${baseUrl}/get_model_info`, {
|
|
147
|
-
signal: AbortSignal.timeout(5e3)
|
|
148
|
-
});
|
|
149
|
-
return response.ok;
|
|
150
|
-
} catch {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
async function probeOpenAI(baseUrl) {
|
|
155
|
-
try {
|
|
156
|
-
const url = ensureVersionPrefix(baseUrl);
|
|
157
|
-
const response = await fetch(`${url}/models`, {
|
|
158
|
-
signal: AbortSignal.timeout(5e3)
|
|
159
|
-
});
|
|
160
|
-
return response.ok;
|
|
161
|
-
} catch {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
function getBackendDisplayName(backend) {
|
|
166
|
-
switch (backend) {
|
|
167
|
-
case "vllm":
|
|
168
|
-
return "vLLM";
|
|
169
|
-
case "sglang":
|
|
170
|
-
return "SGLang";
|
|
171
|
-
case "ollama":
|
|
172
|
-
return "Ollama";
|
|
173
|
-
case "llamacpp":
|
|
174
|
-
return "llama.cpp";
|
|
175
|
-
case "opencode-go":
|
|
176
|
-
return "OpenCode Go";
|
|
177
|
-
case "unknown":
|
|
178
|
-
return "Unknown";
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
1
|
// src/server/llm/profiles.ts
|
|
183
2
|
var DEFAULT_PROFILE = {
|
|
184
3
|
name: "default",
|
|
185
4
|
temperature: 0.7,
|
|
186
5
|
topP: 0.9,
|
|
187
|
-
supportsReasoning: false,
|
|
188
|
-
reasoningAsContent: false,
|
|
189
6
|
defaultMaxTokens: 4096,
|
|
190
7
|
supportsVision: true
|
|
191
8
|
};
|
|
@@ -193,8 +10,6 @@ var MOCK_PROFILE = {
|
|
|
193
10
|
name: "mock",
|
|
194
11
|
temperature: 0.7,
|
|
195
12
|
topP: 0.9,
|
|
196
|
-
supportsReasoning: false,
|
|
197
|
-
reasoningAsContent: false,
|
|
198
13
|
defaultMaxTokens: 1024,
|
|
199
14
|
supportsVision: false
|
|
200
15
|
};
|
|
@@ -205,8 +20,6 @@ var MODEL_PROFILES = [
|
|
|
205
20
|
name: "Mistral",
|
|
206
21
|
temperature: 0.7,
|
|
207
22
|
topP: 0.9,
|
|
208
|
-
supportsReasoning: false,
|
|
209
|
-
reasoningAsContent: false,
|
|
210
23
|
defaultMaxTokens: 16384,
|
|
211
24
|
supportsVision: false
|
|
212
25
|
}
|
|
@@ -220,8 +33,6 @@ var MODEL_PROFILES = [
|
|
|
220
33
|
topP: 0.95,
|
|
221
34
|
topK: 40,
|
|
222
35
|
// "This model supports only non-thinking mode and does not generate <think></think> blocks"
|
|
223
|
-
supportsReasoning: false,
|
|
224
|
-
reasoningAsContent: false,
|
|
225
36
|
defaultMaxTokens: 16384,
|
|
226
37
|
supportsVision: false
|
|
227
38
|
}
|
|
@@ -232,8 +43,6 @@ var MODEL_PROFILES = [
|
|
|
232
43
|
name: "Qwen3",
|
|
233
44
|
temperature: 0.7,
|
|
234
45
|
topP: 0.9,
|
|
235
|
-
supportsReasoning: true,
|
|
236
|
-
reasoningAsContent: false,
|
|
237
46
|
defaultMaxTokens: 16384,
|
|
238
47
|
supportsVision: false
|
|
239
48
|
}
|
|
@@ -244,8 +53,6 @@ var MODEL_PROFILES = [
|
|
|
244
53
|
name: "Qwen3-VL",
|
|
245
54
|
temperature: 0.7,
|
|
246
55
|
topP: 0.9,
|
|
247
|
-
supportsReasoning: true,
|
|
248
|
-
reasoningAsContent: false,
|
|
249
56
|
defaultMaxTokens: 16384,
|
|
250
57
|
supportsVision: true
|
|
251
58
|
}
|
|
@@ -256,8 +63,6 @@ var MODEL_PROFILES = [
|
|
|
256
63
|
name: "DeepSeek",
|
|
257
64
|
temperature: 0.6,
|
|
258
65
|
topP: 0.95,
|
|
259
|
-
supportsReasoning: true,
|
|
260
|
-
reasoningAsContent: false,
|
|
261
66
|
defaultMaxTokens: 16384,
|
|
262
67
|
supportsVision: false
|
|
263
68
|
}
|
|
@@ -269,8 +74,6 @@ var MODEL_PROFILES = [
|
|
|
269
74
|
temperature: 1,
|
|
270
75
|
topP: 0.95,
|
|
271
76
|
topK: 40,
|
|
272
|
-
supportsReasoning: true,
|
|
273
|
-
reasoningAsContent: false,
|
|
274
77
|
defaultMaxTokens: 16384,
|
|
275
78
|
supportsVision: false
|
|
276
79
|
}
|
|
@@ -282,8 +85,6 @@ var MODEL_PROFILES = [
|
|
|
282
85
|
temperature: 1,
|
|
283
86
|
topP: 0.95,
|
|
284
87
|
topK: 40,
|
|
285
|
-
supportsReasoning: true,
|
|
286
|
-
reasoningAsContent: false,
|
|
287
88
|
defaultMaxTokens: 16384,
|
|
288
89
|
supportsVision: false
|
|
289
90
|
}
|
|
@@ -295,8 +96,6 @@ var MODEL_PROFILES = [
|
|
|
295
96
|
temperature: 1,
|
|
296
97
|
topP: 0.95,
|
|
297
98
|
topK: 40,
|
|
298
|
-
supportsReasoning: true,
|
|
299
|
-
reasoningAsContent: false,
|
|
300
99
|
defaultMaxTokens: 16384,
|
|
301
100
|
supportsVision: false
|
|
302
101
|
}
|
|
@@ -308,8 +107,6 @@ var MODEL_PROFILES = [
|
|
|
308
107
|
temperature: 1,
|
|
309
108
|
topP: 0.95,
|
|
310
109
|
topK: 40,
|
|
311
|
-
supportsReasoning: true,
|
|
312
|
-
reasoningAsContent: false,
|
|
313
110
|
defaultMaxTokens: 16384,
|
|
314
111
|
supportsVision: true
|
|
315
112
|
}
|
|
@@ -320,8 +117,6 @@ var MODEL_PROFILES = [
|
|
|
320
117
|
name: "LLaVA",
|
|
321
118
|
temperature: 0.7,
|
|
322
119
|
topP: 0.9,
|
|
323
|
-
supportsReasoning: false,
|
|
324
|
-
reasoningAsContent: false,
|
|
325
120
|
defaultMaxTokens: 16384,
|
|
326
121
|
supportsVision: true
|
|
327
122
|
}
|
|
@@ -332,8 +127,6 @@ var MODEL_PROFILES = [
|
|
|
332
127
|
name: "Llama",
|
|
333
128
|
temperature: 0.7,
|
|
334
129
|
topP: 0.9,
|
|
335
|
-
supportsReasoning: false,
|
|
336
|
-
reasoningAsContent: false,
|
|
337
130
|
defaultMaxTokens: 16384,
|
|
338
131
|
supportsVision: false
|
|
339
132
|
}
|
|
@@ -344,8 +137,6 @@ var MODEL_PROFILES = [
|
|
|
344
137
|
name: "Claude",
|
|
345
138
|
temperature: 0.7,
|
|
346
139
|
topP: 0.9,
|
|
347
|
-
supportsReasoning: true,
|
|
348
|
-
reasoningAsContent: false,
|
|
349
140
|
defaultMaxTokens: 16384,
|
|
350
141
|
supportsVision: false
|
|
351
142
|
}
|
|
@@ -356,8 +147,6 @@ var MODEL_PROFILES = [
|
|
|
356
147
|
name: "Gemma 4",
|
|
357
148
|
temperature: 0.7,
|
|
358
149
|
topP: 0.9,
|
|
359
|
-
supportsReasoning: true,
|
|
360
|
-
reasoningAsContent: false,
|
|
361
150
|
defaultMaxTokens: 16384,
|
|
362
151
|
supportsVision: true
|
|
363
152
|
}
|
|
@@ -379,6 +168,53 @@ function modelSupportsVision(modelName) {
|
|
|
379
168
|
return getModelProfile(modelName).supportsVision;
|
|
380
169
|
}
|
|
381
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
|
+
|
|
382
218
|
// src/server/llm/client-pure.ts
|
|
383
219
|
function buildModelParams(params) {
|
|
384
220
|
return {
|
|
@@ -408,7 +244,14 @@ function convertToolCalls(toolCalls) {
|
|
|
408
244
|
}
|
|
409
245
|
}));
|
|
410
246
|
}
|
|
411
|
-
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) {
|
|
412
255
|
const result = {
|
|
413
256
|
role: "assistant",
|
|
414
257
|
content: msg.content || null
|
|
@@ -417,7 +260,7 @@ function buildAssistantMessage(msg) {
|
|
|
417
260
|
result["tool_calls"] = convertToolCalls(msg.toolCalls);
|
|
418
261
|
}
|
|
419
262
|
if (msg.thinkingContent) {
|
|
420
|
-
result["
|
|
263
|
+
result[thinkingField ?? "reasoning"] = msg.thinkingContent;
|
|
421
264
|
}
|
|
422
265
|
return result;
|
|
423
266
|
}
|
|
@@ -433,7 +276,7 @@ function convertAttachmentSync(attachment, modelSupportsVision2) {
|
|
|
433
276
|
text: `[Image: ${attachment.filename || "image"}] (vision not supported, cannot describe)`
|
|
434
277
|
};
|
|
435
278
|
}
|
|
436
|
-
function convertMessages(messages, modelSupportsVision2) {
|
|
279
|
+
function convertMessages(messages, modelSupportsVision2, thinkingField) {
|
|
437
280
|
const filtered = messages.filter((msg) => {
|
|
438
281
|
return !(msg.role === "assistant" && !msg.content?.trim() && (!msg.toolCalls || msg.toolCalls.length === 0));
|
|
439
282
|
});
|
|
@@ -454,7 +297,7 @@ function convertMessages(messages, modelSupportsVision2) {
|
|
|
454
297
|
};
|
|
455
298
|
}
|
|
456
299
|
if (msg.role === "assistant") {
|
|
457
|
-
return buildAssistantMessage(msg);
|
|
300
|
+
return buildAssistantMessage(msg, thinkingField);
|
|
458
301
|
}
|
|
459
302
|
if (msg.role === "user" && msg.attachments && msg.attachments.length > 0) {
|
|
460
303
|
const content = buildAttachmentContent(msg.content, msg.attachments, modelSupportsVision2);
|
|
@@ -479,10 +322,10 @@ function convertTools(tools) {
|
|
|
479
322
|
}
|
|
480
323
|
}));
|
|
481
324
|
}
|
|
482
|
-
async function buildChatCompletionCreateParams(model, request, profile, capabilities,
|
|
325
|
+
async function buildChatCompletionCreateParams(model, request, profile, capabilities, reasoningEffort, isStreaming, thinkingField) {
|
|
483
326
|
const userVisionOverride = request.modelSettings?.supportsVision;
|
|
484
327
|
const modelSupportsVision2 = userVisionOverride ?? profile.supportsVision ?? false;
|
|
485
|
-
const convertedMessages = convertMessages(request.messages, modelSupportsVision2);
|
|
328
|
+
const convertedMessages = convertMessages(request.messages, modelSupportsVision2, thinkingField);
|
|
486
329
|
const temperature = request.modelSettings?.temperature ?? request.temperature ?? profile.temperature;
|
|
487
330
|
const maxTokens = request.modelSettings?.maxTokens ?? request.maxTokens ?? profile.defaultMaxTokens;
|
|
488
331
|
const topP = request.modelSettings?.topP ?? profile.topP;
|
|
@@ -502,23 +345,34 @@ async function buildChatCompletionCreateParams(model, request, profile, capabili
|
|
|
502
345
|
;
|
|
503
346
|
params["top_k"] = topK;
|
|
504
347
|
}
|
|
505
|
-
const
|
|
506
|
-
if (
|
|
348
|
+
const resolvedEffort = reasoningEffort ?? request.reasoningEffort;
|
|
349
|
+
if (resolvedEffort) {
|
|
507
350
|
;
|
|
508
|
-
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
|
+
}
|
|
509
362
|
}
|
|
510
363
|
const modelParams = buildModelParams({ temperature, topP, topK, maxTokens });
|
|
511
364
|
return { params, modelParams };
|
|
512
365
|
}
|
|
513
366
|
async function buildCreateParamsFromInput(input, isStreaming) {
|
|
514
|
-
const { model, request, profile, capabilities,
|
|
367
|
+
const { model, request, profile, capabilities, reasoningEffort, thinkingField } = input;
|
|
515
368
|
return buildChatCompletionCreateParams(
|
|
516
369
|
model,
|
|
517
370
|
request,
|
|
518
371
|
profile,
|
|
519
372
|
capabilities,
|
|
520
|
-
|
|
521
|
-
isStreaming
|
|
373
|
+
reasoningEffort,
|
|
374
|
+
isStreaming,
|
|
375
|
+
thinkingField
|
|
522
376
|
);
|
|
523
377
|
}
|
|
524
378
|
var buildNonStreamingCreateParams = (input) => buildCreateParamsFromInput(input, false);
|
|
@@ -537,20 +391,6 @@ function mapFinishReason(reason) {
|
|
|
537
391
|
return "stop";
|
|
538
392
|
}
|
|
539
393
|
}
|
|
540
|
-
function extractThinking(content) {
|
|
541
|
-
const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
|
|
542
|
-
let thinkingContent = "";
|
|
543
|
-
let cleanContent = content;
|
|
544
|
-
let match;
|
|
545
|
-
while ((match = thinkRegex.exec(content)) !== null) {
|
|
546
|
-
thinkingContent += match[1];
|
|
547
|
-
cleanContent = cleanContent.replace(match[0], "");
|
|
548
|
-
}
|
|
549
|
-
return {
|
|
550
|
-
content: cleanContent.trim(),
|
|
551
|
-
thinkingContent: thinkingContent.trim() || null
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
394
|
|
|
555
395
|
// src/server/llm/streaming.ts
|
|
556
396
|
async function* streamWithSegments(client, request) {
|
|
@@ -630,10 +470,9 @@ async function* streamWithSegments(client, request) {
|
|
|
630
470
|
const ttft = ((firstTokenTime ?? endTime) - startTime) / 1e3;
|
|
631
471
|
const completionTime = (endTime - (firstTokenTime ?? startTime)) / 1e3;
|
|
632
472
|
const { promptTokens, completionTokens } = response.usage;
|
|
633
|
-
const effectiveThinkingContent = thinkingContent || content === "" && response.reasoning_content || "";
|
|
634
473
|
return {
|
|
635
474
|
content,
|
|
636
|
-
thinkingContent
|
|
475
|
+
thinkingContent,
|
|
637
476
|
toolCalls,
|
|
638
477
|
response,
|
|
639
478
|
segments,
|
|
@@ -649,17 +488,13 @@ async function* streamWithSegments(client, request) {
|
|
|
649
488
|
export {
|
|
650
489
|
getModelProfile,
|
|
651
490
|
modelSupportsVision,
|
|
652
|
-
ensureVersionPrefix,
|
|
653
|
-
stripVersionPrefix,
|
|
654
|
-
buildModelsUrl,
|
|
655
491
|
getBackendCapabilities,
|
|
656
|
-
detectBackend,
|
|
657
492
|
getBackendDisplayName,
|
|
658
493
|
buildModelParams,
|
|
494
|
+
getThinking,
|
|
659
495
|
buildNonStreamingCreateParams,
|
|
660
496
|
buildStreamingCreateParams,
|
|
661
497
|
mapFinishReason,
|
|
662
|
-
extractThinking,
|
|
663
498
|
streamWithSegments
|
|
664
499
|
};
|
|
665
|
-
//# sourceMappingURL=chunk-
|
|
500
|
+
//# sourceMappingURL=chunk-FFEAEPJB.js.map
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
detectModel
|
|
3
|
-
} from "./chunk-UKTPL5ZG.js";
|
|
4
|
-
import {
|
|
5
|
-
detectBackend
|
|
6
|
-
} from "./chunk-VIIRNJDT.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
|