fix: start typing on message start
This commit is contained in:
@@ -51,6 +51,7 @@ type EmbeddedPiAgentParams = {
|
||||
text?: string;
|
||||
mediaUrls?: string[];
|
||||
}) => Promise<void> | void;
|
||||
onAssistantMessageStart?: () => Promise<void> | void;
|
||||
onBlockReply?: (payload: {
|
||||
text?: string;
|
||||
mediaUrls?: string[];
|
||||
@@ -212,19 +213,21 @@ describe("runReplyAgent typing (heartbeat)", () => {
|
||||
expect(typing.startTypingLoop).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("starts typing only on deltas in message mode", async () => {
|
||||
runEmbeddedPiAgentMock.mockImplementationOnce(async () => ({
|
||||
payloads: [{ text: "final" }],
|
||||
meta: {},
|
||||
}));
|
||||
it("starts typing on assistant message start in message mode", async () => {
|
||||
runEmbeddedPiAgentMock.mockImplementationOnce(
|
||||
async (params: EmbeddedPiAgentParams) => {
|
||||
await params.onAssistantMessageStart?.();
|
||||
return { payloads: [{ text: "final" }], meta: {} };
|
||||
},
|
||||
);
|
||||
|
||||
const { run, typing } = createMinimalRun({
|
||||
typingMode: "message",
|
||||
});
|
||||
await run();
|
||||
|
||||
expect(typing.startTypingLoop).toHaveBeenCalled();
|
||||
expect(typing.startTypingOnText).not.toHaveBeenCalled();
|
||||
expect(typing.startTypingLoop).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("starts typing from reasoning stream in thinking mode", async () => {
|
||||
|
||||
@@ -689,6 +689,9 @@ export async function runReplyAgent(params: {
|
||||
});
|
||||
}
|
||||
: undefined,
|
||||
onAssistantMessageStart: async () => {
|
||||
await typingSignals.signalMessageStart();
|
||||
},
|
||||
onReasoningStream:
|
||||
typingSignals.shouldStartOnReasoning || opts?.onReasoningStream
|
||||
? async (payload) => {
|
||||
|
||||
@@ -96,6 +96,20 @@ describe("createTypingSignaler", () => {
|
||||
expect(typing.startTypingLoop).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("signals on message start for message mode", async () => {
|
||||
const typing = createMockTypingController();
|
||||
const signaler = createTypingSignaler({
|
||||
typing,
|
||||
mode: "message",
|
||||
isHeartbeat: false,
|
||||
});
|
||||
|
||||
await signaler.signalMessageStart();
|
||||
|
||||
expect(typing.startTypingLoop).toHaveBeenCalled();
|
||||
expect(typing.startTypingOnText).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("signals on reasoning for thinking mode", async () => {
|
||||
const typing = createMockTypingController();
|
||||
const signaler = createTypingSignaler({
|
||||
|
||||
@@ -25,9 +25,11 @@ export function resolveTypingMode({
|
||||
export type TypingSignaler = {
|
||||
mode: TypingMode;
|
||||
shouldStartImmediately: boolean;
|
||||
shouldStartOnMessageStart: boolean;
|
||||
shouldStartOnText: boolean;
|
||||
shouldStartOnReasoning: boolean;
|
||||
signalRunStart: () => Promise<void>;
|
||||
signalMessageStart: () => Promise<void>;
|
||||
signalTextDelta: (text?: string) => Promise<void>;
|
||||
signalReasoningDelta: () => Promise<void>;
|
||||
signalToolStart: () => Promise<void>;
|
||||
@@ -40,6 +42,7 @@ export function createTypingSignaler(params: {
|
||||
}): TypingSignaler {
|
||||
const { typing, mode, isHeartbeat } = params;
|
||||
const shouldStartImmediately = mode === "instant";
|
||||
const shouldStartOnMessageStart = mode === "message";
|
||||
const shouldStartOnText = mode === "message" || mode === "instant";
|
||||
const shouldStartOnReasoning = mode === "thinking";
|
||||
const disabled = isHeartbeat || mode === "never";
|
||||
@@ -49,6 +52,11 @@ export function createTypingSignaler(params: {
|
||||
await typing.startTypingLoop();
|
||||
};
|
||||
|
||||
const signalMessageStart = async () => {
|
||||
if (disabled || !shouldStartOnMessageStart) return;
|
||||
await typing.startTypingLoop();
|
||||
};
|
||||
|
||||
const signalTextDelta = async (text?: string) => {
|
||||
if (disabled) return;
|
||||
if (shouldStartOnText) {
|
||||
@@ -80,9 +88,11 @@ export function createTypingSignaler(params: {
|
||||
return {
|
||||
mode,
|
||||
shouldStartImmediately,
|
||||
shouldStartOnMessageStart,
|
||||
shouldStartOnText,
|
||||
shouldStartOnReasoning,
|
||||
signalRunStart,
|
||||
signalMessageStart,
|
||||
signalTextDelta,
|
||||
signalReasoningDelta,
|
||||
signalToolStart,
|
||||
|
||||
Reference in New Issue
Block a user