§
    šŠtj˜#  ã                   óæ   — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZ  ej        e¦  «        ZdZd	Z G d
„ de¦  «        ZdS )é    N)ÚAnyÚDictÚListÚMappingÚOptional)ÚCallbackManagerForLLMRun)ÚLLM)Úget_from_dict_or_envÚpre_init)Ú
get_fields)Ú
ConfigDictÚFieldÚmodel_validatoré
   é   c                   óP  — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed<   dZeed<   g Zee         ed	<   dZeed
<   dZeed<   	  ee¬¦  «        Zeeef         ed<   	 dZeed<   dZeed<   dZee         ed<    ed¬¦  «        Z ed¬¦  «        edeeef         defd„¦   «         ¦   «         Zededefd„¦   «         Ze de!eef         fd„¦   «         Z"e defd„¦   «         Z#d%d„Z$d%d„Z%defd„Z&e defd„¦   «         Z'	 	 d&d ed!ee(         d"ee)         d#edef
d$„Z*dS )'ÚBeama™  Beam API for gpt2 large language model.

    To use, you should have the ``beam-sdk`` python package installed,
    and the environment variable ``BEAM_CLIENT_ID`` set with your client id
    and ``BEAM_CLIENT_SECRET`` set with your client secret. Information on how
    to get this is available here: https://docs.beam.cloud/account/api-keys.

    The wrapper can then be called as follows, where the name, cpu, memory, gpu,
    python version, and python packages can be updated accordingly. Once deployed,
    the instance can be called.

    Example:
        .. code-block:: python

            llm = Beam(model_name="gpt2",
                name="langchain-gpt2",
                cpu=8,
                memory="32Gi",
                gpu="A10G",
                python_version="python3.8",
                python_packages=[
                    "diffusers[torch]>=0.10",
                    "transformers",
                    "torch",
                    "pillow",
                    "accelerate",
                    "safetensors",
                    "xformers",],
                max_length=50)
            llm._deploy()
            call_result = llm._call(input)

    Ú Ú
model_nameÚnameÚcpuÚmemoryÚgpuÚpython_versionÚpython_packagesÚ
max_lengthÚurl)Údefault_factoryÚmodel_kwargsÚbeam_client_idÚbeam_client_secretNÚapp_idÚforbid)ÚextraÚbefore)ÚmodeÚvaluesÚreturnc                 ó\  — d„ t          | ¦  «                             ¦   «         D ¦   «         }|                     di ¦  «        }t          |¦  «        D ]U}||vrO||v rt	          d|› d�¦  «        ‚t
                               |› d|› d�¦  «         |                     |¦  «        ||<   ŒV||d<   |S )z>Build extra kwargs from additional params that were passed in.c                 ó   — h | ]	}|j         ’Œ
S © )Úalias)Ú.0Úfields     ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/beam.pyú	<setcomp>z#Beam.build_extra.<locals>.<setcomp>T   s   € Ð#VÐ#VÐ#V°E E¤KÐ#VÐ#VÐ#Vó    r   zFound z supplied twice.zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)r   r'   ÚgetÚlistÚ
ValueErrorÚloggerÚwarningÚpop)Úclsr'   Úall_required_field_namesr$   Ú
field_names        r/   Úbuild_extrazBeam.build_extraP   sæ   € ð $WÐ#V½ZÈ¹_¼_×=SÒ=SÑ=UÔ=UÐ#VÑ#VÔ#VÐ à—
’
˜>¨2Ñ.Ô.ˆÝ˜v™,œ,ð 	;ð 	;ˆJØÐ!9Ð9Ð9Ø Ð&Ð&Ý$Ð%J¨jÐ%JÐ%JÐ%JÑKÔKÐKÝ—’Ø#ð Nð NØ)3ðNð Nð Nñô ð ð %+§J¢J¨zÑ$:Ô$:��jÑ!øØ!&ˆˆ~ÑØˆr1   c                 ó^   — t          |dd¦  «        }t          |dd¦  «        }||d<   ||d<   |S )z?Validate that api key and python package exists in environment.r    ÚBEAM_CLIENT_IDr!   ÚBEAM_CLIENT_SECRET)r
   )r8   r'   r    r!   s       r/   Úvalidate_environmentzBeam.validate_environmentc   sT   € õ .ØÐ$Ð&6ñ
ô 
ˆõ 2ØÐ(Ð*>ñ
ô 
Ðð $2ˆÐÑ Ø'9ˆÐ#Ñ$Øˆr1   c           
      ót   — | j         | j        | j        | j        | j        | j        | j        | j        | j        dœ	S )zGet the identifying parameters.©	r   r   r   r   r   r   r   r   r   rA   ©Úselfs    r/   Ú_identifying_paramszBeam._identifying_paramsp   sC   € ð œ/Ø”IØ”8Ø”kØ”8Ø"Ô1Ø#Ô3Øœ/Ø Ô-ð

ð 

ð 
	
