mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-20 17:08:01 +00:00
feat(plugindev): output.invoke 模板从共享帧读参数(§13.6)
内核侧 OutputInvokeParams 新增 Frame/ArgsLen,payload 不再内联在 RPC 报文里。 模板必须跟着读帧,否则 frameInput 拿不到参数、输出通道收到的 payload 为空—— 生产插件(如 qq)走的正是模板,模板不改这个改动就等于没做。 无帧时回退内联 args,保持对直连 RPC 调用方的兼容。
This commit is contained in:
@ -1242,8 +1242,23 @@ func handleKernelRequest(req *rpcRequest) {
|
|||||||
var p struct {
|
var p struct {
|
||||||
Channel string `json:"channel"`
|
Channel string `json:"channel"`
|
||||||
Args map[string]interface{} `json:"args"`
|
Args map[string]interface{} `json:"args"`
|
||||||
|
Frame SharedRef `json:"frame"`
|
||||||
|
ArgsLen uint32 `json:"args_len"`
|
||||||
}
|
}
|
||||||
json.Unmarshal(req.Params, &p)
|
json.Unmarshal(req.Params, &p)
|
||||||
|
// 参数:内核标定帧的前段(§13.6)。只有直连 RPC 的调用方(无帧)
|
||||||
|
// 才走内联 Args——生产路径永远走帧,大 payload 不再爆管道。
|
||||||
|
args := p.Args
|
||||||
|
if !p.Frame.IsZero() {
|
||||||
|
if blob := frameInput(p.Frame, p.ArgsLen); len(blob) > 0 {
|
||||||
|
var decoded map[string]interface{}
|
||||||
|
if err := json.Unmarshal(blob, &decoded); err != nil {
|
||||||
|
respondErr(req.ID, fmt.Errorf("解析共享输出参数: %w", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
args = decoded
|
||||||
|
}
|
||||||
|
}
|
||||||
handlerMu.RLock()
|
handlerMu.RLock()
|
||||||
h, ok := outputHandlers[p.Channel]
|
h, ok := outputHandlers[p.Channel]
|
||||||
handlerMu.RUnlock()
|
handlerMu.RUnlock()
|
||||||
@ -1252,7 +1267,7 @@ func handleKernelRequest(req *rpcRequest) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 同步返回真实结果——内核据此告知模型成功/失败,不再假成功(§9.4)
|
// 同步返回真实结果——内核据此告知模型成功/失败,不再假成功(§9.4)
|
||||||
res, err := h(p.Args)
|
res, err := h(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
respondErr(req.ID, err)
|
respondErr(req.ID, err)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user