o
    i                     @   sh   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
 d
Zd
gZdS )zHRequest director using openapi-core for stateless HTTP request building.    )Any)urljoinN)
SchemaPath)
get_logger   )	HTTPRoutec                   @   s   e Zd ZdZdefddZ	ddedeee	f ded	e
jfd
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dZdedeee	f ded	efddZdS )RequestDirectorzMBuilds httpx.Request objects from HTTPRoute and arguments using openapi-core.specc                 C   s
   || _ dS )z+Initialize with a parsed SchemaPath object.N)_spec)selfr	    r   u/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/experimental/utilities/openapi/director.py__init__   s   
zRequestDirector.__init__http://localhostroute	flat_argsbase_urlreturnc              
   C   s   t d|j d|j d|  | ||\}}}}t d| d| d| d|  | |j||}|j }	|r<|nd}
|rB|nd}d}d}|durXt|tt	B rV|}n|}t
j|	||
|||d	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   r   r   r   build   s6   
zRequestDirector.buildc                 C   sD  i }i }i }i }t |drm|jrm| D ]W\}}|du rq||jvr/td| d|j  q|j| }	|	d }
|	d }|
dkrE|||< q|
dkrN|||< q|
d	krW|||< q|
d
kr`|||< qtd|
 d|  qnstd i }|jD ]}|j||j	< qw| D ][\}}|du rqd|v r|
dd\}}
|
dv r|
dkr|||< n|
dkr|||< n|
d	kr|||< q||v r|| }
|
dkr|||< q|
dkr|||< q|
d	kr|||< q|||< qd}|r|jr|jjrtt|jj}|jj| }|ddkr|}nt|dkrtt| }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   r/   r0   typeobject)hasattrr,   itemsr   warningoperation_idr   
parametersr-   namersplitrequest_bodycontent_schemanextitergetlenvalues)r   r   r   r&   r'   r(   
body_propsarg_namevaluemappingr-   r.   param_locationsparam	base_namer)   content_typebody_schemar   r   r   r   P   s   












z$RequestDirector._unflatten_argumentspath_templater&   c                 C   sT   |}|  D ]\}}d| d}||v r||t|}qt|dd |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
        {}/)r5   replacestrr   rstriplstrip)r   rK   r&   r   url_path
param_nameparam_valueplaceholderr   r   r   r      s   zRequestDirector._build_urlN)r   )__name__
__module____qualname____doc__r   r   r   r"   rP   r   r$   r%   r+   tupler   r   r   r   r   r   r      s:    

9
&
l
r   )rZ   typingr   urllib.parser   r$   jsonschema_pathr   fastmcp.utilities.loggingr   modelsr   rW   r   r   __all__r   r   r   r   <module>   s     
G