Merge pull request #112 from hylkesybesma/fix-render-interrupt

fix: render interrupt after tool result
This commit is contained in:
Brace Sproul
2025-04-18 09:29:00 -07:00
committed by GitHub

View File

@@ -65,6 +65,32 @@ function parseAnthropicStreamedToolCalls(
}); });
} }
interface InterruptProps {
interruptValue?: unknown;
isLastMessage: boolean;
hasNoAIOrToolMessages: boolean;
}
function Interrupt({
interruptValue,
isLastMessage,
hasNoAIOrToolMessages,
}: InterruptProps) {
return (
<>
{isAgentInboxInterruptSchema(interruptValue) &&
(isLastMessage || hasNoAIOrToolMessages) && (
<ThreadView interrupt={interruptValue} />
)}
{interruptValue &&
!isAgentInboxInterruptSchema(interruptValue) &&
isLastMessage ? (
<GenericInterruptView interrupt={interruptValue} />
) : null}
</>
);
}
export function AssistantMessage({ export function AssistantMessage({
message, message,
isLoading, isLoading,
@@ -114,10 +140,18 @@ export function AssistantMessage({
return ( return (
<div className="group mr-auto flex items-start gap-2"> <div className="group mr-auto flex items-start gap-2">
{isToolResult ? (
<ToolResult message={message} />
) : (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
{isToolResult ? (
<>
<ToolResult message={message} />
<Interrupt
interruptValue={threadInterrupt?.value}
isLastMessage={isLastMessage}
hasNoAIOrToolMessages={hasNoAIOrToolMessages}
/>
</>
) : (
<>
{contentString.length > 0 && ( {contentString.length > 0 && (
<div className="py-1"> <div className="py-1">
<MarkdownText>{contentString}</MarkdownText> <MarkdownText>{contentString}</MarkdownText>
@@ -132,7 +166,9 @@ export function AssistantMessage({
(hasAnthropicToolCalls && ( (hasAnthropicToolCalls && (
<ToolCalls toolCalls={anthropicStreamedToolCalls} /> <ToolCalls toolCalls={anthropicStreamedToolCalls} />
)) || )) ||
(hasToolCalls && <ToolCalls toolCalls={message.tool_calls} />)} (hasToolCalls && (
<ToolCalls toolCalls={message.tool_calls} />
))}
</> </>
)} )}
@@ -142,15 +178,11 @@ export function AssistantMessage({
thread={thread} thread={thread}
/> />
)} )}
{isAgentInboxInterruptSchema(threadInterrupt?.value) && <Interrupt
(isLastMessage || hasNoAIOrToolMessages) && ( interruptValue={threadInterrupt?.value}
<ThreadView interrupt={threadInterrupt.value} /> isLastMessage={isLastMessage}
)} hasNoAIOrToolMessages={hasNoAIOrToolMessages}
{threadInterrupt?.value && />
!isAgentInboxInterruptSchema(threadInterrupt.value) &&
isLastMessage ? (
<GenericInterruptView interrupt={threadInterrupt.value} />
) : null}
<div <div
className={cn( className={cn(
"mr-auto flex items-center gap-2 transition-opacity", "mr-auto flex items-center gap-2 transition-opacity",
@@ -170,9 +202,10 @@ export function AssistantMessage({
handleRegenerate={() => handleRegenerate(parentCheckpoint)} handleRegenerate={() => handleRegenerate(parentCheckpoint)}
/> />
</div> </div>
</div> </>
)} )}
</div> </div>
</div>
); );
} }