
    {hx                       d dl mZ ddlmZ d dlZd dlZd dlmZ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 d dlZd dlZd d
lmZmZ ddlmZ  ededef         Z ede      Z ed      Zg dZ g dZ!dgZ"ee#e#f   Z$ee$   Z% G d de      Z& G d de&d      Z' G d de      Z( G d de      Z) G d de(      Z* G d d e      Z+ G d! d"e+      Z, G d# d$e+      Z-	 	 	 	 	 	 d(d%Z.	 d)	 	 	 	 	 	 	 d*d&Z/	 d+	 	 	 d,d'Z0y)-    )annotations   )ModeN)MappingHashable)	lru_cache)AnyCallableLiteralOptionalUnion	TypedDictTypeVarcast)Path)urlparse)	BaseModelFieldF.)boundKV)z
image/jpegz	image/pngz	image/gifz
image/webp)	audio/aacz
audio/flacz	audio/mp3z	audio/m4az
audio/mpegz
audio/mpgaz	audio/mp4z
audio/opusz	audio/pcm	audio/wavz
audio/webmapplication/pdfc                  "    e Zd ZU ded<   ded<   y)ImageParamsBasezLiteral['image']typestrsourceN__name__
__module____qualname____annotations__     V/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/instructor/multimodal.pyr   r   1   s    
Kr'   r   c                      e Zd ZU ded<   y)ImageParamsCacheControlTypecache_controlNr!   r&   r'   r(   r*   r*   6   s    ##r'   r*   F)totalc                  <   e Zd ZU  ed      Zded<    ed      Zded<    edd	d
      Zded<   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edd              Zeed d              Zeed!d              Zd"dZd#dZd Zy)$Imagez+URL, file path, or base64 data of the imagedescriptionUnion[str, Path]r    zMIME type of the imager   
media_typeNzBase64 encoded image dataFr1   reprUnion[str, None]datac                   t        |t              r| j                  |      r| j                  |      S |j	                  d      r| j                  |      S |j	                  d      r| j                  |      S 	 t        |      }|j                         r| j                  |      S 	 | j                  |      S t        |t              r| j                  |      S t        d      # t        $ r Y Hw xY w)z<Attempt to autodetect an image from a source string or Path.zhttp://zhttps://gs://z:Unable to determine image type or unsupported image format)
isinstancer   	is_base64from_base64
startswithfrom_urlfrom_gs_urlr   is_file	from_pathOSErrorfrom_raw_base64
ValueError)clsr    paths      r(   
autodetectzImage.autodetectC   s     fc"}}V$v..  !89||F++  )v..F|<<>==.. "
 &&v..fd#==((UVV  s   8+C" "	C.-C.c                Z    	 | j                  |      S # t        $ r t        |      cY S w xY w)a&  Safely attempt to autodetect an image from a source string or path.

        Args:
            source (Union[str,path]): The source string or path.
        Returns:
            An Image if the source is detected to be a valid image, otherwise
            the source itself as a string.
        )rH   rE   r   )rF   r    s     r(   autodetect_safelyzImage.autodetect_safely]   s/    	>>&)) 	v;	s    **c                @    t        t        j                  d|            S )Nz^data:image/[a-zA-Z]+;base64,boolrematchrF   ss     r(   r<   zImage.is_base64l       BHH=qABBr'   c                    |j                  dd      \  }}|j                  d      d   j                  d      d   }|t        vrt        d|        | |||      S )N,r   :;r   Unsupported image format: r    r3   r7   )splitVALID_MIME_TYPESrE   rF   data_uriheaderencodedr3   s        r(   r=   zImage.from_base64p   sk    "..a0\\#&q)//4Q7
--9*FGG!
 	
r'   c                   |j                  d      st        d      d|dd  }	 t        j                  |      }|j	                          |j
                  j                  d      }|t        vrt        d|       t        j                  |j                        j                  d      } | |||	      S # t        j                  $ r}t        d
      |d}~ww xY w)zK
        Create an Image instance from a Google Cloud Storage URL.
        r:   zURL must start with gs://zhttps://storage.googleapis.com/   NContent-TyperW   utf-8rX   z%We only support public images for now)r>   rE   requestsgetraise_for_statusheadersrZ   base64	b64encodecontentdecodeRequestException)rF   r\   
