feat: 双模型并行图片预处理 — 视觉理解+OCR 同时调用,由会话模型自主判断

- preprocessImages 同时调用 vision 和 OCR 模型(并行 goroutine)
- 当两个模型不同时,OCR 专注文字提取,视觉模型负责场景理解
- 两种结果合并传给会话模型,由 LLM 自主判断和融合
- 修复 LoadFromDB 旧 action 角色记录映射为 assistant

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-29 13:03:04 +08:00
parent 91c9ee4b2d
commit 3e15285065
3 changed files with 99 additions and 16 deletions
+24
View File
@@ -178,6 +178,7 @@ func main() {
// 初始化工具注册中心 (使用共享插件模块)
toolRegistry := plgManager.NewToolRegistry()
var visionProvider llm.LLMProvider
var ocrProvider llm.LLMProvider
if getEnvBool("ENABLE_TOOLS", true) {
// 11 个共享通用插件 — 注册其工具到统一注册中心
registerPluginTools(toolRegistry, &pluginCalc.CalculatorPlugin{})
@@ -231,6 +232,25 @@ func main() {
if visionProvider == nil {
log.Println("视觉模型未配置,vision_analyze 将使用 base64 模式")
}
// 初始化 OCR 模型(与视觉模型并行调用,提供文字提取结果给会话模型自主判断)
ocrProvider = nil
if configLoader != nil && configLoader.HasConfig() {
cfg := configLoader.GetConfig()
if route, ok := cfg.Routing["ocr"]; ok && len(route.FallbackChain) > 0 {
for _, mid := range route.FallbackChain {
if _, ok := cfg.Models[mid]; ok {
ocrProvider, _ = modelSelector.Select(context.Background(), llm.PurposeOCR)
log.Printf("OCR模型已启用: %s", ocrProvider.ModelName())
break
}
}
}
}
if ocrProvider == nil {
log.Println("OCR模型未配置,图片文字提取将复用视觉模型")
}
toolRegistry.Register(wrapTool(tools.NewVisionTool(visionProvider), "vision_analyze", "Image Vision Analysis & OCR", "multimodal"))
if knowledgeRetriever != nil {
@@ -345,6 +365,10 @@ func main() {
orch.SetVisionProvider(visionProvider)
log.Printf("对话编排器: 视觉模型已注入 (%s)", visionProvider.ModelName())
}
if ocrProvider != nil {
orch.SetOCRProvider(ocrProvider)
log.Printf("对话编排器: OCR模型已注入 (%s)", ocrProvider.ModelName())
}
log.Println("对话编排器 v2.0 已就绪")
_ = orch