
    {h[N                       d dl mZ d dlZd dlZd dlZd dlZd dl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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e      Z#ejH                  dk\  reejJ                  fZ&nefZ& G d d      Z' G d d      Z(d Z)d Z*	 d	 	 	 	 	 ddZ+	 	 	 	 ddZ, G d dee#         Z- G d dee#         Z.y)    )annotationsN)AsyncGenerator	GeneratorIterable)deepcopy)cache)AnyGenericNoReturnOptionalTypeVarUnionget_args
get_origin)	from_json)	BaseModelcreate_model)	FieldInfo)Mode)extract_json_from_streamextract_json_from_stream_asyncT_Model)bound)   
   c                      e Zd Zy)MakeFieldsOptionalN__name__
__module____qualname__     W/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/instructor/dsl/partial.pyr   r   -       r#   r   c                      e Zd Zy)PartialLiteralMixinNr   r"   r#   r$   r'   r'   1   r%   r#   r'   c                0    t        j                  dd|       S )Nz[\x00-\x1F\x7F-\x9F] )resub)ss    r$   remove_control_charsr-   5   s    66)2q11r#   c                    t        | j                         xs dj                         |      } |j                  |fdd i|}|S )N{}partial_modestrict)r   stripencodemodel_validate)potential_objectr1   partial_modelkwargsobjs        r$   process_potential_objectr:   9   sK    
				!	)T113,C '-
&
&s
B4
B6
BCJr#   c                    t        |       }|5t        |       }t        fd|D              }|t        v r	t        |   S ||   S t        | t              r*t        | t              rrt        | t        f   S t        |    S | S )Nc              3  8   K   | ]  }t        |         yw)make_fields_optionalN_process_generic_arg).0tr>   s     r$   	<genexpr>z'_process_generic_arg.<locals>.<genexpr>I   s+      %

 	 !%9 %
s   )r   r   tupleUNION_ORIGINSr   
isinstancetype
issubclassr   Partialr   )argr>   
arg_originnested_argsmodified_nested_argss    `   r$   r@   r@   A   s     CJsm$ %

 !%
  
 &-...//c4 ZY%? ( //0 S\ Jr#   c                   t        |       }| j                  }t        |      Et        |      }t        |      }t	        d |D              }|rt
        ||      nd |_        d |_        nbt        |t              r3t        |t              r#t
        t        |t        f      |_        i |_        nt
        | j                     |_        d |_        |j                  |fS )Nc              3  6   K   | ]  }t        |d         yw)Tr=   Nr?   rA   rJ   s     r$   rC   z'_make_field_optional.<locals>.<genexpr>m   s       
EH 4@@
s   )r   
annotationr   r   rD   r   defaultrF   rG   rH   r   rI   r   field	tmp_fieldrQ   generic_basegeneric_argsmodified_argss         r$   _make_field_optionalrY   `   s     I!!J *)!*-
+ 
LX
 
 6BH\-01t 	 !	 
J	%*Z*K'
<N0N(OP		'(8(89	 	**r#   c                      e Zd Zeedd              Ze	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Z	e	 	 	 	 	 	 dd       Z
e	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd	       Zy
)PartialBasec                ^   t        | t              sJ | j                   d       | j                  j                  d      r| j                  nd| j                   }t	        |f| | j
                  d| j                  j                         D ci c]  \  }}|t        |       c}}S c c}}w )z>Return a partial model we can use to validate partial results.z  must be a subclass of BaseModelrI   __base__r    )	rH   r   r   
startswithr   r    model_fieldsitemsrY   )cls
model_name
field_name
field_infos       r$   get_partial_modelzPartialBase.get_partial_model   s     #y) 	
||n<=	
) ||&&y1 LL3<<.) 	 
~~
 /2.>.>.D.D.F*J
 0<<	
 	
