o
    ưi^@                     @   s  d dl m Z  d dlmZmZmZmZmZ d dlmZm	Z	 d dl
Z
d dlmZ d dlT d dlmZmZ d dlmZ d d	lmZ d d
lmZ edgdZejdeegdejdeegdeefdedededefddZejdeegdejdeegdeefdedededefddZejdeegedejdeegeddedefddZejdeeged gd!ejd"eeged gd!eefdededefd#d$Zejd%eeged gd!ejd&eeged gd!eefded'ededefd(d)Zej d%eeged gd!ej d&eeged gd!eefded'ededefd*d+Z!ejd,eeged gd!ejd-eeged gd!eefded'ededefd.d/Z"dS )0    )datetime)	APIRouterDependsHTTPExceptionRequestResponse)ORJSONResponseStreamingResponseN)uuid)*)UserAPIKeyAuthuser_api_key_auth)ProxyBaseLLMRequestProcessing_read_request_body)TokenCountDetailsResponsezgoogle genai endpoints)tagsz0/v1beta/models/{model_name:path}:generateContent)dependenciesz)/models/{model_name:path}:generateContentrequest
model_namefastapi_responseuser_api_key_dictc                    s   ddl m} ddlm}m}m}m} t| dI d H }	d|	vr#||	d< |	dd }
|
r/|
|	d< ||	| ||||dI d H }	| j	
d	tt |	d
< tjjddtj t d|	\}}	||	d< |d u rktddd|jdi |	I d H }|S )Nr   add_litellm_data_to_requestgeneral_settings
llm_routerproxy_configversionr   modelgenerationConfigconfigdatar   r   r   r   r   x-litellm-call-idlitellm_call_idagenerate_contentZoriginal_functionZ	rules_obj
start_timelitellm_logging_obj  Router not initializedstatus_codedetail )$litellm.proxy.litellm_pre_call_utilsr   litellm.proxy.proxy_serverr   r   r   r   r   popheadersgetstrr
   uuid4litellmutilsfunction_setupRulesr   nowr   r'   r   r   r   r   r   r   r   r   r   r$   Zgeneration_configZlogging_objresponser0   r0   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/google_endpoints/endpoints.pygoogle_generate_content   s@   

r@   z6/v1beta/models/{model_name:path}:streamGenerateContentz//models/{model_name:path}:streamGenerateContentc                    s  ddl m} ddlm}m}m}m} t| dI d H }	d|	vr#||	d< d|	d< |	dd }
|
r3|
|	d	< ||	| ||||d
I d H }	| j	
dtt |	d< tjjddtj t d|	\}}	||	d< |d u rotddd|jdi |	I d H }|d urt|drt|ddS |S )Nr   r   r   r   r    Tstreamr!   r"   r#   r%   r&   agenerate_content_streamr(   r*   r+   r,   r-   	__aiter__ztext/event-stream)content
media_typer0   )r1   r   r2   r   r   r   r   r   r3   r4   r5   r6   r
   r7   r8   r9   r:   r;   r   r<   r   rB   hasattrr	   r=   r0   r0   r?   google_stream_generate_contentO   sF   

