Ë
    uPêj–)  ã                   ón   — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
Z
ddlmZ  G d„ de«      Zy)z+
GDC Gemini chat completion transformation
é    N)ÚAnyÚFinal)Úurlsplit)ÚOpenAILikeChatConfigc                   ó:  ‡ — e Zd ZU dZeed<   dZee   ed<    e	j                  d«      Zee	j                  e      ed<   dedd	fˆ fd
„Zdedefˆ fd„Zdededed	z  fd„Zdededed	z  fd„Zdedededed	z  fd„Zdedededefd„Z	 d(ded	z  ded	z  dedededed	z  defd„Zd)dedededeez  fd„Zdedeez  dd	fd„Zd(d ed!edeez  ded	z  def
d"„Zdedeeef   fd#„Z	 	 d*d$eded%ee   dededed	z  ded	z  defd&„Zded%ee   deded$edefˆ fd'„Zˆ xZS )+ÚGDCGeminiConfigTÚsupports_vertex_paramsÚgdch_service_accountÚ_GDCH_CREDENTIAL_TYPEz^[a-zA-Z0-9_-]+$Ú_PATH_ID_PATTERNÚkwargsÚreturnNc                 ód   •— t        ‰| �  di |¤Ž t        j                  «       | _        i | _        y )N© )ÚsuperÚ__init__Ú	threadingÚLockÚ_creds_lockÚ_gdch_creds_cache)Úselfr   Ú	__class__s     €úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gdc/chat/transformation.pyr   zGDCGeminiConfig.__init__   s*   ø€ Ü‰ÑÑ"˜6Ò"Ü$Ÿ>™>Ó+ˆÔØ')ˆÕó    Úmodelc                 ó,   •— ddgt         ‰| �  |«      z   S )NÚvertex_projectÚvertex_location)r   Úget_supported_openai_params)r   r   r   s     €r   r   z+GDCGeminiConfig.get_supported_openai_params   s'   ø€ àØð
ô ‰GÑ/°Ó6ñ7ð 	7r   Úoptional_paramsÚlitellm_paramsc                 ó¼   — |j                  d«      xsJ |j                  d«      xs7 t        t        dd «      xs$ |j                  d«      xs |j                  d«      S )Nr   Úvertex_ai_project©ÚgetÚgetattrÚlitellm©r   r    r!   s      r   Ú_resolve_projectz GDCGeminiConfig._resolve_project    sh   € à×ÑÐ/Ó0ò 8Ø×!Ñ!Ð"5Ó6ò8ä”wÐ 0°$Ó7ò8ð ×"Ñ"Ð#3Ó4ò8ð ×"Ñ"Ð#6Ó7ð	
r   c                 ó¼   — |j                  d«      xsJ |j                  d«      xs7 t        t        dd «      xs$ |j                  d«      xs |j                  d«      S )Nr   Úvertex_ai_locationr$   r(   s      r   Ú_resolve_locationz!GDCGeminiConfig._resolve_location)   sh   € à×ÑÐ0Ó1ò 9Ø×!Ñ!Ð"6Ó7ò9ä”wÐ 1°4Ó8ò9ð ×"Ñ"Ð#4Ó5ò9ð ×"Ñ"Ð#7Ó8ð	
r   Úapi_basec                 óx   — t        j                  d|«      }|r|j                  d«      S | j                  ||«      S )Nz/v1/projects/([^/]+)é   )ÚreÚsearchÚgroupr)   )r   r-   r    r!   Úmatchs        r   Ú_effective_projectz"GDCGeminiConfig._effective_project2   s7   € Ü—y‘yÐ!8¸(ÓCˆÙØ—;‘;˜q“>Ð!Ø×$Ñ$ _°nÓEÐEr   ÚvalueÚfieldc                 ó†   — | j                   j                  |«      s%t        j                  j	                  |› d�d|¬«      ‚|S )NzG must be a plain identifier of letters, digits, hyphens or underscores.Úgdc©ÚmessageÚllm_providerr   )r   r3   r'   ÚutilsÚAuthenticationError)r   r5   r6   r   s       r   Ú_validate_path_idz!GDCGeminiConfig._validate_path_id8   sJ   € Ø×$Ñ$×*Ñ*¨5Ô1Ü—-‘-×3Ñ3Ø ˜'Ð!hÐiØ"Øð 4ó ð ð
 ˆr   Úapi_keyÚstreamc                 ó*  — |xs" t         j                  xs t         j                  }|s"t         j                  j	                  dd|¬«      ‚|j                  d«      sd|› �}|j                  d«      }d|v r|S | j                  ||«      }|s"t         j                  j	                  dd|¬«      ‚| j                  ||«      }|s"t         j                  j	                  d	d|¬«      ‚| j                  |d
