
    +#h8(                        U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZ dZd	ed
<    G d de      Z G d de      Z G d de      Z G d de      Zy)zAWS models for LMs.    )annotationsN)abstractmethod)Any)AWSProviderBedrock	Sagemaker)LM   intCHARS2TOKENSc                       e Zd ZdZ	 	 	 	 	 	 	 	 d fdZedd       Zedd       ZddZ	 	 	 	 ddZ	ddZ
ddZdd	Z	 	 d	 	 	 	 	 	 	 dd
Z xZS )AWSModelaZ  This class adds support for an AWS model.
    It is an abstract class and should not be instantiated directly.
    Instead, use one of the subclasses - AWSMistral, AWSAnthropic, or AWSMeta.
    The subclasses implement the abstract methods _create_body and _call_model and work in conjunction with the AWSProvider classes Bedrock and Sagemaker.
    Usage Example:
        bedrock = dspy.Bedrock(region_name="us-west-2")
        bedrock_mixtral = dspy.AWSMistral(bedrock, "mistral.mixtral-8x7b-instruct-v0:1", **kwargs)
        bedrock_haiku = dspy.AWSAnthropic(bedrock, "anthropic.claude-3-haiku-20240307-v1:0", **kwargs)
        bedrock_llama2 = dspy.AWSMeta(bedrock, "meta.llama2-13b-chat-v1", **kwargs)

        sagemaker = dspy.Sagemaker(region_name="us-west-2")
        sagemaker_model = dspy.AWSMistral(sagemaker, "<YOUR_ENDPOINT_NAME>", **kwargs)
    c                z    t         |   |       || _        || _        || _        i | j
                  || _        y)a  _summary_.

        Args:
            model (str, optional): An LM name, e.g., a bedrock name or an AWS endpoint.
            max_context_size (int): The maximum context size in tokens.
            max_new_tokens (int): The maximum number of tokens to be sampled from the LM.
        )modelN)super__init___model_name_max_context_size_max_new_tokenskwargs)selfr   max_context_sizemax_new_tokensr   	__class__s        S/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dsp/modules/aws_models.pyr   zAWSModel.__init__!   sJ     	u% %&6$2
kk

    c                     y N )r   promptr   s      r   _create_bodyzAWSModel._create_body9   s    r   c                     y)z=Call model, get generated input without the formatted prompt.Nr   r   bodys     r   _call_modelzAWSModel._call_model=   s    r   c                &    t        |      t        z  S r   )lenr   )r   texts     r   _estimate_tokenszAWSModel._estimate_tokensA   s    4y%%r   c                    |S r   r   r#   s     r   _extract_input_parametersz"AWSModel._extract_input_parametersD   s	     r   c                    d|z   dz   S )Nz	

Human: z

Assistant:r   r   
raw_prompts     r   _format_promptzAWSModel._format_promptJ   s    z),<<<r   c                    | j                   |fi |\  }}t        j                  |      }|dkD  rGt        |      D cg c]  }| j	                  |       }}|D cg c]  }|j                  |d       }}n#| j	                  |      }|j                  |d      }| j                  j                  |||d       |S c c}w c c}w )N    )r    responser   )r!   jsondumpsranger%   replacehistoryappend)	r   formatted_promptr   nr$   	json_body_llm_out	generateds	            r   _simple_api_callzAWSModel._simple_api_callM   s    #$##$4??4JJt$	q5<A!HEqt''	2EGEPWX9y(()92>XGX&&y1Goo&6;G'WM	
  FXs   B<Cc                   | j                  |      }|| j                  kD  r<t        j                  d|| j                         t	        d| d| j                         | j                  |      } | j                  dd|i|S )zQuery the endpoint.z.Error - input tokens %s exceeds max context %szError - input tokens z exceeds max context r:   r   )r)   r   logginginfo
ValueErrorr/   r@   )r   r    r   token_countr:   s        r   basic_requestzAWSModel.basic_request]   s    ++F3///LLI;X\XnXno'}4I$J`J`Iab  !% 3 3F ;$t$$Q6FQ&QQr   c                V    |sJ d       |du sJ d        | j                   |fi |}|gS )z}Query the AWS LLM.

        There is only support for only_completed=True and return_sorted=False
        right now.
        zfor nowF)rF   )r   r    only_completedreturn_sortedr   r?   s         r   __call__zAWSModel.__call__i   sC     (y(~%0y0%&D&&v88	{r   )r   strr   r   r   r   returnNoner    rK   rL   z"tuple[int, dict[str, str | float]])r$   rK   rL   str | list[str])r(   rK   rL   r   )r$   zdict[Any, Any]rL   zdict[str, str | float | int]r.   rK   rL   rK   )r:   rK   rL   rO   )rL   rO   )TF)r    rK   rH   boolrI   rQ   rL   z	list[str])__name__
__module____qualname____doc__r   r   r!   r%   r)   r+   r/   r@   rF   rJ   __classcell__r   s   @r   r   r      s    

 
 	
 

0   L L& 
&= 
R  $#	  	 
r   r   c                  T     e Zd ZdZ	 	 d	 	 	 	 	 	 	 	 	 d fdZddZd	dZd
dZ xZS )
AWSMistralzMistral family of models.c                    t        |   d|||d| || _        |j                         | _        d| j
                  d<   y)NNOTE: Configure your AWS credentials with the AWS CLI before using this model!r   r   r   z

