JohnSmith9982 commited on
Commit
97e1b45
1 Parent(s): 51e05cb

Upload 114 files

Browse files
ChuanhuChatbot.py CHANGED
@@ -135,6 +135,7 @@ with gr.Blocks(theme=small_and_beautiful_theme) as demo:
135
  label="Chuanhu Chat",
136
  elem_id="chuanhu-chatbot",
137
  latex_delimiters=latex_delimiters_set,
 
138
  # height=700,
139
  show_label=False,
140
  avatar_images=[config.user_avatar, config.bot_avatar],
@@ -236,7 +237,7 @@ with gr.Blocks(theme=small_and_beautiful_theme) as demo:
236
  use_websearch_checkbox = gr.Checkbox(label=i18n(
237
  "使用在线搜索"), value=False, elem_classes="switch-checkbox", elem_id="gr-websearch-cb", visible=False)
238
  index_files = gr.Files(label=i18n(
239
- "上传"), type="file", elem_id="upload-index-file")
240
  two_column = gr.Checkbox(label=i18n(
241
  "双栏pdf"), value=advance_docs["pdf"].get("two_column", False))
242
  summarize_btn = gr.Button(i18n("总结"))
@@ -645,6 +646,8 @@ with gr.Blocks(theme=small_and_beautiful_theme) as demo:
645
  current_model, status_display, chatbot, lora_select_dropdown, user_api_key, keyTxt], show_progress=True, api_name="get_model")
646
  model_select_dropdown.change(toggle_like_btn_visibility, [model_select_dropdown], [
647
  like_dislike_area], show_progress=False)
 
 
648
  lora_select_dropdown.change(get_model, [model_select_dropdown, lora_select_dropdown, user_api_key, temperature_slider,
649
  top_p_slider, systemPromptTxt, user_name, current_model], [current_model, status_display, chatbot], show_progress=True)
650
 
@@ -798,6 +801,7 @@ if __name__ == "__main__":
798
  reload_javascript()
799
  demo.queue(concurrency_count=CONCURRENT_COUNT).launch(
800
  allowed_paths=["history", "web_assets"],
 
801
  auth=auth_from_conf if authflag else None,
802
  favicon_path="./web_assets/favicon.ico",
803
  inbrowser=not dockerflag, # 禁止在docker下开启inbrowser
 
135
  label="Chuanhu Chat",
136
  elem_id="chuanhu-chatbot",
137
  latex_delimiters=latex_delimiters_set,
138
+ sanitize_html=False,
139
  # height=700,
140
  show_label=False,
141
  avatar_images=[config.user_avatar, config.bot_avatar],
 
237
  use_websearch_checkbox = gr.Checkbox(label=i18n(
238
  "使用在线搜索"), value=False, elem_classes="switch-checkbox", elem_id="gr-websearch-cb", visible=False)
239
  index_files = gr.Files(label=i18n(
240
+ "上传"), type="file", file_types=[".pdf", ".docx", ".pptx", ".epub", ".xlsx", ".txt", "text", "image"], elem_id="upload-index-file")
241
  two_column = gr.Checkbox(label=i18n(
242
  "双栏pdf"), value=advance_docs["pdf"].get("two_column", False))
243
  summarize_btn = gr.Button(i18n("总结"))
 
646
  current_model, status_display, chatbot, lora_select_dropdown, user_api_key, keyTxt], show_progress=True, api_name="get_model")
647
  model_select_dropdown.change(toggle_like_btn_visibility, [model_select_dropdown], [
648
  like_dislike_area], show_progress=False)
649
+ # model_select_dropdown.change(
650
+ # toggle_file_type, [model_select_dropdown], [index_files], show_progress=False)
651
  lora_select_dropdown.change(get_model, [model_select_dropdown, lora_select_dropdown, user_api_key, temperature_slider,
652
  top_p_slider, systemPromptTxt, user_name, current_model], [current_model, status_display, chatbot], show_progress=True)
653
 
 
801
  reload_javascript()
