diff --git a/packages/ui/src/components/chat/MessageList.tsx b/packages/ui/src/components/chat/MessageList.tsx index db72b459..3372eb70 100644 --- a/packages/ui/src/components/chat/MessageList.tsx +++ b/packages/ui/src/components/chat/MessageList.tsx @@ -655,7 +655,10 @@ const TurnBlock: React.FC = ({ const turnGroupingContextBase = React.useMemo(() => { const userCreatedAt = (turn.userMessage.info.time as { created?: number } | undefined)?.created; - const rawVariant = (turn.userMessage.info as { variant?: unknown } | undefined)?.variant; + // OpenCode 1.4.0 moved variant from top-level to model.variant on UserMessage. + // Prefer the new location, fall back to the legacy one for older servers. + const info = turn.userMessage.info as { variant?: unknown; model?: { variant?: unknown } } | undefined; + const rawVariant = info?.model?.variant ?? info?.variant; const userMessageVariant = typeof rawVariant === 'string' && rawVariant.trim().length > 0 ? rawVariant : undefined; diff --git a/packages/ui/src/components/chat/ModelControls.tsx b/packages/ui/src/components/chat/ModelControls.tsx index 8b527d2e..0569ea02 100644 --- a/packages/ui/src/components/chat/ModelControls.tsx +++ b/packages/ui/src/components/chat/ModelControls.tsx @@ -581,7 +581,7 @@ export const ModelControls: React.FC = ({ const latestLoadedUserChoice = React.useMemo(() => { for (let i = currentSessionMessagesFromSync.length - 1; i >= 0; i -= 1) { const message = currentSessionMessagesFromSync[i] as typeof currentSessionMessagesFromSync[number] & { - model?: { providerID?: string; modelID?: string }; + model?: { providerID?: string; modelID?: string; variant?: string }; variant?: string; mode?: string; }; @@ -598,8 +598,11 @@ export const ModelControls: React.FC = ({ const agent = typeof message.agent === 'string' && message.agent.trim().length > 0 ? message.agent : (typeof message.mode === 'string' && message.mode.trim().length > 0 ? message.mode : undefined); - const variant = typeof message.variant === 'string' && message.variant.trim().length > 0 - ? message.variant + // OpenCode 1.4.0 moved variant from top-level to model.variant. + // Prefer the new location, fall back to the legacy one for older servers. + const variantCandidate = message.model?.variant ?? message.variant; + const variant = typeof variantCandidate === 'string' && variantCandidate.trim().length > 0 + ? variantCandidate : undefined; return { id: message.id, agent, providerID, modelID, variant };