Ë
    uPêj§@  ã            
       óÊ  — U d Z ddlZddl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mZ ddlmZ ddlmZ dd	lmZmZ  ed
g¬«      Zeed<   dedefd„Zdededdfd„Zdededefd„Zd„ Zej?                  d ee«      ge¬«       ee«      fdede	defd„«       Z ejC                  d ee«      ge¬«       ee«      fdede	defd„«       Z"ejC                  d ee«      ge¬«       ee«      fdede#de	defd„«       Z$ejK                  d ee«      ge¬«       ee«      fdede#de	defd„«       Z&ejC                  d ee«      ge¬«       ee«      fdede#de	defd„«       Z'y) aD  
Google AI Studio Managed Agents API Proxy Endpoints.

Exposes Gemini's /v1beta/agents surface through the LiteLLM proxy so that
user curl commands transfer 1-to-1 by swapping the host + auth header.

Routes:
  POST   /v1beta/agents                     -> acreate_agent
  GET    /v1beta/agents                     -> alist_agents
  GET    /v1beta/agents/{name}              -> aget_agent
  DELETE /v1beta/agents/{name}              -> adelete_agent
  GET    /v1beta/agents/{name}/versions     -> alist_agent_versions

These are distinct from the A2A agent registry at /v1/agents.
é    N)ÚFinal)Ú	APIRouterÚDependsÚHTTPExceptionÚRequestÚResponseÚstatus)ÚORJSONResponse)ÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)ÚProxyBaseLLMRequestProcessing)Ú_read_request_bodyÚ_safe_get_request_query_paramszgemini managed agents)ÚtagsÚrouterÚuser_api_key_dictÚreturnc                 óŽ   — | j                   t        j                  k(  xs' | j                   t        j                  j                  k(  S )N)Ú	user_roler   ÚPROXY_ADMINÚvalue)r   s    út/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/google_endpoints/agents_endpoints.pyÚ_is_proxy_adminr   "   s=   € à×#Ñ#Ô'7×'CÑ'CÑCò 	MØ×&Ñ&Ô*:×*FÑ*F×*LÑ*LÑLðó    Údatac                 ót   — t        |«      ry| j                  d«      ryt        t        j                  d¬«      ‚)uË  
    SECURITY: refuse to use the proxy's shared GOOGLE_API_KEY / GEMINI_API_KEY
    env fallback for non-admin callers on Gemini managed-agent CRUD endpoints.

    These endpoints are part of ``llm_api_routes`` so any authenticated LLM key
    can reach them, but unlike ``/v1beta/models/...:generateContent`` they are
    *not* routed through ``model_list`` â€” the only credential source is either
    the per-request ``litellm_params_template`` or the env var fallback. Without
    this guard, any ordinary proxy user could list, create, or delete managed
    agents inside the operator's Gemini project using the operator's key.

    Proxy admins (master key) keep the env-fallback convenience for ops use.
    NÚapi_keyzÑGemini managed-agent endpoints require a caller-supplied Gemini api_key (via 'litellm_params_template'). Falling back to the proxy's GOOGLE_API_KEY / GEMINI_API_KEY env vars is only permitted for proxy admins.)Ústatus_codeÚdetail)r   Úgetr   r	   ÚHTTP_401_UNAUTHORIZED)r   r   s     r   Ú%_enforce_caller_supplied_provider_keyr#   )   s:   € ô" Ð(Ô)ØØ‡x�x�	ÔØÜ
Ü×0Ñ0ð*ôð r   Úrequestc                 óP  — t        |«      }|s| S |j                  d«      }|rb	 t        |t        «      rt	        j
                  |«      n|}t        |t        «      r*|j                  «       D ]  \  }}| j                  ||«       Œ | S # t        j                  t        f$ r i }Y ŒYw xY w)a  
    For GET/DELETE endpoints that cannot carry a JSON body, read a
    JSON-encoded ``litellm_params_template`` query parameter and merge its
    contents into *data*, without overwriting keys that are already present
    (e.g. path params like ``name`` or the fixed ``custom_llm_provider``).

    This mirrors the ``litellm_params_template`` handling in
    ``create_gemini_agent`` and is the supported way for multi-tenant
    callers to supply per-request credentials on non-POST endpoints:

    .. code-block:: bash

        curl "http://localhost:4000/v1beta/agents?litellm_params_template=%7B%22api_key%22%3A%22AIza...%22%7D" \
            -H "Authorization: Bearer sk-..."

    Credentials MUST NOT be passed as plain flat query parameters (e.g.
    ``?api_key=AIza...``) because URL query strings appear verbatim in
    web-server access logs, CDN edge logs, browser history, and Referer
    headers. Use the ``litellm_params_template`` JSON body field on POST
    requests, or the JSON-encoded query parameter above for GET/DELETE.
    Úlitellm_params_template)r   r!   Ú
