55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
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)
|
|
}
|