public_urlresponser3   r7   es          r(   r@   zImage.from_gs_url|   s    
 ""7+8996x|nE
	N||J/H%%'!))--n=J!11 #=j\!JKK##H$4$45<<WEDh:DII(( 	NDFAM	Ns   BB5 5CCCc                    	 t        j                  |      }dd l}|j                  d |      }|rd| }|t        v r | |||      S t        d|       # t        $ r}t        d      |d }~ww xY w)Nr   zimage/rX   zUnsupported image type: z(Invalid or unsupported base64 image data)rg   	b64decodeimghdrwhatrZ   rE   	Exception)rF   r7   decodedrq   img_typer3   rn   s          r(   rD   zImage.from_raw_base64   s    	Q&&t,G{{41H%hZ0
!11##-! 
 7zBCC 	QGIqP	Qs   AA A 	A/A**A/c                   | j                  |      r| j                  |      S t        |      }t        j                  |j
                        \  }}|s3	 t        j                  |d      }|j                  j                  d      }|t        vrt        d|        | ||d       S # t        j                  $ r}t        d      |d }~ww xY w)NTallow_redirectsra   zFailed to fetch image from URLrW   rX   )r<   r=   r   	mimetypes
guess_typerG   rc   headrf   rd   rk   rE   rZ   rF   url
parsed_urlr3   _rm   rn   s          r(   r?   zImage.from_url   s     ==??3''c]
!,,Z__=
AK#==dC%--11.A
 --9*FGG#*4@@ ,, K #ACJKs   2B& &C
9CC
c                   t        |      }|j                         st        d|       |j                         j                  dk(  rt        d      t        j                  t        |            \  }}|t        vrt        d|       t        j                  |j                               j                  d      } | |||      S )NzImage file not found: r   zImage file is emptyrW   rb   rX   )r   rA   FileNotFoundErrorstatst_sizerE   ry   rz   r   rZ   rg   rh   
read_bytesrj   rF   rG   r3   r   r7   s        r(   rB   zImage.from_path   s     Dz||~#&<TF$CDD99;!#233!,,SY7
A--9*FGG 1299'B$:DAAr'   c                    t        j                  |       }|j                          t        j                  |j
                        j                  d      }|S )zDCachable helper method for getting image url and encoding to base64.rb   )rc   rd   re   rg   rh   ri   rj   )r}   rm   r7   s      r(   url_to_base64zImage.url_to_base64   sD     <<$!!# 0 0188Ar'   c                    t        | j                  t              rG| j                  j                  d      r,| j                  s | j                  | j                        | _        dd| j                  | j                  ddS )Nr9   imagerg   r   r3   r7   r   r    )r;   r    r   r>   r7   r   r3   selfs    r(   to_anthropiczImage.to_anthropic   se    t{{C(&&'>?II**4;;7DI  "oo		
 	
r'   c                   |t         j                  t         j                  hv rdnd}t        | j                  t
              rx| j                  j                  d      r]| j                  | j                        sB|t         j                  t         j                  hv rd| j                  dS |d| j                  idS | j                  s$| j                  t        | j                              r| j                  xs( t        | j                        j                  dd      d   }|t         j                  t         j                  hv rdd| j                   d	| dS |dd| j                   d	| idS t        d
      )Ninput_image	image_urlr9   )r   r   r}   rT   r   data:;base64,*Image data is missing for base64 encoding.)r   RESPONSES_TOOLS"RESPONSES_TOOLS_WITH_INBUILT_TOOLSr;   r    r   r>   r<   r7   rY   r3   rE   )r   mode
