o
    Ci3                     @   s   d dl Z d dlmZ i dd dD Zi dd dD Zi dd d	D Zg d
ZG dd dZG dd deZG dd deZ	G dd deZ
G dd deZG dd deZG dd deZee	e
eeedZdS )    N)PermissionDeniedc                 C   s   i | ]	}|d dddqS )
page_tokenpageSize	pageToken)type
page_parampage_key .0er	   r	   $/var/www/Datamplify/LLM_injection.py
<dictcomp>   s    
r   )modelsfilescachedContentsc                 C      i | ]}|d diqS r   Noner	   r
   r	   r	   r   r      
    )r   zuser/balancec                 C   r   r   r	   r
   r	   r	   r   r   !   r   )r   certificateszchat/completionsevalszfine_tuning/jobsbatchesr   vector_stores
containers
assistantsadmin_api_keysinvitesusersprojects
audit_logszchatkit/threadsgroupsusage/embeddingsusage/moderationsrolesusage/completionsusage/imagesusage/audio_speechesusage/audio_transcriptionsusage/vector_storesusage/code_interpreter_sessionscostsr   zaudio/voice_consentsvideos)r   r   r   r   r   r    r%   r"   r#   r&   r'   r(   r)   r*   r+   r   r$   r!   c                   @   sN   e Zd Zdd Zdd Zdd Zdedefd	d
Zddede	defddZ
dS )BaseLLMClientc                 C   s   |pi | _ |pi | _|| _d S N)token_metadatacredentialsIntegration_idselfr/   r0   r1   r	   r	   r   __init__;   s   


zBaseLLMClient.__init__c                 C   
   dddS Napplication/jsonAcceptContent-Typer	   r3   r	   r	   r   headers@      zBaseLLMClient.headersc                 C   s   d S r.   r	   r;   r	   r	   r   get_new_tokenF   s   zBaseLLMClient.get_new_tokenendpointparamsc                 C   s   t r.   )NotImplementedError)r3   r?   r@   r	   r	   r   
fetch_page[   s   zBaseLLMClient.fetch_paged   N
batch_sizec                 C   s   dS )z
        Same semantics as ShopifyClient.stream_batches:
        yields a list (batch) each time.

        Each item in the batch is a dict:
          { "prompt": ..., "response": ..., "raw": ... }
        Nr	   )r3   r?   rD   r@   r	   r	   r   stream_batches^   s    zBaseLLMClient.stream_batches)rC   N)__name__
__module____qualname__r4   r<   r>   strdictrB   intrE   r	   r	   r	   r   r-   9   s    r-   c                       J   e Zd Z fddZdd ZdedefddZdded
efddZ	  Z
S )OpenAIClientc                    J   t  ||| | jd | _| jdpd| _| jdpd| _t| _d S )N	api_tokensite_urlzhttps://api.openai.com/v1/default_modelzgpt-4o-mini)	superr4   r0   api_keygetrP   modelOPENAI_CONFIGcfgr2   	__class__r	   r   r4   i   
   
zOpenAIClient.__init__c                 C      d| j  dddS NBearer r7   )Authorizationr9   r:   rS   r;   r	   r	   r   r<   p      
zOpenAIClient.headersr?   r@   c                 C   sl   |t v r| j d| }n| j | }tj||  d}|jdkr)| dS |jdkr4tddid S )Nzorganization/r<      data  messageRequire Permission)OPENAI_ORG_APISrP   requestsrT   r<   status_codejsonr   )r3   r?   r@   base_urlrr	   r	   r   rB   w   s   

zOpenAIClient.fetch_pagerC   rD   c                 c       	 |  |i V  d S r.   rB   r3   r?   rD   r	   r	   r   rE         zOpenAIClient.stream_batchesrC   rF   rG   rH   r4   r<   rI   rJ   rB   rK   rE   __classcell__r	   r	   rX   r   rM   h   s
    rM   c                       rL   )DeepSeekClientc                    rN   )NrO   rP   zhttps://api.deepseek.comrQ   zdeepseek-chat)	rR   r4   r0   rS   rT   rP   rU   DEEPSEEK_CONFIGrW   r2   rX   r	   r   r4      rZ   zDeepSeekClient.__init__c                 C   r[   r\   r_   r;   r	   r	   r   r<      r`   zDeepSeekClient.headersr?   r@   c                 C   s|   |pi  dpd}| j d| }tj ||  d}|jdkr1|dkr*|  dS |  dS |jd	kr<td
did S )Npromptping/ra   rb   r   rc   balance_infosrd   re   rf   )rT   rP   rh   r<   ri   rj   r   )r3   r?   r@   rv   urlrl   r	   r	   r   rB      s   
$
zDeepSeekClient.fetch_pagerC   rD   c                 c   rm   r.   rn   ro   r	   r	   r   rE      rp   zDeepSeekClient.stream_batchesrq   rr   r	   r	   rX   r   rt      s
    rt   c                       rL   )GeminiClientc                    rN   )NrO   rP   z1https://generativelanguage.googleapis.com/v1beta/rQ   zgemini-1.5-flash)	rR   r4   r0   rS   rT   rP   rU   GEMINI_CONFIGrW   r2   rX   r	   r   r4      rZ   zGeminiClient.__init__c                 C   r5   r6   r	   r;   r	   r	   r   r<      r=   zGeminiClient.headersr?   r@   c                 C   s   | j  | }d}|i krd}ddi}tj||  |d}|jdkr>| }|||}|g kr<t|||tr<|gS |S |jdkrIt	dd	ig S )
