import type { ReActRound, ReActStep } from '../types'
import { PlainChain } from './PlainChain'
import { ReActChain } from './ReActChain'
interface Props {
plainSteps: ReActStep[]
reactRounds: ReActRound[]
reactSteps: ReActStep[]
plainAnswer: string
reactAnswer: string
toolCallCount: number
plainLoading: boolean
reactLoading: boolean
needsTool?: boolean
}
export function ComparePanel({
plainSteps,
reactRounds,
reactSteps,
plainAnswer,
reactAnswer,
toolCallCount,
plainLoading,
reactLoading,
needsTool,
}: Props) {
const reactInput = reactSteps.find((s) => s.type === 'input')
const reactAnswerStep = reactSteps.find((s) => s.type === 'answer')
const done = !plainLoading && !reactLoading && Boolean(plainAnswer && reactAnswer)
return (
<div className="compare-section">
<div className="compare-summary">
<div className="summary-card summary-plain">
<span className="summary-icon">🚫</span>
<div>
<strong>普通模式</strong>
<p>0 次工具调用 · 无验证链条</p>
</div>
</div>
<div className="summary-vs">VS</div>
<div className="summary-card summary-react">
<span className="summary-icon">🔗</span>
<div>
<strong>ReAct 模式</strong>
<p>
{reactLoading ? '推理中…' : `${toolCallCount} 次工具调用 · ${reactRounds.length} 轮推理`}
</p>
</div>
</div>
</div>
{done && needsTool && (
<div className="verdict-banner">
<span className="verdict-icon">💡</span>
<p>
此问题需要<strong>实时外部数据</strong>。左侧模型只能「猜」,右侧通过
<strong> Thought → Action → Observation </strong>
获取并引用真实结果,对比差异最明显。
</p>
</div>
)}
<div className="compare-grid">
<div className="compare-card compare-without">
<div className="compare-header">
<span className="compare-badge badge-warn">无工具</span>
<h3>普通对话 · 过程</h3>
</div>
<PlainChain steps={plainSteps} loading={plainLoading} />
{plainAnswer && !plainLoading && (
<div className="compare-answer-snippet">
<span className="snippet-label">最终回答摘要</span>
<pre>{plainAnswer}</pre>
</div>
)}
</div>
<div className="compare-card compare-with">
<div className="compare-header">
<span className="compare-badge badge-ok">ReAct + 工具</span>
<h3>ReAct 模式 · 推理链</h3>
</div>
<ReActChain
rounds={reactRounds}
inputStep={reactInput}
answerStep={reactAnswerStep}
loading={reactLoading}
/>
{reactAnswer && !reactLoading && (
<div className="compare-answer-snippet snippet-ok">
<span className="snippet-label">最终回答摘要</span>
<pre>{reactAnswer}</pre>
</div>
)}
</div>
</div>
</div>
)
}