openfox 2.0.61 → 2.0.63
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 +14 -0
- package/dist/{chat-handler-6DRGMDXZ.js → chat-handler-WNARPARQ.js} +11 -11
- package/dist/{chunk-KX4C5Q5J.js → chunk-5OPZLQDV.js} +196 -114
- package/dist/{chunk-S5DWUGKZ.js → chunk-FGG4KRFX.js} +6 -6
- package/dist/{chunk-ZHSCXD75.js → chunk-IVJYQZSN.js} +65 -6
- package/dist/{chunk-LHTVTDQQ.js → chunk-N5JF4RYJ.js} +362 -92
- package/dist/{chunk-GJU35MDV.js → chunk-OESYKZCM.js} +2 -2
- package/dist/{chunk-JKLPWTUN.js → chunk-QBYQ7KDX.js} +9 -4
- package/dist/{chunk-NVPVDDQZ.js → chunk-QJ5FH5DP.js} +14 -10
- package/dist/{chunk-H774GQJW.js → chunk-RYIREJAW.js} +234 -40
- package/dist/{chunk-AA4G4DGK.js → chunk-W4PUAODY.js} +34 -44
- package/dist/{chunk-43UFGATL.js → chunk-WGAAQASA.js} +31 -9
- package/dist/{chunk-6VDCH5ML.js → chunk-X5YCWKNS.js} +4 -4
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{client-KRFGMNGN.js → client-LAKW7TA5.js} +3 -3
- package/dist/{compactor-Q33AJPCQ.js → compactor-I3N56PSJ.js} +4 -4
- package/dist/{config-GMQUPNBY.js → config-EUMVEFHU.js} +2 -2
- package/dist/{orchestrator-AHCSLBB3.js → orchestrator-OIBLY5QJ.js} +14 -14
- package/dist/package.json +6 -1
- package/dist/{processor-45VWLZIV.js → processor-27VCKRGB.js} +13 -12
- package/dist/protocol-Cq66hdDX.d.ts +375 -0
- package/dist/provider/index.d.ts +129 -0
- package/dist/provider/index.js +1 -0
- package/dist/{provider-LBYBC5AG.js → provider-GYOW4OWQ.js} +7 -9
- package/dist/{provider-manager-ABEUYU3K.js → provider-manager-HRHNF73A.js} +4 -5
- package/dist/{serve-V44O2QE6.js → serve-HB222ARV.js} +15 -16
- package/dist/server/index.d.ts +5 -87
- package/dist/server/index.js +12 -13
- package/dist/{server-JDB2QVKP.js → server-XDC7R2IX.js} +10 -14
- package/dist/shared/index.d.ts +3 -2
- package/dist/{tools-7QUMO5DJ.js → tools-W2FFSF4N.js} +7 -7
- package/dist/types-CDZakn7f.d.ts +89 -0
- package/dist/{protocol-J7khRG62.d.ts → types-akHmgvBk.d.ts} +17 -373
- package/dist/web/assets/{index-BGkyTfuQ.css → index-DvPmgi8F.css} +1 -1
- package/dist/web/assets/{index-CETZPQXr.js → index-bSaZSLjg.js} +74 -73
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +6 -1
- package/dist/chunk-M3RB4IF6.js +0 -114
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
COMPACTION_PROMPT,
|
|
3
3
|
createMessageStartEvent
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-X5YCWKNS.js";
|
|
5
5
|
import {
|
|
6
6
|
getCurrentWindowMessageOptions
|
|
7
7
|
} from "./chunk-AIJE3RYH.js";
|
|
@@ -31,4 +31,4 @@ export {
|
|
|
31
31
|
shouldCompact,
|
|
32
32
|
getCompactionTarget
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-OESYKZCM.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getModelProfile
|
|
3
|
+
} from "./chunk-V4IE7HJY.js";
|
|
1
4
|
import {
|
|
2
5
|
getBackendCapabilities
|
|
3
6
|
} from "./chunk-YHEQTVFV.js";
|
|
@@ -17,9 +20,6 @@ import {
|
|
|
17
20
|
import {
|
|
18
21
|
logger
|
|
19
22
|
} from "./chunk-K44MW7JJ.js";
|
|
20
|
-
import {
|
|
21
|
-
getModelProfile
|
|
22
|
-
} from "./chunk-V4IE7HJY.js";
|
|
23
23
|
|
|
24
24
|
// src/server/llm/client.ts
|
|
25
25
|
function createLLMClient(config, initialBackend = "unknown") {
|
|
@@ -162,6 +162,11 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
162
162
|
throw new Error(`LLM stream idle timeout: no chunks received for ${idleTimeout}ms`);
|
|
163
163
|
}
|
|
164
164
|
lastChunkTime = Date.now();
|
|
165
|
+
if (!Array.isArray(chunk?.choices)) {
|
|
166
|
+
const streamError = chunk?.error;
|
|
167
|
+
const errorMessage = typeof streamError === "string" ? streamError : streamError && typeof streamError === "object" && "message" in streamError && typeof streamError.message === "string" ? streamError.message : "Invalid LLM stream chunk: missing choices";
|
|
168
|
+
throw new LLMError(errorMessage);
|
|
169
|
+
}
|
|
165
170
|
responseId = chunk.id;
|
|
166
171
|
if (chunk.usage) {
|
|
167
172
|
usage = {
|
|
@@ -259,4 +264,4 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
259
264
|
export {
|
|
260
265
|
createLLMClient
|
|
261
266
|
};
|
|
262
|
-
//# sourceMappingURL=chunk-
|
|
267
|
+
//# sourceMappingURL=chunk-QBYQ7KDX.js.map
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createContextStateMessage,
|
|
3
|
-
createSessionStateMessage
|
|
4
|
-
} from "./chunk-F4PMNP7S.js";
|
|
5
|
-
import {
|
|
6
|
-
getPendingQuestionsForSession
|
|
7
|
-
} from "./chunk-EU3WWTFH.js";
|
|
8
1
|
import {
|
|
9
2
|
getEventStore,
|
|
10
3
|
getRuntimeConfig,
|
|
@@ -14,6 +7,13 @@ import {
|
|
|
14
7
|
buildMessagesFromStoredEvents,
|
|
15
8
|
foldPendingConfirmations
|
|
16
9
|
} from "./chunk-TMUBLQFC.js";
|
|
10
|
+
import {
|
|
11
|
+
createContextStateMessage,
|
|
12
|
+
createSessionStateMessage
|
|
13
|
+
} from "./chunk-F4PMNP7S.js";
|
|
14
|
+
import {
|
|
15
|
+
getPendingQuestionsForSession
|
|
16
|
+
} from "./chunk-EU3WWTFH.js";
|
|
17
17
|
import {
|
|
18
18
|
logger
|
|
19
19
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -127,11 +127,15 @@ async function generateSessionNameForSession(sessionId, userMessage, deps, signa
|
|
|
127
127
|
const prompt = SESSION_NAME_PROMPT.replace("{message}", userMessage);
|
|
128
128
|
try {
|
|
129
129
|
let client;
|
|
130
|
-
if (
|
|
130
|
+
if (providerConfig && deps.getLLMClientForProvider) {
|
|
131
|
+
const providerClient = deps.getLLMClientForProvider(providerConfig.providerId, providerConfig.model);
|
|
132
|
+
if (!providerClient) return;
|
|
133
|
+
client = providerClient;
|
|
134
|
+
} else if (deps.getLLMClient && providerConfig) {
|
|
131
135
|
client = deps.getLLMClient();
|
|
132
136
|
client.setModel(providerConfig.model);
|
|
133
137
|
} else if (providerConfig) {
|
|
134
|
-
const { createLLMClient } = await import("./client-
|
|
138
|
+
const { createLLMClient } = await import("./client-LAKW7TA5.js");
|
|
135
139
|
client = createLLMClient({
|
|
136
140
|
llm: {
|
|
137
141
|
baseUrl: providerConfig.baseUrl,
|
|
@@ -180,4 +184,4 @@ export {
|
|
|
180
184
|
buildRunChatTurnParams,
|
|
181
185
|
generateSessionNameForSession
|
|
182
186
|
};
|
|
183
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-QJ5FH5DP.js.map
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
clearModelCache
|
|
3
|
-
} from "./chunk-M3RB4IF6.js";
|
|
4
1
|
import {
|
|
5
2
|
createLLMClient
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QBYQ7KDX.js";
|
|
4
|
+
import {
|
|
5
|
+
getModelProfile
|
|
6
|
+
} from "./chunk-V4IE7HJY.js";
|
|
7
|
+
import {
|
|
8
|
+
getBackendCapabilities
|
|
9
|
+
} from "./chunk-YHEQTVFV.js";
|
|
7
10
|
import {
|
|
8
11
|
buildModelsUrl,
|
|
9
12
|
ensureVersionPrefix,
|
|
@@ -12,9 +15,150 @@ import {
|
|
|
12
15
|
import {
|
|
13
16
|
logger
|
|
14
17
|
} from "./chunk-K44MW7JJ.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
// src/server/providers/adapters/transport-client.ts
|
|
20
|
+
function createTransportLLMClient(provider, modelId, transport) {
|
|
21
|
+
let model = modelId;
|
|
22
|
+
let backend = provider.backend;
|
|
23
|
+
const profileFor = (id) => {
|
|
24
|
+
const base = getModelProfile(id);
|
|
25
|
+
const configured = provider.models.find((item) => item.id === id);
|
|
26
|
+
return {
|
|
27
|
+
...base,
|
|
28
|
+
...configured?.defaultTemperature !== void 0 && { temperature: configured.defaultTemperature },
|
|
29
|
+
...configured?.defaultTopP !== void 0 && { topP: configured.defaultTopP },
|
|
30
|
+
...configured?.defaultTopK !== void 0 && { topK: configured.defaultTopK },
|
|
31
|
+
...configured?.defaultMaxTokens !== void 0 && { defaultMaxTokens: configured.defaultMaxTokens },
|
|
32
|
+
...configured?.supportsVision !== void 0 && { supportsVision: configured.supportsVision }
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
let profile = profileFor(model);
|
|
36
|
+
void getBackendCapabilities(backend);
|
|
37
|
+
const context = () => {
|
|
38
|
+
const configured = provider.models.find((item) => item.id === model);
|
|
39
|
+
return {
|
|
40
|
+
providerId: provider.id,
|
|
41
|
+
model: configured?.apiModelId ?? model,
|
|
42
|
+
catalogModel: model,
|
|
43
|
+
...configured?.requestBody && { requestBody: configured.requestBody },
|
|
44
|
+
...provider.credentialRef && { credentialRef: provider.credentialRef }
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
getModel: () => model,
|
|
49
|
+
setModel(next) {
|
|
50
|
+
model = next;
|
|
51
|
+
profile = profileFor(next);
|
|
52
|
+
},
|
|
53
|
+
getProfile: () => profile,
|
|
54
|
+
getBackend: () => backend,
|
|
55
|
+
setBackend(next) {
|
|
56
|
+
backend = next;
|
|
57
|
+
},
|
|
58
|
+
complete: (request) => transport.complete(request, context()),
|
|
59
|
+
stream: (request) => transport.stream(request, context())
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/server/llm/models.ts
|
|
64
|
+
var modelCache = /* @__PURE__ */ new Map();
|
|
65
|
+
var llmStatus = "unknown";
|
|
66
|
+
var lastActiveUrl = null;
|
|
67
|
+
var CACHE_TTL_MS = 3e4;
|
|
68
|
+
function getCacheKey(url) {
|
|
69
|
+
return stripVersionPrefix(url);
|
|
70
|
+
}
|
|
71
|
+
async function detectModel(llmBaseUrl, retries = 3, silent = false) {
|
|
72
|
+
const cacheKey = getCacheKey(llmBaseUrl);
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const cached = modelCache.get(cacheKey);
|
|
75
|
+
if (cached && now - cached.timestamp < CACHE_TTL_MS) {
|
|
76
|
+
lastActiveUrl = cacheKey;
|
|
77
|
+
llmStatus = "connected";
|
|
78
|
+
return cached.model;
|
|
79
|
+
}
|
|
80
|
+
const url = buildModelsUrl(llmBaseUrl);
|
|
81
|
+
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
82
|
+
try {
|
|
83
|
+
if (silent) {
|
|
84
|
+
logger.debug("Fetching models from LLM server", { url, attempt });
|
|
85
|
+
}
|
|
86
|
+
const response = await fetch(url, {
|
|
87
|
+
signal: AbortSignal.timeout(1e4)
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
if (silent) {
|
|
91
|
+
logger.debug("Failed to fetch models from LLM server", { status: response.status, attempt });
|
|
92
|
+
} else {
|
|
93
|
+
logger.warn("Failed to fetch models from LLM server", { status: response.status, attempt });
|
|
94
|
+
}
|
|
95
|
+
if (attempt < retries) {
|
|
96
|
+
await new Promise((r) => setTimeout(r, 1e3 * attempt));
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
llmStatus = "disconnected";
|
|
100
|
+
return cached?.model ?? null;
|
|
101
|
+
}
|
|
102
|
+
const data = await response.json();
|
|
103
|
+
if (data.data && data.data.length > 0) {
|
|
104
|
+
const modelData = data.data[0];
|
|
105
|
+
const modelId = modelData.id;
|
|
106
|
+
modelCache.set(cacheKey, {
|
|
107
|
+
model: modelId,
|
|
108
|
+
modelInfo: modelData,
|
|
109
|
+
timestamp: now
|
|
110
|
+
});
|
|
111
|
+
lastActiveUrl = cacheKey;
|
|
112
|
+
llmStatus = "connected";
|
|
113
|
+
if (silent) {
|
|
114
|
+
logger.debug("Detected LLM model", {
|
|
115
|
+
model: modelId,
|
|
116
|
+
maxLen: modelData.max_model_len,
|
|
117
|
+
root: modelData.root
|
|
118
|
+
});
|
|
119
|
+
} else {
|
|
120
|
+
logger.info("Detected LLM model", {
|
|
121
|
+
model: modelId,
|
|
122
|
+
maxLen: modelData.max_model_len,
|
|
123
|
+
root: modelData.root
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return modelId;
|
|
127
|
+
}
|
|
128
|
+
if (silent) {
|
|
129
|
+
logger.debug("LLM server returned empty models list");
|
|
130
|
+
} else {
|
|
131
|
+
logger.warn("LLM server returned empty models list");
|
|
132
|
+
}
|
|
133
|
+
llmStatus = "disconnected";
|
|
134
|
+
return null;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
137
|
+
if (silent) {
|
|
138
|
+
logger.debug("Could not detect model from LLM server", { error: errMsg, attempt });
|
|
139
|
+
} else {
|
|
140
|
+
logger.warn("Could not detect model from LLM server", { error: errMsg, attempt });
|
|
141
|
+
}
|
|
142
|
+
if (attempt < retries) {
|
|
143
|
+
await new Promise((r) => setTimeout(r, 1e3 * attempt));
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
llmStatus = "disconnected";
|
|
149
|
+
return cached?.model ?? null;
|
|
150
|
+
}
|
|
151
|
+
function getLlmStatus() {
|
|
152
|
+
return llmStatus;
|
|
153
|
+
}
|
|
154
|
+
function clearModelCache(url) {
|
|
155
|
+
if (url) {
|
|
156
|
+
modelCache.delete(getCacheKey(url));
|
|
157
|
+
} else {
|
|
158
|
+
modelCache.clear();
|
|
159
|
+
}
|
|
160
|
+
llmStatus = "unknown";
|
|
161
|
+
}
|
|
18
162
|
|
|
19
163
|
// src/server/provider-manager.ts
|
|
20
164
|
function normalizeModelId(s) {
|
|
@@ -54,19 +198,21 @@ function enrichWithProfileDefaults(model) {
|
|
|
54
198
|
defaultMaxTokens: profile.defaultMaxTokens
|
|
55
199
|
};
|
|
56
200
|
}
|
|
57
|
-
function mergeModelsWithUserOverrides(backendModels, userModels) {
|
|
201
|
+
function mergeModelsWithUserOverrides(backendModels, userModels, preserveMissingUserModels = true) {
|
|
58
202
|
const normalizedUserIdMap = new Map(userModels.map((m) => [normalizeModelId(m.id), m]));
|
|
59
203
|
const updatedModels = backendModels.map((backendModel) => {
|
|
60
204
|
const existingUserModel = normalizedUserIdMap.get(normalizeModelId(backendModel.id));
|
|
61
205
|
if (existingUserModel) {
|
|
62
|
-
return enrichWithProfileDefaults({ ...existingUserModel, id: backendModel.id });
|
|
206
|
+
return enrichWithProfileDefaults({ ...backendModel, ...existingUserModel, id: backendModel.id });
|
|
63
207
|
}
|
|
64
208
|
return enrichWithProfileDefaults(backendModel);
|
|
65
209
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
210
|
+
if (preserveMissingUserModels) {
|
|
211
|
+
const normalizedBackendIds = new Set(backendModels.map((m) => normalizeModelId(m.id)));
|
|
212
|
+
for (const userModel of userModels) {
|
|
213
|
+
if (!normalizedBackendIds.has(normalizeModelId(userModel.id))) {
|
|
214
|
+
updatedModels.push(enrichWithProfileDefaults(userModel));
|
|
215
|
+
}
|
|
70
216
|
}
|
|
71
217
|
}
|
|
72
218
|
return updatedModels;
|
|
@@ -214,7 +360,7 @@ function parseDefaultModelSelection(selection) {
|
|
|
214
360
|
model: selection.substring(slashIndex + 1)
|
|
215
361
|
};
|
|
216
362
|
}
|
|
217
|
-
function createProviderManager(config) {
|
|
363
|
+
function createProviderManager(config, options = {}) {
|
|
218
364
|
let providers = [...config.providers ?? []];
|
|
219
365
|
providers = providers.map((p) => ({ ...p, models: p.models.map((m) => enrichWithProfileDefaults(m)) }));
|
|
220
366
|
let defaultModelSelection = config.defaultModelSelection;
|
|
@@ -252,14 +398,56 @@ function createProviderManager(config) {
|
|
|
252
398
|
}
|
|
253
399
|
};
|
|
254
400
|
}
|
|
401
|
+
function resolveTransportAdapter(provider) {
|
|
402
|
+
if (provider.transportAdapter) return provider.transportAdapter;
|
|
403
|
+
return void 0;
|
|
404
|
+
}
|
|
405
|
+
function resolveProviderModel(provider, requestedModel) {
|
|
406
|
+
if (requestedModel && requestedModel !== "auto") return requestedModel;
|
|
407
|
+
const activeSelection = parseDefaultModelSelection(defaultModelSelection);
|
|
408
|
+
if (activeSelection.providerId === provider.id) {
|
|
409
|
+
const activeClientModel = llmClient.getModel();
|
|
410
|
+
if (activeClientModel && activeClientModel !== "auto" && provider.models.some((m) => m.id === activeClientModel)) {
|
|
411
|
+
return activeClientModel;
|
|
412
|
+
}
|
|
413
|
+
if (activeSelection.model && activeSelection.model !== "auto" && provider.models.some((m) => m.id === activeSelection.model)) {
|
|
414
|
+
return activeSelection.model;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return provider.models.find((m) => m.selected)?.id ?? provider.models[0]?.id ?? requestedModel ?? "auto";
|
|
418
|
+
}
|
|
419
|
+
function createClientForProvider(provider, model) {
|
|
420
|
+
const resolvedModel = resolveProviderModel(provider, model);
|
|
421
|
+
const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
|
|
422
|
+
return transport ? createTransportLLMClient(provider, resolvedModel, transport) : createLLMClient(createConfigForProvider(provider, resolvedModel));
|
|
423
|
+
}
|
|
424
|
+
async function fetchProviderModels(provider) {
|
|
425
|
+
const transport = options.adapters?.getTransport(resolveTransportAdapter(provider));
|
|
426
|
+
if (transport) {
|
|
427
|
+
return transport.listModels({
|
|
428
|
+
providerId: provider.id,
|
|
429
|
+
...provider.credentialRef && { credentialRef: provider.credentialRef }
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
const backend = provider.backend;
|
|
433
|
+
return fetchModelsWithContext(provider.url, provider.apiKey, backend);
|
|
434
|
+
}
|
|
255
435
|
const { providerId: activeProviderId, model: activeModel } = parseDefaultModelSelection(defaultModelSelection);
|
|
256
436
|
if (activeProviderId && activeModel) {
|
|
257
437
|
const activeProvider = providers.find((p) => p.id === activeProviderId);
|
|
258
438
|
if (activeProvider) {
|
|
259
|
-
llmClient =
|
|
439
|
+
llmClient = createClientForProvider(activeProvider, activeModel);
|
|
260
440
|
}
|
|
261
441
|
}
|
|
262
442
|
return {
|
|
443
|
+
createClient(providerId, model) {
|
|
444
|
+
const provider = providers.find((p) => p.id === providerId);
|
|
445
|
+
return provider ? createClientForProvider(provider, model) : void 0;
|
|
446
|
+
},
|
|
447
|
+
resolveModel(providerId, model) {
|
|
448
|
+
const provider = providers.find((p) => p.id === providerId);
|
|
449
|
+
return provider ? resolveProviderModel(provider, model) : void 0;
|
|
450
|
+
},
|
|
263
451
|
getProviders() {
|
|
264
452
|
return providers.map((p) => ({
|
|
265
453
|
...p,
|
|
@@ -282,18 +470,16 @@ function createProviderManager(config) {
|
|
|
282
470
|
getLLMClient() {
|
|
283
471
|
return llmClient;
|
|
284
472
|
},
|
|
285
|
-
async activateProvider(providerId,
|
|
473
|
+
async activateProvider(providerId, options2) {
|
|
286
474
|
const provider = providers.find((p) => p.id === providerId);
|
|
287
475
|
if (!provider) {
|
|
288
476
|
return { success: false, error: "Provider not found" };
|
|
289
477
|
}
|
|
290
478
|
const currentModel = parseDefaultModelSelection(defaultModelSelection).model;
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const isModelSwitch = providerId === parseDefaultModelSelection(defaultModelSelection).providerId && options?.model && options.model !== currentModel;
|
|
296
|
-
if (providerId === parseDefaultModelSelection(defaultModelSelection).providerId && !isModelSwitch) {
|
|
479
|
+
const targetModel = resolveProviderModel(provider, options2?.model ?? currentModel);
|
|
480
|
+
const isModelSwitch = providerId === parseDefaultModelSelection(defaultModelSelection).providerId && options2?.model && options2.model !== currentModel;
|
|
481
|
+
if (providerId === parseDefaultModelSelection(defaultModelSelection).providerId && !isModelSwitch && llmClient.getModel() === targetModel) {
|
|
482
|
+
if (currentModel !== targetModel) defaultModelSelection = `${providerId}/${targetModel}`;
|
|
297
483
|
return { success: true };
|
|
298
484
|
}
|
|
299
485
|
logger.info("Switching provider", {
|
|
@@ -303,8 +489,7 @@ function createProviderManager(config) {
|
|
|
303
489
|
url: provider.url,
|
|
304
490
|
model: targetModel
|
|
305
491
|
});
|
|
306
|
-
const
|
|
307
|
-
const newClient = createLLMClient(providerConfig);
|
|
492
|
+
const newClient = createClientForProvider(provider, targetModel);
|
|
308
493
|
try {
|
|
309
494
|
const cacheUrl = stripVersionPrefix(provider.url);
|
|
310
495
|
clearModelCache(cacheUrl);
|
|
@@ -315,7 +500,7 @@ function createProviderManager(config) {
|
|
|
315
500
|
url: provider.url,
|
|
316
501
|
backend
|
|
317
502
|
});
|
|
318
|
-
const modelsWithContext = await
|
|
503
|
+
const modelsWithContext = await fetchProviderModels(provider);
|
|
319
504
|
const userModels = provider.models.filter((m) => m.source === "user");
|
|
320
505
|
logger.debug("activateProvider", {
|
|
321
506
|
providerId,
|
|
@@ -323,7 +508,11 @@ function createProviderManager(config) {
|
|
|
323
508
|
userModelsCount: userModels.length
|
|
324
509
|
});
|
|
325
510
|
if (modelsWithContext.length > 0) {
|
|
326
|
-
const updatedModels = mergeModelsWithUserOverrides(
|
|
511
|
+
const updatedModels = mergeModelsWithUserOverrides(
|
|
512
|
+
modelsWithContext,
|
|
513
|
+
userModels,
|
|
514
|
+
!resolveTransportAdapter(provider)
|
|
515
|
+
);
|
|
327
516
|
providers = providers.map((p) => p.id === providerId ? { ...p, models: updatedModels } : p);
|
|
328
517
|
} else if (userModels.length > 0) {
|
|
329
518
|
logger.debug("Backend unavailable during provider switch, preserving user models", {
|
|
@@ -389,22 +578,22 @@ function createProviderManager(config) {
|
|
|
389
578
|
return true;
|
|
390
579
|
},
|
|
391
580
|
setProviders(newProviders, newDefaultModelSelection) {
|
|
392
|
-
const wasActiveProviderId = this.getActiveProviderId();
|
|
393
581
|
providers = [...newProviders];
|
|
394
582
|
defaultModelSelection = newDefaultModelSelection;
|
|
395
583
|
providerStatus.clear();
|
|
396
584
|
for (const p of providers) {
|
|
397
585
|
providerStatus.set(p.id, "unknown");
|
|
398
586
|
}
|
|
399
|
-
const
|
|
400
|
-
if (
|
|
401
|
-
const activeProvider = providers.find((p) => p.id ===
|
|
587
|
+
const activeProviderId2 = this.getActiveProviderId();
|
|
588
|
+
if (activeProviderId2) {
|
|
589
|
+
const activeProvider = providers.find((p) => p.id === activeProviderId2);
|
|
402
590
|
if (activeProvider) {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
591
|
+
llmClient = createClientForProvider(activeProvider, this.getCurrentModel());
|
|
592
|
+
logger.info("setProviders: recreated LLM client for active provider", {
|
|
593
|
+
providerId: activeProviderId2,
|
|
594
|
+
url: activeProvider.url,
|
|
595
|
+
hasCredential: Boolean(activeProvider.credentialRef),
|
|
596
|
+
transportAdapter: resolveTransportAdapter(activeProvider)
|
|
408
597
|
});
|
|
409
598
|
}
|
|
410
599
|
}
|
|
@@ -420,8 +609,7 @@ function createProviderManager(config) {
|
|
|
420
609
|
if (provider.models && provider.models.length > 0) {
|
|
421
610
|
return provider.models;
|
|
422
611
|
}
|
|
423
|
-
|
|
424
|
-
return fetchModelsWithContext(provider.url, provider.apiKey, backend);
|
|
612
|
+
return fetchProviderModels(provider);
|
|
425
613
|
},
|
|
426
614
|
async setDefaultModelSelection(providerId, model) {
|
|
427
615
|
const provider = providers.find((p) => p.id === providerId);
|
|
@@ -559,7 +747,7 @@ function createProviderManager(config) {
|
|
|
559
747
|
url: provider.url,
|
|
560
748
|
backend
|
|
561
749
|
});
|
|
562
|
-
const modelsWithContext = await
|
|
750
|
+
const modelsWithContext = await fetchProviderModels(provider);
|
|
563
751
|
const userModels = provider.models.filter((m) => m.source === "user");
|
|
564
752
|
logger.info("refreshProviderModels", {
|
|
565
753
|
providerId,
|
|
@@ -579,7 +767,11 @@ function createProviderManager(config) {
|
|
|
579
767
|
return { success: false, error: "No models returned from backend" };
|
|
580
768
|
}
|
|
581
769
|
providerStatus.set(providerId, "connected");
|
|
582
|
-
const updatedModels = mergeModelsWithUserOverrides(
|
|
770
|
+
const updatedModels = mergeModelsWithUserOverrides(
|
|
771
|
+
modelsWithContext,
|
|
772
|
+
userModels,
|
|
773
|
+
!resolveTransportAdapter(provider)
|
|
774
|
+
);
|
|
583
775
|
providers = providers.map((p) => p.id === providerId ? { ...p, models: updatedModels } : p);
|
|
584
776
|
const { providerId: currentProviderId, model: currentModel } = parseDefaultModelSelection(defaultModelSelection);
|
|
585
777
|
if (currentProviderId === providerId && currentModel) {
|
|
@@ -597,9 +789,11 @@ function createProviderManager(config) {
|
|
|
597
789
|
}
|
|
598
790
|
|
|
599
791
|
export {
|
|
792
|
+
detectModel,
|
|
793
|
+
getLlmStatus,
|
|
600
794
|
fetchAvailableModelsFromBackend,
|
|
601
795
|
fetchModelsWithContext,
|
|
602
796
|
parseDefaultModelSelection,
|
|
603
797
|
createProviderManager
|
|
604
798
|
};
|
|
605
|
-
//# sourceMappingURL=chunk-
|
|
799
|
+
//# sourceMappingURL=chunk-RYIREJAW.js.map
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
|
+
appendCompactionPrompt
|
|
3
|
+
} from "./chunk-OESYKZCM.js";
|
|
4
|
+
import {
|
|
5
|
+
applyDynamicContext,
|
|
6
|
+
computeSessionHash,
|
|
2
7
|
injectWorkflowKickoffIfNeeded,
|
|
3
8
|
runAgentTurn,
|
|
4
9
|
runChatTurn
|
|
5
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-IVJYQZSN.js";
|
|
6
11
|
import {
|
|
7
|
-
applyDynamicContext,
|
|
8
12
|
checkAborted,
|
|
9
|
-
computeSessionHash,
|
|
10
13
|
deleteItemFromDir,
|
|
11
14
|
devServerManager,
|
|
12
15
|
executeSubAgent,
|
|
@@ -16,11 +19,20 @@ import {
|
|
|
16
19
|
loadAllAgentsDefault,
|
|
17
20
|
saveItemToDir,
|
|
18
21
|
spawnShellProcess
|
|
19
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-5OPZLQDV.js";
|
|
23
|
+
import {
|
|
24
|
+
TurnMetrics,
|
|
25
|
+
createMessageStartEvent
|
|
26
|
+
} from "./chunk-X5YCWKNS.js";
|
|
20
27
|
import {
|
|
21
28
|
getPlatformShell,
|
|
22
29
|
onProcessEvent
|
|
23
30
|
} from "./chunk-BGTEIA2S.js";
|
|
31
|
+
import {
|
|
32
|
+
getCurrentContextWindowId,
|
|
33
|
+
getEventStore,
|
|
34
|
+
getRuntimeConfig
|
|
35
|
+
} from "./chunk-AIJE3RYH.js";
|
|
24
36
|
import {
|
|
25
37
|
createChatErrorMessage,
|
|
26
38
|
createChatMessageMessage,
|
|
@@ -38,24 +50,6 @@ import {
|
|
|
38
50
|
import {
|
|
39
51
|
provideAnswer
|
|
40
52
|
} from "./chunk-EU3WWTFH.js";
|
|
41
|
-
import {
|
|
42
|
-
appendCompactionPrompt
|
|
43
|
-
} from "./chunk-GJU35MDV.js";
|
|
44
|
-
import {
|
|
45
|
-
TurnMetrics,
|
|
46
|
-
createMessageStartEvent
|
|
47
|
-
} from "./chunk-6VDCH5ML.js";
|
|
48
|
-
import {
|
|
49
|
-
getCurrentContextWindowId,
|
|
50
|
-
getEventStore,
|
|
51
|
-
getRuntimeConfig
|
|
52
|
-
} from "./chunk-AIJE3RYH.js";
|
|
53
|
-
import {
|
|
54
|
-
createLLMClient
|
|
55
|
-
} from "./chunk-JKLPWTUN.js";
|
|
56
|
-
import {
|
|
57
|
-
ensureVersionPrefix
|
|
58
|
-
} from "./chunk-HNCM3D7Y.js";
|
|
59
53
|
import {
|
|
60
54
|
logger
|
|
61
55
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -1385,7 +1379,7 @@ function processQueueAndRestartTurn(sessionManager, sessionId, drainFn, queueMod
|
|
|
1385
1379
|
var activeAgents = /* @__PURE__ */ new Map();
|
|
1386
1380
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
1387
1381
|
var MAX_SEND_QUEUE_SIZE = 1e3;
|
|
1388
|
-
function createWebSocketServer(httpServer,
|
|
1382
|
+
function createWebSocketServer(httpServer, _config, getLLMClient, getActiveProvider, sessionManager, providerManager) {
|
|
1389
1383
|
const wss = new WebSocketServer({ server: httpServer });
|
|
1390
1384
|
const clients = /* @__PURE__ */ new Map();
|
|
1391
1385
|
moduleClients = clients;
|
|
@@ -1395,7 +1389,9 @@ function createWebSocketServer(httpServer, config, getLLMClient, getActiveProvid
|
|
|
1395
1389
|
if (!session?.providerId || !session?.providerModel || !providerManager) {
|
|
1396
1390
|
return getLLMClient();
|
|
1397
1391
|
}
|
|
1398
|
-
const
|
|
1392
|
+
const resolvedModel = providerManager.resolveModel(session.providerId, session.providerModel);
|
|
1393
|
+
const effectiveModel = resolvedModel ?? session.providerModel;
|
|
1394
|
+
const cacheKey = `${session.providerId}:${effectiveModel}`;
|
|
1399
1395
|
const cached = sessionLLMClients.get(sessionId);
|
|
1400
1396
|
if (cached && cached.key === cacheKey) {
|
|
1401
1397
|
return cached.client;
|
|
@@ -1410,26 +1406,20 @@ function createWebSocketServer(httpServer, config, getLLMClient, getActiveProvid
|
|
|
1410
1406
|
sessionLLMClients.delete(sessionId);
|
|
1411
1407
|
return getLLMClient();
|
|
1412
1408
|
}
|
|
1413
|
-
const
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
}
|
|
1426
|
-
};
|
|
1427
|
-
const client = createLLMClient(sessionConfig);
|
|
1428
|
-
if (provider.backend !== "unknown") {
|
|
1429
|
-
client.setBackend(provider.backend);
|
|
1409
|
+
const client = providerManager.createClient(session.providerId, effectiveModel);
|
|
1410
|
+
if (!client) {
|
|
1411
|
+
logger.warn("Could not create session provider client, falling back to global", {
|
|
1412
|
+
sessionId,
|
|
1413
|
+
providerId: session.providerId,
|
|
1414
|
+
model: session.providerModel
|
|
1415
|
+
});
|
|
1416
|
+
return getLLMClient();
|
|
1417
|
+
}
|
|
1418
|
+
const concreteModel = client.getModel();
|
|
1419
|
+
if (session.providerModel !== concreteModel) {
|
|
1420
|
+
sessionManager.setSessionProvider(sessionId, session.providerId, concreteModel);
|
|
1430
1421
|
}
|
|
1431
|
-
|
|
1432
|
-
sessionLLMClients.set(sessionId, { key: cacheKey, client });
|
|
1422
|
+
sessionLLMClients.set(sessionId, { key: `${session.providerId}:${concreteModel}`, client });
|
|
1433
1423
|
return client;
|
|
1434
1424
|
}
|
|
1435
1425
|
function getSessionStatsIdentity(sessionId) {
|
|
@@ -2102,4 +2092,4 @@ export {
|
|
|
2102
2092
|
signalMcpReady,
|
|
2103
2093
|
createWebSocketServer
|
|
2104
2094
|
};
|
|
2105
|
-
//# sourceMappingURL=chunk-
|
|
2095
|
+
//# sourceMappingURL=chunk-W4PUAODY.js.map
|
|
@@ -38,15 +38,37 @@ var modelConfigSchema = z.object({
|
|
|
38
38
|
}).passthrough();
|
|
39
39
|
var providerSchema = z.object({
|
|
40
40
|
id: z.string(),
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
preset: z.string().optional(),
|
|
42
|
+
name: z.string().optional(),
|
|
43
|
+
url: z.string().optional(),
|
|
44
|
+
backend: backendSchema.optional(),
|
|
44
45
|
apiKey: z.string().optional(),
|
|
45
|
-
models: z.array(modelConfigSchema).
|
|
46
|
-
isActive: z.boolean(),
|
|
47
|
-
createdAt: z.string(),
|
|
48
|
-
isLocal: z.boolean().optional()
|
|
49
|
-
|
|
46
|
+
models: z.array(modelConfigSchema).optional(),
|
|
47
|
+
isActive: z.boolean().optional(),
|
|
48
|
+
createdAt: z.string().optional(),
|
|
49
|
+
isLocal: z.boolean().optional(),
|
|
50
|
+
thinkingField: z.string().optional(),
|
|
51
|
+
authAdapter: z.string().optional(),
|
|
52
|
+
transportAdapter: z.string().optional(),
|
|
53
|
+
credentialRef: z.string().optional()
|
|
54
|
+
}).transform(
|
|
55
|
+
(provider) => ({
|
|
56
|
+
id: provider.id,
|
|
57
|
+
...provider.preset ? { preset: provider.preset } : {},
|
|
58
|
+
name: provider.name ?? provider.id,
|
|
59
|
+
url: provider.url ?? "",
|
|
60
|
+
backend: provider.backend ?? "unknown",
|
|
61
|
+
...provider.apiKey ? { apiKey: provider.apiKey } : {},
|
|
62
|
+
models: provider.models ?? [],
|
|
63
|
+
isActive: provider.isActive ?? false,
|
|
64
|
+
createdAt: provider.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
65
|
+
...provider.isLocal !== void 0 ? { isLocal: provider.isLocal } : {},
|
|
66
|
+
...provider.thinkingField ? { thinkingField: provider.thinkingField } : {},
|
|
67
|
+
...provider.authAdapter ? { authAdapter: provider.authAdapter } : {},
|
|
68
|
+
...provider.transportAdapter ? { transportAdapter: provider.transportAdapter } : {},
|
|
69
|
+
...provider.credentialRef ? { credentialRef: provider.credentialRef } : {}
|
|
70
|
+
})
|
|
71
|
+
);
|
|
50
72
|
var serverSchema = z.object({
|
|
51
73
|
port: z.number().default(10369),
|
|
52
74
|
host: z.string().default("127.0.0.1"),
|
|
@@ -291,4 +313,4 @@ export {
|
|
|
291
313
|
removeProvider,
|
|
292
314
|
activateProvider
|
|
293
315
|
};
|
|
294
|
-
//# sourceMappingURL=chunk-
|
|
316
|
+
//# sourceMappingURL=chunk-WGAAQASA.js.map
|