
    {hS:              
           d dl mZmZmZ d dlmZmZmZmZm	Z	m
Z
m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  G d d	      Z	 	 dd
ee   dee   dee   dee   fdZy)    )AsyncGenerator	GeneratorIterable)AnyClassVarOptionalcast
get_originget_argsUnionN)	BaseModelFieldcreate_model)OpenAISchema)Mode)extract_json_from_streamextract_json_from_stream_asyncc                      e Zd ZU dZeeee         ed<   e	de
e   dededeeddf   fd       Ze	deedf   dededeedf   fd       Ze	d	eedf   dedeedf   fd
       Ze	d	e
e   dedeeddf   fd       Ze	d	eedf   dedeedf   fd       Ze	dedefd       Zede
e   dedeeddf   fd       Zedeedf   dedeedf   fd       Zedededeee   ef   fd       Zy)IterableBaseN	task_type
completionmodekwargsreturnc              +     K   | j                  ||      }|t        j                  t        j                  hv rt	        |      }|t        j
                  t        j                  hv r[t        |      }|sy t        j                  |      }|d   sy |d   D ]*  } | j                  t        j                  |      fi | ,  | j                  |fi |E d {    y 7 w)Ntasks)extract_jsonr   MD_JSONGEMINI_TOOLSr   VERTEXAI_TOOLSMISTRAL_TOOLSnextjsonloadsextract_cls_task_typedumpstasks_from_chunks)clsr   r   r   json_chunksresponsejson_responseitems           X/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/instructor/dsl/iterable.pyfrom_streaming_responsez$IterableBase.from_streaming_response   s      &&z48DLL$"3"3442;?KD''););<<K(H JJx0M )%g. L/c//

40@KFKKL )3((????s   CCCCc                    K   | j                  ||      }|t        j                  k(  rt        |      }|t        j                  t        j
                  hv r | j                  |fi |S  | j                  |fi |S w)N)extract_json_asyncr   r   r   r!   r    tasks_from_mistral_chunkstasks_from_chunks_async)r(   r   r   r   r)   s        r-   from_streaming_response_asyncz*IterableBase.from_streaming_response_async$   sy      ,,Z>4<<8EKD&&(;(;<<0300GGG*s**;A&AAs   A9A;r)   c                   K   |2 3 d{   }|st        j                  |      }|d   s'|d   D ]-  } | j                  t        j                  |      fi |}| / ]7 X6 yw)zProcess streaming chunks from Mistral and VertexAI.

        Handles the specific JSON format used by these providers when streaming.Nr   )r#   r$   r%   r&   )r(   r)   r   chunkr+   r,   objs          r-   r1   z&IterableBase.tasks_from_mistral_chunks2   sw      ' 		 		% JJu-M )%g. /c//