802
  demo.queue(concurrency_count=CONCURRENT_COUNT).launch(
803
  allowed_paths=["history", "web_assets"],
804
+ share=share,
805
  auth=auth_from_conf if authflag else None,
806
  favicon_path="./web_assets/favicon.ico",
807
  inbrowser=not dockerflag, # 禁止在docker下开启inbrowser
config_example.json CHANGED
@@ -15,6 +15,8 @@
15
  "spark_api_key": "", // 你的 讯飞星火大模型 API Key,用于讯飞星火大模型对话模型
16
  "spark_api_secret": "", // 你的 讯飞星火大模型 API Secret,用于讯飞星火大模型对话模型
17
  "claude_api_secret":"",// 你的 Claude API Secret,用于 Claude 对话模型
 
 
18
 
19
 
20
  //== Azure ==
 
15
  "spark_api_key": "", // 你的 讯飞星火大模型 API Key,用于讯飞星火大模型对话模型
16
  "spark_api_secret": "", // 你的 讯飞星火大模型 API Secret,用于讯飞星火大模型对话模型
17
  "claude_api_secret":"",// 你的 Claude API Secret,用于 Claude 对话模型
18
+ "ernie_api_key": "",// 你的文心一言在百度云中的API Key,用于文心一言对话模型
19
+ "ernie_secret_key": "",// 你的文心一言在百度云中的Secret Key,用于文心一言对话模型
20
 
21
 
22
  //== Azure ==
modules/.DS_Store CHANGED
Binary files a/modules/.DS_Store and b/modules/.DS_Store differ
 
modules/__pycache__/__init__.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/__init__.cpython-311.pyc and b/modules/__pycache__/__init__.cpython-311.pyc differ
 
modules/__pycache__/config.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/config.cpython-311.pyc and b/modules/__pycache__/config.cpython-311.pyc differ
 
modules/__pycache__/index_func.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/index_func.cpython-311.pyc and b/modules/__pycache__/index_func.cpython-311.pyc differ
 
modules/__pycache__/overwrites.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/overwrites.cpython-311.pyc and b/modules/__pycache__/overwrites.cpython-311.pyc differ
 
modules/__pycache__/presets.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/presets.cpython-311.pyc and b/modules/__pycache__/presets.cpython-311.pyc differ
 
modules/__pycache__/repo.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/repo.cpython-311.pyc and b/modules/__pycache__/repo.cpython-311.pyc differ
 
modules/__pycache__/shared.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/shared.cpython-311.pyc and b/modules/__pycache__/shared.cpython-311.pyc differ
 
modules/__pycache__/train_func.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/train_func.cpython-311.pyc and b/modules/__pycache__/train_func.cpython-311.pyc differ
 
modules/__pycache__/utils.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/utils.cpython-311.pyc and b/modules/__pycache__/utils.cpython-311.pyc differ
 
modules/__pycache__/webui.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/webui.cpython-311.pyc and b/modules/__pycache__/webui.cpython-311.pyc differ
 
modules/__pycache__/webui_locale.cpython-311.pyc CHANGED
Binary files a/modules/__pycache__/webui_locale.cpython-311.pyc and b/modules/__pycache__/webui_locale.cpython-311.pyc differ
 
modules/config.py CHANGED
@@ -135,6 +135,11 @@ os.environ["SPARK_API_SECRET"] = spark_api_secret
135
  claude_api_secret = config.get("claude_api_secret", "")
136
  os.environ["CLAUDE_API_SECRET"] = claude_api_secret
137
 
 
 
 
 
 
138
  load_config_to_environ(["openai_api_type", "azure_openai_api_key", "azure_openai_api_base_url",
139
  "azure_openai_api_version", "azure_deployment_name", "azure_embedding_deployment_name", "azure_embedding_model_name"])
140
 
 
135
  claude_api_secret = config.get("claude_api_secret", "")
136
  os.environ["CLAUDE_API_SECRET"] = claude_api_secret
137
 
138
+ ernie_api_key = config.get("ernie_api_key", "")
139
+ os.environ["ERNIE_APIKEY"] = ernie_api_key
140
+ ernie_secret_key = config.get("ernie_secret_key", "")
141
+ os.environ["ERNIE_SECRETKEY"] = ernie_secret_key
142
+
143
  load_config_to_environ(["openai_api_type", "azure_openai_api_key", "azure_openai_api_base_url",
144
  "azure_openai_api_version", "azure_deployment_name", "azure_embedding_deployment_name", "azure_embedding_model_name"])
145
 
modules/models/ERNIE.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from ..presets import *
2
+ from ..utils import *
3
+
4
+ from .base_model import BaseLLMModel
5
+
6
+
7
+ class ERNIE_Client(BaseLLMModel):
8
+ def __init__(self, model_name, api_key, secret_key) -> None:
9
+ super().__init__(model_name=model_name)
10
+ self.api_key = api_key
11
+ self.api_secret = secret_key
12
+ if None in [self.api_secret, self.api_key]:
13
+ raise Exception("请在配置文件或者环境变量中设置文心一言的API Key 和 Secret Key")
14
+
15
+ if self.model_name == "ERNIE-Bot-turbo":
16
+ self.ERNIE_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token="
17
+ elif self.model_name == "ERNIE-Bot":
18
+ self.ERNIE_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token="
19
+ elif self.model_name == "ERNIE-Bot-4":
20
+ self.ERNIE_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="
21
+
22
+ def get_access_token(self):
23
+ """
24
+ 使用 AK,SK 生成鉴权签名(Access Token)
25
+ :return: access_token,或是None(如果错误)
26
+ """
27
+ url = "https://aip.baidubce.com/oauth/2.0/token?client_id=" + self.api_key + "&client_secret=" + self.api_secret + "&grant_type=client_credentials"
28
+
29
+ payload = json.dumps("")
30
+ headers = {
31
+ 'Content-Type': 'application/json',
32
+ 'Accept': 'application/json'
33
+ }
34
+
35
+ response = requests.request("POST", url, headers=headers, data=payload)
36
+
37
+ return response.json()["access_token"]
38
+ def get_answer_stream_iter(self):
39
+ url = self.ERNIE_url + self.get_access_token()
40
+ system_prompt = self.system_prompt
41
+ history = self.history
42
+ if system_prompt is not None:
43
+ history = [construct_system(system_prompt), *history]
44
+
45
+ # 去除history中 history的role为system的
46
+ history = [i for i in history if i["role"] != "system"]
47
+
48
+ payload = json.dumps({
49
+ "messages":history,
50
+ "stream": True
51
+ })
52
+ headers = {
53
+ 'Content-Type': 'application/json'
54
+ }
55
+
56
+ response = requests.request("POST", url, headers=headers, data=payload, stream=True)
57
+
58
+ if response.status_code == 200:
59
+ partial_text = ""
60
+ for line in response.iter_lines():
61
+ if len(line) == 0:
62
+ continue
63
+ line = json.loads(line[5:])
64
+ partial_text += line['result']
65
+ yield partial_text
66
+ else:
67
+ yield STANDARD_ERROR_MSG + GENERAL_ERROR_MSG
68
+
69
+
70
+ def get_answer_at_once(self):
71
+ url = self.ERNIE_url + self.get_access_token()
72
+ system_prompt = self.system_prompt
73
+ history = self.history
74
+ if system_prompt is not None:
75
+ history = [construct_system(system_prompt), *history]
76
+
77
+ # 去除history中 history的role为system的
78
+ history = [i for i in history if i["role"] != "system"]
79
+
80
+ payload = json.dumps({
81
+ "messages": history,
82
+ "stream": True
83
+ })
84
+ headers = {
85
+ 'Content-Type': 'application/json'
86
+ }
87
+
88
+ response = requests.request("POST", url, headers=headers, data=payload, stream=True)
89
+
90
+ if response.status_code == 200:
91
+
92
+ return str(response.json()["result"]),len(response.json()["result"])
93
+ else:
94
+ return "获取资源错误", 0
95
+
96
+
modules/models/OpenAI.py CHANGED
@@ -26,7 +26,7 @@ class OpenAIClient(BaseLLMModel):
26
  user_name=""
27
  ) -> None:
