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:
44
src/services/assistant/assistant-service.ts
Normal file
44
src/services/assistant/assistant-service.ts
Normal 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>;
|
||||
Reference in New Issue
Block a user