
    bizS                    8   d dl mZ d dlZd dlZd dlm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 d dlmZ d d	lmZmZmZ e	rd d
lmZmZ d dlmZmZmZ d dl m!Z! d dl"m#Z#  ededde
f         Z$ ejJ                  e&      Z'ejP                  d&d       Z)d'dZ*d'dZ+	 	 	 	 	 	 	 	 	 	 d(dZ,d)dZ-d*dZ.d+dZ/	 d,	 	 	 	 	 d-dZ0d.dZ1	 	 	 d/	 	 	 	 	 	 	 	 	 	 	 	 	 d0dZ2	 	 d1	 	 	 	 	 	 	 	 	 	 	 d2dZ3d3dZ4 G d ded !      Z5dd"dd#	 	 	 	 	 	 	 	 	 d4d$Z6d5d%Z7y)6    )annotationsN)defaultdict)Mapping)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)	TypedDict)client)run_helpers)InputTokenDetailsOutputTokenDetailsUsageMetadata)AsyncOpenAIOpenAI)ChatCompletionChunkChoiceChoiceDeltaToolCall)
Completion)ResponseStreamEventCr   r   )boundc                     g } 	 ddl m}m} | j                  |       | j                  |       t        |       S # t        $ r Y t        |       S w xY w)z4Get NotGiven/Omit sentinel types used by OpenAI SDK.r   )NotGivenOmit)openai._typesr   r   appendImportErrortuple)typesr   r   s      d/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/langsmith/wrappers/_openai.py_get_omit_typesr$   %   sS      E0XT <  <s   *9 	AAc                   	 t               }|s| S | j                         D ci c]'  \  }}t        ||      s|j                  d      r|||) c}}S c c}}w # t        $ r$}t
        j                  d|        | cY d }~S d }~ww xY w)Nextra_zError stripping NotGiven: )r$   items
isinstance
startswith	Exceptionloggererror)d
omit_typeskves        r#   _strip_not_givenr2   4   s    $&
H 	
1q*-!,,x2HQY qD
 	
 

  1!56s3   A A ,AA A 	B"B;BBc                    t        |       } d| v r(| d   }t        |d      r	 i | d|j                         iS | S # t        $ r Y | S w xY w)zCStrip `NotGiven` values and serialize `text_format` to JSON schema.text_formatmodel_json_schema)r2   hasattrr5   r*   )r-   r4   s     r#   _process_inputsr7   C   su    A &; 34!;#@#@#B  H  Hs   : 	AAc                   t        |      }|j                  d      }|rt        |t              r|g}h d}|j	                         D 	ci c]  \  }}	||v s||	 }
}}	|rd|
d<   || |j                  d      |j                  d      |j                  d      xs$ |j                  d      xs |j                  d	      |i ||
d
S c c}	}w )Nstop>   nseedusertop_plogprobs	reasoning	verbosity
logit_bias
modalities
prediction
truncationservice_tiertop_logprobsstream_optionsresponse_formatpresence_penaltyprompt_cache_keyreasoning_effortfrequency_penaltyweb_search_optionsparallel_tool_callsTuse_responses_apimodeltemperature
max_tokensmax_completion_tokensmax_output_tokens)ls_providerls_model_typels_model_namels_temperaturels_max_tokensls_stopls_invocation_params)r2   getr(   strr'   )
model_typeproviderprepopulated_invocation_paramsrO   kwargsstrippedr9   allowed_invocation_keysr/   r0   invocation_paramss              r#   _infer_invocation_paramsre   U   s      'H<<D
4%v4 ")AQ2I-I1  15-.  #!g.",,}5!l3 -<</0-<<+,!
,!
!
 s   	CCc                   t        t        |             }ddd}|D ]A  }t        |d      st        |j                  dd       s(|j                  j
                  |d<    n t        t               }| D ]5  }t        |d      st        |j                  dd       r!|dxx   |j                  j                  z  cc<   t        |j                  dd       r|j                  d      sddd|d<   t        |j                  j                  d	d       }|r|d   d	xx   |z  cc<   t        |j                  j                  d
d       }|r|d   d
xx   |z  cc<   t        |j                  dd       s|j                  j                  }||D ]   }||j                     j                  |       " 8 |rt        t        |j                               dz         D 	cg c]  }	d  c}	|d<   |j!                         D ]  \  }
}|
t#        d |D        d       t#        d |D        d       dddd|d   |
<   |D ]o  }t        |dd       st        |j$                  d	d       }|r|d   |
   d   d	xx   |z  cc<   t        |j$                  d
