feat: multi-round-trip request implementation (SEP-2322) (#950)
### Context
Design (`design/mrtr.md`) and implementation proposal for Multi
Round-Trip Requests (MRTR) per
[SEP-2322](de6d76fba3/seps/2322-MRTR.md).
### Changes
- Introduce `InputRequest` and `InputResponse` sealed interfaces with
corresponding `InputRequestMap` and `InputResponseMap` types for custom
map JSON codec implementation.
- Extend `CallToolParams`, `GetPromptParams`, and `ReadResourceParams`
with `InputResponses`, `RequestState` and an unexported `resultType`
("complete" or "input_required") for retry round-trips. The type is set
by the SDK based on input requests presence.
- Add client-side MRTR middleware enabled by default that automatically
fulfills input requests and retries.
- Added MRTROptions on ClientOptions to allow disabling the middleware
and configuring the number of retries.
- Add server-side MRTR middleware for backward compatibility:
transparently bridges input requests to direct
Elicit/CreateMessage/ListRoots calls for older clients
This commit is contained in:
parent
2d47cc9664
commit
189a85ad92
1 changed files with 1587 additions and 23 deletions
|
|
@ -769,6 +769,12 @@ func req(id int64, method string, params any) *jsonrpc.Request {
|
|||
return r
|
||||
}
|
||||
|
||||
func completeCallToolResult() *CallToolResult {
|
||||
r := &CallToolResult{Content: []Content{}}
|
||||
r.resultType = resultTypeComplete
|
||||
return r
|
||||
}
|
||||
|
||||
func resp(id int64, result any, err error) *jsonrpc.Response {
|
||||
return &jsonrpc.Response{
|
||||
ID: jsonrpc2.Int64ID(id),
|
||||
|
|
@ -1947,7 +1953,7 @@ func TestStreamableMcpHeaderValidation(t *testing.T) {
|
|||
},
|
||||
messages: []jsonrpc.Message{req(2, "tools/call", &CallToolParams{Meta: testMeta, Name: "my-tool"})},
|
||||
wantStatusCode: http.StatusOK,
|
||||
wantMessages: []jsonrpc.Message{resp(2, &CallToolResult{Content: []Content{}}, nil)},
|
||||
wantMessages: []jsonrpc.Message{resp(2, completeCallToolResult(), nil)},
|
||||
},
|
||||
{
|
||||
method: "POST",
|
||||
|
|
@ -1991,7 +1997,7 @@ func TestStreamableMcpHeaderValidation(t *testing.T) {
|
|||
},
|
||||
messages: []jsonrpc.Message{req(6, "tools/call", &CallToolParams{Meta: testMeta, Name: "my-tool"})},
|
||||
wantStatusCode: http.StatusOK,
|
||||
wantMessages: []jsonrpc.Message{resp(6, &CallToolResult{Content: []Content{}}, nil)},
|
||||
wantMessages: []jsonrpc.Message{resp(6, completeCallToolResult(), nil)},
|
||||
},
|
||||
{
|
||||
method: "POST",
|
||||
|
|
@ -2007,7 +2013,7 @@ func TestStreamableMcpHeaderValidation(t *testing.T) {
|
|||
Arguments: map[string]any{"region": "us-west1", "query": "SELECT 1"},
|
||||
})},
|
||||
wantStatusCode: http.StatusOK,
|
||||
wantMessages: []jsonrpc.Message{resp(7, &CallToolResult{Content: []Content{}}, nil)},
|
||||
wantMessages: []jsonrpc.Message{resp(7, completeCallToolResult(), nil)},
|
||||
},
|
||||
{
|
||||
method: "POST",
|
||||
|
|
|
|||
Loading…
Reference in a new issue