image_typer7   s       r(   	to_openaizImage.to_openai   sO    ,,d.U.UVV  	 t{{C(&&'>?NN4;;/,,d.U.UVV -DKKHH *%9MNNYY$..T[[)9:99ADKK 0 6 6sA >q AD,,d.U.UVV)#((9$!H  '"'50A$)P!Q 
 IJJr'   c                r   	 ddl m} t        | j                  t
              rL| j                  j                  d      r1|j                  j                  | j                  | j                        S t        | j                  t
              ri| j                  j                  d      rN|j                  j                  t        j                  | j                        j                  | j                        S | j                  s$| j                  t        | j                              rp| j                  xs( t        | j                        j                  dd	      d	   }|j                  j                  t!        j"                  |      | j                        S t%        d
      # t        $ r}t        d      |d}~ww xY w)zJ
        Convert the Image instance to Google GenAI's API format.
        r   types^google-genai package is required for GenAI integration. Install with: pip install google-genaiNr:   r7   	mime_typer9   rT   r   r   )google.genair   ImportErrorr;   r    r   r>   Part
from_bytesr7   r3   rc   rd   ri   r<   rY   rg   rp   rE   r   r   errr7   s       r(   to_genaizImage.to_genai  s]   	* dkk3'DKK,B,B7,K::((YY// )   dkk3'DKK,B,B#-
 ::((\\$++.66// )  
 99s4;;'7899ADKK 0 6 6sA >q AD::((%%d+t )  
 IJJ9  	p	s   F 	F6%F11F6)r    
str | Pathreturnr/   )r    r2   r   zUnion[Image, str]rQ   r   r   rM   )r\   r   r   r/   )r7   r   r   r/   )r}   r   r   r/   )rG   r2   r   r/   )r}   r   r   r   r   dict[str, Any]r   r   r   r   )r"   r#   r$   r   r    r%   r3   r7   classmethodrH   rJ   r<   r=   r@   rD   r   r?   rB   staticmethodr   r   r   r   r&   r'   r(   r/   r/   :   s,   $A F  (@AJA"5ED
  W W2   C C 	
 	
 N N, Q Q$ A  A$ B  B   
"K<"Kr'   r/   c                      e Zd ZU dZ ed      Zded<    eddd	      Zd
ed<    ed      Zded<   e	dd       Z
e	dd       ZddZddZd Zy)Audioz?Represents an audio that can be loaded from a URL or file path.zURL or file path of the audior0   r2   r    NzBase64 encoded audio dataFr4   r6   r7   zMIME type of the audior   r3   c                   t        j                  |      }|j                  j                  d      }|t        v sJ ddj	                  t                      t        j                  |j                        j                  d      } | |||      S )z$Create an Audio instance from a URL.zcontent-type&Invalid audio format. Must be one of: , rb   r    r7   r3   )	rc   rd   rf   VALID_AUDIO_MIME_TYPESjoinrg   rh   ri   rj   )rF   r}   rm   content_typer7   s        r(   r?   zAudio.from_url1  s     <<$''++N;55 	
4TYY?U5V4WX	
5  0 0188A#D\BBr'   c                   t        |      }|j                         s
J d|        t        j                  t	        |            d   }|dk(  rd}|dk(  rd}|t
        v sJ ddj                  t
                      t        j                  |j                               j                  d	      } | t	        |      ||
      S )z*Create an Audio instance from a file path.zAudio file not found: r   zaudio/x-wavr   zaudio/vnd.dlna.adtsr   r   r   rb   r   )r   rA   ry   rz   r   r   r   rg   rh   r   rj   )rF   rG   r   r7   s       r(   rB   zAudio.from_path=  s     Dz||~>!7v>>~((T3A6	%#I ..#I22 	
4TYY?U5V4WX	
2  1299'B#d)$9EEr'   c                    |t         j                  t         j                  hv rt        d      d| j                  dddS )z2Convert the Audio instance to OpenAI's API format.z&OpenAI Responses doesn't support audioinput_audiowav)r7   format)r   r   )r   r   r   rE   r7   )r   r   s     r(   r   zAudio.to_openaiT  sB    D(($*Q*QRREFF "$(II?
 	
r'   c                    t        d      )NzAnthropic is not supported yet)NotImplementedErrorr   s    r(   r   zAudio.to_anthropic^  s    !"BCCr'   c                    	 ddl m} |j                  j	                  t        j                  | j                        | j                        S # t        $ r}t        d      |d}~ww xY w)zJ
        Convert the Audio instance to Google GenAI's API format.
        r   r   r   Nr   )	r   r   r   r   r   rg   rp   r7   r3   )r   r   r   s      r(   r   zAudio.to_genaia  sf    	* zz$$!!$)),oo % 
 	
  	p	s   A 	A&A!!A&)r}   r   r   r   )rG   r2   r   r   r   r   )r"   r#   r$   __doc__r   r    r%   r7   r3   r   r?   rB   r   r   r   r&   r'   r(   r   r   (  s|    I$1PQFQ"5ED
  (@AJA	C 	C F F,
D
r'   r   c                  V     e Zd ZU dZ edd      Zded<   ed	d       Zd
 fdZ	 xZ
S )ImageWithCacheControlz,Image with Anthropic prompt caching support.Nz&Optional Anthropic cache control imager0   OptionalCacheControlTyper,   c                    |d   }|j                  d      }t        j                  |      } | |j                  |j                  |j
                  |      S )Nr    r,   )r    r3   r7   r,   )rd   r/   rH   r    r3   r7   )rF   image_paramsr    r,   
