diff --git a/src/services/bot/memory/index.ts b/src/services/bot/memory/index.ts index 86d5700..6307783 100644 --- a/src/services/bot/memory/index.ts +++ b/src/services/bot/memory/index.ts @@ -1,5 +1,6 @@ import { Memory, Message, Room, User } from "@prisma/client"; import { firstOf, lastOf } from "../../../utils/base"; +import { Logger } from "../../../utils/log"; import { MemoryCRUD } from "../../db/memory"; import { LongTermMemoryCRUD } from "../../db/memory-long-term"; import { ShortTermMemoryCRUD } from "../../db/memory-short-term"; @@ -15,6 +16,7 @@ export class MemoryManager { * owner 为空时,即房间自己的公共记忆 */ private owner?: User; + private _logger = Logger.create({ tag: "Memory" }); constructor(room: Room, owner?: User) { this.room = room; @@ -118,6 +120,7 @@ export class MemoryManager { lastMemory, }); if (!newMemory) { + this._logger.error("💀 生成短期记忆失败"); return false; } const res = await ShortTermMemoryCRUD.addOrUpdate({ @@ -151,6 +154,7 @@ export class MemoryManager { lastMemory, }); if (!newMemory) { + this._logger.error("💀 生成长期记忆失败"); return false; } const res = await LongTermMemoryCRUD.addOrUpdate({ diff --git a/src/services/bot/memory/long-term.ts b/src/services/bot/memory/long-term.ts index fe62553..f51fe81 100644 --- a/src/services/bot/memory/long-term.ts +++ b/src/services/bot/memory/long-term.ts @@ -1,6 +1,7 @@ import { LongTermMemory, ShortTermMemory } from "@prisma/client"; -import { jsonDecode, lastOf } from "../../../utils/base"; +import { lastOf } from "../../../utils/base"; import { buildPrompt } from "../../../utils/string"; +import { cleanJsonAndDecode } from "../../../utils/parse"; import { openai } from "../../openai"; import { MessageContext } from "../conversation"; @@ -67,6 +68,6 @@ export class LongTermMemoryAgent { shortTermMemory: lastOf(newMemories)!.text, }), }); - return jsonDecode(res?.content)?.longTermMemories?.toString(); + return cleanJsonAndDecode(res?.content)?.longTermMemories?.toString(); } } diff --git a/src/services/bot/memory/short-term.ts b/src/services/bot/memory/short-term.ts index 6e039f5..a804ab2 100644 --- a/src/services/bot/memory/short-term.ts +++ b/src/services/bot/memory/short-term.ts @@ -1,5 +1,5 @@ import { Memory, Message, ShortTermMemory, User } from "@prisma/client"; -import { jsonDecode } from "../../../utils/base"; +import { cleanJsonAndDecode } from "../../../utils/parse"; import { buildPrompt, formatMsg } from "../../../utils/string"; import { openai } from "../../openai"; import { MessageContext } from "../conversation"; @@ -78,6 +78,6 @@ export class ShortTermMemoryAgent { .join("\n"), }), }); - return jsonDecode(res?.content)?.shortTermMemories?.toString(); + return cleanJsonAndDecode(res?.content)?.shortTermMemories?.toString(); } } diff --git a/src/services/speaker/base.ts b/src/services/speaker/base.ts index 08ac031..5875faf 100644 --- a/src/services/speaker/base.ts +++ b/src/services/speaker/base.ts @@ -5,7 +5,8 @@ import { getMiIOT, getMiNA, } from "mi-service-lite"; -import { clamp, jsonEncode, sleep } from "../../utils/base"; +import { clamp, sleep } from "../../utils/base"; +import { jsonEncode } from "../../utils/parse"; import { Logger } from "../../utils/log"; import { StreamResponse } from "./stream"; import { kAreYouOK } from "../../utils/string"; diff --git a/src/utils/base.ts b/src/utils/base.ts index e98b41a..e80fd84 100644 --- a/src/utils/base.ts +++ b/src/utils/base.ts @@ -1,4 +1,5 @@ import { isEmpty } from "./is"; +import { jsonEncode } from "./parse" export function timestamp() { return new Date().getTime(); @@ -87,24 +88,6 @@ export function toSet(datas: T[], byKey?: (e: T) => any) { return Array.from(new Set(datas)); } -export function jsonEncode(obj: any, options?: { prettier?: boolean }) { - const { prettier } = options ?? {}; - try { - return prettier ? JSON.stringify(obj, undefined, 4) : JSON.stringify(obj); - } catch (error) { - return undefined; - } -} - -export function jsonDecode(json: string | null | undefined) { - if (json == undefined) return undefined; - try { - return JSON.parse(json!); - } catch (error) { - return undefined; - } -} - export function withDefault(e: any, defaultValue: T): T { return isEmpty(e) ? defaultValue : e; } diff --git a/src/utils/io.ts b/src/utils/io.ts index 24275c0..5e07e5a 100644 --- a/src/utils/io.ts +++ b/src/utils/io.ts @@ -1,7 +1,7 @@ import fs from "fs-extra"; import path from "path"; -import { jsonDecode, jsonEncode } from "./base"; +import { jsonDecode, jsonEncode } from "./parse"; export const kRoot = process.cwd(); diff --git a/src/utils/parse.ts b/src/utils/parse.ts new file mode 100644 index 0000000..6dbdc94 --- /dev/null +++ b/src/utils/parse.ts @@ -0,0 +1,32 @@ +/** + * 清理掉json字符串前后的其他字符,并解码 + */ +export function cleanJsonAndDecode(input: string | undefined | null) { + if (input == undefined) return undefined; + const pattern = /(\{[\s\S]*?"\s*:\s*[\s\S]*?})/; + const match = input.match(pattern); + + if (!match) { + return undefined; + } + + return jsonDecode(match[0]); +} + +export function jsonEncode(obj: any, options?: { prettier?: boolean }) { + const { prettier } = options ?? {}; + try { + return prettier ? JSON.stringify(obj, undefined, 4) : JSON.stringify(obj); + } catch (error) { + return undefined; + } +} + +export function jsonDecode(json: string | null | undefined) { + if (json == undefined) return undefined; + try { + return JSON.parse(json!); + } catch (error) { + return undefined; + } +}