From f5164b36466c5f5adca320fc36477683d66d0a38 Mon Sep 17 00:00:00 2001 From: Baize Date: Sat, 1 Apr 2023 10:25:59 +0000 Subject: [PATCH] Upload 14 files --- .../__pycache__/chat_func.cpython-38.pyc | Bin 0 -> 605 bytes .../__pycache__/llama_func.cpython-38.pyc | Bin 0 -> 4623 bytes .../__pycache__/openai_func.cpython-38.pyc | Bin 0 -> 1795 bytes .../__pycache__/overwrites.cpython-38.pyc | Bin 0 -> 2600 bytes .../__pycache__/presets.cpython-38.pyc | Bin 0 -> 2258 bytes app_modules/__pycache__/shared.cpython-38.pyc | Bin 0 -> 1082 bytes app_modules/__pycache__/utils.cpython-38.pyc | Bin 0 -> 9987 bytes app_modules/overwrites.py | 57 +++ app_modules/presets.py | 80 ++++ app_modules/utils.py | 366 ++++++++++++++++++ assets/Kelpy-Codos.js | 76 ++++ assets/custom.css | 208 ++++++++++ assets/custom.js | 1 + assets/favicon.ico | Bin 0 -> 15406 bytes 14 files changed, 788 insertions(+) create mode 100644 app_modules/__pycache__/chat_func.cpython-38.pyc create mode 100644 app_modules/__pycache__/llama_func.cpython-38.pyc create mode 100644 app_modules/__pycache__/openai_func.cpython-38.pyc create mode 100644 app_modules/__pycache__/overwrites.cpython-38.pyc create mode 100644 app_modules/__pycache__/presets.cpython-38.pyc create mode 100644 app_modules/__pycache__/shared.cpython-38.pyc create mode 100644 app_modules/__pycache__/utils.cpython-38.pyc create mode 100644 app_modules/overwrites.py create mode 100644 app_modules/presets.py create mode 100644 app_modules/utils.py create mode 100644 assets/Kelpy-Codos.js create mode 100644 assets/custom.css create mode 100644 assets/custom.js create mode 100644 assets/favicon.ico diff --git a/app_modules/__pycache__/chat_func.cpython-38.pyc b/app_modules/__pycache__/chat_func.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05a5a0ef1e402812ef594b91c436fc46f3988dc3 GIT binary patch literal 605 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 C6Yx#| literal 0 HcmV?d00001 diff --git a/app_modules/__pycache__/openai_func.cpython-38.pyc b/app_modules/__pycache__/openai_func.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efc6f088ef85632d5a83cfec345d7d5657364f93 GIT binary patch literal 1795 zcmZ8h+iM*~7@ygly_`KcX-v|amvSBovXS%a|V!#<~W3`sSXF+X3nTC@83Wj2;mFR19RipYhS`Q1<(*$19)^$oYa5gb$ z8ymQ%585X9j}O`w_(_O*MyYcu$htx8QdikFFh-?b8niZvO2RKzF{dQkF#@qV#0>t0 zFqd>;mAKTvH?&52W-{{BM;mK;&n!(i*5R4%NRVYw*bdb3w3hNT=~~AbY?C)#tvfWG zCW0m6$lPkiWMirjizyGg6<9j&&dr_jPn~{${+x6cg~-(Lt*pwr^3M(ebrs0_kzyRq z=gzIa?|uGLQ(>BSZd|)}_%Uz9+ zz$Fw+2(5FOv4rY*miJI{hLKI?Ugi!-fg+Niay$u>IIH zh<*T@SbIXS^F$*A6Fh?LzO_|P>;M1S)}Z~LY4Dd|{4?BDyj9|^xJ!W5-QNT%fx&AS zc#GGy60hqUNHMSbcE7z&C@_(~v9p%|(|ZFf#DV2}emf4mDz2YJ$s|F-xZv=wFzUf{ z-9s>kNey5sxrFyu^QcTv0R1{V4n6WAnMdbPqRk^}DjiU()WF(Tjk9PLK|Xt_w&Xz0 ze=t(NsEeWfNHq2<1sNuc-9`;xaIPT!cpJB8HxA|iv|F2TF+T{$;_VTs2qHgN4#Fr{ zh!|JGmrmbX4lGbmdqfUruNTuDUMPOP+9 zrUWaE>H(8_E;v7+Vh-Di<#HI*s~*0&{)@>80Jx!yx_MbY4O-fYsdvmZt9|q5q3u}< zK@=oy#t$hhX0i@Xt0;0`uoY2JzHihK$l5k%UxRM`Di{P5bnq}(8;CjzMboxgrZ$2{ zfu{TLIMhRc7zfKIV3a#t?W4c-u^lownt>V^C{-!DlIyPhaJ2=mzGDbiy5VEWDDGGJ fcdT5=mRHNSC;M7_Q(bUA1jdFnHPy;=`<4Fzd1~v* literal 0 HcmV?d00001 diff --git a/app_modules/__pycache__/overwrites.cpython-38.pyc b/app_modules/__pycache__/overwrites.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b14c1a2a7776265edeee71f0b3df9b88dac86344 GIT binary patch literal 2600 zcmbVN&2JmW6`$EJQq+efS+bKtNEb*8gMm$^Zj-u(AQVVHf;Lf8+eM2_gvDxSNG`S9 zWoCw!MJ#~=HqiEv7QHqxDjoBG^sks}PC+j{=hWX@iZbH_J#-d3^WK}8-S_o-?|19# zEr#*-zi)~AO~$?;W_i%=PZ{I-Umye%JZB>waZa?8JCTFc&E1g~d9}>T{ZSAFqej%Y zJkyMtIOFFlkLZq{x3C7Hfv5SID^^77nHQ}Jde%O3#Jbo3zb4nkHL)qS#P%od-`yMW6erpSN}7o(QaZjEJ_vf>Auk?+FzlQQenCETg!_zD&d=CWK68afoN+4m zDZiBX=WgX*V6S3Buj23&p-j!4<0PBPZZaOnqf$(Ask`N4 zsZLd9r0$H*Y->MkYa?}N0ykjIn0U6I9PBvoRh^@e3u zM6dPbrIC7^XU0es_p`^ci02s>wQ6zghPH1#E%Tmg;5Q2RWzibkbet7Z#0XZjUOQ{? zotIR$*T2Q3tN4f}TN!Wh4Zh7=&L&r{f}g%#=YNd~LP1!Chh-sehcD=(BP0huQ!6;0 zQhqH4#o!7AAAupypEUJm#ry2UQ9FHvsLy6jh15T~kA!y-BX8y#R(VgkzGpbCGY`BE z{$0QX>&&klK*X#3o7uo*qqxavN|NgM;*J`LPeFu~Ej2w+Ee`39fmdd)v zrFl8;R>!3_$mSGY-o+h#0~1@>1d| z+ylItvPet9*YxJq$zRKSe0JxZQj{9UQ~JYV5VR>9Q60Gc5eS3E_LNgWHXPN!HK+!{ zd+z^*{fYIs@I~;fIYV_c?$8_haUhVb?Z)Bs<^!3R3H>-6CXW-HqC6VZ+-Y-vP9IFS z_Pdwlm1yNk^fj%ZO%FV@|Xhw-UZ`m zBhbk^)Km)gy8|=I52lSv0_!hNN9duqWb7|C#Uu50wJGs>kRcg&{PHO7Nr6GBVOR=2M}wj zQB+y>5asD@Rl6@<^4(QI|Hk!p!}?=j%Gl;S34Zm^woWL>b&RdkSLnax1f9gLEN*MN z`LeBTu1J%)s$HVy`hHUv>|N^HL>*iU)K4I3ziL}?+?$}!%Q#k4hfc>-C7n-OqT1q^wub_UJ0;S-m^~cuJsh6 zp?*l8rVOriQ*ROVHcdaK=^jnDXu9guOA%`B&wKCz!9f#t*Lc%e!( Idroupzjx5TJpcdz literal 0 HcmV?d00001 diff --git a/app_modules/__pycache__/presets.cpython-38.pyc b/app_modules/__pycache__/presets.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..642c379df7390f5da4b50595ffc48316d7577556 GIT binary patch literal 2258 zcmb7F&2k$>5Z2F1{*mn@Knx)yOq8T5hDf`TA~|+s6}IApDjX-J*i=QAt=XNCcI?&8 z*37JJ>A)NK#GO0E3-AQI0#$qElsjBF(X+B5#~3KKOP~60db($OdiNI>=Tq?PWFC+o z3aQj@S~&k)1K}(9$)5p8ilqHiH%&6#49Rx0#ON9%*Ugc9H&4?CGY7K?&XE~13%@y_ zc_95i15`LIoY@!1Wi+)fk|lD5TqW1Y2joNY5xGv5$;adqa^rL%i7+Kbj*nI)~l8ko;*PVEc&2RJY2V)6kDjt27M%jyHWI%3gxM+1h(12Y(!Dh z^eQdvrc5#g^>ukq!J?e!!l~~0i@zG>}y}0fmDLI${(UoaF01mQKDl{w&IZrBc&Y!u8>Ou z$p!3z0|J>-gd^o~0eSGmP6GlGO-wvw0Td$<3lh0c11d0tN0WDg_Q4e^G~|&${5U{@ z$;0w|(}crq&5yo6f5@;iysK$nTsUT(aB>!qs1q??>62?>mw`_uK8x-u6?p z^#;A#?7ZIYlu@bF8qM6bs_ja{8eJEC2S2DjM3uGLL$ua-h^%sTWwd;Wx(52cyI0EA z%1R;5x^*iy+=`_UE(BmL!AA+!6Ko{7n&9IE*Tz`4Afx(f!&$4xMql6|h`qHQ?m3#N z^&a&az|cBfrCLKOq)s%mRn-K{V@ne-jhZH4>J?4E)YdcsQ(e^rOl4Km%0g@e7+Nk1 z=OzpdISqLYGa6uIqxV)%N2g*=NZEnrBr_z$ArjjTXL`>;WfuPJ(mR-VIGFOYv;(}0NyWHm@h6aB>k8{TH zCO0m4D0-sK7GEr4Y8o${1fL%C#WL@o1^-8naiB>FQ@80>?@GALI9|T&_}o3T6;nR7 z&#k<9UVkyQ>nwm_WnWOktII>X6UO6AU&Og2W_*QE=?WGqm{B%-PU6BjMSK-5b$h?l z+1}l=+b{Qb_u}QV>ki`Cb+=z^cD{-8Fa`%y#>Q*jQ*o}HyrP_LLK)9ZT5=F);Tsd* zkOS=dHVjYOp)fjGFY@hV{f{YO>8984XWR7nfSRgA@DTSSZbHqD>B4yOeLTP>OzH#b zs*H*`~oLtY$r8UD_Co1XFap?-t5et`~H~WxcdGIesIQq(xyKw+??PnUZMa7JY_2$ zbI#r|5MbRgux>>xw76xl1@?>u&M)+20k4N|KE9XdpFSkC?+<~S6P(2{3e92;EEd3H zOWU#2MvVtxgLB8?Aq-%Ms|zlSa2>%IJY2^xK`g&^W~D0iS%TbmgLJ}pi?g8gfZs5Q z?D2$%K5uyKEiX%LOqG`!aBCMj{jy=kMc?12;UZhAm@HJ8rfQ|a z++-IzDUarAxz?e|bGgc(N_7zy3uQD+^Xq!Fi$5d|M27M8e#3RTv;8mWjfl>SjUmi{ z1hH(z2(@}>bdp_ZLy2yY{1&ORBn>{AX^{Tc<=pHpXTu{Zo6486GHDNf23cK;pg(pu9&@0*$ b>16E`^o|~jUc1L_gTJPC)g(F*doTU~J>b(e literal 0 HcmV?d00001 diff --git a/app_modules/__pycache__/utils.cpython-38.pyc b/app_modules/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b2d140a2b1f6e00d4924f7525ece0346f348ea9 GIT binary patch literal 9987 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 VgAgmjmRXe;_TTpL^5|IQe*pQ6wS52p literal 0 HcmV?d00001 diff --git a/app_modules/overwrites.py b/app_modules/overwrites.py new file mode 100644 index 0000000..0ed0d65 --- /dev/null +++ b/app_modules/overwrites.py @@ -0,0 +1,57 @@ +from __future__ import annotations +import logging + +from llama_index import Prompt +from typing import List, Tuple +import mdtex2html + +from app_modules.presets import * +from app_modules.utils import * + +def compact_text_chunks(self, prompt: Prompt, text_chunks: List[str]) -> List[str]: + logging.debug("Compacting text chunks...🚀🚀🚀") + combined_str = [c.strip() for c in text_chunks if c.strip()] + combined_str = [f"[{index+1}] {c}" for index, c in enumerate(combined_str)] + combined_str = "\n\n".join(combined_str) + # resplit based on self.max_chunk_overlap + text_splitter = self.get_text_splitter_given_prompt(prompt, 1, padding=1) + return text_splitter.split_text(combined_str) + + +def postprocess( + self, y: List[Tuple[str | None, str | None]] +) -> List[Tuple[str | None, str | None]]: + """ + Parameters: + y: List of tuples representing the message and response pairs. Each message and response should be a string, which may be in Markdown format. + Returns: + List of tuples representing the message and response. Each message and response will be a string of HTML. + """ + if y is None or y == []: + return [] + temp = [] + for x in y: + user, bot = x + if not detect_converted_mark(user): + user = convert_asis(user) + if not detect_converted_mark(bot): + bot = convert_mdtext(bot) + temp.append((user, bot)) + return temp + +with open("./assets/custom.js", "r", encoding="utf-8") as f, open("./assets/Kelpy-Codos.js", "r", encoding="utf-8") as f2: + customJS = f.read() + kelpyCodos = f2.read() + +def reload_javascript(): + print("Reloading javascript...") + js = f'' + def template_response(*args, **kwargs): + res = GradioTemplateResponseOriginal(*args, **kwargs) + res.body = res.body.replace(b'', f'{js}'.encode("utf8")) + res.init_headers() + return res + + gr.routes.templates.TemplateResponse = template_response + +GradioTemplateResponseOriginal = gr.routes.templates.TemplateResponse \ No newline at end of file diff --git a/app_modules/presets.py b/app_modules/presets.py new file mode 100644 index 0000000..83c0b89 --- /dev/null +++ b/app_modules/presets.py @@ -0,0 +1,80 @@ +# -*- coding:utf-8 -*- +import gradio as gr + + +title = """

