
    6iw                        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mZmZmZmZ ddlmZmZmZ ddlmZ dd	lmZmZ d
dlmZmZmZ  e	d      Z  e	de      Z! ejD                  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)ChatCompletion)	BaseModel
ConfigDictFieldTypeAdaptercreate_model   )IncompleteOutputExceptionResponseParsingErrorConfigurationError)Mode)classpropertyextract_json_from_codeblock   )generate_openai_schemagenerate_anthropic_schemagenerate_gemini_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    o/root/.openclaw/workspace/visionaryfx/venv/lib/python3.12/site-packages/instructor/processing/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!   r1   r/   r.   type
isinstancedictgetAttributeError
IndexError)r   ctext_blockss      r)   _extract_text_contentr:   7   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                    	 t        | d      rA|r| j                  ||d      S t        j                  |d      }| j	                  ||d      S t        |       }|r|j                  ||d      S t        j                  |d      }|j                  ||d      S # t        j                  $ r}t        j                  d|         d}~wt        $ r}t        j                  d|         d}~ww xY w)	z@Validate model from JSON string with appropriate error handling.model_validate_jsonTcontextr>   Fr>   zJSON decode error: NzModel validation error: )r'   r@   jsonloadsmodel_validater   validate_jsonvalidate_pythonJSONDecodeErrorloggerdebug	Exception)r;   r<   r=   r>   parsedadapteres          r)   _validate_model_from_jsonrP   Q   s   3-...&8 /   ZZ7F%%f6HQV%WWc"(("4T )   HU3&&v7IRW&XX *1#./ /s34s4   !B *B  B 0*B C1.CC1C,,C1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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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                     t        |       S )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   r;   s    r)   openai_schemazOpenAISchema.openai_schemau   s     &c**r+   c                     t        |       S N)r   rU   s    r)   anthropic_schemazOpenAISchema.anthropic_schema   s     )--r+   c                     t        |       S rX   )r   rU   s    r)   gemini_schemazOpenAISchema.gemini_schema   s     &c**r+   Nr   r=   r>   modec           	         |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                  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         j0                  k(  r| j3                  |||      S |t         j4                  k(  r| j7                  |||      S |t         j8                  k(  r| j;                  |||      S |t         j<                  t         j>                  hv r| jA                  |||      S |jB                  sGtE        |d      r$tG        d|jH                   tK        |      |      tG        dtK        |      |      |jB                  d   jL                  dk(  rtO        |      |t         jP                  k(  r't        jR                          | jU                  |||      S |t         jV                  k(  r| jY                  |||      S |t         jZ                  t         j\                  t         j^                  t         j`                  t         jb                  hv r| je                  |||      S |t         jf                  t         jh                  t         jj                  t         jl                  t         jn                  t         jp                  t         jr                  t         jt                  hv r| jw                  |||      S ty        d| 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
        errorzLLM provider returned error: r\   raw_responsez+No completion choices found in LLM responser   r"   r#   zInvalid or unsupported mode: z8. This mode may not be implemented for response parsing.)=r   ANTHROPIC_TOOLSparse_anthropic_toolsANTHROPIC_REASONING_TOOLSANTHROPIC_JSONparse_anthropic_jsonBEDROCK_JSONparse_bedrock_jsonBEDROCK_TOOLSparse_bedrock_tools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'   r   r^   strr(   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_jsonr   )r;   r   r=   r>   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4%%%**:7I6RR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,,"  !!z7+*3J4D4D3EFT!+  '=Y'  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 +D61ij
 	
r+   r;   c                 >    | j                  |j                  ||      S NrA   r@   r.   r;   r   r=   r>   s       r)   rt   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   )typesr   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 name)objrB   r>   )google.genair   r3   GenerateContentResponselen
candidatesr/   partsr'   r   function_callrV   r   rF   args)	r;   r   r=   r>   r   r   partnon_thought_partsr   s	            r)   rw   zOpenAISchema.parse_genai_tools  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                    t        |d      r|j                  }nt        |d      rt        |j                  d      r|j                  j                  }|r^t	        |      dkD  rPd }|D ]9  }t        |d      s|j
                  dk(  s t        |d      s-|j                  } n |6t        dd|      t        d	d|      t        d
