|
@@ -277,6 +277,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|
|
draggingType: "image" | "@mention" | null
|
|
draggingType: "image" | "@mention" | null
|
|
|
mode: "normal" | "shell"
|
|
mode: "normal" | "shell"
|
|
|
applyingHistory: boolean
|
|
applyingHistory: boolean
|
|
|
|
|
+ variantOpen: boolean
|
|
|
}>({
|
|
}>({
|
|
|
popover: null,
|
|
popover: null,
|
|
|
historyIndex: -1,
|
|
historyIndex: -1,
|
|
@@ -285,6 +286,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|
|
draggingType: null,
|
|
draggingType: null,
|
|
|
mode: "normal",
|
|
mode: "normal",
|
|
|
applyingHistory: false,
|
|
applyingHistory: false,
|
|
|
|
|
+ variantOpen: false,
|
|
|
})
|
|
})
|
|
|
const [picker, setPicker] = createStore({
|
|
const [picker, setPicker] = createStore({
|
|
|
projectOpen: false,
|
|
projectOpen: false,
|
|
@@ -1101,6 +1103,8 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const variants = createMemo(() => ["default", ...local.model.variant.list()])
|
|
const variants = createMemo(() => ["default", ...local.model.variant.list()])
|
|
|
|
|
+ // Check provider variants directly: `variants` also includes the UI-only default option.
|
|
|
|
|
+ const showVariantControl = createMemo(() => local.model.variant.list().length > 0)
|
|
|
const accepting = createMemo(() => {
|
|
const accepting = createMemo(() => {
|
|
|
const id = params.id
|
|
const id = params.id
|
|
|
if (!id) return permission.isAutoAcceptingDirectory(sdk.directory)
|
|
if (!id) return permission.isAutoAcceptingDirectory(sdk.directory)
|
|
@@ -1571,6 +1575,39 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|
|
<ComposerPickerTrigger state={newProjectTriggerState()} />
|
|
<ComposerPickerTrigger state={newProjectTriggerState()} />
|
|
|
</Show>
|
|
</Show>
|
|
|
<ComposerModelControl state={modelControlState()} />
|
|
<ComposerModelControl state={modelControlState()} />
|
|
|
|
|
+ <Show when={store.mode !== "shell" && showVariantControl()}>
|
|
|
|
|
+ <div
|
|
|
|
|
+ data-component="prompt-variant-control"
|
|
|
|
|
+ classList={{
|
|
|
|
|
+ "hidden group-hover/prompt-input:block group-focus-within/prompt-input:block":
|
|
|
|
|
+ !local.model.variant.current() && !store.variantOpen,
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <TooltipKeybind
|
|
|
|
|
+ placement="top"
|
|
|
|
|
+ gutter={4}
|
|
|
|
|
+ title={language.t("command.model.variant.cycle")}
|
|
|
|
|
+ keybind={command.keybind("model.variant.cycle")}
|
|
|
|
|
+ >
|
|
|
|
|
+ <Select
|
|
|
|
|
+ size="normal"
|
|
|
|
|
+ options={variants()}
|
|
|
|
|
+ current={local.model.variant.current() ?? "default"}
|
|
|
|
|
+ label={(x) => (x === "default" ? language.t("common.default") : x)}
|
|
|
|
|
+ onOpenChange={(open) => setStore("variantOpen", open)}
|
|
|
|
|
+ onSelect={(value) => {
|
|
|
|
|
+ local.model.variant.set(value === "default" ? undefined : value)
|
|
|
|
|
+ restoreFocus()
|
|
|
|
|
+ }}
|
|
|
|
|
+ class="capitalize max-w-[160px] justify-start text-v2-text-text-faint"
|
|
|
|
|
+ valueClass="truncate text-[13px] font-[440] leading-5 text-v2-text-text-faint"
|
|
|
|
|
+ triggerStyle={control()}
|
|
|
|
|
+ triggerProps={{ "data-action": "prompt-model-variant" }}
|
|
|
|
|
+ variant="ghost"
|
|
|
|
|
+ />
|
|
|
|
|
+ </TooltipKeybind>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Show>
|
|
|
</div>
|
|
</div>
|
|
|
<Tooltip placement="top" inactive={!working() && blank()} value={tip()}>
|
|
<Tooltip placement="top" inactive={!working() && blank()} value={tip()}>
|
|
|
<IconButton
|
|
<IconButton
|
|
@@ -1890,7 +1927,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
|
|
</TooltipKeybind>
|
|
</TooltipKeybind>
|
|
|
</Show>
|
|
</Show>
|
|
|
</div>
|
|
</div>
|
|
|
- <Show when={variants().length > 2}>
|
|
|
|
|
|
|
+ <Show when={showVariantControl()}>
|
|
|
<div
|
|
<div
|
|
|
data-component="prompt-variant-control"
|
|
data-component="prompt-variant-control"
|
|
|
style={providersShouldFadeIn() ? { animation: "fade-in 0.3s" } : undefined}
|
|
style={providersShouldFadeIn() ? { animation: "fade-in 0.3s" } : undefined}
|