fix: 归并异步工具状态卡片
- 统一异步阶段事件的稳定任务标识 - 保留原始工具调用 ID 供事件关联 - 将提交、轮询和结果状态更新到同一审批卡片
This commit is contained in:
@@ -1493,6 +1493,7 @@ public class AgentRunService {
|
||||
payload.put("toolCallId", toolCallId);
|
||||
}
|
||||
if (Boolean.TRUE.equals(event.getMetadata().get("asyncTool"))) {
|
||||
putIfPresent(payload, "sourceToolCallId", toolCallId);
|
||||
enrichAsyncToolPayload(payload, event.getMetadata(), toolCallId);
|
||||
String taskId = stringValue(payload, "taskId");
|
||||
if (taskId != null && !taskId.isBlank()) {
|
||||
@@ -1528,10 +1529,12 @@ public class AgentRunService {
|
||||
private Map<String, Object> buildAsyncToolEventPayload(AgentRuntimeEvent event) {
|
||||
Map<String, Object> payload = new LinkedHashMap<>(event.getPayload() == null ? Map.of() : event.getPayload());
|
||||
String taskId = stringValue(payload, "taskId");
|
||||
String toolCallId = firstText(taskId, event.getToolCallId());
|
||||
String sourceToolCallId = event.getToolCallId();
|
||||
String toolCallId = firstText(taskId, sourceToolCallId);
|
||||
if (toolCallId != null && !toolCallId.isBlank()) {
|
||||
payload.put("toolCallId", toolCallId);
|
||||
}
|
||||
putIfPresent(payload, "sourceToolCallId", sourceToolCallId);
|
||||
enrichAsyncToolPayload(payload, event.getMetadata(), toolCallId);
|
||||
return payload;
|
||||
}
|
||||
@@ -1540,8 +1543,8 @@ public class AgentRunService {
|
||||
Map<String, Object> safeMetadata = metadata == null ? Map.of() : metadata;
|
||||
payload.put("asyncTool", true);
|
||||
putIfPresent(payload, "asyncToolName", firstText(stringValue(payload, "asyncToolName"), stringValue(safeMetadata, "asyncToolName")));
|
||||
putIfPresent(payload, "phase", firstText(stringValue(payload, "phase"), stringValue(safeMetadata, "asyncToolPhase")));
|
||||
putIfPresent(payload, "taskId", firstText(stringValue(payload, "taskId"), stringValue(safeMetadata, "taskId")));
|
||||
putIfPresent(payload, "phase", firstText(stringValue(safeMetadata, "asyncToolPhase"), stringValue(payload, "phase")));
|
||||
putIfPresent(payload, "taskId", resolveAsyncTaskId(payload, safeMetadata));
|
||||
putIfPresent(payload, "status", firstText(stringValue(payload, "status"), stringValue(safeMetadata, "status")));
|
||||
String displayName = firstText(stringValue(payload, "toolDisplayName"),
|
||||
firstText(stringValue(safeMetadata, "toolDisplayName"), stringValue(payload, "asyncToolName")));
|
||||
@@ -1553,6 +1556,22 @@ public class AgentRunService {
|
||||
payload.put("label", asyncToolLabel(stringValue(payload, "status"), stringValue(payload, "phase"), displayName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 从异步事件载荷、结果元数据或阶段调用入参中解析稳定任务 ID。
|
||||
*
|
||||
* @param payload 事件载荷
|
||||
* @param metadata 事件元数据
|
||||
* @return 异步任务 ID;不存在时返回 null
|
||||
*/
|
||||
private String resolveAsyncTaskId(Map<String, Object> payload, Map<String, Object> metadata) {
|
||||
String taskId = firstText(stringValue(payload, "taskId"), stringValue(metadata, "taskId"));
|
||||
if (taskId != null && !taskId.isBlank()) {
|
||||
return taskId;
|
||||
}
|
||||
Map<String, Object> input = mapPayload(firstNonNull(payload.get("input"), payload.get("toolInput")));
|
||||
return firstText(stringValue(input, "taskId"), stringValue(input, "task_id"));
|
||||
}
|
||||
|
||||
private String asyncToolLabel(String status, String phase, String displayName) {
|
||||
String name = displayName == null || displayName.isBlank() ? "异步工具" : displayName;
|
||||
if ("SUCCEEDED".equalsIgnoreCase(status)) {
|
||||
|
||||
Reference in New Issue
Block a user