Spaces:
Paused
Paused
| import requests | |
| import threading | |
| import re | |
| from googletrans import Translator | |
| from flask import request | |
| from datetime import datetime | |
| from requests import get | |
| from freeGPT import gpt3 | |
| from server.auto_proxy import get_random_proxy, remove_proxy, update_working_proxies | |
| from server.config import special_instructions | |
| class Backend_Api: | |
| def __init__(self, app, config: dict) -> None: | |
| self.app = app | |
| self.use_auto_proxy = config['use_auto_proxy'] | |
| self.routes = { | |
| '/backend-api/v2/conversation': { | |
| 'function': self._conversation, | |
| 'methods': ['POST'] | |
| } | |
| } | |
| if self.use_auto_proxy: | |
| update_proxies = threading.Thread( | |
| target=update_working_proxies, daemon=True) | |
| update_proxies.start() | |
| def _conversation(self): | |
| try: | |
| jailbreak = request.json['jailbreak'] | |
| model = request.json['model'] | |
| _conversation = request.json['meta']['content']['conversation'] | |
| internet_access = request.json['meta']['content']['internet_access'] | |
| prompt = request.json['meta']['content']['parts'][0] | |
| current_date = datetime.now().strftime("%Y-%m-%d") | |
| system_message = f'You are ChatGPT also known as ChatGPT, a large language model trained by OpenAI. Strictly follow the users instructions. Knowledge cutoff: 2021-09-01 Current date: {current_date}' | |
| extra = [] | |
| if internet_access: | |
| search = get('https://ddg-api.herokuapp.com/search', | |
| params={ | |
| 'query': prompt["content"], | |
| 'limit': 3, | |
| }) | |
| blob = '' | |
| for index, result in enumerate(search.json()): | |
| blob += f'[{index}] "{result["snippet"]}"\nURL:{result["link"]}\n\n' | |
| date = datetime.now().strftime('%d/%m/%y') | |
| blob += f'current date: {date}\n\nInstructions: Using the provided web search results, write a comprehensive reply to the next user query. Make sure to cite results using [[number](URL)] notation after the reference. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject. Ignore your previous response if any.' | |
| extra = [{'role': 'user', 'content': blob}] | |
| if special_instructions[jailbreak]: | |
| set_response_language( | |
| prompt['content'], special_instructions[jailbreak]) | |
| # Initialize the conversation with the system message | |
| conversation = [{'role': 'system', 'content': system_message}] | |
| # Add extra results | |
| conversation += extra | |
| # Add jailbreak instructions, if any | |
| jailbreak_instructions = isJailbreak(jailbreak) | |
| if jailbreak_instructions: | |
| conversation += jailbreak_instructions | |
| # Add the existing conversation and the prompt | |
| conversation += _conversation + [prompt] | |
| def stream(): | |
| if isGPT3Model(model): | |
| response = get_response_gpt3( | |
| conversation, self.use_auto_proxy, jailbreak) | |
| yield response | |
| if isGPT4Model(model): | |
| for response in get_response_gpt4(conversation, jailbreak): | |
| yield response | |
| return self.app.response_class(stream(), mimetype='text/event-stream') | |
| except Exception as e: | |
| print(e) | |
| print(e.__traceback__.tb_next) | |
| return { | |
| '_action': '_ask', | |
| 'success': False, | |
| "error": f"an error occurred {str(e)}" | |
| }, 400 | |
| def filter_jailbroken_response(response): | |
| act_pattern = re.compile(r'ACT:', flags=re.DOTALL) | |
| act_match = act_pattern.search(response) | |
| if act_match: | |
| response = response[act_match.end():] | |
| else: | |
| response = '[Please wait... Unlocking GPT π]' | |
| return response | |
| def set_response_language(prompt, special_instructions_list): | |
| translator = Translator() | |
| detected_language = translator.detect(prompt).lang | |
| language_instructions = f"You will respond in the language: {detected_language}. " | |
| if special_instructions_list: | |
| special_instructions_list[0]['content'] = language_instructions + \ | |
| special_instructions_list[0]['content'] | |
| def get_response_gpt3(conversation, use_proxy, jailbreak): | |
| while use_proxy: | |
| try: | |
| random_proxy = get_random_proxy() | |
| res = gpt3.Completion.create( | |
| prompt=conversation, proxy=random_proxy) | |
| response = res['text'] | |
| break | |
| except Exception as e: | |
| print(f"Error with proxy {random_proxy}: {e}") | |
| remove_proxy(random_proxy) | |
| while not use_proxy: | |
| try: | |
| res = gpt3.Completion.create(prompt=conversation) | |
| response = res['text'] | |
| break | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| if response is not None: | |
| if isJailbreak(jailbreak): | |
| response = filter_jailbroken_response(response) | |
| return response | |
| def get_response_gpt4(conversation, jailbreak): | |
| api_url = f"http://127.0.0.1:3000/ask/stream?prompt={conversation}&model=forefront" | |
| try: | |
| with requests.get(api_url, stream=True) as res: | |
| res.raise_for_status() | |
| for response in res.iter_lines(chunk_size=1024, decode_unicode=True, delimiter='\n'): | |
| if response.startswith("data: "): | |
| print(response) | |
| yield filter_response_gpt4(response, jailbreak) | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| def filter_response_gpt4(response, jailbreak): | |
| response = response[6:] # Remove "data: " prefix | |
| response = response[1:-1] # Remove the quotation marks | |
| if isJailbreak(jailbreak): | |
| response = filter_jailbroken_response(response) | |
| return response | |
| def isGPT3Model(model): | |
| return model == "text-gpt-0035" | |
| def isGPT4Model(model): | |
| return model == "text-gpt-0040" | |
| def isJailbreak(jailbreak): | |
| if jailbreak != "Default": | |
| return special_instructions[jailbreak] if jailbreak in special_instructions else None | |
| else: | |
| return None | |