40@KFK			;s&   A&A$A"A$AA&"A$$A&c              +      K   d}d}|D ]e  }||z  }|sd|v rd}||j                  d      dz   d  }	 | j                  |d      \  }}|r&| j                  J  | j                  |fi |}| nf? y wNF [T   r   find
get_objectr   r%   r(   r)   r   startedpotential_objectr5   	task_jsonr6   s           r-   r'   zIterableBase.tasks_from_chunksE   s        	E%%<"G',UZZ_q-@-B'C$.1nn=Mq.Q+	+==4443#33IHHCI 	s   A0A2c                   K   d}d}|2 3 d {   }||z  }|sd|v rd}||j                  d      dz   d  }	 | j                  |d      \  }}|r'| j                  J  | j                  |fi |}| nm@7 i6 y wr8   r<   r?   s           r-   r2   z$IterableBase.tasks_from_chunks_async[   s      & 	 	%%%<"G',UZZ_q-@-B'C$.1nn=Mq.Q+	+==4443#33IHHCI 	;s&   A;A9A7A9A&A;7A99A;rB   c                 J   | j                   J t        | j                         t        u r4t        | j                         }|D ]  }	  |j                  |fi |}|c S  n | j                   j                  |fi |S t        d| d| j                          # t
        $ r Y `w xY w)Nz!Failed to extract task type with z for )r   r
   r   r   model_validate_json	Exception
ValueError)r(   rB   r   union_membersmemberr6   s         r-   r%   z"IterableBase.extract_cls_task_typeq   s     }}(((cmm$-$S]]3M' 4&44YI&ICJ 53==44YI&II/	{%O
 	
	 ! s   B	B"!B"c           	   #   :
  K   | D ]  }	 |t         j                  k(  r|j                  j                  x}r| |t         j                  k(  r|j                  j
                   |t         j                  k(  r|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"                  j$                  d   j                  j                   |t         j&                  k(  ru|j"                  j$                  d   j                  j(                  s|j"                  j$                  d   j                  j(                  d   j*                  j,                   |t         j.                  hv rOt        j                  |j                  d   j                  j                  d   j                  j                         |t         j0                  hv r2|j                  d   j                  j                  d   j                   |t         j2                  hv rh|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(  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,                  +|d   j*                  j,                   nt]        d| d       y # t^        $ r Y w xY ww)Nr   args'ResponseFunctionCallArgumentsDeltaEventMode ) is not supported for MultiTask streaming)0r   ANTHROPIC_JSONdeltatextANTHROPIC_TOOLSpartial_jsonGEMINI_JSONVERTEXAI_JSON
candidatescontentpartsr    r#   r&   function_callrK   MISTRAL_STRUCTURED_OUTPUTSdatachoicesr!   
tool_callsfunction	argumentsGENAI_TOOLSGENAI_STRUCTURED_OUTPUTSr   typeto_dictRESPONSES_TOOLS"RESPONSES_TOOLS_WITH_INBUILT_TOOLSopenai.types.responsesrM   
isinstance	FUNCTIONSwarn_mode_functions_deprecationJSONr   JSON_SCHEMACEREBRAS_JSONFIREWORKS_JSONPERPLEXITY_JSONWRITER_JSONTOOLSTOOLS_STRICTFIREWORKS_TOOLSWRITER_TOOLSNotImplementedErrorAttributeError)r   r   r5   
json_chunkresp	resp_dictrM   s          r-   r   zIterableBase.extract_json   s#       L	EK4...%*[[%5%55z5((4///++2224+++**$4---**1-55;;A>CCC4...**((+3399!<JJOO  4:::**,,Q/55===4--- ::--a066AA **,,Q/55@@CLLVVVD,,--**((+3399!<JJOO  D99::**1-55;;A>CCCD--.. ++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??K&0m&<&<&F&F F1#D6)RS QL	V " s6   TF$T.T0MTT	TTTTc           	       K   | 2 3 d {   }	 |t         j                  k(  r|j                  j                  x}r| |t         j                  k(  r|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(  r0|j                   j"                  d   j                  j                   |t         j$                  k(  rv|j                   j"                  d   j                  j&                  s|j                   j"                  d   j                  j&                  d   j(                  j*                   |t         j,                  k(  r|j                   |t         j.                  hv rPt        j                  |j                  d   j                  j                  d   j                  j                         |t         j0                  t         j2                  hv r$ddlm} t9        ||      r|j                   n|j"                  r|t         j:                  k(  rKt        j<                          |j"                  d   j                  j                  j*                  x}rI| nB|t         j>                  t         j@                  t         jB                  t         jD                  t         jF                  t         jH                  t         jJ                  hv r+|j"                  d   j                  j                  x}r| n|t         jL                  t         jN                  t         jP                  t         jR                  hv r[|j"                  d   j                  j&                  x}rE|d   j(                  j*                  ,|d   j(                  j*                   ntU        d| d      U7 Q# tV        $ r Y dw xY w6 y w)Nr   rL   rN   rO   ),r   rP   rQ   rR   rS   rT   rV   rW   rX   rY   r    r#   r&   rZ   rK   r[   r\   r]   r!   r^   r_   r`   rb   ra   re   rf   rg   rM   rh   ri   rj   rk   r   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   )r   r   r5   rw   rM   s        r-   r0   zIterableBase.extract_json_async   s     & A	 A	%@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:::**,,Q/55===4--- ::--a066AA **,,Q/55@@CLLVVV4888**$D,,--**((+3399!<JJOO  ((;;  "%)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??K&0m&<&<&F&F F1#D6)RS {A	@ " A &sP   Q/Q-QQ-Q/FQQ/J?QQ/Q-	Q*&Q/)Q**Q/sstackc                     | j                  d      }t        |       D ]1  \  }}|dk(  r|dz  }|dk(  s|dz  }|dk(  s!| ||dz    | |dz   d  fc S  d | fS )N{r;   }r      )r=   	enumerate)r{   r|   start_indexics        r-   r>   zIterableBase.get_object  sx    ffSkaL 	>DAqCx
Cx
A:[1q511QUW:==	> Qw    )__name__
__module____qualname__r   r   r   rc   r   __annotations__classmethodr   r   r   r   r.   r   r3   strr1   r'   r2   r%   staticmethodr   r0   inttupler>    r   r-   r   r   
   sH   59Ixi129@!#@.2@>A@	9dD(	)@ @, B'T	2B:>BJMB		4	(B B (d3?B		4	( $ "3-36	9dD(	) * (d3?B		4	( * 

 
 
( OSMO)-O	3d?	#O Ob D"39-D59D	T		"D DL 	c 	# 	%s0B*C 	 	r   r   subtask_classnamedescriptionr   c                 f   || j                   n|}d| }t        |    t        t        dd| d      f}t        t        t
        t           df   t        t        f      }t        |||      }t        t
        t           |      }| |_
        |d| dn||_        t        |t              sJ d	       |S )
