a de@sddlmZddlmZmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlZddlZddlZddlmZddlZdd lTdd lTdd lTdd lmZdd lm Z m!Z!m"Z"dd l#mZd dl$m%Z%m&Z&Gddde%Z'Gddde%Z(Gddde%Z)Gddde%Z*d1ddddZ+e,dkre-dddd Z.e/e.d!Z0Wdn1s0Yej1ej2d"e+d#d$Z3gZ4d%Z5e6ej7j8d&ej7j9e6e3:e6ej7j8d'ej7j9d(Z;e3je6ej7j8d+ej7j9d,Z;e3je6ej7j8d.ej7j9e3j?e4e5d/D]Z=e6e=qe6d0e3j>dS)2) annotations) TYPE_CHECKINGListN)BytesIO)Image)tqdm)Enum)*)shared)retrieve_proxy usage_limit sensitive_id)config) BaseLLMModel ModelTypecseZdZedddfddfdd ZddZd d Zd d Zd dZddZ e j j dddZ ddZddZddZfddZZS) OpenAIClientg?Nonereturncs.tj|||||d||_d|_|dS)N) model_name temperaturetop_p system_promptuserT)super__init__api_keyZ need_api_key_refresh_header)selfrrrrr user_name __class__>/Users/treediagram/dev/ChuanhuChatGPT/modules/models/models.pyr!s zOpenAIClient.__init__ccsJ|jdd}|dur<||}d}|D]}||7}|Vq&n ttVdS)NT)streamr) _get_response_decode_chat_responseSTANDARD_ERROR_MSGGENERAL_ERROR_MSG)r!responseiter partial_textir%r%r&get_answer_stream_iter5s   z#OpenAIClient.get_answer_stream_itercCs<|}t|j}|dddd}|dd}||fS)Nchoicesrmessagecontentusage total_tokens)r(jsonloadstext)r!r,r3Ztotal_token_countr%r%r&get_answer_at_once@s   zOpenAIClient.get_answer_at_oncecCs>tt|}|jdur:t|jdkr:tt|j}||S|S)Nr) count_tokenconstruct_userrlenZall_token_countsconstruct_system)r! user_inputZinput_token_countZsystem_prompt_token_countr%r%r&r:Gs zOpenAIClient.count_tokenc Csztj}t|d}|jddd}tjjd|d|}z||}Wnrt y}zZdt |vrt dWYd}~WSdt |vrt d WYd}~WSt d WYd}~WSd}~00t |d d d }t |d t d}tdjt d||t dWStjjy.ttt} | YStjjyTttt} | YSt y}z:ddl} | tt dt |ttWYd}~Sd}~00dS)Nz%Y-%m-%dr)dayz ?start_date=z &end_date=zInvalid authorization headeruV**获取API使用情况失败**,需在填写`config.json`中正确填写sensitive_idz Incorrect API key provided: sessu@**获取API使用情况失败**,sensitive_id错误或已过期u**获取API使用情况失败**Z total_usagedr zbilling_info.htmlu本月使用金额)label usage_percent rounded_usager ru获取API使用情况失败:)datetimenowget_last_day_of_monthstrftimereplacer state usage_api_url_get_billing_data Exceptionstri18nroundr get_htmlformatrequests exceptionsConnectTimeoutr*CONNECTION_TIMEOUT_MSGERROR_RETRIEVE_MSG ReadTimeoutREAD_TIMEOUT_MSG traceback print_excloggingerror) r!Z curr_timeZlast_day_of_monthZfirst_day_of_monthZ usage_urlZ usage_dataerDrC status_textrZr%r%r& billing_infoPsJ      zOpenAIClient.billing_infocCsdSNr%)r!Znew_upper_limitr%r%r&set_token_upper_limitxsz"OpenAIClient.set_token_upper_limitFc CsT|j}|j}|j}ttjj|tjjdd|d}|durTt |g|}|j ||j |j |j ||j|jd}|jdur|j|d<|jdur|j|d<|jdur|j|d<|jr|j|d<|rt}nt}tjjtkrtd tjjtHztjtjj||||d }WnYWddS0Wdn1sF0Y|S) Napplication/jsonBearer z Content-Type Authorization)modelmessagesrrnr'presence_penaltyfrequency_penaltyZ max_tokensstop logit_biasru使用自定义API URL: )headersr6r'timeout)rrhistoryr\debugcoloramaForeYELLOWRESETr=rrrZ n_choicesrjrkmax_generation_tokenZ stop_sequencermZuser_identifierTIMEOUT_STREAMING TIMEOUT_ALLr rJcompletion_urlCOMPLETION_URLinfor rSpost) r!r'openai_api_keyrrprnpayloadror,r%r%r&r({s^          4zOpenAIClient._get_responsecCsddtd|_dS)Nrcrdre)rrnr!r%r%r&r szOpenAIClient._refresh_headercCsjt"tj||jtd}Wdn1s.0Y|jdkrN|}|Std|jd|jdS)N)rnroz$API request failed with status code : ) r rSgetrnrx status_coder6rMr8)r!Z billing_urlr,datar%r%r&rLs$ zOpenAIClient._get_billing_datac csd}|D]}|r |}t|}zt|dd}Wn2tjylttd|||7}Yq Yn0|dkr d|ddvr |ddddkrqz|dddd VWq ty}zWYd}~q WYd}~q d}~00q |rt|dS) Nru"JSON解析错误,收到的内容: deltar1rZ finish_reasonrlr3) iter_linesdecoder<r6r7JSONDecodeErrorprintrOrM)r!r, error_msgchunk chunk_lengthr^r%r%r&r)s(  $z"OpenAIClient._decode_chat_responsecst|}||Sra)rset_keyr )r!Znew_access_keyretr#r%r&rs zOpenAIClient.set_key)F)__name__ __module__ __qualname__INITIAL_SYSTEM_PROMPTrr0r9r:r`rbr rJswitching_api_keyr(r rLr)r __classcell__r%r%r#r&r s   ( 8rcs<eZdZd ddfdd ZddZdd Zd d ZZS) ChatGLM_Clientrrrc s*tj||dddlm}m}ddl}tdus:tdur&t }d}t j drnt d}||vrnd|}|dur||} n d|} |j| ddad } d |vrd} |j| dd} |jrtd | } nF|d kr|dur| std | d} ntd| } | } | adS)Nrrr) AutoTokenizer AutoModelmodelsmodels/zTHUDM/T)Ztrust_remote_codeFZint4zCUDA is available, using CUDADarwinzRunning on macOS, using MPSZmpszGPU is not available, using CPU)rr transformersrrtorchCHATGLM_TOKENIZER CHATGLM_MODELplatformsystemospathexistslistdirZfrom_pretrainedcuda is_availabler\r{halftofloateval) r!rr"rrrZ system_name model_path model_dirs model_sourceZ quantifiedrgr#r%r&rs@        zChatGLM_Client.__init__csxdd|jD}ttjjtjjtddksRJdfddt dtdD|fS)NcSsg|] }|dqS)r3r%).0xr%r%r& z7ChatGLM_Client._get_glm_style_input..r rz3History should be even length. current history is: cs g|]}||dgqS)rr%)rr/rpr%r&rs) rppopr\rqrrrsrtrur<range)r!queryr%rr&_get_glm_style_inputs  z#ChatGLM_Client._get_glm_style_inputcCs,|\}}tjt||d\}}|t|fS)Nr)rrZchatrr<)r!rprr,_r%r%r&r9s   z!ChatGLM_Client.get_answer_at_onceccs<|\}}tjt|||j|j|jdD]\}}|Vq(dS)N) max_lengthrr)rrZ stream_chatrZtoken_upper_limitrr)r!rprr,r%r%r&r0#s z%ChatGLM_Client.get_answer_stream_iter)r)rrrrrr9r0rr%r%r#r&rs( rcs<eZdZd ddfdd ZddZd d Zd d ZZS) LLaMA_ClientNrrrcsptj||dddlm}ddlm}ddlm}ddlm }m }m } d|_ d|_ |dd } || |_d |_tdustdurld} tjd rtd } || vrd |} | dur| } n d |} |durd|}|| |ddddddddddddddd}| ddddd}t|jddd}t|}Wdn1s@0Y|j|d|da|jd|| |d adS)!Nrr)Dataset) AutoPipeline)r)ModelArgumentsDatasetArgumentsInferencerArgumentsi )Z dataset_pathrrrzdecapoda-research/zlora/TmainF g?)Zmodel_name_or_pathlora_model_path model_typeZconfig_overridesZ config_nameZtokenizer_name cache_dirZuse_fast_tokenizerZmodel_revisionuse_auth_tokenZ torch_dtypeZuse_loraZlora_rZ lora_alphaZ lora_dropoutZuse_ram_optimized_loadrzconfigs/ds_config_chatbot.jsonZbf16)Z local_rankZ random_seed deepspeedZmixed_precisionrutf-8encodingnone)Z tune_strategy ds_configZ inferencer)Z pipeline_name model_args data_args pipeline_args)rrZlmflow.datasets.datasetrZlmflow.pipeline.auto_pipelinerZlmflow.models.auto_modelrZ lmflow.argsrrrrv end_stringdatasetr LLAMA_MODELLLAMA_INFERENCERrrrropenrr6load get_modelZ get_pipeline)r!rZ lora_pathr"rrrrrrrrrrrrfrr#r%r&r1sP          *zLLaMA_Client.__init__cCsxg}d}|jrd|jd}|jD]>}|ddkrL||d|dq"|d|dq"d |}|d 7}|S) Nrz Instruction:  rolerzInput: r3zOutput: rz Output: )rrpappendjoin)r!rp instructionrcontextr%r%r&_get_llama_style_inputes   z#LLaMA_Client._get_llama_style_inputcCsV|}|jdd|igd}tjt||j|jd}|ddd}|t |fS)N text_onlyr8type instancesrgrZmax_new_tokensrrr) rr from_dictr inferencerrvrto_dictr<)r!r input_datasetoutput_datasetr,r%r%r&r9sszLLaMA_Client.get_answer_at_onceccs|}d}d}td|j|D]l}|jdd||igd}tjt|||jd}| ddd}|dksx||j kr|q||7}|VqdS) Nrrrrr8rrr) rrrvrrrrrrrr)r!rr.steprrrr,r%r%r&r0s( z#LLaMA_Client.get_answer_stream_iter)Nr)rrrrrr9r0rr%r%r#r&r0s 4rcs^eZdZdfdd ZddZddZdd Zd d Zd d ZddZ ddZ ddZ Z S)XMChatrcsFtjd|d||_d|_|d|_d|_g|_d|_d|_ dS)Nxmchatrzhttps://xmbot.net/web) rrr session_idreset image_bytes image_pathZ xm_historyurl last_conv_id)r!rr"r#r%r&rszXMChat.__init__cCstt|_d|_gdfS)Nu 已重置)rNuuiduuid4rrrr%r%r&rsz XMChat.resetc Cst|}|j\}}d}t||||}|dkr\t||}t||}|||ftj}t} |jdkrv| d}|j | dd| } t | d} | S)NirRGBARGBJPEG)rRr)rrsizeminintresize ANTIALIASrmodeconvertsavegetvaluebase64 b64encoder) r!rimgwidthheightZ max_dimensionZ scale_ratio new_width new_heightbufferZ binary_imageZ base64_imager%r%r&image_to_base64s      zXMChat.image_to_base64cCsDdd}||r4td||||_||_n d|_d|_dS)NcSs$gd}tj|d}||vS)N)z.jpgz.jpegz.pngz.bmpz.gifz.tiffr)rrsplitextlower)filepathZvalid_image_extensionsZfile_extensionr%r%r& is_image_filesz,XMChat.try_read_image..is_image_fileu读取图片文件: )r\r{r rr)r!rrr%r%r&try_read_images zXMChat.try_read_imagecCs.|jdurdS|jdd}tj|j|ddS)Nu'点赞失败,你还没发送过消息goodrZappraiser6u"👍点赞成功,感谢反馈~rrSr|rr!rr%r%r&likes z XMChat.likecCs.|jdurdS|jdd}tj|j|ddS)Nu'点踩失败,你还没发送过消息badrru"👎点踩成功,感谢反馈~rrr%r%r&dislikes zXMChat.dislikec Cs|}d}d}|||||fS)NrFr%) r!Z real_inputsZ use_websearchfilesZreply_languagechatbotZ fake_inputsZdisplay_appendZlimited_contextr%r%r&prepare_inputsszXMChat.prepare_inputscCs|r|D](}|jrtd|j||jq|jdurN||jfdfg}|jdurtd|tt }|j |j |d|jd}t j |j|d}t|j}td|dd|dfS) z?if the model accepts multi modal input, implement this functionu尝试读取图像: Nu使用图片作为输入Z imgbase64user_idrr data_typerru图片回复: r)namer\r{rrrrrNrrrrrSr|rr6r7r8)r!rrlanguagefileconv_idrr,r%r%r&handle_file_uploads*     zXMChat.handle_file_uploadc Cs|jdd}tt}||_|j|j|d|d}tj|j |d}z"t |j }|dt |dfWSty}z|j t |j fWYd}~Sd}~00dS)Nr3r8rrr)rprNrrrrrrSr|rr6r7r8r<rM)r!questionr"rr,r^r%r%r&r9 s  zXMChat.get_answer_at_once)r) rrrrrr rrrrr#r9rr%r%r#r&rs   rrrrc Csptdd|}t|}d} g} d} |tjkr8dt_d} tjj|d} z|tjkrt d|t ||||||d} n\|tj krt d|t ||d } n2|tjkr|d krd |d }t |d} tjd rtd dd gd} dg| } n|tjkrl|d krlt d|d|d} |dkrLd}|d7}n|d|7}t|||d } np|tjkrtjdd krtjd}t||d} n6|tjkrddlm}|||d } n|tjkrddlm}|||d } n|tjkrddlm}|||||d} n|tjkrfddlm }tjdd krTtjd}|||||d} nv|tj!krddl!m"}||||d } nN|tj#krddl$m%}tjd}||||d } n|tj&krt'd|t |WnDt(y,}z*d dl)}|*t+d!|}WYd}~n d}~00t,|}| rP| || t||fS| || tj-j| | d"||fSdS)#Nu模型设置为了: FT)rBu正在加载OpenAI模型: )rrrrrr"u正在加载ChatGLM模型: )r"ru 现在请为 u 选择LoRA模型Zlora)plain filetypeszNo LoRAu正在加载LLaMA模型: z + z + No LoRAZXMCHAT_API_KEY)rr"r)StableLM_Client) MOSS_Client) Yuan_Client)rr"r)MiniMax_ClientZMINIMAX_API_KEY)ChuanhuAgent_Client)Google_PaLM_ClientZGOOGLE_PALM_API_KEYu未知模型: rr)r1visible).rOrget_typeZOpenAIrlocal_embeddinggrChatbotupdater\r{rZChatGLMrZLLaMArrisdirget_file_namesrrenvironrStableLMr)MOSSr*ZYuanAIZinspurair+ZMinimaxZminimaxr,Z ChuanhuAgentr- GooglePaLMZ Google_PaLMr.Unknown ValueErrorrMrZr[r*hide_middle_charsDropdown)rr access_keyrrrr"msgrZlora_selector_visibilityZ lora_choicesZdont_change_lora_selectorrgrr)r*r+r,r-r.r^rZZ presudo_keyr%r%r&rs                             $r__main__z config.jsonrrrr})levelzchatglm-6b-int4)rFu测试账单功能u 测试问答u巴黎是中国的首都吗?)inputsrr'u测试问答后history : u测试记忆力u!我刚刚问了你什么问题?u测试记忆力后history : u测试重试功能)rr'u重试后history : )NNNNNr)@ __future__rtypingrrr\r6 commentjsonZcjsonrsysrSurllib3rriorPILrrrrasyncioaiohttpenumrrpresets index_funcutilsrr rr r rmodulesZ base_modelrrrrrrrrrrrr} basicConfigDEBUGclientrr'r{BackGREENrur`r%predictr/rpretryr%r%r%r&sz       IHjZ .