
    {hc                     v   d dl Z d dlZd dlZd dlmZ d dl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mZmZmZmZ d dlmZ d dlmZ d d	lmZmZmZ  e	d
      Z e	de      Z ej>                  d      Z deddfdZ!dede"fdZ#	 	 dde$e   de"dee%e"ef      dee&   def
dZ' G d de      Z(de$e   de(fdZ)y)    N)wraps)	AnnotatedAnyOptionalTypeVarcast)parse)ChatCompletion)	BaseModel
ConfigDictFieldTypeAdaptercreate_model)IncompleteOutputException)Mode)classpropertyextract_json_from_codeblockmap_to_gemini_function_schemaTModel)bound
instructor
completionreturnc                     t        | d      r(| j                  d   j                  dk(  rt        |       t        | d      r| j                  dk(  rt        |       yy)zECheck if a completion was incomplete and raise appropriate exception.choicesr   lengthlast_completionstop_reason
max_tokensN)hasattrr   finish_reasonr   r    )r   s    Z/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/instructor/function_calls.py_handle_incomplete_outputr%   #   s_     	
I&q!//8;'
CC z=)j.D.D.T'
CC /U)    c                    t        | d      r'| j                  d   j                  j                  xs dS t        | d      r| j                  S t        | d      r:| j                  D cg c]  }|j
                  dk(  s| }}|r|d   j                  S t        | t              rFd| v rB	 | j                  d      j                  d      j                  d      d   j                  d      S yc c}w # t        t        f$ r Y yw xY w)z5Extract text content from various completion formats.r   r    textcontentoutputmessage)r"   r   r,   r*   r)   type
isinstancedictgetAttributeError
IndexError)r   ctext_blockss      r$   _extract_text_contentr5   0   s     z9%!!!$,,44:: z6" z9%","4"4IQ&8HqIIq>&&& *d#J(>	>>(+//	:>>yI!LPPQWXX  J 
+ 		s   &C);C)'A C. .D ?D clsjson_strvalidation_contextstrictc           	         	 |r| j                  ||d      S t        j                  |d      }| j                  ||d      S # t        j                  $ r,}t
        j                  d|        t        d|       |d}~wt        $ rE}t
        j                  d|        d	d
l	m
}  |d| j                   dt        |             |d}~ww xY w)z@Validate model from JSON string with appropriate error handling.Tcontextr9   Fr9   zJSON decode error: zFailed to parse JSON: NzModel validation error: r   )ValidationErrorzFailed to validate model z: )model_validate_jsonjsonloadsmodel_validateJSONDecodeErrorloggerdebug
ValueError	Exceptioninstructor.exceptionsr>   __name__str)r6   r7   r8   r9   parsedeInstructorValidationErrors          r$   _validate_model_from_jsonrN   J   s    **"4T +  
 ZZ7F%%f6HQV%WW >*1#./1!56A= /s34V''~RAx@
	s)   A *A C'A==C	A C		Cc                      e Zd Z eef      Zedeeef   fd       Z	edeeef   fd       Z
edefd       Zeddej                  fdedeeeef      d	ee   d
edef
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   fd       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 d dee   dedeeeef      defd       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Ze	 	 ddee   dedeeeef      d	ee   def
d       Z e	 	 ddee   dedeeeef      d	ee   def
d       Z!e	 	 	 d!dee   dedeeeef      d	ee   dedefd       Z"e	 	 ddee   dedeeeef      d	ee   def
d       Z#e	 	 ddee   dedeeeef      d	ee   def
d       Z$e	 	 ddee   dedeeeef      d	ee   def
d       Z%y)"OpenAISchema)ignored_typesr   c                    | j                         }t        | j                  xs d      }|j                         D ci c]  \  }}|dvs|| }}}|j                  D ];  }|j
                  x}|d   v s|j                  x}s&d|d   |   vs1||d   |   d<   = t        d |d   j                         D              |d<   d|vr/|j                  r|j                  |d<   nd| j                   d|d<   |d	   |d   |d
S c c}}w )av  
        Return the schema in the format of OpenAI's schema as jsonschema

        Note:
            Its important to add a docstring to describe how to best use this class, it will be included in the description attribute and be part of the prompt.

        Returns:
            model_json_schema (dict): A dictionary in the format of OpenAI's schema as jsonschema
        r(   )titledescription