base_images        r(   from_image_paramsz'ImageWithCacheControl.from_image_paramsy  sU    h'$((9%%f-
$$!,,'	
 	
r'   c                Z    t         |          }| j                  r| j                  |d<   |S )-Override Anthropic return with cache_control.r,   )superr   r,   r   result	__class__s     r(   r   z"ImageWithCacheControl.to_anthropic  s.    %'&*&8&8F?#r'   )r   r*   r   r/   r   )r"   r#   r$   r   r   r,   r%   r   r   r   __classcell__r   s   @r(   r   r   r  s<    6.3B/M+  	
 	
 r'   r   c                     e Zd ZU  ed      Zded<    edd      Zded	<    ed
dd      Zded<   edd       Z	edd       Z
edd       Zeedd              Zedd       Zeedd              Zd dZd!dZd dZd Zy
)"PDFz)URL, file path, or base64 data of the PDFr0   r   r    zMIME type of the PDFr   )r1   defaultr   r3   NzBase64 encoded PDF dataFr4   z
str | Noner7   c                   t        |t              r| j                  |      r| j                  |      S |j	                  d      r| j                  |      S 	 t        |      j                         r| j                  |      S 	 | j                  |      S t        |t              r| j                  |      S t        d      # t        $ r}t        d      |d}~wt        $ r,}|j                  dk(  rt        d      |t        d      |d}~ww xY w)a:  Attempt to autodetect a PDF from a source string or Path.
        Args:
            source (Union[str,path]): The source string or path.
        Returns:
            A PDF if the source is detected to be a valid PDF.
        Raises:
            ValueError: If the source is not detected to be a valid PDF.
        r9   zPDF file not foundN?   zPDF file name too longzUnable to read PDF filez6Unable to determine PDF type or unsupported PDF format)r;   r   r<   r=   r>   r?   r   rA   rB   r   rE   rC   errnorD   )rF   r    r   rn   s       r(   rH   zPDF.autodetect  s     fc"}}V$v..""#:;||F++C<'')==00 * &&v..%==((QRR % @ !56C? C77b=$%=>AE !:;BCs$   )B> >	DCD'DDc                @    t        t        j                  d|            S )Nz^data:application/pdf;base64,rL   rP   s     r(   r<   zPDF.is_base64  rR   r'   c                    |j                  dd      \  }}|j                  d      d   j                  d      d   }|t        vrt        d|        | |||      S )NrT   r   rU   rV   r   Unsupported PDF format: rX   )rY   VALID_PDF_MIME_TYPESrE   r[   s        r(   r=   zPDF.from_base64  sk    "..a0\\#&q)//4Q7
117
|DEE!
 	
r'   c                   t        |      }|j                         st        d|       |j                         j                  dk(  rt        d      t        j                  t        |            \  }}|t        vrt        d|       t        j                  |j                               j                  d      } | |||      S )NzPDF file not found: r   zPDF file is emptyr   rb   rX   )r   rA   r   r   r   rE   ry   rz   r   r   rg   rh   r   rj   r   s        r(   rB   zPDF.from_path  s     Dz||~#&:4&$ABB99;!#011!,,SY7
A117
|DEE 1299'B$:DAAr'   c                    	 t        j                  |      }|j                  d      r | |d|      S t        d      # t        $ r}t        d      |d }~ww xY w)Ns   %PDF-r   rX   zInvalid PDF formatz&Invalid or unsupported base64 PDF data)rg   rp   r>   rE   rs   )rF   r7   rt   rn   s       r(   rD   zPDF.from_raw_base64  sj    	N&&t,G!!(+0 
 122 	NEFAM	Ns   0> > 	AAAc                V   t        |      }t        j                  |j                        \  }}|s3	 t	        j
                  |d      }|j                  j                  d      }|t        vrt        d|        | ||d       S # t        j                  $ r}t        d      |d }~ww xY w)NTrw   ra   zFailed to fetch PDF from URLr   rX   )r   ry   rz   rG   rc   r{   rf   rd   rk   rE   r   r|   s          r(   r?   zPDF.from_url  s     c]
