@tianshu-ai/tianshu 0.3.45 → 0.3.47
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
|
@@ -102,89 +102,151 @@ async function dispatch(envelope, deps) {
|
|
|
102
102
|
type: "channel_session_changed",
|
|
103
103
|
channelId: envelope.channelId,
|
|
104
104
|
});
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
105
|
+
const runAttempt = async (candidateModelId) => {
|
|
106
|
+
const assistantQueue = [];
|
|
107
|
+
const sentMessageIds = new Set();
|
|
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.
|
|
112
|
+
// We 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
|
+
// EVERY assistant message gets queued for adapter delivery.
|
|
124
|
+
// The agent loop emits a `message_added` event for each
|
|
125
|
+
// turn the LLM completes (text turn, post-tool-call
|
|
126
|
+
// continuation, etc.). Previously we only queued the final
|
|
127
|
+
// `stream_end` body, dropping the in-between turns; users
|
|
128
|
+
// on wechat saw only the last response. `sentMessageIds`
|
|
129
|
+
// de-dupes against `stream_end` which fires for the same
|
|
130
|
+
// last message after message_added does.
|
|
131
|
+
if (msg.type === "message_added" && msg.message?.role === "assistant") {
|
|
132
|
+
const text = msg.message.text?.trim() ?? "";
|
|
133
|
+
if (text.length > 0) {
|
|
134
|
+
sentMessageIds.add(msg.message.id);
|
|
135
|
+
assistantQueue.push(text);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (msg.type === "stream_end") {
|
|
139
|
+
// Belt-and-braces: stream_end's `message` is the last
|
|
140
|
+
// assistant turn. If it wasn't already queued via a
|
|
141
|
+
// preceding message_added (some agent paths skip the
|
|
142
|
+
// intermediate event), queue it now.
|
|
143
|
+
const wire = msg.message;
|
|
144
|
+
const text = wire?.text?.trim() ?? "";
|
|
145
|
+
if (wire && text.length > 0 && !sentMessageIds.has(wire.id)) {
|
|
146
|
+
sentMessageIds.add(wire.id);
|
|
147
|
+
assistantQueue.push(text);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (msg.type === "stream_error") {
|
|
151
|
+
errorReason = msg.reason || "unknown";
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const aborter = new AbortController();
|
|
155
|
+
try {
|
|
156
|
+
await runPrompt({
|
|
157
|
+
ctx,
|
|
158
|
+
userId: session.userId,
|
|
159
|
+
send: sink,
|
|
160
|
+
content: envelope.text,
|
|
161
|
+
modelId: candidateModelId,
|
|
162
|
+
signal: aborter.signal,
|
|
163
|
+
pluginRegistry: deps.pluginRegistry,
|
|
164
|
+
homeDir: deps.homeDir,
|
|
165
|
+
session,
|
|
166
|
+
});
|
|
145
167
|
}
|
|
146
|
-
|
|
147
|
-
errorReason =
|
|
168
|
+
catch (err) {
|
|
169
|
+
errorReason = err instanceof Error ? err.message : String(err);
|
|
148
170
|
}
|
|
171
|
+
return { assistantQueue, errorReason };
|
|
149
172
|
};
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
session,
|
|
162
|
-
});
|
|
173
|
+
const transientRetryDelayMs = [1500, 4000];
|
|
174
|
+
let result = await runAttempt(modelId);
|
|
175
|
+
let attempt = 0;
|
|
176
|
+
while (result.errorReason.length > 0 &&
|
|
177
|
+
attempt < transientRetryDelayMs.length &&
|
|
178
|
+
isTransientError(result.errorReason)) {
|
|
179
|
+
const delay = transientRetryDelayMs[attempt];
|
|
180
|
+
attempt += 1;
|
|
181
|
+
console.info(`[channel-router] transient agent error on attempt ${attempt}; retrying in ${delay}ms: ${result.errorReason}`);
|
|
182
|
+
await sleep(delay);
|
|
183
|
+
result = await runAttempt(modelId);
|
|
163
184
|
}
|
|
164
|
-
|
|
165
|
-
|
|
185
|
+
// Permanent provider failures — try once with the tenant
|
|
186
|
+
// default model so a stale binding model doesn't take out
|
|
187
|
+
// the user's reply.
|
|
188
|
+
if (result.errorReason.length > 0 &&
|
|
189
|
+
modelId &&
|
|
190
|
+
isPermanentProviderError(result.errorReason)) {
|
|
191
|
+
console.info(`[channel-router] permanent provider error on bound model (${modelId}); retrying with tenant default: ${result.errorReason}`);
|
|
192
|
+
result = await runAttempt(undefined);
|
|
166
193
|
}
|
|
194
|
+
const { assistantQueue, errorReason } = result;
|
|
167
195
|
// Sequential delivery preserves order on the user's wechat
|
|
168
196
|
// thread + avoids racing the per-user context_token.
|
|
169
197
|
for (const body of assistantQueue) {
|
|
170
198
|
await safeSend(envelope.bindingId, envelope.chatId, body);
|
|
171
199
|
}
|
|
172
200
|
if (errorReason.length > 0) {
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
//
|
|
201
|
+
// All recovery attempts failed. Persist the cause on the
|
|
202
|
+
// binding row so the admin sees the original error at
|
|
203
|
+
// /admin/<channel>, log it server-side, and surface a short
|
|
204
|
+
// friendly note to the user on wechat. Earlier the user got
|
|
205
|
+
// the raw 'agent error: 401 Jwt is expired'; that string is
|
|
206
|
+
// useless to them and embarrassing to us.
|
|
177
207
|
try {
|
|
178
208
|
setBindingStatus(ctx.db, envelope.bindingId, "error", errorReason);
|
|
179
209
|
}
|
|
180
210
|
catch {
|
|
181
211
|
/* logging-only; do not break the user reply */
|
|
182
212
|
}
|
|
183
|
-
console.warn(`[channel-router] agent error (${envelope.bindingId}): ${errorReason}`);
|
|
213
|
+
console.warn(`[channel-router] agent error (${envelope.bindingId}) after retries: ${errorReason}`);
|
|
184
214
|
await safeSend(envelope.bindingId, envelope.chatId, friendlyErrorMessage(errorReason));
|
|
185
215
|
}
|
|
186
216
|
// Tool-only turn: assistantQueue is empty, nothing more to ship.
|
|
187
217
|
}
|
|
218
|
+
/** Classify an error string as transient (worth a retry on the
|
|
219
|
+
* same model) vs. permanent (needs a different model / admin
|
|
220
|
+
* attention). The heuristics are intentionally string-based
|
|
221
|
+
* because pi-agent-core's errors bubble up through several
|
|
222
|
+
* layers without preserving a typed code. */
|
|
223
|
+
function isTransientError(reason) {
|
|
224
|
+
const lower = reason.toLowerCase();
|
|
225
|
+
return (lower.includes("timeout") ||
|
|
226
|
+
lower.includes("timed out") ||
|
|
227
|
+
lower.includes("econnreset") ||
|
|
228
|
+
lower.includes("econnrefused") ||
|
|
229
|
+
lower.includes("socket hang up") ||
|
|
230
|
+
lower.includes("network") ||
|
|
231
|
+
lower.includes("fetch failed") ||
|
|
232
|
+
/\b5\d\d\b/.test(lower) || // 5xx
|
|
233
|
+
lower.includes("429") ||
|
|
234
|
+
lower.includes("rate limit"));
|
|
235
|
+
}
|
|
236
|
+
function isPermanentProviderError(reason) {
|
|
237
|
+
const lower = reason.toLowerCase();
|
|
238
|
+
return (lower.includes("401") ||
|
|
239
|
+
lower.includes("jwt") ||
|
|
240
|
+
lower.includes("403") ||
|
|
241
|
+
lower.includes("permission") ||
|
|
242
|
+
lower.includes("unauthorized") ||
|
|
243
|
+
lower.includes("model not found") ||
|
|
244
|
+
lower.includes("no models") ||
|
|
245
|
+
lower.includes("invalid api key"));
|
|
246
|
+
}
|
|
247
|
+
function sleep(ms) {
|
|
248
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
249
|
+
}
|
|
188
250
|
async function safeSend(bindingId, target, text) {
|
|
189
251
|
try {
|
|
190
252
|
await channelHub.send(bindingId, { target, text });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/channels/router.ts"],"names":[],"mappings":"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"}
|