Baize

""" +description_top = """\ +
+Disclaimer: The LLaMA model is a third-party version available on Hugging Face model hub. This demo should be used for research purposes only. Commercial use is strictly prohibited. The model output is not censored and the authors do not endorse the opinions in the generated content. Use at your own risk. +
+""" +description = """\ +
+The demo is built on ChuanhuChatGPT. +
+""" +CONCURRENT_COUNT = 100 + + +ALREADY_CONVERTED_MARK = "" + +small_and_beautiful_theme = gr.themes.Soft( + primary_hue=gr.themes.Color( + c50="#02C160", + c100="rgba(2, 193, 96, 0.2)", + c200="#02C160", + c300="rgba(2, 193, 96, 0.32)", + c400="rgba(2, 193, 96, 0.32)", + c500="rgba(2, 193, 96, 1.0)", + c600="rgba(2, 193, 96, 1.0)", + c700="rgba(2, 193, 96, 0.32)", + c800="rgba(2, 193, 96, 0.32)", + c900="#02C160", + c950="#02C160", + ), + secondary_hue=gr.themes.Color( + c50="#576b95", + c100="#576b95", + c200="#576b95", + c300="#576b95", + c400="#576b95", + c500="#576b95", + c600="#576b95", + c700="#576b95", + c800="#576b95", + c900="#576b95", + c950="#576b95", + ), + neutral_hue=gr.themes.Color( + name="gray", + c50="#f9fafb", + c100="#f3f4f6", + c200="#e5e7eb", + c300="#d1d5db", + c400="#B2B2B2", + c500="#808080", + c600="#636363", + c700="#515151", + c800="#393939", + c900="#272727", + c950="#171717", + ), + radius_size=gr.themes.sizes.radius_sm, + ).set( + button_primary_background_fill="#06AE56", + button_primary_background_fill_dark="#06AE56", + button_primary_background_fill_hover="#07C863", + button_primary_border_color="#06AE56", + button_primary_border_color_dark="#06AE56", + button_primary_text_color="#FFFFFF", + button_primary_text_color_dark="#FFFFFF", + button_secondary_background_fill="#F2F2F2", + button_secondary_background_fill_dark="#2B2B2B", + button_secondary_text_color="#393939", + button_secondary_text_color_dark="#FFFFFF", + # background_fill_primary="#F7F7F7", + # background_fill_primary_dark="#1F1F1F", + block_title_text_color="*primary_500", + block_title_background_fill="*primary_100", + input_background_fill="#F6F6F6", + ) diff --git a/app_modules/utils.py b/app_modules/utils.py new file mode 100644 index 0000000..c34e261 --- /dev/null +++ b/app_modules/utils.py @@ -0,0 +1,366 @@ +# -*- coding:utf-8 -*- +from __future__ import annotations +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Tuple, Type +import logging +import json +import os +import datetime +import hashlib +import csv +import requests +import re +import html +import markdown2 +import torch +import sys +from pygments.lexers import guess_lexer, ClassNotFound + +import gradio as gr +from pypinyin import lazy_pinyin +import tiktoken +import mdtex2html +from markdown import markdown +from pygments import highlight +from pygments.lexers import guess_lexer,get_lexer_by_name +from pygments.formatters import HtmlFormatter +import transformers +from peft import PeftModel +from transformers import GenerationConfig, LlamaForCausalLM, LlamaTokenizer + +from app_modules.presets import * + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s", +) + + +def markdown_to_html_with_syntax_highlight(md_str): + def replacer(match): + lang = match.group(1) or "text" + code = match.group(2) + lang = lang.strip() + #print(1,lang) + if lang=="text": + lexer = guess_lexer(code) + lang = lexer.name + #print(2,lang) + try: + lexer = get_lexer_by_name(lang, stripall=True) + except ValueError: + lexer = get_lexer_by_name("python", stripall=True) + formatter = HtmlFormatter() + #print(3,lexer.name) + highlighted_code = highlight(code, lexer, formatter) + + return f'
{highlighted_code}
' + + code_block_pattern = r"```(\w+)?\n([\s\S]+?)\n```" + md_str = re.sub(code_block_pattern, replacer, md_str, flags=re.MULTILINE) + + html_str = markdown(md_str) + return html_str + + +def normalize_markdown(md_text: str) -> str: + lines = md_text.split("\n") + normalized_lines = [] + inside_list = False + + for i, line in enumerate(lines): + if re.match(r"^(\d+\.|-|\*|\+)\s", line.strip()): + if not inside_list and i > 0 and lines[i - 1].strip() != "": + normalized_lines.append("") + inside_list = True + normalized_lines.append(line) + elif inside_list and line.strip() == "": + if i < len(lines) - 1 and not re.match( + r"^(\d+\.|-|\*|\+)\s", lines[i + 1].strip() + ): + normalized_lines.append(line) + continue + else: + inside_list = False + normalized_lines.append(line) + + return "\n".join(normalized_lines) + + +def convert_mdtext(md_text): + code_block_pattern = re.compile(r"```(.*?)(?:```|$)", re.DOTALL) + inline_code_pattern = re.compile(r"`(.*?)`", re.DOTALL) + code_blocks = code_block_pattern.findall(md_text) + non_code_parts = code_block_pattern.split(md_text)[::2] + + result = [] + for non_code, code in zip(non_code_parts, code_blocks + [""]): + if non_code.strip(): + non_code = normalize_markdown(non_code) + if inline_code_pattern.search(non_code): + result.append(markdown(non_code, extensions=["tables"])) + else: + result.append(mdtex2html.convert(non_code, extensions=["tables"])) + if code.strip(): + # _, code = detect_language(code) # 暂时去除代码高亮功能,因为在大段代码的情况下会出现问题 + # code = code.replace("\n\n", "\n") # 暂时去除代码中的空行,因为在大段代码的情况下会出现问题 + code = f"\n```{code}\n\n```" + code = markdown_to_html_with_syntax_highlight(code) + result.append(code) + result = "".join(result) + result += ALREADY_CONVERTED_MARK + return result + +def convert_asis(userinput): + return f"

{html.escape(userinput)}

"+ALREADY_CONVERTED_MARK + +def detect_converted_mark(userinput): + if userinput.endswith(ALREADY_CONVERTED_MARK): + return True + else: + return False + + + +def detect_language(code): + if code.startswith("\n"): + first_line = "" + else: + first_line = code.strip().split("\n", 1)[0] + language = first_line.lower() if first_line else "" + code_without_language = code[len(first_line) :].lstrip() if first_line else code + return language, code_without_language + +def convert_to_markdown(text): + def replace_leading_tabs_and_spaces(line): + new_line = [] + + for char in line: + if char == "\t": + new_line.append(" ") + elif char == " ": + new_line.append(" ") + else: + break + return "".join(new_line) + line[len(new_line):] + + markdown_text = "" + lines = text.split("\n") + in_code_block = False + + for line in lines: + if in_code_block is False and line.startswith("```"): + in_code_block = True + markdown_text += "```\n" + elif in_code_block is True and line.startswith("```"): + in_code_block = False + markdown_text += "```\n" + elif in_code_block: + markdown_text += f"{line}\n" + else: + line = replace_leading_tabs_and_spaces(line) + line = re.sub(r"^(#)", r"\\\1", line) + markdown_text += f"{line} \n" + + return markdown_text + +def add_language_tag(text): + def detect_language(code_block): + try: + lexer = guess_lexer(code_block) + return lexer.name.lower() + except ClassNotFound: + return "" + + code_block_pattern = re.compile(r"(```)(\w*\n[^`]+```)", re.MULTILINE) + + def replacement(match): + code_block = match.group(2) + if match.group(2).startswith("\n"): + language = detect_language(code_block) + if language: + return f"```{language}{code_block}```" + else: + return f"```\n{code_block}```" + else: + return match.group(1) + code_block + "```" + + text2 = code_block_pattern.sub(replacement, text) + return text2 + +def delete_last_conversation(chatbot, history): + if len(chatbot) > 0: + chatbot.pop() + + if len(history) > 0: + history.pop() + + return ( + chatbot, + history, + "Delete Done", + ) + +def reset_state(): + return [], [], "Reset Done" + +def reset_textbox(): + return gr.update(value=""),"" + +def cancel_outputing(): + shared_state.interrupt() + textbox = reset_textbox() + return "Stop Done" + +def transfer_input(inputs): + # 一次性返回,降低延迟 + textbox = reset_textbox() + return ( + inputs, + gr.update(value=""), + gr.Button.update(visible=True), + gr.Button.update(visible=True), + ) + + +class State: + interrupted = False + + def interrupt(self): + self.interrupted = True + + def recover(self): + self.interrupted = False +shared_state = State() + + + + + +# Greedy Search +def greedy_search(input_ids: torch.Tensor, + model: torch.nn.Module, + tokenizer: transformers.PreTrainedTokenizer, + stop_words: list, + max_length: int, + temperature: float = 1.0, + top_p: float = 1.0, + top_k: int = 25) -> Iterator[str]: + generated_tokens = [] + past_key_values = None + current_length = 1 + for i in range(max_length): + with torch.no_grad(): + if past_key_values is None: + outputs = model(input_ids) + else: + outputs = model(input_ids[:, -1:], past_key_values=past_key_values) + logits = outputs.logits[:, -1, :] + past_key_values = outputs.past_key_values + + # apply temperature + logits /= temperature + + probs = torch.softmax(logits, dim=-1) + # apply top_p + probs_sort, probs_idx = torch.sort(probs, dim=-1, descending=True) + probs_sum = torch.cumsum(probs_sort, dim=-1) + mask = probs_sum - probs_sort > top_p + probs_sort[mask] = 0.0 + + # apply top_k + #if top_k is not None: + # probs_sort1, _ = torch.topk(probs_sort, top_k) + # min_top_probs_sort = torch.min(probs_sort1, dim=-1, keepdim=True).values + # probs_sort = torch.where(probs_sort < min_top_probs_sort, torch.full_like(probs_sort, float(0.0)), probs_sort) + + probs_sort.div_(probs_sort.sum(dim=-1, keepdim=True)) + next_token = torch.multinomial(probs_sort, num_samples=1) + next_token = torch.gather(probs_idx, -1, next_token) + + input_ids = torch.cat((input_ids, next_token), dim=-1) + + generated_tokens.append(next_token[0].item()) + text = tokenizer.decode(generated_tokens) + + yield text + if any([x in text for x in stop_words]): + return + +def generate_prompt_with_history(text,history,tokenizer,max_length=2048): + prompt = "The following is a conversation between a human and an AI assistant named Baize (named after a mythical creature in Chinese folklore). Baize is an open-source AI assistant developed by UCSD and Sun Yat-Sen University. The human and the AI assistant take turns chatting. Human statements start with [|Human|] and AI assistant statements start with [|AI|]. The AI assistant always replies in Markdown format. The AI assistant (Baize) always declines to engage with topics, questions, or requests related to unethical, controversial, or sensitive issues. Complete the transcript in exactly that format.\n[|Human|]Hello!\n[|AI|]Hi! How can I help you?" + history = ["\n[|Human|]{}\n[|AI|]{}".format(x[0],x[1]) for x in history] + history.append("\n[|Human|]{}\n[|AI|]".format(text)) + history_text = "" + + for x in history[::-1]: + if tokenizer(prompt+history_text+x, return_tensors="pt")['input_ids'].size(-1) <= max_length: + history_text = x + history_text + flag = True + if flag: + return prompt+history_text,tokenizer(prompt+history_text, return_tensors="pt") + else: + return False + + +def is_stop_word_or_prefix(s: str, stop_words: list) -> bool: + for stop_word in stop_words: + if s.endswith(stop_word): + return True + for i in range(1, len(stop_word)): + if s.endswith(stop_word[:i]): + return True + return False + + + +def load_tokenizer_and_model(base_model,adapter_model,load_8bit=False): + if torch.cuda.is_available(): + device = "cuda" + else: + device = "cpu" + + try: + if torch.backends.mps.is_available(): + device = "mps" + except: # noqa: E722 + pass + tokenizer = LlamaTokenizer.from_pretrained(base_model) + if device == "cuda": + model = LlamaForCausalLM.from_pretrained( + base_model, + load_in_8bit=load_8bit, + torch_dtype=torch.float16, + device_map="auto", + ) + model = PeftModel.from_pretrained( + model, + adapter_model, + torch_dtype=torch.float16, + ) + elif device == "mps": + model = LlamaForCausalLM.from_pretrained( + base_model, + device_map={"": device}, + torch_dtype=torch.float16, + ) + model = PeftModel.from_pretrained( + model, + adapter_model, + device_map={"": device}, + torch_dtype=torch.float16, + ) + else: + model = LlamaForCausalLM.from_pretrained( + base_model, device_map={"": device}, low_cpu_mem_usage=True + ) + model = PeftModel.from_pretrained( + model, + adapter_model, + device_map={"": device}, + ) + + if not load_8bit: + model.half() # seems to fix bugs for some users. + + model.eval() + return tokenizer,model,device diff --git a/assets/Kelpy-Codos.js b/assets/Kelpy-Codos.js new file mode 100644 index 0000000..cfbaeed --- /dev/null +++ b/assets/Kelpy-Codos.js @@ -0,0 +1,76 @@ +// ==UserScript== +// @name Kelpy Codos +// @namespace https://github.com/Keldos-Li/Kelpy-Codos +// @version 1.0.5 +// @author Keldos; https://keldos.me/ +// @description Add copy button to PRE tags before CODE tag, for Chuanhu ChatGPT especially. +// Based on Chuanhu ChatGPT version: ac04408 (2023-3-22) +// @license GPL-3.0 +// @grant none +// ==/UserScript== + +(function () { + 'use strict'; + + function addCopyButton(pre) { + var code = pre.querySelector('code'); + if (!code) { + return; // 如果没有找到 元素,则不添加按钮 + } + var firstChild = code.firstChild; + if (!firstChild) { + return; // 如果 元素没有子节点,则不添加按钮 + } + var button = document.createElement('button'); + button.textContent = '\uD83D\uDCCE'; // 使用 📎 符号作为“复制”按钮的文本 + button.style.position = 'relative'; + button.style.float = 'right'; + button.style.fontSize = '1em'; // 可选:调整按钮大小 + button.style.background = 'none'; // 可选:去掉背景颜色 + button.style.border = 'none'; // 可选:去掉边框 + button.style.cursor = 'pointer'; // 可选:显示指针样式 + button.addEventListener('click', function () { + var range = document.createRange(); + range.selectNodeContents(code); + range.setStartBefore(firstChild); // 将范围设置为第一个子节点之前 + var selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + + try { + var success = document.execCommand('copy'); + if (success) { + button.textContent = '\u2714'; + setTimeout(function () { + button.textContent = '\uD83D\uDCCE'; // 恢复按钮为“复制” + }, 2000); + } else { + button.textContent = '\u2716'; + } + } catch (e) { + console.error(e); + button.textContent = '\u2716'; + } + + selection.removeAllRanges(); + }); + code.insertBefore(button, firstChild); // 将按钮插入到第一个子元素之前 + } + + function handleNewElements(mutationsList, observer) { + for (var mutation of mutationsList) { + if (mutation.type === 'childList') { + for (var node of mutation.addedNodes) { + if (node.nodeName === 'PRE') { + addCopyButton(node); + } + } + } + } + } + + var observer = new MutationObserver(handleNewElements); + observer.observe(document.documentElement, { childList: true, subtree: true }); + + document.querySelectorAll('pre').forEach(addCopyButton); +})(); diff --git a/assets/custom.css b/assets/custom.css new file mode 100644 index 0000000..13dcd00 --- /dev/null +++ b/assets/custom.css @@ -0,0 +1,208 @@ +:root { + --chatbot-color-light: #F3F3F3; + --chatbot-color-dark: #121111; +} + +/* status_display */ +#status_display { + display: flex; + min-height: 2.5em; + align-items: flex-end; + justify-content: flex-end; +} +#status_display p { + font-size: .85em; + font-family: monospace; + color: var(--body-text-color-subdued); +} + +#chuanhu_chatbot, #status_display { + transition: all 0.6s; +} + +/* usage_display */ +#usage_display { + height: 1em; +} +#usage_display p{ + padding: 0 1em; + font-size: .85em; + font-family: monospace; + color: var(--body-text-color-subdued); +} +/* list */ +ol:not(.options), ul:not(.options) { + padding-inline-start: 2em !important; +} + +/* 亮色 */ +@media (prefers-color-scheme: light) { + #chuanhu_chatbot { + background-color: var(--chatbot-color-light) !important; + } + [data-testid = "bot"] { + background-color: #FFFFFF !important; + } + [data-testid = "user"] { + background-color: #95EC69 !important; + } +} +/* 暗色 */ +@media (prefers-color-scheme: dark) { + #chuanhu_chatbot { + background-color: var(--chatbot-color-dark) !important; + } + [data-testid = "bot"] { + background-color: #2C2C2C !important; + } + [data-testid = "user"] { + background-color: #26B561 !important; + } + body { + background-color: var(--neutral-950) !important; + } +} +/* 屏幕宽度大于等于500px的设备 */ +@media screen and (min-width: 500px) { + #chuanhu_chatbot { + height: calc(100vh - 280px); + } + #chuanhu_chatbot .wrap { + max-height: calc(100vh - 280px - var(--line-sm)*1rem - 2*var(--block-label-margin) ); + } +} +/* 屏幕宽度小于500px的设备 */ +@media screen and (max-width: 499px) { + #chuanhu_chatbot { + height: calc(100vh - 220px); + } + #chuanhu_chatbot .wrap { + max-height: calc(100vh - 220px - var(--line-sm)*1rem - 2*var(--block-label-margin) ); + } +} +/* 对话气泡 */ +[class *= "message"] { + border-radius: var(--radius-xl) !important; + border: none; + padding: var(--spacing-xl) !important; + font-size: var(--text-md) !important; + line-height: var(--line-md) !important; + min-height: calc(var(--text-md)*var(--line-md) + 2*var(--spacing-xl)); + min-width: calc(var(--text-md)*var(--line-md) + 2*var(--spacing-xl)); +} +[data-testid = "bot"] { + max-width: 85%; + border-bottom-left-radius: 0 !important; +} +[data-testid = "user"] { + max-width: 85%; + width: auto !important; + border-bottom-right-radius: 0 !important; +} +/* 表格 */ +table { + margin: 1em 0; + border-collapse: collapse; + empty-cells: show; +} +td,th { + border: 1.2px solid var(--border-color-primary) !important; + padding: 0.2em; +} +thead { + background-color: rgba(175,184,193,0.2); +} +thead th { + padding: .5em .2em; +} +/* 行内代码 */ +code { + display: inline; + white-space: break-spaces; + border-radius: 6px; + margin: 0 2px 0 2px; + padding: .2em .4em .1em .4em; + background-color: rgba(175,184,193,0.2); +} +/* 代码块 */ +pre code { + display: block; + overflow: auto; + white-space: pre; + background-color: hsla(0, 0%, 0%, 80%)!important; + border-radius: 10px; + padding: 1.4em 1.2em 0em 1.4em; + margin: 1.2em 2em 1.2em 0.5em; + color: #FFF; + box-shadow: 6px 6px 16px hsla(0, 0%, 0%, 0.2); +} +/* 代码高亮样式 */ +.highlight .hll { background-color: #49483e } +.highlight .c { color: #75715e } /* Comment */ +.highlight .err { color: #960050; background-color: #1e0010 } /* Error */ +.highlight .k { color: #66d9ef } /* Keyword */ +.highlight .l { color: #ae81ff } /* Literal */ +.highlight .n { color: #f8f8f2 } /* Name */ +.highlight .o { color: #f92672 } /* Operator */ +.highlight .p { color: #f8f8f2 } /* Punctuation */ +.highlight .ch { color: #75715e } /* Comment.Hashbang */ +.highlight .cm { color: #75715e } /* Comment.Multiline */ +.highlight .cp { color: #75715e } /* Comment.Preproc */ +.highlight .cpf { color: #75715e } /* Comment.PreprocFile */ +.highlight .c1 { color: #75715e } /* Comment.Single */ +.highlight .cs { color: #75715e } /* Comment.Special */ +.highlight .gd { color: #f92672 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gi { color: #a6e22e } /* Generic.Inserted */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #75715e } /* Generic.Subheading */ +.highlight .kc { color: #66d9ef } /* Keyword.Constant */ +.highlight .kd { color: #66d9ef } /* Keyword.Declaration */ +.highlight .kn { color: #f92672 } /* Keyword.Namespace */ +.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ +.highlight .kr { color: #66d9ef } /* Keyword.Reserved */ +.highlight .kt { color: #66d9ef } /* Keyword.Type */ +.highlight .ld { color: #e6db74 } /* Literal.Date */ +.highlight .m { color: #ae81ff } /* Literal.Number */ +.highlight .s { color: #e6db74 } /* Literal.String */ +.highlight .na { color: #a6e22e } /* Name.Attribute */ +.highlight .nb { color: #f8f8f2 } /* Name.Builtin */ +.highlight .nc { color: #a6e22e } /* Name.Class */ +.highlight .no { color: #66d9ef } /* Name.Constant */ +.highlight .nd { color: #a6e22e } /* Name.Decorator */ +.highlight .ni { color: #f8f8f2 } /* Name.Entity */ +.highlight .ne { color: #a6e22e } /* Name.Exception */ +.highlight .nf { color: #a6e22e } /* Name.Function */ +.highlight .nl { color: #f8f8f2 } /* Name.Label */ +.highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +.highlight .nx { color: #a6e22e } /* Name.Other */ +.highlight .py { color: #f8f8f2 } /* Name.Property */ +.highlight .nt { color: #f92672 } /* Name.Tag */ +.highlight .nv { color: #f8f8f2 } /* Name.Variable */ +.highlight .ow { color: #f92672 } /* Operator.Word */ +.highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */ +.highlight .mf { color: #ae81ff } /* Literal.Number.Float */ +.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ +.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ +.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ +.highlight .sa { color: #e6db74 } /* Literal.String.Affix */ +.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ +.highlight .sc { color: #e6db74 } /* Literal.String.Char */ +.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */ +.highlight .sd { color: #e6db74 } /* Literal.String.Doc */ +.highlight .s2 { color: #e6db74 } /* Literal.String.Double */ +.highlight .se { color: #ae81ff } /* Literal.String.Escape */ +.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ +.highlight .si { color: #e6db74 } /* Literal.String.Interpol */ +.highlight .sx { color: #e6db74 } /* Literal.String.Other */ +.highlight .sr { color: #e6db74 } /* Literal.String.Regex */ +.highlight .s1 { color: #e6db74 } /* Literal.String.Single */ +.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ +.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #a6e22e } /* Name.Function.Magic */ +.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ +.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ +.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ +.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ diff --git a/assets/custom.js b/assets/custom.js new file mode 100644 index 0000000..7b17610 --- /dev/null +++ b/assets/custom.js @@ -0,0 +1 @@ +// custom javascript here \ No newline at end of file diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ba49cdf7fafe7bc4b0421bc0422c1fea147f2ee GIT binary patch literal 15406 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 hiZpXEf$EYSfyyb?n;g9@3dZ3Yd;CE%jRX6|u literal 0 HcmV?d00001