!,,Z__=
AH#==dC%--11.A
 117
|DEE#*4@@ ,, H !?@aGHs   2B B(B##B(c                    t        | j                  t              r6| j                  j                  d      r| j                  sd| j                  dS t        d      )Nr9   document_url)r   r   z+Mistral only supports document URLs for now)r;   r    r   r>   r7   rE   r   s    r(   
to_mistralzPDF.to_mistral  sN    t{{C(&&'>?II ' $  FGGr'   c                   |t         j                  t         j                  hv rdnd}t        | j                  t
              r| j                  j                  d      r| j                  st        j                  | j                        }t        j                  |j                        j                  d      }|t         j                  t         j                  hv r || j                  d| j                   d| dS || j                  d| j                   d| dd	S | j                  s$| j                  t        | j                              r| j                  xs( t        | j                        j!                  d
d      d   }|t         j                  t         j                  hv rO|t        | j                  t
              r| j                  nt        | j                        d| j                   d| dS |t        | j                  t
              r| j                  nt        | j                        d| j                   d| dd	S t#        d      )z$Convert to OpenAI's document format.
input_filefiler9   rb   r   r   )r   filename	file_data)r   r   )r   r   rT   r   z(PDF data is missing for base64 encoding.)r   r   r   r;   r    r   r>   r7   rc   rd   rg   rh   ri   rj   r3   r<   rY   rE   )r   r   input_file_typer7   s       r(   r   zPDF.to_openai  s    ,,d.U.UVV  	 t{{C(&&'>?II <<,D##DLL188AD,,d.U.UVV+ $#((9$!H  ,$(KK',T__,=XdV%L  YY$..T[[)9:99ADKK 0 6 6sA >q AD,,d.U.UVV+!$++s3 !%T[[)#((9$!H  , &dkk37 %)KK -',T__,=XdV%L	  GHHr'   c                   t        | j                  t              r9| j                  j                  d      r| j                  sdd| j                  ddS | j                  sjt        j                  t        | j                              j                  | _        t        j                  | j                        j                  d      | _        dd| j                  | j                  ddS )	z'Convert to Anthropic's document format.r9   documentr}   )r   r}   r   rb   rg   r   )r;   r    r   r>   r7   rc   rd   ri   rg   rh   rj   r3   r   s    r(   r   zPDF.to_anthropic6  s     t{{C(&&'>?II #!;;  99$LLT[[)9:BB	",,TYY7>>wG	 #$"&// II r'   c                   	 ddl m} t        | j                  t
              r| j                  j                  d      r| j                  st        j                  | j                        j                  }t        j                  |      j                  d      }|j                  j                  t        j                   |      | j"                        S | j                  rD|j                  j                  t        j                   | j                        | j"                        S t%        d      # t        $ r}t        d      |d }~ww xY w)Nr   r   r   r9   rb   r   zUnsupported PDF format)r   r   r   r;   r    r   r>   r7   rc   rd   ri   rg   rh   rj   r   r   rp   r3   rE   r   s       r(   r   zPDF.to_genaiR  s   	* t{{C(&&'>?II <<,44D##D)009D::((%%d+// )  
 99::((%%dii0// )  
 1221  	p	s   D+ +	E4E  E)r    r   r   r   r   )r\   r   r   r   )rG   r   r   r   )r7   r   r   r   )r}   r   r   r   r   r   )r"   r#   r$   r   r    r%   r3   r7   r   rH   r<   r=   r   rB   rD   r?   r   r   r   r   r&   r'   r(   r   r     s    +VWFJW*4EJ  T/HuUD*US S> C C 	
 	
 B  B N N A  A
