feat: converge dynamic plugins onto canonical homeagent-sdk

- Separate built-in plugin interface from external plugin interface
- Route dynamic plugin loading through homeagent-sdk/sdk using reflection
- Turn internal/sdk into an enhanced wrapper over canonical SDK types
- Vendor SDK repo snapshot under third_party/homeagent-sdk for stable builds
- Keep internal constructors/adapters for memory, knowledge, llm, settings
- Align dynamic QQ loading with canonical SDK chain
This commit is contained in:
root
2026-07-06 19:27:51 +08:00
parent a7e06fba77
commit 50e5dec745
37 changed files with 4505 additions and 420 deletions

View File

@ -0,0 +1,17 @@
# Build external Go plugin for HomeAgent
# Usage: make # build plugin.so
# make clean # remove plugin.so
PLUGIN_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
SDK_ROOT := $(realpath $(PLUGIN_DIR)../..)
PLUGIN_NAME := $(notdir $(realpath $(PLUGIN_DIR)))
.PHONY: all clean
all: plugin.so
plugin.so:
cd $(SDK_ROOT) && go build -buildmode=plugin -o $(PLUGIN_DIR)plugin.so $(PLUGIN_DIR)
clean:
rm -f $(PLUGIN_DIR)plugin.so

View File

@ -0,0 +1,2 @@
plugin.so
*.hmap

View File

@ -0,0 +1,54 @@
package main
import (
"log"
"gitcode.com/JianFeeeee/homeagent-sdk/sdk"
)
type Plugin struct {
name string
sdk *sdk.PluginSDK
}
func NewPlugin(name string, config map[string]interface{}) (sdk.Plugin, error) {
return &Plugin{
name: name,
}, nil
}
func (p *Plugin) Name() string { return p.name }
func (p *Plugin) Start(s *sdk.PluginSDK) error {
p.sdk = s
tp := p.name + "_"
s.RegisterTool(tp+"example", sdk.ToolDef{
Name: tp + "example",
Description: "示例工具 - 请替换为实现",
Parameters: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"input": map[string]interface{}{"type": "string", "description": "输入参数"},
},
"required": []string{"input"},
},
}, p.handleExample)
log.Printf("[%s] plugin started", p.name)
return nil
}
func (p *Plugin) Stop() error {
return nil
}
func (p *Plugin) handleExample(args map[string]interface{}) (interface{}, error) {
input, _ := args["input"].(string)
return map[string]interface{}{
"echo": input,
}, nil
}
func main() {}

View File

@ -0,0 +1,10 @@
{
"name": "{{.Name}}",
"version": "{{.Version}}",
"description": "{{.Description}}",
"author": "{{.Author}}",
"license": "MIT",
"entry": "plugin.so",
"min_version": "1.0.0",
"tags": ["{{.Name}}"]
}