
    +#hr!                     d   d dl Z d dlZd dlZd dlmZmZmZmZ d dlZd dl	Z	d dl
mZmZmZ d dlmZ 	  ee	j"                  j$                  d          d k(  Z	 d dlZ	d dlmZ e	j0                  j2                  fZd Z G d d	e      Zej<                  d
        Z e j@                  erdnd       ej<                  d               Z!ej<                  defd       Z" e j@                  erdnd       ej<                  defd              Z#ej<                  d        Z$ e j@                  erdnd       ej<                  d               Z%ej<                  d        Z& e j@                  erdnd       ej<                  d               Z'd Z(d Z)y# e$ r dZY ?w xY w# e$ r e	j2                  fZeZY 8w xY w)    N)AnyLiteralOptionalcast)CacheMemoryNotebookCacheMemorycache_turn_on)LMT)OpenAIObjectc                 :    t         dj                  di |        y)z.Handler from https://pypi.org/project/backoff/zbBacking off {wait:0.1f} seconds after {tries} tries calling function {target} with kwargs {kwargs}N )printformat)detailss    M/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dsp/modules/gpt3.pybackoff_hdlrr      s&    		 	6	%#	%    c                       e Zd ZdZ	 	 	 	 	 	 ddedee   ded   dee   ded   d	ee   f fd
Zd Zd Z	defdZ
 ej                  ej                  ede      defd       Zdeeef   defdZ	 	 ddedededeeeef      fdZ xZS )GPT3aF  Wrapper around OpenAI's GPT API.

    Args:
        model (str, optional): OpenAI supported LLM model to use. Defaults to "gpt-3.5-turbo-instruct".
        api_key (Optional[str], optional): API provider Authentication token. use Defaults to None.
        api_provider (Literal["openai"], optional): The API provider to use. Defaults to "openai".
        model_type (Literal["chat", "text"], optional): The type of model that was specified. Mainly to decide the optimal prompting strategy. Defaults to "text".
        **kwargs: Additional arguments to pass to the API provider.
    openaimodelapi_keyapi_providerapi_base
model_type)chattextsystem_promptc                 P   t         	|   |       d| _        |t        _        || _        |dk7  sJ d       d|v sd|v sd|v rd|vrdnd	}|r|n|| _        |r|t        _        |rt        r|t        _	        n|t        _
        d
dddddd|| _        || j                  d<   g | _        y )Nr   azurez^Azure functionality with base OpenAI has been deprecated, please use dspy.AzureOpenAI instead.zgpt-3.5turbozgpt-4instructr   r   g              r   )temperature
max_tokenstop_pfrequency_penaltypresence_penaltynr   )super__init__providerr   api_typer   r   r   OPENAI_LEGACYr   base_urlkwargshistory)
selfr   r   r   r   r   r   r1   default_model_type	__class__s
            r   r,   zGPT3.__init__/   s     	 &* G#	lk	l#
 U"g&6'U:JQ[chQh  	
 )3*8J$FN"*"* !" !
 
  %G-/r   c                     t         S )N)r   )r3   s    r   _openai_clientzGPT3._openai_client`   s    r   c                 ~    |j                  d      }|r*|j                  d      }t        j                  d|        yy)z2Log the total tokens from the OpenAI API response.usagetotal_tokenszOpenAI Response Token Usage: N)getloggingdebug)r3   response
usage_datar:   s       r   	log_usagezGPT3.log_usagec   s:    \\'*
%>>.9LMM9,HI r   promptc                 ^   |}i | j                   |}| j                  dk(  rYd|dg}| j                  r|j                  dd| j                  d       ||d<   dt	        j
                  |      i}t        d
i |}n||d<   t        d
i |}||||d	}| j                  j                  |       |S )Nr   user)rolecontentr   systemmessagesstringify_requestrA   )rA   r>   r1   
raw_kwargsr   )
r1   r   r   insertjsondumpschat_requestcompletions_requestr2   append)r3   rA   r1   rI   rG   r>   r2   s          r   basic_requestzGPT3.basic_requestj   s    
*DKK*6*??f$!'F;<H!!HASAS#TU!)F:)4::f+=>F#-f-H  &F8*4V4H  $	
 	G$r   i  )max_time
on_backoffc                 6    d|v r|d=  | j                   |fi |S )zQHandles retreival of GPT-3 completions whilst handling rate limiting and caching.r   )rP   )r3   rA   r1   s      r   requestzGPT3.request   s,     6!|$!t!!&3F33r   choicereturnc                 :    | j                   dk(  r|d   d   S |d   S )Nr   messagerE   r   )r   )r3   rU   s     r   _get_choice_textzGPT3._get_choice_text   s(    ??f$)$Y//f~r   only_completedreturn_sortedc                    |sJ d       |du sJ d        | j                   |fi |}| j                  |       |d   }|D cg c]  }|d   dk7  s| }}|rt        |      r|}|D cg c]  }| j                  |       }	}|r|j	                  dd      dkD  rg }
|D ]m  }|d   d	   |d   d
   }}d|v r|j                  d      dz   }|d| |d| }}t        |      t        |      z  }|
j                  || j                  |      f       o t        |
d      }
|
D cg c]  \  }}|	 }	}}|	S c c}w c c}w c c}}w )a  Retrieves completions from GPT-3.

        Args:
            prompt (str): prompt to send to GPT-3
            only_completed (bool, optional): return only completed responses and ignores completion due to length. Defaults to True.
            return_sorted (bool, optional): sort the completion choices using the returned probabilities. Defaults to False.

        Returns:
            list[dict[str, Any]]: list of completion choices
        zfor nowFchoicesfinish_reasonlengthr*   r$   logprobstokenstoken_logprobsz<|endoftext|>NT)reverse)	rT   r@   lenrY   r;   indexsumrO   sorted)r3   rA   rZ   r[   r1   r>   r]   ccompleted_choicescompletionsscored_completionsra   r`   re   avglog_s                   r   __call__zGPT3.__call__   s   $ (y(~%0y0%  4<<1&1x 9%(/R11_3E3QQRRc"34'G9@AAt,,Q/AAVZZQ/!3!# NjM(+jM"23 !
 #f,"LL9A=E'-fu~x7GHFXX6"))643H3H3K*LMN "((:D!I);<A1<K<3 S
 B$ =s   D1D1)D6 D;)zgpt-3.5-turbo-instructNr   NNN)TF)__name__
