feat: refactor HandoffGraph to use structured arguments and add unit tests for buildReason method

This commit is contained in:
mlogclub
2026-04-14 11:08:02 +08:00
parent 2211f29da7
commit a5b0ddc760
2 changed files with 38 additions and 15 deletions
+7 -15
View File
@@ -22,6 +22,10 @@ type HandoffGraphInterruptInfo struct {
Message string `json:"message"`
}
type handoffGraphArgs struct {
Reason string `json:"reason"`
}
func init() {
schema.RegisterName[HandoffGraphState]("cs_agent_handoff_graph_state")
schema.RegisterName[HandoffGraphInterruptInfo]("cs_agent_handoff_graph_interrupt_info")
@@ -92,13 +96,13 @@ func (g *HandoffGraph) Run(ctx context.Context, argumentsInJSON string) (string,
func (g *HandoffGraph) buildReason(argumentsInJSON string) (string, error) {
reason := "用户需要转人工支持"
raw := make(map[string]any)
var args handoffGraphArgs
if strings.TrimSpace(argumentsInJSON) != "" {
if err := json.Unmarshal([]byte(argumentsInJSON), &raw); err != nil {
if err := json.Unmarshal([]byte(argumentsInJSON), &args); err != nil {
return "", fmt.Errorf("invalid handoff arguments: %w", err)
}
}
if parsed := strings.TrimSpace(graphGetStringValue(raw, "reason")); parsed != "" {
if parsed := strings.TrimSpace(args.Reason); parsed != "" {
reason = parsed
}
return reason, nil
@@ -111,15 +115,3 @@ func (g *HandoffGraph) buildConfirmationPrompt(reason string) string {
func parseHandoffDecision(value string) ConfirmationDecision {
return ParseConfirmationDecision(value)
}
func graphGetStringValue(data map[string]any, key string) string {
if len(data) == 0 {
return ""
}
value, ok := data[key]
if !ok || value == nil {
return ""
}
text, _ := value.(string)
return text
}
@@ -0,0 +1,31 @@
package graphs
import (
"testing"
"cs-agent/internal/models"
)
func TestHandoffGraphBuildReason(t *testing.T) {
graph := NewHandoffGraph(&models.Conversation{ID: 1}, &models.AIAgent{Name: "AI"})
reason, err := graph.buildReason(`{"reason":" 用户需要人工确认 "}`)
if err != nil {
t.Fatalf("buildReason returned error: %v", err)
}
if reason != "用户需要人工确认" {
t.Fatalf("unexpected reason: %q", reason)
}
}
func TestHandoffGraphBuildReasonFallback(t *testing.T) {
graph := NewHandoffGraph(&models.Conversation{ID: 1}, &models.AIAgent{Name: "AI"})
reason, err := graph.buildReason(`{}`)
if err != nil {
t.Fatalf("buildReason returned error: %v", err)
}
if reason != "用户需要转人工支持" {
t.Fatalf("unexpected fallback reason: %q", reason)
}
}