propertiesrT   c              3   0   K   | ]  \  }}d |vs|  yw)defaultN ).0kvs      r$   	<genexpr>z-OpenAISchema.openai_schema.<locals>.<genexpr>   s       (
!Qiq>PA(
s   requiredzCorrectly extracted `z5` with all the required parameters with correct typesrS   namerT   
parameters)
model_json_schemar	   __doc__itemsparamsarg_namerT   sortedshort_descriptionrI   )	r6   schema	docstringrZ   r[   r`   paramr_   rT   s	            r$   openai_schemazOpenAISchema.openai_schemak   sP    &&(#+++,	#\\^
Qq8P/PAqD

 
 %% 	PE&:l+CC$0000 
<(@(FFDOJ|,T2=A	P "( (
$\288:(
 "

: &**(1(C(C}% ,CLL> :A B }% 7O!-0$
 	
/
s   D
Dc                 N    | j                   }|d   |d   | j                         dS )Nr_   rT   )r_   rT   input_schema)rk   ra   )r6   rk   s     r$   anthropic_schemazOpenAISchema.anthropic_schema   s5     ))!&)(7113
 	
r&   c                     dd l }|j                  dt        d       	 dd lmc m} | j                  }|j                  |d   |d   t        |d               }|S # t        $ r}t        d	      |d }~ww xY w)
Nr   z_gemini_schema is deprecated. The google-generativeai library is being replaced by google-genai.   )
stacklevelr_   rT   r`   r^   z`google-generativeai is deprecated. Please install google-genai instead: pip install google-genai)
warningswarnDeprecationWarninggoogle.generativeai.typesgenerativeaitypesrk   FunctionDeclarationr   ImportError)r6   rr   genai_typesrk   functionrL   s         r$   gemini_schemazOpenAISchema.gemini_schema   s     	m 	 	
	;;  --M #66"6*)-88|9TU 7 H O 	r	s   <A 	A5$A00A5Nr   r8   r9   modec           	      z   |t         j                  k(  r| j                  |||      S |t         j                  k(  s|t         j                  k(  r| j                  |||      S |t         j                  k(  r| j                  |||      S |t         j                  k(  r| j                  |||      S |t         j                  t         j                  hv r| j                  ||      S |t         j                  k(  r| j                  |||      S |t         j                  k(  r| j                  |||      S |t         j                  k(  r| j!                  |||      S |t         j"                  k(  r| j%                  |||      S |t         j                  k(  r| j'                  |||      S |t         j(                  k(  r| j+                  |||      S |t         j,                  k(  r| j/                  |||      S |t         j0                  k(  r| j3                  |||      S |t         j4                  k(  r| j7                  |||      S |t         j8                  t         j:                  hv r&| j=                  ||||t         j:                  k(        S |j>                  s,tA        |d      rtC        |jD                        tC        d      |j>                  d   jF                  dk(  rtI        |      |t         jJ                  k(  r't        jL                          | jO                  |||      S |t         jP                  k(  r| jS                  |||      S |t         jT                  t         jV                  t         jX                  t         jZ                  t         j\                  hv r| j_                  |||      S |t         j`                  t         jb                  t         jd                  t         jf                  t         jh                  t         jj                  t         jl                  t         jn                  hv r| jq                  |||      S tC        d|       )az  Execute the function from the response of an openai chat completion

        Parameters:
            completion (openai.ChatCompletion): The response from an openai chat completion
            strict (bool): Whether to use strict json parsing
            mode (Mode): The openai completion mode

        Returns:
            cls (OpenAISchema): An instance of the class
        )using_inbuilt_toolserrorzNo completion choices foundr   r   r   zInvalid patch mode: )9r   ANTHROPIC_TOOLSparse_anthropic_toolsANTHROPIC_REASONING_TOOLSANTHROPIC_JSONparse_anthropic_jsonBEDROCK_JSONparse_bedrock_jsonVERTEXAI_TOOLSGEMINI_TOOLSparse_vertexai_toolsVERTEXAI_JSONparse_vertexai_jsonCOHERE_TOOLSparse_cohere_toolsGEMINI_JSONparse_gemini_jsonGENAI_STRUCTURED_OUTPUTSparse_genai_structured_outputsparse_gemini_toolsGENAI_TOOLSparse_genai_toolsCOHERE_JSON_SCHEMAparse_cohere_json_schemaWRITER_TOOLSparse_writer_toolsWRITER_JSONparse_writer_jsonRESPONSES_TOOLS"RESPONSES_TOOLS_WITH_INBUILT_TOOLSparse_responses_toolsr   r"   rF   r   r#   r   	FUNCTIONSwarn_mode_functions_deprecationparse_functionsMISTRAL_STRUCTURED_OUTPUTS parse_mistral_structured_outputsTOOLSMISTRAL_TOOLSTOOLS_STRICTCEREBRAS_TOOLSFIREWORKS_TOOLSparse_toolsJSONJSON_SCHEMAMD_JSONJSON_O1CEREBRAS_JSONFIREWORKS_JSONPERPLEXITY_JSONOPENROUTER_STRUCTURED_OUTPUTS