28
  super().__init__(
29
- model_name=MODEL_METADATA[model_name]["model_name"],
30
  temperature=temperature,
31
  top_p=top_p,
32
  system_prompt=system_prompt,
 
26
  user_name=""
27
  ) -> None:
28
  super().__init__(
29
+ model_name=model_name,
30
  temperature=temperature,
31
  top_p=top_p,
32
  system_prompt=system_prompt,
modules/models/OpenAIVision.py CHANGED
@@ -32,7 +32,7 @@ class OpenAIVisionClient(BaseLLMModel):
32
  user_name=""
33
  ) -> None:
34
  super().__init__(
35
- model_name=MODEL_METADATA[model_name]["model_name"],
36
  temperature=temperature,
37
  top_p=top_p,
38
  system_prompt=system_prompt,
 
32
  user_name=""
33
  ) -> None:
34
  super().__init__(
35
+ model_name=model_name,
36
  temperature=temperature,
37
  top_p=top_p,
38
  system_prompt=system_prompt,
modules/models/__pycache__/OpenAI.cpython-311.pyc ADDED
Binary file (14.6 kB). View file
 
modules/models/__pycache__/__init__.cpython-311.pyc CHANGED
Binary files a/modules/models/__pycache__/__init__.cpython-311.pyc and b/modules/models/__pycache__/__init__.cpython-311.pyc differ
 
modules/models/__pycache__/base_model.cpython-311.pyc CHANGED
Binary files a/modules/models/__pycache__/base_model.cpython-311.pyc and b/modules/models/__pycache__/base_model.cpython-311.pyc differ
 
modules/models/__pycache__/models.cpython-311.pyc CHANGED
Binary files a/modules/models/__pycache__/models.cpython-311.pyc and b/modules/models/__pycache__/models.cpython-311.pyc differ
 
modules/models/base_model.py CHANGED
@@ -78,7 +78,7 @@ def get_action_description(text):
78
  action_name = json_dict['action']
79
  action_input = json_dict['action_input']
80
  if action_name != "Final Answer":
81
- return f'<!-- S O PREFIX --><p class="agent-prefix">{action_name}: {action_input}\n\n</p><!-- E O PREFIX -->'
82
  else:
83
  return ""
84
 
@@ -148,6 +148,7 @@ class ModelType(Enum):
148
  Claude = 14
149
  Qwen = 15
150
  OpenAIVision = 16
 
151
 
152
  @classmethod
153
  def get_type(cls, model_name: str):
@@ -188,6 +189,8 @@ class ModelType(Enum):
188
  model_type = ModelType.Claude
189
  elif "qwen" in model_name_lower:
190
  model_type = ModelType.Qwen
 
 
191
  else:
192
  model_type = ModelType.LLaMA
193
  return model_type
@@ -210,7 +213,10 @@ class BaseLLMModel:
210
  ) -> None:
