Фиксы отправки и добавление зависимостей
This commit is contained in:
parent
c6fa839f3f
commit
15f3231848
124
main.py
124
main.py
|
@ -12,13 +12,16 @@ from urllib.parse import urlparse
|
||||||
PORT = 8081
|
PORT = 8081
|
||||||
HOST = "127.0.0.1"
|
HOST = "127.0.0.1"
|
||||||
|
|
||||||
|
CONCATENATE_NSFW_RESPONSES = True
|
||||||
DESIRED_TOKENS = 500
|
DESIRED_TOKENS = 500
|
||||||
ASK_TO_CONTINUE_AS_A_ROLE = 'user' #user/system/assistant
|
ASK_TO_CONTINUE_AS_A_ROLE = "user" #user/system/assistant
|
||||||
CONTINUATION_QUERY = "(continue roleplay from the sentence where you have left)"
|
CONTINUATION_QUERY = "(continue roleplay from the sentence where you have left)"
|
||||||
ASTERISK_FIX = True
|
ASTERISK_FIX = True
|
||||||
|
|
||||||
|
USER_MESSAGE_WORKAROUND = True
|
||||||
|
USER_MESSAGE = "Respond to the text above."
|
||||||
|
|
||||||
class LinkReplacer:
|
class LinkPlaceholderReplacer:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.placeholder_wrap = ""
|
self.placeholder_wrap = ""
|
||||||
self.i = 0
|
self.i = 0
|
||||||
|
@ -43,7 +46,7 @@ class LinkReplacer:
|
||||||
self.i = 0
|
self.i = 0
|
||||||
return self.stash
|
return self.stash
|
||||||
elif self.i == 2:
|
elif self.i == 2:
|
||||||
result = re.sub(r'\[\^(\d+)\^\]', lambda match: create_hyperlink(match, urls), self.stash)
|
result = re.sub(r'\[\^(\d+)\^\]', lambda match: transform_into_hyperlink(match, urls), self.stash)
|
||||||
self.i = 0
|
self.i = 0
|
||||||
self.stash = ""
|
self.stash = ""
|
||||||
return result
|
return result
|
||||||
|
@ -93,26 +96,29 @@ class OpenaiResponse:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def create_hyperlink(match, urls):
|
def transform_into_hyperlink(match, urls):
|
||||||
index = int(match.group(1)) - 1
|
index = int(match.group(1)) - 1
|
||||||
return f" [{urlparse(urls[index]).hostname}]({urls[index]})"
|
return f" [{urlparse(urls[index]).hostname}]({urls[index]})"
|
||||||
|
|
||||||
|
|
||||||
def prepare_response(id, created, filter=False, content="", end=False, done=False):
|
def prepare_response(id, created, filter=False, content="", end=False, done=False, stream=True):
|
||||||
|
|
||||||
response = b""
|
response = b""
|
||||||
|
|
||||||
if filter:
|
if stream:
|
||||||
OAIResponse = OpenaiResponse(id, created, content="Отфильтровано.")
|
if filter:
|
||||||
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
OAIResponse = OpenaiResponse(id, created, content="Отфильтровано.", stream=stream)
|
||||||
if content:
|
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
||||||
OAIResponse = OpenaiResponse(id, created, content=content)
|
if content:
|
||||||
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
OAIResponse = OpenaiResponse(id, created, content=content, stream=stream)
|
||||||
if end:
|
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
||||||
OAIResponse = OpenaiResponse(id, created, end=True)
|
if end:
|
||||||
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
OAIResponse = OpenaiResponse(id, created, end=True, stream=stream)
|
||||||
if done:
|
response += b"data: " + json.dumps(OAIResponse.dict()).encode() + b"\n\n"
|
||||||
response += b"data: " + b"[DONE]" + b"\n\n"
|
if done:
|
||||||
|
response += b"data: " + b"[DONE]" + b"\n\n"
|
||||||
|
else:
|
||||||
|
response = json.dumps(OpenaiResponse(id, created, content=content, stream=stream).dict()).encode()
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
@ -131,8 +137,6 @@ def process_messages(messages):
|
||||||
|
|
||||||
class SSEHandler(web.View):
|
class SSEHandler(web.View):
|
||||||
|
|
||||||
id = "chatcmpl-" + ''.join(random.choices(string.ascii_letters + string.digits, k=29))
|
|
||||||
created = str(int(time.time()))
|
|
||||||
|
|
||||||
async def get(self):
|
async def get(self):
|
||||||
data = {
|
data = {
|
||||||
|
@ -141,7 +145,7 @@ class SSEHandler(web.View):
|
||||||
{
|
{
|
||||||
"id": "gpt-4",
|
"id": "gpt-4",
|
||||||
"object": "model",
|
"object": "model",
|
||||||
"created": self.created,
|
"created": str(int(time.time())),
|
||||||
"owned_by": "OpenAI",
|
"owned_by": "OpenAI",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
"root": 'gpt-4',
|
"root": 'gpt-4',
|
||||||
|
@ -153,11 +157,17 @@ class SSEHandler(web.View):
|
||||||
return web.json_response(data)
|
return web.json_response(data)
|
||||||
|
|
||||||
async def post(self):
|
async def post(self):
|
||||||
|
id = "chatcmpl-" + ''.join(random.choices(string.ascii_letters + string.digits, k=29))
|
||||||
|
created = str(int(time.time()))
|
||||||
request_data = await self.request.json()
|
request_data = await self.request.json()
|
||||||
|
|
||||||
messages = request_data.get('messages', [])
|
messages = request_data.get('messages', [])
|
||||||
prompt = messages[-1]['content']
|
if USER_MESSAGE_WORKAROUND:
|
||||||
context = process_messages(messages[:-1])
|
prompt = USER_MESSAGE
|
||||||
|
context = process_messages(messages)
|
||||||
|
else:
|
||||||
|
prompt = messages[-1]['content']
|
||||||
|
context = process_messages(messages[:-1])
|
||||||
stream = request_data.get('stream', [])
|
stream = request_data.get('stream', [])
|
||||||
if stream:
|
if stream:
|
||||||
self.response = web.StreamResponse(
|
self.response = web.StreamResponse(
|
||||||
|
@ -195,7 +205,7 @@ class SSEHandler(web.View):
|
||||||
async def output():
|
async def output():
|
||||||
print("\nФормируется запрос...")
|
print("\nФормируется запрос...")
|
||||||
|
|
||||||
link_replacer = LinkReplacer()
|
link_placeholder_replacer = LinkPlaceholderReplacer()
|
||||||
response_text = ""
|
response_text = ""
|
||||||
wrote = 0
|
wrote = 0
|
||||||
|
|
||||||
|
@ -230,36 +240,32 @@ class SSEHandler(web.View):
|
||||||
print("\nОтвет от сервера:\n")
|
print("\nОтвет от сервера:\n")
|
||||||
if message.get("contentOrigin") == "Apology":
|
if message.get("contentOrigin") == "Apology":
|
||||||
if stream and wrote == 0:
|
if stream and wrote == 0:
|
||||||
await self.response.write(prepare_response(self.id, self.created, filter=True))
|
await self.response.write(prepare_response(id, created, filter=True))
|
||||||
|
|
||||||
if stream:
|
if stream:
|
||||||
if ASTERISK_FIX and (response_text.count("*") % 2 == 1):
|
if ASTERISK_FIX and (response_text.count("*") % 2 == 1):
|
||||||
asterisk = "*"
|
asterisk = "*"
|
||||||
else:
|
else:
|
||||||
asterisk = ""
|
asterisk = ""
|
||||||
await self.response.write(prepare_response(self.id, self.created, content=asterisk, end=True, done=True))
|
await self.response.write(prepare_response(id, created, content=asterisk, end=True, done=True))
|
||||||
else:
|
else:
|
||||||
if ASTERISK_FIX and len(response_text.split("*")) % 2 == 0:
|
if ASTERISK_FIX and len(response_text.split("*")) % 2 == 0:
|
||||||
response_text += "*"
|
response_text += "*"
|
||||||
OAIResponse = OpenaiResponse(self.id, self.created, content=response_text, stream=False)
|
oai_response = prepare_response(id, created, content=response_text, stream=False)
|
||||||
await self.response.write(
|
await self.response.write(oai_response)
|
||||||
json.dumps(
|
|
||||||
OAIResponse.dict()
|
|
||||||
).encode()
|
|
||||||
)
|
|
||||||
print("\nСообщение отозвано.")
|
print("\nСообщение отозвано.")
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
streamingContentChunk = message['text'][wrote:]
|
streaming_content_chunk = message['text'][wrote:]
|
||||||
streamingContentChunk = streamingContentChunk.replace('\\"', '"')
|
streaming_content_chunk = streaming_content_chunk.replace('\\"', '\"')
|
||||||
response_text += streamingContentChunk
|
response_text += streaming_content_chunk
|
||||||
|
|
||||||
if 'urls' in vars():
|
if 'urls' in vars():
|
||||||
if urls:
|
if urls:
|
||||||
streamingContentChunk = link_replacer.process(streamingContentChunk, urls)
|
streaming_content_chunk = link_placeholder_replacer.process(streaming_content_chunk, urls)
|
||||||
|
|
||||||
if stream:
|
if stream:
|
||||||
await self.response.write(prepare_response(self.id, self.created, content=streamingContentChunk))
|
await self.response.write(prepare_response(id, created, content=streaming_content_chunk))
|
||||||
|
|
||||||
print(message["text"][wrote:], end="")
|
print(message["text"][wrote:], end="")
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
@ -270,47 +276,57 @@ class SSEHandler(web.View):
|
||||||
suggested_responses = "\n```" + suggested_responses + "```"
|
suggested_responses = "\n```" + suggested_responses + "```"
|
||||||
if stream:
|
if stream:
|
||||||
if suggestion:
|
if suggestion:
|
||||||
await self.response.write(prepare_response(self.id, self.created, content=streamingContentChunk, end=True, done=True))
|
await self.response.write(prepare_response(id, created, content=streaming_content_chunk, end=True, done=True))
|
||||||
else:
|
else:
|
||||||
await self.response.write(prepare_response(self.id, self.created, end=True, done=True))
|
await self.response.write(prepare_response(id, created, end=True, done=True))
|
||||||
else:
|
else:
|
||||||
if suggestion:
|
if suggestion:
|
||||||
response_text = response_text + suggested_responses
|
response_text = response_text + suggested_responses
|
||||||
OAIResponse = OpenaiResponse(self.id, self.created, content=response_text, stream=False)
|
oai_response = prepare_response(id, created, content=response_text, stream=False)
|
||||||
await self.response.write(
|
await self.response.write(oai_response)
|
||||||
json.dumps(
|
|
||||||
OAIResponse.dict()
|
|
||||||
).encode()
|
|
||||||
)
|
|
||||||
break
|
break
|
||||||
if final and not response["item"]["messages"][-1].get("text"):
|
if final and not response["item"]["messages"][-1].get("text"):
|
||||||
if stream:
|
if stream:
|
||||||
await self.response.write(prepare_response(self.id, self.created, filter=True, end=True))
|
await self.response.write(prepare_response(id, created, filter=True, end=True))
|
||||||
print("Сработал фильтр.")
|
print("Сработал фильтр.")
|
||||||
|
|
||||||
if response_text:
|
if response_text:
|
||||||
encoding = tiktoken.get_encoding("cl100k_base")
|
encoding = tiktoken.get_encoding("cl100k_base")
|
||||||
print(f"Всего токенов в ответе: \033[1;32m{len(encoding.encode(response_text))}\033[0m")
|
tokens = len(encoding.encode(response_text))
|
||||||
|
print(f"\nВсего токенов в ответе: \033[1;32m{tokens}\033[0m")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await output()
|
await output()
|
||||||
await chatbot.close()
|
await chatbot.close()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error = f"Ошибка: {str(e)}."
|
error = f"Ошибка: {str(e)}."
|
||||||
|
error_text = ""
|
||||||
if str(e) == "'messages'":
|
if str(e) == "'messages'":
|
||||||
print(error, "\nПроблема с учеткой. Причины этому: \n"
|
error_text = "\nПроблема с учеткой. Возможные причины: \n```\n " \
|
||||||
" Бан. Фикс: регистрация по новой. \n"
|
" Бан. Фикс: регистрация по новой. \n " \
|
||||||
" Куки слетели. Фикс: собрать их снова. \n"
|
" Куки слетели. Фикс: собрать их снова. \n " \
|
||||||
" Достигнут лимит сообщений Бинга. Фикс: попробовать разлогиниться и собрать куки, либо собрать их с новой учетки и/или айпи."
|
" Достигнут лимит сообщений Бинга. Фикс: попробовать разлогиниться и собрать куки, либо собрать их с новой учетки и/или айпи. \n " \
|
||||||
" Возможно Бинг барахлит и нужно просто сделать реген/свайп."
|
" Возможно Бинг барахлит/троттлит запросы и нужно просто сделать реген/свайп. \n```\n " \
|
||||||
"Чтобы узнать подробности можно зайти в сам чат Бинга.")
|
"Чтобы узнать подробности можно зайти в сам чат Бинга и отправить сообщение."
|
||||||
|
print(error, error_text)
|
||||||
elif str(e) == " " or str(e) == "":
|
elif str(e) == " " or str(e) == "":
|
||||||
print(error, "Таймаут.")
|
error_text = "Таймаут."
|
||||||
|
print(error, error_text)
|
||||||
elif str(e) == "received 1000 (OK); then sent 1000 (OK)":
|
elif str(e) == "received 1000 (OK); then sent 1000 (OK)":
|
||||||
print(error, "Слишком много токенов. Больше 14000 токенов не принимает.")
|
error_text = "Слишком много токенов. Больше 14000 токенов не принимает."
|
||||||
|
print(error, error_text)
|
||||||
|
elif str(e) == "'contentOrigin'":
|
||||||
|
error_text = "Ошибка связанная с размером промпта. \n " \
|
||||||
|
"Возможно последнее сообщение в отправленном промпте (джейл или сообщение пользователя/ассистента) " \
|
||||||
|
"на сервер слишком большое. \n"
|
||||||
|
print(error, error_text)
|
||||||
else:
|
else:
|
||||||
print(error)
|
print(error)
|
||||||
|
if stream:
|
||||||
|
oai_response = prepare_response(id, created, content=error + error_text, end=True, done=True, stream=True)
|
||||||
|
else:
|
||||||
|
oai_response = prepare_response(id, created, content=error + error_text, stream=False)
|
||||||
|
await self.response.write(oai_response)
|
||||||
return self.response
|
return self.response
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
Loading…
Reference in New Issue