__module____qualname____doc__strr   r   r,   r7   r@   rP   backoffon_exceptionexpoERRORSr   rT   dictr   rY   boollistrn   __classcell__)r5   s   @r   r   r   $   s    .!%*2"&.2'+/0/0 #/0 h'	/0
 3-/0 N+/0  }/0bJC 6 W	4c 44tCH~ #   $#	99 9 	9 
d38n	9r   r   c                  @    t        j                  j                  di | S Nr   )r   
Completioncreater1   s    r   cached_gpt3_request_v2r      s    ##-f--r   )maxsizec                      t        di | S r}   )r   r   s    r   cached_gpt3_request_v2_wrappedr      s     "+F++r   rV   c                      d| v rt        j                  | d         } t        t        t	        j
                  j                  di |       S NrH   r   )rK   loadsr   r   r   ChatCompletionr   r   s    r   _cached_gpt3_turbo_request_v2r      s?    f$F#678f33::DVDEEr   c                      t        di | S r}   )r   r   s    r   %_cached_gpt3_turbo_request_v2_wrappedr      s     )2622r   c                  @    t        j                  j                  di | S r}   )r   rj   r   r   s    r   v1_cached_gpt3_request_v2r      s    $$.v..r   c                      t        di | S r}   )r   r   s    r   !v1_cached_gpt3_request_v2_wrappedr      s     %.v..r   c                      d| v rt        j                  | d         } t        j                  j                  j
                  di | S r   )rK   r   r   r   rj   r   r   s    r   v1_cached_gpt3_turbo_request_v2r      s<    f$F#678;;""))3F33r   c                      t        di | S r}   )r   r   s    r   'v1_cached_gpt3_turbo_request_v2_wrappedr      s     +4V44r   c                  V    t         rt        di | S t        di | j                         S r}   )r/   r   r   
model_dumpr   s    r   rM   rM     s*    4>v>>2<V<GGIIr   c                  V    t         rt        di | S t        di | j                         S r}   )r/   r   r   r   r   s    r   rN   rN   
  s*    -777,6v6AACCr   )*	functoolsrK   r<   typingr   r   r   r   rt   r   dsp.modules.cache_utilsr   r   r	   dsp.modules.lmr
   intversion__version__r/   	Exceptionopenai.erroropenai.openai_objectr   errorRateLimitErrorrw   rx   r   r   cacher   	lru_cacher   r   r   r   r   r   r   rM   rN   r   r   r   <module>r      s      / /   S S 22156!;M1ll))+Fl2 l^ . . ]T:,  ;, F| F F ]T:3| 3  ;3 / / ]T:/  ;/ 4 4 ]T:5  ;5JDy  M  ##%FLs#   "F	 !F 	FFF/.F/