Unverified 提交 a8e9caf7 authored 作者: Will Chen's avatar Will Chen 提交者: GitHub

Turbo models (#1249)

<!-- This is an auto-generated description by cubic. --> ## Summary by cubic Adds “Dyad Turbo” models for Pro users and centralizes model/provider constants. Pro users can pick fast, cost‑effective models directly from the ModelPicker, with clearer labels and gating. - **New Features** - Added Dyad Turbo provider in ModelPicker with Qwen3 Coder and Kimi K2 (Pro only). - Turbo options are hidden for non‑Pro users; “Pro only” badge shown where applicable. - “Smart Auto” label now applies only to the Auto model to avoid confusion. - **Refactors** - Moved all model/provider constants into language_model_constants.ts and updated imports (helpers, client, thinking utils). <!-- End of auto-generated description by cubic. -->
上级 9bc5e138
...@@ -25,6 +25,7 @@ import { LocalModel } from "@/ipc/ipc_types"; ...@@ -25,6 +25,7 @@ import { LocalModel } from "@/ipc/ipc_types";
import { useLanguageModelProviders } from "@/hooks/useLanguageModelProviders"; import { useLanguageModelProviders } from "@/hooks/useLanguageModelProviders";
import { useSettings } from "@/hooks/useSettings"; import { useSettings } from "@/hooks/useSettings";
import { PriceBadge } from "@/components/PriceBadge"; import { PriceBadge } from "@/components/PriceBadge";
import { TURBO_MODELS } from "@/ipc/shared/language_model_constants";
export function ModelPicker() { export function ModelPicker() {
const { settings, updateSettings } = useSettings(); const { settings, updateSettings } = useSettings();
...@@ -108,6 +109,13 @@ export function ModelPicker() { ...@@ -108,6 +109,13 @@ export function ModelPicker() {
const autoModels = const autoModels =
!loading && modelsByProviders && modelsByProviders["auto"] !loading && modelsByProviders && modelsByProviders["auto"]
? modelsByProviders["auto"].filter((model) => { ? modelsByProviders["auto"].filter((model) => {
if (
settings &&
!isDyadProEnabled(settings) &&
model.apiName === "turbo"
) {
return false;
}
if ( if (
settings && settings &&
isDyadProEnabled(settings) && isDyadProEnabled(settings) &&
...@@ -144,6 +152,9 @@ export function ModelPicker() { ...@@ -144,6 +152,9 @@ export function ModelPicker() {
const provider = providers?.find((p) => p.id === providerId); const provider = providers?.find((p) => p.id === providerId);
return !(provider && provider.secondary); return !(provider && provider.secondary);
}); });
if (settings && isDyadProEnabled(settings)) {
primaryProviders.unshift(["auto", TURBO_MODELS]);
}
const secondaryProviders = providerEntries.filter(([providerId, models]) => { const secondaryProviders = providerEntries.filter(([providerId, models]) => {
if (models.length === 0) return false; if (models.length === 0) return false;
const provider = providers?.find((p) => p.id === providerId); const provider = providers?.find((p) => p.id === providerId);
...@@ -220,7 +231,7 @@ export function ModelPicker() { ...@@ -220,7 +231,7 @@ export function ModelPicker() {
<div className="flex justify-between items-start w-full"> <div className="flex justify-between items-start w-full">
<span className="flex flex-col items-start"> <span className="flex flex-col items-start">
<span> <span>
{isSmartAutoEnabled {isSmartAutoEnabled && model.apiName === "auto"
? "Smart Auto" ? "Smart Auto"
: model.displayName} : model.displayName}
</span> </span>
...@@ -228,7 +239,7 @@ export function ModelPicker() { ...@@ -228,7 +239,7 @@ export function ModelPicker() {
<div className="flex items-center gap-1.5"> <div className="flex items-center gap-1.5">
{isSmartAutoEnabled && ( {isSmartAutoEnabled && (
<span className="text-[10px] bg-gradient-to-r from-indigo-600 via-indigo-500 to-indigo-600 bg-[length:200%_100%] animate-[shimmer_5s_ease-in-out_infinite] text-white px-1.5 py-0.5 rounded-full font-medium"> <span className="text-[10px] bg-gradient-to-r from-indigo-600 via-indigo-500 to-indigo-600 bg-[length:200%_100%] animate-[shimmer_5s_ease-in-out_infinite] text-white px-1.5 py-0.5 rounded-full font-medium">
Dyad Pro Pro only
</span> </span>
)} )}
{model.tag && ( {model.tag && (
...@@ -241,7 +252,7 @@ export function ModelPicker() { ...@@ -241,7 +252,7 @@ export function ModelPicker() {
</DropdownMenuItem> </DropdownMenuItem>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="right"> <TooltipContent side="right">
{isSmartAutoEnabled ? ( {isSmartAutoEnabled && model.apiName === "auto" ? (
<p> <p>
<strong>Smart Auto</strong> uses a cheaper model for <strong>Smart Auto</strong> uses a cheaper model for
easier tasks easier tasks
...@@ -274,12 +285,16 @@ export function ModelPicker() { ...@@ -274,12 +285,16 @@ export function ModelPicker() {
return true; return true;
}); });
const provider = providers?.find((p) => p.id === providerId); const provider = providers?.find((p) => p.id === providerId);
const providerDisplayName =
provider?.id === "auto"
? "Dyad Turbo"
: (provider?.name ?? providerId);
return ( return (
<DropdownMenuSub key={providerId}> <DropdownMenuSub key={providerId}>
<DropdownMenuSubTrigger className="w-full font-normal"> <DropdownMenuSubTrigger className="w-full font-normal">
<div className="flex flex-col items-start w-full"> <div className="flex flex-col items-start w-full">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span>{provider?.name ?? providerId}</span> <span>{providerDisplayName}</span>
{provider?.type === "cloud" && {provider?.type === "cloud" &&
!provider?.secondary && !provider?.secondary &&
isDyadProEnabled(settings) && ( isDyadProEnabled(settings) && (
...@@ -300,7 +315,7 @@ export function ModelPicker() { ...@@ -300,7 +315,7 @@ export function ModelPicker() {
</DropdownMenuSubTrigger> </DropdownMenuSubTrigger>
<DropdownMenuSubContent className="w-56"> <DropdownMenuSubContent className="w-56">
<DropdownMenuLabel> <DropdownMenuLabel>
{(provider?.name ?? providerId) + " Models"} {providerDisplayName + " Models"}
</DropdownMenuLabel> </DropdownMenuLabel>
<DropdownMenuSeparator /> <DropdownMenuSeparator />
{models.map((model) => ( {models.map((model) => (
......
差异被折叠。
...@@ -15,10 +15,8 @@ import type { ...@@ -15,10 +15,8 @@ import type {
} from "../../lib/schemas"; } from "../../lib/schemas";
import { getEnvVar } from "./read_env"; import { getEnvVar } from "./read_env";
import log from "electron-log"; import log from "electron-log";
import { import { FREE_OPENROUTER_MODEL_NAMES } from "../shared/language_model_constants";
FREE_OPENROUTER_MODEL_NAMES, import { getLanguageModelProviders } from "../shared/language_model_helpers";
getLanguageModelProviders,
} from "../shared/language_model_helpers";
import { LanguageModelProvider } from "../ipc_types"; import { LanguageModelProvider } from "../ipc_types";
import { createDyadEngine } from "./llm_engine_provider"; import { createDyadEngine } from "./llm_engine_provider";
......
import { PROVIDERS_THAT_SUPPORT_THINKING } from "../shared/language_model_helpers"; import { PROVIDERS_THAT_SUPPORT_THINKING } from "../shared/language_model_constants";
import type { UserSettings } from "../../lib/schemas"; import type { UserSettings } from "../../lib/schemas";
function getThinkingBudgetTokens( function getThinkingBudgetTokens(
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论