rG   z,/v1beta/models/{model_name:path}:countTokens)r   Zresponse_modelz%/models/{model_name:path}:countTokensc                    s   ddl m} ddlm} ddlm} || dI dH }|dg }ddlm} | 	||d	g }||||d
}	||	ddI dH }
|
durd|
j
pJi }|r[t|dd|dg dS t|
jp`dg dS tdg dS )z
    ```json
    return {
        "totalTokens": 31,
        "totalBillableCharacters": 96,
        "promptTokensDetails": [
            {
            "modality": "TEXT",
            "tokenCount": 31
            }
        ]
    }
    ```
    r   )GoogleGenAIAdapterr   )token_counterr   Ncontents)TokenCountRequestmessages)r    rJ   rL   T)r   Zcall_endpointtotalTokenspromptTokensDetails)rM   rN   )Z,litellm.google_genai.adapters.transformationrH   -litellm.proxy.common_utils.http_parsing_utilsr   r2   rI   r5   litellm.proxy._typesrK   Z(translate_generate_content_to_completionoriginal_responser   Ztotal_tokens)r   r   rH   r   Zinternal_token_counterr$   rJ   rK   rL   Ztoken_requestZtoken_responserQ   r0   r0   r?   google_count_tokens   sF   


rR   z/v1beta/interactionsZinteractions)r   response_classr   z/interactionsc              
      sH  ddl m}m}m}m}m}m}m}	m}
m	}m
}m} t| dI dH }d|vr+d|d< t|d}z[|jdi d| d	|d
|ddd|d|d|d|d|d|dps|dd|
d|d|d|	d|d|I dH W S d|
d|d|d|	d|d|I dH W S  ty } z|j||||dI dH d}~ww )a  
    Create a new interaction using Google's Interactions API.
    
    Per OpenAPI spec: POST /{api_version}/interactions
    
    Supports both model interactions and agent interactions:
    - Model: Provide `model` parameter (e.g., "gemini-2.5-flash")
    - Agent: Provide `agent` parameter (e.g., "deep-research-pro-preview-12-2025")
    
    Example:
    ```bash
    curl -X POST "http://localhost:4000/v1beta/interactions"         -H "Authorization: Bearer sk-1234"         -H "Content-Type: application/json"         -d '{
            "model": "gemini/gemini-2.5-flash",
            "input": "Hello, how are you?"
        }'
    ```
    r   r   r   r   proxy_logging_objselect_data_generatoruser_api_baseuser_max_tokens
user_modeluser_request_timeoutuser_temperaturer   r   Ncustom_llm_providergeminir$   r   r   r   
route_typeZacreate_interactionrU   r   r   r   rV   r    ZagentrY   r[   rZ   rX   rW   r   er   rU   r   r0   )r2   r   r   r   rU   rV   rW   rX   rY   rZ   r[   r   r   r   base_process_llm_requestr5   	Exception_handle_llm_api_exception)r   r   r   r   r   r   rU   rV   rW   rX   rY   rZ   r[   r   r$   	processorra   r0   r0   r?   create_interaction   s~   4%

	

rf   z%/v1beta/interactions/{interaction_id}z/interactions/{interaction_id}interaction_idc              
         ddl m}m}m}m}m}m}	m}
m}m	}m
}m} |dd}t|d}z:|jdi d| d|d|d	d
d|d|d|d|d|ddd|d|d|d|
d|	d|I dH W S  tyw } z|j||||dI dH d}~ww )zk
    Get an interaction by ID.

    Per OpenAPI spec: GET /{api_version}/interactions/{interaction_id}
    r   rT   r]   rg   r\   r^   r   r   r   r_   Zaget_interactionrU   r   r   r   rV   r    NrY   r[   rZ   rX   rW   r   r`   r0   r2   r   r   r   rU   rV   rW   rX   rY   rZ   r[   r   r   rb   rc   rd   r   rg   r   r   r   r   r   rU   rV   rW   rX   rY   rZ   r[   r   r$   re   ra   r0   r0   r?   get_interaction9  ^   4


	
rl   c              
      rh   )zq
    Delete an interaction by ID.

    Per OpenAPI spec: DELETE /{api_version}/interactions/{interaction_id}
    r   rT   r]   ri   r^   r   r   r   r_   Zadelete_interactionrU   r   r   r   rV   r    NrY   r[   rZ   rX   rW   r   r`   r0   rj   rk   r0   r0   r?   delete_interaction}  rm   rn   z,/v1beta/interactions/{interaction_id}/cancelz%/interactions/{interaction_id}/cancelc              
      rh   )zv
    Cancel an interaction by ID.

    Per OpenAPI spec: POST /{api_version}/interactions/{interaction_id}:cancel
    r   rT   r]   ri   r^   r   r   r   r_   Zacancel_interactionrU   r   r   r   rV   r    NrY   r[   rZ   rX   rW   r   r`   r0   rj   rk   r0   r0   r?   cancel_interaction  rm   ro   )#r   Zfastapir   r   r   r   r   Zfastapi.responsesr   r	   r8   Zlitellm._uuidr
   rP   Z$litellm.proxy.auth.user_api_key_authr   r   Z'litellm.proxy.common_request_processingr   rO   r   Zlitellm.types.llms.vertex_air   Zrouterpostr6   r@   rG   rR   rf   r5   rl   deletern   ro   r0   r0   r0   r?   <module>   s$   4;G	J
8
8