d       }|sZ|d   |
   d   d
xx   |z  cc<   q  | rt        | d   dd      ndt#        d |D        d       |dS c c}	w )N	assistant rolecontentdeltarj   rk   function_call)name	argumentsrn   ro   
tool_calls   c              3  N   K   | ]  }|j                   s|j                     y wN)id.0cs     r#   	<genexpr>z"_reduce_choices.<locals>.<genexpr>   s     CQaddADDC   %%c              3  N   K   | ]  }|j                   s|j                     y wrs   )typeru   s     r#   rx   z"_reduce_choices.<locals>.<genexpr>   s     I!&&affIry   )indexrt   r{   functionr}   r   r|   c              3  N   K   | ]  }t        |d d      r|j                    yw)finish_reasonN)getattrr   ru   s     r#   rx   z"_reduce_choices.<locals>.<genexpr>   s(      1ot4 s   #%)r|   r   message)listreversedr6   r   rl   rj   r   rk   r\   rm   rp   r|   r   rangemaxkeysr'   nextr}   )choicesreversed_choicesr   rw   rp   name_
arguments_tool_calls_list	tool_call_r|   tool_call_chunkschunks                r#   _reduce_choicesr      s   HW-.G  1g7177FD#AggllGFO ?J$>OJ F1gqww	40	"aggoo5"qww6{{?38:/LGO, 5 5vtDO,V4=4$QWW%:%:KN
O,[9ZG9qwwd3"#''"4"4".%4 F	"9??3::9EF!F$ /4S9J5Ka5O/P Q! Q'1'7'7'9 	#E#C*:CTJI.>I4P%'b9	,GL!%( * 	5*d3#ENNFDAE-e4Z@HEQH!(d!KJ!-e4Z@M&M		$ 5<Wa0)
 
  % !Rs   	K	c                v   t        t              }| D ]1  }|j                  D ]   }||j                     j	                  |       " 3 | r>| d   j                         }|j                         D cg c]  }t        |       c}|d<   n
dddddigi}|j                  dd       }|rt        |      nd |d<   |S c c}w )	Nr   r   rg   rh   ri   usageusage_metadata)
r   r   r   r|   r   
model_dumpvaluesr   pop_create_usage_metadata)
all_chunkschoices_by_indexr   choicer-   r   oai_token_usages          r#   _reduce_chatr      s    7B47H :mm 	:FV\\*11&9	:: rN%%'4D4K4K4M
)0OG$
) )kb%IJKL eeGT*O3B/  H
s   -B6c                    g }| D ]/  }|j                   d   j                  }||j                  |       1 dj                  |      }| r| d   j	                         }d|ig|d<   |S dd|igi}|S )Nr   rh   r   textr   )r   r   r   joinr   )r   all_contentr   rk   r-   s        r#   _reduce_completionsr      s    K (--"''w'( ggk"GrN%%')*) H &'*+,H    c                ,   |dv r|nd }|r| dnd}| j                  d      xs | j                  d      xs d}| j                  d      xs | j                  d      xs d}| j                  d	      xs ||z   }d
| j                  d      xs | j                  d      xs i j                  d      | d| j                  d      xs | j                  d      xs i j                  d      i}d
| j                  d      xs | j                  d      xs i j                  d      | d| j                  d      xs | j                  d      xs i j                  d      i}|r<||j                  | d      xs dz
  ||<   ||j                  | d      xs dz
  ||<   t        |||t        di |j                         D 	
ci c]  \  }	}
|
	|	|
 c}
}	t	        di |j                         D 	
ci c]  \  }	}
|
	|	|
 c}
}	      S c c}
}	w c c}
}	w )N)priorityflexr   rh   prompt_tokensinput_tokensr   completion_tokensoutput_tokenstotal_tokensaudioprompt_tokens_detailsinput_tokens_detailsaudio_tokens
cache_readcached_tokenscompletion_tokens_detailsoutput_tokens_detailsr?   reasoning_tokens)r   r   r   input_token_detailsoutput_token_details )r\   r   r   r'   r   )r   rE   recognized_service_tierservice_tier_prefixr   r   r   r   r   r/   r0   s              r#   r   r      s    %(<<$  *A"
#1%b 
 	O,X0C0CN0SXWX  	/0 	/	 
 #&&~6V,:VL 78 ""#9:
#n

z* 78 ""#9:
#o
! 	 ;< ""#:;
#n

