feat(project): 项目完结

This commit is contained in:
peakxy
2026-05-30 23:16:49 +08:00
commit 60e7777cbd
97 changed files with 15027 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
package workflow
import (
"context"
"fmt"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
"ai-agent-scaffold-go/internal/domain/agent/service/armory"
"ai-agent-scaffold-go/internal/domain/shared/tree"
)
type workflowBuilder interface {
Build(context.Context, model.AgentWorkflowConfig, []ports.Agent) (ports.Agent, error)
}
type AgentWorkflowNode struct {
next armory.Handler
builders map[model.WorkflowType]workflowBuilder
buildOrder []model.WorkflowType
}
func NewAgentWorkflowNode(agentFactory ports.AgentFactory, next armory.Handler) *AgentWorkflowNode {
buildOrder := []model.WorkflowType{
model.WorkflowTypeLoop,
model.WorkflowTypeParallel,
model.WorkflowTypeSequential,
}
return &AgentWorkflowNode{
next: next,
builders: map[model.WorkflowType]workflowBuilder{
model.WorkflowTypeLoop: NewLoopNode(agentFactory),
model.WorkflowTypeParallel: NewParallelNode(agentFactory),
model.WorkflowTypeSequential: NewSequentialNode(agentFactory),
},
buildOrder: buildOrder,
}
}
func (n *AgentWorkflowNode) Apply(ctx context.Context, command model.ArmoryCommand, dynamic *armory.DynamicContext) (model.RegisteredAgent, error) {
workflows := command.Table.Module.AgentWorkflows
if dynamic.CurrentStepIndex() >= len(workflows) {
dynamic.SetCurrentWorkflow(nil)
return tree.Route(ctx, n.next, command, dynamic)
}
workflow := workflows[dynamic.CurrentStepIndex()]
dynamic.SetCurrentWorkflow(&workflow)
dynamic.AddCurrentStepIndex()
agent, err := n.build(ctx, workflow, dynamic.QueryAgentList(workflow.SubAgents))
if err != nil {
return model.RegisteredAgent{}, err
}
dynamic.AddAgent(agent)
return n.Apply(ctx, command, dynamic)
}
func (n *AgentWorkflowNode) build(ctx context.Context, workflow model.AgentWorkflowConfig, subAgents []ports.Agent) (ports.Agent, error) {
for _, workflowType := range n.buildOrder {
if workflow.Type != workflowType {
continue
}
return n.builders[workflowType].Build(ctx, workflow, subAgents)
}
return nil, fmt.Errorf("agentWorkflow type is error: %s", workflow.Type)
}

View File

@@ -0,0 +1,20 @@
package workflow
import (
"context"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
)
type LoopNode struct {
agentFactory ports.AgentFactory
}
func NewLoopNode(agentFactory ports.AgentFactory) LoopNode {
return LoopNode{agentFactory: agentFactory}
}
func (n LoopNode) Build(ctx context.Context, workflow model.AgentWorkflowConfig, subAgents []ports.Agent) (ports.Agent, error) {
return n.agentFactory.NewLoopAgent(ctx, workflow, subAgents)
}

View File

@@ -0,0 +1,20 @@
package workflow
import (
"context"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
)
type ParallelNode struct {
agentFactory ports.AgentFactory
}
func NewParallelNode(agentFactory ports.AgentFactory) ParallelNode {
return ParallelNode{agentFactory: agentFactory}
}
func (n ParallelNode) Build(ctx context.Context, workflow model.AgentWorkflowConfig, subAgents []ports.Agent) (ports.Agent, error) {
return n.agentFactory.NewParallelAgent(ctx, workflow, subAgents)
}

View File

@@ -0,0 +1,20 @@
package workflow
import (
"context"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
)
type SequentialNode struct {
agentFactory ports.AgentFactory
}
func NewSequentialNode(agentFactory ports.AgentFactory) SequentialNode {
return SequentialNode{agentFactory: agentFactory}
}
func (n SequentialNode) Build(ctx context.Context, workflow model.AgentWorkflowConfig, subAgents []ports.Agent) (ports.Agent, error) {
return n.agentFactory.NewSequentialAgent(ctx, workflow, subAgents)
}