parse_json)r6   r   r8   r9   r}   s        r$   from_responsezOpenAISchema.from_response   s   & 4''',,Z9KVTT4'''443Q3Q+Q,,Z9KVTT4&&&++J8JFSS4$$$))*6H&QQD''):):;;++J8JKK4%%%**:7I6RR4$$$))*6H&QQ4###((5GPP400055.  4$$$))*6H&QQ4###((5GPP4***//
<NPVWW4$$$))*6H&QQ4###((5GPPD(($*Q*QRR,,"$(D,S,S$S	 -   !!z7+ !1!122:;;a ..(:+JGG4>>!002&&z3EvNN422277.  JJ  
 
 ??:/A6JJIILLLL  ..	
 	
 >>*.@&II/v677r&   r6   c                 >    | j                  |j                  ||      S Nr;   r?   r)   r6   r   r8   r9   s       r$   r   z+OpenAISchema.parse_genai_structured_outputs.  (     &&OO%7 ' 
 	
r&   c                    ddl m} t        ||j                        sJ t	        |j
                        dk(  sJ |j
                  d   j                  j                  }|D cg c]  }t        |d      r|j                  r| }}t	        |      dk(  sJ d       |d   j                  }|$J d| j                   d| j                  d           |j                  | j                  d   k(  sJ | j                  |j                  ||	      S c c}w )
Nr   )rw      thoughtzLInstructor does not support multiple function calls, use List[Model] insteadz?Please return your response as a function call with the schema z and the name r_   )objr<   r9   )google.genairw   r.   GenerateContentResponselen
candidatesr*   partsr"   r   function_callrk   r_   rB   args)	r6   r   r8   r9   rw   r   partnon_thought_partsr   s	            r$   r   zOpenAISchema.parse_genai_tools9  sL    	'*e&C&CDDD:(()Q... %%a(0066"
74+CD
 
 $%* 	
Z	
* *!,::( 	
McN_N_M``nor  pA  pA  BH  pI  oJ  K	
( !!S%6%6v%>>>>!!"",>v " 
 	

s    D
>D
c                 d    t        |d      sJ d       | j                  |j                  ||      S )Nr)   z1Completion is not of type NonStreamedChatResponser;   )r"   r?   r)   r   s       r$   r   z%OpenAISchema.parse_cohere_json_schemaX  sD     z6* 	
?	
* &&OO%7 ' 
 	
r&   c                    ddl m} t        ||      r|j                  dk(  rt	        |      |j
                  D cg c]1  }|j                  dk(  st        j                  |j                        3 }}t        t        t        t           t        dd      f         }|j                  |      d   }| j!                  |||      S c c}w )	Nr   Messager!   r   tool_user   )
min_length
max_lengthr;   )anthropic.typesr   r.   r    r   r*   r-   r@   dumpsinputr   r   listr   r   validate_pythonr?   )	r6   r   r8   r9   r   r3   
tool_callstool_calls_validator	tool_calls	            r$   r   z"OpenAISchema.parse_anthropic_toolsf  s     	,j'*z/E/E/U+JGG *4););
$%qvv?SDJJqww

 
  +d3i!!BBC 
 )88DQG	&&1& ' 
 	

