fix(telegram): stop typing after tool results (#322)
Thanks @AbhisekBasu1.
This commit is contained in:
@@ -106,6 +106,7 @@ export async function runReplyAgent(params: {
|
|||||||
const streamedPayloadKeys = new Set<string>();
|
const streamedPayloadKeys = new Set<string>();
|
||||||
const pendingStreamedPayloadKeys = new Set<string>();
|
const pendingStreamedPayloadKeys = new Set<string>();
|
||||||
const pendingBlockTasks = new Set<Promise<void>>();
|
const pendingBlockTasks = new Set<Promise<void>>();
|
||||||
|
const pendingToolTasks = new Set<Promise<void>>();
|
||||||
let didStreamBlockReply = false;
|
let didStreamBlockReply = false;
|
||||||
const buildPayloadKey = (payload: ReplyPayload) => {
|
const buildPayloadKey = (payload: ReplyPayload) => {
|
||||||
const text = payload.text?.trim() ?? "";
|
const text = payload.text?.trim() ?? "";
|
||||||
@@ -312,33 +313,42 @@ export async function runReplyAgent(params: {
|
|||||||
: undefined,
|
: undefined,
|
||||||
shouldEmitToolResult,
|
shouldEmitToolResult,
|
||||||
onToolResult: opts?.onToolResult
|
onToolResult: opts?.onToolResult
|
||||||
? async (payload) => {
|
? (payload) => {
|
||||||
let text = payload.text;
|
const task = (async () => {
|
||||||
if (!isHeartbeat && text?.includes("HEARTBEAT_OK")) {
|
let text = payload.text;
|
||||||
const stripped = stripHeartbeatToken(text, {
|
if (!isHeartbeat && text?.includes("HEARTBEAT_OK")) {
|
||||||
mode: "message",
|
const stripped = stripHeartbeatToken(text, {
|
||||||
|
mode: "message",
|
||||||
|
});
|
||||||
|
if (stripped.didStrip && !didLogHeartbeatStrip) {
|
||||||
|
didLogHeartbeatStrip = true;
|
||||||
|
logVerbose(
|
||||||
|
"Stripped stray HEARTBEAT_OK token from reply",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
stripped.shouldSkip &&
|
||||||
|
(payload.mediaUrls?.length ?? 0) === 0
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
text = stripped.text;
|
||||||
|
}
|
||||||
|
if (!isHeartbeat) {
|
||||||
|
await typing.startTypingOnText(text);
|
||||||
|
}
|
||||||
|
await opts.onToolResult?.({
|
||||||
|
text,
|
||||||
|
mediaUrls: payload.mediaUrls,
|
||||||
});
|
});
|
||||||
if (stripped.didStrip && !didLogHeartbeatStrip) {
|
})()
|
||||||
didLogHeartbeatStrip = true;
|
.catch((err) => {
|
||||||
logVerbose(
|
logVerbose(`tool result delivery failed: ${String(err)}`);
|
||||||
"Stripped stray HEARTBEAT_OK token from reply",
|
})
|
||||||
);
|
.finally(() => {
|
||||||
}
|
pendingToolTasks.delete(task);
|
||||||
if (
|
});
|
||||||
stripped.shouldSkip &&
|
pendingToolTasks.add(task);
|
||||||
(payload.mediaUrls?.length ?? 0) === 0
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
text = stripped.text;
|
|
||||||
}
|
|
||||||
if (!isHeartbeat) {
|
|
||||||
await typing.startTypingOnText(text);
|
|
||||||
}
|
|
||||||
await opts.onToolResult?.({
|
|
||||||
text,
|
|
||||||
mediaUrls: payload.mediaUrls,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
}),
|
}),
|
||||||
@@ -378,6 +388,9 @@ export async function runReplyAgent(params: {
|
|||||||
if (pendingBlockTasks.size > 0) {
|
if (pendingBlockTasks.size > 0) {
|
||||||
await Promise.allSettled(pendingBlockTasks);
|
await Promise.allSettled(pendingBlockTasks);
|
||||||
}
|
}
|
||||||
|
if (pendingToolTasks.size > 0) {
|
||||||
|
await Promise.allSettled(pendingToolTasks);
|
||||||
|
}
|
||||||
|
|
||||||
const sanitizedPayloads = isHeartbeat
|
const sanitizedPayloads = isHeartbeat
|
||||||
? payloadArray
|
? payloadArray
|
||||||
|
|||||||
Reference in New Issue
Block a user