H3Ij83r'   r   c                  $     e Zd ZdZd fdZ xZS )PDFWithCacheControlz*PDF with Anthropic prompt caching support.c                2    t         |          }ddi|d<   |S )r   r   	ephemeralr,   )r   r   r   s     r(   r   z PDFWithCacheControl.to_anthropics  s$    %'#);"7r'   r   )r"   r#   r$   r   r   r   r   s   @r(   r   r   p  s    4 r'   r   c                  T     e Zd Ze	 d	 	 	 	 	 	 	 dd       Zedd       Z fdZ xZS )PDFWithGenaiFilec                   ddl m} ddl}ddlm}  |       }|j
                  j                  |      }|j                  |j                  k7  rg|j                  |       |j
                  j                  |j                        }|dkD  r|dz  }nt        d      |j                  |j                  k7  rg | |j                  |j                  d	      S )
z/Create a new PDFWithGenaiFile from a file path.r   	FileStateNClient)r   namer   zFMax retries reached. File upload has been started but is still pendingrX   )google.genai.typesr   timer   r   filesuploadstateACTIVEsleeprd   r   rs   urir   )	rF   	file_pathretry_delaymax_retriesr   r   r   clientr   s	            r(   from_new_genai_filez$PDFWithGenaiFile.from_new_genai_file{  s    
 	1'||""	"2jjI,,,JJ{#<<###3DQq \  jjI,,, $((t~~DIIr'   c                8   ddl m} ddlm} ddl m}  |       }|j
                  j                  |      }|j                  |j                  j                  k(  r8|j                  |j                  k(  r | |j                  |j                  d      S t        d      )	z.Create a new PDFWithGenaiFile from a file URL.r   r   r   r   r   NrX   z%We only support uploaded PDFs for now)r   r   r   r   r   r   rd   r    
FileSourceUPLOADEDr   r   r   r   rE   )rF   	file_namer   r   r   r  r   s          r(   from_existing_genai_filez)PDFWithGenaiFile.from_existing_genai_file  s     	'0'||Y/;;%**333

iFVFV8Vxx>>  DEEr'   c                2   	 ddl m} | j                  rYt	        | j                  t
              r?d| j                  v r1|j                  j                  | j                  | j                        S t        | )         S # t        $ r}t        d      |d }~ww xY w)Nr   r   r   z7https://generativelanguage.googleapis.com/v1beta/files/)file_urir   )r   r   r   r    r;   r   r   from_urir3   r   r   )r   r   r   r   s      r(   r   zPDFWithGenaiFile.to_genai  s    	* KK4;;,IT[[X::&&// '  
 w!!  	p	s   A< <	BBB)
      )r   r   r   intr   r  r   r   )r  r   r   r   )r"   r#   r$   r   r  r  r   r   r   s   @r(   r   r   z  s^    GIJJ*-JADJ	J J, F F"" "r'   r   c                   t        | t              r| S t        | t        t        t        f      st        | t
              r| g} g }|t        j                  t        j                  hv rdnd}| D ]m  }t        |t              r|j                  ||d       )t        |t
              r|j                  |       Kt        |t        t        t        f      r|t        j                  t        j                  t        j                  hv r |j                  |j                                |t        j                  t        j                  hv rt!        d      |t        j"                  t        j$                  hv r1t        |t              r!|j                  |j'                                7|j                  |j)                  |             Yt+        dt-        |              |S )zLConvert content items to the appropriate format based on the specified mode.
