Mark which models are eligible for turbo edits (#172)
This commit is contained in:
@@ -162,6 +162,7 @@ export type LanguageModel =
|
|||||||
tag?: string;
|
tag?: string;
|
||||||
maxOutputTokens?: number;
|
maxOutputTokens?: number;
|
||||||
contextWindow?: number;
|
contextWindow?: number;
|
||||||
|
supportsTurboEdits?: boolean;
|
||||||
type: "local" | "cloud";
|
type: "local" | "cloud";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export interface ModelOption {
|
|||||||
tag?: string;
|
tag?: string;
|
||||||
maxOutputTokens?: number;
|
maxOutputTokens?: number;
|
||||||
contextWindow?: number;
|
contextWindow?: number;
|
||||||
|
supportsTurboEdits?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
||||||
@@ -24,6 +25,7 @@ export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
|||||||
description: "OpenAI's flagship model",
|
description: "OpenAI's flagship model",
|
||||||
maxOutputTokens: 32_768,
|
maxOutputTokens: 32_768,
|
||||||
contextWindow: 1_047_576,
|
contextWindow: 1_047_576,
|
||||||
|
supportsTurboEdits: true,
|
||||||
},
|
},
|
||||||
// https://platform.openai.com/docs/models/gpt-4.1-mini
|
// https://platform.openai.com/docs/models/gpt-4.1-mini
|
||||||
{
|
{
|
||||||
@@ -50,6 +52,7 @@ export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
|||||||
description: "Excellent coder",
|
description: "Excellent coder",
|
||||||
maxOutputTokens: 64_000,
|
maxOutputTokens: 64_000,
|
||||||
contextWindow: 200_000,
|
contextWindow: 200_000,
|
||||||
|
supportsTurboEdits: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "claude-3-5-haiku-20241022",
|
name: "claude-3-5-haiku-20241022",
|
||||||
@@ -69,6 +72,7 @@ export const MODEL_OPTIONS: Record<string, ModelOption[]> = {
|
|||||||
maxOutputTokens: 65_536 - 1,
|
maxOutputTokens: 65_536 - 1,
|
||||||
// Gemini context window = input token + output token
|
// Gemini context window = input token + output token
|
||||||
contextWindow: 1_048_576,
|
contextWindow: 1_048_576,
|
||||||
|
supportsTurboEdits: true,
|
||||||
},
|
},
|
||||||
// https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview
|
// https://ai.google.dev/gemini-api/docs/models#gemini-2.5-flash-preview
|
||||||
{
|
{
|
||||||
|
|||||||
22
src/ipc/utils/findLanguageModel.ts
Normal file
22
src/ipc/utils/findLanguageModel.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { LargeLanguageModel } from "@/lib/schemas";
|
||||||
|
import { LanguageModel } from "../ipc_types";
|
||||||
|
import { getLanguageModels } from "../shared/language_model_helpers";
|
||||||
|
|
||||||
|
export async function findLanguageModel(
|
||||||
|
model: LargeLanguageModel,
|
||||||
|
): Promise<LanguageModel | undefined> {
|
||||||
|
const models = await getLanguageModels({
|
||||||
|
providerId: model.provider,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (model.customModelId) {
|
||||||
|
const customModel = models.find(
|
||||||
|
(m) => m.type === "custom" && m.id === model.customModelId,
|
||||||
|
);
|
||||||
|
if (customModel) {
|
||||||
|
return customModel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return models.find((m) => m.apiName === model.name);
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ import { getLanguageModelProviders } from "../shared/language_model_helpers";
|
|||||||
import { LanguageModelProvider } from "../ipc_types";
|
import { LanguageModelProvider } from "../ipc_types";
|
||||||
import { llmErrorStore } from "@/main/llm_error_store";
|
import { llmErrorStore } from "@/main/llm_error_store";
|
||||||
import { createDyadEngine } from "./llm_engine_provider";
|
import { createDyadEngine } from "./llm_engine_provider";
|
||||||
|
import { findLanguageModel } from "./findLanguageModel";
|
||||||
|
|
||||||
const dyadLocalEngine = process.env.DYAD_LOCAL_ENGINE;
|
const dyadLocalEngine = process.env.DYAD_LOCAL_ENGINE;
|
||||||
const dyadGatewayUrl = process.env.DYAD_GATEWAY_URL;
|
const dyadGatewayUrl = process.env.DYAD_GATEWAY_URL;
|
||||||
@@ -99,7 +100,14 @@ export async function getModelClient(
|
|||||||
// Check if the selected provider supports Dyad Pro (has a gateway prefix) OR
|
// Check if the selected provider supports Dyad Pro (has a gateway prefix) OR
|
||||||
// we're using local engine.
|
// we're using local engine.
|
||||||
if (providerConfig.gatewayPrefix || dyadLocalEngine) {
|
if (providerConfig.gatewayPrefix || dyadLocalEngine) {
|
||||||
const provider = settings.enableProLazyEditsMode
|
const languageModel = await findLanguageModel(model);
|
||||||
|
// Currently engine is only used for turbo edits.
|
||||||
|
const isEngineEnabled = Boolean(
|
||||||
|
settings.enableProLazyEditsMode &&
|
||||||
|
languageModel?.type === "cloud" &&
|
||||||
|
languageModel?.supportsTurboEdits,
|
||||||
|
);
|
||||||
|
const provider = isEngineEnabled
|
||||||
? createDyadEngine({
|
? createDyadEngine({
|
||||||
apiKey: dyadApiKey,
|
apiKey: dyadApiKey,
|
||||||
baseURL: dyadLocalEngine ?? "https://engine.dyad.sh/v1",
|
baseURL: dyadLocalEngine ?? "https://engine.dyad.sh/v1",
|
||||||
@@ -109,9 +117,7 @@ export async function getModelClient(
|
|||||||
baseURL: dyadGatewayUrl ?? "https://llm-gateway.dyad.sh/v1",
|
baseURL: dyadGatewayUrl ?? "https://llm-gateway.dyad.sh/v1",
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.info(
|
logger.info(`Using Dyad Pro API key. engine_enabled=${isEngineEnabled}`);
|
||||||
`Using Dyad Pro API key. engine_enabled=${settings.enableProLazyEditsMode}`,
|
|
||||||
);
|
|
||||||
// Do not use free variant (for openrouter).
|
// Do not use free variant (for openrouter).
|
||||||
const modelName = model.name.split(":free")[0];
|
const modelName = model.name.split(":free")[0];
|
||||||
const autoModelClient = {
|
const autoModelClient = {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { LargeLanguageModel } from "@/lib/schemas";
|
|||||||
import { readSettings } from "../../main/settings";
|
import { readSettings } from "../../main/settings";
|
||||||
import { Message } from "../ipc_types";
|
import { Message } from "../ipc_types";
|
||||||
|
|
||||||
import { getLanguageModels } from "../shared/language_model_helpers";
|
import { findLanguageModel } from "./findLanguageModel";
|
||||||
|
|
||||||
// Estimate tokens (4 characters per token)
|
// Estimate tokens (4 characters per token)
|
||||||
export const estimateTokens = (text: string): number => {
|
export const estimateTokens = (text: string): number => {
|
||||||
@@ -31,20 +31,3 @@ export async function getMaxTokens(model: LargeLanguageModel) {
|
|||||||
const modelOption = await findLanguageModel(model);
|
const modelOption = await findLanguageModel(model);
|
||||||
return modelOption?.maxOutputTokens || DEFAULT_MAX_TOKENS;
|
return modelOption?.maxOutputTokens || DEFAULT_MAX_TOKENS;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function findLanguageModel(model: LargeLanguageModel) {
|
|
||||||
const models = await getLanguageModels({
|
|
||||||
providerId: model.provider,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (model.customModelId) {
|
|
||||||
const customModel = models.find(
|
|
||||||
(m) => m.type === "custom" && m.id === model.customModelId,
|
|
||||||
);
|
|
||||||
if (customModel) {
|
|
||||||
return customModel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return models.find((m) => m.apiName === model.name);
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user