211
  self.history = []
212
  self.all_token_counts = []
213
- self.model_name = model_name
 
 
 
214
  self.model_type = ModelType.get_type(model_name)
215
  try:
216
  self.token_upper_limit = MODEL_METADATA[model_name]["token_limit"]
 
78
  action_name = json_dict['action']
79
  action_input = json_dict['action_input']
80
  if action_name != "Final Answer":
81
+ return f'<!-- S O PREFIX --><p class="agent-prefix">{action_name}: {action_input}\n</p><!-- E O PREFIX -->'
82
  else:
83
  return ""
84
 
 
148
  Claude = 14
149
  Qwen = 15
150
  OpenAIVision = 16
151
+ ERNIE = 17
152
 
153
  @classmethod
154
  def get_type(cls, model_name: str):
 
189
  model_type = ModelType.Claude
190
  elif "qwen" in model_name_lower:
191
  model_type = ModelType.Qwen
192
+ elif "ernie" in model_name_lower:
193
+ model_type = ModelType.ERNIE
194
  else:
195
  model_type = ModelType.LLaMA
196
  return model_type
 
213
  ) -> None:
214
  self.history = []
215
  self.all_token_counts = []
216
+ if model_name in MODEL_METADATA:
217
+ self.model_name = MODEL_METADATA[model_name]["model_name"]
218
+ else:
219
+ self.model_name = model_name
220
  self.model_type = ModelType.get_type(model_name)
221
  try:
222
  self.token_upper_limit = MODEL_METADATA[model_name]["token_limit"]