t        |       d|      | j                  |||      S )Nr.   r1   r/   r   r2   +Cohere V2 response has no text content itemrx   r_   !Cohere V2 response has no contentz`Unsupported Cohere response format. Expected 'text' (V1) or 'message.content[].text' (V2), got: rA   )r'   r.   r1   r/   r   r2   r   r@   )r;   r   r=   r>   r.   content_itemsitems          r)   ry   z%OpenAISchema.parse_cohere_json_schema3  s    :v&??DZ+
8J8JI0V '..66M]!3a!7 ) Df- II/#D&1#yy <.E1%/  +7-!+  '77;J7G6HJ)'	  &&t5GPV&WWr+   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_lengthrA   )anthropic.typesr   r3   r%   r   r/   r2   rD   dumpsinputr   r   listr   r   rH   r@   )	r;   r   r=   r>   r   r8   
tool_callstool_calls_validator	tool_calls	            r)   rb   z"OpenAISchema.parse_anthropic_toolse  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                    ddl m} d }t        |d      rA|j                  d   }|j                  dk(  rt        |      |j                  j                  }nct        ||      sJ |j                  dk(  rt        |      |j                  D cg c]  }|j                  dk(  s| }}|d   }|j                  }t        |      }	|r| j                  |	|d	
      }
|
S t        j                  |	d      }| j!                  ||d
      }
|
S c c}w )Nr   r   r!   r"   r#   r&   r.   TrA   FrC   )r   r   r'   r!   r(   r   r1   r/   r3   r%   r2   r.   r   r@   rD   rE   rF   )r;   r   r=   r>   r   
last_blockr.   r8   r9   
extra_textmodelrM   s               r)   re   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??D06
++$6t , E 	 ZZ
59F&&v7IRW&XE! Ns   D	"D	c                    t        |t              r|d   d   d   }t        d |D        d       }|st        dd|      |d   }t	        j
                  d	|t        j                        }|r|j                  d
      j                         }t	        j                  dd|      j                         }n|j                  }| j                  |||      S )Nr0   r1   r/   c              3   *   K   | ]  }d |v s|  yw)r.   N ).0r8   s     r)   	<genexpr>z2OpenAISchema.parse_bedrock_json.<locals>.<genexpr>  s      Cqv{ Cs   	z=Unexpected format. No text content found in Bedrock response.rf   r_   r.   z```?json(.*?)```?r   z```?json|\\nr-   rA   )r3   r4   nextr   researchDOTALLgroupstripsubr.   r@   )r;   r   r=   r>   r/   text_contentr.   matchs           r)   rg   zOpenAISchema.parse_bedrock_json  s     j$' *95i@G CG CTJL*S'!+ 
  'DII2D"))DE{{1~++-66/2t4::<D??D&&t5GPV&WWr+   c                    t        |t              r|j                  di       j                  di       }|j                  dg       }|D ]u  }d|v s|d   }|j                  d      | j                  k(  s&J d| j                   d|j                  d              | j	                  |j                  di       ||	      c S  t        d
d|      | j                  |j                  ||	      S )Nr0   r1   r/   toolUser   zTool name mismatch: expected z, got r   rA   z%No tool use found in Bedrock responserh   r_   )r3   r4   r5   __name__rF   r   r@   r.   )r;   r   r=   r>   r1   r/   content_blockr   s           r)   ri   z OpenAISchema.parse_bedrock_tools  s    j$' nnXr266y"EGkk)R0G ") 
-,Y7H#<</3<<? 7~VHLLY_L`Kab? -- Wb1 2% .  
 '7$'  **);F +  r+   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|      d w xY w)NzError response: r   z

zYUnable to extract JSON from completion text. The response may have been blocked or empty.rq   r_   TrA   FrC   )r.   
ValueErrorrJ   rK   resultr   r(   safety_ratingsr   UnboundLocalErrorr   r@   rD   rE   rF   )r;   r   r=   r>   r.   r   rM   s          r)   rr   zOpenAISchema.parse_gemini_json  s
   	??D	4T:J **$6t +  
 ZZ
