Merge branch 'main' of https://github.com/xtekky/gpt4free
This commit is contained in:
commit
21c82d873a
7 changed files with 91 additions and 115 deletions
45
README.md
45
README.md
|
@ -19,27 +19,26 @@ Please note the following:
|
||||||
3. **Educational Purposes Only**: This repository and its content are provided strictly for educational purposes. By using the information and code provided, users acknowledge that they are using the APIs and models at their own risk and agree to comply with any applicable laws and regulations.
|
3. **Educational Purposes Only**: This repository and its content are provided strictly for educational purposes. By using the information and code provided, users acknowledge that they are using the APIs and models at their own risk and agree to comply with any applicable laws and regulations.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
| Section | Description | Link | Status |
|
||||||
| Section | Description | Link | Status |
|
| ------- | ----------- | ---- | ------ |
|
||||||
| -------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | --- | --- |
|
| **To do list** | List of tasks to be done | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#todo) | - |
|
||||||
| **To do list** | List of tasks to be done | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#todo) | - |
|
| **Current Sites** | Current websites or platforms that can be used as APIs | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#current-sites) | - |
|
||||||
| **Current Sites** | Current websites or platforms that can be used as APIs | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#current-sites) | - |
|
| **Best Sites for gpt4** | Recommended websites or platforms for gpt4 | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#best-sites) | - |
|
||||||
| **Best Sites for gpt4** | Recommended websites or platforms for gpt4 | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#best-sites) | - |
|
| **Streamlit GPT4Free GUI** | Web-based graphical user interface for interacting with gpt4free | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#streamlit-gpt4free-gui) | - |
|
||||||
| **Streamlit GPT4Free GUI** | Web-based graphical user interface for interacting with gpt4free | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#streamlit-gpt4free-gui) | - |
|
| **Docker** | Instructions on how to run gpt4free in a Docker container | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#docker-instructions) | - |
|
||||||
| **Docker** | Instructions on how to run gpt4free in a Docker container | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#docker-instructions) | - |
|
| **ChatGPT clone** | A ChatGPT clone with new features and scalability | [![Link to Website](https://img.shields.io/badge/Link-Visit%20Site-blue)](https://chat.chatbot.sex/chat) | - |
|
||||||
| **ChatGPT clone** | A ChatGPT clone with new features and scalability | [![Link to Website](https://img.shields.io/badge/Link-Visit%20Site-blue)](https://chat.chatbot.sex/chat) | - |
|
| **How to install** | Instructions on how to install gpt4free | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#install) | - |
|
||||||
| **How to install** | Instructions on how to install gpt4free | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#install) | - |
|
| **Legal Notice** | Legal notice or disclaimer | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#legal-notice) | - |
|
||||||
| **Legal Notice** | Legal notice or disclaimer | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#legal-notice) | - |
|
| **Copyright** | Copyright information | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#copyright) | - |
|
||||||
| **Copyright** | Copyright information | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#copyright) | - |
|
| **Star History** | Star History | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#star-history) | - |
|
||||||
| **Star History** | Star History | [![Link to Section](https://img.shields.io/badge/Link-Go%20to%20Section-blue)](#star-history) | - |
|
| **Usage Examples** | | | |
|
||||||
| **Usage Examples** | | | |
|
| `theb` | Example usage for theb (gpt-3.5) | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/theb/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
||||||
| `theb` | Example usage for theb (gpt-3.5) | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](openai_rev/theb/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
| `forefront` | Example usage for forefront (gpt-4) | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/forefront/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) | ||
|
||||||
| `forefront` | Example usage for forefront (gpt-4) | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/forefront/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) | | |
|
| `quora (poe)` | Example usage for quora | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/quora/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
||||||
| `quora (poe)` | Example usage for quora | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/quora/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
| `you` | Example usage for you | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/you/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
||||||
| `you` | Example usage for you | [![Link to File](https://img.shields.io/badge/Link-Go%20to%20File-blue)](gpt4free/you/README.md) | ![Active](https://img.shields.io/badge/Active-brightgreen) |
|
| **Try it Out** | | | |
|
||||||
| **Try it Out** | | | |
|
| Google Colab Jupyter Notebook | Example usage for gpt4free | [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DanielShemesh/gpt4free-colab/blob/main/gpt4free.ipynb) | - |
|
||||||
| Google Colab Jupyter Notebook | Example usage for gpt4free | [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DanielShemesh/gpt4free-colab/blob/main/gpt4free.ipynb) | - |
|
| replit Example (feel free to fork this repl) | Example usage for gpt4free | [![](https://img.shields.io/badge/Open%20in-Replit-1A1E27?logo=replit)](https://replit.com/@gpt4free/gpt4free-webui) | - |
|
||||||
| replit Example (feel free to fork this repl) | Example usage for gpt4free | [![](https://img.shields.io/badge/Open%20in-Replit-1A1E27?logo=replit)](https://replit.com/@gpt4free/gpt4free-webui) | - |
|
|
||||||
|
|
||||||
## Todo <a name="todo"></a>
|
## Todo <a name="todo"></a>
|
||||||
|
|
||||||
|
@ -102,6 +101,10 @@ Run
|
||||||
```
|
```
|
||||||
docker run -p 8501:8501 gpt4free:latest
|
docker run -p 8501:8501 gpt4free:latest
|
||||||
```
|
```
|
||||||
|
Another way - docker-compose (no docker build/run needed)
|
||||||
|
```
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
## Deploy using docker-compose
|
## Deploy using docker-compose
|
||||||
|
|
||||||
|
|
9
docker-compose.yaml
Normal file
9
docker-compose.yaml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
services:
|
||||||
|
gpt4free:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "8501:8501"
|
|
@ -9,29 +9,52 @@ class CoCalcResponse(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class Completion:
|
class Completion:
|
||||||
|
"""A class for generating text completions using CoCalc's GPT-based chatbot."""
|
||||||
|
|
||||||
|
API_ENDPOINT = "https://cocalc.com/api/v2/openai/chatgpt"
|
||||||
|
DEFAULT_SYSTEM_PROMPT = "ASSUME I HAVE FULL ACCESS TO COCALC. "
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(prompt: str, cookie_input: str) -> CoCalcResponse:
|
def create(prompt: str, cookie_input: str) -> CoCalcResponse:
|
||||||
|
"""
|
||||||
|
Generate a text completion for the given prompt using CoCalc's GPT-based chatbot.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
prompt: The text prompt to complete.
|
||||||
|
cookie_input: The cookie required to authenticate the chatbot API request.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A CoCalcResponse object containing the text completion and a boolean indicating
|
||||||
|
whether the request was successful.
|
||||||
|
"""
|
||||||
|
|
||||||
# Initialize a session with custom headers
|
# Initialize a session with custom headers
|
||||||
session = Completion._initialize_session(cookie_input)
|
session = Completion._initialize_session(cookie_input)
|
||||||
|
|
||||||
# Set the data that will be submitted
|
# Set the data that will be submitted
|
||||||
payload = Completion._create_payload(prompt, 'ASSUME I HAVE FULL ACCESS TO COCALC. ')
|
payload = Completion._create_payload(prompt, Completion.DEFAULT_SYSTEM_PROMPT)
|
||||||
|
|
||||||
# Submit the request and return the results
|
try:
|
||||||
return Completion._submit_request(session, payload)
|
# Submit the request and return the results
|
||||||
|
response = session.post(Completion.API_ENDPOINT, json=payload).json()
|
||||||
|
return CoCalcResponse(text=response['output'], status=response['success'])
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
# Handle exceptions that may occur during the request
|
||||||
|
print(f"Error: {e}")
|
||||||
|
return CoCalcResponse(text="", status=False)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _initialize_session(cls, conversation_cookie) -> requests.Session:
|
def _initialize_session(cls, conversation_cookie: str) -> requests.Session:
|
||||||
"""Initialize a session with custom headers for the request."""
|
"""Initialize a session with custom headers for the request."""
|
||||||
|
|
||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
headers = {
|
headers = {
|
||||||
'Accept': '*/*',
|
"Accept": "*/*",
|
||||||
'Accept-Language': 'en-US,en;q=0.5',
|
"Accept-Language": "en-US,en;q=0.5",
|
||||||
'Origin': 'https://cocalc.com',
|
"Origin": "https://cocalc.com",
|
||||||
'Referer': 'https://cocalc.com/api/v2/openai/chatgpt',
|
"Referer": "https://cocalc.com/api/v2/openai/chatgpt",
|
||||||
'Cookie': conversation_cookie,
|
"Cookie": conversation_cookie,
|
||||||
'User-Agent': UserAgent().random,
|
"User-Agent": UserAgent().random,
|
||||||
}
|
}
|
||||||
session.headers.update(headers)
|
session.headers.update(headers)
|
||||||
|
|
||||||
|
@ -39,9 +62,6 @@ class Completion:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _create_payload(prompt: str, system_prompt: str) -> dict:
|
def _create_payload(prompt: str, system_prompt: str) -> dict:
|
||||||
return {'input': prompt, 'system': system_prompt, 'tag': 'next:index'}
|
"""Create the payload for the API request."""
|
||||||
|
|
||||||
@staticmethod
|
return {"input": prompt, "system": system_prompt, "tag": "next:index"}
|
||||||
def _submit_request(session: requests.Session, payload: dict) -> CoCalcResponse:
|
|
||||||
response = session.post('https://cocalc.com/api/v2/openai/chatgpt', json=payload).json()
|
|
||||||
return CoCalcResponse(text=response['output'], status=response['success'])
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
from json import loads
|
from json import loads
|
||||||
from re import match
|
from re import findall
|
||||||
from time import time, sleep
|
from time import time, sleep
|
||||||
from typing import Generator, Optional
|
from typing import Generator, Optional
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
from fake_useragent import UserAgent
|
from fake_useragent import UserAgent
|
||||||
from requests import post
|
from requests import post
|
||||||
|
from pymailtm import MailTm, Message
|
||||||
from tls_client import Session
|
from tls_client import Session
|
||||||
|
|
||||||
from .mail import Mail
|
|
||||||
from .typing import ForeFrontResponse
|
from .typing import ForeFrontResponse
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,11 +19,8 @@ class Account:
|
||||||
|
|
||||||
start = time()
|
start = time()
|
||||||
|
|
||||||
mail_client = Mail(proxies)
|
mail_client = MailTm().get_account()
|
||||||
mail_token = None
|
mail_address = mail_client.address
|
||||||
mail_address = mail_client.get_mail()
|
|
||||||
|
|
||||||
# print(mail_address)
|
|
||||||
|
|
||||||
client = Session(client_identifier='chrome110')
|
client = Session(client_identifier='chrome110')
|
||||||
client.proxies = proxies
|
client.proxies = proxies
|
||||||
|
@ -33,7 +30,7 @@ class Account:
|
||||||
}
|
}
|
||||||
|
|
||||||
response = client.post(
|
response = client.post(
|
||||||
'https://clerk.forefront.ai/v1/client/sign_ups?_clerk_js_version=4.32.6',
|
'https://clerk.forefront.ai/v1/client/sign_ups?_clerk_js_version=4.38.4',
|
||||||
data={'email_address': mail_address},
|
data={'email_address': mail_address},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -45,9 +42,10 @@ class Account:
|
||||||
return 'Failed to create account!'
|
return 'Failed to create account!'
|
||||||
|
|
||||||
response = client.post(
|
response = client.post(
|
||||||
f'https://clerk.forefront.ai/v1/client/sign_ups/{trace_token}/prepare_verification?_clerk_js_version=4.32.6',
|
f'https://clerk.forefront.ai/v1/client/sign_ups/{trace_token}/prepare_verification?_clerk_js_version=4.38.4',
|
||||||
data={
|
data={
|
||||||
'strategy': 'email_code',
|
'strategy': 'email_link',
|
||||||
|
'redirect_url': 'https://accounts.forefront.ai/sign-up/verify'
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -59,26 +57,23 @@ class Account:
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
sleep(1)
|
sleep(1)
|
||||||
for _ in mail_client.fetch_inbox():
|
new_message: Message = mail_client.wait_for_message()
|
||||||
if logging:
|
if logging:
|
||||||
print(mail_client.get_message_content(_['id']))
|
print(new_message.data['id'])
|
||||||
mail_token = match(r'(\d){5,6}', mail_client.get_message_content(_['id'])).group(0)
|
|
||||||
|
|
||||||
if mail_token:
|
verification_url = findall(r'https:\/\/clerk\.forefront\.ai\/v1\/verify\?token=\w.+', new_message.text)[0]
|
||||||
|
|
||||||
|
if verification_url:
|
||||||
break
|
break
|
||||||
|
|
||||||
if logging:
|
if logging:
|
||||||
print(mail_token)
|
print(verification_url)
|
||||||
|
|
||||||
response = client.post(
|
response = client.get(verification_url)
|
||||||
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:
|
response = client.get('https://clerk.forefront.ai/v1/client?_clerk_js_version=4.38.4')
|
||||||
print(response.json())
|
|
||||||
|
|
||||||
token = response.json()['client']['sessions'][0]['last_active_token']['jwt']
|
token = response.json()['response']['sessions'][0]['last_active_token']['jwt']
|
||||||
|
|
||||||
with open('accounts.txt', 'a') as f:
|
with open('accounts.txt', 'a') as f:
|
||||||
f.write(f'{mail_address}:{token}\n')
|
f.write(f'{mail_address}:{token}\n')
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
from random import choices
|
|
||||||
from string import ascii_letters
|
|
||||||
|
|
||||||
from requests import Session
|
|
||||||
|
|
||||||
|
|
||||||
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"]
|
|
|
@ -10,7 +10,7 @@ response = you.Completion.create(
|
||||||
detailed=True,
|
detailed=True,
|
||||||
include_links=True, )
|
include_links=True, )
|
||||||
|
|
||||||
print(response)
|
print(response.dict())
|
||||||
|
|
||||||
# {
|
# {
|
||||||
# "response": "...",
|
# "response": "...",
|
||||||
|
@ -32,7 +32,7 @@ while True:
|
||||||
prompt=prompt,
|
prompt=prompt,
|
||||||
chat=chat)
|
chat=chat)
|
||||||
|
|
||||||
print("Bot:", response["response"])
|
print("Bot:", response.text)
|
||||||
|
|
||||||
chat.append({"question": prompt, "answer": response["response"]})
|
chat.append({"question": prompt, "answer": response.text})
|
||||||
```
|
```
|
||||||
|
|
|
@ -10,4 +10,5 @@ selenium
|
||||||
fake-useragent
|
fake-useragent
|
||||||
twocaptcha
|
twocaptcha
|
||||||
https://github.com/AI-Yash/st-chat/archive/refs/pull/24/head.zip
|
https://github.com/AI-Yash/st-chat/archive/refs/pull/24/head.zip
|
||||||
pydantic
|
pydantic
|
||||||
|
pymailtm
|
||||||
|
|
Loading…
Reference in a new issue