
    Ki                     v    d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	 ddl
mZ  e	e      Z G d	 d
      Zd
gZy)zHRequest director using openapi-core for stateless HTTP request building.    )Any)urljoinN)
SchemaPath)
get_logger   )	HTTPRoutec                       e Zd ZdZdefdZ	 ddedeee	f   dede
j                  fdZdedeee	f   deeee	f   eee	f   eee	f   e	f   fd	Zd
edeee	f   dedefdZy)RequestDirectorzMBuilds httpx.Request objects from HTTPRoute and arguments using openapi-core.specc                     || _         y)z+Initialize with a parsed SchemaPath object.N)_spec)selfr   s     n/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/utilities/openapi/director.py__init__zRequestDirector.__init__   s	    
    route	flat_argsbase_urlreturnc           
         t         j                  d|j                   d|j                   d|        | j	                  ||      \  }}}}t         j                  d| d| d| d|        | j                  |j                  ||      }|j                  j                         }	|r|nd}
|r|nd}d}d}|t        |t        t        z        r|}n|}t        j                  |	||
|||	      S )
a  
        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content)loggerdebugr   path_unflatten_arguments
_build_urlupper
isinstancedictlisthttpxRequest)r   r   r   r   path_paramsquery_paramsheader_paramsbodyr   r   r   r   	json_bodyr   s                 r   buildzRequestDirector.build   s
   " 	#ELL>5::,l9+V	

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

 ooejj+x@ ll((*!-4#0-d7;	&* $t, 	 }}
 	
r   c                    i }i }i }i }t        |d      r|j                  r|j                         D ]  \  }}|	||j                  vr&t        j	                  d| d|j
                          =|j                  |   }	|	d   }
|	d   }|
dk(  r|||<   a|
dk(  r|||<   l|
d	k(  r|||<   w|
d
k(  r|||<   t        j	                  d|
 d|         nt        j                  d       i }|j                  D ]  }|j                  ||j                  <    |j                         D ]v  \  }}|	d|v r:|j                  dd      \  }}
|
dv r!|
dk(  r|||<   n|
dk(  r|||<   n
|
d	k(  r|||<   G||v r'||   }
|
dk(  r|||<   [|
dk(  r|||<   f|
d	k(  sl|||<   r|||<   x d}|r|j                  r|j                  j                  rt        t        |j                  j                              }|j                  j                  |   }|j                  d      dk(  r|}n6t!        |      dk(  r#t        t        |j#                                     }n|}n|}||||fS )aF  
        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headerr,   zUnknown parameter location 'z' for z2No parameter map available, using fallback mapping__r   )r    r3   r4   typeobject)hasattrr0   itemsr   warningoperation_idr   
parametersr1   namersplitrequest_bodycontent_schemanextitergetlenvalues)r   r   r   r)   r*   r+   
body_propsarg_namevaluemappingr1   r2   param_locationsparam	base_namer,   content_typebody_schemas                     r   r!   z$RequestDirector._unflatten_argumentsP   s    
 5/*u/B/B#,??#4 %=5#6#66NN$XJ.OPUPbPbOcd --h7":.&~6v%05K-(16L.)27M,/'/4J|,NN6xjxjQ/8 LLMN !O)) =.3nn

+= $-??#4 1%= 8#*2//$*B'Ix#>>#v-5:K	2%06;L3%17<M)4  ..x8H6)05H-!W,16X.!X-27h/ ,1Jx(71< !!e&8&8&G&G#D););)J)J$KL#00??M??6*h6%D_)  Z%6%6%8 9:D &D!L-==r   path_templater)   c                     |}|j                         D ]+  \  }}d| d}||v s|j                  |t        |            }- t        |j	                  d      dz   |j                  d            S )aG  
        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
        {}/)r9   replacestrr   rstriplstrip)r   rO   r)   r   url_path
param_nameparam_valueplaceholders           r   r"   zRequestDirector._build_url   s{     !'2'8'8': 	K#Jzl"-Kh&#++K[9IJ	K xs+c18??33GHHr   N)zhttp://localhost)__name__
__module____qualname____doc__r   r   r   r%   rU   r   r'   r(   r.   tupler!   r"    r   r   r
   r
      s    WZ  +	7
7
 S>7
 	7

 
7
r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
   )r_   typingr   urllib.parser   r'   jsonschema_pathr   fastmcp.utilities.loggingr   modelsr   r\   r   r
   __all__ra   r   r   <module>rh      s=    N     & 0 	H	BI BIL 
r   