|«      }| j                  |d|«      }|› d|› d|› d�S )NúCapi_base/host is required for GDC Gemini. Please set it or pass it.r8   r9   Úhttpúhttps://ú/z/v1/projects/ú?project is required for GDC Gemini. Please pass vertex_project.zAlocation is required for GDC Gemini. Please pass vertex_location.r   r   z/locations/z/chat/completions)
r'   Úgdc_api_baser-   r<   r=   Ú
startswithÚrstripr)   r,   r>   )	r   r-   r?   r   r    r!   r@   ÚprojectÚlocations	            r   Úget_complete_urlz GDCGeminiConfig.get_complete_urlA   s:  € ð ÒGœw×3Ñ3ÒG´w×7GÑ7GˆÙÜ—-‘-×3Ñ3Ø]Ø"Øð 4ó ð ð ×"Ñ" 6Ô*Ø! ( Ð,ˆHà—?‘? 3Ó'ˆà˜hÑ&ØˆOà×'Ñ'¨¸ÓHˆáÜ—-‘-×3Ñ3ØYØ"Øð 4ó ð ð ×)Ñ)¨/¸>ÓJˆáÜ—-‘-×3Ñ3Ø[Ø"Øð 4ó ð ð ×(Ñ(¨Ð2BÀEÓJˆØ×)Ñ)¨(Ð4EÀuÓMˆà�˜=¨¨	°¸X¸JÐFWÐXÐXr   ÚvalÚenv_varÚdefaultc                 óª   — dt         dt        t         z  fd„}|�t        |t         «      r ||«      S |S t        j                  |«      }|€|S  ||«      S )NÚsr   c                 óV   — | j                  «       j                  «       }|dv ry|dv ry| S )N)ÚfalseÚ0ÚnoÚoffF)ÚtrueÚ1ÚyesÚonT)ÚstripÚlower)rQ   Úcleaneds     r   Ú_parsez.GDCGeminiConfig._read_env_bool.<locals>._parser   s1   € ØŸW™W›YŸ_™_Ó.ˆGØÐ5Ñ5ØØÐ4Ñ4ØØˆHr   )ÚstrÚboolÚ
isinstanceÚosÚgetenv)r   rM   rN   rO   r^   Ú_env_vals         r   Ú_read_env_boolzGDCGeminiConfig._read_env_boolq   s]   € ð	”cð 	œd¤S™jó 	ð ˆ?Ü˜#œsÔ#Ù˜c“{Ð"ØˆJäŸ)™) GÓ,ˆØÐØˆNÙ�hÓÐr   Ú
gdch_credsÚ
ssl_verifyc                 óŒ   — dd l }ddlm } |j                  «       }||_        |j	                  |¬«      }|j                  |«       y )Nr   )Úrequests)Úsession)ri   Úgoogle.auth.transportÚSessionÚverifyÚRequestÚrefresh)r   rf   rg   ri   Úauth_requestsÚauth_sessionÚauth_requests          r   Ú_fetch_authzGDCGeminiConfig._fetch_auth„   s?   € ÛÝCà&×.Ñ.Ó0ˆØ(ˆÔØ+×3Ñ3¸LÐ3ÓIˆØ×Ñ˜<Õ(r   ÚcredsÚaudiencec                 ó   — |j                  d«      |xs t        t        |«      «      f}| j                  5  || j                  vr-|j                  |j                  d«      «      | j                  |<   | j                  |   }t        |dd«      rt        |dd «      s| j                  ||«       |j                  }d d d «       |S # 1 sw Y   S xY w)NrE   ÚvalidFÚtoken)	rI   r_   Úidr   r   Úwith_gdch_audiencer&   rs   rx   )r   rt   ru   rg   r?   Ú	cache_keyrf   rx   s           r   Ú_cached_fetch_tokenz#GDCGeminiConfig._cached_fetch_token�   sÀ   € à$ŸO™O¨CÓ0°'Ò2K¼SÄÀEÃ»^ÐLˆ	à×Ññ 		,Ø × 6Ñ 6Ñ6Ø49×4LÑ4LÈXÏ_É_Ð]`ÓMaÓ4b�×&Ñ& yÑ1à $× 6Ñ 6°yÑ AˆJä˜: w°Ô6¼gÀjÐRYÐ[_Ô>`Ø× Ñ  ¨ZÔ8à%×+Ñ+ˆE÷		,ð ˆ÷		,ð ˆús   ¶BCÃCc                 ó  — dd l }	 t        j                  |«      }t	        |t
        «      r|j                  d«      | j                  k7  rt        d«      ‚|j                  j                  |«      \  }}|dfS # t        j                  $ r Y yw xY w)Nr   )NFÚtypezêGDC only accepts a GDCH service account credential as a JSON api_key (expected "type": "gdch_service_account"). Other Google credential types are rejected so their token or external-account endpoints cannot drive server-side requests.T)Úgoogle.authÚjsonÚloadsÚJSONDecodeErrorra   Údictr%   r   Ú