s   B)c              +  &  K   | j                  ||      }|t        j                  t        j                  hv rt	        |      }|t        j
                  k(  r | j                  |fi |E d {    y  | j                  |fi |E d {    y 7 !7 wN)extract_jsonr   MD_JSONGEMINI_TOOLSr   WRITER_TOOLSwriter_model_from_chunksmodel_from_chunksrb   
completionmoder8   json_chunkss        r$   from_streaming_responsez#PartialBase.from_streaming_response   s      &&z48DLL$"3"3442;?K4$$$3s33KJ6JJJ,s,,[CFCCC KCs$   A)B+B,BBBBc                   K   | j                  ||      }|t        j                  k(  rt        |      }n&|t        j                  k(  r | j
                  |fi |S  | j                  |fi |S wrh   )extract_json_asyncr   rj   r   rl   writer_model_from_chunks_asyncmodel_from_chunks_asyncro   s        r$   from_streaming_response_asyncz)PartialBase.from_streaming_response_async   sn      ,,Z>4<<8EKT&&&5355kLVLL*s**;A&AAs   A+A-c              +  t  K   d}| j                         }t        | t              rdnd}|D ]  }t        |      t        |      kD  r%|j	                  d      r|j                  d      r|}n||z  }t        |j                         xs dj                         |      } |j                  |fdd i|}|  y w	Nr)   ontrailing-strings{}r/   r0   r2   
