mslxdff 0.1.36 → 0.1.38
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 +34 -5
- package/package.json +1 -1
- package/src/routes.js +12 -6
package/bin/mslxdff.js
CHANGED
|
@@ -1179,17 +1179,44 @@ function fmtEvent(e) {
|
|
|
1179
1179
|
const t = e?.ts ? new Date(e.ts).toISOString().slice(11, 19) : "--:--:--";
|
|
1180
1180
|
const head = `[${t}]`;
|
|
1181
1181
|
const m = (x) => x || "-";
|
|
1182
|
+
const fallbackTag = e.fallback ? ` fallback=${e.fallback.requested_model || e.requested}->${e.fallback.actual_model || e.actual}(${e.fallback.reason || e.reason})` : "";
|
|
1182
1183
|
switch (e?.type) {
|
|
1183
1184
|
case "request":
|
|
1184
|
-
return `${head} request ${m(e.model)}${e.auto ? " (auto)" : ""} hops=${e.hops} from ${e.ip || "?"}${e.stream ? " stream" : ""}${e.prompt ? ` content="${e.prompt}"` : ""}`;
|
|
1185
|
+
return `${head} request client-> ${m(e.requested || e.model)}${e.auto ? " (auto)" : ""} raw=${m(e.rawModel)} lock=${m(e.lockModel)} hops=${e.hops} from ${e.ip || "?"}${e.stream ? " stream" : ""}${e.prompt ? ` content="${e.prompt}"` : ""} reqId=${e.reqId || ""}`;
|
|
1186
|
+
case "client-request":
|
|
1187
|
+
return `${head} client req 客户端请求 model=${m(e.requested)} raw=${m(e.rawModel)} lock=${m(e.lockModel)} ip=${e.ip || "?"}${e.stream ? " stream" : ""}`;
|
|
1188
|
+
case "ordered":
|
|
1189
|
+
return `${head} ordered 尝试顺序 [${(e.order||[]).join(" -> ")}] canFallback=${e.canFallback} useAuto=${e.useAuto}`;
|
|
1190
|
+
case "model-try":
|
|
1191
|
+
return `${head} model-try 尝试本地 model=${m(e.model)} idx=${e.idx} reqId=${e.reqId || ""}`;
|
|
1192
|
+
case "upstream-try":
|
|
1193
|
+
return `${head} upstream try 上游请求 model=${m(e.model)} attempt=${e.attempt || 1}`;
|
|
1194
|
+
case "upstream-done":
|
|
1195
|
+
return `${head} upstream ok ${m(e.model)} HTTP ${e.status}${e.timing ? ` total=${e.timing.totalMs}ms` : ""}`;
|
|
1185
1196
|
case "upstream-error":
|
|
1186
1197
|
return `${head} upstream err ${m(e.model)} ${e.status ? `HTTP ${e.status}` : "network"}: ${m(e.message)}`;
|
|
1198
|
+
case "peer-race-start":
|
|
1199
|
+
return `${head} peer race 开始并发给组员 model=${m(e.model)} peers=${e.peers}`;
|
|
1187
1200
|
case "peer-health":
|
|
1188
|
-
return `${head} peer check ${e.peer} -> ${e.count ? e.healthy.join(", ") : "no healthy models"}`;
|
|
1201
|
+
return `${head} peer check ${e.peer} -> ${e.count ? e.healthy.join(", ") : "no healthy models"}${e.strict ? " (strict)" : ""}`;
|
|
1202
|
+
case "peer-request":
|
|
1203
|
+
return `${head} peer req 并发发出 peer=${e.peer} model=${m(e.model)} hops=${e.hops}`;
|
|
1189
1204
|
case "peer-forward":
|
|
1190
|
-
return `${head}
|
|
1205
|
+
return `${head} peer resp 收到响应 peer=${e.peer} model=${m(e.model)} ${e.ok ? "ok" : "fail"} ${e.latencyMs ? `${e.latencyMs}ms` : ""} hops=${e.hops}${e.retry ? " (retry)" : ""}`;
|
|
1191
1206
|
case "peer-error":
|
|
1192
|
-
return `${head} peer err ${e.peer} ${e.status ? `HTTP ${e.status}` : "network"}: ${m(e.message)}`;
|
|
1207
|
+
return `${head} peer err ${e.peer} ${e.status ? `HTTP ${e.status}` : "network"}: ${m(e.message)} model=${m(e.model)}`;
|
|
1208
|
+
case "peer-race-win":
|
|
1209
|
+
return `${head} peer win 选中 peer=${e.winPeer} model=${m(e.winTarget)} latency=${e.latencyMs}ms`;
|
|
1210
|
+
case "peer-race-lose":
|
|
1211
|
+
return `${head} peer lose 组员全部失败 model=${m(e.model)}`;
|
|
1212
|
+
case "fallback":
|
|
1213
|
+
return `${head} fallback ${m(e.from)} -> ${m(e.to)} reason=${m(e.reason)}`;
|
|
1214
|
+
case "fallback-notice":
|
|
1215
|
+
return `${head} fallback! 客户端请求 ${m(e.requested)} 实际返回 ${m(e.actual)} 原因=${m(e.reason)} via=${m(e.via)} notice=${m(e.notice)}`;
|
|
1216
|
+
case "relay-try":
|
|
1217
|
+
return `${head} relay try 给宽带中继请求 target=${e.target} model=${m(e.model)} via=${e.via}`;
|
|
1218
|
+
case "relay-fail":
|
|
1219
|
+
return `${head} relay fail ${e.target} ${e.status ? `HTTP ${e.status}` : ""} ${m(e.message)}`;
|
|
1193
1220
|
case "relay-ip-change":
|
|
1194
1221
|
return `${head} relay ip ${e.member || e.id || "?"} ${e.oldIp || "?"} -> ${e.newIp || e.publicIp || "?"} via leader`;
|
|
1195
1222
|
case "relay-forward":
|
|
@@ -1199,7 +1226,9 @@ function fmtEvent(e) {
|
|
|
1199
1226
|
case "client-abort":
|
|
1200
1227
|
return `${head} client abort ${m(e.model)} total=${fmtDur(e.totalMs)}`;
|
|
1201
1228
|
case "result":
|
|
1202
|
-
return `${head} result
|
|
1229
|
+
return `${head} result 返回客户端 status=${e.status} model=${m(e.model)} via=${e.via} 响应耗时 ${fmtDur(e.durationMs)}${fallbackTag}`;
|
|
1230
|
+
case "client-response":
|
|
1231
|
+
return `${head} client res 返回客户端 客户端请求 ${m(e.requested)} 实际返回 ${m(e.actual)} via=${m(e.via)}${e.fallback ? ` fallback=${e.fallback.requested_model}->${e.fallback.actual_model}(${e.fallback.reason})` : " 无fallback"} status=${e.status}`;
|
|
1203
1232
|
case "auto-update-enabled":
|
|
1204
1233
|
return `${head} auto-update enabled every ${Math.round((e.intervalMs||0)/60000)}m current=${e.current}`;
|
|
1205
1234
|
case "auto-update-disabled":
|
package/package.json
CHANGED
package/src/routes.js
CHANGED
|
@@ -643,11 +643,12 @@ async function racePeerCandidates(candidates, ctx) {
|
|
|
643
643
|
const order = [];
|
|
644
644
|
const total = prepared.length;
|
|
645
645
|
for (const { peer, target } of prepared) {
|
|
646
|
+
ctx.evt("peer-request", { peer: peer.url, model: target, hops: ctx.hops + 1 });
|
|
646
647
|
const t0 = performance.now();
|
|
647
648
|
forwardToPeer(peer, ctx.body, target, ctx.hops).then((res) => {
|
|
648
649
|
const latencyMs = Math.round(performance.now() - t0);
|
|
649
650
|
const failed = res instanceof Error || res.status >= 400;
|
|
650
|
-
ctx.evt("peer-forward", { peer: peer.url, model: target, hops: ctx.hops + 1 });
|
|
651
|
+
ctx.evt("peer-forward", { peer: peer.url, model: target, hops: ctx.hops + 1, latencyMs, ok: !failed });
|
|
651
652
|
if (failed) {
|
|
652
653
|
const status = res instanceof Error ? 502 : res.status;
|
|
653
654
|
ctx.logError(ctx.model,
|
|
@@ -815,7 +816,8 @@ const ROUTES = [
|
|
|
815
816
|
}
|
|
816
817
|
evt("slow-model", { model, elapsedMs: out.totalMs ?? (Date.now() - startedAt), threshold: STALL_TIMEOUT_MS, interrupted: true, detail: out.detail ?? null });
|
|
817
818
|
logCall(model, 200);
|
|
818
|
-
evt("result", { model, status: out.status, via: "local", timing: upRes._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, interrupted: true, detail: out.detail ?? null });
|
|
819
|
+
evt("result", { model, status: out.status, via: "local", timing: upRes._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, interrupted: true, detail: out.detail ?? null, fallback, requested, actual: model });
|
|
820
|
+
evt("client-response", { requested, actual: model, via: "local", fallback, status: out.status, interrupted: true, reqId });
|
|
819
821
|
return;
|
|
820
822
|
}
|
|
821
823
|
const elapsed = Date.now() - startedAt;
|
|
@@ -841,7 +843,8 @@ const ROUTES = [
|
|
|
841
843
|
} else if (scoredSlow && out.detail) {
|
|
842
844
|
// already recorded slow+latency above, still ensure latency EMA is updated for slow case (done)
|
|
843
845
|
}
|
|
844
|
-
evt("result", { model, status: out.status, via: "local", timing: upRes._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null });
|
|
846
|
+
evt("result", { model, status: out.status, via: "local", timing: upRes._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null, fallback, requested, actual: model });
|
|
847
|
+
evt("client-response", { requested, actual: model, via: "local", fallback, status: out.status, reqId });
|
|
845
848
|
return;
|
|
846
849
|
}
|
|
847
850
|
|
|
@@ -877,7 +880,8 @@ const ROUTES = [
|
|
|
877
880
|
await auto.recordOk(win.target, { latencyMs });
|
|
878
881
|
}
|
|
879
882
|
}
|
|
880
|
-
evt("result", { model: win.target, status: out.status, via: "peer", timing: win.res._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null });
|
|
883
|
+
evt("result", { model: win.target, status: out.status, via: "peer", timing: win.res._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null, fallback: peerFallback, requested, actual: win.target });
|
|
884
|
+
evt("client-response", { requested, actual: win.target, via: "peer", fallback: peerFallback, status: out.status, reqId });
|
|
881
885
|
return;
|
|
882
886
|
}
|
|
883
887
|
evt("peer-race-lose", { reqId, model });
|
|
@@ -908,7 +912,8 @@ const ROUTES = [
|
|
|
908
912
|
await auto.recordOk(model, { latencyMs });
|
|
909
913
|
}
|
|
910
914
|
}
|
|
911
|
-
evt("result", { model, status: out.status, via: "broadband", timing: bb.result._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null });
|
|
915
|
+
evt("result", { model, status: out.status, via: "broadband", timing: bb.result._t ?? null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null, fallback: bbFallback, requested, actual: model });
|
|
916
|
+
evt("client-response", { requested, actual: model, via: "broadband", fallback: bbFallback, status: out.status, reqId });
|
|
912
917
|
return;
|
|
913
918
|
} else if (bb.result && typeof bb.result.status === "number") {
|
|
914
919
|
// buffered result from local leader enqueue
|
|
@@ -935,7 +940,8 @@ const ROUTES = [
|
|
|
935
940
|
onDownstreamAbort: () => evt("client-abort", { reqId, model, totalMs: Math.round(performance.now() - perf0), stages: [...stages] }),
|
|
936
941
|
});
|
|
937
942
|
evt("relay-done", { reqId, model, via: "broadband-local", status: out.status, ttfMs: out.ttfMs, totalMs: out.totalMs, aborted: out.aborted, interrupted: out.interrupted ?? false, detail: out.detail ?? null });
|
|
938
|
-
evt("result", { model, status: out.status, via: "broadband", timing: null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null });
|
|
943
|
+
evt("result", { model, status: out.status, via: "broadband", timing: null, ttfMs: out.ttfMs, totalMs: out.totalMs, detail: out.detail ?? null, fallback: bbLocalFallback, requested, actual: model });
|
|
944
|
+
evt("client-response", { requested, actual: model, via: "broadband", fallback: bbLocalFallback, status: out.status, reqId });
|
|
939
945
|
return;
|
|
940
946
|
}
|
|
941
947
|
}
|