mslxdff 0.1.231 → 0.1.233
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/bin/mslxdff.js +3 -3
- package/package.json +1 -1
- package/src/auto.js +264 -254
- package/src/bench/cline-bench.js +42 -42
- package/src/bench/probe.js +70 -70
- package/src/bench/report.js +162 -162
- package/src/bench/runner.js +77 -77
- package/src/bench/via-probe.js +124 -124
- package/src/bench/via-routes.js +87 -87
- package/src/bench/workbuddy-bench.js +54 -54
- package/src/chat/engine.js +160 -160
- package/src/chat/gateway.js +163 -163
- package/src/chat/orchestrator.js +234 -234
- package/src/chat/prompt.js +70 -70
- package/src/chat/repl.js +88 -88
- package/src/chat/terminal.js +135 -135
- package/src/chat/tools.js +306 -306
- package/src/chat-pipeline/index.js +155 -145
- package/src/chat-pipeline/policy.js +84 -84
- package/src/cli/commands/group.js +266 -266
- package/src/cli/commands/model/picks.js +50 -50
- package/src/cli/commands/provider/bench-via.js +247 -247
- package/src/cli/commands/provider/bench.js +141 -141
- package/src/cli/commands/provider/index.js +139 -139
- package/src/cli/commands/provider/models.js +149 -149
- package/src/cli/commands/provider/qwenwork-login.js +119 -119
- package/src/cli/commands/provider/raccoon-quota.js +156 -156
- package/src/cli/commands/sync.js +310 -310
- package/src/cli/status.js +279 -279
- package/src/daemon.js +246 -246
- package/src/model-capabilities/enrich.js +86 -86
- package/src/model-capabilities/index.js +183 -183
- package/src/model-capabilities/parse.js +70 -70
- package/src/model-trace.js +10 -2
- package/src/models.js +292 -225
- package/src/peers.js +345 -345
- package/src/providers/agentrouter.js +238 -238
- package/src/providers/base.js +164 -164
- package/src/providers/cline/auth.js +228 -228
- package/src/providers/cline/chat.js +307 -307
- package/src/providers/cline.js +2 -2
- package/src/providers/codearts/chat.js +207 -207
- package/src/providers/dispatcher.js +147 -147
- package/src/providers/globalqwenwork/cosy.js +123 -123
- package/src/providers/globalqwenwork/crypto.js +218 -218
- package/src/providers/globalqwenwork/http.js +20 -20
- package/src/providers/globalqwenwork/rsa.js +54 -54
- package/src/providers/globalqwenwork/sse.js +268 -268
- package/src/providers/globalqwenwork/stream.js +130 -130
- package/src/providers/globalqwenwork/upstream.js +122 -122
- package/src/providers/keyring.js +60 -60
- package/src/providers/qoder/account-store.js +18 -0
- package/src/providers/qoder/chat.js +292 -203
- package/src/providers/qoder/checkin.js +25 -12
- package/src/providers/qoder/index.js +311 -249
- package/src/providers/qoder/models.js +64 -2
- package/src/providers/qoder/oauth.js +42 -1
- package/src/providers/qoder/payload.js +116 -80
- package/src/providers/qoder/request.js +7 -2
- package/src/providers/qoder/session.js +26 -10
- package/src/providers/qoder/sse.js +233 -145
- package/src/providers/qoder/sticky.js +5 -2
- package/src/providers/qoder/wire-messages.js +242 -0
- package/src/providers/qwenwork/account-store.js +133 -133
- package/src/providers/qwenwork/constants.js +67 -67
- package/src/providers/qwenwork/cosy.js +120 -120
- package/src/providers/qwenwork/crypto.js +218 -218
- package/src/providers/qwenwork/http.js +20 -20
- package/src/providers/qwenwork/index.js +337 -337
- package/src/providers/qwenwork/payload.js +144 -144
- package/src/providers/qwenwork/rsa.js +54 -54
- package/src/providers/qwenwork/sse.js +268 -268
- package/src/providers/qwenwork/stream.js +130 -130
- package/src/providers/qwenwork/upstream.js +120 -120
- package/src/providers/qwenwork.js +1 -1
- package/src/providers/raccoon/chat.js +1 -1
- package/src/providers/raccoon/const.js +219 -202
- package/src/providers/raccoon/credits.js +285 -285
- package/src/providers/raccoon/index.js +15 -2
- package/src/providers/raccoon/models.js +68 -17
- package/src/providers/registry.js +89 -89
- package/src/providers/workbuddy/auth.js +16 -0
- package/src/providers/workbuddy/chat.js +298 -264
- package/src/providers/workbuddy/client-headers.js +148 -0
- package/src/providers/workbuddy/desktop-info.js +17 -1
- package/src/providers/workbuddy/models.js +8 -20
- package/src/providers/workbuddy/reshape.js +152 -152
- package/src/providers/workbuddy.js +2 -2
- package/src/reasoning.js +32 -32
- package/src/routes/chat/broadband-handler.js +80 -80
- package/src/routes/chat/gateway.js +46 -46
- package/src/routes/chat/relay-pipeline.js +282 -282
- package/src/routes/chat/via-route-handler.js +156 -156
- package/src/routes/hedge.js +260 -260
- package/src/routes/models-route.js +167 -167
- package/src/routes/peers.js +373 -373
- package/src/routes/stream.js +364 -347
- package/src/runtime/bootstrap.js +75 -75
- package/src/runtime/keep-warm.js +135 -135
- package/src/runtime/provider-gate.js +75 -75
- package/src/runtime/providers-setup.js +187 -187
- package/src/runtime/raccoon-checkin.js +175 -175
- package/src/server.js +85 -85
- package/src/state/schemas/allowlist.js +92 -92
- package/src/sync-opencode.js +280 -280
- package/src/transport/index.js +244 -244
- package/src/transport/pool.js +56 -56
- package/src/transport/retry.js +24 -24
- package/src/transport/sse.js +93 -93
- package/src/upstream-probe/display.js +52 -52
- package/src/upstream-probe/probe.js +49 -49
- package/src/upstream-probe/rotate.js +110 -110
- package/src/upstream-probe/start.js +45 -45
- package/src/upstream.js +355 -355
- package/docs/cli_help_mini.md +0 -148
- package/src/providers/AGENTS.md +0 -49
- package/src/routes/AGENTS.md +0 -37
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
import { relay, SLOW_TOTAL_MS, STREAM_TIMEOUT_MS, STALL_TIMEOUT_MS, SCORE_STALL_MS } from "../stream.js";
|
|
2
|
-
import { buildFallbackInfo } from "../fallback.js";
|
|
3
|
-
import { createRelayPipeline } from "./relay-pipeline.js";
|
|
4
|
-
import { tryBroadbandRelay } from "../relay-queue.js";
|
|
5
|
-
import { overForwardLimit, contextGuardMessage } from "../../chat-pipeline/context-guard.js";
|
|
6
|
-
|
|
7
|
-
/** 薄适配:broadband 两种形态合一经由 pipeline */
|
|
8
|
-
export async function handleBroadbandRelay({
|
|
9
|
-
model,
|
|
10
|
-
body,
|
|
11
|
-
hops,
|
|
12
|
-
lastErr,
|
|
13
|
-
requested,
|
|
14
|
-
useAuto,
|
|
15
|
-
lockModel,
|
|
16
|
-
auto,
|
|
17
|
-
groups,
|
|
18
|
-
token,
|
|
19
|
-
bus,
|
|
20
|
-
logs,
|
|
21
|
-
handlerCtx,
|
|
22
|
-
evt,
|
|
23
|
-
mark,
|
|
24
|
-
perf0,
|
|
25
|
-
attemptStartMs,
|
|
26
|
-
stages,
|
|
27
|
-
res,
|
|
28
|
-
startedAt,
|
|
29
|
-
plugins,
|
|
30
|
-
deps = {},
|
|
31
|
-
}) {
|
|
32
|
-
const { createPipeline = createRelayPipeline, tryBroadbandRelay: tryRelay = tryBroadbandRelay } = deps;
|
|
33
|
-
// 转发前上下文预检:宽带成员是完全不同的另一台机器,上下文撑爆的代价(白烧它的额度)最实在。
|
|
34
|
-
const guard = overForwardLimit(body);
|
|
35
|
-
if (guard) {
|
|
36
|
-
const msg = contextGuardMessage(guard);
|
|
37
|
-
evt("context-guard", { reqId: handlerCtx.reqId, model, via: "broadband", estimated: guard.estimated, limit: guard.limit, over: guard.over });
|
|
38
|
-
return { handled: false, lastErr: { model, upstream: null, status: 400, message: msg, contextGuard: true } };
|
|
39
|
-
}
|
|
40
|
-
const bb = await tryRelay({ groups, token, model, body, hops, bus, logs, reqId: handlerCtx.reqId, evt, res, mark, perf0, stages });
|
|
41
|
-
if (!bb) {
|
|
42
|
-
evt("relay-miss", { reqId: handlerCtx.reqId, model });
|
|
43
|
-
return { handled: false };
|
|
44
|
-
}
|
|
45
|
-
const pipeline = createPipeline({
|
|
46
|
-
relay,
|
|
47
|
-
buildFallbackInfo,
|
|
48
|
-
auto,
|
|
49
|
-
plugins,
|
|
50
|
-
evt,
|
|
51
|
-
mark,
|
|
52
|
-
logCall: () => {},
|
|
53
|
-
logError: () => {},
|
|
54
|
-
constants: { STREAM_TIMEOUT_MS, SLOW_TOTAL_MS, STALL_TIMEOUT_MS, SCORE_STALL_MS },
|
|
55
|
-
startedAt,
|
|
56
|
-
stages,
|
|
57
|
-
});
|
|
58
|
-
const isResponse = bb.result && typeof bb.result.status === "number" && typeof bb.result.headers?.get === "function";
|
|
59
|
-
if (isResponse) {
|
|
60
|
-
const r = await pipeline.execute({ res, upRes: bb.result, body, requested, actual: model, lastErr, via: "broadband", lockModel, useAuto, handlerCtx, mark, perf0, attemptStartMs, stages, startedAt });
|
|
61
|
-
if (!r.handled) return { handled: false, upRes: null, lastErr: r.lastErr };
|
|
62
|
-
return { handled: true };
|
|
63
|
-
}
|
|
64
|
-
if (bb.result && typeof bb.result.status === "number") {
|
|
65
|
-
const b = bb.result.body || "";
|
|
66
|
-
const str = typeof b === "string" ? b : JSON.stringify(b);
|
|
67
|
-
const isSSE = bb.result.headers?.["Content-Type"]?.includes("text/event-stream");
|
|
68
|
-
const fakeRes = {
|
|
69
|
-
status: bb.result.status,
|
|
70
|
-
headers: { get: (k) => bb.result.headers?.[k] || bb.result.headers?.[k.toLowerCase()] || null },
|
|
71
|
-
text: async () => str,
|
|
72
|
-
body: isSSE ? (async function* () { yield Buffer.from(str); })() : null,
|
|
73
|
-
};
|
|
74
|
-
const r = await pipeline.execute({ res, upRes: fakeRes, body, requested, actual: model, lastErr, via: "broadband-local", lockModel, useAuto, handlerCtx, mark, perf0, attemptStartMs, stages, startedAt });
|
|
75
|
-
if (!r.handled) return { handled: false, upRes: null, lastErr: r.lastErr };
|
|
76
|
-
return { handled: true };
|
|
77
|
-
}
|
|
78
|
-
evt("relay-miss", { reqId: handlerCtx.reqId, model });
|
|
79
|
-
return { handled: false };
|
|
80
|
-
}
|
|
1
|
+
import { relay, SLOW_TOTAL_MS, STREAM_TIMEOUT_MS, STALL_TIMEOUT_MS, SCORE_STALL_MS } from "../stream.js";
|
|
2
|
+
import { buildFallbackInfo } from "../fallback.js";
|
|
3
|
+
import { createRelayPipeline } from "./relay-pipeline.js";
|
|
4
|
+
import { tryBroadbandRelay } from "../relay-queue.js";
|
|
5
|
+
import { overForwardLimit, contextGuardMessage } from "../../chat-pipeline/context-guard.js";
|
|
6
|
+
|
|
7
|
+
/** 薄适配:broadband 两种形态合一经由 pipeline */
|
|
8
|
+
export async function handleBroadbandRelay({
|
|
9
|
+
model,
|
|
10
|
+
body,
|
|
11
|
+
hops,
|
|
12
|
+
lastErr,
|
|
13
|
+
requested,
|
|
14
|
+
useAuto,
|
|
15
|
+
lockModel,
|
|
16
|
+
auto,
|
|
17
|
+
groups,
|
|
18
|
+
token,
|
|
19
|
+
bus,
|
|
20
|
+
logs,
|
|
21
|
+
handlerCtx,
|
|
22
|
+
evt,
|
|
23
|
+
mark,
|
|
24
|
+
perf0,
|
|
25
|
+
attemptStartMs,
|
|
26
|
+
stages,
|
|
27
|
+
res,
|
|
28
|
+
startedAt,
|
|
29
|
+
plugins,
|
|
30
|
+
deps = {},
|
|
31
|
+
}) {
|
|
32
|
+
const { createPipeline = createRelayPipeline, tryBroadbandRelay: tryRelay = tryBroadbandRelay } = deps;
|
|
33
|
+
// 转发前上下文预检:宽带成员是完全不同的另一台机器,上下文撑爆的代价(白烧它的额度)最实在。
|
|
34
|
+
const guard = overForwardLimit(body);
|
|
35
|
+
if (guard) {
|
|
36
|
+
const msg = contextGuardMessage(guard);
|
|
37
|
+
evt("context-guard", { reqId: handlerCtx.reqId, model, via: "broadband", estimated: guard.estimated, limit: guard.limit, over: guard.over });
|
|
38
|
+
return { handled: false, lastErr: { model, upstream: null, status: 400, message: msg, contextGuard: true } };
|
|
39
|
+
}
|
|
40
|
+
const bb = await tryRelay({ groups, token, model, body, hops, bus, logs, reqId: handlerCtx.reqId, evt, res, mark, perf0, stages });
|
|
41
|
+
if (!bb) {
|
|
42
|
+
evt("relay-miss", { reqId: handlerCtx.reqId, model });
|
|
43
|
+
return { handled: false };
|
|
44
|
+
}
|
|
45
|
+
const pipeline = createPipeline({
|
|
46
|
+
relay,
|
|
47
|
+
buildFallbackInfo,
|
|
48
|
+
auto,
|
|
49
|
+
plugins,
|
|
50
|
+
evt,
|
|
51
|
+
mark,
|
|
52
|
+
logCall: () => {},
|
|
53
|
+
logError: () => {},
|
|
54
|
+
constants: { STREAM_TIMEOUT_MS, SLOW_TOTAL_MS, STALL_TIMEOUT_MS, SCORE_STALL_MS },
|
|
55
|
+
startedAt,
|
|
56
|
+
stages,
|
|
57
|
+
});
|
|
58
|
+
const isResponse = bb.result && typeof bb.result.status === "number" && typeof bb.result.headers?.get === "function";
|
|
59
|
+
if (isResponse) {
|
|
60
|
+
const r = await pipeline.execute({ res, upRes: bb.result, body, requested, actual: model, lastErr, via: "broadband", lockModel, useAuto, handlerCtx, mark, perf0, attemptStartMs, stages, startedAt });
|
|
61
|
+
if (!r.handled) return { handled: false, upRes: null, lastErr: r.lastErr };
|
|
62
|
+
return { handled: true };
|
|
63
|
+
}
|
|
64
|
+
if (bb.result && typeof bb.result.status === "number") {
|
|
65
|
+
const b = bb.result.body || "";
|
|
66
|
+
const str = typeof b === "string" ? b : JSON.stringify(b);
|
|
67
|
+
const isSSE = bb.result.headers?.["Content-Type"]?.includes("text/event-stream");
|
|
68
|
+
const fakeRes = {
|
|
69
|
+
status: bb.result.status,
|
|
70
|
+
headers: { get: (k) => bb.result.headers?.[k] || bb.result.headers?.[k.toLowerCase()] || null },
|
|
71
|
+
text: async () => str,
|
|
72
|
+
body: isSSE ? (async function* () { yield Buffer.from(str); })() : null,
|
|
73
|
+
};
|
|
74
|
+
const r = await pipeline.execute({ res, upRes: fakeRes, body, requested, actual: model, lastErr, via: "broadband-local", lockModel, useAuto, handlerCtx, mark, perf0, attemptStartMs, stages, startedAt });
|
|
75
|
+
if (!r.handled) return { handled: false, upRes: null, lastErr: r.lastErr };
|
|
76
|
+
return { handled: true };
|
|
77
|
+
}
|
|
78
|
+
evt("relay-miss", { reqId: handlerCtx.reqId, model });
|
|
79
|
+
return { handled: false };
|
|
80
|
+
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { clientIp, json, readBody, parseHops } from "../helpers.js";
|
|
2
|
-
import { runHook } from "../../plugins.js";
|
|
3
|
-
import { createChatPipeline } from "../../chat-pipeline/index.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* ChatGateway 薄适配层:仅负责 HTTP I/O(readBody + request:received hook)→ 委托 ChatPipeline.execute
|
|
7
|
-
* Policy/Order/AutoRace/hedge/peer/broadband 全部在 chat-pipeline 深模块内。
|
|
8
|
-
*/
|
|
9
|
-
export function createChatGateway(deps = {}) {
|
|
10
|
-
const pipeline = createChatPipeline(deps);
|
|
11
|
-
|
|
12
|
-
async function handle({ req, res }) {
|
|
13
|
-
let body;
|
|
14
|
-
try {
|
|
15
|
-
body = await readBody(req);
|
|
16
|
-
} catch {
|
|
17
|
-
return json(res, 400, { error: "Invalid JSON body" });
|
|
18
|
-
}
|
|
19
|
-
if (deps.plugins?.length) {
|
|
20
|
-
const rc = await runHook(deps.plugins, "request:received", {
|
|
21
|
-
ip: clientIp(req),
|
|
22
|
-
hops: parseHops(req.headers["x-mslxdff-hops"]),
|
|
23
|
-
headers: { "content-type": req.headers["content-type"] },
|
|
24
|
-
body,
|
|
25
|
-
});
|
|
26
|
-
for (const e of rc.errors) deps.logs?.appendEvent?.({ ts: Date.now(), type: "plugin-hook-error", hook: "request:received", plugin: e.plugin, error: e.error });
|
|
27
|
-
const respond = rc.value?.respond;
|
|
28
|
-
if (respond && typeof respond === "object") return json(res, respond.status || 200, respond.body ?? {});
|
|
29
|
-
}
|
|
30
|
-
req.body = body;
|
|
31
|
-
try {
|
|
32
|
-
await pipeline.execute({ req, res });
|
|
33
|
-
} catch (err) {
|
|
34
|
-
const msg = err?.message || String(err);
|
|
35
|
-
if (!res.headersSent) return json(res, 502, { error: msg });
|
|
36
|
-
try { res.end(); } catch {}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return { handle };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 薄适配:保持原 chatHandler 签名兼容
|
|
44
|
-
export async function chatHandler(ctx) {
|
|
45
|
-
const gw = createChatGateway(ctx);
|
|
46
|
-
return gw.handle(ctx);
|
|
1
|
+
import { clientIp, json, readBody, parseHops } from "../helpers.js";
|
|
2
|
+
import { runHook } from "../../plugins.js";
|
|
3
|
+
import { createChatPipeline } from "../../chat-pipeline/index.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* ChatGateway 薄适配层:仅负责 HTTP I/O(readBody + request:received hook)→ 委托 ChatPipeline.execute
|
|
7
|
+
* Policy/Order/AutoRace/hedge/peer/broadband 全部在 chat-pipeline 深模块内。
|
|
8
|
+
*/
|
|
9
|
+
export function createChatGateway(deps = {}) {
|
|
10
|
+
const pipeline = createChatPipeline(deps);
|
|
11
|
+
|
|
12
|
+
async function handle({ req, res }) {
|
|
13
|
+
let body;
|
|
14
|
+
try {
|
|
15
|
+
body = await readBody(req);
|
|
16
|
+
} catch {
|
|
17
|
+
return json(res, 400, { error: "Invalid JSON body" });
|
|
18
|
+
}
|
|
19
|
+
if (deps.plugins?.length) {
|
|
20
|
+
const rc = await runHook(deps.plugins, "request:received", {
|
|
21
|
+
ip: clientIp(req),
|
|
22
|
+
hops: parseHops(req.headers["x-mslxdff-hops"]),
|
|
23
|
+
headers: { "content-type": req.headers["content-type"] },
|
|
24
|
+
body,
|
|
25
|
+
});
|
|
26
|
+
for (const e of rc.errors) deps.logs?.appendEvent?.({ ts: Date.now(), type: "plugin-hook-error", hook: "request:received", plugin: e.plugin, error: e.error });
|
|
27
|
+
const respond = rc.value?.respond;
|
|
28
|
+
if (respond && typeof respond === "object") return json(res, respond.status || 200, respond.body ?? {});
|
|
29
|
+
}
|
|
30
|
+
req.body = body;
|
|
31
|
+
try {
|
|
32
|
+
await pipeline.execute({ req, res });
|
|
33
|
+
} catch (err) {
|
|
34
|
+
const msg = err?.message || String(err);
|
|
35
|
+
if (!res.headersSent) return json(res, 502, { error: msg });
|
|
36
|
+
try { res.end(); } catch {}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { handle };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 薄适配:保持原 chatHandler 签名兼容
|
|
44
|
+
export async function chatHandler(ctx) {
|
|
45
|
+
const gw = createChatGateway(ctx);
|
|
46
|
+
return gw.handle(ctx);
|
|
47
47
|
}
|