2025-05-21 19:08:51 -07:00
|
|
|
import { initChatModel } from "langchain/chat_models/universal";
|
|
|
|
|
import { GraphConfig } from "../types.js";
|
|
|
|
|
|
2025-05-22 13:19:40 -07:00
|
|
|
export enum Task {
|
|
|
|
|
PLANNER = "planner",
|
2025-05-22 19:05:29 -07:00
|
|
|
PLANNER_CONTEXT = "plannerContext",
|
2025-05-22 13:19:40 -07:00
|
|
|
ACTION_GENERATOR = "actionGenerator",
|
|
|
|
|
PROGRESS_PLAN_CHECKER = "progressPlanChecker",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TASK_TO_CONFIG_DEFAULTS_MAP = {
|
|
|
|
|
[Task.PLANNER]: {
|
2025-05-22 19:05:29 -07:00
|
|
|
modelName: "anthropic:claude-sonnet-4-0",
|
|
|
|
|
temperature: 0,
|
|
|
|
|
},
|
|
|
|
|
[Task.PLANNER_CONTEXT]: {
|
|
|
|
|
modelName: "anthropic:claude-sonnet-4-0",
|
2025-05-22 13:19:40 -07:00
|
|
|
temperature: 0,
|
|
|
|
|
},
|
|
|
|
|
[Task.ACTION_GENERATOR]: {
|
|
|
|
|
modelName: "anthropic:claude-sonnet-4-0",
|
|
|
|
|
temperature: 0,
|
|
|
|
|
},
|
|
|
|
|
[Task.PROGRESS_PLAN_CHECKER]: {
|
|
|
|
|
modelName: "anthropic:claude-sonnet-4-0",
|
|
|
|
|
temperature: 0,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export async function loadModel(config: GraphConfig, task: Task) {
|
2025-05-21 19:08:51 -07:00
|
|
|
const modelStr =
|
2025-05-22 13:19:40 -07:00
|
|
|
config.configurable?.[`${task}ModelName`] ??
|
|
|
|
|
TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName;
|
|
|
|
|
const temperature =
|
|
|
|
|
config.configurable?.[`${task}Temperature`] ??
|
|
|
|
|
TASK_TO_CONFIG_DEFAULTS_MAP[task].temperature;
|
|
|
|
|
|
2025-05-21 19:08:51 -07:00
|
|
|
const [modelProvider, ...modelNameParts] = modelStr.split(":");
|
2025-05-22 13:19:40 -07:00
|
|
|
|
|
|
|
|
let thinkingModel = false;
|
|
|
|
|
if (modelNameParts[0] === "extended-thinking") {
|
|
|
|
|
// Using a thinking model. Remove it from the model name.
|
|
|
|
|
modelNameParts.shift();
|
|
|
|
|
thinkingModel = true;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-21 19:08:51 -07:00
|
|
|
const modelName = modelNameParts.join(":");
|
2025-05-22 13:19:40 -07:00
|
|
|
if (modelProvider === "openai" && modelName.startsWith("o")) {
|
|
|
|
|
thinkingModel = true;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-22 19:05:29 -07:00
|
|
|
const thinkingBudgetTokens = 5000;
|
|
|
|
|
const maxTokens = thinkingBudgetTokens * 4;
|
|
|
|
|
|
2025-05-21 19:08:51 -07:00
|
|
|
const model = await initChatModel(modelName, {
|
|
|
|
|
modelProvider,
|
2025-05-22 13:19:40 -07:00
|
|
|
temperature: thinkingModel ? undefined : temperature,
|
|
|
|
|
...(thinkingModel && modelProvider === "anthropic"
|
2025-05-22 19:05:29 -07:00
|
|
|
? {
|
|
|
|
|
thinking: { budget_tokens: thinkingBudgetTokens, type: "enabled" },
|
|
|
|
|
maxTokens,
|
|
|
|
|
}
|
2025-05-22 13:19:40 -07:00
|
|
|
: {}),
|
2025-05-21 19:08:51 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return model;
|
|
|
|
|
}
|