optimization pow, add ENABLE_GATEWAY env

This commit is contained in:
LanQian 2024-05-19 03:24:13 +08:00
parent 25cc95c595
commit 09386d857b
8 changed files with 52 additions and 26 deletions

View File

@ -3,5 +3,6 @@ CHATGPT_BASE_URL=https://chatgpt.com
HISTORY_DISABLED=true
PROXY_URL=your_first_proxy, your_second_proxy
ARKOSE_TOKEN_URL=https://arkose.example.com/token
POW_DIFFICULTY=4
POW_DIFFICULTY=000032
RETRY_TIMES=3
ENABLE_GATEWAY=true

View File

@ -35,7 +35,7 @@ jobs:
images: lanqian528/chat2api
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=raw,value=v1.0.2
type=raw,value=v1.0.4
- name: Build and push
uses: docker/build-push-action@v5

View File

@ -156,8 +156,9 @@ CHATGPT_BASE_URL=https://chatgpt.com // ChatGPT网关地址
HISTORY_DISABLED=true // 是否不保存聊天记录并返回 conversation_idtrue为不保存且不返回
PROXY_URL=your_first_proxy, your_second_proxy // 代理url多个代理用逗号分隔
ARKOSE_TOKEN_URL=https://arkose.example.com/token // 获取Arkose token的地址上文有提供说明
POW_DIFFICULTY=4 // 要解决的工作量证明难度数值越大计算时间越长建议3或者4
POW_DIFFICULTY=000032 // 要解决的工作量证明难度字符串越小计算时间越长建议000032
RETRY_TIMES=3 // 出错重试次数
ENABLE_GATEWAY=true // 是否启用网关模式(WEBUI)true为启用
```
## License

View File

@ -118,7 +118,7 @@ class ChatService:
proofofwork_required = proofofwork.get('required')
if proofofwork_required:
proofofwork_diff = proofofwork.get("difficulty")
if proofofwork_diff.startswith("0" * (pow_difficulty + 1)):
if proofofwork_diff <= pow_difficulty:
raise HTTPException(status_code=403, detail=f"Proof of work difficulty too high: {proofofwork_diff}")
proofofwork_seed = proofofwork.get("seed")
self.proof_token = await run_in_threadpool(get_answer_token, proofofwork_seed, proofofwork_diff, config)
@ -207,6 +207,7 @@ class ChatService:
"force_paragen_model_slug": "",
"force_nulligen": False,
"force_rate_limit": False,
"force_ues_sse": True,
"websocket_request_id": f"{uuid.uuid4()}"
}
if self.conversation_id:

View File

@ -6,6 +6,8 @@ import time
from datetime import datetime, timedelta, timezone
from html.parser import HTMLParser
import pybase64
from utils.Logger import logger
cores = [16, 24, 32]
@ -294,7 +296,8 @@ async def get_dpl(service):
return True
headers = service.base_headers.copy()
if len(cached_scripts) == 0:
cached_scripts.append("https://cdn.oaistatic.com/_next/static/cXh69klOLzS0Gy2joLDRS/_ssgManifest.js?dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3")
cached_scripts.append(
"https://cdn.oaistatic.com/_next/static/cXh69klOLzS0Gy2joLDRS/_ssgManifest.js?dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3")
cached_dpl = "453ebaec0d44c2decab71692e1bfe39be35a24b3"
cached_time = int(time.time())
try:
@ -345,20 +348,34 @@ def generate_answer(seed, diff, config):
diff_len = len(diff)
seed_encoded = seed.encode()
static_config_part1 = (json.dumps(config[:3], separators=(',', ':'))[:-1] + ',').encode()
static_config_part2 = (',' + json.dumps(config[4:9], separators=(',', ':'))[1:-1] + ',').encode()
static_config_part3 = (',' + json.dumps(config[10:], separators=(',', ':'))[1:]).encode()
target_diff = bytes.fromhex(diff)
for i in range(500000):
config[3] = i
config[9] = i
json_data = json.dumps(config, separators=(',', ':'), ensure_ascii=False)
base = base64.b64encode(json_data.encode()).decode()
hasher = hashlib.sha3_512()
hasher.update(seed_encoded + base.encode())
hash_value = hasher.digest()
if hash_value.hex()[:diff_len] <= diff:
return base
dynamic_json_i = str(i).encode()
final_json_bytes = static_config_part1 + dynamic_json_i + static_config_part2 + dynamic_json_i + static_config_part3
base_encode = pybase64.b64encode(final_json_bytes)
hash_value = hashlib.sha3_512(seed_encoded + base_encode).digest()
if hash_value[:diff_len] <= target_diff:
return base_encode.decode()
return "wQ8Lk5FbGpA2NcR9dShT6gYjU7VxZ4D" + base64.b64encode(f'"{seed}"'.encode()).decode()
def get_requirements_token(config):
require_token = generate_answer(format(random.random()), "0", config)
require_token = generate_answer(format(random.random()), "0fffff", config)
return 'gAAAAAC' + require_token
if __name__ == "__main__":
cached_scripts.append(
"https://cdn.oaistatic.com/_next/static/cXh69klOLzS0Gy2joLDRS/_ssgManifest.js?dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3")
cached_dpl = "453ebaec0d44c2decab71692e1bfe39be35a24b3"
cached_time = int(time.time())
seed = format(random.random())
diff = "0fffff"
config = get_config("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome")
answer = get_answer_token(seed, diff, config)

View File

@ -5,7 +5,7 @@ from fastapi.responses import StreamingResponse, Response
from starlette.background import BackgroundTask
from utils.Client import Client
from utils.config import chatgpt_base_url_list, proxy_url_list
from utils.config import chatgpt_base_url_list, proxy_url_list, enable_gateway
headers_reject_list = [
"x-real-ip",
@ -60,6 +60,8 @@ headers_reject_list = [
async def chatgpt_reverse_proxy(request: Request, path: str):
if not enable_gateway:
raise HTTPException(status_code=404, detail="Gateway is disabled")
try:
origin_host = request.url.netloc
if ":" in origin_host:

View File

@ -4,4 +4,5 @@ uvicorn
tiktoken
python-dotenv
websockets
pillow
pillow
pybase64

View File

@ -7,11 +7,13 @@ from utils.Logger import logger
load_dotenv(encoding="ascii")
def is_true(stream):
if isinstance(stream, str):
return stream.lower() in ['true', '1', 't', 'y', 'yes']
elif isinstance(stream, int):
return stream == 1
def is_true(x):
if isinstance(x, bool):
return x
if isinstance(x, str):
return x.lower() in ['true', '1', 't', 'y', 'yes']
elif isinstance(x, int):
return x == 1
else:
return False
@ -21,10 +23,10 @@ authorization = os.getenv('AUTHORIZATION', '').replace(' ', '')
chatgpt_base_url = os.getenv('CHATGPT_BASE_URL', 'https://chatgpt.com').replace(' ', '')
arkose_token_url = os.getenv('ARKOSE_TOKEN_URL', '').replace(' ', '')
proxy_url = os.getenv('PROXY_URL', '').replace(' ', '')
history_disabled_str = os.getenv('HISTORY_DISABLED', 'true').replace(' ', '')
history_disabled = is_true(history_disabled_str)
pow_difficulty = int(os.getenv('POW_DIFFICULTY', 4))
history_disabled = is_true(os.getenv('HISTORY_DISABLED', True))
pow_difficulty = os.getenv('POW_DIFFICULTY', '000032')
retry_times = int(os.getenv('RETRY_TIMES', 3))
enable_gateway = is_true(os.getenv('ENABLE_GATEWAY', True))
authorization_list = authorization.split(',') if authorization else []
chatgpt_base_url_list = chatgpt_base_url.split(',') if chatgpt_base_url else []
@ -32,7 +34,7 @@ arkose_token_url_list = arkose_token_url.split(',') if arkose_token_url else []
proxy_url_list = proxy_url.split(',') if proxy_url else []
logger.info("-" * 60)
logger.info("Chat2Api v1.0.2 | https://github.com/lanqian528/chat2api")
logger.info("Chat2Api v1.0.4 | https://github.com/lanqian528/chat2api")
logger.info("-" * 60)
logger.info("Environment variables:")
logger.info("API_PREFIX: " + str(api_prefix))
@ -43,4 +45,5 @@ logger.info("PROXY_URL: " + str(proxy_url_list))
logger.info("HISTORY_DISABLED: " + str(history_disabled))
logger.info("POW_DIFFICULTY: " + str(pow_difficulty))
logger.info("RETRY_TIMES: " + str(retry_times))
logger.info("ENABLE_GATEWAY: " + str(enable_gateway))
logger.info("-" * 60)