Files
HomeAgent/internal/kernelmod/onnx/mod.go
root 16c9d4f69e fix(startup): 启动阶段两类噪声归零 —— 插件 stdout 日志与 CLI 型技能误判
用户反馈启动日志里有报错。实测定位到两处,都是真实问题:

## 1. huawei_smarthome 往 stdout 打日志(8 条「收到非法 JSON 帧」)

stdout 是 JSON-RPC **协议通道**,它在 plugin.go/handlers.go/service.go 等处
用了 fmt.Printf(31 处),内核每收到一行就把协议解析失败一次。
这不是内核的错,是插件写法错 —— 已在其源码(/home/newqqagent/plugindev/
huawei_smarthome)把 fmt.Printf/Println 全部改成 log.Printf(stderr),
重新 hmapdev 打包并安装。重启后非法帧 0 条、10 个工具正常注册。

## 2. clawhubadapter 把 CLI 型 main.py 当 JSON-RPC sidecar

判定规则原为「有 main.py 就按 pysidecar 拉起」,但 ClawHub 上大量技能的
main.py 是 **CLI 入口**(`python3 main.py <tool> '<json>'`),对它发 ping
必然超时(bilibili、gaode 各等 5 秒)。旧代码只打一行错误就完事 ——
启动日志一片红,而技能既没变成工具、也没交给 skillmgr,等于半死不活。

改为:sidecar 就绪失败即降级为「CLI 型技能」,移交 skillmgr 并给出说明,
日志措辞从「错误」改为「未就绪 → 按 CLI 型处理」。两个技能现已可经
skill_info 读到文档、再用命令执行。

## 3. 顺带修一条看着像配置泄漏的日志

`dep parser initialized (model: )` —— 空括号是「未配置 ONNX 模型、走内置规则
引擎」的正常回退。改为显式说明,避免误读成缺配置。

## 验收(本机实例重启后实录)

- 「非法 JSON 帧」0 条(此前 8 条)
- dep parser 日志:`ready (内置规则引擎;未配置 core.agent.onnx_model_path)`
- 剩余 3 条均为说明性:mail-bridge 出站通道兜底、两个 CLI 型技能降级移交
- 13 个内置 + 13 个自启外部插件全部 loaded,agent main started
2026-10-20 09:00:58 +08:00

54 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package onnx 是 onnx-parser 模块:依存句法分析器(失败退回规则引擎)。
//
// ## ★ 它为什么是独立模块
//
// 它写的是**包级单例** `nlp.defaultParser`(internal/nlp/parser.go:15),
// 而该单例由**运行期**读取(`nlp.NewExtractor(nil)` 构造时快照它,
// 由蒸馏路径 `extractKeyTriples` 调用)。
//
// 这正是设计 §2.8.2 说的"签名看不到的隐藏依赖":没有参数传递,
// 而是**包级变量 + 运行期读**。
//
// ⇒ 独立成模块,让 text-memory 能**显式声明**对它的依赖
// (见 kernelmod/textmem 的说明)。这样"碰巧安全"变成"结构保证"。
package onnx
import (
"log"
"path/filepath"
"github.com/JianFeeeee/HomeAgent/internal/kernelboot"
"github.com/JianFeeeee/HomeAgent/internal/kernelmod"
"github.com/JianFeeeee/HomeAgent/internal/nlp"
)
// Module 初始化依存句法分析器。
type Module struct{}
func (Module) Name() string { return "onnx-parser" }
func (Module) Requires() []string { return []string{kernelmod.FacConfig} }
func (Module) Provides() []string { return []string{kernelmod.FacONNX} }
func (Module) Init(ks *kernelboot.KernelState) error {
modelPath := ks.CfgReg.GetString("core.agent.onnx_model_path", "")
onnxParser, err := nlp.NewONNXParser(nlp.ONNXConfig{
ModelPath: modelPath,
DataDir: filepath.Join(ks.Cfg.Daemon.DataDir, "nlp"),
})
if err != nil {
log.Printf("[homed] warn: ONNX parser init: %v, using fallback", err)
return nil
}
nlp.SetDefaultParser(onnxParser)
// 空路径 = 走内置规则引擎(不发 ONNX 推理)。旧日志打成
// "initialized (model: )" —— 空括号看着像配置泄漏了,实为正常回退。
if modelPath == "" {
log.Printf("[homed] dep parser ready (内置规则引擎;未配置 core.agent.onnx_model_path)")
} else {
log.Printf("[homed] dep parser ready (ONNX model: %s)", modelPath)
}
return nil
}
func init() { kernelmod.Register(Module{}) }