
    k7i{                     v    S r SSKJr  SSKJr  SSKrSSKJr  SSKJ	r	  SSK
Jr  \	" \5      r " S	 S
5      rS
/rg)zHRequest director using openapi-core for stateless HTTP request building.    )Any)urljoinN)
SchemaPath)
get_logger   )	HTTPRoutec                       \ rS rSrSrS\4S jr SS\S\\	\
4   S\	S\R                  4S	 jjrS\S\\	\
4   S\\\	\
4   \\	\
4   \\	\
4   \
4   4S
 jrS\	S\\	\
4   S\	S\	4S jrSrg)RequestDirector   zMBuilds httpx.Request objects from HTTPRoute and arguments using openapi-core.specc                     Xl         g)z+Initialize with a parsed SchemaPath object.N_spec)selfr   s     i/home/james-whalen/.local/lib/python3.13/site-packages/fastmcp/experimental/utilities/openapi/director.py__init__RequestDirector.__init__   s    
    route	flat_argsbase_urlreturnc           
      p   [         R                  SUR                   SUR                   SU 35        U R	                  X5      u  pEpg[         R                  SU SU SU SU 35        U R                  UR                  XC5      nUR                  R                  5       UU(       a  UOSU(       a  UOSS	.n	Ub%  [        U[        [        -  5      (       a  XyS
'   OXyS'   [        R                  " U	S   U	S   U	R                  S5      U	R                  S5      U	R                  S
5      U	R                  S5      S9$ )aA  
Constructs a final httpx.Request object, handling all OpenAPI serialization.

Args:
    route: HTTPRoute containing OpenAPI operation details
    flat_args: Flattened arguments from LLM (may include suffixed parameters)
    base_url: Base URL for the request

Returns:
    httpx.Request: Properly formatted HTTP request
zBuilding request for  z with args: zUnflattened - path: z	, query: z, headers: z, body: N)methodurlparamsheadersjsoncontentr   r   r   r   )r   r   r   r   r   r    )loggerdebugr   path_unflatten_arguments
_build_urlupper
isinstancedictlisthttpxRequestget)
r   r   r   r   path_paramsquery_paramsheader_paramsbodyr   request_datas
             r   buildRequestDirector.build   s;   " 	#ELL>5::,l9+V	

 :>9R9R:
6= 	";-ykR_Q``himhno	

 ooejj+@ ll((*&2l(5}4	
 $t,,'+V$*.Y' }})U###H- $$Y/!!&) $$Y/
 	
r   c                    0 n0 n0 n0 n[        US5      (       a  UR                  (       a  UR                  5        H  u  pxUc  M
  XqR                  ;  a'  [        R	                  SU SUR
                   35        M@  UR                  U   n	U	S   n
U	S   nU
S:X  a  XU'   Me  U
S:X  a  XU'   Mq  U
S	:X  a  XU'   M}  U
S
:X  a  XU'   M  [        R	                  SU
 SU 35        M     O[        R                  S5        0 nUR                   H  nUR                  XR                  '   M     UR                  5        H  u  pxUc  M
  SU;   a<  UR                  SS5      u  pU
S;   a"  U
S:X  a  XU'   OU
S:X  a  XU'   O
U
S	:X  a  XU'   ML  X|;   a*  X   n
U
S:X  a  XU'   Ma  U
S:X  a  XU'   Mm  U
S	:X  a  XU'   My  M{  XU'   M     SnU(       a  UR                  (       a  UR                  R                  (       a  [        [        UR                  R                  5      5      nUR                  R                  U   nUR                  S5      S:X  a  UnO7[!        U5      S:X  a#  [        [        UR#                  5       5      5      nOUnOUnX4X_4$ )a  
Maps flat arguments back to their OpenAPI locations using the parameter map.

Args:
    route: HTTPRoute with parameter_map containing location mappings
    flat_args: Flat arguments from LLM call

Returns:
    Tuple of (path_params, query_params, header_params, body)
parameter_mapNz
Argument 'z!' not found in parameter map for locationopenapi_namer#   queryheaderr0   zUnknown parameter location 'z' for z2No parameter map available, using fallback mapping__r   )r#   r8   r9   typeobject)hasattrr5   itemsr!   warningoperation_idr"   
parametersr6   namersplitrequest_bodycontent_schemanextiterr,   lenvalues)r   r   r   r-   r.   r/   
body_propsarg_namevaluemappingr6   r7   param_locationsparam	base_namer0   content_typebody_schemas                     r   r$   $RequestDirector._unflatten_argumentsQ   s    
 5/**u/B/B#,??#4=#6#66NN$XJ.OPUPbPbOcd --h7":.&~6v%05-(16.)27,/'/4|,NN6xjxjQ/ $58 LLMN !O)).3nn

+ * $-??#4= 8#*2//$*B'I#>>#v-5:	2%06;3%17<)4  ..8H6)05H-!W,16X.!X-27h/ . ,1x(7 $5< !!e&8&8&G&G#D););)J)J$KL#00??M??6*h6%D_)  Z%6%6%8 9:D &D!-==r   path_templater-   c                     UnUR                  5        H-  u  pVSU S3nXt;   d  M  UR                  U[        U5      5      nM/     [        UR	                  S5      S-   UR                  S5      5      $ )a  
Build URL by substituting path parameters in the template.

Args:
    path_template: OpenAPI path template (e.g., "/users/{id}")
    path_params: Path parameter values
    base_url: Base URL to prepend

Returns:
    Complete URL with path parameters substituted
{}/)r>   replacestrr   rstriplstrip)r   rT   r-   r   url_path
param_nameparam_valueplaceholders           r   r%   RequestDirector._build_url   sp     !'2'8'8':#Jzl"-K&#++K[9IJ (; xs+c18??33GHHr   r   N)zhttp://localhost)__name__
__module____qualname____firstlineno____doc__r   r   r   r(   rZ   r   r*   r+   r2   tupler$   r%   __static_attributes__ r   r   r
   r
      s    WZ  +	8
8
 S>8
 	8

 
8
tj>j>+/S>j>	tCH~tCH~tCH~sB	Cj>XI I/3CH~IILI	Ir   r
   )rf   typingr   urllib.parser   r*   jsonschema_pathr   fastmcp.utilities.loggingr   modelsr   rb   r!   r
   __all__ri   r   r   <module>rp      s=    N     & 0 	H	CI CIN 
r   