/* Copyright 2026 Marimo. All rights reserved. */ import { BotMessageSquareIcon } from "lucide-react"; import React from "react"; import { MarkdownRenderer } from "@/components/markdown/markdown-renderer"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; interface ReasoningAccordionProps { reasoning: string; index?: number; isStreaming?: boolean; } export const ReasoningAccordion: React.FC = ({ reasoning, index = 0, isStreaming = false, }) => { const [openItem, setOpenItem] = React.useState(""); // Some reasoning models emit a reasoning part with no surfaced content // (e.g. OpenAI's o-series, which hides chain-of-thought but still marks // its boundaries on the wire). pydantic-ai's Vercel adapter forwards the // empty start/end pair, producing a 0-char ReasoningUIPart. Skip it. if (!reasoning && !isStreaming) { return null; } return ( {isStreaming ? "Thinking" : "View reasoning"} {reasoning.length > 0 && ` (${reasoning.length} chars)`}
); };