a ed\@sddlmZddlmZmZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd lmZdd lmZdd lmZmZmZmZddlmZddlmZddlm Z ddl!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,m-Z-m.Z.ddl/m0Z0m1Z1ddl2Z2ddl3m4Z4ddl5m6Z6m7Z7ddl8m9Z9ddl:m;Z;mm?Z?ddl@mAZAddlBZBGdd d e0ZCGd!d"d"e0ZDGd#d$d$e;ZEdS)%)load_summarize_chain)PromptTemplateLLMChain) ChatOpenAI)r)TokenTextSplitter)OpenAIEmbeddings)FAISS) RetrievalQA) load_tools)initialize_agent) AgentType)Document)BaseToolStructuredToolTooltool)StdOutCallbackHandler)StreamingStdOutCallbackHandler)BaseCallbackManager)AnyDictListOptionalUnion)BaseCallbackHandler) print_text) AgentAction AgentFinish LLMResult) BaseModelFieldN) BeautifulSoup)Thread Condition)deque) BaseLLMModelCallbackToIteratorChuanhuCallbackHandler)default_chuanhu_assistant_model)SUMMARIZE_PROMPTc@s eZdZUeddZeed<dS)WebBrowsingInputURL of a webpage descriptionurlN)__name__ __module__ __qualname__r r0str__annotations__r6r6D/Users/treediagram/dev/ChuanhuChatGPT/modules/models/ChuanhuAgent.pyr,$s r,c@s2eZdZUeddZeed<eddZeed<dS)WebAskingInputr-r.r0zMQuestion that you want to know the answer to, based on the webpage's content.questionN)r1r2r3r r0r4r5r9r6r6r6r7r8's r8csTeZdZdddfdd ZddZdd Zd d Zd d ZddZddZ Z S)ChuanhuAgent_ClientN)returncstj||dtddd|_||_t|dtd|_t|ddd|_t t dgd }t |jd d ||d |_ d |j vrtgd|jd|_ntgd|jd|_|jtj|jddtd|jtj|jddtddS)N) model_nameuseri) chunk_size chunk_overlapr)openai_api_key temperaturer=z gpt-3.5-turbotext)templateinput_variables map_reduceT) chain_typereturn_intermediate_steps map_promptcombine_promptZPro)zgoogle-search-results-jsonllm-matharxiv wikipediaz wolfram-alpha)llm)z ddg-searchrLrMrNzSummary Webpagez>useful when you need to know the overall content of a webpage.)funcnamer/ args_schemaz Ask Webpagez?useful when you need to ask detailed questions about a webpage.)super__init__r text_splitterapi_keyrr*rO cheap_llmrr+rsummarize_chainr=r toolsappendr from_function summary_urlr,rask_urlr8)selfr=rB user_namePROMPT __class__r6r7rT-s4  zChuanhuAgent_Client.__init__cCs.t|d}|j|g}|jd|idddS)N page_contentinput_documentsT)return_only_outputs output_text)r rUsplit_documentsrX)r^rDtextsr6r6r7summaryLs zChuanhuAgent_Client.summarycCsDt|}t|jd}ddd|dD}td||S)Nz html.parserr;css|]}|VqdS)N)getText).0sr6r6r7 Vz8ChuanhuAgent_Client.fetch_url_content..pzExtracted text from )requestsgetr!rDjoinfind_alllogginginfo)r^r0responsesouprDr6r6r7fetch_url_contentQs   z%ChuanhuAgent_Client.fetch_url_contentcCs ||}||}d|}|S)Nzwebpage content summary: )ryrj)r^r0rDZ text_summaryZ url_contentr6r6r7r\Zs  zChuanhuAgent_Client.summary_urlc Csd||}t|d}|j|g}t|jd}t||}|}t j |j d|d}| |dS)Nrc)rBstuff)rOrH retrieveru Reply in 中文) ryr rUrhrrVrfrom_documents as_retrieverr from_chain_typerWrun) r^r0r9rDri embeddingsdbr{qar6r6r7r]as    zChuanhuAgent_Client.ask_urlcCs>|jdd}t|j|jtjdd}|j|dd}|dfS)NcontentT)agentverbose Reply in 简体中文input)historyr rYrOr +STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTIONr)r^r9rreplyr6r6r7get_answer_at_oncensz&ChuanhuAgent_Client.get_answer_at_oncec#sjjddtttjgdfdd}t|d}|d}D]}||7}|VqRdS)Nrr)handlerscs@tjjtjdd}|jdd}|dS)NT)rrcallback_managerrr)r rYrOr rrcallbackfinish)rritmanagerr9r^r6r7 thread_funcys z?ChuanhuAgent_Client.get_answer_stream_iter..thread_func)targetr;)rr'rr(rr"start)r^rt partial_textvaluer6rr7get_answer_stream_iterus z*ChuanhuAgent_Client.get_answer_stream_iter)r;) r1r2r3rTrjryr\r]rr __classcell__r6r6rar7r:,s  r:)Flangchain.chains.summarizer langchainrrlangchain.chat_modelsrlangchain.promptslangchain.text_splitterrlangchain.embeddingsrlangchain.vectorstoresrlangchain.chainsr langchain.agentsr r r langchain.docstore.documentr Zlangchain.toolsrrrrlangchain.callbacks.stdoutr$langchain.callbacks.streaming_stdoutrlangchain.callbacks.managerrtypingrrrrrlangchain.callbacks.baserlangchain.inputrlangchain.schemarrrpydanticrr rqbs4r! threadingr"r# collectionsr$ base_modelr&r'r(configr*presetsr+rur,r8r:r6r6r6r7s>