显示newbing回复的网址

This commit is contained in:
Your Name 2023-04-23 22:34:24 +08:00
parent 385c775aa5
commit 4a494354b1

View File

@ -16,7 +16,6 @@ import ssl
import sys import sys
import uuid import uuid
from enum import Enum from enum import Enum
from pathlib import Path
from typing import Generator from typing import Generator
from typing import Literal from typing import Literal
from typing import Optional from typing import Optional
@ -354,7 +353,7 @@ class Chatbot:
async def ask( async def ask(
self, self,
prompt: str, prompt: str,
wss_link: str = "wss://sydney.bing.com/sydney/ChatHub", wss_link: str,
conversation_style: CONVERSATION_STYLE_TYPE = None, conversation_style: CONVERSATION_STYLE_TYPE = None,
options: dict = None, options: dict = None,
) -> dict: ) -> dict:
@ -375,7 +374,7 @@ class Chatbot:
async def ask_stream( async def ask_stream(
self, self,
prompt: str, prompt: str,
wss_link: str = "wss://sydney.bing.com/sydney/ChatHub", wss_link: str,
conversation_style: CONVERSATION_STYLE_TYPE = None, conversation_style: CONVERSATION_STYLE_TYPE = None,
raw: bool = False, raw: bool = False,
options: dict = None, options: dict = None,
@ -403,7 +402,7 @@ class Chatbot:
Reset the conversation Reset the conversation
""" """
await self.close() await self.close()
self.chat_hub = _ChatHub(_Conversation(self.cookies)) self.chat_hub = _ChatHub(_Conversation(self.cookies, self.proxy))
@ -411,13 +410,14 @@ load_message = ""
""" """
======================================================================== ========================================================================
第二部分子进程Worker 第二部分子进程Worker调用主体
======================================================================== ========================================================================
""" """
import time import time
import importlib import importlib
from toolbox import update_ui, get_conf, trimmed_format_exc from toolbox import update_ui, get_conf, trimmed_format_exc
from multiprocessing import Process, Pipe from multiprocessing import Process, Pipe
class GetNewBingHandle(Process): class GetNewBingHandle(Process):
def __init__(self): def __init__(self):
super().__init__(daemon=True) super().__init__(daemon=True)
@ -431,7 +431,8 @@ class GetNewBingHandle(Process):
def check_dependency(self): def check_dependency(self):
try: try:
self.info = "依赖检测通过" import rich
self.info = "依赖检测通过等待NewBing响应。注意目前不能多人同时调用NewBing接口否则将导致每个人的NewBing问询历史互相渗透。调用NewBing时会自动使用已配置的代理。"
self.success = True self.success = True
except: except:
self.info = "缺少的依赖如果要使用Newbing除了基础的pip依赖以外您还需要运行`pip install -r request_llm/requirements_newbing.txt`安装Newbing的依赖。" self.info = "缺少的依赖如果要使用Newbing除了基础的pip依赖以外您还需要运行`pip install -r request_llm/requirements_newbing.txt`安装Newbing的依赖。"
@ -440,34 +441,77 @@ class GetNewBingHandle(Process):
def ready(self): def ready(self):
return self.newbing_model is not None return self.newbing_model is not None
async def async_run(self, question, history): async def async_run(self):
# 读取配置 # 读取配置
NEWBING_STYLE, = get_conf('NEWBING_STYLE') NEWBING_STYLE, = get_conf('NEWBING_STYLE')
from request_llm.bridge_all import model_info from request_llm.bridge_all import model_info
endpoint = model_info['newbing']['endpoint'] endpoint = model_info['newbing']['endpoint']
while True:
# 等待
kwargs = self.child.recv()
question=kwargs['query']
history=kwargs['history']
system_prompt=kwargs['system_prompt']
# 是否重置
if len(self.local_history) > 0 and len(history)==0:
await self.newbing_model.reset()
self.local_history = []
# 开始问问题 # 开始问问题
prompt = ""
if system_prompt not in self.local_history:
self.local_history.append(system_prompt)
prompt += system_prompt + '\n'
# 追加历史
for ab in history:
a, b = ab
if a not in self.local_history:
self.local_history.append(a)
prompt += a + '\n'
if b not in self.local_history:
self.local_history.append(b)
prompt += b + '\n'
# 问题
prompt += question
self.local_history.append(question) self.local_history.append(question)
# 提交
async for final, response in self.newbing_model.ask_stream( async for final, response in self.newbing_model.ask_stream(
prompt=question, prompt=question,
conversation_style=NEWBING_STYLE, # ["creative", "balanced", "precise"] conversation_style=NEWBING_STYLE, # ["creative", "balanced", "precise"]
wss_link=endpoint, # "wss://sydney.bing.com/sydney/ChatHub" wss_link=endpoint, # "wss://sydney.bing.com/sydney/ChatHub"
): ):
if not final: if not final:
self.child.send(str(response))
print(response) print(response)
self.child.send(str(response))
else:
print('-------- receive final ---------')
self.child.send('[Finish]')
def run(self): def run(self):
"""
这个函数运行在子进程
"""
# 第一次运行,加载参数 # 第一次运行,加载参数
retry = 0 retry = 0
self.local_history = [] self.local_history = []
while True: while True:
try: try:
if self.newbing_model is None: if self.newbing_model is None:
# 代理设置
proxies, = get_conf('proxies') proxies, = get_conf('proxies')
if proxies is None:
self.proxies_https = None
else:
self.proxies_https = proxies['https']
NEWBING_COOKIES, = get_conf('NEWBING_COOKIES') NEWBING_COOKIES, = get_conf('NEWBING_COOKIES')
cookies = json.loads(NEWBING_COOKIES) cookies = json.loads(NEWBING_COOKIES)
self.newbing_model = Chatbot(proxy=proxies['https'], cookies=cookies) self.newbing_model = Chatbot(proxy=self.proxies_https, cookies=cookies)
break break
else: else:
break break
@ -479,23 +523,24 @@ class GetNewBingHandle(Process):
raise RuntimeError("不能加载Newbing组件。") raise RuntimeError("不能加载Newbing组件。")
# 进入任务等待状态 # 进入任务等待状态
while True:
kwargs = self.child.recv()
try: try:
asyncio.run(self.async_run(question=kwargs['query'], history=kwargs['history'])) asyncio.run(self.async_run())
except: except Exception:
tb_str = '```\n' + trimmed_format_exc() + '```' tb_str = '```\n' + trimmed_format_exc() + '```'
self.child.send('[Local Message] Newbing失败.') self.child.send(f'[Local Message] Newbing失败 {tb_str}.')
self.child.send('[Finish]') self.child.send('[Finish]')
def stream_chat(self, **kwargs): def stream_chat(self, **kwargs):
self.parent.send(kwargs) """
这个函数运行在主进程
"""
self.parent.send(kwargs) # 发送请求到子进程
while True: while True:
res = self.parent.recv() res = self.parent.recv() # 等待newbing回复的片段
if res != '[Finish]': if res != '[Finish]':
yield res yield res # newbing回复的片段
else: else:
break break # 结束
return return
@ -523,13 +568,12 @@ def predict_no_ui_long_connection(inputs, llm_kwargs, history=[], sys_prompt="",
# 没有 sys_prompt 接口因此把prompt加入 history # 没有 sys_prompt 接口因此把prompt加入 history
history_feedin = [] history_feedin = []
history_feedin.append(["What can I do?", sys_prompt])
for i in range(len(history)//2): for i in range(len(history)//2):
history_feedin.append([history[2*i], history[2*i+1]] ) history_feedin.append([history[2*i], history[2*i+1]] )
watch_dog_patience = 5 # 看门狗 (watchdog) 的耐心, 设置5秒即可 watch_dog_patience = 5 # 看门狗 (watchdog) 的耐心, 设置5秒即可
response = "" response = ""
for response in newbing_handle.stream_chat(query=inputs, history=history_feedin, max_length=llm_kwargs['max_length'], top_p=llm_kwargs['top_p'], temperature=llm_kwargs['temperature']): for response in newbing_handle.stream_chat(query=inputs, history=history_feedin, system_prompt=sys_prompt, max_length=llm_kwargs['max_length'], top_p=llm_kwargs['top_p'], temperature=llm_kwargs['temperature']):
observe_window[0] = response observe_window[0] = response
if len(observe_window) >= 2: if len(observe_window) >= 2:
if (time.time()-observe_window[1]) > watch_dog_patience: if (time.time()-observe_window[1]) > watch_dog_patience:
@ -543,7 +587,7 @@ def predict(inputs, llm_kwargs, plugin_kwargs, chatbot, history=[], system_promp
单线程方法 单线程方法
函数的说明请见 request_llm/bridge_all.py 函数的说明请见 request_llm/bridge_all.py
""" """
chatbot.append((inputs, "")) chatbot.append((inputs, "[Local Message]: 等待Bing响应 ..."))
global newbing_handle global newbing_handle
if newbing_handle is None or (not newbing_handle.success): if newbing_handle is None or (not newbing_handle.success):
@ -562,13 +606,23 @@ def predict(inputs, llm_kwargs, plugin_kwargs, chatbot, history=[], system_promp
inputs = core_functional[additional_fn]["Prefix"] + inputs + core_functional[additional_fn]["Suffix"] inputs = core_functional[additional_fn]["Prefix"] + inputs + core_functional[additional_fn]["Suffix"]
history_feedin = [] history_feedin = []
history_feedin.append(["What can I do?", system_prompt] )
for i in range(len(history)//2): for i in range(len(history)//2):
history_feedin.append([history[2*i], history[2*i+1]] ) history_feedin.append([history[2*i], history[2*i+1]] )
for response in newbing_handle.stream_chat(query=inputs, history=history_feedin, max_length=llm_kwargs['max_length'], top_p=llm_kwargs['top_p'], temperature=llm_kwargs['temperature']): yield from update_ui(chatbot=chatbot, history=history, msg="NewBing响应缓慢尚未完成全部响应请耐心完成后再提交新问题。")
chatbot[-1] = (inputs, response) for response in newbing_handle.stream_chat(query=inputs, history=history_feedin, system_prompt=system_prompt, max_length=llm_kwargs['max_length'], top_p=llm_kwargs['top_p'], temperature=llm_kwargs['temperature']):
yield from update_ui(chatbot=chatbot, history=history) chatbot[-1] = (inputs, preprocess_newbing_out(response))
yield from update_ui(chatbot=chatbot, history=history, msg="NewBing响应缓慢尚未完成全部响应请耐心完成后再提交新问题。")
history.extend([inputs, response]) history.extend([inputs, preprocess_newbing_out(response)])
yield from update_ui(chatbot=chatbot, history=history) yield from update_ui(chatbot=chatbot, history=history, msg="完成全部响应,请提交新问题。")
def preprocess_newbing_out(s):
pattern = r'\^(\d+)\^' # 匹配^数字^
sub = lambda m: '\['+m.group(1)+'\]' # 将匹配到的数字作为替换值
result = re.sub(pattern, sub, s) # 替换操作
if '[1]' in result:
result += '\n\n```\n' + "\n".join([r for r in result.split('\n') if r.startswith('[')]) + '\n```\n'
return result