90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
package action
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/rockliang/poimen/workflows/internal/routing"
|
|
"go.temporal.io/sdk/activity"
|
|
)
|
|
|
|
// LLMRouterActivity is the Temporal activity that routes user requests to workflows
|
|
func LLMRouterActivity(ctx context.Context, input routing.LLMRouterInput) (*routing.LLMRouterOutput, error) {
|
|
logger := activity.GetLogger(ctx)
|
|
logger.Info("LLMRouterActivity started", "message", input.Message)
|
|
|
|
// Load knowledge base
|
|
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
|
|
}
|
|
|
|
// Create router
|
|
router, err := routing.NewLLMRouterDefault(kb)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create router: %w", err)
|
|
}
|
|
|
|
// Route the request
|
|
output, err := router.Route(ctx, input)
|
|
if err != nil {
|
|
logger.Error("LLMRouterActivity failed", "error", err)
|
|
return nil, err
|
|
}
|
|
|
|
if output.IsCron {
|
|
logger.Info("LLMRouterActivity completed (cron)",
|
|
"workflowName", output.CronSpec.Name,
|
|
"schedule", output.CronSpec.Schedule,
|
|
"stateCount", len(output.CronSpec.States))
|
|
} else {
|
|
logger.Info("LLMRouterActivity completed",
|
|
"workflowName", output.Spec.Name,
|
|
"stateCount", len(output.Spec.States))
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
// ValidateWorkflowSpecActivity validates a workflow spec before execution
|
|
func ValidateWorkflowSpecActivity(ctx context.Context, spec routing.WorkflowSpec) (*routing.ValidationResult, error) {
|
|
logger := activity.GetLogger(ctx)
|
|
logger.Info("ValidateWorkflowSpecActivity started", "workflowName", spec.Name)
|
|
|
|
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
|
|
}
|
|
|
|
validator := routing.NewValidator(kb)
|
|
result := validator.ValidateWorkflowSpec(&spec)
|
|
|
|
logger.Info("ValidateWorkflowSpecActivity completed",
|
|
"valid", result.Valid,
|
|
"errorCount", len(result.Errors))
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// ValidateCronWorkflowSpecActivity validates a cron workflow spec before scheduling
|
|
func ValidateCronWorkflowSpecActivity(ctx context.Context, spec routing.CronWorkflowSpec) (*routing.ValidationResult, error) {
|
|
logger := activity.GetLogger(ctx)
|
|
logger.Info("ValidateCronWorkflowSpecActivity started",
|
|
"workflowName", spec.Name,
|
|
"schedule", spec.Schedule)
|
|
|
|
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
|
|
}
|
|
|
|
validator := routing.NewValidator(kb)
|
|
result := validator.ValidateCronWorkflowSpec(&spec)
|
|
|
|
logger.Info("ValidateCronWorkflowSpecActivity completed",
|
|
"valid", result.Valid,
|
|
"errorCount", len(result.Errors))
|
|
|
|
return result, nil
|
|
}
|