rf   rH   r'   lenr_   endswithr   r3   r4   r5   rb   rr   r8   r6   r7   r1   chunkr9   s           r$   rm   z$PartialBase.writer_model_from_chunks   s      --/s$78D>P 	 ! 	EE
S!122$$S)NN3'#(  E) !'')1T99;,C /-..sJ4J6JCI	s   B6B8c                 K   d}| j                         }t        | t              rdnd}|2 3 d {   }t        |      t        |      kD  r%|j	                  d      r|j                  d      r|}n||z  }t        |j                         xs dj                         |      } |j                  |fdd i|}| 7 6 y wrz   r   r   s           r$   rv   z*PartialBase.writer_model_from_chunks_async   s      --/s$78D>P 	 ' 	 	%E
S!122$$S)NN3'#(  E) !'')1T99;,C /-..sJ4J6JCI	;s&   )CB?B=B?B
C=B??Cc              +  @  K   d}| j                         }t        | t              rdnd}g }|D ]G  }||z  }t        |      dk  r|t	        dj                  |            z  }g }t        |||fi |}| I |r$|t	        |d         z  }t        |||fi |}| y y w)Nr)   r{   r|      r   )rf   rH   r'   r   r-   joinr:   )	rb   rr   r8   r6   r7   r1   chunk_bufferr   r9   s	            r$   rn   zPartialBase.model_from_chunks   s      --/s$78D>P 	   		EE!L< 1$ 4RWW\5J KKL* ,AGC I		  4\!_ EE* ,AGC I s   BBc                 K   d}| j                         }t        | t              rdnd}|2 3 d {   }||z  }t        |j	                         xs dj                         |      } |j                  |fdd i|}| V7 Q6 y w)Nr)   r{   r|   r/   r0   r2   )rf   rH   r'   r   r3   r4   r5   r   s           r$   rw   z#PartialBase.model_from_chunks_async  s      --/s$78D>P 	 ' 	 	%%!'')1T99;,C /-..sJ4J6JCI	;s&   )BBBBABBBc           	   #  	  K   | D ]  }	 |t         j                  k(  r/|j                  j                  d   j                  j
                   |t         j                  k(  rt|j                  j                  d   j                  j                  s|j                  j                  d   j                  j                  d   j                  j                   |t         j                  k(  r|j                  j                  x}r| |t         j                  k(  r|j                  j                   |t         j                  k(  r2|j                  d   j
                  j                   d   j                   |t         j"                  k(  rOt%        j&                  |j                  d   j
                  j                   d   j(                  j*                         |t         j,                  k(  r|j                   |t         j.                  k(  rQ|j                  d   j
                  j                   d   j(                  j*                  }t%        j&                  |       |t         j0                  k(  r|j                   |t         j2                  k(  rk|j                  d   j
                  j                   d   j(                  }t5        |      j7                  |      }d|v rt%        j&                  |d          n|t         j8                  t         j:                  hv r#ddlm} tA        ||      r|j                   n|j                  r|t         jB                  k(  rJt        jD                          |j                  d   j                  j(                  j                  x}rF| n@|t         jF                  t         jH                  t         jJ                  t         jL                  t         jN                  t         jP                  t         jR                  hv r*|j                  d   j                  j
                  x}r| n|t         jT                  t         jV                  t         jX                  t         jZ                  hv rZ|j                  d   j                  j                  x}rD|d   j                  j                  r+|d   j                  j                   nt]        d| d       y# t^        $ r Y w xY ww)zExtract JSON chunks from various LLM provider streaming responses.

        Each provider has a different structure for streaming responses that needs
        specific handling to extract the relevant JSON data.r   args'ResponseFunctionCallArgumentsDeltaEventMode ) is not supported for MultiTask streamingN)0r   MISTRAL_STRUCTURED_OUTPUTSdatachoicesdeltacontentMISTRAL_TOOLS
tool_callsfunction	argumentsANTHROPIC_JSONtextANTHROPIC_TOOLSpartial_jsonVERTEXAI_JSON
candidatespartsVERTEXAI_TOOLSjsondumpsfunction_callr   GENAI_STRUCTURED_OUTPUTSGENAI_TOOLSGEMINI_JSONrk   rG   to_dictRESPONSES_TOOLS"RESPONSES_TOOLS_WITH_INBUILT_TOOLSopenai.types.responsesr   rF   	FUNCTIONSwarn_mode_functions_deprecationJSONrj   JSON_SCHEMACEREBRAS_JSONFIREWORKS_JSONPERPLEXITY_JSONWRITER_JSONTOOLSTOOLS_STRICTFIREWORKS_TOOLSrl   NotImplementedErrorAttributeErrorrp   rq   r   
json_chunkfcresp	resp_dictr   s           r$   ri   zPartialBase.extract_json  s       I	EH4:::**,,Q/55===4--- ::--a066AA **,,Q/55@@CLLVVV4...%*[[%5%55z5((4///++2224---**1-55;;A>CCC4...**((+3399!<JJOO  4888**$4+++))!,44::1=KKPPB**R.(4+++**$4,,, ++A.66<<Q?MMD $T
 2 24 8I*"jj6):;;((;;  "%)PQ#kk)]]t~~-<<>).q)9)?)?)M)M)W)WW:W",,		((**++,,(("  */q)9)?)?)G)GG:G",,

)),,))	"  */q)9)?)?)J)JJ:J)!}55??&0m&<&<&F&F F1#D6)RS KI	P " s6   S;BS+S;QS+'S;+	S84S;7S88S;c           	     
  K   | 2 3 d {   }	 |t         j                  k(  r|j                  j                  x}r| |t         j                  k(  r|j                  j
                   |t         j                  k(  r0|j                  j                  d   j                  j                   |t         j                  k(  ru|j                  j                  d   j                  j                  s|j                  j                  d   j                  j                  d   j                  j                   |t         j                  k(  r3|j                  d   j                  j                   d   j                   |t         j"                  k(  rPt%        j&                  |j                  d   j                  j                   d   j(                  j*                         |t         j,                  k(  r|j                   |t         j.                  k(  rR|j                  d   j                  j                   d   j(                  j*                  }t%        j&                  |       |t         j0                  k(  r|j                   |t         j2                  k(  ri|j                  d   j                  j                   d   j(                  }t5        |      j7                  |      }d|v rt%        j&                  |d          |t         j8                  t         j:                  hv r$ddlm} tA        ||      r|j                   n|j                  r|t         jB                  k(  rKt        jD                          |j                  d   j                  j(                  j                  x}rI| nB|t         jF                  t         jH                  t         jJ                  t         jL                  t         jN                  t         jP                  t         jR                  hv r+|j                  d   j                  j                  x}r| n|t         jT                  t         jV                  t         jX                  t         jZ                  hv r[|j                  d   j                  j                  x}rE|d   j                  j                  r,|d   j                  j                   nt]        d| d      7 # t^        $ r Y w xY w6 y w)Nr   r   r   r   r   )0r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rk   rG   r   r   r   r   r   rF   r   r   r   rj   r   r   r   r   r   r   r   r   rl   r   r   r   s           r$   ru   zPartialBase.extract_json_asynce  s     & H	 H	%G4...%*[[%5%55z5((4///++2224:::**,,Q/55===4--- ::--a066AA **,,Q/55@@CLLVVV4---**1-55;;A>CCC4...**((+3399!<JJOO  4888**$4+++))!,44::1=KKPPB**R.(4+++**$4,,, ++A.66<<Q?MMD $T
 2 24 8I*"jj6):;;((;;  "%)PQ#kk)]]t~~-<<>).q)9)?)?)M)M)W)WW:W",,		((**++,,(("  */q)9)?)?)G)GG:G",,

)),,))	"  */q)9)?)?)J)JJ:J)!}55??&0m&<&<&F&F F1#D6)RS IH	N " O &sP   TTS9TTCS<.T/PS<7T9T<	T	TT		TN)returntype[T_Model])rp   Iterable[Any]rq   r   r8   r	   r   Generator[T_Model, None, None])rp   AsyncGenerator[Any, None]rq   r   r8   r	   r   AsyncGenerator[T_Model, None])rr   r   r8   r	   r   r   )rr   AsyncGenerator[str, None]r8   r	   r   r   )rp   r   rq   r   r   zGenerator[str, None, None])rp   r   rq   r   r   r   )r   r    r!   classmethodr   rf   rs   rx   rm   rv   rn   rw   staticmethodri   ru   r"   r#   r$   r[   r[      s   

  
, D&D.2D>AD	'D D 
B2
B:>
BJM
B	&
B 
B '36	' . 3?B	& . '36	' 4 3?B	&   P!P)-P	#P Pd K-K59K	"K Kr#   r[   c                  H    e Zd ZdZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 ddZy)	rI   zGenerate a new class which has PartialBase as a base class.

    Notes:
        This will enable partial validation of the model while streaming.

    Example:
        Partial[SomeModel]
    c                    t        d      )zfCannot instantiate.

        Raises:
            TypeError: Direct instantiation not allowed.
        z*Cannot instantiate abstract Partial class.)	TypeErrorrb   r   r8   s      r$   __new__zPartial.__new__  s     DEEr#   c                4    t        d| j                   d      )zYCannot subclass.

        Raises:
           TypeError: Subclassing not allowed.
        zCannot subclass z.Partial)r   r    r   s      r$   __init_subclass__zPartial.__init_subclass__  s     *3>>*:(CDDr#   c                l   d}t        |t              r|\  }}dd}|j                  j                  d      r|j                  nd|j                   }t	        |f|t
        f|j                  d|j                  j                         D ci c]  \  }}||t        |      n ||       c}}S c c}}w )a  Convert model to one that inherits from PartialBase.

        We don't make the fields optional at this point, we just wrap them with `Partial` so the names of the nested models will be
        `Partial{ModelName}`. We want the output of `model_json_schema()` to
        reflect the name change, but everything else should be the same as the
        original model. During validation, we'll generate a true partial model
        to support partially defined fields.

        Nc                ,   t        |       }| j                  }t        |      7t        |      }t        |      }t	        d |D              }|r||   nd |_        n.t        |t              rt        |t              rt        |   |_        |j                  |fS )Nc              3  2   K   | ]  }t        |        y wrh   r?   rP   s     r$   rC   zBPartial.__class_getitem__.<locals>._wrap_models.<locals>.<genexpr>  s     %XC&:3&?%Xs   )