59F%%f6HQV%WW-  	LL":#4#4#?#?#B#P#P"QQUV`VgVgVrVrstVu  WE  WE  VF  G	 ! 	&k"' 		s   A C A&CCC c                     |j                   d   j                  j                  d   j                  j                  }i }|D ]
  }||   ||<    | j                  ||d      S )Nr   FrA   )r   r/   r   r   r   rF   )r;   r   r=   r   r   fields         r)   rl   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)   rn   z OpenAISchema.parse_vertexai_json  r   r+   c                    t        |d      r9|j                  r-|j                  d   }| j                  |j                  ||      S t        |d      rt        |j                  d      rm|j                  j                  rW|j                  j                  d   }ddl} |j                  |j                  j                        }| j                  |||      S t        |d      r|j                  }nt        |d      rt        |j                  d      r|j                  j                  }|r^t        |      dkD  rPd}|D ]9  }	t        |	d      s|	j                  dk(  s t        |	d      s-|	j                  } n |6t        d	d
|      t        dd
|      t        dt        |       d
|      t        |      }
| j                  |
||      S )a{  
        Parse Cohere tools response.

        Supports:
        - V1 native tool calls: completion.tool_calls[0].parameters
        - V2 native tool calls: completion.message.tool_calls[0].function.arguments (JSON string)
        - V1 text-based: completion.text (prompt-based approach)
        - V2 text-based: completion.message.content[].text (prompt-based approach)
        r   r   rA   r1   Nr.   r/   r2   r   ro   r_   r   zNUnsupported Cohere response format. Expected tool_calls or text content. Got: )r'   r   rF   
parametersr1   rD   rE   function	argumentsr.   r/   r   r2   r   r   r@   )r;   r   r=   r>   r   rD   r   r.   r   r   r   s              r)   rp   zOpenAISchema.parse_cohere_tools"  s   $ :|,1F1F"--a0I%%$$.@ &   J	*
**L9""-- #**55a8I"

9#5#5#?#?@I%%#5f &   :v&??DZ+
8J8JI0V '..66M]!3a!7) Df- II/#D&1#yy <.E+%/  +7'!+  'Z()+#'	  1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 matchrA   )r!   r1   r   r   r   r   rV   rD   rE   r   r@   r3   r4   r   )r;   r   r=   r>   r1   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-   TrA   FrC   )	r*   r!   r1   r/   r   r@   rD   rE   rF   )r;   r   r=   r>   r1   json_contentrM   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   zFunction name does not matchrA   )r!   r1   r   r   rV   r@   r   r;   r   r=   r>   r1   s        r)   r   zOpenAISchema.parse_functions  sv     $$Q'//!!&&#*;*;F*CC	*)	*C&&!!++& ' 
 	
r+   c                    ddl m} d }|j                  D ]/  }t        ||      s|j                  | j
                  d   k(  s-|} n |st        d| j
                  d    dd|      | j                  |j                  ||      S )	Nr   )ResponseFunctionToolCallr   zRequired tool call 'z' not found in responser~   r_   rA   )	openai.types.responsesr   r0   r3   r   rV   r   r@   r   )r;   r   r=   r>   r   tool_call_messager1   s          r)   r   z"OpenAISchema.parse_responses_tools  s     	D !(( 	G'#;<<<3#4#4V#<<(/%		
 !&&s'8'8'@&AAXY&'  &&''& ' 
 	
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   rA   )r!   r1   r'   r   r   r   r   r   rV   r@   r   )r;   r   r=   r>   r1   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   zInstructor does not support multiple tool calls in MISTRAL_STRUCTURED_OUTPUTS mode. Use list[Model] instead to handle multiple items.r   rA   )r!   r   r   r1   r@   r/   r   s        r)   r   z-OpenAISchema.parse_mistral_structured_outputs  sn     !!S););%<q%@$D 
 $$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*   r:   r!   r1   r/   r   rP   )r;   r   r=   r>   r1   r   s         r)   r   zOpenAISchema.parse_json  s]     	"*- (
3 ((+33;;ArG 37; )l<NPVWWr+   NNrX   )'r   
__module____qualname__r   r   model_configr4   r   r   rV   rY   r[   classmethodr   r   r	   r   boolr
   r   r2   rt   rw   ry   rb   re   rg   ri   rr   rl   rn   rp   r{   r}   r   r   r   r   r   r   r+   r)   rR   rR   q   s   ],<=L
+d38n 
+ 
+ .c3h . . +c + +  8<!%ZZz
"z
 %T#s(^4z
 	z

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

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

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

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

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

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

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

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

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

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

 

 
$  8<!%	X)_X"X %T#s(^4X 	X
 
X Xr+   rR   c                    t        | t              s!t        dt        |       j                          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:response_model must be a Pydantic BaseModel subclass, got r   )updatedr   )__base__)
issubclassr
   r   r2   r   r   r   r'   r   rR   r   )r;   schemas     r)   rV   rV     sz     c9% HcI[I[H\]
 	

 $U3##C4CLL#c(<(	
F f%%r+   r   )-rD   loggingr   	functoolsr   typingr   r   r   r   r   openai.types.chatr	   pydanticr
   r   r   r   r   core.exceptionsr   r   r   r\   r   utilsr   r   r   r   r   r   r   r   	getLoggerrJ   r*   r   r:   r2   r4   r   rP   rR   rV   r   r+   r)   <module>r     s     	  : : ,  
   CLy)			<	(
D# 
D$ 
Dc c : 48!		c !c3h0 TN	
 	@e
X9 e
XP&tI &< &r+   