NFTr   rC   )r<   r@   rb   rd   re   rf   )
rP   rh   postr<   ri   rj   rT   
isinstancerJ   r   )r3   r?   r@   rz   
check_flagrl   responseresponse_datar	   r	   r   rB      s.   

zGeminiClient.fetch_page'  rD   c           
      c   s    | j | }g }d }	 |d di}|r|||d < | ||}|d d}|s)n |g kr.n|g kr=|||}	||	 t||krH|V  g }q|rN|V  g S )NTr   rC   r   r   nextPageToken)rW   rB   rT   extendlen)
r3   r?   rD   rW   batch	next_pager@   r   r   r   r	   r	   r   rE      s2   

zGeminiClient.stream_batches)r   rr   r	   r	   rX   r   r{      s
    r{   c                       6   e Zd Z fddZdd ZdedefddZ  ZS )	AnthropicClientc                    s\   t  ||| | jd | _| jdpdd| _| jdp!d| _| jdp*d| _d S )	NrS   rP   zhttps://api.anthropic.comrx   rQ   zclaude-3-haiku-20240307anthropic_versionz
2023-06-01)	rR   r4   r0   rS   rT   rstriprP   rU   r   r2   rX   r	   r   r4     s
   zAnthropicClient.__init__c                 C   s   | j | jdddS )Nr7   )z	x-api-keyzanthropic-versionr9   r:   )rS   r   r;   r	   r	   r   r<     s
   zAnthropicClient.headersr?   r@   c                 C   s   |pi  dpd}| j d}tj||  | jdd|dgddd	}|jd
kr.tddi| }d}zd	dd | dg D }W n t
yQ   t|}Y nw |||dS )Nrv   rw   z/v1/messages   userrolecontent)rU   
max_tokensmessages<   r<   rj   timeoutrb   re   rf    c                 S   s   g | ]}| d dqS )textr   )rT   )r   br	   r	   r   
<listcomp>*  s    z.AnthropicClient.fetch_page.<locals>.<listcomp>r   rv   r   raw)rT   rP   rh   r}   r<   rU   ri   r   rj   join	ExceptionrI   )r3   r?   r@   rv   rz   rl   rc   r   r	   r	   r   rB     s.   


 zAnthropicClient.fetch_page	rF   rG   rH   r4   r<   rI   rJ   rB   rs   r	   r	   rX   r   r     s    r   c                       r   )	AzureOpenAIClientc                    sP   t  ||| | jd | _| jd d| _| jd | _| jdp$d| _d S )NrS   r?   rx   
deploymentapi_versionz
2024-10-21)	rR   r4   r0   rS   r   r?   r   rT   r   r2   rX   r	   r   r4   2  s
   zAzureOpenAIClient.__init__c                 C   s   | j dddS )Nr7   )zapi-keyr9   r:   r_   r;   r	   r	   r   r<   9  s   zAzureOpenAIClient.headersr?   r@   c                 C   s   |pi  dpd}| j d| j d| j }tj||  d|dgddd	d
}|jdkr3tddi|	 }||d d d d |dS )Nrv   rw   z/openai/deployments/z/chat/completions?api-version=r   r   r   )r   r   r   r   rb   re   rf   choicesr   r   r   )
rT   r?   r   r   rh   r}   r<   ri   r   rj   r3   r?   r@   rv   rz   rl   rc   r	   r	   r   rB   @  s&   

	zAzureOpenAIClient.fetch_pager   r	   r	   rX   r   r   1  s    r   c                       s:   e Zd ZdZ fddZdd Zdedefdd	Z  Z	S )
MetaLlamaClientz
    OpenAI-compatible self-hosted LLaMA (vLLM/Ollama/TGI).

    Required:
      - base_url OR site_url (example: http://localhost:8000 OR http://localhost:8000/v1)
    Optional:
      - api_key
      - default_model
    c                    sf   t  ||| | jdp| jdpdd| _| js!td| jd| _| jdp/d| _d S )	Nrk   rP   r   rx   z1base_url (or site_url) is required for meta_llamarS   rQ   zllama-3.1-8b-instruct)	rR   r4   r0   rT   r   rP   
ValueErrorrS   rU   r2   rX   r	   r   r4   f  s   $zMetaLlamaClient.__init__c                 C   s$   ddd}| j rd| j  |d< |S )Nr7   r8   r]   r^   r_   )r3   hr	   r	   r   r<   p  s   zMetaLlamaClient.headersr?   r@   c                 C   s   |pi  dpd}| jds| j dn| j d}tj||  | jd|dgdd	d
}|jdkr9tddi|	 }||d d d d |dS )Nrv   rw   z/v1z/v1/chat/completionsz/chat/completionsr   r   )rU   r   r   r   rb   re   rf   r   r   r   r   )
rT   rP   endswithrh   r}   r<   rU   ri   r   rj   r   r	   r	   r   rB   y  s,   



	zMetaLlamaClient.fetch_page)
rF   rG   rH   __doc__r4   r<   rI   rJ   rB   rs   r	   r	   rX   r   r   [  s
    

	r   )openaideepseekgemini	anthropicazure_openai
meta_llama)rh   rest_framework.exceptionsr   r|   ru   rV   rg   r-   rM   rt   r{   r   r   r   LLM_CLIENTSr	   r	   r	   r   <module>   s@   /)(J.*@