isinstanceÚstrÚjsonÚloadsÚJSONDecodeErrorÚ
ValueErrorÚdictÚitemsÚ
setdefault)r   r$   Úquery_paramsÚraw_templateÚtemplateÚkeyr   s          r   Ú_merge_query_params_into_datar4   I   s¥   € ô, 9¸ÓA€LÙØˆà&×*Ñ*Ð+DÓE€LÙð	Ü3=¸lÌCÔ3P”t—z‘z ,Ô/ÐVbˆHô �h¤Ô%Ø&Ÿn™nÓ.ò ,‘
��UØ—‘  UÕ+ð,ð €Køô ×$Ñ$¤jÐ1ò 	ØŠHð	ús   ¤'B ÂB%Â$B%c                  ób   — ddl m} m}m}m}m}m}m}m}m	}m
}	m}
 t        | |||||||||	|
¬«      S )Nr   ©Úgeneral_settingsÚ
llm_routerÚproxy_configÚproxy_logging_objÚselect_data_generatorÚuser_api_baseÚuser_max_tokensÚ
user_modelÚuser_request_timeoutÚuser_temperatureÚversion)Úlitellm.proxy.proxy_serverr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r-   r6   s              r   Ú_proxy_server_importsrC   p   sF   € ÷÷ ÷ ñ ô Ø)ØØ!Ø+Ø3Ø#Ø'ØØ1Ø)Øôð r   z/v1beta/agents)ÚdependenciesÚresponse_classÚfastapi_responsec              ƒ   ó2  K  — t        «       }t        | ¬«      ƒ d{  –—† }|j                  dd«      xs i }t        |t        «      r"|j                  «       D ]  \  }}||vsŒ|||<   Œ |j                  dd«       t        ||«       t        |¬«      }	 |j                  | ||d|d   |d	   |d
   |d   |d   d|d   |d   |d   |d   |d   |d   ¬«      ƒ d{  –—† S 7 ŒÁ7 Œ# t        $ r)}	|j                  |	||d   |d   ¬«      ƒ d{  –—†7  ‚d}	~	ww xY w­w)a¾  
    Create a named custom agent on the Gemini side.

    Example:
    ```bash
    curl -X POST "http://localhost:4000/v1beta/agents" \
        -H "Authorization: Bearer sk-..." \
        -H "Content-Type: application/json" \
        -d '{
            "name": "my-custom-slides-agent",
            "base_agent": "waverunner",
            "instructions": "You are a helpful assistant that creates slides.",
            "base_environment": {
                "type": "remote",
                "sources": [
                    {"type": "gcs", "source": "gs://eap-templates/slides-skill",
                     "target": "/.agents/skills/slides-skill"}
                ]
            }
        }'
    ```
    )r$   Nr&   Úcustom_llm_providerÚgemini©r   Úacreate_agentr:   r8   r7   r9   r;   r>   r@   r?   r=   r<   rA   ©r$   rF   r   Ú
route_typer:   r8   r7   r9   r;   Úmodelr>   r@   r?   r=   r<   rA   ©Úer   r:   rA   )rC   r   Úpopr'   r-   r.   r/   r#   r   Úbase_process_llm_requestÚ	ExceptionÚ_handle_llm_api_exception)
r$   rF   r   Úsrvr   r&   r3   r   Ú	processorrP   s
             r   Úcreate_gemini_agentrW   Ž   su  è ø€ ô@ 'Ó(€CÜ*°7Ô;×;€Dà%)§X¡XÐ.GÈÓ%NÒ%TÐRTÐÜÐ)¬4Ô0Ø1×7Ñ7Ó9ò 	"‰JˆC�Ø˜$ŠØ!��S’	ð	"ð 	‡O�OÐ)¨8Ô4Ü)¨$Ð0AÔBä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø&Ø!Ð"5Ñ6Ø˜<Ñ(Ø Ð!3Ñ4Ø˜^Ñ,Ø"%Ð&=Ñ">ØØ˜<Ñ(Ø Ð!3Ñ4Ø!$Ð%;Ñ!<ØÐ 1Ñ2Ø˜oÑ.Ø˜	‘Nð! 8ó 
