package memory import ( "yunyan/pb" ) // IModel 模型组件接口 type IModel interface { // 记忆项 addItem(item *pb.DBMemoryItem) error findItemByClientKey(uid, clientKey string) (*pb.DBMemoryItem, error) getItem(uid string, id uint64) (*pb.DBMemoryItem, error) saveItem(item *pb.DBMemoryItem) error listItems(q *itemQuery) ([]*pb.DBMemoryItem, int64, error) delItems(uid string, ids []uint64) (int64, error) completeItems(uid string, ids []uint64, done bool) (int64, error) delMeetingItems(sourceID string, genRound int32) (int64, error) delMeetingItemsBySource(uid string, sourceIDs []string) (int64, error) // 周期报告 upsertReport(rec *pb.DBMemoryReport) error saveReport(rec *pb.DBMemoryReport) error getReport(id uint64) (*pb.DBMemoryReport, error) getReportByPeriod(uid, ptype, pkey string) (*pb.DBMemoryReport, error) latestUnconfirmedReport(uid string) (*pb.DBMemoryReport, error) listReports(uid, ptype string, page, size int32) ([]*pb.DBMemoryReport, int64, error) uidsWithItemsBetween(start, end string, minItems int) ([]string, error) countItemsBetween(uid, start, end string) (int64, error) } // Redis 队列键后缀(实际使用时还会经 service.GetTag() 与 redissys.RKey 加应用前缀, // 测试机上多个应用共用一个 Redis,不加前缀会串号) const ( QueueReportAwait = "memory:report:await" //报告生成等待队列 LockReportPrefix = "memory:report:lock" //cron 抢锁前缀,后面拼 : // 单份报告的生成锁,后面拼 report id。与上面那把不是一回事: // 上面那把按周期抢,管的是「这一轮 cron 由谁来建单」;这把按报告抢, // 管的是「这一份报告由哪个 worker 真的去跑 LLM」——cron 与 ensureRecent // 两条路都能把同一份报告送进队列,没有它就会跑两遍、计两次费。 LockReportProcPrefix = "memory:report:proc" )