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 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} forward -> ${e.peer} model=${m(e.model)} hops=${e.hops}${e.retry ? " (retry)" : ""}`;
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 ${e.status} ${m(e.model)} via=${e.via} 响应耗时 ${fmtDur(e.durationMs)}`;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mslxdff",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "测试项目,请勿使用。",
5
5
  "type": "module",
6
6
  "bin": {
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
  }