
    A'h.                        d dl Z d dlmZ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mZ d dl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 d dlmZm Z  d dl!m!Z! d dl"m#Z#  e jH                  e%      Z&	 ddee   de'de	e(ee(ef   f   fdZ)de(de*deee(   e*f   fdZ+	 	 ddee   dee   de'de'de	eee   f   f
dZ, e!d       G d dee                Z-y)    N)	AnyDict	GeneratorListOptionalTupleTypeUnioncast)ValidationError)resolve_tool_choice)LLM)BaseLLMFunctionProgram)create_list_model)BasePromptTemplatePromptTemplate)Settings)Model)OpenAI)OpenAIToolCallto_openai_tool)
deprecated)parse_partial_json
output_clsallow_multiplereturnc                 D    |ry| j                         }t        |d         S )zDefault OpenAI tool to choose.autotitle)schemar   )r   r   r    s      f/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/llama_index/program/openai/base.py_default_tool_choicer"      s'     ""$"6'?33    raw_str	start_idxc                     | |d } d}t        |       D ]1  \  }}|dk(  r|dz  }|dk(  s|dz  }|dk(  s!| d|dz    |dz   |z   fc S  d|fS )z1Extract JSON str from raw string and start index.Nr   {   }   )	enumerate)r$   r%   stack_countics        r!   _get_json_strr/       s    ij!GK'" ;181K81KawQ'Q):::; ?r#   
tool_callsverbosec                    g }| D ]  }|j                   }|J |j                  J |j                  J |r)|j                  }|j                  }t        d| d|        t	        |j                  t
              r|j                  |j                        }	n|j                  |j                        }	|j                  |	        |r|S t        |      dkD  rt        j                  d       |d   S )NzFunction call: z with args: r(   ziMultiple outputs found, returning first one. If you want to return all outputs, set output_multiple=True.r   )functionname	argumentsprint
isinstancedict	parse_obj	parse_rawappendlen_loggerwarning)
r0   r   r   r1   outputs	tool_callfunction_callr4   arguments_stroutputs
             r!   _parse_tool_callsrD   /   s     G 	!**(((!!---&&222 %%D)33MOD6m_EFm--t4))-*A*ABF))-*A*ABFv!$ w<!OOO
 qzr#   z,Please use `FunctionCallingProgram` instead.c                   (   e Zd ZdZ	 	 ddee   dededee	e
e	ef   f   dededd	fd
Ze	 	 	 	 	 	 ddee   dee	   dee   dee   dededeee	e
e	ef   f      dedd fd       Zedee   fd       Zedefd       Zej*                  dedd	fd       Z	 ddee
e	ef      dededeeee   f   fdZ	 ddee
e	ef      dededeeee   f   fdZ	 ddee
e	ef      dededeed	d	f   fdZ	 ddee
e	ef      dededeed	d	f   fdZdedee	   fdZy	)OpenAIPydanticProgramzn
    An OpenAI-based function that returns a pydantic model.

    Note: this interface is not yet stable.
    r   llmprompttool_choicer   r1   r   Nc                 X    || _         || _        || _        || _        || _        || _        y)zInit params.N)_output_cls_llm_prompt_verbose_allow_multiple_tool_choice)selfr   rG   rH   rI   r   r1   s          r!   __init__zOpenAIPydanticProgram.__init__\   s1     &	-'r#   prompt_template_strkwargsc                    |xs t         j                  }t        |t              st	        dt        |             |j                  j                  s#t	        d|j                  j                   d      ||t	        d      ||t	        d      |t        |      }|xs t        ||      } | ||t        t        |      |||      S )Nz6OpenAIPydanticProgram only supports OpenAI LLMs. Got: zModel name z( does not support function calling API. z2Must provide either prompt or prompt_template_str.)r   rG   rH   rI   r   r1   )r   rG   r7   r   
ValueErrortypemetadatais_function_calling_model
model_namer   r"   r   )	clsr   rS   rH   rG   r1   r   rI   rT   s	            r!   from_defaultsz#OpenAIPydanticProgram.from_defaultsm   s     !X\\#v&KDQTI;W  ||55cll556 7) ) 
 >19QRR"5"AQRR*#$78F!U%9*n%U!/#)
 	
r#   c                     | j                   S N)rK   rQ   s    r!   r   z OpenAIPydanticProgram.output_cls   s    r#   c                     | j                   S r^   rM   r_   s    r!   rH   zOpenAIPydanticProgram.prompt   s    ||r#   c                     || _         y r^   ra   )rQ   rH   s     r!   rH   zOpenAIPydanticProgram.prompt   s	    r#   
llm_kwargsargsc                    |xs i } | j                   di |}t        | j                  |      } | j                  j                  dd| j
                  i|}d|vr| j                  |d<    | j
                  j                  d||gd|}|j                  }d|j                  vrt        d      |j                  d   }	t        |	| j                  | j                  | j                        S )	NdescriptionrG   rI   messagestoolsr0   zDExpected tool_calls in ai_message.additional_kwargs, but none found.r   r   r1    )_description_evalr   rK   rM   format_messagesrL   rP   chatmessageadditional_kwargsrV   rD   r   rO   rN   
rQ   rc   rd   rT   rg   openai_fn_specri   chat_responserp   r0   s
             r!   __call__zOpenAIPydanticProgram.__call__   s     %2
