feat: add Ollama audio transcription and runtime config reload

- add audio capability reporting for Ollama models
- support Telegram voice messages via ffmpeg conversion and Ollama transcription
- add USE_SYSTEM_PROMPT toggle and runtime reloading of .env/system prompt settings
- support ollama_options.json for custom Ollama request options
- improve Telegram MarkdownV2 escaping and formatting preservation
- add environment setters for AI provider credentials and models
- show audio capability in info/model commands
This commit is contained in:
2026-05-01 05:09:10 +03:00
parent 382e00ce31
commit 0f91e43ea0
11 changed files with 937 additions and 217 deletions
+70 -13
View File
@@ -24,8 +24,6 @@ export class Environment {
static ANSWERS: Answers;
static USE_NAMES_IN_PROMPT: boolean;
static MAX_PHOTO_SIZE: number;
static PROCESS_LINKS: boolean;
@@ -37,13 +35,15 @@ export class Environment {
static IMAGE_HANDLE_FALLBACK_POLICY: ImageHandleFallbackPolicy;
static SYSTEM_PROMPT?: string;
static USE_NAMES_IN_PROMPT: boolean;
static USE_SYSTEM_PROMPT: boolean;
static SEND_TIME_TOOK: boolean;
static OLLAMA_API_KEY?: string;
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;
static GEMINI_MODEL: string;
@@ -62,6 +62,7 @@ export class Environment {
static waitThinkText = "⏳ Дайте-ка подумать...";
static analyzingPictureText = "🔍 Внимательно изучаю изображение...";
static analyzingPicturesText = "🔍 Внимательно изучаю изображения...";
static transcribingAudioText = "🦻 Внимательно слушаю аудио...";
static genImageText = "👨‍🎨 Генерирую изображение...";
static ollamaCancelledText = "```Ollama\n❌ Отменено```";
@@ -79,8 +80,6 @@ export class Environment {
Environment.ENABLE_UNSAFE_EVAL = ifTrue(process.env.ENABLE_UNSAFE_EVAL);
Environment.USE_NAMES_IN_PROMPT = ifTrue(process.env.USE_NAMES_IN_PROMPT);
Environment.MAX_PHOTO_SIZE = Number(process.env.MAX_PHOTO_SIZE || "1280");
Environment.PROCESS_LINKS = ifTrue(process.env.PROCESS_LINKS);
@@ -113,13 +112,15 @@ export class Environment {
Environment.IMAGE_HANDLE_FALLBACK_POLICY = ImageHandleFallbackPolicy.NOTIFY_USER;
}
Environment.SEND_TIME_TOOK = ifTrue(process.env.SEND_TOOK_TIME || false);
Environment.USE_NAMES_IN_PROMPT = ifTrue(process.env.USE_NAMES_IN_PROMPT);
Environment.USE_SYSTEM_PROMPT = ifTrue(process.env.USE_SYSTEM_PROMPT || "true");
Environment.SEND_TIME_TOOK = ifTrue(process.env.SEND_TOOK_TIME || "false");
Environment.OLLAMA_API_KEY = process.env.OLLAMA_API_KEY;
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 || 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;
Environment.GEMINI_MODEL = process.env.GEMINI_MODEL || "gemini-2.5-flash-lite";
@@ -134,10 +135,26 @@ export class Environment {
Environment.OPENAI_IMAGE_MODEL = process.env.OPENAI_IMAGE_MODEL || "gpt-image-1-mini";
}
static setSystemPrompt(prompt: string) {
static setOnlyForCreatorMode(enable: boolean) {
this.ONLY_FOR_CREATOR_MODE = enable;
}
static setSystemPrompt(prompt: string | undefined) {
this.SYSTEM_PROMPT = prompt;
}
static setUseNamesInPrompt(use: boolean) {
this.USE_NAMES_IN_PROMPT = use;
}
static setUseSystemPrompt(use: boolean) {
this.USE_SYSTEM_PROMPT = use;
}
static setSendTimeTook(send: boolean) {
this.SEND_TIME_TOOK = send;
}
static setAdmins(admins: Set<number>) {
this.ADMIN_IDS = admins;
}
@@ -185,19 +202,59 @@ export class Environment {
this.ANSWERS = answers;
}
static setOllamaModel(newModel: string) {
Environment.OLLAMA_MODEL = newModel;
static setOllamaApiKey(key: string) {
this.OLLAMA_API_KEY = key;
}
static setOllamaAddress(address: string) {
this.OLLAMA_ADDRESS = address;
}
static setOllamaModel(ollamaModel: string) {
this.OLLAMA_MODEL = ollamaModel;
}
static setOllamaThinkModel(ollamaThinkModel: string) {
this.OLLAMA_THINK_MODEL = ollamaThinkModel;
}
static setOllamaImageModel(ollamaImageModel: string) {
this.OLLAMA_IMAGE_MODEL = ollamaImageModel;
}
static setGeminiApiKey(geminiApiKey: string) {
this.GEMINI_API_KEY = geminiApiKey;
}
static setGeminiModel(newModel: string) {
Environment.GEMINI_MODEL = newModel;
this.GEMINI_MODEL = newModel;
}
static setGeminiImageModel(newImageModel: string) {
this.GEMINI_IMAGE_MODEL = newImageModel;
}
static setMistralApiKey(newMistralApiKey: string) {
this.MISTRAL_API_KEY = newMistralApiKey;
}
static setMistralModel(newModel: string) {
Environment.MISTRAL_MODEL = newModel;
this.MISTRAL_MODEL = newModel;
}
static setOpenAIBaseUrl(newAIBaseUrl: string) {
this.OPENAI_BASE_URL = newAIBaseUrl;
}
static setOpenAIApiKey(newAIApiKey: string) {
this.OPENAI_API_KEY = newAIApiKey;
}
static setOpenAIModel(newModel: string) {
Environment.OPENAI_MODEL = newModel;
this.OPENAI_MODEL = newModel;
}
static setOpenAIImageModel(newImageModel: string) {
this.OPENAI_IMAGE_MODEL = newImageModel;
}
}