From ea65fc6ec8eaa2b57a36c4b31d31a975e62bcb09 Mon Sep 17 00:00:00 2001 From: zhaoyingbo Date: Wed, 18 Dec 2024 10:40:09 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=81=E7=A7=BBPocketbase=E8=87=B3Ma?= =?UTF-8?q?trix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 18 ++++-------- bun.lockb | Bin 164667 -> 166328 bytes constant/appMap.ts | 13 --------- constant/config.ts | 45 +++++++++++++++++++++++++++++ controller/groupAgent/report.ts | 4 +-- db/apiKey/index.ts | 38 +++++++++++++++++++++++-- db/index.ts | 4 +-- db/log/index.ts | 28 ++++++++++++++++-- db/messageGroup/index.ts | 14 --------- db/pbClient.ts | 6 +++- db/receiveGroup/index.ts | 33 +++++++++++++++++++++ index.ts | 3 ++ package.json | 18 ++++++------ routes/message/index.ts | 25 ++++++++-------- routes/microApp/index.ts | 6 ++-- routes/sheet/index.ts | 4 +-- types/db.ts | 49 -------------------------------- types/index.ts | 3 +- utils/genContext.ts | 13 ++++----- utils/genLarkService.ts | 14 +++++++++ utils/llm/base.ts | 14 +++++---- utils/pbTools.ts | 5 ++-- 22 files changed, 212 insertions(+), 145 deletions(-) delete mode 100644 constant/appMap.ts create mode 100644 constant/config.ts delete mode 100644 db/messageGroup/index.ts create mode 100644 db/receiveGroup/index.ts delete mode 100644 types/db.ts create mode 100644 utils/genLarkService.ts diff --git a/.env.example b/.env.example index fd9e288..a3b324d 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,9 @@ # Node Environment: dev, production NODE_ENV=dev -LLM_MODEL= -LLM_API_KEY= -LLM_BASE_URL= +DATABASE_URL= -LANGFUSE_PK= -LANGFUSE_SK= -LANGFUSE_BASE_URL= - -# Map of apps such as '{"michat": { "app_id": "123", "app_secret": "456", "app_name": "Mi Chat" }}' -LARK_APP_MAP= - -ATTACH_APP_SECRET= - -DATABASE_URL= \ No newline at end of file +# PocketBase Auth +PB_USER= +PB_PASS= +PB_URL= \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 27756fd74d1f6bdb3d7f7296576e274e361fa8dc..33acc9c150fcb7ce93b1d9e4557fbd6ff339303c 100755 GIT binary patch delta 29057 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 diff --git a/constant/config.ts b/constant/config.ts new file mode 100644 index 0000000..1e8e393 --- /dev/null +++ b/constant/config.ts @@ -0,0 +1,45 @@ +import logger from "@egg/logger" +import { RecordModel } from "pocketbase" + +import pbClient from "../db/pbClient" + +interface Config extends RecordModel { + key: string + value: string + desc: string +} + +export interface AppInfo extends RecordModel { + name: string + app_id: string + app_secret: string + app_name: string +} + +export const APP_CONFIG: Record = {} + +export const APP_MAP: Record> = {} + +/** + * 初始化应用配置 + */ +const initAppConfig = async () => { + // 获取所有环境变量 + const envList = await pbClient.collection("env").getFullList() + for (const env of envList) { + APP_CONFIG[env.key] = env.value + } + logger.info(`Get env list: ${JSON.stringify(APP_CONFIG)}`) + // 获取所有应用信息 + const appList = await pbClient.collection("app").getFullList() + for (const app of appList) { + APP_MAP[app.name] = { + app_id: app.app_id, + app_secret: app.app_secret, + app_name: app.app_name, + } + } + logger.info(`Get app list: ${JSON.stringify(APP_MAP)}`) +} + +export default initAppConfig diff --git a/controller/groupAgent/report.ts b/controller/groupAgent/report.ts index 0a0e8c4..6ba644d 100644 --- a/controller/groupAgent/report.ts +++ b/controller/groupAgent/report.ts @@ -1,6 +1,6 @@ import { LarkService } from "@egg/net-tool" -import { appMap } from "../../constant/appMap" +import { APP_MAP } from "../../constant/config" import { RespMessage } from "../../constant/message" import prisma from "../../prisma" import { Context } from "../../types" @@ -31,7 +31,7 @@ const genReport = async ( try { const { chat_id: chatId, robot_id: robotId } = subscription // 获取接口信息 - const appInfo = appMap[robotId] + const appInfo = APP_MAP[robotId] if (!appInfo) { logger.error(`Failed to get app info for ${robotId}`) return diff --git a/db/apiKey/index.ts b/db/apiKey/index.ts index a287cd3..c75aec4 100644 --- a/db/apiKey/index.ts +++ b/db/apiKey/index.ts @@ -1,15 +1,47 @@ -import { DB } from "../../types" +import { RecordModel } from "pocketbase" + +import { AppInfo } from "../../constant/config" import { managePbError } from "../../utils/pbTools" import pbClient from "../pbClient" +const DB_NAME = "api_key" + +export interface ApiKey { + name: string + owner: string + app: string +} + +export type ApiKeyModel = ApiKey & RecordModel + +export interface ApiKeyModelWithApp extends ApiKeyModel { + expand: { + app: AppInfo + } +} + +/** + * 获取单个 API Key 对应的 App 信息 + * @param id + * @returns + */ const getOne = (id: string) => - managePbError(() => - pbClient.collection("api_key").getOne(id, { + managePbError(() => + pbClient.collection(DB_NAME).getOne(id, { expand: "app", }) ) +/** + * 创建 API Key + * @param data + * @returns + */ +const create = (data: ApiKey) => + managePbError(() => pbClient.collection(DB_NAME).create(data)) + const apiKey = { + create, getOne, } diff --git a/db/index.ts b/db/index.ts index 717645d..6755ace 100644 --- a/db/index.ts +++ b/db/index.ts @@ -1,10 +1,10 @@ import apiKey from "./apiKey" import log from "./log" -import messageGroup from "./messageGroup" +import receiveGroup from "./receiveGroup" const db = { apiKey, - messageGroup, + receiveGroup, log, } diff --git a/db/log/index.ts b/db/log/index.ts index 635c6d5..9d3c0e5 100644 --- a/db/log/index.ts +++ b/db/log/index.ts @@ -1,9 +1,31 @@ -import { DB } from "../../types" +import { RecordModel } from "pocketbase" + import { managePbError } from "../../utils/pbTools" import pbClient from "../pbClient" -const create = (collection: DB.LogCollection, log: DB.Log) => - managePbError(() => pbClient.collection(collection).create(log)) +const DB_NAME = "message_log" + +export interface Log { + api_key: string + group_id?: string + receive_id?: string + receive_id_type?: string + msg_type: string + content: string + final_content?: string + send_result?: any + error?: string +} + +export type LogModel = Log & RecordModel + +/** + * 创建一条日志 + * @param log + * @returns + */ +const create = (log: Log) => + managePbError(() => pbClient.collection(DB_NAME).create(log)) const log = { create, diff --git a/db/messageGroup/index.ts b/db/messageGroup/index.ts deleted file mode 100644 index ce6a867..0000000 --- a/db/messageGroup/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DB } from "../../types" -import { managePbError } from "../../utils/pbTools" -import pbClient from "../pbClient" - -const getOne = (groupId: string) => - managePbError(() => - pbClient.collection("message_group").getOne(groupId) - ) - -const messageGroup = { - getOne, -} - -export default messageGroup diff --git a/db/pbClient.ts b/db/pbClient.ts index 2b3b816..dfb520f 100644 --- a/db/pbClient.ts +++ b/db/pbClient.ts @@ -1,7 +1,11 @@ import PocketBase from "pocketbase" -const pbClient = new PocketBase("https://egg-pb.xiaomiwh.cn") +const pbClient = new PocketBase("https://lark-egg-preview.ai.xiaomi.com") pbClient.autoCancellation(false) +await pbClient + .collection("_superusers") + .authWithPassword(Bun.env.PB_USER!, Bun.env.PB_PASS!) + export default pbClient diff --git a/db/receiveGroup/index.ts b/db/receiveGroup/index.ts new file mode 100644 index 0000000..1983442 --- /dev/null +++ b/db/receiveGroup/index.ts @@ -0,0 +1,33 @@ +import { RecordModel } from "pocketbase" + +import { managePbError } from "../../utils/pbTools" +import pbClient from "../pbClient" + +const DB_NAME = "message_group" + +export interface ReceiveGroup { + name: string + email?: string[] + chat_id?: string[] + open_id?: string[] + union_id?: string[] + user_id?: string[] +} + +export type ReceiveGroupModel = ReceiveGroup & RecordModel + +/** + * 根据ID获取指定消息组 + * @param id + * @returns + */ +const getOne = (id: string) => + managePbError(() => + pbClient.collection(DB_NAME).getOne(id) + ) + +const receiveGroup = { + getOne, +} + +export default receiveGroup diff --git a/index.ts b/index.ts index c70b315..5d1c119 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,6 @@ import logger from "@egg/logger" +import initAppConfig from "./constant/config" import prisma from "./prisma" import { manageBotReq } from "./routes/bot" import { manageMessageReq } from "./routes/message" @@ -10,6 +11,8 @@ import genContext from "./utils/genContext" initSchedule() +await initAppConfig() + const server = Bun.serve({ async fetch(req) { // 生成上下文 diff --git a/package.json b/package.json index 59e888d..57766af 100644 --- a/package.json +++ b/package.json @@ -17,39 +17,39 @@ ] }, "devDependencies": { - "@commitlint/cli": "^19.6.0", + "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", - "@eslint/js": "^9.16.0", + "@eslint/js": "^9.17.0", "@types/node-schedule": "^2.1.7", "@types/uuid": "^10.0.0", "bun-types": "^1.1.38", - "eslint": "^9.16.0", + "eslint": "^9.17.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unused-imports": "^4.1.4", "husky": "^9.1.7", - "lint-staged": "^15.2.10", + "lint-staged": "^15.2.11", "oxlint": "^0.13.2", "prettier": "^3.4.2", "prisma": "5.22.0", - "typescript-eslint": "^8.17.0" + "typescript-eslint": "^8.18.1" }, "peerDependencies": { "typescript": "^5.5.4" }, "dependencies": { "@egg/hooks": "^1.2.0", - "@egg/lark-msg-tool": "^1.19.0", + "@egg/lark-msg-tool": "^1.21.0", "@egg/logger": "^1.6.0", "@egg/net-tool": "^1.19.0", "@egg/path-tool": "^1.4.1", - "@langchain/core": "^0.3.20", + "@langchain/core": "^0.3.24", "@langchain/openai": "^0.3.14", "@prisma/client": "5.22.0", "joi": "^17.13.3", - "langfuse-langchain": "^3.31.1", + "langfuse-langchain": "^3.32.0", "node-schedule": "^2.1.1", "p-limit": "^6.1.0", - "pocketbase": "^0.21.5", + "pocketbase": "^0.23.0", "uuid": "^10.0.0" } } \ No newline at end of file diff --git a/routes/message/index.ts b/routes/message/index.ts index 192ed69..008d671 100644 --- a/routes/message/index.ts +++ b/routes/message/index.ts @@ -1,11 +1,10 @@ import { stringifyJson } from "@egg/hooks" import { LarkService } from "@egg/net-tool" -import { appMap } from "../../constant/appMap" +import { APP_MAP } from "../../constant/config" import db from "../../db" -import { Context, DB, LarkServer, MsgProxy } from "../../types" - -const LOG_COLLECTION = "message_log" +import { Log } from "../../db/log" +import { Context, LarkServer, MsgProxy } from "../../types" /** * 校验消息请求的参数 @@ -68,7 +67,7 @@ export const manageMessageReq = async ( const sendList = [] as Promise[] // 构造消息记录 - const baseLog: DB.MessageLogCreate = { + const baseLog: Log = { ...body, final_content: finalContent, } @@ -77,7 +76,7 @@ export const manageMessageReq = async ( const apiKeyInfo = await db.apiKey.getOne(body.api_key) if (!apiKeyInfo) { const error = "api key not found" - db.log.create(LOG_COLLECTION, { ...baseLog, error }) + db.log.create({ ...baseLog, error }) return genResp.notFound(error) } @@ -85,15 +84,15 @@ export const manageMessageReq = async ( const appName = apiKeyInfo.expand?.app?.name if (!appName) { const error = "app name not found" - db.log.create(LOG_COLLECTION, { ...baseLog, error }) + db.log.create({ ...baseLog, error }) return genResp.notFound(error) } // 获取 app info - const appInfo = appMap[appName] + const appInfo = APP_MAP[appName] if (!appInfo) { const error = "app not found" - db.log.create(LOG_COLLECTION, { ...baseLog, error }) + db.log.create({ ...baseLog, error }) return genResp.notFound(error) } @@ -106,10 +105,10 @@ export const manageMessageReq = async ( // 如果有 group_id,则发送给所有 group_id 中的人 if (body.group_id) { // 获取所有接收者 - const group = await db.messageGroup.getOne(body.group_id!) + const group = await db.receiveGroup.getOne(body.group_id!) if (!group) { const error = "message group not found" - db.log.create(LOG_COLLECTION, { ...baseLog, error }) + db.log.create({ ...baseLog, error }) return genResp.notFound(error) } @@ -153,11 +152,11 @@ export const manageMessageReq = async ( // 发送消息 await Promise.allSettled(sendList) // 保存消息记录 - db.log.create(LOG_COLLECTION, { ...baseLog, send_result: sendRes }) + db.log.create({ ...baseLog, send_result: sendRes }) return genResp.ok(sendRes) } catch { const error = "send msg failed" - db.log.create(LOG_COLLECTION, { ...baseLog, error }) + db.log.create({ ...baseLog, error }) return genResp.serverError(error, sendRes) } } diff --git a/routes/microApp/index.ts b/routes/microApp/index.ts index 20f9702..d5e3217 100644 --- a/routes/microApp/index.ts +++ b/routes/microApp/index.ts @@ -1,6 +1,6 @@ import { LarkService } from "@egg/net-tool" -import { appMap } from "../../constant/appMap" +import { APP_MAP } from "../../constant/config" import { Context } from "../../types" /** @@ -21,7 +21,7 @@ const manageLogin = async (ctx: Context.Data) => { return genResp.badRequest("app_name not found") } // 获取 app info - const appInfo = appMap[appName] + const appInfo = APP_MAP[appName] if (!appInfo) { return genResp.badRequest("app not found") } @@ -67,7 +67,7 @@ const manageBatchUser = async (ctx: Context.Data) => { return genResp.badRequest("app_name not found") } // 获取 app info - const appInfo = appMap[app_name] + const appInfo = APP_MAP[app_name] if (!appInfo) { return genResp.badRequest("app not found") } diff --git a/routes/sheet/index.ts b/routes/sheet/index.ts index 11b8bd6..7184a64 100644 --- a/routes/sheet/index.ts +++ b/routes/sheet/index.ts @@ -1,7 +1,7 @@ import { LarkService } from "@egg/net-tool" import Joi from "joi" -import { appMap } from "../../constant/appMap" +import { APP_MAP } from "../../constant/config" import insertSheet from "../../controller/sheet/insert" import db from "../../db" import { Context } from "../../types" @@ -85,7 +85,7 @@ export const manageSheetReq = async (ctx: Context.Data): Promise => { } // 获取APP信息 - const appInfo = appMap[appName] + const appInfo = APP_MAP[appName] if (!appInfo) { return genResp.notFound("app not found") } diff --git a/types/db.ts b/types/db.ts deleted file mode 100644 index fde92e7..0000000 --- a/types/db.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { RecordModel } from "pocketbase" - -export namespace DB { - export interface ApiKey extends RecordModel { - name: string - user: string - app: string - apply_reason: string - } - - export interface MessageGroup extends RecordModel { - desc: string - id: string - name: string - email?: string[] - chat_id?: string[] - open_id?: string[] - union_id?: string[] - user_id?: string[] - } - - export interface MessageLog extends RecordModel { - api_key: string - group_id?: string - receive_id?: string - receive_id_type?: string - msg_type: string - content: string - final_content?: string - send_result?: any - error?: string - } - - export type MessageLogCreate = Pick< - MessageLog, - | "api_key" - | "group_id" - | "receive_id" - | "receive_id_type" - | "msg_type" - | "content" - | "final_content" - | "send_result" - | "error" - > - - export type Log = MessageLogCreate - export type LogCollection = "message_log" -} diff --git a/types/index.ts b/types/index.ts index cf8d896..783e846 100644 --- a/types/index.ts +++ b/types/index.ts @@ -1,6 +1,5 @@ import type { Context } from "./context" -import type { DB } from "./db" import type { LarkServer } from "./larkServer" import type { MsgProxy } from "./msgProxy" -export { Context, DB, LarkServer, MsgProxy } +export { Context, LarkServer, MsgProxy } diff --git a/utils/genContext.ts b/utils/genContext.ts index a61885a..36d1bd4 100644 --- a/utils/genContext.ts +++ b/utils/genContext.ts @@ -1,15 +1,16 @@ import { LarkBody, LarkCard } from "@egg/lark-msg-tool" import loggerIns from "@egg/logger" -import { LarkService, NetTool } from "@egg/net-tool" +import { NetTool } from "@egg/net-tool" import { PathCheckTool } from "@egg/path-tool" import { v4 as uuid } from "uuid" -import { appMap } from "../constant/appMap" import cardMap from "../constant/card" +import { APP_MAP } from "../constant/config" import functionMap from "../constant/function" import tempMap from "../constant/template" import { AttachService } from "../services" import { Context } from "../types" +import genLarkService from "./genLarkService" /** * 获取之前的requestId。 @@ -42,15 +43,11 @@ const genContext = async (req: Request) => { const larkBody = new LarkBody(body) const searchParams = new URL(req.url).searchParams const app = searchParams.get("app") || "egg" - const appInfo = appMap[app] + const appInfo = APP_MAP[app] const requestId = getPreRequestId(larkBody) || uuid() const logger = loggerIns.child({ requestId }) const genResp = new NetTool({ requestId }) - const larkService = new LarkService({ - appId: appInfo.app_id, - appSecret: appInfo.app_secret, - requestId, - }) + const larkService = genLarkService("egg", requestId) const attachService = new AttachService({ requestId }) const path = new PathCheckTool(req.url) const larkCard = new LarkCard( diff --git a/utils/genLarkService.ts b/utils/genLarkService.ts new file mode 100644 index 0000000..2de651e --- /dev/null +++ b/utils/genLarkService.ts @@ -0,0 +1,14 @@ +import { LarkService } from "@egg/net-tool" + +import { APP_MAP } from "../constant/config" + +const genLarkService = (app: string, requestId: string) => { + const appInfo = APP_MAP[app] + return new LarkService({ + appId: appInfo.app_id, + appSecret: appInfo.app_secret, + requestId, + }) +} + +export default genLarkService diff --git a/utils/llm/base.ts b/utils/llm/base.ts index d64de5f..c792511 100644 --- a/utils/llm/base.ts +++ b/utils/llm/base.ts @@ -1,6 +1,8 @@ import { ChatOpenAI } from "@langchain/openai" import CallbackHandler, { Langfuse } from "langfuse-langchain" +import { APP_CONFIG } from "../../constant/config" + /** * 获取模型 * @param temperature 温度 @@ -10,11 +12,11 @@ export const getModel = (temperature = 0) => { return new ChatOpenAI( { temperature, - model: Bun.env.LLM_MODEL, - apiKey: Bun.env.LLM_API_KEY, + model: APP_CONFIG.TEXT_LLM_MODEL, + apiKey: APP_CONFIG.TEXT_LLM_API_KEY, }, { - baseURL: Bun.env.LLM_BASE_URL, + baseURL: APP_CONFIG.TEXT_LLM_BASE_URL, } ) } @@ -25,9 +27,9 @@ export const getModel = (temperature = 0) => { */ export const getLangfuse = async (name: string, requestId: string) => { const langfuseParams = { - publicKey: Bun.env.LANGFUSE_PK, - secretKey: Bun.env.LANGFUSE_SK, - baseUrl: Bun.env.LANGFUSE_BASE_URL, + publicKey: APP_CONFIG.LANGFUSE_PK, + secretKey: APP_CONFIG.LANGFUSE_SK, + baseUrl: APP_CONFIG.LANGFUSE_BASE_URL, sessionId: requestId, name, } diff --git a/utils/pbTools.ts b/utils/pbTools.ts index 48b0c87..434d3ef 100644 --- a/utils/pbTools.ts +++ b/utils/pbTools.ts @@ -11,11 +11,12 @@ export const managePb404 = async ( } export const managePbError = async ( - dbFunc: () => Promise + dbFunc: () => Promise, + defaultVal?: T ): Promise => { try { return await dbFunc() } catch { - return null + return defaultVal || null } }