TencentDB Agent Memory 的 config.ts:三处注释默认值与代码不符

2026-08-16

翻别人家仓库的配置项,多数人第一反应是去看类型定义上的注释——接口字段旁边挂着一行 JSDoc,写着 default: 30,比翻文档快,也比翻实现快。

在 TencentDB Agent Memory 这个仓库里,这个习惯会踩坑。MemoryCore/src/config.ts 这一个文件内部,接口定义上的 JSDoc 注释写了一组默认值,文件下方真正构造配置对象的那段代码用 ?? 兜底又写了另一组,其中三个字段两边对不上。下面把这三处逐条摆出来,并说明怎么自己核一遍。

先交代口径:本文全部内容来自我们在 2026-08-16 拉取的仓库快照,分支是该仓库的默认分支 feat/server_team(不是 main,也不是 master),下文所有文件路径都指这个分支上的文件。该项目主模块 MemoryCore/package.jsonversion2.0.0-beta.1,处于 beta 阶段,同仓另外三个模块的版本号还是 0.1.0;配置字段与默认值随版本变动,看到本文时对不对得上,以你手上仓库的当前内容为准。

三处对不上的字段

字段所在接口JSDoc 注释写的默认值代码 ?? 后的实际默认值
l1IdleTimeoutSecondsPipelineTriggerConfig(注释在 :7330(default: 30600(:565
l2DelayAfterL1SecondsPipelineTriggerConfig(注释在 :7590(default: 9010(:566
maxScenesPersonaConfig(注释在 :5520(Max scene blocks (default: 20)15(:556

行号都是 MemoryCore/src/config.ts 这一个文件里的行号。两组数值的落差方向还不一致:l1IdleTimeoutSeconds 是注释小、代码大(30 与 600),l2DelayAfterL1Seconds 是注释大、代码小(90 与 10),maxScenes 也是注释大、代码小(20 与 15)。

按本站一贯的写法,这里只并列陈述两处文本的差异,标明各自位置,不去推断哪一个才是「作者想要的」,也不去猜为什么没同步,更不拿它评价项目质量。以我们实读到的仓库状态为准:运行时最终取到哪个值,取决于代码那一侧的 ?? 兜底,而不是注释。

这三个字段在链路上管什么

只看数值容易失焦,简单交代一下它们所处的位置——同样只引用文件里能读到的注释原文。

PipelineTriggerConfig 这个接口的顶头注释(MemoryCore/src/config.ts:66)写的是 Pipeline trigger settings (L1→L2→L3 scheduling)。README 里那套分层记忆模型——README_CN.md 技术实现小节的原表把它写成 L0 Conversation / L1 Atom / L2 Scenario / L3 Core(Persona),「对话首先作为 L0 保存,再由异步 Pipeline 提炼为不同粒度的记忆」——从 L1 往上跑的调度节奏,就落在这个接口的字段上。

  • l1IdleTimeoutSeconds:73)与 l2DelayAfterL1Seconds:75)这两个字段名本身已经把语义写在标识符里了:一个是以秒计的 L1 空闲超时,一个是 L1 之后到 L2 之间以秒计的延迟。它们都归在这个「L1→L2→L3 调度」的接口下。
  • 同一接口里另外几个字段——everyNConversationsenableWarmupl2MinIntervalSecondsl2MaxIntervalSecondssessionActiveWindowHours——注释与代码是对得上的,下面会列。

PersonaConfig 的顶头注释(:50)写的是这个接口 controls scene extraction (L2) and user profile generation (L3)maxScenes 的注释原文是 Max scene blocks (default: 20),对应 L2 那层的 scene block 上限;scene block 在落盘层的位置也能对上,MemoryCore/src/core/storage/types.ts:254StoragePaths 里有 sceneBlocksDir: "scene_blocks/",单个文件是 scene_blocks/${name}.md:273)。

再强调一句:以上都是配置里的默认值,不是「你用起来会怎样」的保证。l1IdleTimeoutSeconds 是 30 还是 600,只说明这一行代码写了什么数字,不能据此推算任何触发频率下的资源占用、延迟、成本或稳定性——那需要真实部署与测量,而我们没有部署、也没有运行过这个项目的任何一个模块。

怎么自己确认是这个问题

这类坑的典型现象是:你照着注释把预期建立起来了,实际行为对不上,然后开始怀疑自己的配置文件写错了。判定动作其实很短:

第一步,打开 MemoryCore/src/config.ts,找到接口定义那一段(PersonaConfig:50 开始,PipelineTriggerConfig:66 开始),记下字段旁边 JSDoc 里的数字。

第二步,在同一个文件里往下翻到构造配置对象的那一段(persona 分组在 :555 一带,pipeline 分组在 :563 一带,recall 分组在 :571 一带),看同名字段 ?? 右边的字面量。写法是统一的「先读用户配置,读不到就用 ?? 右边这个数」——例如 maxScenes 那一行的 ?? 15l1IdleTimeoutSeconds 那一行的 ?? 600

第三步,两个数字并排比。对不上的就以 ?? 右边那个为准,因为那是真正参与取值的表达式;注释不参与运行。

处置上没有什么玄机:如果你在意这个值,就在自己的配置里把它显式写出来,不要依赖任何一侧的默认值。按 ?? 的语义,左边读到了值,右边的兜底就不会参与,注释与代码那两个数字怎么写都影响不到你。至于该写成多少,仓库没有给出通用建议值,README 与 ROADMAP 里也没有这三个字段的调参指引,取值取决于你的用法,我们不替你给数。

什么情况说明不是这个原因?如果你观察到的偏差涉及的是 everyNConversationsenableWarmupl2MinIntervalSecondsl2MaxIntervalSecondssessionActiveWindowHours,或者 PersonaConfig 里的 triggerEveryNbackupCountsceneBackupCount,那就跟这篇没关系了——这几个字段的注释与代码是一致的:

字段JSDoc代码 ??
everyNConversations55(:563
enableWarmuptruetrue(:564
l2MinIntervalSeconds900(=15 min)900(:567
l2MaxIntervalSeconds3600(=60 min)3600(:568
sessionActiveWindowHours2424(:569
triggerEveryN5050(:555
backupCount33(:557
sceneBackupCount1010(:558

也就是说,这不是「整个文件的注释都不可信」,而是同一个文件里三个具体字段对不上。上表这几个字段,注释与代码给的是同一个数。

一个容易被误判成第四处的地方

同文件的 RecallConfig(接口在 :84-100,取值在 :571-578)里,maxCharsPerMemorymaxTotalRecallChars 的实际默认值都是 0。乍一看像是「注释没写默认值、代码给了个 0」,但翻回注释会发现两边是自洽的:这两个字段的 JSDoc(:90-93)分别写 0 disables the per-memory limit0 disables the total limit,即 0 本身就是「不设限」这个语义,不是漏填。

RecallConfig 里其余几个字段的实际默认值是 maxResults 5、scoreThreshold 0.3、strategy "hybrid"timeoutMs 5000,同样在 :571-578 这一段里。我们在这个文件里核到的注释与代码对不上的地方,就是前面那三处,RecallConfig 不在其中,所以别把它算进「对不上」的清单。

同一个仓库里的同类差异

如果你打算把「注释与代码并排看一遍」变成读这个仓库的固定动作,那么值得知道它不止 config.ts 这一处。同样是只陈述差异、标明位置:

  • 版本号在四个地方写法不同:README_CN.md:299 写「当前版本 v2.0.0」,ROADMAP_CN.md:5 写「当前版本:v2.0.1-beta.1」,MemoryCore/package.jsonversion2.0.0-beta.1CHANGELOG.md:13 最新条目是 [2.0.1-beta.1]
  • MemoryCore/src/gateway/v2-router.ts 的文件头注释(:6-9)按 L0/L1/L2/L3 列出四层动词共 14 个动作,而实际的 V3_ALLOWED_SUBPATHS:153-172)与 handler 映射各是 18 条,每层都多一个 count
  • 资产可见性:README_CN.md:230-235 的表列了 private / team / restricted / agent 四个取值,MemoryCore/src/metadata/types.ts:25AssetVisibility 是五个,多一个 task
  • 团队角色:README_CN.md:136 写 Admin 与 Member 两种,MemoryCore/src/metadata/types.ts:18TeamRole"admin" | "member" | "reviewer" 三种。

这些放在一起看,结论只有一条操作性的:这个仓库里凡是「某个值是多少」的问题,最终答案都要回到参与运行的那一行代码上,注释、README、CHANGELOG 都只能当线索。 这不是这个项目独有的现象,只是它正处在快速迭代阶段,同一件事在不同层留下不同快照的机会更多一些——ROADMAP 自己也写着「路线图列出的是团队正在推进的工作,不是承诺,范围与时间可能调整」。

最后提醒一件与配置相关的事:这套 Pipeline 调度的对象是团队真实的对话内容——L0 那层保存的是原始对话与完整上下文,L1 往上是从中提炼出来的事实、偏好与场景。调这几个数字时,你调的是「这些内容多久被提炼一次、留几份」,不是纯粹的性能旋钮。是否使用、怎么存、存在哪,需要按你自己的合规要求评估。

延伸阅读


本文依据 TencentDB Agent Memory 官方仓库(github.com/TencentCloud/TencentDB-Agent-Memoryfeat/server_team 分支上的 README、INSTALL、CHANGELOG、ROADMAP 与四个模块的源码整理, 核对日 2026-08-16,对应仓库快照 97f9465。该仓库的默认分支即为 feat/server_team。 本文内容为仓库源码与文档口径,我们没有部署、也没有运行过该项目的任何一个模块, 因此不涉及运行效果、检索质量与性能的任何描述。 该项目主模块处于 beta 阶段、其余模块版本号仍为 0.1.0,参数与接口随版本变动,请以仓库最新内容为准。 该项目会采集并存储团队的对话、文档与代码,属于敏感数据,是否使用请结合自身合规要求评估。 安全与合规相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。