3848dd82d9
Add explicit chat capability tracking, expose formatted runtime capabilities in the info command, and support a max context size option for user AI settings. Also update Ollama base URL resolution to use OLLAMA_ADDRESS and simplify provider chat command execution.
100 lines
3.8 KiB
TypeScript
100 lines
3.8 KiB
TypeScript
import {CallbackQuery} from "typescript-telegram-bot-api";
|
|
import {CallbackCommand} from "../base/callback-command";
|
|
import {UserStore} from "../common/user-store";
|
|
import {
|
|
ensureValidUserAiSettings,
|
|
normalizeAiContextSizeChoice,
|
|
normalizeAiProviderChoice,
|
|
normalizeAiResponseLanguage,
|
|
normalizeAiVoiceMode,
|
|
normalizeInterfaceLanguage,
|
|
resolveInterfaceLocaleForUser,
|
|
setUserAiContextSizeChoice,
|
|
setUserAiProviderChoice,
|
|
setUserAiResponseLanguage,
|
|
setUserAiVoiceMode,
|
|
setUserInterfaceLanguage,
|
|
} from "../common/user-ai-settings";
|
|
import {
|
|
buildUserSettingsKeyboard,
|
|
formatUserSettingsText,
|
|
parseUserSettingsCallbackData,
|
|
USER_SETTINGS_CALLBACK_PREFIX,
|
|
UserSettingsScreen,
|
|
} from "../common/user-settings-view";
|
|
import {editMessageText, ignoreIfNotChanged, logError} from "../util/utils";
|
|
import {Environment} from "../common/environment";
|
|
import {Localization} from "../common/localization";
|
|
|
|
export class UserSettingsCallback extends CallbackCommand {
|
|
data = USER_SETTINGS_CALLBACK_PREFIX;
|
|
text = Environment.userSettingsCallbackText;
|
|
|
|
async execute(query: CallbackQuery): Promise<void> {
|
|
if (!query.message || !query.data) return;
|
|
|
|
const message = query.message;
|
|
const parsed = parseUserSettingsCallbackData(query.data);
|
|
if (!parsed || parsed.userId !== query.from.id) return;
|
|
|
|
await UserStore.put(query.from);
|
|
|
|
let screen: UserSettingsScreen = parsed.screen;
|
|
let settings = await ensureValidUserAiSettings(query.from.id);
|
|
|
|
if (parsed.screen === "provider" && parsed.providerChoice) {
|
|
const choice = normalizeAiProviderChoice(parsed.providerChoice);
|
|
if (choice) {
|
|
const result = await setUserAiProviderChoice(query.from.id, choice);
|
|
settings = result.settings;
|
|
}
|
|
screen = "provider";
|
|
}
|
|
|
|
if (parsed.screen === "interfaceLanguage" && parsed.interfaceLanguage) {
|
|
const language = normalizeInterfaceLanguage(parsed.interfaceLanguage);
|
|
if (language) {
|
|
const result = await setUserInterfaceLanguage(query.from.id, language);
|
|
settings = result.settings;
|
|
}
|
|
screen = "interfaceLanguage";
|
|
}
|
|
|
|
if (parsed.screen === "responseLanguage" && parsed.responseLanguage) {
|
|
const language = normalizeAiResponseLanguage(parsed.responseLanguage);
|
|
if (language) {
|
|
const result = await setUserAiResponseLanguage(query.from.id, language);
|
|
settings = result.settings;
|
|
}
|
|
screen = "responseLanguage";
|
|
}
|
|
|
|
if (parsed.screen === "contextSize" && parsed.contextSizeChoice) {
|
|
const choice = normalizeAiContextSizeChoice(parsed.contextSizeChoice);
|
|
if (choice || choice === -1) {
|
|
const result = await setUserAiContextSizeChoice(query.from.id, choice);
|
|
settings = result.settings;
|
|
}
|
|
screen = "contextSize";
|
|
}
|
|
|
|
if (parsed.screen === "voiceMode" && parsed.voiceMode) {
|
|
const mode = normalizeAiVoiceMode(parsed.voiceMode);
|
|
if (mode) {
|
|
const result = await setUserAiVoiceMode(query.from.id, mode);
|
|
settings = result.settings;
|
|
}
|
|
screen = "voiceMode";
|
|
}
|
|
|
|
const locale = await resolveInterfaceLocaleForUser(query.from.id, query.from.language_code);
|
|
|
|
await Localization.runWithLocale(locale, () => editMessageText({
|
|
chat_id: message.chat.id,
|
|
message_id: message.message_id,
|
|
text: formatUserSettingsText(settings, screen),
|
|
reply_markup: buildUserSettingsKeyboard(settings, screen),
|
|
})).catch(ignoreIfNotChanged).catch(logError);
|
|
}
|
|
}
|