openfox 2.0.0-beta.1 → 2.0.0-beta.10
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/dist/agent-defaults/code-reviewer.agent.md +2 -1
- package/dist/{chat-handler-IVIWOR3D.js → chat-handler-6COBLIDR.js} +14 -27
- package/dist/{chunk-CEZNMLOO.js → chunk-7TTEGAO6.js} +12 -13
- package/dist/{chunk-4U4CSRBE.js → chunk-BE2S4NJX.js} +6 -6
- package/dist/{chunk-FQLK5GL5.js → chunk-BVHFMAVN.js} +1 -1
- package/dist/{chunk-UFY4I643.js → chunk-C75I2KZM.js} +135 -147
- package/dist/{chunk-QFSSKIQ3.js → chunk-CDDMHSZF.js} +4 -4
- package/dist/{chunk-RF2JGDSS.js → chunk-DMH6JVPF.js} +13 -10
- package/dist/{chunk-NNEHZT3V.js → chunk-EZUR7OEP.js} +11 -3
- package/dist/{chunk-ZLUBZ4K4.js → chunk-G4SACK4E.js} +221 -104
- package/dist/{chunk-ALH4KM2Y.js → chunk-LR5R7EEE.js} +2962 -3249
- package/dist/{chunk-XKR3HCAL.js → chunk-NPHYEUYE.js} +128 -34
- package/dist/{chunk-PSJIT5LZ.js → chunk-RFNEDBVO.js} +4 -4
- package/dist/chunk-RI6GAMNP.js +13 -0
- package/dist/{chunk-HHAJ3QF6.js → chunk-UKTPL5ZG.js} +16 -28
- package/dist/{chunk-HGAMIPFO.js → chunk-VIIRNJDT.js} +39 -178
- package/dist/{chunk-NONI4CRP.js → chunk-XJEOP6XU.js} +5 -32
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/compactor-TDNRM3A7.js +9 -0
- package/dist/{config-YU7NYZYG.js → config-TDVA7MQN.js} +9 -8
- package/dist/{events-OHJWCI3S.js → events-PQ3KTI5H.js} +8 -7
- package/dist/{folding-U6UHQAS5.js → folding-CXORTBAU.js} +2 -2
- package/dist/{orchestrator-7ZXM4J22.js → orchestrator-ZNGTMZ7W.js} +18 -22
- package/dist/package.json +1 -1
- package/dist/{processor-TKBJLQ2N.js → processor-WMAU4C2N.js} +8 -9
- package/dist/{protocol-BQ12Aw5J.d.ts → protocol-CDOV1pyc.d.ts} +13 -38
- package/dist/{protocol-K62EPEGS.js → protocol-CN24IKQN.js} +3 -5
- package/dist/{provider-HTJEB3ON.js → provider-BGH4MBLH.js} +25 -10
- package/dist/{serve-5KA6SSSP.js → serve-7VMTNIXT.js} +25 -26
- package/dist/server/index.d.ts +1 -6
- package/dist/server/index.js +15 -16
- package/dist/{settings-VRAOAPLA.js → settings-6XX56F3F.js} +2 -2
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.js +1 -1
- package/dist/{tools-Z7X4HXZN.js → tools-CQGEU3JK.js} +11 -13
- package/dist/web/assets/index-BF6jgTAb.js +299 -0
- package/dist/web/assets/{index-BY8EbT5Z.css → index-CSOB8dwI.css} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/dist/workflow-defaults/default.workflow.json +9 -4
- package/package.json +1 -1
- package/dist/auto-compaction-UIWTO3H5.js +0 -27
- package/dist/chunk-CGZHLM3K.js +0 -70
- package/dist/chunk-SZKEGZIB.js +0 -140
- package/dist/runtime-config-NPSPMRDA.js +0 -9
- package/dist/vision-fallback-3MIZZ6NQ.js +0 -22
- package/dist/web/assets/index-CqOJgw7l.js +0 -299
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getDatabase
|
|
3
|
-
} from "./chunk-FBGWG4N6.js";
|
|
4
1
|
import {
|
|
5
2
|
buildContextMessagesFromEventHistory,
|
|
6
3
|
buildMessagesFromStoredEvents,
|
|
7
4
|
buildSnapshot,
|
|
8
5
|
foldContextState,
|
|
9
6
|
foldSessionState,
|
|
10
|
-
spreadOptionalMessageFields
|
|
11
|
-
|
|
12
|
-
} from "./chunk-NONI4CRP.js";
|
|
7
|
+
spreadOptionalMessageFields
|
|
8
|
+
} from "./chunk-XJEOP6XU.js";
|
|
13
9
|
import {
|
|
14
|
-
|
|
15
|
-
} from "./chunk-
|
|
10
|
+
getDatabase
|
|
11
|
+
} from "./chunk-FBGWG4N6.js";
|
|
16
12
|
import {
|
|
17
13
|
logger
|
|
18
14
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -105,6 +101,18 @@ var EventStore = class {
|
|
|
105
101
|
CREATE INDEX IF NOT EXISTS idx_events_session_type
|
|
106
102
|
ON events(session_id, event_type)
|
|
107
103
|
`);
|
|
104
|
+
this.db.exec(`
|
|
105
|
+
CREATE TABLE IF NOT EXISTS tombstones (
|
|
106
|
+
session_id TEXT NOT NULL,
|
|
107
|
+
seq INTEGER NOT NULL,
|
|
108
|
+
timestamp INTEGER NOT NULL,
|
|
109
|
+
UNIQUE(session_id, seq)
|
|
110
|
+
)
|
|
111
|
+
`);
|
|
112
|
+
this.db.exec(`
|
|
113
|
+
CREATE INDEX IF NOT EXISTS idx_tombstones_session_seq
|
|
114
|
+
ON tombstones(session_id, seq)
|
|
115
|
+
`);
|
|
108
116
|
}
|
|
109
117
|
// --------------------------------------------------------------------------
|
|
110
118
|
// Append
|
|
@@ -183,10 +191,41 @@ var EventStore = class {
|
|
|
183
191
|
* Get all events for a session, optionally starting from a specific seq
|
|
184
192
|
*/
|
|
185
193
|
getEvents(sessionId, fromSeq) {
|
|
186
|
-
const query = fromSeq !== void 0 ? `SELECT
|
|
194
|
+
const query = fromSeq !== void 0 ? `SELECT e.* FROM events e
|
|
195
|
+
LEFT JOIN tombstones t ON e.session_id = t.session_id AND e.seq = t.seq
|
|
196
|
+
WHERE e.session_id = ? AND e.seq >= ? AND t.seq IS NULL
|
|
197
|
+
ORDER BY e.seq` : `SELECT e.* FROM events e
|
|
198
|
+
LEFT JOIN tombstones t ON e.session_id = t.session_id AND e.seq = t.seq
|
|
199
|
+
WHERE e.session_id = ? AND t.seq IS NULL
|
|
200
|
+
ORDER BY e.seq`;
|
|
187
201
|
const rows = fromSeq !== void 0 ? this.db.prepare(query).all(sessionId, fromSeq) : this.db.prepare(query).all(sessionId);
|
|
188
202
|
return rows.map((row) => this.rowToStoredEvent(row));
|
|
189
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Soft-delete (tombstone) events by sequence number.
|
|
206
|
+
* Tombstoned events are hidden from getEvents but remain in the database.
|
|
207
|
+
*
|
|
208
|
+
* @param sessionId - The session ID
|
|
209
|
+
* @param seqs - Array of sequence numbers to tombstone
|
|
210
|
+
* @returns The number of events tombstoned
|
|
211
|
+
*/
|
|
212
|
+
tombstoneEvents(sessionId, seqs) {
|
|
213
|
+
if (seqs.length === 0) return 0;
|
|
214
|
+
const timestamp = Date.now();
|
|
215
|
+
const insert = this.db.prepare(
|
|
216
|
+
`INSERT OR IGNORE INTO tombstones (session_id, seq, timestamp)
|
|
217
|
+
VALUES (?, ?, ?)`
|
|
218
|
+
);
|
|
219
|
+
let count = 0;
|
|
220
|
+
const transaction = this.db.transaction(() => {
|
|
221
|
+
for (const seq of seqs) {
|
|
222
|
+
const result = insert.run(sessionId, seq, timestamp);
|
|
223
|
+
count += result.changes;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
transaction();
|
|
227
|
+
return count;
|
|
228
|
+
}
|
|
190
229
|
/**
|
|
191
230
|
* Get the latest sequence number for a session
|
|
192
231
|
*/
|
|
@@ -375,13 +414,10 @@ var EventStore = class {
|
|
|
375
414
|
return result.changes;
|
|
376
415
|
}
|
|
377
416
|
/**
|
|
378
|
-
* One-time storage optimization: delete old snapshots
|
|
379
|
-
* promptContext.messages from remaining snapshots across all sessions.
|
|
417
|
+
* One-time storage optimization: delete old snapshots across all sessions.
|
|
380
418
|
* Safe to run multiple times (idempotent).
|
|
381
419
|
*/
|
|
382
420
|
optimizeStorage() {
|
|
383
|
-
let deletedSnapshots = 0;
|
|
384
|
-
let strippedSnapshots = 0;
|
|
385
421
|
const deleteResult = this.db.prepare(
|
|
386
422
|
`
|
|
387
423
|
DELETE FROM events
|
|
@@ -397,20 +433,7 @@ var EventStore = class {
|
|
|
397
433
|
)
|
|
398
434
|
`
|
|
399
435
|
).run();
|
|
400
|
-
deletedSnapshots
|
|
401
|
-
const snapshots = this.db.prepare(`SELECT id, payload FROM events WHERE event_type = 'turn.snapshot'`).all();
|
|
402
|
-
const updateStmt = this.db.prepare(`UPDATE events SET payload = ? WHERE id = ?`);
|
|
403
|
-
for (const row of snapshots) {
|
|
404
|
-
const data = JSON.parse(row.payload);
|
|
405
|
-
const messages = data.messages;
|
|
406
|
-
if (!messages) continue;
|
|
407
|
-
const changed = stripPromptContextMessages(messages);
|
|
408
|
-
if (changed) {
|
|
409
|
-
updateStmt.run(JSON.stringify(data), row.id);
|
|
410
|
-
strippedSnapshots++;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
return { deletedSnapshots, strippedSnapshots };
|
|
436
|
+
return { deletedSnapshots: deleteResult.changes };
|
|
414
437
|
}
|
|
415
438
|
/**
|
|
416
439
|
* Get the latest snapshot sequence number for a session
|
|
@@ -521,7 +544,7 @@ function initEventStore(db) {
|
|
|
521
544
|
}
|
|
522
545
|
resetStaleRunningSessions(eventStoreInstance, db);
|
|
523
546
|
const result = eventStoreInstance.optimizeStorage();
|
|
524
|
-
if (result.deletedSnapshots > 0
|
|
547
|
+
if (result.deletedSnapshots > 0) {
|
|
525
548
|
logger.info("Storage optimized", result);
|
|
526
549
|
}
|
|
527
550
|
setImmediate(() => {
|
|
@@ -808,6 +831,70 @@ function mapSessionSummaryRow(row) {
|
|
|
808
831
|
};
|
|
809
832
|
}
|
|
810
833
|
|
|
834
|
+
// src/server/config.ts
|
|
835
|
+
import { z } from "zod";
|
|
836
|
+
var backendSchema = z.enum(["auto", "vllm", "sglang", "ollama", "llamacpp"]).default("auto");
|
|
837
|
+
var envSchema = z.object({
|
|
838
|
+
// New env var name, with fallback to old name for backward compatibility
|
|
839
|
+
OPENFOX_LLM_URL: z.string().url().optional(),
|
|
840
|
+
OPENFOX_VLLM_URL: z.string().url().optional(),
|
|
841
|
+
OPENFOX_BACKEND: backendSchema,
|
|
842
|
+
OPENFOX_MODEL_NAME: z.string().default("qwen3.5-122b-int4-autoround"),
|
|
843
|
+
OPENFOX_MAX_CONTEXT: z.coerce.number().default(2e5),
|
|
844
|
+
OPENFOX_PORT: z.coerce.number().default(10369),
|
|
845
|
+
OPENFOX_HOST: z.string().optional(),
|
|
846
|
+
OPENFOX_WORKDIR: z.string().optional(),
|
|
847
|
+
OPENFOX_DB_PATH: z.string().default("./openfox.db"),
|
|
848
|
+
OPENFOX_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
849
|
+
OPENFOX_DISABLE_THINKING: z.coerce.boolean().default(false),
|
|
850
|
+
OPENFOX_DEV: z.coerce.boolean().default(false)
|
|
851
|
+
});
|
|
852
|
+
function loadConfig() {
|
|
853
|
+
const env = envSchema.parse(process.env);
|
|
854
|
+
const llmUrl = env.OPENFOX_LLM_URL ?? env.OPENFOX_VLLM_URL ?? "http://localhost:8000/v1";
|
|
855
|
+
const workdir = env.OPENFOX_WORKDIR ?? process.cwd();
|
|
856
|
+
return {
|
|
857
|
+
llm: {
|
|
858
|
+
baseUrl: llmUrl,
|
|
859
|
+
model: env.OPENFOX_MODEL_NAME,
|
|
860
|
+
timeout: 3e5,
|
|
861
|
+
// 5 minutes (deprecated, kept for backward compatibility)
|
|
862
|
+
idleTimeout: 3e5,
|
|
863
|
+
// 5 minutes of inactivity
|
|
864
|
+
backend: env.OPENFOX_BACKEND,
|
|
865
|
+
disableThinking: env.OPENFOX_DISABLE_THINKING
|
|
866
|
+
},
|
|
867
|
+
context: {
|
|
868
|
+
maxTokens: env.OPENFOX_MAX_CONTEXT,
|
|
869
|
+
compactionThreshold: 0.85,
|
|
870
|
+
compactionTarget: 0.6
|
|
871
|
+
},
|
|
872
|
+
agent: {
|
|
873
|
+
maxIterations: 10,
|
|
874
|
+
maxConsecutiveFailures: 3,
|
|
875
|
+
toolTimeout: 3e5
|
|
876
|
+
},
|
|
877
|
+
server: {
|
|
878
|
+
port: env.OPENFOX_PORT,
|
|
879
|
+
...env.OPENFOX_HOST !== void 0 ? { host: env.OPENFOX_HOST } : {}
|
|
880
|
+
},
|
|
881
|
+
database: {
|
|
882
|
+
path: env.OPENFOX_DB_PATH
|
|
883
|
+
},
|
|
884
|
+
mode: env.OPENFOX_DEV ? "development" : "production",
|
|
885
|
+
workdir
|
|
886
|
+
};
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// src/server/runtime-config.ts
|
|
890
|
+
var runtimeConfig = null;
|
|
891
|
+
function setRuntimeConfig(config) {
|
|
892
|
+
runtimeConfig = config;
|
|
893
|
+
}
|
|
894
|
+
function getRuntimeConfig() {
|
|
895
|
+
return runtimeConfig ?? loadConfig();
|
|
896
|
+
}
|
|
897
|
+
|
|
811
898
|
// src/server/events/session.ts
|
|
812
899
|
function toSnapshotMessage(message) {
|
|
813
900
|
return {
|
|
@@ -890,6 +977,10 @@ function getCurrentContextWindowId(sessionId) {
|
|
|
890
977
|
const contextResult = foldContextState(events, "");
|
|
891
978
|
return contextResult.currentContextWindowId || void 0;
|
|
892
979
|
}
|
|
980
|
+
function getCurrentWindowMessageOptions(sessionId) {
|
|
981
|
+
const contextWindowId = getCurrentContextWindowId(sessionId);
|
|
982
|
+
return contextWindowId ? { contextWindowId } : void 0;
|
|
983
|
+
}
|
|
893
984
|
function getReadFilesCache(sessionId) {
|
|
894
985
|
const state = getSessionState(sessionId);
|
|
895
986
|
return state?.readFiles ?? [];
|
|
@@ -976,7 +1067,6 @@ function emitMessageDone(sessionId, messageId, options) {
|
|
|
976
1067
|
...options?.stats !== void 0 && { stats: options.stats },
|
|
977
1068
|
...options?.segments !== void 0 && { segments: options.segments },
|
|
978
1069
|
...options?.partial !== void 0 && { partial: options.partial },
|
|
979
|
-
...options?.promptContext !== void 0 && { promptContext: options.promptContext },
|
|
980
1070
|
...options?.tokenCount !== void 0 && { tokenCount: options.tokenCount }
|
|
981
1071
|
}
|
|
982
1072
|
});
|
|
@@ -1115,11 +1205,11 @@ function emitChatError(sessionId, error, recoverable) {
|
|
|
1115
1205
|
data: { error, recoverable }
|
|
1116
1206
|
});
|
|
1117
1207
|
}
|
|
1118
|
-
function
|
|
1208
|
+
function emitPatternRetry(sessionId, messageId, pattern, field, attempt, maxAttempts, matchedContent) {
|
|
1119
1209
|
const eventStore = getEventStore();
|
|
1120
1210
|
eventStore.append(sessionId, {
|
|
1121
|
-
type: "
|
|
1122
|
-
data: { attempt, maxAttempts }
|
|
1211
|
+
type: "pattern.retry",
|
|
1212
|
+
data: { messageId, pattern, field, attempt, maxAttempts, matchedContent }
|
|
1123
1213
|
});
|
|
1124
1214
|
}
|
|
1125
1215
|
function emitTurnSnapshot(sessionId, snapshot) {
|
|
@@ -1245,10 +1335,14 @@ export {
|
|
|
1245
1335
|
listSessions,
|
|
1246
1336
|
listSessionsByProject,
|
|
1247
1337
|
deleteSession,
|
|
1338
|
+
loadConfig,
|
|
1339
|
+
setRuntimeConfig,
|
|
1340
|
+
getRuntimeConfig,
|
|
1248
1341
|
getSessionState,
|
|
1249
1342
|
getCurrentWindowMessages,
|
|
1250
1343
|
getContextMessages,
|
|
1251
1344
|
getCurrentContextWindowId,
|
|
1345
|
+
getCurrentWindowMessageOptions,
|
|
1252
1346
|
getReadFilesCache,
|
|
1253
1347
|
isFileInCache,
|
|
1254
1348
|
emitSessionInitialized,
|
|
@@ -1273,10 +1367,10 @@ export {
|
|
|
1273
1367
|
emitContextState,
|
|
1274
1368
|
emitChatDone,
|
|
1275
1369
|
emitChatError,
|
|
1276
|
-
|
|
1370
|
+
emitPatternRetry,
|
|
1277
1371
|
emitTurnSnapshot,
|
|
1278
1372
|
truncateSessionMessages,
|
|
1279
1373
|
compactContext,
|
|
1280
1374
|
getRecentUserPromptsForSession
|
|
1281
1375
|
};
|
|
1282
|
-
//# sourceMappingURL=chunk-
|
|
1376
|
+
//# sourceMappingURL=chunk-NPHYEUYE.js.map
|
|
@@ -15,9 +15,9 @@ var SETTINGS_KEYS = {
|
|
|
15
15
|
DISPLAY_USER_PRESETS: "display.userPresets",
|
|
16
16
|
DISPLAY_FOLLOW_SYSTEM_THEME: "display.followSystemTheme",
|
|
17
17
|
DISPLAY_SHOW_OPEN_IN_EDITOR: "display.showOpenInEditorLinks",
|
|
18
|
-
LLM_DISABLE_XML_PROTECTION: "llm.disableXmlProtection",
|
|
19
18
|
LLM_DYNAMIC_SYSTEM_PROMPT: "llm.dynamicSystemPrompt",
|
|
20
|
-
KEYBINDINGS: "keybindings"
|
|
19
|
+
KEYBINDINGS: "keybindings",
|
|
20
|
+
RETRY_PATTERNS: "agent.retryPatterns"
|
|
21
21
|
};
|
|
22
22
|
var SETTINGS_DEFAULTS = {
|
|
23
23
|
[SETTINGS_KEYS.DISPLAY_SHOW_THINKING]: "true",
|
|
@@ -29,8 +29,8 @@ var SETTINGS_DEFAULTS = {
|
|
|
29
29
|
[SETTINGS_KEYS.DISPLAY_THEME]: JSON.stringify({ preset: "dark" }),
|
|
30
30
|
[SETTINGS_KEYS.DISPLAY_FOLLOW_SYSTEM_THEME]: "true",
|
|
31
31
|
[SETTINGS_KEYS.DISPLAY_SHOW_OPEN_IN_EDITOR]: "false",
|
|
32
|
-
[SETTINGS_KEYS.LLM_DISABLE_XML_PROTECTION]: "false",
|
|
33
32
|
[SETTINGS_KEYS.LLM_DYNAMIC_SYSTEM_PROMPT]: "false",
|
|
33
|
+
[SETTINGS_KEYS.RETRY_PATTERNS]: JSON.stringify({ patterns: [], maxRetriesPerTurn: 10 }),
|
|
34
34
|
[SETTINGS_KEYS.KEYBINDINGS]: JSON.stringify({
|
|
35
35
|
terminalToggle: { type: "double-press", key: "Control", threshold: 300 },
|
|
36
36
|
quickAction: { type: "double-press", key: "Shift", threshold: 300 },
|
|
@@ -88,4 +88,4 @@ export {
|
|
|
88
88
|
deleteSetting,
|
|
89
89
|
getAllSettings
|
|
90
90
|
};
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-RFNEDBVO.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/server/context/compactor.ts
|
|
2
|
+
function shouldCompact(currentTokens, maxTokens, threshold) {
|
|
3
|
+
return currentTokens > maxTokens * threshold;
|
|
4
|
+
}
|
|
5
|
+
function getCompactionTarget(maxTokens, targetRatio) {
|
|
6
|
+
return Math.floor(maxTokens * targetRatio);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
shouldCompact,
|
|
11
|
+
getCompactionTarget
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chunk-RI6GAMNP.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
+
buildModelsUrl,
|
|
2
3
|
buildNonStreamingCreateParams,
|
|
3
4
|
buildStreamingCreateParams,
|
|
5
|
+
ensureVersionPrefix,
|
|
4
6
|
extractThinking,
|
|
5
7
|
getBackendCapabilities,
|
|
6
8
|
getModelProfile,
|
|
7
|
-
mapFinishReason
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
ensureVisionFallbackConfigLoaded
|
|
11
|
-
} from "./chunk-SZKEGZIB.js";
|
|
9
|
+
mapFinishReason,
|
|
10
|
+
stripVersionPrefix
|
|
11
|
+
} from "./chunk-VIIRNJDT.js";
|
|
12
12
|
import {
|
|
13
13
|
logger
|
|
14
14
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -19,7 +19,7 @@ var llmStatus = "unknown";
|
|
|
19
19
|
var lastActiveUrl = null;
|
|
20
20
|
var CACHE_TTL_MS = 3e4;
|
|
21
21
|
function getCacheKey(url) {
|
|
22
|
-
return url
|
|
22
|
+
return stripVersionPrefix(url);
|
|
23
23
|
}
|
|
24
24
|
async function detectModel(llmBaseUrl, retries = 3, silent = false) {
|
|
25
25
|
const cacheKey = getCacheKey(llmBaseUrl);
|
|
@@ -30,7 +30,7 @@ async function detectModel(llmBaseUrl, retries = 3, silent = false) {
|
|
|
30
30
|
llmStatus = "connected";
|
|
31
31
|
return cached.model;
|
|
32
32
|
}
|
|
33
|
-
const url = llmBaseUrl
|
|
33
|
+
const url = buildModelsUrl(llmBaseUrl);
|
|
34
34
|
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
35
35
|
try {
|
|
36
36
|
if (silent) {
|
|
@@ -140,7 +140,7 @@ var LLMError = class extends OpenFoxError {
|
|
|
140
140
|
|
|
141
141
|
// src/server/llm/client.ts
|
|
142
142
|
function createLLMClient(config, initialBackend = "unknown") {
|
|
143
|
-
const baseURL = config.llm.baseUrl
|
|
143
|
+
const baseURL = ensureVersionPrefix(config.llm.baseUrl);
|
|
144
144
|
const openai = new OpenAI({
|
|
145
145
|
baseURL,
|
|
146
146
|
apiKey: config.llm.apiKey ?? "not-needed"
|
|
@@ -187,23 +187,13 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
187
187
|
});
|
|
188
188
|
try {
|
|
189
189
|
const shouldDisableThinking = disableThinking || request.disableThinking === true;
|
|
190
|
-
await
|
|
191
|
-
const { isVisionFallbackEnabled } = await import("./vision-fallback-3MIZZ6NQ.js");
|
|
192
|
-
const paramsOptions = {
|
|
190
|
+
const { params: createParams } = await buildNonStreamingCreateParams({
|
|
193
191
|
model,
|
|
194
192
|
request,
|
|
195
193
|
profile,
|
|
196
194
|
capabilities,
|
|
197
|
-
disableThinking: shouldDisableThinking
|
|
198
|
-
|
|
199
|
-
};
|
|
200
|
-
if (request.onVisionFallbackStart) {
|
|
201
|
-
paramsOptions.onVisionFallbackStart = request.onVisionFallbackStart;
|
|
202
|
-
}
|
|
203
|
-
if (request.onVisionFallbackDone) {
|
|
204
|
-
paramsOptions.onVisionFallbackDone = request.onVisionFallbackDone;
|
|
205
|
-
}
|
|
206
|
-
const { params: createParams } = await buildNonStreamingCreateParams(paramsOptions);
|
|
195
|
+
disableThinking: shouldDisableThinking
|
|
196
|
+
});
|
|
207
197
|
const response = await openai.chat.completions.create(createParams, {
|
|
208
198
|
signal: request.signal
|
|
209
199
|
});
|
|
@@ -264,18 +254,13 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
264
254
|
idleTimeout
|
|
265
255
|
});
|
|
266
256
|
try {
|
|
267
|
-
await ensureVisionFallbackConfigLoaded();
|
|
268
|
-
const { isVisionFallbackEnabled } = await import("./vision-fallback-3MIZZ6NQ.js");
|
|
269
257
|
const shouldDisableThinking = disableThinking || request.disableThinking === true;
|
|
270
258
|
const createParams = await buildStreamingCreateParams({
|
|
271
259
|
model,
|
|
272
260
|
request,
|
|
273
261
|
profile,
|
|
274
262
|
capabilities,
|
|
275
|
-
disableThinking: shouldDisableThinking
|
|
276
|
-
visionFallbackEnabled: isVisionFallbackEnabled(),
|
|
277
|
-
onVisionFallbackStart: request.onVisionFallbackStart,
|
|
278
|
-
onVisionFallbackDone: request.onVisionFallbackDone
|
|
263
|
+
disableThinking: shouldDisableThinking
|
|
279
264
|
});
|
|
280
265
|
const { params: streamingParams } = createParams;
|
|
281
266
|
const stream = await openai.chat.completions.create(streamingParams, {
|
|
@@ -298,6 +283,8 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
298
283
|
idleTimeoutController.abort();
|
|
299
284
|
}
|
|
300
285
|
}, 100);
|
|
286
|
+
const onAbort = () => clearInterval(idleTimer);
|
|
287
|
+
request.signal?.addEventListener("abort", onAbort, { once: true });
|
|
301
288
|
try {
|
|
302
289
|
for await (const chunk of stream) {
|
|
303
290
|
if (idleTimeoutController.signal.aborted) {
|
|
@@ -412,6 +399,7 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
412
399
|
}
|
|
413
400
|
} finally {
|
|
414
401
|
clearInterval(idleTimer);
|
|
402
|
+
request.signal?.removeEventListener("abort", onAbort);
|
|
415
403
|
}
|
|
416
404
|
if (tagBuffer) {
|
|
417
405
|
if (inThinking) {
|
|
@@ -478,4 +466,4 @@ export {
|
|
|
478
466
|
getLlmStatus,
|
|
479
467
|
clearModelCache
|
|
480
468
|
};
|
|
481
|
-
//# sourceMappingURL=chunk-
|
|
469
|
+
//# sourceMappingURL=chunk-UKTPL5ZG.js.map
|