Фото в вопросах, Gemini 3.8 Flash по умолчанию, команды /context и /clear

- Бот смотрит фото: подпись с упоминанием, /ask в подписи или ответом на фото, фото в личке
- Картинки скачиваются через Bot API и передаются модели байтами (ссылка с токеном наружу не уходит)
- OpenRouter по умолчанию — openrouter/google/gemini-3.8-flash; AI_IMAGE_INPUT для явного выбора
- Модель без зрения получает пометку, что фото есть, но она его не видит
- /context: сколько бот помнит и видит ли всю переписку (privacy mode / админ)
- /clear: очистка сохранённой переписки чата с подтверждением

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 20:04:06 +02:00
parent 34a8d426d2
commit f8273e8a23
15 changed files with 313 additions and 46 deletions

View File

@@ -39,6 +39,8 @@ export const createMessageRepository = (db: Db) => {
"SELECT * FROM messages WHERE chat_id = ? AND user_id = ? ORDER BY message_id DESC LIMIT ?",
),
findById: db.prepare("SELECT * FROM messages WHERE chat_id = ? AND message_id = ?"),
statsByChat: db.prepare("SELECT COUNT(*) AS count, MIN(date) AS oldest FROM messages WHERE chat_id = ?"),
deleteByChat: db.prepare("DELETE FROM messages WHERE chat_id = ?"),
};
const toChronological = (rows: unknown[]): ChatMessage[] => (rows as MessageRow[]).reverse().map(toMessage);
@@ -63,7 +65,14 @@ export const createMessageRepository = (db: Db) => {
return row && toMessage(row);
};
return { upsertAndPrune, latest, latestByUser, findById };
/** Сколько сообщений чата сохранено и дата самого старого (null — если пусто). */
const statsByChat = (chatId: number): { count: number; oldest: number | null } =>
statements.statsByChat.get(chatId) as { count: number; oldest: number | null };
/** Удаляет всю сохранённую историю чата; возвращает, сколько сообщений удалено. */
const deleteByChat = (chatId: number): number => statements.deleteByChat.run(chatId).changes;
return { upsertAndPrune, latest, latestByUser, findById, statsByChat, deleteByChat };
};
export type MessageRepository = ReturnType<typeof createMessageRepository>;