You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

90 lines
2.8 KiB

/*
Memory 记忆中心(拾忆)模块
一张 memory_item 表承载全部分类(闹钟/待办/灵感/花销),另有 memory_report 存周报月报。
由 home 服务装载(不是独立服务),HTTP 接口经反射注册为 memory_<方法名小写>,
客户端路径 /api/home/memory_xxx。
*/
package memory
import (
"yunyan/comm"
"yunyan/modules"
"yunyan/lego/base"
"yunyan/lego/core"
)
func NewModule() core.IModule {
m := new(Memory)
return m
}
type Memory struct {
modules.ModuleBase
service base.IRPCXService
api *apiComp
model *modelComp
report *reportComp
options *Options
// echo 是同进程的 echomeet 模块:走它的后台编排选 LLM,而不是各自 import
// sys/doubao 把服务商写死(allhelp/summary.go 就是写死的,海外应用照样调国内豆包)。
// 取不到时所有 LLM 相关能力降级:报告只出统计不出文案、会议抽取整条跳过。
echo comm.IEchomeet
}
func (this *Memory) GetType() core.M_Modules {
return comm.ModuleMemory
}
func (this *Memory) NewOptions() (options core.IModuleOptions) {
return new(Options)
}
func (this *Memory) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
this.service = service.(base.IRPCXService)
this.options = options.(*Options)
if err = this.ModuleBase.Init(service, module, options); err != nil {
return
}
return
}
func (this *Memory) Start() (err error) {
if err = this.ModuleBase.Start(); err != nil {
return
}
if m, e := this.service.GetModule(comm.ModuleEchomeet); e == nil {
if em, ok := m.(comm.IEchomeet); ok {
this.echo = em
}
}
if this.echo == nil {
this.Warnf("未取到 echomeet 模块:周期报告将只有统计没有播报文案,会议待办抽取不可用")
}
// 存量 DBTask → memory_item 的一次性迁移。幂等,失败不阻断启动
// (它是补数据不是启动前置;这里返回 error 会让 home 退出、五个服务连坐全挂)。
go func() {
if n, err := this.model.migrateTasks(); err != nil {
this.Errorf("存量任务迁移失败(不影响服务): %v", err)
} else if n > 0 {
this.Infof("存量任务迁移完成,搬入 %d 条记忆项", n)
}
// 修正被 gorm default: 标签吞掉的会议待办标记(幂等,见 migrate_defaults.go)
if n, err := this.model.fixSwallowedDefaults(); err != nil {
this.Errorf("存量会议待办标记修正失败(不影响服务): %v", err)
} else if n > 0 {
this.Infof("存量会议待办标记修正完成,改动 %d 行", n)
}
}()
return
}
func (this *Memory) OnInstallComp() {
this.ModuleBase.OnInstallComp()
this.api = this.RegisterComp(new(apiComp)).(*apiComp)
this.model = this.RegisterComp(new(modelComp)).(*modelComp)
this.report = this.RegisterComp(new(reportComp)).(*reportComp)
}