mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-22 01:48:11 +00:00
feat(multimodal): 内置多模态感知插件 + process.go 原生支持 tool message 多模态块
【新插件 internal/plugins/multimodal】
- see_picture(path): 读取本地图片/URL,base64 注入 image_url block,
模型在下一轮 LLM 请求的 tool message 里直接看到图(1024×1024 图约 8500 token)。
自动识别 MIME,限 3MB 防爆 context。
- see_video(path, frames): ffmpeg 提取关键帧,多帧作为 image_url block 注入。
默认 4 帧,最大 10 帧,每帧限 2MB。
- listen(path): 读取音频文件,转为 audio_url block 注入,支持 mp3/wav/ogg/m4a。
限 5MB。
【内核多模态 tool message 支持】
- agent/api 新增 ToolOutput 类型(为后续 handler 直接返回 blocks 预留)
- SDK 公共层新增 ContentBlock/ImageURL/AudioURL(OpenAI 多模态格式)
- IOManager 新增 SetToolBlocks/ConsumeToolBlocks(interface{} 避免循环依赖)
- PluginSDK.SetToolBlocks(blocks) 插件工具调用后注入 blocks
- ioAdapter 桥接 IOInjector.SetToolBlocks
- process.go 工具执行后消费 pending blocks → 追加到 tool message 的 Blocks 字段
→ MarshalJSON 输出 content 数组格式 → LLM 看到图/音频
【验证】
multimodal_see_picture 注入 1024×1024 PNG 后 llmsproxy 统计:
prompt_tokens=44407(含 ~8500 image token),模型正确描述了图片内容。
This commit is contained in:
@ -103,6 +103,11 @@ type IOManager struct {
|
||||
outputCh chan *OutputEvent
|
||||
nextReqID int64
|
||||
inputChannels map[string]ChannelDef
|
||||
|
||||
// toolBlocks:插件工具注入多模态内容块,process.go 在下一条 tool message 时消费。
|
||||
// 用 interface{}[] 避免 import api.ContentBlock 导致的循环依赖。
|
||||
toolBlocksMu sync.Mutex
|
||||
toolPendingBlocks []interface{}
|
||||
}
|
||||
|
||||
func NewIOManager() *IOManager {
|
||||
@ -669,3 +674,20 @@ func (d *GPIODevice) Tools() []ToolDef {
|
||||
func (d *GPIODevice) Execute(tool string, args map[string]interface{}) (interface{}, error) {
|
||||
return map[string]interface{}{"device": d.name, "tool": tool, "status": "ok"}, nil
|
||||
}
|
||||
|
||||
// SetToolBlocks 插件工具调用时注入多模态内容块(image_url/audio_url 等),
|
||||
// 下一条 tool message 追加这些块到 content 数组(OpenAI 多模态格式)。
|
||||
func (m *IOManager) SetToolBlocks(blocks []interface{}) {
|
||||
m.toolBlocksMu.Lock()
|
||||
m.toolPendingBlocks = blocks
|
||||
m.toolBlocksMu.Unlock()
|
||||
}
|
||||
|
||||
// ConsumeToolBlocks 返回并清空 pending blocks,process.go 在 append tool message 时调用。
|
||||
func (m *IOManager) ConsumeToolBlocks() []interface{} {
|
||||
m.toolBlocksMu.Lock()
|
||||
blocks := m.toolPendingBlocks
|
||||
m.toolPendingBlocks = nil
|
||||
m.toolBlocksMu.Unlock()
|
||||
return blocks
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user