s   C!Cc                 F   ddl m} d }t        |d      rA|j                  d   }|j                  dk(  rt        |      |j                  j                  }nxt        ||      sJ |j                  dk(  rt        |      |j                  D cg c]  }|j                  dk(  s| }}|d   }t        j                  d	d
|j                        }t        |      }	|r| j                  |	|d      }
|
S t!        j"                  |	d      }| j%                  ||d      }
|
S c c}w )Nr   r   r   r   r   r!   r)   z[\u0000-\u001F]r(   Tr;   Fr=   )r   r   r"   r   r#   r   r,   r*   r.   r    r-   resubr)   r   r?   r@   rA   rB   )r6   r   r8   r9   r   
last_blockr)   r3   r4   
extra_textmodelrK   s               r$   r   z!OpenAISchema.parse_anthropic_json  s&    	,
:y)#++A.J''83/
KK%%--Dj'222%%5/
KK '1&8&8MAFFf<L1MKM$RJ66,b*//BD06
++$6t , E 	 ZZ
59F&&v7IRW&XE# Ns   D"Dc                    t        |t              r|j                  d      j                  d      j                  d      d   j                  d      }t        j                  d|t        j
                        }|r|j                  d      j                         }t        j                  dd	|      j                         }n|j                  }| j                  |||
      S )Nr+   r,   r*   r   r)   z```?json(.*?)```?r   z```?json|\\nr(   r;   )r.   r/   r0   r   searchDOTALLgroupstripr   r)   r?   )r6   r   r8   r9   r)   matchs         r$   r   zOpenAISchema.parse_bedrock_json  s     j$'>>(+//	:>>yI!LPPQWXDII2D"))DE{{1~++-66/2t4::<D??D&&t5GPV&WWr&   c                    	 |j                   }	 t              }|r| j                  ||d      S t        j                  |d      }| j                  ||d      S # t        $ r` t        j                  d|j                  j
                  d   j                   d|j                  j
                  d   j                          Y w xY w# t        $ r t        d      d w xY w)	NzError response: r   z

z+Unable to extract JSON from completion textTr;   Fr=   )r)   rF   rD   rE   resultr   r#   safety_ratingsr   UnboundLocalErrorr?   r@   rA   rB   )r6   r   r8   r9   r)   r   rK   s          r$   r   zOpenAISchema.parse_gemini_json  s   	??D	V4T:J **$6t +  
 ZZ
59F%%f6HQV%WW%  	LL":#4#4#?#?#B#P#P"QQUV`VgVgVrVrstVu  WE  WE  VF  G	 ! 	VJKQUU	Vs   A C A&CCCc                     |j                   d   j                  j                  d   j                  j                  }i }|D ]
  }||   ||<    | j                  ||d      S )Nr   Fr;   )r   r*   r   r   r   rB   )r6   r   r8   r   r   fields         r$   r   z!OpenAISchema.parse_vertexai_tools  sn     ))!,44::1=KKPP	 	,E$U+E%L	, !!%1CE!RRr&   c                 >    | j                  |j                  ||      S r   r   r   s       r$   r   z OpenAISchema.parse_vertexai_json  r   r&   c                 t    t        t        |j                        }t        |      }| j	                  |||      S r   )r   rJ   r)   r   r?   )r6   r   r8   r9   r)   r   s         r$   r   zOpenAISchema.parse_cohere_tools  s>     C)06
&& 26 ' 
 	
r&   c                    |j                   d   j                  }|j                  r|j                  nd}t        |      dk(  sJ d       |d   j                  j
                  | j                  d   k(  sJ d       t        j                  |d   j                  j                        }| j                  t        |t              rt        j                  |      n|||      S )Nr   z{}r   HInstructor does not support multiple tool calls, use List[Model] insteadr_   Tool name does not matchr;   )r   r,   r   r   r{   r_   rk   r@   rA   	argumentsr?   r.   r/   r   )r6   r   r8   r9   r,   r   loaded_argss          r$   r   zOpenAISchema.parse_writer_tools  s     $$Q'//+2+=+=W''4
:!# 	
V	
# !}%%**c.?.?.GG 	
&	
G jjA!7!7!A!AB&&'1+t'DDJJ{#+& ' 
 	
r&   c                     t        |       |j                  d   j                  j                  xs d}t	        |      }|r| j                  ||d      S t        j                  |d      }| j                  ||d      S )Nr   r(   Tr;   Fr=   )	r%   r   r,   r*   r   r?   r@   rA   rB   )r6   r   r8   r9   r,   json_contentrK   s          r$   r   zOpenAISchema.parse_writer_json  s     	"*-$$Q'//77=227;**&8 +   ZZU;F%%f6HQV%WWr&   c                     |j                   d   j                  }|j                  j                  | j                  d   k(  sJ d       | j                  |j                  j                  ||      S )Nr   r_   Function name does not matchr;   )r   r,   r   r_   rk   r?   r   r6   r   r8   r9   r,   s        r$   r   zOpenAISchema.parse_functions+  sv     $$Q'//!!&&#*;*;F*CC	*)	*C&&!!++& ' 
 	
r&   r   c                 f   ddl m} |rZ|j                  D ]/  }t        ||      s|j                  | j
                  d   k(  s-|} nO t        d| j
                  d    d      |j                  d   }|j                  | j
                  d   k(  sJ d       | j                  |j                  ||      S )Nr   )ResponseFunctionToolCallr_   zYou must call z in your responser   r;   )	openai.types.responsesr   r+   r.   r_   rk   rF   r?   r   )r6   r   r8   r9   r   r   r,   s          r$   r   z"OpenAISchema.parse_responses_tools<  s     	D%,, g'?@||s'8'8'@@")	 !$S%6%6v%>$??PQ 
 !''*G 1 1& 99.-.9 &&& ' 
 	
r&   c                    |j                   d   j                  }t        |d      r |j                  J d|j                          t	        |j
                  xs g       dk(  sJ d       |j
                  d   }|j                  j                  | j                  d   k(  sJ d       | j                  |j                  j                  ||      S )	Nr   refusalz%Unable to generate a response due to r   r   r_   r   r;   )r   r,   r"   r   r   r   r{   r_   rk   r?   r   )r6   r   r8   r9   r,   r   s         r$   r   zOpenAISchema.parse_tools]  s     $$Q'// 7I&??* 77HI* 7%%+,1 	
V	
1 &&q)	##s'8'8'@@	&%	&@&&((& ' 
 	
r&   c                     |j                   rt        |j                         dkD  rt        d      |j                   d   j                  }| j	                  |j
                  ||      S )Nr   zHInstructor does not support multiple tool calls, use list[Model] insteadr   r;   )r   r   rF   r,   r?   r*   r   s        r$   r   z-OpenAISchema.parse_mistral_structured_outputsy  sk     !!S););%<q%@Z  $$Q'//&&OO%7 ' 
 	
r&   c                     t        |       t        |      }|s'|j                  d   j                  j                  xs d}t        |      }t        | |||      S )zHParse JSON mode responses using the optimized extraction and validation.r   r(   )r%   r5   r   r,   r*   r   rN   )r6   r   r8   r9   r,   r   s         r$   r   zOpenAISchema.parse_json  s]     	"*- (
3 ((+33;;ArG 37; )l<NPVWWr&   NN)N)NNF)&rI   
__module____qualname__r   r   model_configr/   rJ   r   rk   rn   r|   classmethodr   r   r
   r   boolr   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r&   r$   rP   rP   g   s@   ],<=L'
d38n '
 '
R 
c3h 
 
 c  :  8<!%ZZn8"n8 %T#s(^4n8 	n8
 n8 
n8 n8`  8<!%	
)_
"
 %T#s(^4
 	

 

 
  8<!%	
)_
"
 %T#s(^4
 	

 

 