y) ;< ""#:;
# 
!"  8D##':&;:$FGL18
34 9F $$(;'<I%FGL19
45 !#!- 
 3 9 9 ;M1q}q!tM
 0 
 4 : : <N1q!tN

 

 N Os    
H
H
/
H:Hc                v   	 t        | d      r&t        | j                        r	 | j                         } | j	                         }|j                  dd       }|rt        ||j                  d            nd |d<   |S # t        $ r Y Qw xY w# t        $ r&}t        j                  d|        d| icY d }~S d }~ww xY w)Nparser   rE   r   z"Error processing chat completion: output)r6   callabler   r*   r   r   r   r\   BaseExceptionr+   debug)outputsrdictr   r1   s       r#   _process_chat_completionr   ;  s    #
 7G$'--)@!--/ ""$))GT2  #?EIIn4MN 	
     #9!=>'""#s@   !B	 A: AB	 :	BB	 BB	 		B8B3-B83B8c                     |xs i t        j                          fd       }t        j                          fd       }t        j                         r|S |S )Nc            
         t        j                  dd|j                  d      du rnd t        d}  |      | i |S NllmstreamTrn   run_type	reduce_fnprocess_inputs_invocation_params_fnprocess_outputsr   r   	traceabler\   r7   	argsra   	decoratorinvocation_params_fnrn   original_creater   r   textras	      r#   createz_get_wrapper.<locals>.create^  s_    )) 
