Telegram-бот Boltun AI на grammY + Mastra

- Отвечает только администраторам из ADMIN_IDS
- Личности на чат: встроенные и пользовательские (/personas, /persona, /persona_add, /persona_del)
- Вопросы через /ask, упоминание, ответ боту или личку
- Сохраняет сообщения чата в SQLite; агент по просьбе читает их инструментом read_chat_messages
- Модели через OpenRouter (по умолчанию DeepSeek)
- Слои: libs, repositories, services, bot/handlers
- Dockerfile для деплоя в Dokploy

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 18:31:44 +02:00
commit 99c4660da9
32 changed files with 3173 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
import { Agent } from "@mastra/core/agent";
import { RequestContext } from "@mastra/core/request-context";
import type { Persona } from "../../types.js";
import type { ChatHistoryService } from "../chat-history-service.js";
import { BASE_RULES, buildInstructions, buildPrompt, type Question } from "./prompts.js";
import { createReadChatMessagesTool, type AssistantRequestContext } from "./tools/read-chat-messages-tool.js";
export type { Question } from "./prompts.js";
interface AssistantServiceDeps {
model: string;
chatHistoryService: ChatHistoryService;
}
const MAX_AGENT_STEPS = 5;
export const createAssistantService = ({ model, chatHistoryService }: AssistantServiceDeps) => {
const agent = new Agent({
id: "boltun",
name: "Boltun",
instructions: BASE_RULES,
model,
tools: { readChatMessages: createReadChatMessagesTool(chatHistoryService) },
});
/** Ответ на вопрос в образе личности; агент сам решает, нужно ли читать историю чата. */
const answer = async (question: Question, persona: Persona): Promise<string> => {
const requestContext = new RequestContext<AssistantRequestContext>();
requestContext.set("chatId", question.chatId);
const result = await agent.generate(buildPrompt(question), {
instructions: buildInstructions(question, persona),
requestContext,
maxSteps: MAX_AGENT_STEPS,
});
return result.text.trim();
};
return { answer };
};
export type AssistantService = ReturnType<typeof createAssistantService>;