
    +#h                         d dl Z d dlmZ d dlZ	 d dlZd dlmZ ej                  ej                  fZd dlmZ d Z G d de      Zy# e	$ r e
ZY w xY w)    N)Any)Groq)LMc                 :    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    T/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dsp/modules/groq_client.pybackoff_hdlrr      s&    		 	6	%#	%    c                        e Zd ZdZ	 ddedef fdZd ZdefdZ ej                  ej                  ede	      defd
       ZdefdZd Z	 	 ddedededeeeef      fdZ xZS )GroqLMa4  Wrapper around groq's API.

    Args:
        model (str, optional): groq supported LLM model to use. Defaults to "mixtral-8x7b-32768".
        api_key (Optional[str], optional): API provider Authentication token. use Defaults to None.
        **kwargs: Additional arguments to pass to the API provider.
    api_keymodelc                 l   t         |   |       d| _        |r|| _        t	        |      | _        nt        d      ddddddd|| _        | j
                  j                  j                         j                  }|+||D cg c]  }|j                   c}v r|| j                  d	<   g | _        y c c}w )
Ngroq)r   zapi_key is required for groqg              r   )temperature
max_tokenstop_pfrequency_penaltypresence_penaltynr   )super__init__providerr   r   client
ValueErrorkwargsmodelslistdataidhistory)selfr   r   r!   r"   m	__class__s         r   r   zGroqLM.__init__$   s     	"DLw/DK;<< !" !
 
 ##((*//v.!..',G$-/ /s   B1c                 j    |j                   }|r%|j                  }t        j                  d|        yy)z0Log the total tokens from the Groq API response.z"Groq Total Tokens Response Usage: N)usagetotal_tokensloggingdebug)r'   response
usage_datar,   s       r   	log_usagezGroqLM.log_usageA   s2    ^^
%22LMM>|nMN r   promptc                     |}i | j                   |}d|dg|d<    | j                  di |}||j                  d   j                  j                  ||d}| j
                  j                  |       |S )Nuser)rolecontentmessagesr   )r2   r/   r!   
raw_kwargsr   )r!   chat_requestchoicesmessager6   r&   append)r'   r2   r!   r8   r/   r&   s         r   basic_requestzGroqLM.basic_requestH   s    
*DKK*6*'-&ABz$4$$.v.  ((+33;;$	
 	G$r   i  )max_time
on_backoffc                 6    d|v r|d=  | j                   |fi |S )QHandles retreival of model completions whilst handling rate limiting and caching.
model_type)r=   )r'   r2   r!   s      r   requestzGroqLM.request[   s,     6!|$!t!!&3F33r   returnc                 .    |j                   j                  S )N)r;   r6   )r'   choices     r   _get_choice_textzGroqLM._get_choice_texth   s    ~~%%%r   c                 f     | j                   j                  j                  j                  di |}|S )rA   r   )r   chatcompletionscreate)r'   r!   r/   s      r   r9   zGroqLM.chat_requestk   s,    64;;##//66@@r   only_completedreturn_sortedc                 8   |sJ d       |du sJ d        | j                   |fi |}| j                  |       |j                  }|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 )a  Retrieves completions from model.

        Args:
            prompt (str): prompt to send to model
            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 nowFr   r   logprobstokenstoken_logprobsz<|endoftext|>NT)reverse)
rC   r1   r:   rG   getindexsumlenr<   sorted)r'   r2   rL   rM   r!   r/   r:   crJ   scored_completionsrP   rO   rT   avglog_s                  r   __call__zGroqLM.__call__p   sU   $ (y(~%0y0%4<<1&1x ""9@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<) B$ =s   	D D)zmixtral-8x7b-32768)TF)__name__
__module____qualname____doc__strr   r1   r=   backoffon_exceptionexpogroq_api_errorr   rC   rG   r9   boolr#   dictr   r\   __classcell__)r)   s   @r   r   r      s     *00 0:OC & W	4c 44&# &  $#	.. . 	. 
d38n	.r   r   )r-   typingr   rb   r   r   APIErrorRateLimitErrorre   ImportError	Exceptiondsp.modules.lmr   r   r   r   r   r   <module>ro      s[      mmT%8%89N
 CR C!  Ns   "A AA