Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
_gemini.cpython-313.pyc227 linesDownload Raw Back to __pycache__
1�

2��j�f���SSKJr SSKrSSKrSSKrSSKJr SSKJrJ	r	J3r4JrJrJ
r
 SSKJr SSKJr SSKJr SSKJr SS	KJr SS5KJrJrJr \(aSSKJr \"S\
S
\	4S9r\R@"\!5r"SSjr#S Sjr$S!Sjr%S"Sjr&S#Sjr'S$Sjr(S%Sjr)S&Sjr*S'S(Sjjr+"SS\SS9r,\SSS.S)Sjj5r-g)*�)�annotationsN)�Mapping)�
TYPE_CHECKING�Any�Callable�Optional�TypeVar�Union)�	TypedDict)�client)�run_helpers)�	warn_beta)�dumps)�InputTokenDetails�OutputTokenDetails�
UsageMetadata)�genai�Czgenai.Client)�boundc�b�UR5VVs0sHupUcM6X_M snn$s snnf)z%Remove `None` values from dictionary.)�items)�d�k�vs   �`D:\code\apps\devtools\python\user_packages\Python313\site-packages\langsmith/wrappers/_gemini.py�_strip_noners(���W�W�Y�8�Y�T�Q�!�D�A�D�Y�8�8��8s�	+�+c�f�SU;a+[US[5(d[US5US'ggg)zFConvert `GenerateContentConfig` to `dict` for LangSmith compatibility.�configN)�7isinstance�dict�vars)�kwargss r�_convert_config_for_tracingr#$s8���6��*�V�H�-=�t�"D�"D���x� 0�1��x��#E��c���[U[[45(aU$[US5(aUR	5$[US5(aUR5$U$)zISerialize a Pydantic/model object to dict (or return as-is for dict/str).�8model_dump�to_dict)rr �str�hasattrr&r')�objs r�_to_dictr+*sP���#��c�{�#�#��9��s�L�!�!��~�~����s�I����{�{�}���Jr$c�X�URS5nU(dU$[U[5(aESUS./URS5S.UR5VVs0sHup#US;dM
X#_M snnE$[U[5(Ga�[SU55(aUUVs/sHnSUS.PM10 snURS5S.UR5VVs0sHup#US;dM
X#_M snnE$/nUGH�n[
U5n[U[5(dM&URSS5nURS	/5n/n	/n11UGH.n[
U5n[U[5(a'U	RU5 U12RS13US.5 MK[U[5(dMbS14U;a7US15(a-U	RUS165 U17RS18US19S.5 M�SU;a�[
US5n[U[5(dM�URS
S5n
URSS5n[U[5(a&[R"U5RS5nOUnU20RSSU
SU3SS.S.5 GMKSU;a>USnU21RSURS5URS05S.S.5 GM�SU;d	SU;dGM�[
URS5=(d URS55n[U[5(dGM�U22RSURS 5URS5URS!05S".S#.5 GM1 U23(a)[S$U2455(aS%RU	5nOU25(aU26OS&nURUUS.5 GM� UURS5S.UR5VVs0sHup#US;dM
X#_M snnE$U$s snnfs snfs snnfs snnf)'u�Process Gemini inputs to normalize them for LangSmith tracing.27 28Example:29    ```txt30    {"contents": "Hello", "model": "gemini-pro"}31    → {"messages": [{"role": "user", "content": "Hello"}], "model": "gemini-pro"}32    {"contents": [{"role": "user", "parts": [{"text": "What is AI?"}]}], "model": "gemini-pro"}33    → {"messages": [{"role": "user", "content": "What is AI?"}], "model": "gemini-pro"}34    ```35�contents�user)�role�content�model)�messagesr1)r-r1c3�B# �UHn[U[5v� M g7f)N)rr()�.0�items  r�	<genexpr>�)_process_gemini_inputs.<locals>.<genexpr>Ps���:���z�$��$�$��s�r/�parts�text��typer9�inline_data�	mime_type�36image/jpeg�datar$�utf-8�	image_url�data:�;base64,�high��url�detail�r;rA�functionResponse�function_response�name�response)rKrL)r;rJ�
function_call�functionCall�id�args�rOrK�	arguments�r;rMc3�H# �UHoRS5S:Hv� M g7f)r;r9N)�get)r4�ps  rr6r7�s���$T�m��U�U�6�]�f�%<�m�s� "�37�)rUrr(r�list�allr+r �append�bytes�base64�	b64encode�decode�join)�inputsr-rrr5r2r0r/�	raw_parts�38text_parts�
content_parts�partr<r=r?�data_b64rJ�fc�message_contents                   r�_process_gemini_inputsri5s����z�z�*�%�H���
��(�C� � �"(�X�>�?��Z�Z��(�39�"(����R����1�<Q�3Q�����R�40�	41��(�D�!�!��:��:�:�:�LT�T�8�4�f��>�8�T����G�,��&,�\�\�^�V�^�T�Q�q�@U�7U�D�A�D�^�V��
����G��w�'�G��g�t�,�,���;�;�v�v�.�D����G�R�0�I�$&�J�24�M�!����~���d�C�(�(��%�%�d�+�!�(�(�&�$�)G�H��!�$��-�-���T�>�d�6�l��%�%�d�6�l�3�!�(�(�&�$�v�,�)O�P�"�d�*�"*�4�
�+>�"?�K�%�k�4�8�8� � +����\� J�I�&�?�?�6�3�7�D�!�$��.�.�#)�#3�#3�D�#9�#@�#@��#I��#'��!�(�(�$/�).�y�k��(��'L�*0�*���(�4�/�(,�-?�(@�%�!�(�(�$7�(9�(=�(=�f�(E�,=�,A�,A�*�b�,Q�2���%��,��$�0F�!�$�(�(�?�";�"W�t�x�x��?W�X�B�!�"�d�+�+�%�,�,�(7�*,�&�&��,�,.�F�F�6�N�13�����1C�2"��	�]"�t��$T�m�$T�!T�!T�DH�I�I��E��4A�-�b���O�O�T�o�F�G�W �\!��Z�Z��(�42�"(����R����1�<Q�3Q�����R�43�	44��M��GS��U��V��hSs*�P�*P�&P�P �,P �8P&�P&c�D�[U5nURS05n[US5(a'URn[	USS5n[	USS5nO3URS5nURS5nURS5nSSURS5UUUUS	.$)45z*Extract invocation parameters for tracing.r�temperature�max_output_tokensN�stop_sequences�google�chatr1)�ls_provider�
ls_model_type�
ls_model_name�ls_temperature�
ls_max_tokens�ls_stop�ls_invocation_params)rrUr)rk�getattr)�prepopulated_invocation_paramsr"�strippedrrk�46max_tokens�stops       r�_infer_invocation_paramsr|�s����6�"�H�
�\�\�(�B�
'�F��v�}�%�%��(�(���V�%8�$�?�47��v�/��6���j�j��/���Z�Z� 3�4�48��z�z�*�+�� ��!���g�.�%�#�� >��r$c��URS5=(d SnURS5=(d SnURS5=(d SnURS5=(d SnURS5=(d X-n0nU(a(X6S'[SUS-495US	'[SUS-505US51'0nU(aXGS'U(a[SUS-525US53'[UUU[S
0UR	5VV	s0sHup�U	cM54X�_M sn	nD6[S
0UR	5VV	s0sHup�U	cM55X�_M sn	nD6S9$s sn	nfs sn	nf)z2Convert Gemini usage metadata to LangSmith format.�prompt_token_countr�candidates_token_count�cached_content_token_count�thoughts_token_count�total_token_count�56cache_readi@
�cache_read_over_200k�	over_200k�	reasoning)�input_tokens�
output_tokens�total_tokens�input_token_details�output_token_details�)rU�maxrrrr)57�gemini_usage_metadatar~rr�r�r�r�r�rrs58          r�_create_usage_metadatar��s���.�2�2�3G�H�M�A��2�6�6�7O�P�U�TU���!�!�">�?�D�1��1�4�4�5K�L�Q�PQ���!�!�"5�6�	7��6��59!#��!�,F�L�)�69�
�)�F�2�760��2�3�,/�q�2D�v�2M�+N��K�(�!#���,@�[�)��,/��3I�F�3R�,S��[�)��'�,�&�-�61� 3� 9� 9� ;�M� ;���q�t�q�t� ;�M�62�0�63� 4� :� :� <�N� <����t�q�t� <�N�64�65�66��67N��Os�>	E�E�0	E�=Ec��[US5(aUR5nO:[US5(aUR5nOS[US[	U550nSn/nSnSU;Ga�US(Ga�USSnSU;Ga�USnS	U;GaxUS	(GamUS	GHcnSU;a*US(a X'S-
nURSUSS68.5 M4SU;a�USb�USnUR
SS
5n	UR
SS5n69[U70[5(a&[R"U715RS5nOU72nURSSU	SU3SS.S.5 M�SU;dSU;dM�[UR
S5=(d UR
S55n[U[5(dGMURSUR
S5UR
S5UR
S05S.S.5 GMf SU;aUS(aUSnOSU;aUSnURSUS73.5 UV
s/sHo�R
S5S:XdMU
PM nn
U(ayU=(d SS U[U5VVs/sHQunnUSR
S5=(d S!U3S"UUSS[USS#5R5S$.S%.PMS snnS&.nO/[!U5S':�dU(aUSSS:waUS US(.nOUS US(.nUR
S)5n[#SSSS*9nU(a[%U5nUR
S+5(aUSS UUS+US,.$[US[5(a74USS UUS-.$USS UUS-.$s sn
fs snnf![&a&n[(R+S.U35 S/U0sSnA$SnAff=f)0z$Process Gemini response for tracing.r'r&r9rXN�75candidatesrr0r8r:r<r=r>r?r$r@rArBrCrDrErHrMrNrOrKrPrQrS�
finish_reasonr;�	assistant�call_�functionrR)rKrR)rOr;�indexr�)r0r/r��76tool_calls�)r0r/r��usage_metadata�r�r�r�r�)r0r/r�r�r�)r0r/r�r�z"Error processing Gemini response: �output)r)r'r&rwr(r[rUrr\r]r^r_r+r �	enumerate�_dumps�lenrr��	Exception�logger�debug)rL�rdict�content_resultrdr��	candidater0rer<r=r?rfrgrVr��i�tc�resultr��77usage_dict�es                     r�"_process_generate_content_responser��s9��N$��8�Y�'�'��$�$�&�E�
�X�|�
,�
,��'�'�)�E��W�X�v�s�8�}�E�F�E����
�'+�
��5� �U�<�%8�%8��l�+�A�.�I��I�%�#�I�.���g�%�'�'�*:�*:� '�� 0��!�T�>�d�6�l�*�6�l�:�N�)�0�0�&�$�v�,�1W�X�*�d�2�t�M�7J�7V�*.�}�*=�K�(3����\�(R�I�#.�?�?�6�3�#?�D� *�$��6�6�+1�+;�+;�D�+A�+H�+H��+Q��+/��)�0�0�,7�16�y�k��(��/T�28�2&�!"��-��4��$�8N�!)� $���� 9� U�T�X�X�n�=U�"�B� *�"�d�3�3� -� 4� 4�0?�24�&�&��,�46�F�F�6�N�9;�����9K�:*�%&�	!"�?!1�R#�i�/�I�o�4N�$-�o�$>�M��
�u�_�"�6�]�N�� � �&�.�!I�J�"/�S��A�%�%��-�?�2R�a��78�S��*�1�T�#�!.�"+�:�!6�
�"7���2�!��1�5�5�d�;�J��q�c�{� *�!"�$&��$7��$?�)/� "�?� 3�K� @�*�$�f�h�	%�	79�"7�
�	�F�&��
�!�
#��m�A�.�v�6�&�@�)�#�!.��F�*�#�!.��F����#3�4��$1��!�!�%80�81��/��?�J��:�:�l�#�#�"�)�,�#�!.�$�\�2�",��
��&��+�S�1�1�%�i�0�'�%2�&0�	�� &�i�0�'�%2�&0�	���IT��
��F�$����9�!��=�>��(�#�#��$�s^�E.N�4AN�>BN�N�N�$#N�AN�BN�'!N�		N�N�82O�(O	�O�	Oc	��U(dS[SSSS9S.$SnSnUH6n[US5(aUR(aXR-
nUnM8 [SSSS9nU(Ga[US5(a�UR(a�[URS	5(aURR5nO�[URS835(aURR5nOq[URSS5[URSS5[URS
S5[URSS5[URSS5S.n[U5nUUS.$![a$n[RSU35 SnAGM�SnAff=f![a"n[RSU35 SnAN]SnAff=f)z/Reduce streaming chunks into a single response.rXrr�)r0r�Nr9zError processing chunk: r�r'r&r~rr�r�r�)r~rr�r�r�z+Error extracting metadata from last chunk: )rr)r9r�r�r�r�r'r&rwr�)�84all_chunks�	full_text�85last_chunk�chunkr�r�r�s       r�_reduce_generate_content_chunksr��s�����+��a�a��86�	87��I��J���	9��u�f�%�%�%�*�*��Z�Z�'�	��J�	�%2��a�a�%�N��	L��z�#3�4�4��9R�9R��:�4�4�i�@�@�!+�!:�!:�!B�!B�!D�J��Z�6�6��E�E�!+�!:�!:�!E�!E�!G�J�/6�&�5�5�7K�Q�/�3:�&�5�5�7O�QR�3�7>�&�5�5�7S�UV�7�18�&�5�5�7M�q�1�.5�&�5�5�7J�A�.�"�J�$"8�88�!C���(����O�	9��L�L�3�A�3�7�8�8��	9��F�	L��L�L�F�q�c�J�K�K��	L�s0�2E9�*D89F*�990F'�F"�"F'�*91G�4G�GFc��^^^^^�U=(d 0m[R"T5UUUUU4Sj5n[R"T5UUUUU4Sj5n[R"T5(aU$U$)z9Create a wrapper for Gemini's `generate_content` methods.c��>�[U5 [R"STST(a[OS[T(d[92OS[R"[T5S.TD6nU"T5"U0UD6$�N�llm)rK�run_type�	reduce_fn�process_inputs�process_outputs�_invocation_params_fnr��	r#r
�	traceabler�rir��	functools�partialr|�rPr"�	decorator�is_streamingrK�original_generaterx�textras   �����r�generate�_get_wrapper.<locals>.generate�sq���	$�F�+��)�)�93���9E�5�4�1�:F�2�D�"+�"3�"3�(�*H�#�94��95�	��*�+�T�<�V�<�<r$c���># �[U5 [R"STST(a[OS[T(d[96OS[R"[T5S.TD6nU"T5"U0UD6IShv�N$N7fr�r�r�s   �����r�	agenerate�_get_wrapper.<locals>.agenerate�sz����	$�F�+��)�)�97���9E�5�4�1�:F�2�D�"+�"3�"3�(�*H�#�98��99�	��0�1�4�B�6�B�B�B�B�s�A1A;�4A9�5A;)r��wrapsr
�is_async)r�rKrx�
tracing_extrar�r�r�r�s``` `  @r�_get_wrapperr��st����
 �b�F��_�_�&�'�=�=�(�=�(�_�_�&�'�C�C�(�C�($�,�,�->�?�?�9�M�X�Mr$c�4�\rSrSr%S\S'S\S'S\S'Srg	)100�TracingExtrai�zOptional[Mapping[str, Any]]�metadatazOptional[list[str]]�tagszOptional[ls_client.Client]rr�N)�__name__�101__module__�__qualname__�__firstlineno__�__annotations__�__static_attributes__r�r$rr�r��s��)�)�102��&�&r$r�)�total�ChatGoogleGenerativeAI)r��	chat_namec�|�U=(d 0n[URS5=(d 05nURS05nUR5VVs0sHupVUS:wdM
XV_M nnnU(aX7S'[	US5(aK[	UR103S5(a0[	UR104RS5(a[S5e[	US5(aK[	UR105S5(a0[UR106RUUUSS9UR107l[	US5(aK[	UR108S	5(a0[UR109RUUUS110S9UR111l	[	US5(a�[	URS5(ai[	URR112S5(aD[URR113RUUUSS9URR114l[	US5(a�[	URS5(ai[	URR115S	5(aD[URR116RUUUS117S9URR118l	U$s snnf)a�119Patch the Google Gen AI client to make it traceable.120 121!!! warning122 123    **BETA**: This wrapper is in beta.124 125Supports:126    - `generate_content` and `generate_content_stream` methods127    - Sync and async clients128    - Streaming and non-streaming responses129    - Tool/function calling with proper UI rendering130    - Multimodal inputs (text + images)131    - Image generation with `inline_data` support132    - Token usage tracking including reasoning tokens133 134Args:135    client: The Google Gen AI client to patch.136    tracing_extra: Extra tracing information.137    chat_name: The run name for the chat endpoint.138 139Returns:140    The patched client.141 142Example:143    ```python144    from google import genai145    from google.genai import types146    from langsmith import wrappers147 148    # Use Google Gen AI client same as you normally would.149    client = wrappers.wrap_gemini(genai.Client(api_key="your-api-key"))150 151    # Basic text generation:152    response = client.models.generate_content(153        model="gemini-2.5-flash",154        contents="Why is the sky blue?",155    )156    print(response.text)157 158    # Streaming:159    for chunk in client.models.generate_content_stream(160        model="gemini-2.5-flash",161        contents="Tell me a story",162    ):163        print(chunk.text, end="")164 165    # Tool/Function calling:166    schedule_meeting_function = {167        "name": "schedule_meeting",168        "description": "Schedules a meeting with specified attendees.",169        "parameters": {170            "type": "object",171            "properties": {172                "attendees": {"type": "array", "items": {"type": "string"}},173                "date": {"type": "string"},174                "time": {"type": "string"},175                "topic": {"type": "string"},176            },177            "required": ["attendees", "date", "time", "topic"],178        },179    }180 181    tools = types.Tool(function_declarations=[schedule_meeting_function])182    config = types.GenerateContentConfig(tools=[tools])183 184    response = client.models.generate_content(185        model="gemini-2.5-flash",186        contents="Schedule a meeting with Bob and Alice tomorrow at 2 PM.",187        config=config,188    )189 190    # Image generation:191    response = client.models.generate_content(192        model="gemini-2.5-flash-image",193        contents=["Create a picture of a futuristic city"],194    )195 196    # Save generated image197    from io import BytesIO198    from PIL import Image199 200    for part in response.candidates[0].content.parts:201        if part.inline_data is not None:202            image = Image.open(BytesIO(part.inline_data.data))203            image.save("generated_image.png")204    ```205 206!!! version-added "Added in `langsmith` 0.4.33"207 208    Initial beta release of Google Gemini wrapper.209 210r�rv�models�generate_content�__wrapped__zfThis Google Gen AI client has already been wrapped. Wrapping a client multiple times is not supported.F)r�r��generate_content_streamT�aio)r rU�poprr)r�r��211ValueErrorr�r�r�)rr�r�r�rxrr�tracing_extra_rests        r�wrap_geminir�sF��F"�'�R�M��M�%�%�j�1�7�R�8�H�%-�\�\�2H�"�%M�"�'�,�,�.�(�.���!�z�/����.��(��)1�:�&�	���!�!��F�M�M�#5�6�6��F�M�M�2�2�M�B�B��
A�212�	213��v�x� � �W�V�]�]�<N�%O�%O�)5��M�M�*�*��*�,��*214��
�
�&��v�x� � �W�V�]�]�<U�%V�%V�0<��M�M�1�1��*�,��1215��
�
�-�	������F�J�J��)�)��F�J�J�%�%�'9�:�:�-9��J�J���.�.��*�,��.216��217�218���*�	������F�J�J��)�)��F�J�J�%�%�'@�A�A�4@��J�J���5�5��*�,��5219��220�221���1��M��(s�J8�$J8)rr �returnr )r"r r��None)r*rr�r)rar r�r )rxr r"r r�r )r�r r�r)rLrr�r )r�rYr�r )NF)r�rrKr(rxr r��Optional[TracingExtra]r��boolr�r)rrr�r�r�r(r�r).�222__future__rr]r��logging�collections.abcr�typingrrrrr	r223�typing_extensionsr�	langsmithr�	ls_clientr
�#langsmith._internal._beta_decoratorr�langsmith._internal._orjsonrr��langsmith.schemasrrrrnrr�	getLoggerr�r�rr#r+rir|r�r�r�r�r�r�r�r$r�<module>r�sJ��"�
���#���(�)�!�9�7�R�R����C�u�^�S�0�1�2��	�	�	�8�	$��9�2242��x�v�$(��26��	��8&�RP$�f=�H-1��4N��4N�225
�4N�%)�4N�*�	4N�226�4N��
4N�n'�9�E�'��-1�-�	h�
�h�*�h��	h�227�h��hr$
codekingpro/portable-devtools · Team Ai