HandleBatchJSONRPC 处理批量 JSON-RPC 2.0 请求 POST /a2a/{agentId}/batch
(c *gin.Context)
| 135 | // HandleBatchJSONRPC 处理批量 JSON-RPC 2.0 请求 |
| 136 | // POST /a2a/{agentId}/batch |
| 137 | func (h *Handler) HandleBatchJSONRPC(c *gin.Context) { |
| 138 | ctx := c.Request.Context() |
| 139 | agentID := c.Param("agentId") |
| 140 | |
| 141 | if agentID == "" { |
| 142 | c.JSON(http.StatusBadRequest, gin.H{ |
| 143 | "success": false, |
| 144 | "error": gin.H{ |
| 145 | "code": "bad_request", |
| 146 | "message": "Missing agentId parameter", |
| 147 | }, |
| 148 | }) |
| 149 | return |
| 150 | } |
| 151 | |
| 152 | // 解析批量请求 |
| 153 | var requests []JSONRPCRequest |
| 154 | if err := c.ShouldBindJSON(&requests); err != nil { |
| 155 | c.JSON(http.StatusBadRequest, &JSONRPCResponse{ |
| 156 | JSONRPC: "2.0", |
| 157 | ID: nil, |
| 158 | Error: &RPCError{ |
| 159 | Code: -32700, // Parse error |
| 160 | Message: "Invalid JSON was received", |
| 161 | Data: err.Error(), |
| 162 | }, |
| 163 | }) |
| 164 | return |
| 165 | } |
| 166 | |
| 167 | if len(requests) == 0 { |
| 168 | c.JSON(http.StatusBadRequest, &JSONRPCResponse{ |
| 169 | JSONRPC: "2.0", |
| 170 | ID: nil, |
| 171 | Error: &RPCError{ |
| 172 | Code: -32600, // Invalid Request |
| 173 | Message: "Empty batch request", |
| 174 | }, |
| 175 | }) |
| 176 | return |
| 177 | } |
| 178 | |
| 179 | logging.Info(ctx, "a2a.batch_jsonrpc_request", map[string]any{ |
| 180 | "agent_id": agentID, |
| 181 | "count": len(requests), |
| 182 | }) |
| 183 | |
| 184 | // 处理每个请求 |
| 185 | responses := make([]*JSONRPCResponse, 0, len(requests)) |
| 186 | for _, req := range requests { |
| 187 | if req.JSONRPC != "2.0" { |
| 188 | responses = append(responses, &JSONRPCResponse{ |
| 189 | JSONRPC: "2.0", |
| 190 | ID: req.ID, |
| 191 | Error: &RPCError{ |
| 192 | Code: -32600, |
| 193 | Message: "Invalid JSON-RPC version, must be '2.0'", |
| 194 | }, |
nothing calls this directly
no test coverage detected