r1   c                 ó   — dS )zReturn type of llm.Úbeamr+   rB   s    r/   Ú	_llm_typezBeam._llm_type   s	   € ð ˆvr1   c                 ó  — t          j        d¦  «        }d}t          |d¦  «        5 }|                     |                     | j        | j        | j        | j        | j	        | j
        ¬¦  «        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zBCreates a Python file which will contain your Beam app definition.a          import beam

        # The environment your code will run on
        app = beam.App(
            name="{name}",
            cpu={cpu},
            memory="{memory}",
            gpu="{gpu}",
            python_version="{python_version}",
            python_packages={python_packages},
        )

        app.Trigger.RestAPI(
            inputs={{"prompt": beam.Types.String(), "max_length": beam.Types.String()}},
            outputs={{"text": beam.Types.String()}},
            handler="run.py:beam_langchain",
        )

        zapp.pyÚw)r   r   r   r   r   r   N)ÚtextwrapÚdedentÚopenÚwriteÚformatr   r   r   r   r   r   ©rC   ÚscriptÚscript_nameÚfiles       r/   Úapp_creationzBeam.app_creation„   sÜ   € å”ðñ
ô 
ˆð. ˆÝ�+˜sÑ#Ô#ð 
	 tØ�JŠJØ—’ØœØœØœ;ØœØ#'Ô#6Ø$(Ô$8ð ñ ô ñ	ô 	ð 	ð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	s   §ABÂBÂBc                 óà   — t          j        d¦  «        }d}t          |d¦  «        5 }|                     |                     | j        ¬¦  «        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z5Creates a Python file which will be deployed on beam.a  
        import os
        import transformers
        from transformers import GPT2LMHeadModel, GPT2Tokenizer

        model_name = "{model_name}"

        def beam_langchain(**inputs):
            prompt = inputs["prompt"]
            length = inputs["max_length"]

            tokenizer = GPT2Tokenizer.from_pretrained(model_name)
            model = GPT2LMHeadModel.from_pretrained(model_name)
            encodedPrompt = tokenizer.encode(prompt, return_tensors='pt')
            outputs = model.generate(encodedPrompt, max_length=int(length),
              do_sample=True, pad_token_id=tokenizer.eos_token_id)
            output = tokenizer.decode(outputs[0], skip_special_tokens=True)

            print(output)  # noqa: T201
            return {{"text": output}}

        zrun.pyrI   )r   N)rJ   rK   rL   rM   rN   r   rO   s       r/   Úrun_creationzBeam.run_creationª   sÅ   € å”ðñ
ô 
ˆð2 ˆÝ�+˜sÑ#Ô#ð 	B tØ�JŠJ�v—}’}°´�}Ñ@Ô@ÑAÔAÐAð	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bs   §/A#Á#A'Á*A'c                 óª  — 	 ddl }|j        dk    rt          ‚n# t          $ r t          d¦  «        ‚w xY w|                      ¦   «          |                      ¦   «          t          j        dddd¬¦  «        }|j        dk    r½|j        }t           
                    |¦  «         |                     d¦  «        }|D ]r}|                     d	¦  «        r[|                     d
¦  «        d         | _        |                     d¦  «        d                              ¦   «         | _        | j        c S Œst!          d|› �¦  «        ‚t!          d|j        › �¦  «        ‚)úCall to Beam.r   Nr   z•Could not import beam python package. Please install it with `curl https://raw.githubusercontent.com/slai-labs/get-beam/main/get-beam.sh -sSfL | sh`.zbeam deploy app.pyT)ÚshellÚcapture_outputÚtextú
z. i  Send requests to: https://apps.beam.cloud/ú/éÿÿÿÿú:é   z\Failed to retrieve the appID from the deployment output.
                Deployment output: zDeployment failed. Error: )rF   Ú__path__ÚImportErrorrS   rU   Ú
subprocessÚrunÚ
returncodeÚstdoutr5   ÚinfoÚsplitÚ
startswithr"   Ústripr   r4   Ústderr)rC   rF   ÚprocessÚoutputÚlinesÚlines         r/   Ú_deployzBeam._deployÉ   s‰  € ð	ØˆKˆKˆKàŒ} Ò"Ð"Ý!Ð!ð #øåð 	ð 	ð 	Ýð:ñô ð ð	øøøð 	×ÒÑÔÐØ×ÒÑÔÐå”.Ø ¨¸TÈð
ñ 
ô 
ˆð Ô Ò"Ð"Ø”^ˆFÝ�KŠK˜ÑÔÐØ—L’L Ñ&Ô&ˆEàð 'ð '�Ø—?’?Ð#SÑTÔTð 'Ø"&§*¢*¨S¡/¤/°"Ô"5�D”KØ#Ÿzšz¨#™œ¨qÔ1×7Ò7Ñ9Ô9�D”HØœ;Ð&Ð&Ð&ð'õ
 ð/Ø$*ð/ð /ñô ð õ
 ÐJ¸'¼.ÐJÐJÑKÔKÐKs   ‚ ™3c                 ó´   — | j         r| j         dz   | j        z   }n| j        }t          j        |                     ¦   «         ¦  «                             ¦   «         S )Nr^   )r    r!   Úbase64Ú	b64encodeÚencodeÚdecode)rC   Úcredential_strs     r/   ÚauthorizationzBeam.authorizationð   sU   € àÔð 	5Ø!Ô0°3Ñ6¸Ô9PÑPˆNˆNà!Ô4ˆNÝÔ × 5Ò 5Ñ 7Ô 7Ñ8Ô8×?Ò?ÑAÔAÐAr1   ÚpromptÚstopÚrun_managerÚkwargsc                 óÈ  — | j         r