r   rQ   r   r   rD   rF   rG   rH   r   rI   rS   s         r$   _wrap_modelsz/Partial.__class_getitem__.<locals>._wrap_models  s     I))J *%1)*5'
3 %%X<%X X 4@L/T $
 J-*Z2S'.z':	$''22r#   rI   r]   )rT   r   r   ztuple[object, FieldInfo])
rF   rD   r   r_   r   r[   r    r`   ra   rY   )rb   wrapped_classr>   r   rc   rd   re   s          r$   __class_getitem__zPartial.__class_getitem__  s      $mU+2?/M/	32 %%00; ""=1123 	 
#[1$//
 /<.H.H.N.N.P +J
 +7 )4%j12	
 	
s   
 B0N)r   objectr8   r   r   zPartial[T_Model])r   r   r8   r   r   r   )r   z>type[T_Model] | tuple[type[T_Model], type[MakeFieldsOptional]]r   r   )r   r    r!   __doc__r   r   r   r"   r#   r$   rI   rI     sh    
F
F 
F 
	
F
E
E 
E 
	
E;
U;
 
;
r#   rI   )F)rJ   r	   r>   boolr   r	   )rT   r   r   ztuple[Any, FieldInfo])/
__future__r   r   r*   systypescollections.abcr   r   r   copyr   	functoolsr   typingr	   r
   r   r   r   r   r   r   jiterr   pydanticr   r   pydantic.fieldsr   instructor.moder   instructor.utilsr   r   r   version_info	UnionTyperE   r   r'   r-   r:   r@   rY   r[   rI   r"   r#   r$   <module>r      s    #  	 
  ? ?  	 	 	  , %   U
)9
-wEOO,MHM	 		 	2 "'	 	>+++Do''" od	]
gg ]
r#   