a-  
    Dynamically create a IterableModel OpenAISchema that can be used to segment multiple
    tasks given a base class. This creates class that can be used to create a toolkit
    for a specific task, names and descriptions are automatically generated. However
    they can be overridden.

    ## Usage

    ```python
    from pydantic import BaseModel, Field
    from instructor import IterableModel

    class User(BaseModel):
        name: str = Field(description="The name of the person")
        age: int = Field(description="The age of the person")
        role: str = Field(description="The role of the person")

    MultiUser = IterableModel(User)
    ```

    ## Result

    ```python
    class MultiUser(OpenAISchema, MultiTaskBase):
        tasks: List[User] = Field(
            default_factory=list,
            repr=False,
            description="Correctly segmented list of `User` tasks",
        )

        @classmethod
        def from_streaming_response(cls, completion) -> Generator[User]:
            '''
            Parse the streaming response from OpenAI and yield a `User` object
            for each task in the response
            '''
            json_chunks = cls.extract_json(completion)
            yield from cls.tasks_from_chunks(json_chunks)
    ```

    Parameters:
        subtask_class (Type[OpenAISchema]): The base class to use for the MultiTask
        name (Optional[str]): The name of the MultiTask class, if None then the name
            of the subtask class is used as `Multi{subtask_class.__name__}`
        description (Optional[str]): The description of the MultiTask class, if None
            then the description is set to `Correct segmentation of `{subtask_class.__name__}` tasks`

    Returns:
        schema (OpenAISchema): A new class that can be used to segment multiple tasks
    r   FzCorrectly segmented list of `z` tasks)default_factoryreprr   .)r   __base__zCorrect segmentation of `z2The new class should be a subclass of OpenAISchema)r   listr   r	   r   rc   r   r   r   r   r   __doc__
issubclass)r   r   r   	task_name
list_tasksbase_modelsnew_clss          r-   IterableModelr   ,  s    n +/,&&DIi[!D 	] 7	{'J	
J uT)_c12\<4PQKG
 4%w/G &G  $I;g6 O
 g|, <, Nr   )NN)collections.abcr   r   r   typingr   r   r   r	   r
   r   r   r#   pydanticr   r   r   instructor.function_callsr   instructor.moder   instructor.utilsr   r   r   rc   r   r   r   r   r-   <module>r      sy    ? ? M M M  3 3 2   U_ _H	 !%W	?W
3-W #W 
)_	Wr   