modules/models/models.py CHANGED
@@ -128,6 +128,9 @@ def get_model(
128
  elif model_type == ModelType.Qwen:
129
  from .Qwen import Qwen_Client
130
  model = Qwen_Client(model_name, user_name=user_name)
 
 
 
131
  elif model_type == ModelType.Unknown:
132
  raise ValueError(f"未知模型: {model_name}")
133
  logging.info(msg)
 
128
  elif model_type == ModelType.Qwen:
129
  from .Qwen import Qwen_Client
130
  model = Qwen_Client(model_name, user_name=user_name)
131
+ elif model_type == ModelType.ERNIE:
132
+ from .ERNIE import ERNIE_Client
133
+ model = ERNIE_Client(model_name, api_key=os.getenv("ERNIE_APIKEY"),secret_key=os.getenv("ERNIE_SECRETKEY"))
134
  elif model_type == ModelType.Unknown:
135
  raise ValueError(f"未知模型: {model_name}")
136
  logging.info(msg)
modules/presets.py CHANGED
@@ -56,6 +56,7 @@ ONLINE_MODELS = [
56
  "GPT3.5 Turbo 16K",
57
  "GPT3.5 Turbo 0301",
58
  "GPT3.5 Turbo 0613",
 
59
  "GPT4",
60
  "GPT4 32K",
61
  "GPT4 Turbo",
@@ -74,7 +75,10 @@ ONLINE_MODELS = [
74
  "讯飞星火大模型V3.0",
75
  "讯飞星火大模型V2.0",
76
  "讯飞星火大模型V1.5",
77
- "Claude"
 
 
 
78
  ]
79
 
80
  LOCAL_MODELS = [
@@ -126,6 +130,10 @@ MODEL_METADATA = {
126
  "model_name": "gpt-3.5-turbo-0613",
127
  "token_limit": 4096,
128
  },
 
 
 
 
129
  "GPT4": {
130
  "model_name": "gpt-4",
131
  "token_limit": 8192,
@@ -146,6 +154,18 @@ MODEL_METADATA = {
146
  "model_name": "Claude",
147
  "token_limit": 4096,
148
  },
 
 
 
 
 
 
 
 
 
 
 
 
149
  }
150
 
151
  if os.environ.get('HIDE_LOCAL_MODELS', 'false') == 'true':
 
56
  "GPT3.5 Turbo 16K",
57
  "GPT3.5 Turbo 0301",
58
  "GPT3.5 Turbo 0613",
59
+ "GPT3.5 Turbo 1106",
60
  "GPT4",
61
  "GPT4 32K",
62
  "GPT4 Turbo",
 
75
  "讯飞星火大模型V3.0",
76
  "讯飞星火大模型V2.0",
77
  "讯飞星火大模型V1.5",
78
+ "Claude",
79
+ "ERNIE-Bot-turbo",
80
+ "ERNIE-Bot",
81
+ "ERNIE-Bot-4",
82
  ]
83
 
84
  LOCAL_MODELS = [
 
130
  "model_name": "gpt-3.5-turbo-0613",
131
  "token_limit": 4096,
132
  },
133
+ "GPT3.5 Turbo 1106": {
134
+ "model_name": "gpt-3.5-turbo-1106",
135
+ "token_limit": 16384,
136
+ },
137
  "GPT4": {
138
  "model_name": "gpt-4",
139
  "token_limit": 8192,
 
154
  "model_name": "Claude",
155
  "token_limit": 4096,
156
  },
157
+ "ERNIE-Bot-turbo": {
158
+ "model_name": "ERNIE-Bot-turbo",
159
+ "token_limit": 1024,
160
+ },
161
+ "ERNIE-Bot": {
162
+ "model_name": "ERNIE-Bot",
163
+ "token_limit": 1024,
164
+ },
165
+ "ERNIE-Bot-4": {
166
+ "model_name": "ERNIE-Bot-4",
167
+ "token_limit": 1024,
168
+ },
169
  }
170
 
171
  if os.environ.get('HIDE_LOCAL_MODELS', 'false') == 'true':
modules/utils.py CHANGED
@@ -211,18 +211,16 @@ def clip_rawtext(chat_message, need_escape=True):
211
  hr_match = re.search(hr_pattern, chat_message, re.DOTALL)
212
  message_clipped = chat_message[:hr_match.start()] if hr_match else chat_message
213
  # second, avoid agent-prefix being escaped
214
- agent_prefix_pattern = r'<!-- S O PREFIX --><p class="agent-prefix">(.*?)<\/p><!-- E O PREFIX -->'
215
- agent_matches = re.findall(agent_prefix_pattern, message_clipped)
 
216
  final_message = ""
217
- if agent_matches:
218
- agent_parts = re.split(agent_prefix_pattern, message_clipped)
219
- for i, part in enumerate(agent_parts):
220
- if i % 2 == 0:
221
- final_message += escape_markdown(part) if need_escape else part
222
- else:
223
- final_message += f'<!-- S O PREFIX --><p class="agent-prefix">{part}</p><!-- E O PREFIX -->'
224
- else:
225
- final_message = escape_markdown(message_clipped) if need_escape else message_clipped
226
  return final_message
227
 
228
 
@@ -233,7 +231,7 @@ def convert_bot_before_marked(chat_message):
233
  if '<div class="md-message">' in chat_message:
234
  return chat_message
235
  else:
236
- raw = f'<div class="raw-message hideM"><pre>{clip_rawtext(chat_message)}</pre></div>'
237
  # really_raw = f'{START_OF_OUTPUT_MARK}<div class="really-raw hideM">{clip_rawtext(chat_message, need_escape=False)}\n</div>{END_OF_OUTPUT_MARK}'
238
 
239
  code_block_pattern = re.compile(r"```(.*?)(?:```|$)", re.DOTALL)
@@ -661,6 +659,15 @@ def toggle_like_btn_visibility(selected_model_name):
661
  else:
662
  return gr.update(visible=False)
663
 
 
 
 
 
 
 
 
 
 
664
  def new_auto_history_filename(username):
665
  latest_file = get_first_history_name(username)
666
  if latest_file:
 
211
  hr_match = re.search(hr_pattern, chat_message, re.DOTALL)
212
  message_clipped = chat_message[:hr_match.start()] if hr_match else chat_message
213
  # second, avoid agent-prefix being escaped
214
+ agent_prefix_pattern = r'(<!-- S O PREFIX --><p class="agent-prefix">.*?<\/p><!-- E O PREFIX -->)'
215
+ # agent_matches = re.findall(agent_prefix_pattern, message_clipped)
216
+ agent_parts = re.split(agent_prefix_pattern, message_clipped, flags=re.DOTALL)
217
  final_message = ""
218
+ for i, part in enumerate(agent_parts):
219
+ if i % 2 == 0:
220
+ if part != "" and part != "\n":
221
+ final_message += f'<pre class="fake-pre">{escape_markdown(part)}</pre>' if need_escape else f'<pre class="fake-pre">{part}</pre>'
222
+ else:
223
+ final_message += part
 
 
 
224
  return final_message
225
 
226
 
 
231
  if '<div class="md-message">' in chat_message:
232
  return chat_message
233
  else:
234
+ raw = f'<div class="raw-message hideM">{clip_rawtext(chat_message)}</div>'
235
  # really_raw = f'{START_OF_OUTPUT_MARK}<div class="really-raw hideM">{clip_rawtext(chat_message, need_escape=False)}\n</div>{END_OF_OUTPUT_MARK}'
236
 
237
  code_block_pattern = re.compile(r"```(.*?)(?:```|$)", re.DOTALL)
 
659
  else:
660
  return gr.update(visible=False)
661
 
662
+ def get_corresponding_file_type_by_model_name(selected_model_name):
663
+ if selected_model_name in ["xmchat", "GPT4 Vision"]:
664
+ return ["image"]
665
+ else:
666
+ return [".pdf", ".docx", ".pptx", ".epub", ".xlsx", ".txt", "text"]
667
+
668
+ # def toggle_file_type(selected_model_name):
669
+ # return gr.Files.update(file_types=get_corresponding_file_type_by_model_name(selected_model_name))
670
+
671
  def new_auto_history_filename(username):
672
  latest_file = get_first_history_name(username)
673
  if latest_file:
requirements.txt CHANGED
@@ -1,3 +1,4 @@
 
1
  gradio==3.43.2
2
  gradio_client==0.5.0
3
  pypinyin
@@ -31,3 +32,4 @@ websocket_client
31
  pydantic==1.10.8
32
  google-search-results
33
  anthropic==0.3.11
 
 
1
+ httpx==0.25.1
2
  gradio==3.43.2
3
  gradio_client==0.5.0
4
  pypinyin
 
32
  pydantic==1.10.8
33
  google-search-results
34
  anthropic==0.3.11
35
+ Pillow>=10.1.0
web_assets/.DS_Store CHANGED
Binary files a/web_assets/.DS_Store and b/web_assets/.DS_Store differ
 
web_assets/javascript/message-button.js CHANGED
@@ -95,7 +95,11 @@ function addChuanhuButton(botElement) {
95
  function removeMarkdownText(message) {
96
  var rawDiv = message.querySelector('.raw-message');
97
  if (rawDiv) {
98
- rawDiv.innerHTML = rawDiv.querySelector('pre')?.innerHTML || rawDiv.innerHTML;
 
 
 
 
99
  rawDiv.classList.remove('hideM');
100
  }
101
  var mdDiv = message.querySelector('.md-message');
 
95
  function removeMarkdownText(message) {
96
  var rawDiv = message.querySelector('.raw-message');
97
  if (rawDiv) {
98
+ // 判断pre是否存在fake-pre类,如果不存在,则为20231118之前的历史记录格式,需要转换,增加fake-pre类用于适配
99
+ if (!rawDiv.querySelector('pre')?.classList.contains('fake-pre')) {
100
+ rawDiv.innerHTML = rawDiv.innerHTML.replace(/<pre>/g, '<pre class="fake-pre">');
101
+ }
102
+ // rawDiv.innerHTML = rawDiv.querySelector('pre')?.innerHTML || rawDiv.innerHTML;
103
  rawDiv.classList.remove('hideM');
104
  }
105
  var mdDiv = message.querySelector('.md-message');
web_assets/javascript/updater.js CHANGED
@@ -1,6 +1,7 @@
1
 
2
  var updateInfoGotten = false;
3
- var isLatestVersion = localStorage.getItem('isLatestVersion') || false;
 
4
 
5
  function setUpdater() {
6
  const enableCheckUpdate = gradioApp().querySelector('#enableCheckUpdate_config').innerText;
@@ -10,11 +11,15 @@ function setUpdater() {
10
  return;
11
  }
12
 
 
 
 
13
  const lastCheckTime = localStorage.getItem('lastCheckTime') || 0;
 
14
  const longTimeNoCheck = currentTime - lastCheckTime > 3 * 24 * 60 * 60 * 1000;
15
- if (longTimeNoCheck && !updateInfoGotten && !isLatestVersion || isLatestVersion && !updateInfoGotten) {
16
- updateLatestVersion();
17
- }
18
  }
19
 
20
  var statusObserver = new MutationObserver(function (mutationsList) {
@@ -26,6 +31,7 @@ var statusObserver = new MutationObserver(function (mutationsList) {
26
  noUpdateHtml();
27
  localStorage.setItem('isLatestVersion', 'true');
28
  isLatestVersion = true;
 
29
  enableUpdateBtns();
30
  } else if (getUpdateStatus() === "failure") {
31
  updatingInfoElement.innerHTML = marked.parse(updateFailure_i18n, {mangle: false, headerIds: false});
@@ -86,11 +92,16 @@ async function updateLatestVersion() {
86
  if (currentVersion) {
87
  if (latestVersion <= currentVersion) {
88
  noUpdate();
 
 
 
89
  } else {
90
  latestVersionElement.textContent = latestVersion;
91
  console.log(`New version ${latestVersion} found!`);
92
  if (!isInIframe) openUpdateToast();
93
  gradioApp().classList.add('is-outdated');
 
 
94
  }
95
  enableUpdateBtns();
96
  } else { //如果当前版本号获取失败,使用时间比较
@@ -119,6 +130,8 @@ async function updateLatestVersion() {
119
  noUpdate("Local version check failed, it seems to be a local rivision. <br>But your revision is newer than the latest release.");
120
  gradioApp().classList.add('is-outdated');
121
  enableUpdateBtns()
 
 
122
  }
123
  }
124
  }
 
1
 
2
  var updateInfoGotten = false;
3
+ var isLatestVersion = localStorage.getItem('isLatestVersion') === "true" || false;
4
+ var shouldCheckUpdate = false;
5
 
6
  function setUpdater() {
7
  const enableCheckUpdate = gradioApp().querySelector('#enableCheckUpdate_config').innerText;
 
11
  return;
12
  }
13
 
14
+ if (!isLatestVersion) {
15
+ gradioApp().classList.add('is-outdated');
16
+ }
17
  const lastCheckTime = localStorage.getItem('lastCheckTime') || 0;
18
+ currentTime = new Date().getTime();
19
  const longTimeNoCheck = currentTime - lastCheckTime > 3 * 24 * 60 * 60 * 1000;
20
+ shouldCheckUpdate = !updateInfoGotten && (!isLatestVersion && longTimeNoCheck || isLatestVersion);
21
+ // console.log(`shouldCheckUpdate`, shouldCheckUpdate);
22
+ if (shouldCheckUpdate) updateLatestVersion();
23
  }
24
 
25
  var statusObserver = new MutationObserver(function (mutationsList) {
 
31
  noUpdateHtml();
32
  localStorage.setItem('isLatestVersion', 'true');
33
  isLatestVersion = true;
34
+ gradioApp().classList.remove('is-outdated');
35
  enableUpdateBtns();
36
  } else if (getUpdateStatus() === "failure") {
37
  updatingInfoElement.innerHTML = marked.parse(updateFailure_i18n, {mangle: false, headerIds: false});
 
92
  if (currentVersion) {
93
  if (latestVersion <= currentVersion) {
94
  noUpdate();
95
+ localStorage.setItem('isLatestVersion', 'true');
96
+ isLatestVersion = true;
97
+ gradioApp().classList.remove('is-outdated');
98
  } else {
99
  latestVersionElement.textContent = latestVersion;
100
  console.log(`New version ${latestVersion} found!`);
101
  if (!isInIframe) openUpdateToast();
102
  gradioApp().classList.add('is-outdated');
103
+ localStorage.setItem('isLatestVersion', 'false');
104
+ isLatestVersion = false;
105
  }
106
  enableUpdateBtns();
107
  } else { //如果当前版本号获取失败,使用时间比较
 
130
  noUpdate("Local version check failed, it seems to be a local rivision. <br>But your revision is newer than the latest release.");
131
  gradioApp().classList.add('is-outdated');
132
  enableUpdateBtns()
133
+ localStorage.setItem('isLatestVersion', 'false');
134
+ isLatestVersion = false;
135
  }
136
  }
137
  }
web_assets/javascript/webui.js CHANGED
@@ -39,11 +39,15 @@ function showMask(obj) {
39
  chatbotArea.querySelector('#chatbot-input-more-area').parentNode.appendChild(mask);
40
  } else if (obj == "update-toast") {
41
  mask.classList.add('chuanhu-top-mask');
 
 
 
 
 
42
  document.body.appendChild(mask);
43
  // mask.classList.add('transparent-mask');
44
  }
45
 
46
-
47
 
48
  mask.addEventListener('click', () => {
49
  if (obj == "box") {
 
39
  chatbotArea.querySelector('#chatbot-input-more-area').parentNode.appendChild(mask);
40
  } else if (obj == "update-toast") {
41
  mask.classList.add('chuanhu-top-mask');
42
+ if (document.querySelector('.chuanhu-top-mask')) {
43
+ for (var i = 0; i < document.querySelectorAll('.chuanhu-top-mask').length; i++) {
44
+ document.querySelectorAll('.chuanhu-top-mask')[i].remove();
45
+ }
46
+ }
47
  document.body.appendChild(mask);
48
  // mask.classList.add('transparent-mask');
49
  }
50
 
 
51
 
52
  mask.addEventListener('click', () => {
53
  if (obj == "box") {
web_assets/stylesheet/ChuanhuChat.css CHANGED
@@ -60,6 +60,7 @@ body.popup-open {
60
  flex-direction: row;
61
  display: inline-flex;
62
  align-items: center;
 
63
  }
64
  #description {
65
  text-align: center;
@@ -123,12 +124,25 @@ body.popup-open {
123
  }
124
 
125
  /* status-display */
126
- #status-display {
127
  display: flex;
128
  min-height: 2em;
129
  align-items: flex-end;
130
  justify-content: flex-end;
131
  transition: all 0.6s;
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  }
133
  #status-display p {
134
  font-size: .85em;
 
60
  flex-direction: row;
61
  display: inline-flex;
62
  align-items: center;
63
+ position: absolute;
64
  }
65
  #description {
66
  text-align: center;
 
124
  }
125
 
126
  /* status-display */
127
+ #chuanhu-header > #status-display {
128
  display: flex;
129
  min-height: 2em;
130
  align-items: flex-end;
131
  justify-content: flex-end;
132
  transition: all 0.6s;
133
+ max-width: 50%;
134
+ height: 100%;
135
+ bottom: 0;
136
+ position: absolute;
137
+
138
+ @media screen and (max-width: 639px) {
139
+ right: 16px;
140
+ right: max(16px, env(safe-area-inset-right));
141
+ }
142
+ @media screen and (min-width: 640px) {
143
+ right: 24px;
144
+ right: max(24px, env(safe-area-inset-right));
145
+ }
146
  }
147
  #status-display p {
148
  font-size: .85em;
web_assets/stylesheet/chatbot.css CHANGED
@@ -42,7 +42,13 @@ hr.append-display {
42
  .agent-prefix {
43
  font-size: smaller;
44
  opacity: 0.6;
45
- padding: 6px 0 4px;
 
 
 
 
 
 
46
  }
47
  .agent-prefix::before {
48
  content: '🐯';
@@ -216,6 +222,14 @@ hr.append-display {
216
  .message .raw-message p {
217
  margin:0 !important;
218
  }
 
 
 
 
 
 
 
 
219
  .message .raw-message {
220
  display: block;
221
  padding: 0 !important;
 
42
  .agent-prefix {
43
  font-size: smaller;
44
  opacity: 0.6;
45
+ padding: 6px 0 12px;
46
+ }
47
+ .raw-message p.agent-prefix + p.agent-prefix {
48
+ margin-top: -1.2em !important;
49
+ }
50
+ .md-message p.agent-prefix + p.agent-prefix {
51
+ margin-top: -1.8em !important;
52
  }
53
  .agent-prefix::before {
54
  content: '🐯';
 
222
  .message .raw-message p {
223
  margin:0 !important;
224
  }
225
+ .message .raw-message pre.fake-pre {
226
+ background: unset;
227
+ margin: unset;
228
+ font-size: unset;
229
+ /* font-family: unset; */
230
+ padding: unset;
231
+ white-space: inherit;
232
+ }
233
  .message .raw-message {
234
  display: block;
235
  padding: 0 !important;