From d35b7b72757916ccaf3305edef25550ec6e7a26b Mon Sep 17 00:00:00 2001 From: root Date: Tue, 20 Oct 2026 09:08:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(status):=20ONNX=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=A1=A5=20dep=5Fparser=20=E5=AD=97=E6=AE=B5=EF=BC=9B=E4=BA=BA?= =?UTF-8?q?=E6=A0=BC=E6=94=B9=E6=88=90=E3=80=8C=E8=AF=B4=E4=BA=BA=E8=AF=9D?= =?UTF-8?q?=E3=80=8D=E7=9A=84=E8=AF=B4=E8=AF=9D=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 1. ONNX 状态补依存句法分析器(onnx.dep_parser) 此前 onnx.enabled 只反映**多模态向量空间**,解析器状态完全不可见 —— 于是 只能靠翻启动日志猜,而日志又曾把「内嵌模型已启用」错报成「规则引擎」 (见上一个提交)。现在健康快照直接给: "dep_parser": { "enabled": true, "model_path": "/home/newqqagent/nlp/dep_parser.onnx", "embedded": true } - sdk.ONNXStatus 增加 DepParser / DepParserStatus(enabled/model_path/embedded) - agent 侧由 nlp 包级默认解析器反查实际状态(判据是「真能 Parse 且报得出路径」, 不是「配置里写了 onnx_model_path」) - healthcheck_kernel 的描述同步说明该字段 ## 2. 人格:从「交报告」改成「聊天」 用户反馈实例说话一股人机味。实测原文: 第一件·文件读写: - 写:files_write 往 /tmp/... 写入 hello-files,回执 11 字节 - 读:files_read 读回来,内容就是 hello-files,对上了 问题不在语气词,而在**结构**:清单体 + 小标题 + 加粗 + 把工具名/字节数/耗时 当成绩单报出来。旧人格只禁了「客服腔四件套」,没禁这些。 DefaultPersonaPrompt 的说话方式一节重写,明确: - 短句为主;先给结果/情绪,再补解释 - 不用清单体(“-”/“1.”/“•”)、不用小标题/加粗/表格 - 不报工单式细节(不罗列工具名、参数、字节数、耗时)——说人话 - 不用客服腔,拿不准/失败直说 - 只有用户明确要清单/步骤/数据时才结构化 ## 3. 本机实例人格同步优化(personal.md,优先级高于配置项) 按同一套规则重写 /home/newqqagent/personal/personal.md,并保留「照大肥鱼那股 活人味来」与形象特征。重启后实测(问「在吗?状态咋样」): 在呢在呢 (`・ω・´) 刚拉了个运行时快照看了眼,状态挺好——内核 1.4.0dev 跑着,29 个插件全部 loaded…… 刚忙完就赶紧来找我聊天,老大你这节奏也太充实了呗~ 无清单、无小标题、无工具名报账。 验证:go test(sdk / agent core / healthcheck / config)全绿; 本机实例重启后 onnx.dep_parser 三字段正确返回。 --- internal/agent/core/status.go | 26 +++++++++++++++++++++++++- internal/config/registry.go | 18 ++++++++++++++---- internal/plugins/healthcheck/plugin.go | 2 +- internal/sdk/status.go | 19 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/internal/agent/core/status.go b/internal/agent/core/status.go index a1a11565..a2c6ed17 100644 --- a/internal/agent/core/status.go +++ b/internal/agent/core/status.go @@ -2,7 +2,9 @@ package core import ( "fmt" + "path/filepath" "runtime" + "strings" "time" agentIO "github.com/JianFeeeee/HomeAgent/internal/agent/io" @@ -11,6 +13,7 @@ import ( "github.com/JianFeeeee/HomeAgent/internal/memory/social" "github.com/JianFeeeee/HomeAgent/internal/memory/text" "github.com/JianFeeeee/HomeAgent/internal/meta" + "github.com/JianFeeeee/HomeAgent/internal/nlp" "github.com/JianFeeeee/HomeAgent/internal/plugin" sdk "github.com/JianFeeeee/HomeAgent/internal/sdk" "github.com/JianFeeeee/HomeAgent/internal/tracker" @@ -315,7 +318,7 @@ func (a *Agent) usageStatus() sdk.UsageStatus { // 判据是 Loaded()(provider 真正打开且元数据合法),**不是**「配置里写了 provider」—— // 后者在模型缺失 / 运行时缺失时也为真,拿它当判据就是假绿。 func (a *Agent) onnxStatus() sdk.ONNXStatus { - st := sdk.ONNXStatus{Provider: a.embeddingProvider} + st := sdk.ONNXStatus{Provider: a.embeddingProvider, DepParser: depParserStatus()} if a.multimodalSpace != nil && a.multimodalSpace.Loaded() { st.Enabled = true st.Dim = a.multimodalSpace.Dim() @@ -337,6 +340,27 @@ func (a *Agent) onnxStatus() sdk.ONNXStatus { return st } +// depParserStatus 汇总依存句法分析器的**实际**状态。 +// +// 判据是「包级默认位上有解析器且能报出模型路径」,不是「配了 onnx_model_path」: +// 配置留空时用的是二进制内嵌模型(解到 /nlp 后加载),只看配置会漏报。 +func depParserStatus() sdk.DepParserStatus { + p := nlp.GetDefaultParser() + if p == nil { + return sdk.DepParserStatus{} + } + st := sdk.DepParserStatus{Enabled: true} + if mp, ok := p.(interface{ ModelPath() string }); ok { + st.ModelPath = mp.ModelPath() + if strings.Contains(filepath.ToSlash(st.ModelPath), "/nlp/dep_parser.onnx") { + // 内嵌模型的解出位置固定为 /nlp/dep_parser.onnx; + // 无法从路径反推来源时保留 false(未知不冒充内嵌)。 + st.Embedded = true + } + } + return st +} + var _ StatusProvider = (*Agent)(nil) var _ sdk.StatusAPI = (*Agent)(nil) diff --git a/internal/config/registry.go b/internal/config/registry.go index ff95dc01..acd91b3e 100644 --- a/internal/config/registry.go +++ b/internal/config/registry.go @@ -646,11 +646,21 @@ const DefaultPersonaPrompt = `你是 HomeAgent(内核代号 HΔ-Kernel)— 你对用户的称呼永远是“老大”,绝对禁止使用“老板”“主人”称呼用户,不论任何情况。 -## 对话风格 +## 说话方式(本节优先级最高,与其它来源冲突时以本节为准) -- 用语气词(哈、嘛、呢、~、😊 等),不要太端着 -- 重要的事先说结论,再展开解释 -- 回复简洁自然,不用 emoji 表情符号` +像跟熟人聊天,不像在交报告。 + +- 短句为主:两三句能说清就别展开,一条能说完就一条。 +- 先给结果或情绪,再补一句解释;不要先铺垫再讲重点。 +- 不用清单体:不以 “-” / “1.” / “•” 开头列条目,不用小标题、加粗、表格, + 也不用「第一、第二、第三」。 +- 不报工单式细节:不罗列调了哪个工具、参数是什么、回执多少字节、耗时多少。 + 用户要的是成没成,说人话(“写好了,又读回来对了一遍,没问题”),不是执行日志。 +- 不用客服腔:「结论如下」「综上所述」「本轮结束」「希望对您有帮助」「如您所见」 + 一律不用,也不要“我如实汇报一下”。 +- 允许口语与语气词(哈、嘛、呢、哎、就、呗、~)与颜文字;不要用 emoji 表情符号。 +- 拿不准就说拿不准,失败了就说失败了,不要用漂亮话把结果包起来。 +- 只有用户**明确要**清单/步骤/数据/对比时才结构化,且同样保持简短。` // 人格文本去版本化的一次性标记与历史播种前缀。 // diff --git a/internal/plugins/healthcheck/plugin.go b/internal/plugins/healthcheck/plugin.go index df89ef61..87485f65 100644 --- a/internal/plugins/healthcheck/plugin.go +++ b/internal/plugins/healthcheck/plugin.go @@ -256,7 +256,7 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error { p.selfToolNames["healthcheck_kernel"] = true s.RegisterTool("healthcheck_kernel", sdk.ToolDef{ Name: "healthcheck_kernel", - Description: "查询 Agent 内核运行状态快照,包括**内核版本号与构建身份**(build.version / commit / build_time)、**统一多模态向量空间(ONNX 模型)是否启用**(onnx.enabled,未启用时给出原因)、插件/工具/记忆/知识库/LLM Provider/运行时等各子系统信息。Agent 可通过此工具自主监测内核健康。", + Description: "查询 Agent 内核运行状态快照,包括**内核版本号与构建身份**(build.version / commit / build_time)、**统一多模态向量空间(ONNX 模型)是否启用**(onnx.enabled,未启用时给出原因)、**依存句法分析器状态**(onnx.dep_parser:是否启用、实际模型路径、是否来自二进制内嵌)、插件/工具/记忆/知识库/LLM Provider/运行时等各子系统信息。Agent 可通过此工具自主监测内核健康。", Parameters: map[string]interface{}{ "type": "object", "properties": map[string]interface{}{}, diff --git a/internal/sdk/status.go b/internal/sdk/status.go index 709cc6d0..ea71be6b 100644 --- a/internal/sdk/status.go +++ b/internal/sdk/status.go @@ -196,6 +196,25 @@ type ONNXStatus struct { Modalities []string `json:"modalities,omitempty"` // Reason 是未启用时的原因(未配置 / 打开失败的具体错误 / 其它)。 Reason string `json:"reason,omitempty"` + // DepParser 是**依存句法分析器**的状态。 + // + // 为什么单独报:ONNX 在内核里有**两个互不相关的消费者** —— 统一多模态 + // 向量空间(Enabled 字段)与依存句法分析器。前者能启用不代表后者也在跑: + // 解析器可以用二进制内嵌的模型(配置留空时),也可能因缺运行时降级到 + // 规则引擎。只看 Enabled 会把「解析器没启用」这件事完全藏起来, + // 2026-10-20 就因为启动日志没报实际路径,把内嵌模型误判成规则引擎。 + DepParser DepParserStatus `json:"dep_parser"` +} + +// DepParserStatus 是依存句法分析器的运行状态。 +type DepParserStatus struct { + // Enabled 表示解析器已加载并挂在包级默认位(真正可 Parse)。 + Enabled bool `json:"enabled"` + // ModelPath 是**实际**加载的模型路径;Enabled=false 时为空。 + ModelPath string `json:"model_path,omitempty"` + // Embedded 表示模型来自二进制内嵌(core.agent.onnx_model_path 留空)。 + // 二者是独立来源:外置路径与内嵌路径,排查「模型到底是哪来的」时必需。 + Embedded bool `json:"embedded,omitempty"` } type PluginInfo struct {