o
    ưi%                     @   s   d Z ddlmZmZmZmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ erWddlmZ eZ neZ G dd deZ!dS )a  
Google AI Studio Interactions API configuration.

Per OpenAPI spec (https://ai.google.dev/static/api/interactions.openapi.json):
- Create: POST https://generativelanguage.googleapis.com/{api_version}/interactions
- Get: GET https://generativelanguage.googleapis.com/{api_version}/interactions/{interaction_id}
- Delete: DELETE https://generativelanguage.googleapis.com/{api_version}/interactions/{interaction_id}

This is a thin wrapper - no transformation needed since we follow the spec directly.
    )TYPE_CHECKINGAnyDictListOptionalTupleN)verbose_logger)process_response_headers)BaseInteractionsAPIConfig)GeminiErrorGeminiModelInfo)CancelInteractionResultDeleteInteractionResultInteractionInput$InteractionsAPIOptionalRequestParamsInteractionsAPIResponse InteractionsAPIStreamingResponse)GenericLiteLLMParams)LlmProviders)Loggingc                   @   s  e Zd ZdZedefddZedefddZdede	e fdd	Z
d
ededee defddZ			d,dee dee dee dee dee defddZdee dee dee deded
edefddZdee dejdedefddZdee dededefddZdededed
edeeef f
d d!Zdejdedefd"d#Zdededed
edeeef f
d$d%Zdejdedede fd&d'Z!dededed
edeeef f
d(d)Z"dejdede#fd*d+Z$dS )- GoogleAIStudioInteractionsConfigz
    Configuration for Google AI Studio Interactions API.
    
    Minimal config - we follow the OpenAPI spec directly with no transformation.
    returnc                 C   s   t jS )N)r   ZGEMINIself r   f/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/gemini/interactions/transformation.pycustom_llm_provider.   s   z4GoogleAIStudioInteractionsConfig.custom_llm_providerc                 C   s   dS )NZv1betar   r   r   r   r   api_version2   s   z,GoogleAIStudioInteractionsConfig.api_versionmodelc                 C   s   g dS )z.Per OpenAPI spec CreateModelInteractionParams.)r   agentinputtoolssystem_instructiongeneration_configstreamstore
backgroundresponse_modalitiesresponse_formatresponse_mime_typeprevious_interaction_idr   )r   r   r   r   r   get_supported_params6   s   z5GoogleAIStudioInteractionsConfig.get_supported_paramsheaderslitellm_paramsc                 C   s   |pi }d|d< |S )z;Google AI Studio uses API key in query params, not headers.zapplication/jsonzContent-Typer   )r   r,   r   r-   r   r   r   validate_environment?   s   z5GoogleAIStudioInteractionsConfig.validate_environmentNapi_baser   r$   c                 C   sZ   |pi }t |}t |d}|stdd| }|r"|d7 }| d| j d| S )z POST /{api_version}/interactionsapi_keyzVGoogle API key is required. Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable.zkey=z&alt=sse/z/interactions?)r   get_api_baseget_api_keyget
ValueErrorr   )r   r/   r   r   r-   r$   r0   Zquery_paramsr   r   r   get_complete_urlJ   s   	

z1GoogleAIStudioInteractionsConfig.get_complete_urlr    optional_paramsc           
      C   sr   i }|rt |p
||d< n|r||d< ntd|dur!||d< g d}|D ]}	||	dur6||	 ||	< q'|S )zO
        Build request body per OpenAPI spec - minimal transformation.
        r   r   z*Either 'model' or 'agent' must be providedNr    )
r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   )r   Zget_base_modelr5   r4   )
r   r   r   r    r7   r-   r,   request_bodyoptional_keyskeyr   r   r   transform_requestb   s   
z2GoogleAIStudioInteractionsConfig.transform_requestraw_responselogging_objc                 C   s   z|j |jdi id | }W n ty#   t|j|jt|jdw t	d| t
di |}t|j|jd< tt|j|jd< |S )	z6Parse response - it already matches our response type.Zcomplete_input_dict)original_responseZadditional_argsmessagestatus_coder,   z#Google AI Interactions response: %sr,   Zadditional_headersNr   )Z	post_calltextjson	Exceptionr   rA   dictr,   r   debugr   _hidden_paramsr	   )r   r   r<   r=   raw_jsonresponser   r   r   transform_response   s$   z3GoogleAIStudioInteractionsConfig.transform_responseparsed_chunkc                 C   s   t d| tdi |S )zParse streaming chunk.z*Google AI Interactions streaming chunk: %sNr   )r   rF   r   )r   r   rK   r=   r   r   r   transform_streaming_response   s   z=GoogleAIStudioInteractionsConfig.transform_streaming_responseinteraction_idc                 C   B   t |}t |j}|std| d| j d| d| i fS )z0GET /{api_version}/interactions/{interaction_id}Google API key is requiredr1   /interactions/?key=r   r2   r3   r0   r5   r   r   rM   r/   r-   r,   Zresolved_api_baser0   r   r   r   !transform_get_interaction_request   
   
 zBGoogleAIStudioInteractionsConfig.transform_get_interaction_requestc                 C   sV   z|  }W n ty   t|j|jt|jdw tdi |}t|j|jd< |S )Nr?   r,   r   )	rC   rD   r   rB   rA   rE   r,   r   rG   )r   r<   r=   rH   rI   r   r   r   "transform_get_interaction_response   s   zCGoogleAIStudioInteractionsConfig.transform_get_interaction_responsec                 C   rN   )z3DELETE /{api_version}/interactions/{interaction_id}rO   r1   rP   rQ   rR   rS   r   r   r   $transform_delete_interaction_request   rU   zEGoogleAIStudioInteractionsConfig.transform_delete_interaction_requestc                 C   s>   d|j   krdk rn ntd|dS t|j|j t|jd)N   i,  T)successidr?   )rA   r   r   rB   rE   r,   )r   r<   r=   rM   r   r   r   %transform_delete_interaction_response   s   zFGoogleAIStudioInteractionsConfig.transform_delete_interaction_responsec                 C   rN   )zGPOST /{api_version}/interactions/{interaction_id}:cancel (if supported)rO   r1   rP   z:cancel?key=rR   rS   r   r   r   $transform_cancel_interaction_request   rU   zEGoogleAIStudioInteractionsConfig.transform_cancel_interaction_requestc                 C   sB   z|  }W n ty   t|j|jt|jdw tdi |S )Nr?   r   )rC   rD   r   rB   rA   rE   r,   r   )r   r<   r=   rH   r   r   r   %transform_cancel_interaction_response   s   zFGoogleAIStudioInteractionsConfig.transform_cancel_interaction_response)NNN)%__name__
__module____qualname____doc__propertyr   r   strr   r   r+   rE   r   r   r.   boolr6   r   r   r   r;   httpxResponseLiteLLMLoggingObjr   rJ   r   rL   r   rT   rV   rW   r   r[   r\   r   r]   r   r   r   r   r   '   s    	


&









r   )"ra   typingr   r   r   r   r   r   re   Zlitellm._loggingr   Z'litellm.litellm_core_utils.core_helpersr	   Z1litellm.llms.base_llm.interactions.transformationr
   Z litellm.llms.gemini.common_utilsr   r   Zlitellm.types.interactionsr   r   r   r   r   r   Zlitellm.types.routerr   Zlitellm.types.utilsr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjrg   r   r   r   r   r   <module>   s      