Smart auto (#476)
This commit is contained in:
@@ -8,6 +8,7 @@ import { eq } from "drizzle-orm";
|
||||
|
||||
export const PROVIDERS_THAT_SUPPORT_THINKING: (keyof typeof MODEL_OPTIONS)[] = [
|
||||
"google",
|
||||
"auto",
|
||||
];
|
||||
|
||||
export interface ModelOption {
|
||||
@@ -139,6 +140,11 @@ export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
||||
displayName: "Auto",
|
||||
description: "Automatically selects the best model",
|
||||
tag: "Default",
|
||||
// These are below Gemini 2.5 Pro & Flash limits
|
||||
// which are the ones defaulted to for both regular auto
|
||||
// and smart auto.
|
||||
maxOutputTokens: 32_000,
|
||||
contextWindow: 1_000_000,
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -186,7 +192,7 @@ export const CLOUD_PROVIDERS: Record<
|
||||
auto: {
|
||||
displayName: "Dyad",
|
||||
websiteUrl: "https://academy.dyad.sh/settings",
|
||||
gatewayPrefix: "",
|
||||
gatewayPrefix: "dyad/",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -54,39 +54,6 @@ export async function getModelClient(
|
||||
const allProviders = await getLanguageModelProviders();
|
||||
|
||||
const dyadApiKey = settings.providerSettings?.auto?.apiKey?.value;
|
||||
// Handle 'auto' provider by trying each model in AUTO_MODELS until one works
|
||||
if (model.provider === "auto") {
|
||||
for (const autoModel of AUTO_MODELS) {
|
||||
const providerInfo = allProviders.find(
|
||||
(p) => p.id === autoModel.provider,
|
||||
);
|
||||
const envVarName = providerInfo?.envVarName;
|
||||
|
||||
const apiKey =
|
||||
dyadApiKey ||
|
||||
settings.providerSettings?.[autoModel.provider]?.apiKey?.value ||
|
||||
(envVarName ? getEnvVar(envVarName) : undefined);
|
||||
|
||||
if (apiKey) {
|
||||
logger.log(
|
||||
`Using provider: ${autoModel.provider} model: ${autoModel.name}`,
|
||||
);
|
||||
// Recursively call with the specific model found
|
||||
return await getModelClient(
|
||||
{
|
||||
provider: autoModel.provider,
|
||||
name: autoModel.name,
|
||||
},
|
||||
settings,
|
||||
files,
|
||||
);
|
||||
}
|
||||
}
|
||||
// If no models have API keys, throw an error
|
||||
throw new Error(
|
||||
"No API keys available for any model supported by the 'auto' provider.",
|
||||
);
|
||||
}
|
||||
|
||||
// --- Handle specific provider ---
|
||||
const providerConfig = allProviders.find((p) => p.id === model.provider);
|
||||
@@ -161,6 +128,38 @@ export async function getModelClient(
|
||||
// Fall through to regular provider logic if gateway prefix is missing
|
||||
}
|
||||
}
|
||||
// Handle 'auto' provider by trying each model in AUTO_MODELS until one works
|
||||
if (model.provider === "auto") {
|
||||
for (const autoModel of AUTO_MODELS) {
|
||||
const providerInfo = allProviders.find(
|
||||
(p) => p.id === autoModel.provider,
|
||||
);
|
||||
const envVarName = providerInfo?.envVarName;
|
||||
|
||||
const apiKey =
|
||||
settings.providerSettings?.[autoModel.provider]?.apiKey?.value ||
|
||||
(envVarName ? getEnvVar(envVarName) : undefined);
|
||||
|
||||
if (apiKey) {
|
||||
logger.log(
|
||||
`Using provider: ${autoModel.provider} model: ${autoModel.name}`,
|
||||
);
|
||||
// Recursively call with the specific model found
|
||||
return await getModelClient(
|
||||
{
|
||||
provider: autoModel.provider,
|
||||
name: autoModel.name,
|
||||
},
|
||||
settings,
|
||||
files,
|
||||
);
|
||||
}
|
||||
}
|
||||
// If no models have API keys, throw an error
|
||||
throw new Error(
|
||||
"No API keys available for any model supported by the 'auto' provider.",
|
||||
);
|
||||
}
|
||||
return getRegularModelClient(model, settings, providerConfig);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user