From d18a43aff57546e517d82785d2bb53085fe6a65a Mon Sep 17 00:00:00 2001
From: Aarav Sareen <96787824+arvsrn@users.noreply.github.com>
Date: Fri, 3 Jul 2026 10:59:40 +0530
Subject: [PATCH] reintroduce model context tooltip in model selector
---
.../src/components/dialog-select-model.tsx | 55 ++++++++++++-------
packages/app/src/components/model-tooltip.tsx | 35 +++++++++++-
packages/app/src/i18n/en.ts | 5 ++
3 files changed, 74 insertions(+), 21 deletions(-)
diff --git a/packages/app/src/components/dialog-select-model.tsx b/packages/app/src/components/dialog-select-model.tsx
index 9725133fd679..02108d57ae51 100644
--- a/packages/app/src/components/dialog-select-model.tsx
+++ b/packages/app/src/components/dialog-select-model.tsx
@@ -14,6 +14,7 @@ import { Tooltip } from "@opencode-ai/ui/tooltip"
import { Icon } from "@opencode-ai/ui/v2/icon"
import { Tag as TagV2 } from "@opencode-ai/ui/v2/badge-v2"
import { MenuV2 } from "@opencode-ai/ui/v2/menu-v2"
+import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
import { ModelTooltip } from "./model-tooltip"
import { useLanguage } from "@/context/language"
import { decode64 } from "@/utils/base64"
@@ -79,6 +80,7 @@ const ModelList: Component<{
class="w-full"
placement="right-start"
gutter={12}
+ openDelay={0}
value={}
>
{node}
@@ -434,26 +436,41 @@ export function ModelSelectorPopoverV2(props: {
{(item) => (
- {
- setStore("active", modelKey(item))
- setTimeout(() => searchRef?.focus())
- }}
- onSelect={() => selectModel(item)}
+
+ }
>
- {item.name}
-
- {language.t("model.tag.free")}
-
-
- {language.t("model.tag.latest")}
-
-
+ {
+ setStore("active", modelKey(item))
+ setTimeout(() => searchRef?.focus())
+ }}
+ onSelect={() => selectModel(item)}
+ >
+ {item.name}
+
+ {language.t("model.tag.free")}
+
+
+ {language.t("model.tag.latest")}
+
+
+
)}
diff --git a/packages/app/src/components/model-tooltip.tsx b/packages/app/src/components/model-tooltip.tsx
index 53164dae85e2..0eb200da6d23 100644
--- a/packages/app/src/components/model-tooltip.tsx
+++ b/packages/app/src/components/model-tooltip.tsx
@@ -1,4 +1,4 @@
-import { Show, type Component } from "solid-js"
+import { Show, type Component, type JSX } from "solid-js"
import { useLanguage } from "@/context/language"
type InputKey = "text" | "image" | "audio" | "video" | "pdf"
@@ -23,7 +23,16 @@ type ModelInfo = {
}
}
-export const ModelTooltip: Component<{ model: ModelInfo; latest?: boolean; free?: boolean }> = (props) => {
+function ModelTooltipRow(props: { name: JSX.Element; value: JSX.Element }) {
+ return (
+
+ {props.name}
+ {props.value}
+
+ )
+}
+
+export const ModelTooltip: Component<{ model: ModelInfo; latest?: boolean; free?: boolean; v2?: boolean }> = (props) => {
const language = useLanguage()
const sourceName = (model: ModelInfo) => {
const value = `${model.id} ${model.name}`.toLowerCase()
@@ -51,6 +60,13 @@ export const ModelTooltip: Component<{ model: ModelInfo; latest?: boolean; free?
const suffix = tags.length ? ` (${tags.join(", ")})` : ""
return `${sourceName(props.model)} ${props.model.name}${suffix}`
}
+ const name = () => {
+ const tags: Array = []
+ if (props.latest) tags.push(language.t("model.tag.latest"))
+ if (props.free) tags.push(language.t("model.tag.free"))
+ const suffix = tags.length ? ` (${tags.join(", ")})` : ""
+ return `${props.model.name}${suffix}`
+ }
const inputs = () => {
if (props.model.capabilities) {
const input = props.model.capabilities.input
@@ -73,6 +89,21 @@ export const ModelTooltip: Component<{ model: ModelInfo; latest?: boolean; free?
: language.t("model.tooltip.reasoning.none")
}
const context = () => language.t("model.tooltip.context", { limit: props.model.limit.context.toLocaleString() })
+ const contextLimit = () => props.model.limit.context.toLocaleString(language.intl())
+
+ if (props.v2) {
+ return (
+
+
+
+
+ {(value) => }
+
+
+
+
+ )
+ }
return (
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 0124fcf6ed76..8dde5f7c52b8 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -211,6 +211,11 @@ export const dict = {
"model.input.video": "video",
"model.input.pdf": "pdf",
"model.tooltip.allows": "Allows: {{inputs}}",
+ "model.tooltip.context.label": "Context",
+ "model.tooltip.inputs": "Inputs",
+ "model.tooltip.model": "Model",
+ "model.tooltip.provider": "Provider",
+ "model.tooltip.reasoning": "Reasoning",
"model.tooltip.reasoning.allowed": "Allows reasoning",
"model.tooltip.reasoning.none": "No reasoning",
"model.tooltip.context": "Context limit {{limit}}",