#)::h#74#?iT*"6+
 
	 *y)4:6::r   c            
        K   t        j                  dd|j                  d      du rnd t        d}  |      | i | d {   S 7 wr   r   r   s	      r#   acreatez_get_wrapper.<locals>.acreatel  si     )) 
#)::h#74#?iT*"6+
 
	 0Y/@@@@@s   AA
AA	functoolswrapsr   is_async)	r   rn   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r#   _get_wrapperr   T  sn      bF___%; ; &; ___%
A 
A &
A "**?;7GGr   c                     |xs i t        j                          fd       }t        j                          fd       }t        j                         r|S |S )Nc            
     `    t        j                  ddd t        d}  |      | i |S Nr   r   r   r   r   r7   r   ra   r   r   rn   original_parser   r   s      r#   r   z!_get_parse_wrapper.<locals>.parse  sM    )) 
*"6+
 
	 )y($9&99r   c            
     |   K   t        j                  ddd t        d}  |      | i | d {   S 7 wr   r   r   s      r#   aparsez"_get_parse_wrapper.<locals>.aparse  sW     )) 
*"6+
 
	 /Y~.?????s   2<:<r   )r   rn   r   r   r   r   r   r   s   ``` `  @r#   _get_parse_wrapperr   |  sc      bF__^$
: %
: __^$
@ %
@ !)).96DuDr   c                `    | D ](  }|j                   dk(  st        |j                        c S  i S )Nzresponse.completed)r{   _process_responses_api_outputresponse)eventsevents     r#   _reduce_response_eventsr     s6     A::--0@@A Ir   c                  ,    e Zd ZU ded<   ded<   ded<   y)TracingExtrazOptional[Mapping[str, Any]]metadatazOptional[list[str]]tagszOptional[ls_client.Client]r   N)__name__
__module____qualname____annotations__r   r   r#   r   r     s    ))
&&r   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec                  |xs i }t        |j                  d      xs i       }|j                  di       }|j                         D ci c]  \  }}|dk7  s|| }}}|r||d<   d}		 ddlm}
m} t        | |      st        | |
      rd}	d}d}t        | j                  j                  j                  |t        |t        j                  t         d	|	|d
      t"              | j                  j                  _        t        | j                  j                  |t$        |t        j                  t         d|	|d
            | j                  _        t'        | d      rt'        | j(                  d	      rt'        | j(                  j                  d      rt'        | j(                  j                  j                  d      rzt+        | j(                  j                  j                  j,                  |t"        |t        j                  t         d	|	|d
            | j(                  j                  j                  _        t'        | d	      rt'        | j                  d      rt'        | j                  j                  d      rft+        | j                  j                  j,                  |t"        |t        j                  t         d	|	|d
            | j                  j                  _        t'        | d      rt'        | j.                  d      rWt        | j.                  j                  |t0        t2        |t        j                  t         d	|	|d            | j.                  _        t'        | j.                  d      rRt+        | j.                  j,                  |t2        |t        j                  t         d	|	|d            | j.                  _        | S c c}}w # t        $ r Y @w xY w)ay  Patch the OpenAI client to make it traceable.

    Supports:
        - Chat and Responses API's
        - Sync and async OpenAI clients
        - `create` and `parse` methods
        - With and without streaming
        - `with_raw_response` API for accessing HTTP headers

    Args:
        client: The client to patch.
        tracing_extra: Extra tracing information.
        chat_name: The run name for the chat completions endpoint.
        completions_name: The run name for the completions endpoint.

    Returns:
        The patched client.

    Example:
        ```python
        import openai
        from langsmith import wrappers

        # Use OpenAI client same as you normally would.
        client = wrappers.wrap_openai(openai.OpenAI())

        # Chat API:
        messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {
                "role": "user",
                "content": "What physics breakthroughs do you predict will happen by 2300?",
            },
        ]
        completion = client.chat.completions.create(
            model="gpt-4o-mini", messages=messages
        )
        print(completion.choices[0].message.content)

        # Responses API:
        response = client.responses.create(
            model="gpt-4o-mini",
            messages=messages,
        )
        print(response.output_text)

        # With raw response to access headers:
        raw_response = client.chat.completions.with_raw_response.create(
            model="gpt-4o-mini", messages=messages
        )
        print(raw_response.headers)  # Access HTTP headers
        completion = raw_response.parse()  # Get parsed response
        ```

    !!! warning "Behavior changed in `langsmith` 0.3.16"

        Support for Responses API added.

    !!! warning "Behavior changed in `langsmith` 0.3.x"

        Support for `with_raw_response` API added.
    r   r[   openair   )AsyncAzureOpenAIAzureOpenAIazureAzureChatOpenAIr   chatF)r   r   r   r   )r   r   betacompletionsr   	responsesr   T)r   r   r   )dictr\   r   r'   r   r   r   r(   r    r   r  r  r   r   r   partialre   r   r   r6   r  r   r   r  r   r   )r   r   r   r   r   r`   r/   r0   tracing_extra_restrU   r   r   s               r#   wrap_openair    sW   J "'RM M%%j17R8H%-\\2H"%M" ',,.(A!z/1( ( )1:&K8fk*jAQ.R!K)I,
 &2&&(&..$*
 1&FKK" !-!!(&..$*
!F  	FKK(FKK$$m4FKK$$00':-?KK((..$,!*!2!2(.".
$$*  	FKK/FKK++W5(:KK##))$,!*!2!2(.")
% v{#6##X.&2  ''' =0%.%6%6,2&'F# 6##W-%7  &&-0%.%6%6,2&&F" Mq(  s   
N>N>*&O 	OOc                    | rH	 | j                  dd      }|j                  dd       x}rt        ||j                  d            |d<   |S i S # t        $ r d| icY S w xY w)NTjson)exclude_nonemoder   rE   r   r   )r   r   r   r\   r*   )r   r   r   s      r#   r   r   v  s}    	(((d(HF

7D11u1+A6::n5,'( M I  	(h''	(s   AA AA)returnztuple[type, ...])r-   r  r  r  )
r^   r]   r_   r]   r`   r  rO   boolra   r  )r   zlist[Choice]r  r  )r   zlist[ChatCompletionChunk]r  r  )r   zlist[Completion]r  r  rs   )r   r  rE   zOptional[str]r  r   )r   r   )NNN)r   r   rn   r]   r   r   r   Optional[TracingExtra]r   Optional[Callable]r   r  r  r   )NN)r   r   rn   r]   r   r   r   r  r   r  r  r   )r   zlist[ResponseStreamEvent]r  r  )
r   r   r   r  r   r]   r   r]   r  r   )r   r   r  r  )8
__future__r   r   loggingcollectionsr   collections.abcr   typingr   r   r   r	   r
   r   typing_extensionsr   	langsmithr   	ls_clientr   langsmith.schemasr   r   r   r   r   r   'openai.types.chat.chat_completion_chunkr   r   r   openai.types.completionr   openai.types.responsesr   r   	getLoggerr   r+   	lru_cacher$   r2   r7   re   r   r   r   r   r   r   r   r   r   r  r   r   r   r#   <module>r     s   "   # #  ( ) ! R R* 
 3: CuX}c9:;			8	$  $<<< %)< 	<
 <~;|*" :>AA)6AAH#: -1/3*.%H%H
%H %H *	%H
 -%H (%H %HX -1/3#E#E
#E #E *	#E
 -#E #EL'9E ' -1!$DD *D 	D
 D DNr   