<  8<!%	
)_
"
 %T#s(^4
 	
 
  8<!%	
)_
"
 %T#s(^4
 	

 

 
2  8<!%	))_)") %T#s(^4) 	)
 
) )V  8<!%	X)_XX %T#s(^4X 	X
 
X X$  8<!%	X)_XX %T#s(^4X 	X
 
X X8  8<
S)_
S"
S %T#s(^4
S 
	
S 
S  8<!%	
)_
"
 %T#s(^4
 	

 

 
  8<!%	

)_

"

 %T#s(^4

 	


 


 

  8<!%	
)_
"
 %T#s(^4
 	

 

 
*  8<!%	X)_X"X %T#s(^4X 	X
 
X X&  8<!%	
)_
"
 %T#s(^4
 	

 

 
   8<!%$)
)_

 %T#s(^4
 	

 "
 

 
@  8<!%	
)_
"
 %T#s(^4
 	

 

 
6  8<!%	
)_
"
 %T#s(^4
 	

 

 
"  8<!%	X)_X"X %T#s(^4X 	X
 
X Xr&   rP   c                     t        | t              st        d       t        | d      t	        t        | d      r| j                  n
t        |       | t        f            }t        t        |      S )zH
    Wrap a Pydantic model class to add OpenAISchema functionality.
    z.Class must be a subclass of pydantic.BaseModelrX   )updatedrI   )__base__)

issubclassr   	TypeErrorr   r   r"   rI   rJ   rP   r   )r6   rh   s     r$   rk   rk     sd     c9%HII $U3##C4CLL#c(<(	
F f%%r&   r   )*r@   loggingr   	functoolsr   typingr   r   r   r   r   docstring_parserr	   openai.types.chatr
   pydanticr   r   r   r   r   rH   r   instructor.moder   instructor.utilsr   r   r   r   r   	getLoggerrD   r%   rJ   r5   r-   r/   r   rN   rP   rk   rX   r&   r$   <module>r     s     	  : : " ,  <    CLy)			<	(
D# 
D$ 
Dc c : 48!		e !c3h0 TN	
 :yX9 yXx&tI &< &r&   