@tianshu-ai/tianshu 0.3.43 → 0.3.45
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,13 +102,25 @@ 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
|
-
|
|
105
|
+
// Forward every assistant text chunk the agent emits, not just
|
|
106
|
+
// the last one. A single agent turn can produce multiple
|
|
107
|
+
// assistant messages (tool call → result → explanation →
|
|
108
|
+
// continuation → final answer), and we want the user to see all
|
|
109
|
+
// of them on wechat the same way they would in the webchat
|
|
110
|
+
// pane.
|
|
111
|
+
//
|
|
112
|
+
// Strategy: each stream_end is a complete assistant message
|
|
113
|
+
// (delta chunks already concatenated server-side into
|
|
114
|
+
// `message.text`). We queue every non-empty body in
|
|
115
|
+
// `assistantQueue` and ship them out sequentially after
|
|
116
|
+
// runPrompt resolves. Sequential matters for two reasons:
|
|
117
|
+
// - context_token is per-user, shared across our outbound
|
|
118
|
+
// calls; parallel sends would race on Tencent's side
|
|
119
|
+
// - wechat preserves message order by send time, so users see
|
|
120
|
+
// thinking → tool result → final answer in the order the
|
|
121
|
+
// agent produced them
|
|
122
|
+
let deltaChunks = [];
|
|
123
|
+
const assistantQueue = [];
|
|
91
124
|
let errorReason = "";
|
|
92
125
|
const sink = (msg) => {
|
|
93
126
|
// Rebroadcast persisted-row events scoped to this channel
|
|
@@ -105,7 +138,10 @@ async function dispatch(envelope, deps) {
|
|
|
105
138
|
}
|
|
106
139
|
else if (msg.type === "stream_end") {
|
|
107
140
|
const wireText = msg.message?.text?.trim() ?? "";
|
|
108
|
-
|
|
141
|
+
const text = wireText || deltaChunks.join("").trim();
|
|
142
|
+
deltaChunks = [];
|
|
143
|
+
if (text.length > 0)
|
|
144
|
+
assistantQueue.push(text);
|
|
109
145
|
}
|
|
110
146
|
else if (msg.type === "stream_error") {
|
|
111
147
|
errorReason = msg.reason || "unknown";
|
|
@@ -128,19 +164,26 @@ async function dispatch(envelope, deps) {
|
|
|
128
164
|
catch (err) {
|
|
129
165
|
errorReason = err instanceof Error ? err.message : String(err);
|
|
130
166
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// would be noisy.
|
|
136
|
-
await safeSend(envelope.bindingId, envelope.chatId, `⚠️ agent error: ${errorReason}`);
|
|
137
|
-
return;
|
|
167
|
+
// Sequential delivery preserves order on the user's wechat
|
|
168
|
+
// thread + avoids racing the per-user context_token.
|
|
169
|
+
for (const body of assistantQueue) {
|
|
170
|
+
await safeSend(envelope.bindingId, envelope.chatId, body);
|
|
138
171
|
}
|
|
139
|
-
if (
|
|
140
|
-
|
|
172
|
+
if (errorReason.length > 0) {
|
|
173
|
+
// The user sees a short, plain explanation — 'agent error:
|
|
174
|
+
// 401 Jwt is expired' isn't actionable for them. Detail goes
|
|
175
|
+
// into the binding row so the admin can see the original
|
|
176
|
+
// cause at /admin/<channel>.
|
|
177
|
+
try {
|
|
178
|
+
setBindingStatus(ctx.db, envelope.bindingId, "error", errorReason);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
/* logging-only; do not break the user reply */
|
|
182
|
+
}
|
|
183
|
+
console.warn(`[channel-router] agent error (${envelope.bindingId}): ${errorReason}`);
|
|
184
|
+
await safeSend(envelope.bindingId, envelope.chatId, friendlyErrorMessage(errorReason));
|
|
141
185
|
}
|
|
142
|
-
// Tool-only turn:
|
|
143
|
-
// We stay silent; the next user message reopens the loop.
|
|
186
|
+
// Tool-only turn: assistantQueue is empty, nothing more to ship.
|
|
144
187
|
}
|
|
145
188
|
async function safeSend(bindingId, target, text) {
|
|
146
189
|
try {
|
|
@@ -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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"}
|