后端: 1.彻底删除原agent文件夹,并将现agent2文件夹全量重命名为agent(包括全部涉及到的文件以及文档、注释),迁移工作完美结束 2.修复了重试消息的相关逻辑问题 前端: 1.改善了一些交互体验,修复了一些bug,现在只剩少的功能了,现存的bug基本都修复完毕 全仓库: 1.更新了决策记录和README文档
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
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)
|
||
}
|