Skip to content

Commit 2dd18cb

Browse files
authored
Merge pull request #473 from sp88011/fix/multi-step-rendering
fix: use parts to render messages in multi steps correctly
2 parents 67e3b73 + 8674a72 commit 2dd18cb

File tree

1 file changed

+49
-50
lines changed

1 file changed

+49
-50
lines changed

components/render-message.tsx

+49-50
Original file line numberDiff line numberDiff line change
@@ -103,60 +103,59 @@ export function RenderMessage({
103103
return <UserMessage message={message.content} />
104104
}
105105

106-
if (message.toolInvocations?.length) {
107-
return (
108-
<>
109-
{message.toolInvocations.map(tool => (
110-
<ToolSection
111-
key={tool.toolCallId}
112-
tool={tool}
113-
isOpen={getIsOpen(messageId)}
114-
onOpenChange={open => onOpenChange(messageId, open)}
115-
/>
116-
))}
117-
</>
118-
)
119-
}
120-
106+
// New way: Use parts instead of toolInvocations
121107
return (
122108
<>
123-
{toolData.map(tool => (
124-
<ToolSection
125-
key={tool.toolCallId}
126-
tool={tool}
127-
isOpen={getIsOpen(tool.toolCallId)}
128-
onOpenChange={open => onOpenChange(tool.toolCallId, open)}
129-
/>
130-
))}
131-
{reasoningResult ? (
132-
<ReasoningAnswerSection
133-
content={{
134-
reasoning: reasoningResult,
135-
answer: message.content,
136-
time: reasoningTime
137-
}}
138-
isOpen={getIsOpen(messageId)}
139-
onOpenChange={open => onOpenChange(messageId, open)}
140-
chatId={chatId}
141-
/>
142-
) : (
143-
<AnswerSection
144-
content={message.content}
145-
isOpen={getIsOpen(messageId)}
146-
onOpenChange={open => onOpenChange(messageId, open)}
147-
chatId={chatId}
109+
{message.parts?.map((part, index) => {
110+
switch (part.type) {
111+
case 'tool-invocation':
112+
return (
113+
<ToolSection
114+
key={`${messageId}-tool-${index}`}
115+
tool={part.toolInvocation}
116+
isOpen={getIsOpen(part.toolInvocation.toolCallId)}
117+
onOpenChange={open =>
118+
onOpenChange(part.toolInvocation.toolCallId, open)
119+
}
120+
/>
121+
)
122+
case 'text':
123+
return (
124+
<AnswerSection
125+
key={`${messageId}-text-${index}`}
126+
content={part.text}
127+
isOpen={getIsOpen(messageId)}
128+
onOpenChange={open => onOpenChange(messageId, open)}
129+
chatId={chatId}
130+
/>
131+
)
132+
case 'reasoning':
133+
return (
134+
<ReasoningAnswerSection
135+
key={`${messageId}-reasoning-${index}`}
136+
content={{
137+
reasoning: part.reasoning,
138+
answer: '', // The text part will handle the answer
139+
time: 0 // If you need reasoning time, you can get it from part.details
140+
}}
141+
isOpen={getIsOpen(messageId)}
142+
onOpenChange={open => onOpenChange(messageId, open)}
143+
chatId={chatId}
144+
/>
145+
)
146+
// Add other part types as needed
147+
default:
148+
return null
149+
}
150+
})}
151+
{relatedQuestions && relatedQuestions.length > 0 && (
152+
<RelatedQuestions
153+
annotations={relatedQuestions as JSONValue[]}
154+
onQuerySelect={onQuerySelect}
155+
isOpen={getIsOpen(`${messageId}-related`)}
156+
onOpenChange={open => onOpenChange(`${messageId}-related`, open)}
148157
/>
149158
)}
150-
{!message.toolInvocations &&
151-
relatedQuestions &&
152-
relatedQuestions.length > 0 && (
153-
<RelatedQuestions
154-
annotations={relatedQuestions as JSONValue[]}
155-
onQuerySelect={onQuerySelect}
156-
isOpen={getIsOpen(`${messageId}-related`)}
157-
onOpenChange={open => onOpenChange(`${messageId}-related`, open)}
158-
/>
159-
)}
160159
</>
161160
)
162161
}

0 commit comments

Comments
 (0)