feat: separate Ollama text/image/think models + add YouTube downloader

Support OLLAMA_IMAGE_MODEL and new OLLAMA_THINK_MODEL (both default to OLLAMA_MODEL)

Add /ollamathink command; validate thinking capability; disable image-analysis flow in think mode

Make /ollama-get-model show Text/Image/Think blocks only when models differ

Add /ytdl (/youtube) command + auto-detect YouTube URLs in messages

Cache downloaded videos to data/video and schedule daily cleanup

Move photo storage from data/temp to data/photo; improve env boolean parsing via ifTrue

Update deps (youtubei.js, puppeteer*) and TS config (allowJs, allowSyntheticDefaultImports)
This commit is contained in:
2026-01-31 19:36:11 +03:00
parent 23052fae0f
commit 810151263d
14 changed files with 1921 additions and 66 deletions
+8 -5
View File
@@ -1,6 +1,7 @@
import path from "node:path";
import {saveData} from "../db/database";
import {Answers} from "../model/answers";
import {ifTrue} from "../util/utils";
export class Environment {
static BOT_TOKEN: string;
@@ -28,6 +29,7 @@ export class Environment {
static OLLAMA_ADDRESS?: string;
static OLLAMA_MODEL?: string;
static OLLAMA_IMAGE_MODEL?: string;
static OLLAMA_THINK_MODEL?: string;
static OLLAMA_API_KEY?: string;
static GEMINI_API_KEY?: string;
@@ -45,17 +47,17 @@ export class Environment {
static load() {
Environment.BOT_TOKEN = process.env.BOT_TOKEN;
Environment.TEST_ENVIRONMENT = process.env.TEST_ENVIRONMENT === "true";
Environment.TEST_ENVIRONMENT = ifTrue(process.env.TEST_ENVIRONMENT);
Environment.CHAT_IDS_WHITELIST = new Set(process.env.CHAT_IDS_WHITELIST?.split(",")?.map(e => parseInt(e.trim(), 10)) || []);
Environment.BOT_PREFIX = process.env.BOT_PREFIX || "";
Environment.CREATOR_ID = parseInt(process.env.CREATOR_ID || "");
Environment.IS_DOCKER = process.env.IS_DOCKER == "true";
Environment.IS_DOCKER = ifTrue(process.env.IS_DOCKER);
Environment.DATA_PATH = Environment.IS_DOCKER ? "/" + path.join("config", "data") : "data";
Environment.DB_PATH = "file:" + path.join(Environment.DATA_PATH, Environment.DB_FILE_NAME);
Environment.ONLY_FOR_CREATOR_MODE = process.env.ONLY_FOR_CREATOR_MODE == "true";
Environment.ONLY_FOR_CREATOR_MODE = ifTrue(process.env.ONLY_FOR_CREATOR_MODE);
Environment.USE_NAMES_IN_PROMPT = process.env.USE_NAMES_IN_PROMPT == "true";
Environment.USE_NAMES_IN_PROMPT = ifTrue(process.env.USE_NAMES_IN_PROMPT);
Environment.MAX_PHOTO_SIZE = Number(process.env.MAX_PHOTO_SIZE || "1280");
@@ -63,7 +65,8 @@ export class Environment {
Environment.OLLAMA_ADDRESS = process.env.OLLAMA_ADDRESS;
Environment.OLLAMA_MODEL = process.env.OLLAMA_MODEL || "gemma3:4b";
Environment.OLLAMA_IMAGE_MODEL = process.env.OLLAMA_IMAGE_MODEL || "gemma3:4b";
Environment.OLLAMA_IMAGE_MODEL = process.env.OLLAMA_IMAGE_MODEL || Environment.OLLAMA_MODEL;
Environment.OLLAMA_THINK_MODEL = process.env.OLLAMA_THINK_MODEL || Environment.OLLAMA_MODEL;
Environment.OLLAMA_API_KEY = process.env.OLLAMA_API_KEY;
Environment.GEMINI_API_KEY = process.env.GEMINI_API_KEY;