fix(chat): render completed reasoning in full instead of simulating streaming
Reasoning streaming state now derives only from the live stream phase (streaming/cooldown), never from missing persisted timing data. A cached part without time.end is no longer treated as live just because the timing field is absent, so completed reasoning renders in full on load instead of replaying a fake stream. While resolving the merge onto main, also fixed a regression the merge uncovered: main had added block-level streaming reveal (commitStreamedText) to ReasoningPart since this fix was authored, which caused the busy "Thinking…" header to stay hidden for the first moments of a short, single-paragraph streaming response (no committed line yet). The busy header now mounts as soon as streaming starts, independent of whether any text has been committed for display. Closes #2020
This commit is contained in:
@@ -261,7 +261,11 @@ export const ReasoningTimelineBlock: React.FC<ReasoningTimelineBlockProps> = ({
|
|||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!text || text.trim().length === 0) {
|
// While genuinely streaming, the busy header must appear as soon as
|
||||||
|
// reasoning starts even before the block-level reveal (commitStreamedText)
|
||||||
|
// has committed a first complete line — otherwise "Thinking…" never shows
|
||||||
|
// for the first moments of a short, single-paragraph response.
|
||||||
|
if (!isStreaming && (!text || text.trim().length === 0)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,9 +449,11 @@ const ReasoningPart = React.memo(({
|
|||||||
// never mutates in place.
|
// never mutates in place.
|
||||||
const throttledText = isStreaming ? commitStreamedText(throttledTextRaw) : throttledTextRaw;
|
const throttledText = isStreaming ? commitStreamedText(throttledTextRaw) : throttledTextRaw;
|
||||||
|
|
||||||
// Show reasoning even if time.end isn't set yet (during streaming)
|
// Show reasoning even if time.end isn't set yet (during streaming).
|
||||||
// Only hide if there's no text content
|
// While genuinely streaming, keep the block mounted even before the
|
||||||
if (!throttledText || throttledText.trim().length === 0) {
|
// block-level reveal commits a first line, so the busy header appears
|
||||||
|
// immediately instead of waiting on committed text.
|
||||||
|
if (!isStreaming && (!throttledText || throttledText.trim().length === 0)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user