DeepSeek напрямую как провайдер по умолчанию, проверка ключа модели при старте

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 19:02:41 +02:00
parent 26da4bb5ee
commit 34a8d426d2
4 changed files with 45 additions and 11 deletions

View File

@@ -34,13 +34,41 @@ const parseAdminIds = (raw: string): Set<number> => {
return new Set(ids);
};
/** Ключ, который Mastra берёт из env для провайдера модели (`<провайдер>/<модель>`). */
const PROVIDER_API_KEYS: Record<string, string> = {
deepseek: "DEEPSEEK_API_KEY",
openrouter: "OPENROUTER_API_KEY",
};
/** Есть ключ DeepSeek — ходим в DeepSeek напрямую, иначе через OpenRouter. */
const defaultModel = (): string =>
process.env.DEEPSEEK_API_KEY?.trim() ? "deepseek/deepseek-flash" : "openrouter/deepseek/deepseek-v4-flash";
/** Модель из AI_MODEL (или по умолчанию) + проверка, что ключ её провайдера задан. */
const parseModel = (): string => {
const hasAnyKey = Object.values(PROVIDER_API_KEYS).some((name) => process.env[name]?.trim());
if (!process.env.AI_MODEL?.trim() && !hasAnyKey) {
throw new Error("Задай ключ модели: DEEPSEEK_API_KEY (DeepSeek напрямую) или OPENROUTER_API_KEY");
}
const model = process.env.AI_MODEL?.trim() || defaultModel();
const [provider = ""] = model.split("/");
const keyName = PROVIDER_API_KEYS[provider];
if (keyName) required(keyName);
return model;
};
/** Путь к SQLite; нужен и боту, и скрипту `seed`, которому остальные переменные не нужны. */
export const DB_PATH = process.env.DB_PATH?.trim() || "data/bot.db";
export const loadBotConfig = () => ({
botToken: required("BOT_TOKEN"),
adminIds: parseAdminIds(required("ADMIN_IDS")),
aiModel: process.env.AI_MODEL?.trim() || "openrouter/deepseek/deepseek-v4-flash",
aiModel: parseModel(),
/** Сколько последних сообщений каждого чата хранить в базе. */
historyLimit: positiveInt("HISTORY_LIMIT", 2000),
});