ValueErrorÚauthÚload_credentials_from_dict)r   r?   ÚgoogleÚjson_objrt   Ú_s         r   Ú_load_creds_from_keyz$GDCGeminiConfig._load_creds_from_keyž   s‹   € Ûð	Ü"Ÿj™j¨Ó1ˆHô ˜(¤DÔ)¨X¯\©\¸&Ó-AÀT×E_ÑE_Ò-_Üðkóð ð
 —;‘;×9Ñ9¸(ÓC‰ˆˆqØ�dˆ{Ðøô ×#Ñ#ò 	Ùð	ús   †A6 Á6BÂBÚheadersÚmessagesc                 ó°  — dd l }|xs" t        j                  xs t        j                  }|s"t        j                  j                  dd|¬«      ‚|s"t        j                  j                  dd|¬«      ‚| j                  |||«      }	|	s"t        j                  j                  dd|¬«      ‚| j                  |	d|«      }	t        |j                  d«      r|nd	|› �«      }
|
j                  › d
|
j                  › �}	 | j                  |«      \  }}|�’| j)                  |j+                  d«      dd¬«      }| j)                  |j+                  d«      dd¬«      r| j-                  ||||«      }n/|j/                  |«      }| j1                  ||«       |j2                  }d|› �|d<   d|vr
|sd|› �|d<   d|vr	d|vrd|d<   t5        d„ |D «       «      }|D ]  }|j7                  |d «       Œ d|	› �|d<   |S # |j                  j                  j                  t         t"        t$        t&        f$ r+}t        j                  j                  d|› �d|¬«      |‚d }~ww xY w)Nr   rB   r8   r9   zdapi_key is required for GDC Gemini. Please pass your service account string or token as the api_key.rF   r   rC   rD   z://z9Failed to load service account credentials from api_key: rg   Ú
SSL_VERIFYT)rO   Úgdc_token_cachingÚGDC_TOKEN_CACHINGFzBearer ÚAuthorizationzcontent-typezContent-Typezapplication/jsonc              3   óH   K  — | ]  }|j                  «       d k(  sŒ|–— Œ y­w)úx-goog-user-projectN)r\   )Ú.0Úhs     r   ú	<genexpr>z7GDCGeminiConfig.validate_environment.<locals>.<genexpr>õ   s   è ø€ Ò*d°ÀÇÁÃÐNcÓAc¬1Ñ*dùs   ‚"›"z	projects/r“   )Úgoogle.auth.exceptionsr'   rG   r-   r<   r=   r4   r>   r   rH   ÚschemeÚnetlocrŠ   r…   Ú
exceptionsÚGoogleAuthErrorr„   Ú	TypeErrorÚKeyErrorÚAttributeErrorre   r%   r|   rz   rs   rx   ÚtupleÚpop)r   r‹   r   rŒ   r    r!   r?   r-   r‡   rJ   Ú_audience_partsru   rt   Úis_service_accountÚerg   rx   rf   Ústale_quota_headersÚstales                       r   Úvalidate_environmentz$GDCGeminiConfig.validate_environment®   s«  € ó 	&àÒGœw×3Ñ3ÒG´w×7GÑ7GˆÙÜ—-‘-×3Ñ3Ø]Ø"Øð 4ó ð ñ Ü—-‘-×3Ñ3Ø~Ø"Øð 4ó ð ð ×)Ñ)¨(°OÀ^ÓTˆÙÜ—-‘-×3Ñ3ØYØ"Øð 4ó ð ð
 ×(Ñ(¨Ð2BÀEÓJˆä!)°h×6IÑ6IÈ&Ô6Q©(ÐYaÐbjÐakÐWlÓ!mˆØ,×3Ñ3Ð4°C¸×8NÑ8NÐ7OÐPˆð	Ø(,×(AÑ(AÀ'Ó(JÑ%ˆEÐ%ð ÐØ $× 3Ñ 3°N×4FÑ4FÀ|Ó4TÐVbÐlpÐ 3Ó qˆJØ×"Ñ" >×#5Ñ#5Ð6IÓ#JÐL_ÐinÐ"ÔoØ×0Ñ0°¸À*ÈgÓV‘à$)×$<Ñ$<¸XÓ$F�
Ø× Ñ  ¨ZÔ8Ø"×(Ñ(�Ø)0°°Ð'8ˆG�OÑ$à 'Ñ)Ñ2DØ)0°°	Ð':ˆG�OÑ$ð  Ñ(¨^À7Ñ-JØ&8ˆG�NÑ#ä%*Ñ*d°gÔ*dÓ%dÐØ(ò 	%ˆEØ�K‰K˜˜tÕ$ð	%à+4°W°IÐ)>ˆÐ%Ñ&àˆøðE �K‰K×"Ñ"×2Ñ2ÜÜÜÜð
ò 	ô —-‘-×3Ñ3ØSÐTUÐSVÐWØ"Øð 4ó ð ð	ûð	ús   Ã:G2 Ç28IÈ*&IÉIc                 ó®   •— |j                  d«      r|j                  dd«      d   }t        ‰| �  |||||¬«      }dD ]  }|j	                  |d«       Œ |S )z<
        Transforms the request to the GDC provider
        zgdc/rE   r/   )r   rŒ   r    r!   r‹   )r   r#   r   r+   rg   r�   N)rH   Úsplitr   Útransform_requestr    )	r   r   rŒ   r    r!   r‹   ÚdataÚparamr   s	           €r   r©   z!GDCGeminiConfig.transform_requestü   ss   ø€ ð ×Ñ˜FÔ#Ø—K‘K  QÓ'¨Ñ*ˆEä‘gÑ/ØØØ+Ø)Øð 0ó 
ˆð
ò 	"ˆEð �H‰H�U˜DÕ!ð	"ð ˆr   )N)T)NN)Ú__name__Ú
__module__Ú__qualname__r	   r`   Ú__annotations__r   r   r_   r0   Úcompiler   ÚPatternr   r   Úlistr   rƒ   r)   r,   r4   r>   rL   re   rs   r|   rŸ   rŠ   r¦   r©   Ú__classcell__)r   s   @r   r   r      s§  ø… Ø#'Ð˜DÓ'Ø(>Ð˜5 ™:Ó>Ø/9¨r¯z©zÐ:MÓ/NÐ�e˜BŸJ™J s™OÑ,ÓNð* ð *¨õ *ð
7°ð 7¸õ 7ð
°ð 
Àdð 
ÈsÐUYÉzó 
ð
°ð 
Àtð 
ÐPSÐVZÑPZó 
ðF¨3ð FÀð FÐW[ð FÐ`cÐfjÑ`jó Fð sð °3ð ¸sð Àsó ð  #ñ.Yà˜‘*ð.Yð �t‘ð.Yð ð	.Yð
 ð.Yð ð.Yð �t‘ð.Yð 
ó.Yñ`  #ð  °ð  ¸dð  ÈdÐUXÉjó  ð&) cð )°t¸c±zð )Àdó )ñ¨ð ¸ð ÈÐPSÉð Ð^aÐdhÑ^hð Ðtwó ð"¨Cð °E¸#¸t¸)Ñ4Dó ð. #Ø#ñLàðLð ðLð �s‘)ð	Lð
 ðLð ðLð �t‘ðLð ˜‘*ðLð 
óLð\!àð!ð �s‘)ð!ð ð	!ð
 ð!ð ð!ð 
÷!ñ !r   r   )Ú__doc__r€   rb   r0   r   Útypingr   r   Úurllib.parser   r'   Ú,litellm.llms.openai_like.chat.transformationr   r   r   r   r   ú<module>r¸      s3   ðñó Û 	Û 	Û ß Ý !ã Ý MôMÐ*õ Mr   