input_texttext)r   r  zGemini is not supported yetUnsupported content type: )r;   r   r/   r   r   dictr   r   r   appendANTHROPIC_JSONANTHROPIC_TOOLSANTHROPIC_REASONING_TOOLSr   GEMINI_JSONGEMINI_TOOLSr   MISTRAL_STRUCTURED_OUTPUTSMISTRAL_TOOLSr   r   rE   r   )contentsr   converted_contentstext_file_typeri   s        r(   convert_contentsr    s    (C (UE3/0Jx4N:=? D(($*Q*QRR 	 
  Kgs#%%~w&OP&%%g.%!45##$$.. 
 #))'*>*>*@A$**D,=,=>>)*GHH//""  Ws,"))'*<*<*>?"))'*;*;D*AB9$w-IJJ-K. r'   c           
     l   g }d	d}| D ]  }d|v r*|d   dv r|j                  |       nt        d|d          |d   }|d   xs g }|j                         D 	ci c]  \  }}	|dvs||	 }
}}	|rt        |t              rg }|D ]  }t        |t
              r%|j                  t        j                  |             8 ||      r3|j                  t        j                  t        t        |                   s|j                  |        |}nQt        |t
              rt        j                  |      }n+ ||      r#t        j                  t        t        |            }t        |t
              r|j                  ||d|
       t        ||      }|j                  ||d|
        |S c c}	}w )
zGConvert messages to the appropriate format based on the specified mode.c                Z    t        | t              xr | j                  d      dk(  xr d| v S )Nr   r   r    )r;   r  rd   )xs    r(   is_image_paramsz)convert_messages.<locals>.is_image_params  s+    !T"QquuV}'?QHPQMQr'   r   >   audior   zUnsupported message type: roleri   )r$  ri   r   )r$  ri   )r!  r	   r   rM   )r  rE   itemsr;   listr   r/   rJ   r   r   r   r*   r  )messagesr   autodetect_imagesconverted_messagesr"  messager$  ri   kvother_kwargsnew_contentitemconverted_contents                 r(   convert_messagesr1    s   " R  (Wv"44"))'2 #=gfo=N!OPPv)$*$]]_
Q9T0TAqD
 
 '4(JL# 
1D!$,#**5+B+B4+HI(.#**1CC $[$ 7 $**40
1 &GS)11': )/AAg. gs#%%'B\B !1$ ?%%*;L|LM(R C
s   F0)F0c                   ddl m} g }| D ]E  }t        ||j                        r|j	                  |       ,t        ||j
                        st        dt        |       d      t        |j
                  |      }g }|j                  st        d      |j                  D ]  }|j                  rc|rat        j                  |j                        }t        |t              r |j	                  |j                                `|j	                  |       r|j	                  |        |j	                  |j                  ||j                               H |S )zL
    Convert Typed Contents to the appropriate format for Google GenAI.
    r   r   r  z/. This should only be used for the Google typeszContent parts are empty)partsr$  )r   r   r;   Filer  ContentrE   r   r   r3  r  r/   rJ   r   r$  )r  r(  r   r   ri   r  content_partconverted_items           r(    extract_genai_multimodal_contentr8  +  s7    #57F "Rguzz*MM'" '5==1,T']O;jk  u}}g./1}}677 $MM 	8L  %6!&!8!89J9J!K ne4&--n.E.E.GH #)),7")),7	8 	emm*<7<<mPQE"RH Mr'   )r  zXUnion[str, dict[str, Any], Image, Audio, list[Union[str, dict[str, Any], Image, Audio]]]r   r   r   z Union[str, list[dict[str, Any]]])F)r'  zilist[dict[str, Union[str, dict[str, Any], Image, Audio, list[Union[str, dict[str, Any], Image, Audio]]]]]r   r   r(  rM   r   zlist[dict[str, Any]])T)r  z	list[Any]r(  rM   )1
__future__r   r   r   rg   rN   collections.abcr   r   	functoolsr   typingr	   r
   r   r   r   r   r   r   pathlibr   urllib.parser   ry   rc   pydanticr   r   r   r   r   rZ   r   r   r   r+   r   r   r*   r/   r   r   r   r   r   r  r1  r8  r&   r'   r(   <module>r@     sz   "   	 - 	 	 	  !   % CxS)*Cx CL J   ** 38$ #$45 i 
$/ $kKI kK\G
I G
TE 6`3) `3F# <"s <"~-- - &-| $?? ? ? ?H #...r'   