From feb0ada324dc9368ac3586625686e4de295566d5 Mon Sep 17 00:00:00 2001 From: zhaoyingbo Date: Sun, 12 Jan 2025 06:16:41 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=E5=92=8C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=9B=E4=BC=98=E5=8C=96=E7=BE=A4=E7=BB=84?= =?UTF-8?q?=E6=80=BB=E7=BB=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 164742 -> 167140 bytes constant/config.ts | 1 + constant/message.ts | 1 + controller/groupAgent/report.ts | 299 ++++++++++---------------------- db/chat/index.ts | 106 +++++++++++ db/grpSumLog/index.ts | 4 +- db/grpSumSub/index.ts | 59 ------- db/index.ts | 4 +- package.json | 10 +- routes/bot/eventMsg.ts | 8 +- 10 files changed, 210 insertions(+), 282 deletions(-) create mode 100644 db/chat/index.ts delete mode 100644 db/grpSumSub/index.ts diff --git a/bun.lockb b/bun.lockb index 900659543f79e9bae6bb7bf9d0c016089515d859..b5538e6cfda542a8444ceebe5a177f0a57ab2e36 100755 GIT binary patch delta 16970 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 G2>w5*R)|Xg diff --git a/constant/config.ts b/constant/config.ts index a7bc496..fa0ce02 100644 --- a/constant/config.ts +++ b/constant/config.ts @@ -14,6 +14,7 @@ export interface AppInfoModel extends RecordModel { appId: string appSecret: string appName: string + errChatId: string } export const APP_CONFIG: Record = {} diff --git a/constant/message.ts b/constant/message.ts index 5c0ee27..9498ca1 100644 --- a/constant/message.ts +++ b/constant/message.ts @@ -7,4 +7,5 @@ export enum RespMessage { cancelWeeklySuccess = "周报订阅取消成功", registerFailed = "订阅失败", cancelFailed = "取消订阅失败", + summaryFailed = "总结失败", } diff --git a/controller/groupAgent/report.ts b/controller/groupAgent/report.ts index 34c5398..4a58d6d 100644 --- a/controller/groupAgent/report.ts +++ b/controller/groupAgent/report.ts @@ -1,9 +1,5 @@ -import { LarkService } from "@egg/net-tool" - -import { APP_MAP } from "../../constant/config" import { RespMessage } from "../../constant/message" import db from "../../db" -import { GrpSumSubWithApp } from "../../db/grpSumSub" import { Context } from "../../types" import genContext from "../../utils/genContext" import llm from "../../utils/llm" @@ -17,26 +13,22 @@ import getChatHistory from "./chatHistory" * @param {any} subscription - 订阅信息 * @returns {Promise} */ -const genReport = async ( +const genSummary = async ( ctx: Context, timeScope: "daily" | "weekly", - subscription: GrpSumSubWithApp + trigger: "auto" | "manual" ) => { - const { logger, requestId, larkCard } = ctx + const { logger, requestId, larkCard, larkService, appInfo, larkBody } = ctx + logger.info(`genSummary ${timeScope} by ${trigger}`) const cardGender = larkCard.child("groupAgent") try { - const { - chatId, - expand: { - app: { appId, appSecret, appName }, - }, - } = subscription - // 组织接口 - const larkService = new LarkService({ - appId, - appSecret, - requestId, - }) + // 获取群聊信息 + const chat = await db.chat.getAndCreate(ctx) + if (!chat) { + throw new Error("Failed to get chat info") + } + const { chatId } = chat + // 获取时间范围 const { startTime, endTime } = getTimeRange(timeScope) @@ -50,9 +42,10 @@ const genReport = async ( chatId, startTime, endTime, - excludeMentions: [appName], + excludeMentions: [appInfo.appName], } ) + if (chatHistory.length === 0) { logger.info(`No message in chat ${chatId}`) return @@ -69,29 +62,46 @@ const genReport = async ( }, requestId ) + // 计时结束 const processEnd = Date.now() const processingTime = ((processEnd - processStart) / 1000).toFixed(2) logger.info( `LLM takes time: ${processingTime}s, see detail: http://langfuse.ai.srv/project/cm1j2tkj9001gukrgdvc1swuw/sessions/${requestId}` ) + // 生成卡片内容 const cardContent = cardGender.genCard("autoReport", { llmRes, timeScope: timeScope === "daily" ? "今日日报" : "本周周报", }) - // 发送卡片消息 - await larkService.message.sendCard2Chat(chatId, cardContent) + + // 发送卡片消息,手动触发时回复原消息 + if (trigger === "manual") { + await larkService.message.replyCard(larkBody.messageId, cardContent) + } else { + await larkService.message.sendCard2Chat(chatId, cardContent) + } + // 记录总结日志 await db.grpSumLog.create({ - subscription: subscription.id, + chat: chat.id, content: JSON.stringify(cardContent), langfuseLink: `http://langfuse.ai.srv/project/cm1j2tkj9001gukrgdvc1swuw/sessions/${requestId}`, }) } catch (error: any) { - logger.error( - `Failed to summarize chat ${subscription.chatId}: ${error.message}` + logger.error(`Failed to summarize chat: ${error.message}`) + const errorCard = cardGender.genErrorCard( + `${RespMessage.summaryFailed}: ${error.message}` ) + // 手动触发时回复原消息 + if (trigger === "manual") { + await larkService.message.replyCard(larkBody.messageId, errorCard) + } + // 自动触发发送给自己的订阅群 + else { + await larkService.message.sendCard2Chat(appInfo.errChatId, errorCard) + } } } @@ -100,39 +110,30 @@ const genReport = async ( * @returns {Promise} */ const genAllReport = async (timeScope: "daily" | "weekly" = "daily") => { - const ctx = await genContext(new Request("https://baidu.com")) + const ctx = await genContext( + new Request("https://lark-egg-preview.ai.xiaomi.com") + ) const { logger } = ctx - + logger.info(`genAllReport ${timeScope}`) try { - // 获取全部需要自动总结的群组 - let subList = await db.grpSumSub.getAll( - `terminator = ""${timeScope === "daily" ? ' && timeScope = "daily"' : ""}` - ) - - // 没有需要总结的群组 - if (!subList || subList.length === 0) { - logger.info("No group needs to be summarized") + // 获取所有需要自动总结的群组 + const chatList = await db.chat.getNeedSummaryChats("all") + logger.debug(`chatList: ${JSON.stringify(chatList)}`) + if (!chatList || chatList.length === 0) { + logger.info(`No chat need to summarize`) return } - - // 如果是周五,获取了需要日报和周报的订阅,根据chatId,过滤掉需要周报的日报订阅 - if (timeScope === "weekly") { - const dailySubList = subList.filter((sub) => sub.timeScope === "daily") - const weeklySubList = subList.filter((sub) => sub.timeScope === "weekly") - // 过滤掉需要周报的日报订阅 - subList = dailySubList - .filter( - (dailySub) => - !weeklySubList.find( - (weeklySub) => weeklySub.chatId === dailySub.chatId - ) - ) - .concat(weeklySubList) - } - - // 一个一个群组的总结,避免触发频率限制 - for (const sub of subList) { - await genReport(ctx, sub.timeScope, sub) + // 总结 + for (const chat of chatList) { + const newCtx = await genContext( + new Request("https://lark-egg-preview.ai.xiaomi.com") + ) + newCtx.larkBody.chatId = chat.chatId + let scope = "daily" as "daily" | "weekly" + if (timeScope === "weekly" && chat.weeklySummary) { + scope = "weekly" + } + await genSummary(newCtx, scope, "auto") } } catch (e: any) { logger.error(`Auto summary error: ${e.message}`) @@ -147,102 +148,57 @@ const genAllReport = async (timeScope: "daily" | "weekly" = "daily") => { const gen4Test = async (ctx: Context, timeScope: "daily" | "weekly") => { const { logger, - larkCard, - larkService, larkBody: { chatId }, } = ctx try { logger.info(`timeScope: ${timeScope}`) - // 获取需要总结的chatId - if (!chatId) { - logger.error("Invalid request body") - return - } - - // 获取订阅信息 - const sub = await db.grpSumSub.getByFilter( - `terminator = "" && chatId = "${chatId}" && timeScope = "${timeScope}"` - ) - // 没有订阅信息 - if (!sub) { - logger.error(`No subscription found for chat ${chatId}`) - await larkService.message.sendCard2Chat( - chatId, - larkCard.genErrorCard( - `本群未订阅${timeScope === "daily" ? "日报" : "周报"}` - ) - ) - return - } // 总结 - await genReport(ctx, timeScope, sub) + await genSummary(ctx, timeScope, "manual") } catch (error: any) { logger.error(`Failed to summarize chat ${chatId}: ${error.message}`) } } /** - * 注册消息总结的订阅 - * @returns + * 设置订阅 + * @param {Context} ctx - 请求上下文 + * @param {string} timeScope - 订阅时间范围 + * @param {boolean} value - 订阅值 + * @returns {Promise} */ -const subscribe = async ( - { app, larkService, logger, larkBody, larkCard }: Context, - timeScope: "daily" | "weekly" +const setSubscription = async ( + ctx: Context, + timeScope: "daily" | "weekly", + value: boolean ) => { + const { larkService, logger, larkBody, larkCard } = ctx const cardGender = larkCard.child("groupAgent") - const sendErrorMsg = () => + const sendErrorMsg = (message: string) => larkService.message.replyCard( larkBody.messageId, - cardGender.genErrorCard(RespMessage.registerFailed) + cardGender.genErrorCard( + `${ + value ? RespMessage.registerFailed : RespMessage.cancelFailed + }: ${message}` + ) ) try { - // 判断是否有 chatId 和 userId - if (!larkBody.chatId || !larkBody.userId) { - logger.error(`chatId or userId is empty`) - return + const { chatId } = larkBody + if (!chatId) { + throw new Error("Invalid chatId") } - - // 获取用户信息 - const user = await db.user.getByCtx({ larkBody, larkService } as Context) - if (!user) { - logger.error(`Failed to get user info`) - await sendErrorMsg() - return + // 获取群组信息 + const chat = await db.chat.getAndCreate(ctx) + if (!chat) { + throw new Error("Failed to get chat info") } - // 先查询是否已经存在订阅 - const sub = await db.grpSumSub.getByFilter( - `terminator = "" && chatId = "${larkBody.chatId} && timeScope = "${timeScope}"` - ) - if (sub) { - logger.info( - `chatId: ${larkBody.chatId} has been registered, timeScope: ${timeScope}` - ) - // 发送已经注册过了的消息 - await larkService.message.replyCard( - larkBody.messageId, - cardGender.genSuccessCard( - timeScope === "daily" - ? RespMessage.hasRegisteredDaily - : RespMessage.hasRegisteredWeekly - ) - ) - return - } - // 注册订阅 - const createRes = await db.grpSumSub.create({ - app: APP_MAP[app].id, - initiator: user.id, - terminator: "", - chatId: larkBody.chatId, - timeScope, - }) - - if (!createRes) { - logger.error( - `Failed to register chatId: ${larkBody.chatId}, timeScope: ${timeScope}` - ) - await sendErrorMsg() - return + // 更新订阅信息, 如果订阅信息没有变化则不更新 + if (chat[`${timeScope}Summary`] !== value) { + logger.info("value is different, update subscription") + const res = await db.chat.updateSummary(chat.id, timeScope, value) + if (!res) { + throw new Error("Failed to update subscription") + } } // 发送成功消息 await larkService.message.replyCard( @@ -255,92 +211,15 @@ const subscribe = async ( ) } catch (e: any) { logger.error(`Subscribe error: ${e.message}`) - await sendErrorMsg() - } -} - -/** - * 取消消息总结的订阅 - * @returns - */ -const unsubscribe = async ( - { logger, larkBody, larkService, larkCard }: Context, - timeScope: "daily" | "weekly" -) => { - const cardGender = larkCard.child("groupAgent") - const sendErrorMsg = () => - larkService.message.replyCard( - larkBody.messageId, - cardGender.genErrorCard(RespMessage.cancelFailed) - ) - try { - // 判断是否有 chatId 和 userId - if (!larkBody.chatId || !larkBody.userId) { - logger.error(`chatId or userId is empty`) - return - } - - // 获取用户信息 - const user = await db.user.getByCtx({ larkBody, larkService } as Context) - if (!user) { - logger.error(`Failed to get user info`) - await sendErrorMsg() - return - } - // 先查询是否已经存在订阅 - const sub = await db.grpSumSub.getByFilter( - `terminator = "" && chatId = "${larkBody.chatId} && timeScope = "${timeScope}"` - ) - - if (!sub) { - logger.info( - `chatId: ${larkBody.chatId} has not been registered, timeScope: ${timeScope}` - ) - // 发送未注册的消息 - await larkService.message.replyCard( - larkBody.messageId, - cardGender.genSuccessCard( - timeScope === "daily" - ? RespMessage.cancelDailySuccess - : RespMessage.cancelWeeklySuccess - ) - ) - return - } - // 更新订阅 - const updateRes = await db.grpSumSub.update(sub.id, { - terminator: user.id, - }) - - if (!updateRes) { - logger.error( - `Failed to cancel chatId: ${larkBody.chatId}, timeScope: ${timeScope}` - ) - await sendErrorMsg() - return - } - - // 发送成功消息 - await larkService.message.replyCard( - larkBody.messageId, - cardGender.genSuccessCard( - timeScope === "daily" - ? RespMessage.cancelDailySuccess - : RespMessage.cancelWeeklySuccess - ) - ) - } catch (e: any) { - logger.error(`Unsubscribe error: ${e.message}`) - await sendErrorMsg() + await sendErrorMsg(e.message) } } const report = { - genReport, + genSummary, genAllReport, gen4Test, - subscribe, - unsubscribe, + setSubscription, } export default report diff --git a/db/chat/index.ts b/db/chat/index.ts new file mode 100644 index 0000000..9923988 --- /dev/null +++ b/db/chat/index.ts @@ -0,0 +1,106 @@ +import { RecordModel } from "pocketbase" + +import { Context } from "../../types" +import { managePbError } from "../../utils/pbTools" +import pbClient from "../pbClient" + +const DB_NAME = "chat" + +export interface Chat { + chatId: string + name: string + avatar: string + mode: "group" | "p2p" | "topic" + weeklySummary: boolean + dailySummary: boolean +} + +export type ChatModel = Chat & RecordModel + +/** + * 获取单个群组信息 + * @param id + * @returns + */ +const getOneByChatId = (chatId: string) => + managePbError(() => + pbClient.collection(DB_NAME).getFirstListItem(`chatId = "${chatId}"`) + ) + +/** + * 创建群组 + * @param chat + * @returns + */ +const create = (chat: Chat) => + managePbError(() => pbClient.collection(DB_NAME).create(chat)) + +/** + * 获取并创建群组 + * @param chatId + * @param context + * @returns + */ +const getAndCreate = async ({ larkService, logger, larkBody }: Context) => { + const { chatId } = larkBody + if (!chatId) { + logger.error(`chatId is empty`) + return null + } + const chat = await getOneByChatId(chatId) + if (chat) return chat + logger.info(`chat ${chatId} not found, try to get from lark`) + const chatInfo = await larkService.chat.getChatInfo(chatId) + if (!chatInfo || chatInfo.code !== 0) return null + const { name, avatar, chat_mode } = chatInfo.data + const newChat = { + chatId, + name, + avatar, + mode: chat_mode, + weeklySummary: false, + dailySummary: false, + } + return create(newChat) +} + +/** + * 更新群组总结 + * @param id + * @param timeScope + * @param value + * @returns + */ +const updateSummary = async ( + id: string, + timeScope: "daily" | "weekly", + value: boolean +) => + managePbError(() => + pbClient.collection(DB_NAME).update(id, { [`${timeScope}Summary`]: value }) + ) + +/** + * 获取需要总结的群组 + * @param timeScope + * @returns + */ +const getNeedSummaryChats = async (timeScope: "daily" | "weekly" | "all") => { + const filterMap = { + daily: "dailySummary = true", + weekly: "weeklySummary = true", + all: "dailySummary = true && weeklySummary = true", + } + return managePbError(() => + pbClient.collection(DB_NAME).getFullList({ filter: filterMap[timeScope] }) + ) +} + +const chat = { + getAndCreate, + getOneByChatId, + updateSummary, + getNeedSummaryChats, +} + +export default chat diff --git a/db/grpSumLog/index.ts b/db/grpSumLog/index.ts index 7eb923e..39e8c34 100644 --- a/db/grpSumLog/index.ts +++ b/db/grpSumLog/index.ts @@ -3,10 +3,10 @@ import { RecordModel } from "pocketbase" import { managePbError } from "../../utils/pbTools" import pbClient from "../pbClient" -const DB_NAME = "groupSummaryLog" +const DB_NAME = "grpSumLog" export interface GroupSummaryLog { - subscription: string + chat: string content: string langfuseLink: string } diff --git a/db/grpSumSub/index.ts b/db/grpSumSub/index.ts deleted file mode 100644 index 8ca7c1d..0000000 --- a/db/grpSumSub/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { RecordModel } from "pocketbase" - -import { AppInfoModel } from "../../constant/config" -import { managePbError } from "../../utils/pbTools" -import pbClient from "../pbClient" - -const DB_NAME = "groupSummarySubscription" - -export interface GroupSummarySubscription { - app: string - initiator: string - terminator: string - chatId: string - timeScope: "daily" | "weekly" -} - -export type GroupSummarySubscriptionModel = GroupSummarySubscription & - RecordModel - -export interface GrpSumSubWithApp extends GroupSummarySubscriptionModel { - expand: { - app: AppInfoModel - } -} - -const create = async (subscription: GroupSummarySubscription) => - managePbError(() => - pbClient.collection(DB_NAME).create(subscription) - ) - -const update = async ( - id: string, - subscription: Partial -) => - managePbError(() => - pbClient.collection(DB_NAME).update(id, subscription) - ) - -const getAll = async (filter: string = "") => - managePbError(() => - pbClient.collection(DB_NAME).getFullList({ - filter, - expand: "app", - }) - ) - -const getByFilter = async (filter: string) => - managePbError(() => - pbClient.collection(DB_NAME).getFirstListItem(filter, { expand: "app" }) - ) - -const grpSumSub = { - create, - update, - getAll, - getByFilter, -} - -export default grpSumSub diff --git a/db/index.ts b/db/index.ts index 947726f..2ca54b0 100644 --- a/db/index.ts +++ b/db/index.ts @@ -1,18 +1,18 @@ import apiKey from "./apiKey" +import chat from "./chat" import gitlabProject from "./gitlabProject/index." import grpSumLog from "./grpSumLog" -import grpSumSub from "./grpSumSub" import log from "./log" import receiveGroup from "./receiveGroup" import user from "./user" const db = { + chat, apiKey, receiveGroup, log, user, grpSumLog, - grpSumSub, gitlabProject, } diff --git a/package.json b/package.json index 40944b6..5956d69 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,11 @@ "devDependencies": { "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", - "@eslint/js": "^9.17.0", + "@eslint/js": "^9.18.0", "@types/node-schedule": "^2.1.7", "@types/uuid": "^10.0.0", "bun-types": "^1.1.43", - "eslint": "^9.17.0", + "eslint": "^9.18.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unused-imports": "^4.1.4", "husky": "^9.1.7", @@ -39,11 +39,11 @@ "@egg/hooks": "^1.2.0", "@egg/lark-msg-tool": "^1.21.0", "@egg/logger": "^1.6.0", - "@egg/net-tool": "^1.21.0", + "@egg/net-tool": "^1.22.0", "@egg/path-tool": "^1.4.1", - "@langchain/core": "^0.3.27", + "@langchain/core": "^0.3.29", "@langchain/langgraph": "^0.2.39", - "@langchain/openai": "^0.3.16", + "@langchain/openai": "^0.3.17", "joi": "^17.13.3", "langfuse-langchain": "^3.32.0", "node-schedule": "^2.1.1", diff --git a/routes/bot/eventMsg.ts b/routes/bot/eventMsg.ts index b5d29e9..3990fa9 100644 --- a/routes/bot/eventMsg.ts +++ b/routes/bot/eventMsg.ts @@ -185,7 +185,7 @@ const manageCMDMsg = async (ctx: Context) => { logger.info( `bot command is register, chatId: ${chatId}, timeScope: daily` ) - groupAgent.report.subscribe(ctx, "daily") + groupAgent.report.setSubscription(ctx, "daily", true) return } // 注册群组周报 @@ -193,7 +193,7 @@ const manageCMDMsg = async (ctx: Context) => { logger.info( `bot command is register, chatId: ${chatId}, timeScope: weekly` ) - groupAgent.report.subscribe(ctx, "weekly") + groupAgent.report.setSubscription(ctx, "weekly", true) return } @@ -202,7 +202,7 @@ const manageCMDMsg = async (ctx: Context) => { logger.info( `bot command is unregister, chatId: ${chatId}, timeScope: daily` ) - groupAgent.report.unsubscribe(ctx, "daily") + groupAgent.report.setSubscription(ctx, "daily", false) return } // 注销群组周报 @@ -210,7 +210,7 @@ const manageCMDMsg = async (ctx: Context) => { logger.info( `bot command is unregister, chatId: ${chatId}, timeScope: weekly` ) - groupAgent.report.unsubscribe(ctx, "weekly") + groupAgent.report.setSubscription(ctx, "weekly", false) return } // 立即发送日简报