
    +#h                        d dl Z d dlZd dl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Zd dlmZ ej                  j                   ej                  j"                  ej                  j$                  fZd Z G d de      Zd	 Zd
 Zd Zd Zej8                  d        Z e j<                  e	rdnd       ej8                  d               Zej8                  d        Z  e j<                  e	rdnd       ej8                  d               Z!ej8                  d        Z" e j<                  e	rdnd       ej8                  d               Z#y# e$ r ej                   ej$                  fZeZY w xY w)    N)LiteralOptional)CacheMemoryNotebookCacheMemorycache_turn_on)GPT3)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    S/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dsp/modules/databricks.pybackoff_hdlrr      s&    		 	6	%#	%    c            
       v     e Zd ZdZ	 	 	 ddedee   dee   ded   f fdZdefd	Zdefd
Z	def fdZ
 xZS )
Databricksa  Wrapper around DSPy's OpenAI Wrapper. Supports Databricks Model Serving Endpoints for OpenAI SDK on both Chat, Completions, and Embeddings models.

    Args:
        model (str, required): Databricks-hosted LLM model to use.
        api_key (Optional[str], optional): Databricks authentication token. Defaults to None.
        api_base (Optional[str], optional): Databricks model serving endpoint. Defaults to None.
        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 OpenAI API provider.
    modelapi_keyapi_base
model_type)chattext
embeddingsc           	          t        |   d||d||d| | j                  j                  dd        | j                  j                  dd        y )Nopenai)r   r   api_providerr   r   frequency_penaltypresence_penaltyr   )super__init__kwargspop)selfr   r   r   r   r"   	__class__s         r   r!   zDatabricks.__init__&   sX     	 	
!!	
 	
 	+T2*D1r   promptc                    |}i | j                   |}| j                  dk(  rSdddd|dg|d<   dt        j                  |      i}t	        d
i |j                         }t        j
                  |      }n3||d<   t        d
i |j                         }t        j
                  |      }||||d	}| j                  j                  |       |S )Nr   systemzYou are a helpful assistant.)rolecontentusermessagesstringify_requestr&   )r&   responser"   
raw_kwargsr   )	r"   r   jsondumpscustom_client_chat_requestloads!custom_client_completions_requesthistoryappend)r$   r&   r"   r/   r.   r5   s         r   basic_requestzDatabricks.basic_request:   s    
*DKK*6*??f$+3@^"_jp  ~D  bE  "FF:)4::f+=>F1;F;@@BHzz(+H%F88B6BGGIHzz(+H  $	
 	G$r   c                 X   i | j                   |}||d<   |j                  dd        |j                  dd        |j                  dd        |j                  dd        t        d	i |j                         }t        j                  |      }|d   D cg c]  }|d   	 c}d   }|S c c}w )
Ninputtemperature
max_tokenstop_pndata	embeddingr   r   )r"   r#    custom_client_embeddings_requestr0   r3   )r$   r&   r"   r.   cur_objr   s         r   r   zDatabricks.embeddingsQ   s    *DKK*6* w

=$'

<&

7D!

33=f=BBD::h':B6:JKwgk*KAN
 Ls   B'c                 h    | j                   dk(  r | j                  |fi |S t        |   |fi |S )Nr   )r   r   r    __call__)r$   r&   r"   r%   s      r   rC   zDatabricks.__call__]   s:    ??l*"4??64V447#F5f55r   )NNN)__name__
__module____qualname____doc__strr   r   r!   r7   r   rC   __classcell__)r%   s   @r   r   r      su     "&"&<@22 #2 3-	2
 892(C .
 
6s 6 6r   r   c                  ^    ddl m}   | t         j                  t         j                        }|S )Nr   )OpenAI)r   base_url)r   rK   r   rL   )rK   clients     r   create_custom_clientrN   c   s    FNNV__EFMr   c                      t        di | S Nr   ),cached_custom_client_chat_request_v2_wrappedr"   s    r   r2   r2   i   s    7A&AAr   c                      t        di | S rP   )2cached_custom_client_embeddings_request_v2_wrappedrR   s    r   r@   r@   l   s    =GGGr   c                      t        di | S rP   )3cached_custom_client_completions_request_v2_wrappedrR   s    r   r4   r4   o   s    >HHHr   c                  b    t               } |j                  j                  j                  di | S rP   )rN   r   completionscreater"   rM   s     r   $cached_custom_client_chat_request_v2r[   s   s*    !#F)6;;""))3F33r   )maxsizec                  P    d| v rt        j                  | d         } t        di | S )Nr-   r   )r0   r3   r[   rR   s    r   rQ   rQ   x   s.     f$F#678/9&99r   c                  N    t               } |j                  j                  di | S rP   )rN   rX   rY   rZ   s     r   +cached_custom_client_completions_request_v2r_      s&    !#F$6$$.v..r   c                      t        di | S rP   )r_   rR   s    r   rV   rV      s     7@@@r   c                  N    t               } |j                  j                  di | S rP   )rN   r   rY   rZ   s     r   *cached_custom_client_embeddings_request_v2rb      s&    !#F#6##-f--r   c                      t        di | S rP   )rb   rR   s    r   rT   rT      s     6???r   )$	functoolsr0   typingr   r   r   dsp.modules.cache_utilsr   r   r   dsp.modules.gpt3r   openai.erroropenai.openai_objectr	   errorRateLimitErrorServiceUnavailableErrorAPIErrorERRORS	Exceptiondictr   r   rN   r2   r@   r4   cacher[   	lru_cacherQ   r_   rV   rb   rT   r   r   r   <module>rs      s     $  S S !1ll))6<<+O+OQWQ]Q]QfQfgFF6 F6PBHI 4 4 ]T::  ;:
 / / ]T:A  ;A . . ]T:@  ;@E  ##V__5FLs   AE E('E(