@tianshu-ai/tianshu 0.3.44 → 0.3.46
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/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA6CvD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB;;4CAEwC;IACxC,cAAc,CAAC,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;IACtE;;sBAEkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;sCACsC;AACtC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAoBtE"}
|
|
@@ -30,9 +30,30 @@
|
|
|
30
30
|
// side conventions ("@bot ..."); the router doesn't enforce more.
|
|
31
31
|
import { channelHub } from "./hub.js";
|
|
32
32
|
import { ensureChannelSession } from "./sessions.js";
|
|
33
|
-
import { getBinding } from "./bindings.js";
|
|
33
|
+
import { getBinding, setBindingStatus } from "./bindings.js";
|
|
34
34
|
import { runPrompt } from "../chat/handler.js";
|
|
35
35
|
import { broadcastToUser } from "../chat/active-harnesses.js";
|
|
36
|
+
/** Translate raw LLM / provider errors into a short, user-facing
|
|
37
|
+
* string suitable for a chat-platform message. Specifics (401
|
|
38
|
+
* bodies, stack traces, provider URLs) stay in logs + binding
|
|
39
|
+
* status; the human at the other end of wechat gets something
|
|
40
|
+
* they can act on. */
|
|
41
|
+
function friendlyErrorMessage(raw) {
|
|
42
|
+
const lower = raw.toLowerCase();
|
|
43
|
+
if (lower.includes("jwt is expired") || lower.includes("401")) {
|
|
44
|
+
return "⚠️ I can't reach the model right now — the API key is expired or invalid. The admin needs to refresh it.";
|
|
45
|
+
}
|
|
46
|
+
if (lower.includes("429") || lower.includes("rate limit")) {
|
|
47
|
+
return "⚠️ Hitting rate limits. Try again in a bit.";
|
|
48
|
+
}
|
|
49
|
+
if (lower.includes("403") || lower.includes("permission")) {
|
|
50
|
+
return "⚠️ The model is denying my requests (403). The admin needs to check provider access.";
|
|
51
|
+
}
|
|
52
|
+
if (lower.includes("timeout") || lower.includes("timed out")) {
|
|
53
|
+
return "⚠️ Took too long to hear back from the model. Try again.";
|
|
54
|
+
}
|
|
55
|
+
return "⚠️ Something went wrong on my side. Try again, and ping the admin if it sticks.";
|
|
56
|
+
}
|
|
36
57
|
function admit(envelope) {
|
|
37
58
|
if (!envelope.text || !envelope.text.trim()) {
|
|
38
59
|
return { kind: "drop", reason: "empty text" };
|
|
@@ -81,81 +102,134 @@ async function dispatch(envelope, deps) {
|
|
|
81
102
|
type: "channel_session_changed",
|
|
82
103
|
channelId: envelope.channelId,
|
|
83
104
|
});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
msg.type === "
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
105
|
+
const runAttempt = async (candidateModelId) => {
|
|
106
|
+
let deltaChunks = [];
|
|
107
|
+
const assistantQueue = [];
|
|
108
|
+
let errorReason = "";
|
|
109
|
+
const sink = (msg) => {
|
|
110
|
+
// Rebroadcast persisted-row events scoped to this channel
|
|
111
|
+
// session so a chat shell viewing it paints them live. We
|
|
112
|
+
// tag each one with `sessionId` so the chat shell can
|
|
113
|
+
// filter (only apply when viewingSessionId matches) and
|
|
114
|
+
// the events don't leak into the unrelated webchat thread.
|
|
115
|
+
if (msg.type === "message_added" ||
|
|
116
|
+
msg.type === "tool_call" ||
|
|
117
|
+
msg.type === "tool_result") {
|
|
118
|
+
broadcastToUser(session.userId, {
|
|
119
|
+
...msg,
|
|
120
|
+
sessionId: session.id,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (msg.type === "stream_delta") {
|
|
124
|
+
deltaChunks.push(msg.delta);
|
|
125
|
+
}
|
|
126
|
+
else if (msg.type === "stream_end") {
|
|
127
|
+
const wireText = msg.message?.text?.trim() ?? "";
|
|
128
|
+
const text = wireText || deltaChunks.join("").trim();
|
|
129
|
+
deltaChunks = [];
|
|
130
|
+
if (text.length > 0)
|
|
131
|
+
assistantQueue.push(text);
|
|
132
|
+
}
|
|
133
|
+
else if (msg.type === "stream_error") {
|
|
134
|
+
errorReason = msg.reason || "unknown";
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const aborter = new AbortController();
|
|
138
|
+
try {
|
|
139
|
+
await runPrompt({
|
|
140
|
+
ctx,
|
|
141
|
+
userId: session.userId,
|
|
142
|
+
send: sink,
|
|
143
|
+
content: envelope.text,
|
|
144
|
+
modelId: candidateModelId,
|
|
145
|
+
signal: aborter.signal,
|
|
146
|
+
pluginRegistry: deps.pluginRegistry,
|
|
147
|
+
homeDir: deps.homeDir,
|
|
148
|
+
session,
|
|
149
|
+
});
|
|
117
150
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const text = wireText || deltaChunks.join("").trim();
|
|
121
|
-
deltaChunks = [];
|
|
122
|
-
if (text.length > 0)
|
|
123
|
-
assistantQueue.push(text);
|
|
124
|
-
}
|
|
125
|
-
else if (msg.type === "stream_error") {
|
|
126
|
-
errorReason = msg.reason || "unknown";
|
|
151
|
+
catch (err) {
|
|
152
|
+
errorReason = err instanceof Error ? err.message : String(err);
|
|
127
153
|
}
|
|
154
|
+
return { assistantQueue, errorReason };
|
|
128
155
|
};
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
session,
|
|
141
|
-
});
|
|
156
|
+
const transientRetryDelayMs = [1500, 4000];
|
|
157
|
+
let result = await runAttempt(modelId);
|
|
158
|
+
let attempt = 0;
|
|
159
|
+
while (result.errorReason.length > 0 &&
|
|
160
|
+
attempt < transientRetryDelayMs.length &&
|
|
161
|
+
isTransientError(result.errorReason)) {
|
|
162
|
+
const delay = transientRetryDelayMs[attempt];
|
|
163
|
+
attempt += 1;
|
|
164
|
+
console.info(`[channel-router] transient agent error on attempt ${attempt}; retrying in ${delay}ms: ${result.errorReason}`);
|
|
165
|
+
await sleep(delay);
|
|
166
|
+
result = await runAttempt(modelId);
|
|
142
167
|
}
|
|
143
|
-
|
|
144
|
-
|
|
168
|
+
// Permanent provider failures — try once with the tenant
|
|
169
|
+
// default model so a stale binding model doesn't take out
|
|
170
|
+
// the user's reply.
|
|
171
|
+
if (result.errorReason.length > 0 &&
|
|
172
|
+
modelId &&
|
|
173
|
+
isPermanentProviderError(result.errorReason)) {
|
|
174
|
+
console.info(`[channel-router] permanent provider error on bound model (${modelId}); retrying with tenant default: ${result.errorReason}`);
|
|
175
|
+
result = await runAttempt(undefined);
|
|
145
176
|
}
|
|
177
|
+
const { assistantQueue, errorReason } = result;
|
|
146
178
|
// Sequential delivery preserves order on the user's wechat
|
|
147
179
|
// thread + avoids racing the per-user context_token.
|
|
148
180
|
for (const body of assistantQueue) {
|
|
149
181
|
await safeSend(envelope.bindingId, envelope.chatId, body);
|
|
150
182
|
}
|
|
151
183
|
if (errorReason.length > 0) {
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
|
|
184
|
+
// All recovery attempts failed. Persist the cause on the
|
|
185
|
+
// binding row so the admin sees the original error at
|
|
186
|
+
// /admin/<channel>, log it server-side, and surface a short
|
|
187
|
+
// friendly note to the user on wechat. Earlier the user got
|
|
188
|
+
// the raw 'agent error: 401 Jwt is expired'; that string is
|
|
189
|
+
// useless to them and embarrassing to us.
|
|
190
|
+
try {
|
|
191
|
+
setBindingStatus(ctx.db, envelope.bindingId, "error", errorReason);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* logging-only; do not break the user reply */
|
|
195
|
+
}
|
|
196
|
+
console.warn(`[channel-router] agent error (${envelope.bindingId}) after retries: ${errorReason}`);
|
|
197
|
+
await safeSend(envelope.bindingId, envelope.chatId, friendlyErrorMessage(errorReason));
|
|
156
198
|
}
|
|
157
199
|
// Tool-only turn: assistantQueue is empty, nothing more to ship.
|
|
158
200
|
}
|
|
201
|
+
/** Classify an error string as transient (worth a retry on the
|
|
202
|
+
* same model) vs. permanent (needs a different model / admin
|
|
203
|
+
* attention). The heuristics are intentionally string-based
|
|
204
|
+
* because pi-agent-core's errors bubble up through several
|
|
205
|
+
* layers without preserving a typed code. */
|
|
206
|
+
function isTransientError(reason) {
|
|
207
|
+
const lower = reason.toLowerCase();
|
|
208
|
+
return (lower.includes("timeout") ||
|
|
209
|
+
lower.includes("timed out") ||
|
|
210
|
+
lower.includes("econnreset") ||
|
|
211
|
+
lower.includes("econnrefused") ||
|
|
212
|
+
lower.includes("socket hang up") ||
|
|
213
|
+
lower.includes("network") ||
|
|
214
|
+
lower.includes("fetch failed") ||
|
|
215
|
+
/\b5\d\d\b/.test(lower) || // 5xx
|
|
216
|
+
lower.includes("429") ||
|
|
217
|
+
lower.includes("rate limit"));
|
|
218
|
+
}
|
|
219
|
+
function isPermanentProviderError(reason) {
|
|
220
|
+
const lower = reason.toLowerCase();
|
|
221
|
+
return (lower.includes("401") ||
|
|
222
|
+
lower.includes("jwt") ||
|
|
223
|
+
lower.includes("403") ||
|
|
224
|
+
lower.includes("permission") ||
|
|
225
|
+
lower.includes("unauthorized") ||
|
|
226
|
+
lower.includes("model not found") ||
|
|
227
|
+
lower.includes("no models") ||
|
|
228
|
+
lower.includes("invalid api key"));
|
|
229
|
+
}
|
|
230
|
+
function sleep(ms) {
|
|
231
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
232
|
+
}
|
|
159
233
|
async function safeSend(bindingId, target, text) {
|
|
160
234
|
try {
|
|
161
235
|
await channelHub.send(bindingId, { target, text });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF,kEAAkE;AAClE,yDAAyD;AACzD,EAAE;AACF,qDAAqD;AACrD,iEAAiE;AACjE,gCAAgC;AAChC,gDAAgD;AAChD,mDAAmD;AACnD,kDAAkD;AAClD,+DAA+D;AAC/D,+DAA+D;AAC/D,gEAAgE;AAChE,qBAAqB;AACrB,iEAAiE;AACjE,8CAA8C;AAC9C,EAAE;AACF,iEAAiE;AACjE,oEAAoE;AACpE,+DAA+D;AAC/D,gEAAgE;AAChE,gEAAgE;AAChE,iEAAiE;AACjE,YAAY;AACZ,EAAE;AACF,8DAA8D;AAC9D,iEAAiE;AACjE,gEAAgE;AAChE,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"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"}
|