feat: implement buildResumeTargets function and update resume handling logic

This commit is contained in:
mlogclub
2026-04-14 18:27:45 +08:00
parent e4cec52661
commit 1766eadcf1
6 changed files with 66 additions and 8 deletions
@@ -28,6 +28,24 @@ func buildResumeDataMessage(resumeData map[string]string) *schema.Message {
return schema.UserMessage(string(data))
}
func buildResumeTargets(resumeData map[string]string) map[string]any {
if len(resumeData) == 0 {
return nil
}
targets := make(map[string]any, len(resumeData))
for key, value := range resumeData {
key = strings.TrimSpace(key)
if key == "" {
continue
}
targets[key] = value
}
if len(targets) == 0 {
return nil
}
return targets
}
func buildRunOptions(checkPointID string) []adk.AgentRunOption {
options := make([]adk.AgentRunOption, 0, 1)
if strings.TrimSpace(checkPointID) != "" {
@@ -0,0 +1,34 @@
package executor
import "testing"
func TestBuildResumeTargets(t *testing.T) {
targets := buildResumeTargets(map[string]string{
" interrupt-1 ": "确认",
"": "ignored",
" ": "ignored",
"interrupt-2": "取消",
})
if len(targets) != 2 {
t.Fatalf("expected 2 resume targets, got %d", len(targets))
}
if got := targets["interrupt-1"]; got != "确认" {
t.Fatalf("unexpected target data for interrupt-1: %#v", got)
}
if got := targets["interrupt-2"]; got != "取消" {
t.Fatalf("unexpected target data for interrupt-2: %#v", got)
}
}
func TestBuildResumeTargetsEmpty(t *testing.T) {
if got := buildResumeTargets(nil); got != nil {
t.Fatalf("expected nil targets for nil input, got %#v", got)
}
if got := buildResumeTargets(map[string]string{
"": "ignored",
" ": "ignored",
}); got != nil {
t.Fatalf("expected nil targets for blank keys, got %#v", got)
}
}
+12 -1
View File
@@ -8,6 +8,7 @@ import (
"cs-agent/internal/ai/runtime/internal/impl/callbacks"
"cs-agent/internal/ai/runtime/internal/impl/factory"
"github.com/cloudwego/eino/adk"
"github.com/google/uuid"
)
@@ -213,7 +214,17 @@ func (s *Service) ExecuteResume(ctx context.Context, req ResumeInput) (*RunResul
return summary, fmt.Errorf("%s", summary.ErrorMessage)
}
resumeData := buildResumeDataMessage(req.ResumeData)
iter, err := runner.Resume(ctx, summary.CheckPointID, buildResumeOptions(summary.CheckPointID, resumeData)...)
resumeTargets := buildResumeTargets(req.ResumeData)
var (
iter *adk.AsyncIterator[*adk.AgentEvent]
)
if len(resumeTargets) > 0 {
iter, err = runner.ResumeWithParams(ctx, summary.CheckPointID, &adk.ResumeParams{
Targets: resumeTargets,
}, buildResumeOptions(summary.CheckPointID, resumeData)...)
} else {
iter, err = runner.Resume(ctx, summary.CheckPointID, buildResumeOptions(summary.CheckPointID, resumeData)...)
}
if err != nil {
summary.Status = "error"
summary.ErrorMessage = err.Error()
@@ -100,7 +100,7 @@ func (t *AnalyzeConversationTool) Info(ctx context.Context) (*schema.ToolInfo, e
}),
Extra: map[string]any{
"toolCode": toolx.GraphAnalyzeConversation.Code,
"sourceType": "graph",
"sourceType": toolx.GraphAnalyzeConversation.SourceType,
},
}, nil
}
@@ -69,7 +69,7 @@ func (t *HandoffGraphTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
}),
Extra: map[string]any{
"toolCode": toolx.GraphHandoffConversation.Code,
"sourceType": "graph",
"sourceType": toolx.GraphHandoffConversation.SourceType,
},
}, nil
}