handleMessageSend 处理 message/send 方法
(ctx context.Context, agentID string, req *JSONRPCRequest)
| 92 | |
| 93 | // handleMessageSend 处理 message/send 方法 |
| 94 | func (s *Server) handleMessageSend(ctx context.Context, agentID string, req *JSONRPCRequest) *JSONRPCResponse { |
| 95 | // 解析参数 |
| 96 | var params MessageSendParams |
| 97 | if err := parseParams(req.Params, ¶ms); err != nil { |
| 98 | return NewErrorResponse(req.ID, ErrorCodeInvalidParams, err.Error(), nil) |
| 99 | } |
| 100 | |
| 101 | // 获取或创建 Task |
| 102 | taskID := params.Message.TaskID |
| 103 | if taskID == "" { |
| 104 | taskID = generateID() |
| 105 | } |
| 106 | |
| 107 | task, err := s.loadOrCreateTask(agentID, taskID, params.ContextID, params.Metadata) |
| 108 | if err != nil { |
| 109 | return NewErrorResponse(req.ID, ErrorCodeInternalError, err.Error(), nil) |
| 110 | } |
| 111 | |
| 112 | // 添加用户消息到历史 |
| 113 | task.AddMessage(params.Message) |
| 114 | |
| 115 | // 更新状态为 working |
| 116 | task.UpdateStatus(TaskStateWorking, nil) |
| 117 | if err := s.taskStore.Save(agentID, task); err != nil { |
| 118 | return NewErrorResponse(req.ID, ErrorCodeInternalError, err.Error(), nil) |
| 119 | } |
| 120 | |
| 121 | // 通过 Actor 系统发送消息 |
| 122 | pid, exists := s.actorSystem.GetActor(agentID) |
| 123 | if !exists { |
| 124 | task.UpdateStatus(TaskStateFailed, &Message{ |
| 125 | MessageID: generateID(), |
| 126 | Role: "agent", |
| 127 | Parts: []Part{{Kind: "text", Text: "agent not found: " + agentID}}, |
| 128 | Kind: "message", |
| 129 | }) |
| 130 | if err := s.taskStore.Save(agentID, task); err != nil { |
| 131 | a2aLog.Warn(ctx, "save task error", map[string]any{"error": err}) |
| 132 | } |
| 133 | return NewErrorResponse(req.ID, ErrorCodeInternalError, "agent not found: "+agentID, nil) |
| 134 | } |
| 135 | |
| 136 | // 提取文本内容 |
| 137 | text := extractText(params.Message.Parts) |
| 138 | |
| 139 | // 发送到 Agent Actor |
| 140 | result, err := pid.Request(&agent.ChatMsg{ |
| 141 | Text: text, |
| 142 | Ctx: ctx, |
| 143 | ReplyTo: nil, |
| 144 | }, 30*time.Second) |
| 145 | |
| 146 | if err != nil { |
| 147 | // 失败 |
| 148 | task.UpdateStatus(TaskStateFailed, &Message{ |
| 149 | MessageID: generateID(), |
| 150 | Role: "agent", |
| 151 | Parts: []Part{{Kind: "text", Text: fmt.Sprintf("agent error: %v", err)}}, |
no test coverage detected