,d,,6v6'(8(8kR/4<<//HDIIHH
*(,(9(9J}%&		 
!"
 

  ''w888" 
 ..|<
 //MM	
 	
r#   c                   K   |xs i } | j                   di |}t        | j                  |      } | j                  j                  dd| j
                  i|}d|vr| j                  |d<    | j
                  j                  d||gd| d {   }|j                  }d|j                  vrt        d      |j                  d   }	t        |	| j                  | j                  | j                        S 7 ew)	Nrf   rG   rI   rh   r0   zGExpected function call in ai_message.additional_kwargs, but none found.rk   rl   )rm   r   rK   rM   rn   rL   rP   achatrp   rq   rV   rD   r   rO   rN   rr   s
             r!   acallzOpenAIPydanticProgram.acall   s      %2
,d,,6v6'(8(8kR/4<<//HDIIHH
*(,(9(9J}%-diioo 
!"
 
 

  ''w888" 
 ..|<
 //MM	
 	

s   BC8C6A&C8c              /     K   |xs i } | j                   j                  dd| j                  i|} | j                  di |}t	        | j
                        }t        ||      }d|vrt        |      |d<    | j                  j                  d||gd|}d}	|D ]  }
|
j                  j                  }|d   }t        |      dk(  r-|d   d   j                  j                  }|j                  d      dk7  r|	dk(  r|j                  d      d	z   }	nxt        ||	      \  }}	||}| j
                  j!                  |      }| j"                  rt%        d|j'                                 |  y
w)zStreams a list of objects.rG   rf   rI   rh   r0   r   [r(   NzExtracted object: rl   )rM   rn   rL   rm   r   rK   r   r"   stream_chatrp   rq   r<   r3   r5   findr/   r:   rN   r6   json)rQ   rc   rd   rT   ri   rg   list_output_clsrs   chat_response_genobj_start_idxstream_respr0   fn_argsnew_obj_json_strobj_json_strobjs                   r!   stream_listz!OpenAIPydanticProgram.stream_list   s      %2
/4<<//HDIIHH,d,,6v6+D,<,<='[Q
*(<_(MJ}%1DII11 
!"
 
  , 	K ((::F-J:!# \*1-66@@G
 ||C B& B&$+LL$5$9M .;G].S+m+/&&00>==.sxxzl;<	5	s   D"E1%AE1c              /   H  K   |xs i } | j                   j                  dd| j                  i|} | j                  di |}t	        | j
                  |      }d|vrt        | j
                        |d<    | j                  j                  d||gd|}|D ]q  }|j                  j                  }|d   }	t        |	      dk(  r-|d   d   j                  j                  }
	 t        |
      }| j
                  j                  |       s y# t        t         f$ r Y w xY ww)	z(Streams the intermediate partial object.rG   rf   rI   rh   r0   r   Nrl   )rM   rn   rL   rm   r   rK   r"   r|   rp   rq   r<   r3   r5   r   r9   r   rV   )rQ   rc   rd   rT   ri   rg   rs   r   partial_respr0   r   partial_objects               r!   stream_partial_objectsz,OpenAIPydanticProgram.stream_partial_objects"  s;      %2
/4<<//HDIIHH,d,,6v6'(8(8kR
*(<T=M=M(NJ}%1DII11 
!"
 

 . 
	L!));;F-J:!#\*1-66@@G!3G!<&&00@@
	 $Z0 s*   CD""(D
D"DD"DD"c                     |j                  dd       }| j                  j                  s|st        d      | j                  j                  r|rt        d      |S )Nrg   zMust provide description for your Pydantic Model. Either provide a docstring or add `description=<your_description>` to the method. Required to convert Pydantic Model to OpenAI Function.z;Must provide either a docstring or a description, not both.)getrK   __doc__rV   )rQ   rT   rg   s      r!   rm   z'OpenAIPydanticProgram._description_evalC  sc    jj5   ((K M 
 ##M  r#   FF)NNNFFNr^   )__name__
__module____qualname__r   r	   r   r   r   r
   strr   r   boolrR   classmethodr   r   r\   propertyr   rH   setterr   ru   rx   r   r   r   rm   rl   r#   r!   rF   rF   T   s     %(K( ( #	(
 3S#X./( ( ( 
("  .2+/!$<@(
K(
 &c](
 (	(

 c](
 (
 (
 eCc3h$789(
 (
 
!(
 (
T  DK     *   ]]/ D  
 04"
T#s(^,"
 "
 	"

 
ud5k!	""
L 04"
T#s(^,"
 "
 	"

 
ud5k!	""
L 044T#s(^,4 4 	4
 
5$$	%4p 04T#s(^,  	
 
5$$	%B# (3- r#   rF   )Fr   ).loggingtypingr   r   r   r   r   r   r	   r
   r    llama_index.core.bridge.pydanticr   llama_index.agent.openai.utilsr   llama_index.core.llms.llmr   +llama_index.core.program.llm_prompt_programr   llama_index.core.program.utilsr   llama_index.core.prompts.baser   r   llama_index.core.settingsr   llama_index.core.typesr   llama_index.llms.openair   llama_index.llms.openai.utilsr   r   r    llama_index.program.openai.utilsr   	getLoggerr   r=   r   r   r"   intr/   rD   rF   rl   r#   r!   <module>r      s$    Q Q Q < > ) N < L . ( * H ! ?
'

H
% 5:4U4-14
3S#X43 3 5#9K3L $ !	"^$"U" " 	"
 5$u+"J :;}237 } <}r#   