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
-5
View File
@@ -69,17 +69,12 @@ func buildSeedItems() []models.SkillDefinition {
2. 优先围绕问题定位和升级处理推进,不要输出与当前诉求无关的自我介绍。
3. 如果进入确认流程,明确告知用户你将协助提交或转接,并等待确认结果。`,
Examples: `[
"设备今天开始一直离线,重启也没用,帮我提个工单",
"这个问题三天了还没解决,我要投诉一下",
"麻烦转人工,你这边解决不了",
"售后什么时候联系我?这个故障还没有人跟进",
"帮我登记一下报障,产品型号是AX300,无法联网",
"我要申请售后处理,这个问题反复出现",
"你好,你是谁",
"这个产品怎么安装"
]`,
ToolWhitelist: `[
"graph/prepare_ticket_draft",
"graph/create_ticket_with_confirmation",
"graph/handoff_to_human"
]`,
@@ -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
}