Files
ai-agent-scaffold-go/internal/domain/agent/service/armory/chat_model_node.go

55 lines
1.5 KiB
Go
Raw Normal View History

2026-05-30 23:16:49 +08:00
package armory
import (
"context"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
"ai-agent-scaffold-go/internal/domain/shared/tree"
)
type ChatModelNode struct {
modelProvider ports.ModelProvider
mcpFactory ports.MCPToolFactory
skillFactory ports.SkillFactory
next Handler
}
func NewChatModelNode(
modelProvider ports.ModelProvider,
mcpFactory ports.MCPToolFactory,
skillFactory ports.SkillFactory,
next Handler,
) ChatModelNode {
return ChatModelNode{
modelProvider: modelProvider,
mcpFactory: mcpFactory,
skillFactory: skillFactory,
next: next,
}
}
func (n ChatModelNode) Apply(ctx context.Context, command model.ArmoryCommand, dynamic *DynamicContext) (model.RegisteredAgent, error) {
var tools []ports.Tool
for _, config := range command.Table.Module.ChatModel.ToolMCPList {
built, err := n.mcpFactory.BuildTools(ctx, config)
if err != nil {
return model.RegisteredAgent{}, err
}
tools = append(tools, built...)
}
for _, config := range command.Table.Module.ChatModel.ToolSkillsList {
built, err := n.skillFactory.BuildTools(ctx, config)
if err != nil {
return model.RegisteredAgent{}, err
}
tools = append(tools, built...)
}
chatModel, err := n.modelProvider.NewChatModel(ctx, dynamic.ModelAPI, command.Table.Module.ChatModel, tools)
if err != nil {
return model.RegisteredAgent{}, err
}
dynamic.ChatModel = chatModel
return tree.Route(ctx, n.next, command, dynamic)
}