Version: 0.8.3.dev.260328
后端: 1.彻底删除原agent文件夹,并将现agent2文件夹全量重命名为agent(包括全部涉及到的文件以及文档、注释),迁移工作完美结束 2.修复了重试消息的相关逻辑问题 前端: 1.改善了一些交互体验,修复了一些bug,现在只剩少的功能了,现存的bug基本都修复完毕 全仓库: 1.更新了决策记录和README文档
This commit is contained in:
67
backend/agent/router/route.go
Normal file
67
backend/agent/router/route.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package agentrouter
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Dispatcher 是 Agent 的统一分发器。
|
||||
type Dispatcher struct {
|
||||
resolver Resolver
|
||||
handlers map[Action]SkillHandler
|
||||
}
|
||||
|
||||
// NewDispatcher 创建统一分发器。
|
||||
func NewDispatcher(resolver Resolver) *Dispatcher {
|
||||
return &Dispatcher{
|
||||
resolver: resolver,
|
||||
handlers: make(map[Action]SkillHandler),
|
||||
}
|
||||
}
|
||||
|
||||
// Register 注册某个动作的处理函数。
|
||||
func (d *Dispatcher) Register(action Action, handler SkillHandler) error {
|
||||
if d == nil {
|
||||
return errors.New("dispatcher is nil")
|
||||
}
|
||||
if action == "" {
|
||||
return errors.New("route action is empty")
|
||||
}
|
||||
if handler == nil {
|
||||
return fmt.Errorf("handler for action %s is nil", action)
|
||||
}
|
||||
if _, exists := d.handlers[action]; exists {
|
||||
return fmt.Errorf("handler for action %s already registered", action)
|
||||
}
|
||||
d.handlers[action] = handler
|
||||
return nil
|
||||
}
|
||||
|
||||
// Dispatch 执行“分流 -> skill handler”完整入口。
|
||||
func (d *Dispatcher) Dispatch(ctx context.Context, req *AgentRequest) (*AgentResponse, error) {
|
||||
if d == nil || d.resolver == nil {
|
||||
return nil, errors.New("route dispatcher is not ready")
|
||||
}
|
||||
if req == nil {
|
||||
return nil, errors.New("agent request is nil")
|
||||
}
|
||||
|
||||
// 1. 调用目的:统一先走一级路由,让入口层只关心“请求来了”,
|
||||
// 不需要提前知道这是普通聊天、随口记、任务查询还是后续排程。
|
||||
decision, err := d.resolver.Resolve(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if decision == nil {
|
||||
return nil, errors.New("route decision is nil")
|
||||
}
|
||||
|
||||
// 2. 路由结果出来后,只根据 action 查找对应 handler。
|
||||
// 这里故意不做 skill 级 fallback,避免路由层和 skill 内部职责再次缠在一起。
|
||||
handler, exists := d.handlers[decision.Action]
|
||||
if !exists {
|
||||
return nil, fmt.Errorf("no handler registered for action %s", decision.Action)
|
||||
}
|
||||
return handler(ctx, req)
|
||||
}
|
||||
Reference in New Issue
Block a user