Elicit sends an elicitation request to the client asking for user input.
(ctx context.Context, params *ElicitParams)
| 1237 | |
| 1238 | // Elicit sends an elicitation request to the client asking for user input. |
| 1239 | func (ss *ServerSession) Elicit(ctx context.Context, params *ElicitParams) (*ElicitResult, error) { |
| 1240 | if err := ss.checkInitialized(methodElicit); err != nil { |
| 1241 | return nil, err |
| 1242 | } |
| 1243 | if params == nil { |
| 1244 | return nil, fmt.Errorf("%w: params cannot be nil", jsonrpc2.ErrInvalidParams) |
| 1245 | } |
| 1246 | |
| 1247 | if params.Mode == "" { |
| 1248 | params2 := *params |
| 1249 | if params.URL != "" || params.ElicitationID != "" { |
| 1250 | params2.Mode = "url" |
| 1251 | } else { |
| 1252 | params2.Mode = "form" |
| 1253 | } |
| 1254 | params = ¶ms2 |
| 1255 | } |
| 1256 | |
| 1257 | if iparams := ss.InitializeParams(); iparams == nil || iparams.Capabilities == nil || iparams.Capabilities.Elicitation == nil { |
| 1258 | return nil, fmt.Errorf("client does not support elicitation") |
| 1259 | } |
| 1260 | caps := ss.InitializeParams().Capabilities.Elicitation |
| 1261 | switch params.Mode { |
| 1262 | case "form": |
| 1263 | if caps.Form == nil && caps.URL != nil { |
| 1264 | // Note: if both 'Form' and 'URL' are nil, we assume the client supports |
| 1265 | // form elicitation for backward compatibility. |
| 1266 | return nil, errors.New(`client does not support "form" elicitation`) |
| 1267 | } |
| 1268 | case "url": |
| 1269 | if caps.URL == nil { |
| 1270 | return nil, errors.New(`client does not support "url" elicitation`) |
| 1271 | } |
| 1272 | } |
| 1273 | |
| 1274 | res, err := handleSend[*ElicitResult](ctx, methodElicit, newServerRequest(ss, orZero[Params](params))) |
| 1275 | if err != nil { |
| 1276 | return nil, err |
| 1277 | } |
| 1278 | |
| 1279 | if res.Action != "accept" { |
| 1280 | return res, nil |
| 1281 | } |
| 1282 | |
| 1283 | if params.RequestedSchema == nil { |
| 1284 | return res, nil |
| 1285 | } |
| 1286 | schema, err := validateElicitSchema(params.RequestedSchema) |
| 1287 | if err != nil { |
| 1288 | return nil, err |
| 1289 | } |
| 1290 | if schema == nil { |
| 1291 | return res, nil |
| 1292 | } |
| 1293 | |
| 1294 | resolved, err := schema.Resolve(nil) |
| 1295 | if err != nil { |
| 1296 | return nil, err |