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
|
|
@ -58,13 +58,17 @@ func NewClient(impl *Implementation, options *ClientOptions) *Client {
|
|||
opts.Logger = ensureLogger(nil)
|
||||
}
|
||||
|
||||
return &Client{
|
||||
c := &Client{
|
||||
impl: impl,
|
||||
opts: opts,
|
||||
roots: newFeatureSet(func(r *Root) string { return r.URI }),
|
||||
sendingMethodHandler_: defaultSendingMethodHandler,
|
||||
receivingMethodHandler_: defaultReceivingMethodHandler[*ClientSession],
|
||||
}
|
||||
if opts.MultiRoundTrip == nil || !opts.MultiRoundTrip.Disabled {
|
||||
c.AddSendingMiddleware(clientMultiRoundTripMiddleware())
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
// ClientOptions configures the behavior of the client.
|
||||
|
|
@ -154,6 +158,10 @@ type ClientOptions struct {
|
|||
ResourceUpdatedHandler func(context.Context, *ResourceUpdatedNotificationRequest)
|
||||
LoggingMessageHandler func(context.Context, *LoggingMessageRequest)
|
||||
ProgressNotificationHandler func(context.Context, *ProgressNotificationClientRequest)
|
||||
// MultiRoundTrip configures the automatic MultiRoundTrip (Multi Round-Trip Requests) middleware.
|
||||
// By default (nil), the middleware is enabled with default settings.
|
||||
// Set Disabled to true to opt out of automatic MultiRoundTrip handling.
|
||||
MultiRoundTrip *MultiRoundTripOptions
|
||||
// If non-zero, defines an interval for regular "ping" requests.
|
||||
// If the peer fails to respond to pings originating from the keepalive check,
|
||||
// the session is automatically closed.
|
||||
|
|
|
|||
Loading…
Reference in a new issue