feat: Phase 6.1 收尾 — 目的路由接入所有AI组件

- Orchestrator 现在接受独立的 chatAdapter 和 intentAdapter
- BackgroundThinker 使用 deep_thinking purpose 适配器
- MemoryExtractor 使用 memory_extraction purpose 适配器
- Synthesizer 使用 chat purpose 适配器
- .env 回退时所有适配器共享同一 provider,完全向后兼容

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 22:19:57 +08:00
parent b1e89c606e
commit 313f41633a
2 changed files with 30 additions and 17 deletions
+23 -12
View File
@@ -70,11 +70,22 @@ func main() {
// 创建 ModelSelector (优先使用 models.json,回退到 .env) // 创建 ModelSelector (优先使用 models.json,回退到 .env)
modelSelector := llm.NewModelSelector(configLoader, envFallback) modelSelector := llm.NewModelSelector(configLoader, envFallback)
llmAdapter := modelSelector.DefaultAdapter()
// 为不同用途创建独立的适配器,支持目的路由
// 在 .env 回退模式下,所有适配器共享同一 provider
chatAdapter := modelSelector.DefaultAdapter()
provider, _ := modelSelector.Select(context.Background(), llm.PurposeIntentAnalysis)
intentAdapter := llm.NewAdapter(provider)
provider, _ = modelSelector.Select(context.Background(), llm.PurposeDeepThinking)
thinkerAdapter := llm.NewAdapter(provider)
provider, _ = modelSelector.Select(context.Background(), llm.PurposeMemoryExtraction)
memoryAdapter := llm.NewAdapter(provider)
if configLoader != nil && configLoader.HasConfig() { if configLoader != nil && configLoader.HasConfig() {
log.Printf("LLM适配器已就绪: models.json 驱动") log.Printf("LLM适配器已就绪: models.json 驱动 (chat=%s, intent=%s, think=%s, memory=%s)",
chatAdapter.ModelName(), intentAdapter.ModelName(), thinkerAdapter.ModelName(), memoryAdapter.ModelName())
} else { } else {
log.Printf("LLM适配器已就绪: .env 驱动 (模型=%s)", llmAdapter.ModelName()) log.Printf("LLM适配器已就绪: .env 驱动 (模型=%s)", chatAdapter.ModelName())
} }
// 初始化记忆系统 // 初始化记忆系统
@@ -88,9 +99,9 @@ func main() {
memRetriever = memory.NewRetriever(memStore, nil) memRetriever = memory.NewRetriever(memStore, nil)
// 记忆提取器使用LLM // 记忆提取器使用 memory purpose 适配器
memExtractor = memory.NewExtractor(memStore, func(ctx context.Context, messages []model.LLMMessage) (*model.LLMResponse, error) { memExtractor = memory.NewExtractor(memStore, func(ctx context.Context, messages []model.LLMMessage) (*model.LLMResponse, error) {
return llmAdapter.Chat(ctx, messages) return memoryAdapter.Chat(ctx, messages)
}) })
log.Println("记忆提取器已就绪") log.Println("记忆提取器已就绪")
} }
@@ -150,7 +161,7 @@ func main() {
thinkerCfg, thinkerCfg,
personaLoader, personaLoader,
memRetriever, memRetriever,
llmAdapter, thinkerAdapter,
iotClient, iotClient,
memStore, memStore,
toolRegistry, toolRegistry,
@@ -197,7 +208,7 @@ func main() {
mux := http.NewServeMux() mux := http.NewServeMux()
// 初始化子会话管理器 // 初始化子会话管理器
subManager := subsession.NewManager(llmAdapter) subManager := subsession.NewManager(chatAdapter)
// 注册子会话提供者 // 注册子会话提供者
subManager.Register(subsession.NewGeneralProvider(personaLoader)) subManager.Register(subsession.NewGeneralProvider(personaLoader))
@@ -210,11 +221,12 @@ func main() {
subManager.Register(subsession.NewReviewProvider()) subManager.Register(subsession.NewReviewProvider())
log.Printf("子会话管理器已就绪: %d 个提供者 (%v)", len(subManager.ListProviders()), subManager.ListProviders()) log.Printf("子会话管理器已就绪: %d 个提供者 (%v)", len(subManager.ListProviders()), subManager.ListProviders())
// 构建新的 Orchestrator (v2.0) // 构建新的 Orchestrator (v2.0) — 传入 purpose 专用适配器
orch := orchestrator.NewOrchestrator( orch := orchestrator.NewOrchestrator(
personaLoader, personaLoader,
ctxBuilder, ctxBuilder,
llmAdapter, chatAdapter,
intentAdapter,
subManager, subManager,
memRetriever, memRetriever,
memExtractor, memExtractor,
@@ -224,7 +236,7 @@ func main() {
// 注册对话API端点 // 注册对话API端点
mux.HandleFunc("/api/v1/chat", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/api/v1/chat", func(w http.ResponseWriter, r *http.Request) {
handleChat(w, r, orch, ctxBuilder, llmAdapter, personaLoader, memRetriever, memExtractor, iotClient, thinker, toolRegistry) handleChat(w, r, orch, ctxBuilder, personaLoader, memRetriever, memExtractor, iotClient, thinker, toolRegistry)
}) })
// 注册记忆API端点 // 注册记忆API端点
@@ -262,7 +274,7 @@ func main() {
mux.HandleFunc("/api/v1/health", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/api/v1/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"status":"ok","service":"ai-core","model":"` + llmAdapter.ModelName() + `"}`)) w.Write([]byte(`{"status":"ok","service":"ai-core","model":"` + chatAdapter.ModelName() + `"}`))
}) })
// 启动HTTP服务 // 启动HTTP服务
@@ -391,7 +403,6 @@ func handleChat(
r *http.Request, r *http.Request,
orch *orchestrator.Orchestrator, orch *orchestrator.Orchestrator,
ctxBuilder *ctxbuild.Builder, ctxBuilder *ctxbuild.Builder,
_ *llm.Adapter,
_ *persona.Loader, _ *persona.Loader,
_ *memory.Retriever, _ *memory.Retriever,
_ *memory.Extractor, _ *memory.Extractor,
@@ -70,11 +70,13 @@ func (o *Orchestrator) getBus() bus.Bus {
return o.eventBus return o.eventBus
} }
// NewOrchestrator 创建编排器 // NewOrchestrator 创建编排器
// chatAdapter 用于对话生成 (PurposeChat)intentAdapter 用于意图分析 (PurposeIntentAnalysis)。
func NewOrchestrator( func NewOrchestrator(
personaLoader *persona.Loader, personaLoader *persona.Loader,
contextBuilder *ctxbuild.Builder, contextBuilder *ctxbuild.Builder,
llmAdapter *llm.Adapter, chatAdapter *llm.Adapter,
intentAdapter *llm.Adapter,
subManager *subsession.Manager, subManager *subsession.Manager,
memoryRetriever *memory.Retriever, memoryRetriever *memory.Retriever,
memoryExtractor *memory.Extractor, memoryExtractor *memory.Extractor,
@@ -82,10 +84,10 @@ func NewOrchestrator(
return &Orchestrator{ return &Orchestrator{
personaLoader: personaLoader, personaLoader: personaLoader,
contextBuilder: contextBuilder, contextBuilder: contextBuilder,
llmAdapter: llmAdapter, llmAdapter: chatAdapter,
subManager: subManager, subManager: subManager,
intentAnalyzer: NewIntentAnalyzer(llmAdapter), intentAnalyzer: NewIntentAnalyzer(intentAdapter),
synthesizer: NewSynthesizer(llmAdapter), synthesizer: NewSynthesizer(chatAdapter),
memoryRetriever: memoryRetriever, memoryRetriever: memoryRetriever,
memoryExtractor: memoryExtractor, memoryExtractor: memoryExtractor,
} }