---stopNr   )r   r   aws_providerget_provider_nameproviderr   )r   r^   r   r   r   r   r   s         r   r   zAWSMistral.__init__   sR     	 	
-)	
 		
 )$668'Fr   c                    d|z   dz   S )Nz<s> [INST] Human: z [/INST] Assistant: r   r-   s     r   r/   zAWSMistral._format_prompt   s    #j03IIIr   c                @   | j                   }|j                         D ]
  \  }}|||<    | j                  j                  |      \  }}i }t	        | j                  t
              r	||d<   ||fS t	        | j                  t              r||d<   ||d<   ||fS t        d      )Nr    
parametersinputsError - provider not recognized)r   itemsr^   sanitize_kwargs
isinstancer   r   rD   r   r    r   	base_argskvr;   
query_argss           r   r!   zAWSMistral._create_body   s    $(KK	LLN 	DAqIaL	 ((88C9-/
d''1#)Jx  : ))95'0J|$#)Jx  : >??r   c                   | j                   j                  | j                  |      }t        | j                   t              r2t        j                  |d   j                               }|d   d   d   }nTt        | j                   t              r/t        j                  |d   j                               }|d   d   }nt        d      |j                  | j                  d	         d   }|S )
N)model_idr$   r$   outputsr   r(   Bodygenerated_textre   r]   )r^   
call_modelr   rh   r   r4   loadsreadr   rD   splitr   r   r$   r3   response_body
completions        r   r%   zAWSMistral._call_model   s    $$//%% 0 
 d''1 JJx'7'<'<'>?M&y1!4V<J))95 JJx'7'<'<'>?M&q)*:;J>??%%dkk&&9:1=
r   )i     
r^   r   r   rK   r   r   r   r   rL   rM   rP   rN   r$   rK   rL   rK   )	rR   rS   rT   rU   r   r/   r!   r%   rV   rW   s   @r   rY   rY   |   sS    # !&"(!( ( 	(
 ( 
((J$r   rY   c                  L     e Zd ZdZ	 	 d	 	 	 	 	 	 	 	 	 d fdZddZddZ xZS )	AWSAnthropiczAnthropic family of models.c                   t        |   d|||d| || _        |j                         | _        t        | j                  t              rd| j                  d<   |j                         D ]  \  }}|| j                  |<    y)r[   r\   zbedrock-2023-05-31anthropic_versionNr   )	r   r   r^   r_   r`   rh   r   r   rf   	r   r^   r   r   r   r   rk   rl   r   s	           r   r   zAWSAnthropic.__init__   s     	 	
-)	
 		
 )$668d''1/CDKK+,LLN 	DAqDKKN	r   c                B   | j                   }|j                         D ]
  \  }}|||<    | j                  j                  |      \  }}|j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        dd|dgdg|d	<   ||fS )
Nfrequency_penaltynum_generationspresence_penaltyr   userr(   )typer(   )rolecontentmessagesr   rf   r^   rg   popri   s           r   r!   zAWSAnthropic._create_body   s    $(KK	LLN 	DAqIaL	 ))99)D: 	*D1($/)40w%  !' &
"

: :r   c                    | j                   j                  j                  | j                  |      }t	        j
                  |d   j                               }|d   d   d   }|S )NmodelIdr$   r$   r   r   r(   )r^   	predictorinvoke_modelr   r4   rt   ru   rw   s        r   r%   zAWSAnthropic._call_model   sg    $$..;;$$ < 
 

8F#3#8#8#:;"9-a08
r   )i@ rz   r{   rN   r|   rR   rS   rT   rU   r   r!   r%   rV   rW   s   @r   r~   r~      sM    % !'"!  	
  
08r   r~   c                  L     e Zd ZdZ	 	 d	 	 	 	 	 	 	 	 	 d fdZddZddZ xZS )	AWSMetazLlama2 family of models.c                   t        |   d|||d| || _        |j                         | _        |j                         D ]  \  }}|| j                  |<    | j                  j                  d      | j                  d<   y)r[   r\   
max_tokensmax_gen_lenNr   )r   r   r^   r_   r`   rf   r   r   r   s	           r   r   zAWSMeta.__init__   s     	 	
-)	
 		
 )$668LLN 	DAqDKKN	 &*[[__\%BM"r   c                2   | j                   }|j                         D ]
  \  }}|||<    | j                  j                  |      \  }}|j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        ||d<   ||fS )Nr   r   r   r   r    r   ri   s           r   r!   zAWSMeta._create_body  s    $(KK	LLN 	DAqIaL	 ))99)D: 	*D1($/)40w%%
8:r   c                    | j                   j                  j                  | j                  |      }t	        j
                  |d   j                               }|d   }d}|j                  |      d   }|S )Nr   r$   
generationz

r   )r^   r   r   r   r4   rt   ru   rv   )r   r$   r3   rx   ry   r]   s         r   r%   zAWSMeta._call_model%  sw    $$..;;$$ < 
 

8F#3#8#8#:;"<0
%%d+A.
r   )i   rz   r{   rN   r|   r   rW   s   @r   r   r      sS    " !%"C!C C 	C
 C 
C. r   r   )rU   
__future__r   r4   rB   abcr   typingr   dsp.modules.aws_providersr   r   r   dsp.modules.lmr	   r   __annotations__r   rY   r~   r   r   r   r   <module>r      sa     "     E E  c gr gT; ;|>8 >B5h 5r   