Фикс перебросом шиканья на креативе

This commit is contained in:
Barbariskaa 2023-06-03 00:18:08 +03:00 committed by GitHub
parent 47009666d8
commit 406f24211b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 41 deletions

View File

@ -1,10 +1,14 @@
PORT = 8081 PORT = 8081
HOST = "127.0.0.1" HOST = "127.0.0.1"
CONCATENATE_RESPONSES = True #Соединять ли отозванные ответы от сервера? CONCATENATE_RESPONSES = True #Соединять ли отозванные ответы от сервера?
CONCATENATE_RESPONSES_STRING = "\n\n" #Как отозванные сообщения соединяются. CONCATENATE_RESPONSES_STRING = "\n\n" #Чем отозванные сообщения соединяются.
DESIRED_TOKENS = 200 DESIRED_TOKENS = 150
CONTINUATION_QUERY = "(continue roleplay from the sentence where you have left, don't forget to use character names)" #Сообщение побуждающее бота продолжить отозванное сообщение. CONTINUATION_QUERY = "(continue from the sentence where you have left, don't forget to use character names and use word she as less as possible)"
MARKUP_FIX = True #Фикс потерянных кавычек и звездочек при отзыве сообщения. MARKUP_FIX = True #Фикс потерянных кавычек и звездочек при отзыве сообщения.
COOKIE_NAME = "cookies.json" COOKIE_NAME = "cookies.json"
USER_MESSAGE_WORKAROUND = True #Отправка в чат сообщения ниже. Код работает по такому принципу: есть контекст (история чата), а есть сообщение юзера. Если True, то сообщением отправляется заглушка ниже, если False, то отправляется последнее сообщение в таверне - джейл/ответ бота/ответ пользователя. USER_MESSAGE_WORKAROUND = True #Отправка в чат сообщения ниже. Код работает по такому принципу: есть контекст (история чата), а есть сообщение юзера. Если True, то сообщением отправляется заглушка ниже, если False, то отправляется последнее сообщение в таверне - джейл/ответ бота/ответ пользователя.
USER_MESSAGE = "Respond to the text above." #Заглушка USER_MESSAGE = "Respond to the text above." #Отправляемая заглушка
REDIRECT_PROXY = "https://api.openai.com/v1/chat/completions"
REDIRECT_API_KEY = ""
REDIRECT_API_MODEL = "gpt-3.5-turbo" # gpt-3.5-turbo / gpt-3.5-turbo-0301 / gpt-4 / gpt-4-0314 / gpt-4-32k
REDIRECT_COMMAND = "Make the text above use less pronouns. Keep asterisks and quotes, it's markup."

103
main.py
View File

