improve UI of model selector
Browse files- components/editor/ask-ai/settings.tsx +34 -11
- lib/providers.ts +29 -36
components/editor/ask-ai/settings.tsx
CHANGED
|
@@ -67,6 +67,24 @@ export function Settings({
|
|
| 67 |
}
|
| 68 |
}, [model, provider]);
|
| 69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
return (
|
| 71 |
<Popover open={open} onOpenChange={onClose}>
|
| 72 |
<PopoverTrigger asChild>
|
|
@@ -115,19 +133,24 @@ export function Settings({
|
|
| 115 |
</SelectTrigger>
|
| 116 |
<SelectContent>
|
| 117 |
<SelectGroup>
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
value,
|
| 122 |
label,
|
| 123 |
isNew = false,
|
| 124 |
isThinker = false,
|
| 125 |
-
}
|
| 126 |
-
|
| 127 |
-
label: string;
|
| 128 |
-
isNew?: boolean;
|
| 129 |
-
isThinker?: boolean;
|
| 130 |
-
}) => (
|
| 131 |
<SelectItem
|
| 132 |
key={value}
|
| 133 |
value={value}
|
|
@@ -141,8 +164,8 @@ export function Settings({
|
|
| 141 |
</span>
|
| 142 |
)}
|
| 143 |
</SelectItem>
|
| 144 |
-
)
|
| 145 |
-
)}
|
| 146 |
</SelectGroup>
|
| 147 |
</SelectContent>
|
| 148 |
</Select>
|
|
|
|
| 67 |
}
|
| 68 |
}, [model, provider]);
|
| 69 |
|
| 70 |
+
const formattedModels = useMemo(() => {
|
| 71 |
+
const lists: ((typeof MODELS)[0] | { isCategory: true; name: string })[] =
|
| 72 |
+
[];
|
| 73 |
+
const keys = new Set<string>();
|
| 74 |
+
MODELS.forEach((model) => {
|
| 75 |
+
if (!keys.has(model.companyName)) {
|
| 76 |
+
lists.push({
|
| 77 |
+
isCategory: true,
|
| 78 |
+
name: model.companyName,
|
| 79 |
+
logo: model.logo,
|
| 80 |
+
});
|
| 81 |
+
keys.add(model.companyName);
|
| 82 |
+
}
|
| 83 |
+
lists.push(model);
|
| 84 |
+
});
|
| 85 |
+
return lists;
|
| 86 |
+
}, [MODELS]);
|
| 87 |
+
|
| 88 |
return (
|
| 89 |
<Popover open={open} onOpenChange={onClose}>
|
| 90 |
<PopoverTrigger asChild>
|
|
|
|
| 133 |
</SelectTrigger>
|
| 134 |
<SelectContent>
|
| 135 |
<SelectGroup>
|
| 136 |
+
{formattedModels.map((item: any) => {
|
| 137 |
+
if ("isCategory" in item) {
|
| 138 |
+
return (
|
| 139 |
+
<SelectLabel
|
| 140 |
+
key={item.name}
|
| 141 |
+
className="flex items-center gap-1"
|
| 142 |
+
>
|
| 143 |
+
{item.name}
|
| 144 |
+
</SelectLabel>
|
| 145 |
+
);
|
| 146 |
+
}
|
| 147 |
+
const {
|
| 148 |
value,
|
| 149 |
label,
|
| 150 |
isNew = false,
|
| 151 |
isThinker = false,
|
| 152 |
+
} = item;
|
| 153 |
+
return (
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
<SelectItem
|
| 155 |
key={value}
|
| 156 |
value={value}
|
|
|
|
| 164 |
</span>
|
| 165 |
)}
|
| 166 |
</SelectItem>
|
| 167 |
+
);
|
| 168 |
+
})}
|
| 169 |
</SelectGroup>
|
| 170 |
</SelectContent>
|
| 171 |
</Select>
|
lib/providers.ts
CHANGED
|
@@ -40,34 +40,7 @@ export const MODELS = [
|
|
| 40 |
providers: ["fireworks-ai", "nebius", "sambanova", "novita", "hyperbolic"],
|
| 41 |
autoProvider: "novita",
|
| 42 |
logo: DeepSeekLogo,
|
| 43 |
-
|
| 44 |
-
// {
|
| 45 |
-
// value: "deepseek-ai/DeepSeek-R1-0528",
|
| 46 |
-
// label: "DeepSeek R1 0528",
|
| 47 |
-
// providers: [
|
| 48 |
-
// "fireworks-ai",
|
| 49 |
-
// "novita",
|
| 50 |
-
// "hyperbolic",
|
| 51 |
-
// "nebius",
|
| 52 |
-
// "together",
|
| 53 |
-
// "sambanova",
|
| 54 |
-
// ],
|
| 55 |
-
// autoProvider: "novita",
|
| 56 |
-
// isThinker: true,
|
| 57 |
-
// },
|
| 58 |
-
{
|
| 59 |
-
value: "Qwen/Qwen3-Coder-480B-A35B-Instruct",
|
| 60 |
-
label: "Qwen3 Coder 480B A35B Instruct",
|
| 61 |
-
providers: ["novita", "hyperbolic"],
|
| 62 |
-
autoProvider: "novita",
|
| 63 |
-
logo: QwenLogo,
|
| 64 |
-
},
|
| 65 |
-
{
|
| 66 |
-
value: "moonshotai/Kimi-K2-Instruct",
|
| 67 |
-
label: "Kimi K2 Instruct",
|
| 68 |
-
providers: ["together", "novita", "groq"],
|
| 69 |
-
autoProvider: "groq",
|
| 70 |
-
logo: KimiLogo,
|
| 71 |
},
|
| 72 |
{
|
| 73 |
value: "deepseek-ai/DeepSeek-V3.1",
|
|
@@ -75,13 +48,7 @@ export const MODELS = [
|
|
| 75 |
providers: ["fireworks-ai", "novita"],
|
| 76 |
autoProvider: "fireworks-ai",
|
| 77 |
logo: DeepSeekLogo,
|
| 78 |
-
|
| 79 |
-
{
|
| 80 |
-
value: "moonshotai/Kimi-K2-Instruct-0905",
|
| 81 |
-
label: "Kimi K2 Instruct 0905",
|
| 82 |
-
providers: ["together", "groq", "novita"],
|
| 83 |
-
autoProvider: "groq",
|
| 84 |
-
logo: KimiLogo,
|
| 85 |
},
|
| 86 |
{
|
| 87 |
value: "deepseek-ai/DeepSeek-V3.1-Terminus",
|
|
@@ -89,6 +56,7 @@ export const MODELS = [
|
|
| 89 |
providers: ["novita"],
|
| 90 |
autoProvider: "novita",
|
| 91 |
logo: DeepSeekLogo,
|
|
|
|
| 92 |
},
|
| 93 |
{
|
| 94 |
value: "deepseek-ai/DeepSeek-V3.2-Exp",
|
|
@@ -97,5 +65,30 @@ export const MODELS = [
|
|
| 97 |
autoProvider: "novita",
|
| 98 |
logo: DeepSeekLogo,
|
| 99 |
isNew: true,
|
| 100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
];
|
|
|
|
| 40 |
providers: ["fireworks-ai", "nebius", "sambanova", "novita", "hyperbolic"],
|
| 41 |
autoProvider: "novita",
|
| 42 |
logo: DeepSeekLogo,
|
| 43 |
+
companyName: "DeepSeek",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
},
|
| 45 |
{
|
| 46 |
value: "deepseek-ai/DeepSeek-V3.1",
|
|
|
|
| 48 |
providers: ["fireworks-ai", "novita"],
|
| 49 |
autoProvider: "fireworks-ai",
|
| 50 |
logo: DeepSeekLogo,
|
| 51 |
+
companyName: "DeepSeek",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
},
|
| 53 |
{
|
| 54 |
value: "deepseek-ai/DeepSeek-V3.1-Terminus",
|
|
|
|
| 56 |
providers: ["novita"],
|
| 57 |
autoProvider: "novita",
|
| 58 |
logo: DeepSeekLogo,
|
| 59 |
+
companyName: "DeepSeek",
|
| 60 |
},
|
| 61 |
{
|
| 62 |
value: "deepseek-ai/DeepSeek-V3.2-Exp",
|
|
|
|
| 65 |
autoProvider: "novita",
|
| 66 |
logo: DeepSeekLogo,
|
| 67 |
isNew: true,
|
| 68 |
+
companyName: "DeepSeek",
|
| 69 |
+
},
|
| 70 |
+
{
|
| 71 |
+
value: "Qwen/Qwen3-Coder-480B-A35B-Instruct",
|
| 72 |
+
label: "Qwen3 Coder 480B A35B Instruct",
|
| 73 |
+
providers: ["novita", "hyperbolic"],
|
| 74 |
+
autoProvider: "novita",
|
| 75 |
+
logo: QwenLogo,
|
| 76 |
+
companyName: "Qwen",
|
| 77 |
+
},
|
| 78 |
+
{
|
| 79 |
+
value: "moonshotai/Kimi-K2-Instruct",
|
| 80 |
+
label: "Kimi K2 Instruct",
|
| 81 |
+
providers: ["together", "novita", "groq"],
|
| 82 |
+
autoProvider: "groq",
|
| 83 |
+
logo: KimiLogo,
|
| 84 |
+
companyName: "Kimi",
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
value: "moonshotai/Kimi-K2-Instruct-0905",
|
| 88 |
+
label: "Kimi K2 Instruct 0905",
|
| 89 |
+
providers: ["together", "groq", "novita"],
|
| 90 |
+
autoProvider: "groq",
|
| 91 |
+
logo: KimiLogo,
|
| 92 |
+
companyName: "Kimi",
|
| 93 |
+
},
|
| 94 |
];
|