feat: implement buildResumeTargets function and update resume handling logic
This commit is contained in:
Vendored
-5
@@ -69,17 +69,12 @@ func buildSeedItems() []models.SkillDefinition {
|
|||||||
2. 优先围绕问题定位和升级处理推进,不要输出与当前诉求无关的自我介绍。
|
2. 优先围绕问题定位和升级处理推进,不要输出与当前诉求无关的自我介绍。
|
||||||
3. 如果进入确认流程,明确告知用户你将协助提交或转接,并等待确认结果。`,
|
3. 如果进入确认流程,明确告知用户你将协助提交或转接,并等待确认结果。`,
|
||||||
Examples: `[
|
Examples: `[
|
||||||
"设备今天开始一直离线,重启也没用,帮我提个工单",
|
|
||||||
"这个问题三天了还没解决,我要投诉一下",
|
"这个问题三天了还没解决,我要投诉一下",
|
||||||
"麻烦转人工,你这边解决不了",
|
"麻烦转人工,你这边解决不了",
|
||||||
"售后什么时候联系我?这个故障还没有人跟进",
|
"售后什么时候联系我?这个故障还没有人跟进",
|
||||||
"帮我登记一下报障,产品型号是AX300,无法联网",
|
|
||||||
"我要申请售后处理,这个问题反复出现",
|
"我要申请售后处理,这个问题反复出现",
|
||||||
"你好,你是谁",
|
|
||||||
"这个产品怎么安装"
|
|
||||||
]`,
|
]`,
|
||||||
ToolWhitelist: `[
|
ToolWhitelist: `[
|
||||||
"graph/prepare_ticket_draft",
|
|
||||||
"graph/create_ticket_with_confirmation",
|
"graph/create_ticket_with_confirmation",
|
||||||
"graph/handoff_to_human"
|
"graph/handoff_to_human"
|
||||||
]`,
|
]`,
|
||||||
|
|||||||
@@ -28,6 +28,24 @@ func buildResumeDataMessage(resumeData map[string]string) *schema.Message {
|
|||||||
return schema.UserMessage(string(data))
|
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 {
|
func buildRunOptions(checkPointID string) []adk.AgentRunOption {
|
||||||
options := make([]adk.AgentRunOption, 0, 1)
|
options := make([]adk.AgentRunOption, 0, 1)
|
||||||
if strings.TrimSpace(checkPointID) != "" {
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"cs-agent/internal/ai/runtime/internal/impl/callbacks"
|
"cs-agent/internal/ai/runtime/internal/impl/callbacks"
|
||||||
"cs-agent/internal/ai/runtime/internal/impl/factory"
|
"cs-agent/internal/ai/runtime/internal/impl/factory"
|
||||||
|
|
||||||
|
"github.com/cloudwego/eino/adk"
|
||||||
"github.com/google/uuid"
|
"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)
|
return summary, fmt.Errorf("%s", summary.ErrorMessage)
|
||||||
}
|
}
|
||||||
resumeData := buildResumeDataMessage(req.ResumeData)
|
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 {
|
if err != nil {
|
||||||
summary.Status = "error"
|
summary.Status = "error"
|
||||||
summary.ErrorMessage = err.Error()
|
summary.ErrorMessage = err.Error()
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ func (t *AnalyzeConversationTool) Info(ctx context.Context) (*schema.ToolInfo, e
|
|||||||
}),
|
}),
|
||||||
Extra: map[string]any{
|
Extra: map[string]any{
|
||||||
"toolCode": toolx.GraphAnalyzeConversation.Code,
|
"toolCode": toolx.GraphAnalyzeConversation.Code,
|
||||||
"sourceType": "graph",
|
"sourceType": toolx.GraphAnalyzeConversation.SourceType,
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ func (t *HandoffGraphTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
|
|||||||
}),
|
}),
|
||||||
Extra: map[string]any{
|
Extra: map[string]any{
|
||||||
"toolCode": toolx.GraphHandoffConversation.Code,
|
"toolCode": toolx.GraphHandoffConversation.Code,
|
||||||
"sourceType": "graph",
|
"sourceType": toolx.GraphHandoffConversation.SourceType,
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user