@ -8,6 +8,8 @@ import re
import sys import sys
import tiktoken import tiktoken
import config import config
import requests
import aiohttp
from urllib.parse import urlparse from urllib.parse import urlparse
PORT = config.PORT PORT = config.PORT
@ -25,6 +27,11 @@ COOKIE_NAME = config.COOKIE_NAME
USER_MESSAGE_WORKAROUND = config.USER_MESSAGE_WORKAROUND USER_MESSAGE_WORKAROUND = config.USER_MESSAGE_WORKAROUND
USER_MESSAGE = config.USER_MESSAGE USER_MESSAGE = config.USER_MESSAGE
REDIRECT_PROXY = config.REDIRECT_PROXY
REDIRECT_API_KEY = config.REDIRECT_API_KEY
REDIRECT_API_MODEL = config.REDIRECT_API_MODEL
REDIRECT_COMMAND = config.REDIRECT_COMMAND
try: try:
cookies = json.loads(open(f"./{COOKIE_NAME}", encoding="utf-8").read()) cookies = json.loads(open(f"./{COOKIE_NAME}", encoding="utf-8").read())
except: except:
@ -175,13 +182,11 @@ class SSEHandler(web.View):
self.created = str(int(time.time())) self.created = str(int(time.time()))
self.responseWasFiltered = False self.responseWasFiltered = False
self.responseWasFilteredInLoop = False self.responseWasFilteredInLoop = False
self.responseText = ""
self.fullResponse = "" self.fullResponse = ""
self.timesFilterEncountered = 0
async def streamCallback(self, data): async def streamCallback(self, data):
self.fullResponse += data self.fullResponse += data
if stream: if stream and not redirect:
await self.response.write(b"data: " + json.dumps({ await self.response.write(b"data: " + json.dumps({
"id": self.id, "id": self.id,
"object": "chat.completion.chunk", "object": "chat.completion.chunk",
@ -219,9 +224,18 @@ class SSEHandler(web.View):
if conversation_style not in ["creative", "balanced", "precise"]: if conversation_style not in ["creative", "balanced", "precise"]:
conversation_style = "creative" conversation_style = "creative"
suggestion = self.request.path.split('/')[2] if self.request.path.split('/')[1] == "suggestion":
if suggestion != "suggestion": redirect = True
suggestion = None
if self.request.path.split('/')[2] == "suggestion":
suggestion = True
else:
suggestion = False
if self.request.path.split('/')[2] == "redirect":
redirect = True
else:
redirect = False
async def output(self, streamCallback, nsfwMode=False): async def output(self, streamCallback, nsfwMode=False):
self.responseText = "" self.responseText = ""
@ -321,7 +335,7 @@ class SSEHandler(web.View):
try: try:
if stream: if stream and not redirect:
await self.response.write(b"data: " + json.dumps({ await self.response.write(b"data: " + json.dumps({
"id": self.id, "id": self.id,
"object": "chat.completion.chunk", "object": "chat.completion.chunk",
@ -348,7 +362,7 @@ class SSEHandler(web.View):
self.fullResponse += CONCATENATE_RESPONSES_STRING self.fullResponse += CONCATENATE_RESPONSES_STRING
print("Токенов в ответе:",tokens_total) print("Токенов в ответе:",tokens_total)
while tokens_total < DESIRED_TOKENS and not self.responseWasFilteredInLoop: while tokens_total < DESIRED_TOKENS and not self.responseWasFilteredInLoop:
if stream: if stream and not redirect:
await self.response.write(b"data: " + json.dumps({ await self.response.write(b"data: " + json.dumps({
"id": self.id, "id": self.id,
"object": "chat.completion.chunk", "object": "chat.completion.chunk",
@ -369,34 +383,48 @@ class SSEHandler(web.View):
tokens_total = len(encoding.encode(self.fullResponse)) tokens_total = len(encoding.encode(self.fullResponse))
print(f"\nТокенов в ответе: {tokens_response}") print(f"\nТокенов в ответе: {tokens_response}")
print(f"Токенов всего: {tokens_total}") print(f"Токенов всего: {tokens_total}")
if redirect:
if stream: async with aiohttp.ClientSession() as session:
await self.response.write(b"data: " + json.dumps({ headers = {"Content-Type": "application/json","Authorization": f"Bearer {REDIRECT_API_KEY}"}
"id": self.id, body = {
"created": self.created, "model": REDIRECT_API_MODEL,
"object": 'chat.completion.chunk', "messages": [{"role": "user", "content": f"{self.fullResponse}\n\n{REDIRECT_COMMAND}"}],
"model": "gpt-4", "temperature": 0.7,
"choices": [{ "stream": stream
"delta": {}, }
"finish_reason": 'stop', # Use await to wait for the response
"index": 0, async with session.post(REDIRECT_PROXY, headers=headers, json=body) as response:
}], # Use async for to iterate over the response chunks
}).encode() + b"\n\n") async for chunk in response.content.iter_chunked(1024):
await self.response.write(chunk)
else: else:
await self.response.write(json.dumps({ if stream:
"id": self.id, await self.response.write(b"data: " + json.dumps({
"created": self.created, "id": self.id,
"object": "chat.completion", "created": self.created,
"model": "gpt-4", "object": 'chat.completion.chunk',
"choices": [{ "model": "gpt-4",
"message": { "choices": [{
"role": 'assistant', "delta": {},
"content": self.fullResponse "finish_reason": 'stop',
}, "index": 0,
'finish_reason': 'stop', }],
'index': 0, }).encode() + b"\n\n")
}] else:
}).encode()) await self.response.write(json.dumps({
"id": self.id,
"created": self.created,
"object": "chat.completion",
"model": "gpt-4",
"choices": [{
"message": {
"role": 'assistant',
"content": self.fullResponse
},
'finish_reason': 'stop',
'index': 0,
}]
}).encode())
return self.response return self.response
except Exception as e: except Exception as e:
error = f"Ошибка: {str(e)}." error = f"Ошибка: {str(e)}."
@ -448,5 +476,6 @@ if __name__ == '__main__':
f"Режим creative: http://{HOST}:{PORT}/creative\n" f"Режим creative: http://{HOST}:{PORT}/creative\n"
f"Режим precise: http://{HOST}:{PORT}/precise\n" f"Режим precise: http://{HOST}:{PORT}/precise\n"
f"Режим balanced: http://{HOST}:{PORT}/balanced\n" f"Режим balanced: http://{HOST}:{PORT}/balanced\n"
f"Также есть режим подсказок от Бинга. Чтобы его включить, нужно добавить /suggestion к концу URL, после режима.") f"Есть режим подсказок от Бинга. Чтобы его включить, нужно добавить /suggestion после выбранного режима.\n"
web.run_app(app, host=HOST, port=PORT, print=None) f"И еще есть режим переброса, нужный для того чтобы победить шиканье креативной Сидни. Включается добавлением /redirect после режима.")
web.run_app(app, host=HOST, port=PORT, print=None)