÷ 
ð 	
ð <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø!Ð"5Ñ6Ø˜	‘Nð	 8ó 
÷ 
ð 
ð 	
ûð
üsY   ‚DœC�ADÁ"1DÂAC" ÃC ÃC" ÃDÃ C" Ã"	DÃ+DÄ	DÄ
DÄDÄDc              ƒ   ór  K  — t        «       }ddi}t        || «       t        ||«       t        |¬«      }	 |j	                  | ||d|d   |d   |d   |d   |d	   d
|d   |d   |d   |d   |d   |d   ¬«      ƒ d
{  –—† S 7 Œ# t
        $ r)}|j                  |||d   |d   ¬«      ƒ d
{  –—†7  ‚d
}~ww xY w­w)uà  
    List all custom agents on the Gemini side.

    Pass per-request Gemini credentials via the JSON-encoded
    ``litellm_params_template`` query parameter. Flat query parameters
    (e.g. ``?api_key=AIza...``) are intentionally ignored â€” see
    ``_merge_query_params_into_data`` for the rationale.

    ```bash
    curl "http://localhost:4000/v1beta/agents?litellm_params_template=%7B%22api_key%22%3A%22AIza...%22%7D" \
        -H "Authorization: Bearer sk-..."
    ```
    rH   rI   rJ   Úalist_agentsr:   r8   r7   r9   r;   Nr>   r@   r?   r=   r<   rA   rL   rO   ©rC   r4   r#   r   rR   rS   rT   )r$   rF   r   rU   r   rV   rP   s          r   Úlist_gemini_agentsr[   Ö   s  è ø€ ô. 'Ó(€CØ.°Ð9€DÜ! $¨Ô0Ü)¨$Ð0AÔBä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø%Ø!Ð"5Ñ6Ø˜<Ñ(Ø Ð!3Ñ4Ø˜^Ñ,Ø"%Ð&=Ñ">ØØ˜<Ñ(Ø Ð!3Ñ4Ø!$Ð%;Ñ!<ØÐ 1Ñ2Ø˜oÑ.Ø˜	‘Nð! 8ó 
÷ 
ð 	
ð 
ùô$ ò 
Ø×7Ñ7ØØ/Ø!Ð"5Ñ6Ø˜	‘Nð	 8ó 
÷ 
ð 
ð 	
ûð
üsG   ‚3B7¶AB Á;B Á<B Á?B7Â B Â	B4ÂB/Â)B,Â*B/Â/B4Â4B7z/v1beta/agents/{name}Únamec              ƒ   ót  K  — t        «       }|ddœ}t        || «       t        ||«       t        |¬«      }	 |j	                  | ||d|d   |d   |d   |d   |d	   d
|d   |d   |d   |d   |d   |d   ¬«      ƒ d
{  –—† S 7 Œ# t
        $ r)}|j                  |||d   |d   ¬«      ƒ d
{  –—†7  ‚d
}~ww xY w­w)uñ  
    Get a specific custom agent by name.

    Pass per-request Gemini credentials via the JSON-encoded
    ``litellm_params_template`` query parameter. Flat query parameters
    (e.g. ``?api_key=AIza...``) are intentionally ignored â€” see
    ``_merge_query_params_into_data`` for the rationale.

    ```bash
    curl "http://localhost:4000/v1beta/agents/my-custom-slides-agent?litellm_params_template=%7B%22api_key%22%3A%22AIza...%22%7D" \
        -H "Authorization: Bearer sk-..."
    ```
    rI   ©r\   rH   rJ   Ú
