feat: add recommended action, risk level, and ticket draft readiness to AgentRunLogResponse and related components

This commit is contained in:
mlogclub
2026-04-12 14:12:04 +08:00
parent c3ac4c3e28
commit 54f5a684c3
4 changed files with 100 additions and 56 deletions
@@ -3,6 +3,7 @@ package builders
import (
"cs-agent/internal/models"
"cs-agent/internal/pkg/dto/response"
"encoding/json"
"strings"
)
@@ -11,6 +12,7 @@ func BuildAgentRunLog(item *models.AgentRunLog) response.AgentRunLogResponse {
return response.AgentRunLogResponse{}
}
hitlStatus, hitlStatusName, hitlSummary := resolveAgentRunLogHITL(item)
recommendedAction, riskLevel, ticketDraftReady := resolveGraphOutcome(item.GraphToolTrace)
return response.AgentRunLogResponse{
ID: item.ID,
ConversationID: item.ConversationID,
@@ -25,6 +27,9 @@ func BuildAgentRunLog(item *models.AgentRunLog) response.AgentRunLogResponse {
ToolSearchTrace: item.ToolSearchTrace,
GraphToolTrace: item.GraphToolTrace,
GraphToolCode: item.GraphToolCode,
RecommendedAction: recommendedAction,
RiskLevel: riskLevel,
TicketDraftReady: ticketDraftReady,
HandoffReason: item.HandoffReason,
PlannedToolCode: item.PlannedToolCode,
PlanReason: item.PlanReason,
@@ -43,6 +48,29 @@ func BuildAgentRunLog(item *models.AgentRunLog) response.AgentRunLogResponse {
}
}
func resolveGraphOutcome(raw string) (recommendedAction, riskLevel string, ticketDraftReady bool) {
raw = strings.TrimSpace(raw)
if raw == "" {
return "", "", false
}
var payload struct {
Items []struct {
RecommendedAction string `json:"recommendedAction"`
RiskLevel string `json:"riskLevel"`
TicketDraftReady bool `json:"ticketDraftReady"`
} `json:"items"`
}
if err := json.Unmarshal([]byte(raw), &payload); err != nil {
return "", "", false
}
for _, item := range payload.Items {
if strings.TrimSpace(item.RecommendedAction) != "" || strings.TrimSpace(item.RiskLevel) != "" || item.TicketDraftReady {
return strings.TrimSpace(item.RecommendedAction), strings.TrimSpace(item.RiskLevel), item.TicketDraftReady
}
}
return "", "", false
}
func resolveAgentRunLogHITL(item *models.AgentRunLog) (status, statusName, summary string) {
if item == nil {
return "", "", ""
@@ -55,6 +55,9 @@ type AgentRunLogResponse struct {
ToolSearchTrace string `json:"toolSearchTrace"`
GraphToolTrace string `json:"graphToolTrace"`
GraphToolCode string `json:"graphToolCode"`
RecommendedAction string `json:"recommendedAction"`
RiskLevel string `json:"riskLevel"`
TicketDraftReady bool `json:"ticketDraftReady"`
HandoffReason string `json:"handoffReason"`
PlannedToolCode string `json:"plannedToolCode"`
PlanReason string `json:"planReason"`
+10
View File
@@ -440,6 +440,13 @@ export default function DashboardAgentRunLogsPage() {
{item.handoffReason}
</div>
) : null}
{item.recommendedAction ? (
<div className="line-clamp-1 text-xs text-muted-foreground">
{item.recommendedAction}
{item.riskLevel ? ` / ${item.riskLevel} risk` : ""}
{item.ticketDraftReady ? " / 草稿已就绪" : ""}
</div>
) : null}
</div>
) : (
"-"
@@ -529,6 +536,9 @@ export default function DashboardAgentRunLogsPage() {
`plannedSkillCode: ${activeLog.plannedSkillCode || "-"}`,
`plannedSkillName: ${activeLog.plannedSkillName || "-"}`,
`graphToolCode: ${activeLog.graphToolCode || "-"}`,
`recommendedAction: ${activeLog.recommendedAction || "-"}`,
`riskLevel: ${activeLog.riskLevel || "-"}`,
`ticketDraftReady: ${activeLog.ticketDraftReady ? "true" : "false"}`,
`plannedToolCode: ${activeLog.plannedToolCode || "-"}`,
`planReason: ${activeLog.planReason || "-"}`,
`handoffReason: ${activeLog.handoffReason || "-"}`,
+3
View File
@@ -399,6 +399,9 @@ export type AgentRunLog = {
toolSearchTrace: string
graphToolTrace: string
graphToolCode: string
recommendedAction: string
riskLevel: string
ticketDraftReady: boolean
handoffReason: string
plannedToolCode: string
planReason: string