Files
smartmate/backend/agent/router/route.go
Losita 468367d617 Version: 0.8.3.dev.260328
后端:
1.彻底删除原agent文件夹,并将现agent2文件夹全量重命名为agent(包括全部涉及到的文件以及文档、注释),迁移工作完美结束
2.修复了重试消息的相关逻辑问题

前端:
1.改善了一些交互体验,修复了一些bug,现在只剩少的功能了,现存的bug基本都修复完毕

全仓库:
1.更新了决策记录和README文档
2026-03-28 18:00:31 +08:00

68 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}