aget_agentr:   r8   r7   r9   r;   Nr>   r@   r?   r=   r<   rA   rL   rO   rZ   ©r$   r\   rF   r   rU   r   rV   rP   s           r   Úget_gemini_agentra     s  è ø€ ô0 'Ó(€CØ¸ÑA€DÜ! $¨Ô0Ü)¨$Ð0AÔBä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø#Ø!Ð"5Ñ6Ø˜<Ñ(Ø Ð!3Ñ4Ø˜^Ñ,Ø"%Ð&=Ñ">ØØ˜<Ñ(Ø Ð!3Ñ4Ø!$Ð%;Ñ!<ØÐ 1Ñ2Ø˜oÑ.Ø˜	‘Nð! 8ó 
÷ 
ð 	
ð 
ùô$ ò 
Ø×7Ñ7ØØ/Ø!Ð"5Ñ6Ø˜	‘Nð	 8ó 
÷ 
ð 
ð 	
ûð
üóG   ‚4B8·AB Á<BÁ=B Â B8ÂB Â	B5ÂB0Â*B-Â+B0Â0B5Â5B8c              ƒ   ót  K  — t        «       }|ddœ}t        || «       t        ||«       t        |¬«      }	 |j	                  | ||d|d   |d   |d   |d   |d	   d
|d   |d   |d   |d   |d   |d   ¬«      ƒ d
{  –—† S 7 Œ# t
        $ r)}|j                  |||d   |d   ¬«      ƒ d
{  –—†7  ‚d
}~ww xY w­w)uõ  
    Delete a custom agent by name.

    Pass per-request Gemini credentials via the JSON-encoded
    ``litellm_params_template`` query parameter. Flat query parameters
    (e.g. ``?api_key=AIza...``) are intentionally ignored â€” see
    ``_merge_query_params_into_data`` for the rationale.

    ```bash
    curl -X DELETE "http://localhost:4000/v1beta/agents/my-custom-slides-agent?litellm_params_template=%7B%22api_key%22%3A%22AIza...%22%7D" \
        -H "Authorization: Bearer sk-..."
    ```
    rI   r^   rJ   Úadelete_agentr:   r8   r7   r9   r;   Nr>   r@   r?   r=   r<   rA   rL   rO   rZ   r`   s           r   Údelete_gemini_agentre   I  s  è ø€ ô0 'Ó(€CØ¸ÑA€DÜ! $¨Ô0Ü)¨$Ð0AÔBä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø&Ø!Ð"5Ñ6Ø˜<Ñ(Ø Ð!3Ñ4Ø˜^Ñ,Ø"%Ð&=Ñ">ØØ˜<Ñ(Ø Ð!3Ñ4Ø!$Ð%;Ñ!<ØÐ 1Ñ2Ø˜oÑ.Ø˜	‘Nð! 8ó 
÷ 
ð 	
ð 
ùô$ ò 
Ø×7Ñ7ØØ/Ø!Ð"5Ñ6Ø˜	‘Nð	 8ó 
÷ 
ð 
ð 	
ûð
ürb   z/v1beta/agents/{name}/versionsc              ƒ   ót  K  — t        «       }|ddœ}t        || «       t        ||«       t        |¬«      }	 |j	                  | ||d|d   |d   |d   |d   |d	   d
|d   |d   |d   |d   |d   |d   ¬«      ƒ d
{  –—† S 7 Œ# t
        $ r)}|j                  |||d   |d   ¬«      ƒ d
{  –—†7  ‚d
}~ww xY w­w)uö  
    List versions of a custom agent.

    Pass per-request Gemini credentials via the JSON-encoded
    ``litellm_params_template`` query parameter. Flat query parameters
    (e.g. ``?api_key=AIza...``) are intentionally ignored â€” see
    ``_merge_query_params_into_data`` for the rationale.

    ```bash
    curl "http://localhost:4000/v1beta/agents/my-custom-slides-agent/versions?litellm_params_template=%7B%22api_key%22%3A%22AIza...%22%7D" \
        -H "Authorization: Bearer sk-..."
    ```
    rI   r^   rJ   Úalist_agent_versionsr:   r8   r7   r9   r;   Nr>   r@   r?   r=   r<   rA   rL   rO   rZ   r`   s           r   Úlist_gemini_agent_versionsrh   ƒ  s  è ø€ ô0 'Ó(€CØ¸ÑA€DÜ! $¨Ô0Ü)¨$Ð0AÔBä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø-Ø!Ð"5Ñ6Ø˜<Ñ(Ø Ð!3Ñ4Ø˜^Ñ,Ø"%Ð&=Ñ">ØØ˜<Ñ(Ø Ð!3Ñ4Ø!$Ð%;Ñ!<ØÐ 1Ñ2Ø˜oÑ.Ø˜	‘Nð! 8ó 
÷ 
ð 	
ð 
ùô$ ò 
Ø×7Ñ7ØØ/Ø!Ð"5Ñ6Ø˜	‘Nð	 8ó 
÷ 
ð 
ð 	
ûð
ürb   )(Ú__doc__r)   Útypingr   Úfastapir   r   r   r   r   r	   Úfastapi.responsesr
   Úlitellm.proxy._typesr   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú'litellm.proxy.common_request_processingr   Ú-litellm.proxy.common_utils.http_parsing_utilsr   r   r   Ú__annotations__Úboolr   r-   r#   r4   rC   ÚpostrW   r!   r[   r(   ra   Údeletere   rh   © r   r   ú<module>rv      su  ðòó  Ý ç P× PÝ ,ç AÝ BÝ Q÷ñ
 Ð 7Ð8Ô9€ˆÓ 9ð ~ð ¸$ó ðØ
ðà%ðð 
óð@$¨ð $°wð $À4ó $òNð< ‡�ØÙÐ+Ó,Ð-Ø!ð ó ñ )0Ð0AÓ(Bñ@
Øð@
àð@
ð &ò@
óð
@
ðF ‡�ØÙÐ+Ó,Ð-Ø!ð ó ñ )0Ð0AÓ(Bñ1
Øð1
àð1
ð &ò1
óð
1
ðh ‡�ØÙÐ+Ó,Ð-Ø!ð ó ñ )0Ð0AÓ(Bñ	2
Øð2
à
ð2
ð ð2
ð &ò	2
óð
2
ðj ‡�ØÙÐ+Ó,Ð-Ø!ð ó ñ )0Ð0AÓ(Bñ	2
Øð2
à
ð2
ð ð2
ð &ò	2
óð
2
ðj ‡�Ø$ÙÐ+Ó,Ð-Ø!ð ó ñ )0Ð0AÓ(Bñ	2
Øð2
à
ð2
ð ð2
ð &ò	2
óñ
2
r   