💻 源码
import type { ReActStep } from '../types'

interface Props {
  steps: ReActStep[]
  loading?: boolean
}

export function PlainChain({ steps, loading }: Props) {
  const input = steps.find((s) => s.type === 'input')
  const process = steps.find((s) => s.type === 'plain')
  const answer = steps.find((s) => s.type === 'answer')

  if (!steps.length && !loading) {
    return (
      <div className="chain-empty plain-empty">
        <p>普通模式无推理链条</p>
      </div>
    )
  }

  return (
    <div className="plain-chain">
      {input && (
        <div className="chain-node chain-node-input">
          <div className="chain-node-head">
            <span className="chain-node-icon">❓</span>
            <span className="chain-node-label">用户提问</span>
          </div>
          <pre className="chain-node-body">{input.content}</pre>
        </div>
      )}

      <div className="chain-arrow">↓</div>

      {process && (
        <div className="chain-node chain-node-plain">
          <div className="chain-node-head">
            <span className="chain-node-icon">🚫</span>
            <span className="chain-node-label">跳过 ReAct 循环</span>
          </div>
          <pre className="chain-node-body">{process.content}</pre>
        </div>
      )}

      <div className="chain-arrow">↓</div>

      {answer ? (
        <div className="chain-node chain-node-answer-warn">
          <div className="chain-node-head">
            <span className="chain-node-icon">⚠️</span>
            <span className="chain-node-label">直接输出(未经验证)</span>
          </div>
          <pre className="chain-node-body">{answer.content}</pre>
        </div>
      ) : loading ? (
        <div className="chain-loading">
          <span className="pulse">⏳</span> 生成中…
        </div>
      ) : null}
    </div>
  )
}