Фикс перебросом шиканья на креативе
This commit is contained in:
parent
47009666d8
commit
406f24211b
12
config.py
12
config.py
|
@ -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
103
main.py
|
@ -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)
|
Loading…
Reference in New Issue