forked from xtekky/gpt4free
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
546 additions
and
302 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
Bootstrap: docker | ||
From: python:3.10-slim | ||
|
||
%post | ||
apt-get update && apt-get install -y git | ||
git clone https://github.com/xtekky/gpt4free.git | ||
cd gpt4free | ||
pip install --no-cache-dir -r requirements.txt | ||
cp gui/streamlit_app.py . | ||
|
||
%expose | ||
8501 | ||
|
||
%startscript | ||
exec streamlit run streamlit_app.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
### Example: `forefront` (use like openai pypi package) <a name="example-forefront"></a> | ||
|
||
```python | ||
import forefront | ||
|
||
# create an account | ||
token = forefront.Account.create(logging=True) | ||
print(token) | ||
|
||
# get a response | ||
for response in forefront.StreamingCompletion.create(token = token, | ||
prompt = 'hello world', model='gpt-4'): | ||
|
||
print(response.completion.choices[0].text, end = '') | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
from tls_client import Session | ||
from forefront.mail import Mail | ||
from time import time, sleep | ||
from re import match | ||
from forefront.typing import ForeFrontResponse | ||
from uuid import uuid4 | ||
from requests import post | ||
from json import loads | ||
|
||
|
||
class Account: | ||
def create(proxy = None, logging = False): | ||
|
||
proxies = { | ||
'http': 'http://' + proxy, | ||
'https': 'http://' + proxy } if proxy else False | ||
|
||
start = time() | ||
|
||
mail = Mail(proxies) | ||
mail_token = None | ||
mail_adress = mail.get_mail() | ||
|
||
#print(mail_adress) | ||
|
||
client = Session(client_identifier='chrome110') | ||
client.proxies = proxies | ||
client.headers = { | ||
"origin": "https://accounts.forefront.ai", | ||
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", | ||
} | ||
|
||
response = client.post('https://clerk.forefront.ai/v1/client/sign_ups?_clerk_js_version=4.32.6', | ||
data = { | ||
"email_address": mail_adress | ||
} | ||
) | ||
|
||
trace_token = response.json()['response']['id'] | ||
if logging: print(trace_token) | ||
|
||
response = client.post(f"https://clerk.forefront.ai/v1/client/sign_ups/{trace_token}/prepare_verification?_clerk_js_version=4.32.6", | ||
data = { | ||
"strategy" : "email_code", | ||
} | ||
) | ||
|
||
if logging: print(response.text) | ||
|
||
if not 'sign_up_attempt' in response.text: | ||
return 'Failed to create account!' | ||
|
||
while True: | ||
sleep(1) | ||
for _ in mail.fetch_inbox(): | ||
print(mail.get_message_content(_["id"])) | ||
mail_token = match(r"(\d){5,6}", mail.get_message_content(_["id"])).group(0) | ||
|
||
if mail_token: | ||
break | ||
|
||
if logging: print(mail_token) | ||
|
||
response = client.post(f'https://clerk.forefront.ai/v1/client/sign_ups/{trace_token}/attempt_verification?_clerk_js_version=4.38.4', data = { | ||
'code': mail_token, | ||
'strategy': 'email_code' | ||
}) | ||
|
||
if logging: print(response.json()) | ||
|
||
token = response.json()['client']['sessions'][0]['last_active_token']['jwt'] | ||
|
||
with open('accounts.txt', 'a') as f: | ||
f.write(f'{mail_adress}:{token}\n') | ||
|
||
if logging: print(time() - start) | ||
|
||
return token | ||
|
||
|
||
class StreamingCompletion: | ||
def create( | ||
token = None, | ||
chatId = None, | ||
prompt = '', | ||
actionType = 'new', | ||
defaultPersona = '607e41fe-95be-497e-8e97-010a59b2e2c0', # default | ||
model = 'gpt-4') -> ForeFrontResponse: | ||
|
||
if not token: raise Exception('Token is required!') | ||
if not chatId: chatId = str(uuid4()) | ||
|
||
headers = { | ||
'authority' : 'chat-server.tenant-forefront-default.knative.chi.coreweave.com', | ||
'accept' : '*/*', | ||
'accept-language' : 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3', | ||
'authorization' : 'Bearer ' + token, | ||
'cache-control' : 'no-cache', | ||
'content-type' : 'application/json', | ||
'origin' : 'https://chat.forefront.ai', | ||
'pragma' : 'no-cache', | ||
'referer' : 'https://chat.forefront.ai/', | ||
'sec-ch-ua' : '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', | ||
'sec-ch-ua-mobile' : '?0', | ||
'sec-ch-ua-platform': '"macOS"', | ||
'sec-fetch-dest' : 'empty', | ||
'sec-fetch-mode' : 'cors', | ||
'sec-fetch-site' : 'cross-site', | ||
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', | ||
} | ||
|
||
json_data = { | ||
'text' : prompt, | ||
'action' : actionType, | ||
'parentId' : chatId, | ||
'workspaceId' : chatId, | ||
'messagePersona' : defaultPersona, | ||
'model' : model | ||
} | ||
|
||
for chunk in post('https://chat-server.tenant-forefront-default.knative.chi.coreweave.com/chat', | ||
headers=headers, json=json_data, stream=True).iter_lines(): | ||
|
||
if b'finish_reason":null' in chunk: | ||
data = loads(chunk.decode('utf-8').split('data: ')[1]) | ||
token = data['choices'][0]['delta'].get('content') | ||
|
||
if token != None: | ||
yield ForeFrontResponse({ | ||
'id' : chatId, | ||
'object' : 'text_completion', | ||
'created': int(time()), | ||
'model' : model, | ||
'choices': [{ | ||
'text' : token, | ||
'index' : 0, | ||
'logprobs' : None, | ||
'finish_reason' : 'stop' | ||
}], | ||
'usage': { | ||
'prompt_tokens' : len(prompt), | ||
'completion_tokens' : len(token), | ||
'total_tokens' : len(prompt) + len(token) | ||
} | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
from requests import Session | ||
from string import ascii_letters | ||
from random import choices | ||
|
||
class Mail: | ||
def __init__(self, proxies: dict = None) -> None: | ||
self.client = Session() | ||
self.client.proxies = proxies | ||
self.client.headers = { | ||
"host": "api.mail.tm", | ||
"connection": "keep-alive", | ||
"sec-ch-ua": "\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"", | ||
"accept": "application/json, text/plain, */*", | ||
"content-type": "application/json", | ||
"sec-ch-ua-mobile": "?0", | ||
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", | ||
"sec-ch-ua-platform": "\"macOS\"", | ||
"origin": "https://mail.tm", | ||
"sec-fetch-site": "same-site", | ||
"sec-fetch-mode": "cors", | ||
"sec-fetch-dest": "empty", | ||
"referer": "https://mail.tm/", | ||
"accept-encoding": "gzip, deflate, br", | ||
"accept-language": "en-GB,en-US;q=0.9,en;q=0.8" | ||
} | ||
|
||
def get_mail(self) -> str: | ||
token = ''.join(choices(ascii_letters, k=14)).lower() | ||
init = self.client.post("https://api.mail.tm/accounts", json={ | ||
"address" : f"{token}@bugfoo.com", | ||
"password": token | ||
}) | ||
|
||
if init.status_code == 201: | ||
resp = self.client.post("https://api.mail.tm/token", json = { | ||
**init.json(), | ||
"password": token | ||
}) | ||
|
||
self.client.headers['authorization'] = 'Bearer ' + resp.json()['token'] | ||
|
||
return f"{token}@bugfoo.com" | ||
|
||
else: | ||
raise Exception("Failed to create email") | ||
|
||
def fetch_inbox(self): | ||
return self.client.get(f"https://api.mail.tm/messages").json()["hydra:member"] | ||
|
||
def get_message(self, message_id: str): | ||
return self.client.get(f"https://api.mail.tm/messages/{message_id}").json() | ||
|
||
def get_message_content(self, message_id: str): | ||
return self.get_message(message_id)["text"] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
class ForeFrontResponse: | ||
class Completion: | ||
class Choices: | ||
def __init__(self, choice: dict) -> None: | ||
self.text = choice['text'] | ||
self.content = self.text.encode() | ||
self.index = choice['index'] | ||
self.logprobs = choice['logprobs'] | ||
self.finish_reason = choice['finish_reason'] | ||
|
||
def __repr__(self) -> str: | ||
return f'''<__main__.APIResponse.Completion.Choices(\n text = {self.text.encode()},\n index = {self.index},\n logprobs = {self.logprobs},\n finish_reason = {self.finish_reason})object at 0x1337>''' | ||
|
||
def __init__(self, choices: dict) -> None: | ||
self.choices = [self.Choices(choice) for choice in choices] | ||
|
||
class Usage: | ||
def __init__(self, usage_dict: dict) -> None: | ||
self.prompt_tokens = usage_dict['prompt_tokens'] | ||
self.completion_tokens = usage_dict['completion_tokens'] | ||
self.total_tokens = usage_dict['total_tokens'] | ||
|
||
def __repr__(self): | ||
return f'''<__main__.APIResponse.Usage(\n prompt_tokens = {self.prompt_tokens},\n completion_tokens = {self.completion_tokens},\n total_tokens = {self.total_tokens})object at 0x1337>''' | ||
|
||
def __init__(self, response_dict: dict) -> None: | ||
|
||
self.response_dict = response_dict | ||
self.id = response_dict['id'] | ||
self.object = response_dict['object'] | ||
self.created = response_dict['created'] | ||
self.model = response_dict['model'] | ||
self.completion = self.Completion(response_dict['choices']) | ||
self.usage = self.Usage(response_dict['usage']) | ||
|
||
def json(self) -> dict: | ||
return self.response_dict |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.