d| j         z   n| j        }|| j        dœ}|                     |¦  «         ddd| j        z   dddœ}t          t          ¦  «        D ]k}t          j        ||t          j
        |¦  «        ¬	¦  «        }	|	j        d
k    r|	 	                    ¦   «         d         c S t          j        t          ¦  «         Œlt                               d¦  «         dS )rW   zhttps://apps.beam.cloud/)rw   r   z*/*zgzip, deflatezBasic z
keep-alivezapplication/json)ÚAcceptzAccept-EncodingÚAuthorizationÚ
ConnectionzContent-Type)ÚheadersÚdataéÈ   rZ   z"Unable to successfully call model.r   )r"   r   r   Úupdaterv   ÚrangeÚDEFAULT_NUM_TRIESÚrequestsÚpostÚjsonÚdumpsÚstatus_codeÚtimeÚsleepÚDEFAULT_SLEEP_TIMEr5   r6   )
rC   rw   rx   ry   rz   r   Úpayloadr   Ú_Úrequests
             r/   Ú_callz
Beam._callø   sð   € ð ;?¼+ÐSÐ(¨4¬;Ñ6Ð6È4Ì8ˆØ#°4´?ÐCÐCˆØ�Š�vÑÔÐàØ.Ø%¨Ô(:Ñ:Ø&Ø.ð
ð 
ˆõ Õ(Ñ)Ô)ð 	+ð 	+ˆAÝ”m C°½t¼zÈ'Ñ?RÔ?RÐSÑSÔSˆGØÔ" cÒ)Ð)Ø—|’|‘~”~ fÔ-Ð-Ð-Ð-ÝŒJÕ)Ñ*Ô*Ð*Ð*Ý�ŠÐ;Ñ<Ô<Ð<Øˆrr1   )r(   N)NN)+Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚ__annotations__r   r   r   r   r   r   r   r   r   r   Údictr   r   r   r    r!   r"   r   r   Úmodel_configr   Úclassmethodr;   r   r?   Úpropertyr   rD   rG   rS   rU   ro   rv   r3   r   r�   r+   r1   r/   r   r      sÐ  € € € € € € ð ð  ðD €J�ÐÐÑØ€Dˆ#€N€N�NØ€Cˆ€M€M�MØ€FˆCÐÐÑØ€Cˆ€M€M�MØ€N�CÐÐÑØ!#€O�T˜#”YÐ#Ð#Ñ#Ø€J�ÐÐÑØ€Cˆ€M€M�MØà#( 5¸Ð#>Ñ#>Ô#>€L�$�s˜C�x”.Ð>Ð>Ñ>ðð €N�CÐÐÑØ Ð˜Ð Ð Ñ Ø €FˆH�SŒMÐ Ð Ñ à�:Øðñ ô €Lð €_˜(Ð#Ñ#Ô#Øð  c¨3 h¤ð °Cð ð ð ñ „[ñ $Ô#ðð" ð
¨$ð 
°4ð 
ð 
ð 
ñ „Xð
ð ð
 W¨S°#¨XÔ%6ð 
ð 
ð 
ñ „Xð
ð ð˜3ð ð ð ñ „Xðð$ð $ð $ð $ðLBð Bð Bð Bð>%L˜ð %Lð %Lð %Lð %LðN ðB˜sð Bð Bð Bñ „XðBð  $Ø:>ð	ð àðð �tŒnðð Ð6Ô7ð	ð
 ðð 
ðð ð ð ð ð r1   r   ) rq   r‡   Úloggingrb   rJ   rŠ   Útypingr   r   r   r   r   r…   Úlangchain_core.callbacksr   Ú#langchain_core.language_models.llmsr	   Úlangchain_core.utilsr
   r   Úlangchain_core.utils.pydanticr   Úpydanticr   r   r   Ú	getLoggerr‘   r5   r„   rŒ   r   r+   r1   r/   ú<module>r£      s9  ðØ €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à €€€Ø =Ð =Ð =Ð =Ð =Ð =Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à	ˆÔ	˜8Ñ	$Ô	$€àÐ ØÐ ð{ð {ð {ð {ð {ˆ3ñ {ô {ð {ð {ð {r1   