Files
ai-agent/internal/ai/workflow/compiler/compiler.go
T

61 lines
1.6 KiB
Go
Raw Normal View History

2026-06-22 00:26:16 +08:00
package compiler
import (
"fmt"
"strings"
"agent-desk/internal/ai/workflow/dsl"
workflowregistry "agent-desk/internal/ai/workflow/registry"
"agent-desk/internal/pkg/toolx"
)
type Result struct {
ToolCodes []string
Appendix string
}
func Compile(def dsl.Definition) Result {
toolCodes := make([]string, 0)
lines := make([]string, 0, len(def.Nodes)+2)
if strings.TrimSpace(def.EntryNodeID) != "" {
lines = append(lines, fmt.Sprintf("Workflow entry node: %s.", strings.TrimSpace(def.EntryNodeID)))
}
for _, node := range def.Nodes {
nodeType := strings.TrimSpace(node.Type)
if code := graphToolCodeForNodeType(nodeType); code != "" {
toolCodes = append(toolCodes, code)
}
nodeName := strings.TrimSpace(node.Name)
if nodeName == "" {
nodeName = strings.TrimSpace(node.ID)
}
if nodeName == "" {
continue
}
lines = append(lines, fmt.Sprintf("- %s: %s", nodeName, nodeType))
}
appendix := ""
if len(lines) > 0 {
appendix = "Published customer-service workflow:\n" + strings.Join(lines, "\n")
}
return Result{
ToolCodes: toolx.NormalizeToolCodes(toolCodes),
Appendix: appendix,
}
}
func graphToolCodeForNodeType(nodeType string) string {
switch strings.TrimSpace(nodeType) {
case workflowregistry.NodeTypeAnalyzeConversation:
return toolx.GraphAnalyzeConversation.Code
case workflowregistry.NodeTypePrepareTicketDraft:
return toolx.GraphPrepareTicketDraft.Code
case workflowregistry.NodeTypeCreateTicket:
return toolx.GraphCreateTicketConfirm.Code
case workflowregistry.NodeTypeHandoffToHuman:
return toolx.GraphHandoffConversation.Code
default:
return ""
}
}