@@ -212,75 +212,82 @@ async def get_elicitation( # noqa: PLR0911
212212 """
213213 try :
214214 # Handle URL mode elicitation (OAuth, credentials, payments)
215- if isinstance (params , types .ElicitRequestURLParams ):
216- msg = "URL elicitation request"
217- elicit_id = params .elicitationId
218- logger .info (msg , message = params .message , url = params .url , elicitation_id = elicit_id )
219- tool_call_id = f"elicit_url_{ elicit_id } "
220- title = f"URL Authorization: { params .message } "
221- url_options = [
222- PermissionOption (option_id = "accept" , name = "Open URL" , kind = "allow_once" ),
223- PermissionOption (option_id = "decline" , name = "Decline" , kind = "reject_once" ),
224- ]
225- response = await self .session .requests .request_permission (
226- tool_call_id = tool_call_id ,
227- title = title ,
228- options = url_options ,
229- )
230- match response .outcome :
231- case AllowedOutcome (option_id = "accept" ):
232- webbrowser .open (params .url )
233- return types .ElicitResult (action = "accept" )
234- case AllowedOutcome ():
235- return types .ElicitResult (action = "decline" )
236- case DeniedOutcome ():
237- return types .ElicitResult (action = "cancel" )
238- case _ as unreachable :
239- assert_never (unreachable ) # ty:ignore[type-assertion-failure]
240-
241- # Form mode elicitation
242- schema = params .requestedSchema
243- logger .info ("Elicitation request" , message = params .message , schema = schema )
244- tool_call_id = f"elicit_{ hash (params .message )} "
245- title = f"Elicitation: { params .message } "
246-
247- if _is_boolean_schema (schema ):
248- options : list [PermissionOption ] | None = _create_boolean_elicitation_options ()
249- response = await self .session .requests .request_permission (
250- tool_call_id = tool_call_id ,
251- title = title ,
252- options = options ,
253- )
254- return self ._handle_boolean_elicitation_response (response , schema )
255- if _is_enum_schema (schema ) and (options := _create_enum_elicitation_options (schema )):
256- response = await self .session .requests .request_permission (
257- tool_call_id = tool_call_id ,
258- title = title ,
259- options = options ,
260- )
261- return _handle_enum_elicitation_response (response , schema )
262-
263- options = [
264- PermissionOption (option_id = "accept" , name = "Accept" , kind = "allow_once" ),
265- PermissionOption (option_id = "decline" , name = "Decline" , kind = "reject_once" ),
266- ]
267- response = await self .session .requests .request_permission (
268- tool_call_id = tool_call_id ,
269- title = title ,
270- options = options ,
271- )
272-
273- # Convert permission response to elicitation result
274- match response .outcome :
275- case AllowedOutcome (option_id = "accept" ):
276- # For non-boolean schemas, return empty content
277- return types .ElicitResult (action = "accept" , content = {})
278- case AllowedOutcome ():
279- return types .ElicitResult (action = "decline" )
280- case DeniedOutcome ():
281- return types .ElicitResult (action = "cancel" )
215+ match params :
216+ case types .ElicitRequestURLParams (
217+ elicitationId = elicit_id ,
218+ message = message ,
219+ url = url ,
220+ ):
221+ msg = "URL elicitation request"
222+ logger .info (msg , message = message , url = url , elicitation_id = elicit_id )
223+ tool_call_id = f"elicit_url_{ elicit_id } "
224+ title = f"URL Authorization: { message } "
225+ url_options = [
226+ PermissionOption (option_id = "accept" , name = "Open URL" , kind = "allow_once" ),
227+ PermissionOption (option_id = "decline" , name = "Decline" , kind = "reject_once" ),
228+ ]
229+ response = await self .session .requests .request_permission (
230+ tool_call_id = tool_call_id ,
231+ title = title ,
232+ options = url_options ,
233+ )
234+ match response .outcome :
235+ case AllowedOutcome (option_id = "accept" ):
236+ webbrowser .open (params .url )
237+ return types .ElicitResult (action = "accept" )
238+ case AllowedOutcome ():
239+ return types .ElicitResult (action = "decline" )
240+ case DeniedOutcome ():
241+ return types .ElicitResult (action = "cancel" )
242+ case _ as unreachable :
243+ assert_never (unreachable )
244+ case types .ElicitRequestFormParams (requestedSchema = schema , message = message ):
245+ logger .info ("Elicitation request" , message = message , schema = schema )
246+ tool_call_id = f"elicit_{ hash (message )} "
247+ title = f"Elicitation: { message } "
248+ if _is_boolean_schema (schema ):
249+ options : list [PermissionOption ] | None = (
250+ _create_boolean_elicitation_options ()
251+ )
252+ response = await self .session .requests .request_permission (
253+ tool_call_id = tool_call_id ,
254+ title = title ,
255+ options = options ,
256+ )
257+ return self ._handle_boolean_elicitation_response (response , schema )
258+ if _is_enum_schema (schema ) and (
259+ options := _create_enum_elicitation_options (schema )
260+ ):
261+ response = await self .session .requests .request_permission (
262+ tool_call_id = tool_call_id ,
263+ title = title ,
264+ options = options ,
265+ )
266+ return _handle_enum_elicitation_response (response , schema )
267+
268+ options = [
269+ PermissionOption (option_id = "accept" , name = "Accept" , kind = "allow_once" ),
270+ PermissionOption (option_id = "decline" , name = "Decline" , kind = "reject_once" ),
271+ ]
272+ response = await self .session .requests .request_permission (
273+ tool_call_id = tool_call_id ,
274+ title = title ,
275+ options = options ,
276+ )
277+
278+ # Convert permission response to elicitation result
279+ match response .outcome :
280+ case AllowedOutcome (option_id = "accept" ):
281+ # For non-boolean schemas, return empty content
282+ return types .ElicitResult (action = "accept" , content = {})
283+ case AllowedOutcome ():
284+ return types .ElicitResult (action = "decline" )
285+ case DeniedOutcome ():
286+ return types .ElicitResult (action = "cancel" )
287+ case _ as unreachable :
288+ assert_never (unreachable )
282289 case _ as unreachable :
283- assert_never (unreachable ) # ty:ignore[type-assertion-failure]
290+ assert_never (unreachable )
284291
285292 except Exception as e :
286293 logger .exception ("Failed to handle elicitation" )
0 commit comments