返回提交历史
Modified
g4f/Provider/ChatGpt.py
+59
-51
Modified
g4f/models.py
+4
-4
XFEstudio/gpt4free
Update (g4f/models.py g4f/Provider/ChatGpt.py)
ade7a2f0
代码差异
2 个文件
+63
-55
@@ -3,7 +3,10 @@ from __future__ import annotations
3
3
from ..typing import Messages, CreateResult
4
4
from ..providers.base_provider import AbstractProvider, ProviderModelMixin
5
5
6
import time, uuid, random, json
6
import time
7
import uuid
8
import random
9
import json
7
10
from requests import Session
8
11
9
12
from .openai.new import (
@@ -72,17 +75,34 @@ def init_session(user_agent):
72
75
73
76
class ChatGpt(AbstractProvider, ProviderModelMixin):
74
77
label = "ChatGpt"
78
url = "https://chatgpt.com"
75
79
working = True
76
80
supports_message_history = True
77
81
supports_system_message = True
78
82
supports_stream = True
83
default_model = 'auto'
79
84
models = [
85
default_model,
86
'gpt-3.5-turbo',
80
87
'gpt-4o',
81
88
'gpt-4o-mini',
82
89
'gpt-4',
83
90
'gpt-4-turbo',
84
91
'chatgpt-4o-latest',
85
92
]
93
94
model_aliases = {
95
"gpt-4o": "chatgpt-4o-latest",
96
}
97
98
@classmethod
99
def get_model(cls, model: str) -> str:
100
if model in cls.models:
101
return model
102
elif model in cls.model_aliases:
103
return cls.model_aliases[model]
104
else:
105
return cls.default_model
86
106
87
107
@classmethod
88
108
def create_completion(
@@ -92,30 +112,17 @@ class ChatGpt(AbstractProvider, ProviderModelMixin):
92
112
stream: bool,
93
113
**kwargs
94
114
) -> CreateResult:
115
model = cls.get_model(model)
116
if model not in cls.models:
117
raise ValueError(f"Model '{model}' is not available. Available models: {', '.join(cls.models)}")
118
95
119
96
if model in [
97
'gpt-4o',
98
'gpt-4o-mini',
99
'gpt-4',
100
'gpt-4-turbo',
101
'chatgpt-4o-latest'
102
]:
103
model = 'auto'
104
105
elif model in [
106
'gpt-3.5-turbo'
107
]:
108
model = 'text-davinci-002-render-sha'
109
110
else:
111
raise ValueError(f"Invalid model: {model}")
112
113
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
120
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
114
121
session: Session = init_session(user_agent)
115
122
116
config = get_config(user_agent)
117
pow_req = get_requirements_token(config)
118
headers = {
123
config = get_config(user_agent)
124
pow_req = get_requirements_token(config)
125
headers = {
119
126
'accept': '*/*',
120
127
'accept-language': 'en-US,en;q=0.8',
121
128
'content-type': 'application/json',
@@ -134,39 +141,35 @@ class ChatGpt(AbstractProvider, ProviderModelMixin):
134
141
}
135
142
136
143
response = session.post('https://chatgpt.com/backend-anon/sentinel/chat-requirements',
137
headers=headers, json={'p': pow_req})
144
headers=headers, json={'p': pow_req})
138
145
139
146
if response.status_code != 200:
140
print(f"Request failed with status: {response.status_code}")
141
print(f"Response content: {response.content}")
142
147
return
143
148
144
149
response_data = response.json()
145
150
if "detail" in response_data and "Unusual activity" in response_data["detail"]:
146
print(f"Blocked due to unusual activity: {response_data['detail']}")
147
151
return
148
152
149
turnstile = response_data.get('turnstile', {})
153
turnstile = response_data.get('turnstile', {})
150
154
turnstile_required = turnstile.get('required')
151
pow_conf = response_data.get('proofofwork', {})
155
pow_conf = response_data.get('proofofwork', {})
152
156
153
157
if turnstile_required:
154
turnstile_dx = turnstile.get('dx')
158
turnstile_dx = turnstile.get('dx')
155
159
turnstile_token = process_turnstile(turnstile_dx, pow_req)
156
160
157
headers = headers | {
158
'openai-sentinel-turnstile-token' : turnstile_token,
159
'openai-sentinel-chat-requirements-token': response_data.get('token'),
160
'openai-sentinel-proof-token' : get_answer_token(
161
pow_conf.get('seed'), pow_conf.get('difficulty'), config
162
)
163
}
164
161
headers = {**headers,
162
'openai-sentinel-turnstile-token': turnstile_token,
163
'openai-sentinel-chat-requirements-token': response_data.get('token'),
164
'openai-sentinel-proof-token': get_answer_token(
165
pow_conf.get('seed'), pow_conf.get('difficulty'), config
166
)}
167
165
168
json_data = {
166
169
'action': 'next',
167
170
'messages': format_conversation(messages),
168
171
'parent_message_id': str(uuid.uuid4()),
169
'model': 'auto',
172
'model': model,
170
173
'timezone_offset_min': -120,
171
174
'suggestions': [
172
175
'Can you help me create a personalized morning routine that would help increase my productivity throughout the day? Start by asking me about my current habits and what activities energize me in the morning.',
@@ -189,7 +192,7 @@ class ChatGpt(AbstractProvider, ProviderModelMixin):
189
192
'conversation_origin': None,
190
193
'client_contextual_info': {
191
194
'is_dark_mode': True,
192
'time_since_loaded': random.randint(22,33),
195
'time_since_loaded': random.randint(22, 33),
193
196
'page_height': random.randint(600, 900),
194
197
'page_width': random.randint(500, 800),
195
198
'pixel_ratio': 2,
@@ -201,25 +204,30 @@ class ChatGpt(AbstractProvider, ProviderModelMixin):
201
204
time.sleep(2)
202
205
203
206
response = session.post('https://chatgpt.com/backend-anon/conversation',
204
headers=headers, json=json_data, stream=True)
207
headers=headers, json=json_data, stream=True)
205
208
206
209
replace = ''
207
210
for line in response.iter_lines():
208
211
if line:
209
212
decoded_line = line.decode()
210
print(f"Received line: {decoded_line}")
213
print(decoded_line)
214
211
215
if decoded_line.startswith('data:'):
212
json_string = decoded_line[6:]
213
if json_string.strip():
216
json_string = decoded_line[6:].strip()
217
218
if json_string == '[DONE]':
219
break
220
221
if json_string:
214
222
try:
215
223
data = json.loads(json_string)
216
except json.JSONDecodeError as e:
217
print(f"Error decoding JSON: {e}, content: {json_string}")
224
except json.JSONDecodeError:
218
225
continue
219
226
220
if data.get('message').get('author').get('role') == 'assistant':
221
tokens = (data.get('message').get('content').get('parts')[0])
222
223
yield tokens.replace(replace, '')
224
225
replace = tokens
227
if data.get('message') and data['message'].get('author'):
228
role = data['message']['author'].get('role')
229
if role == 'assistant':
230
tokens = data['message']['content'].get('parts', [])
231
if tokens:
232
yield tokens[0].replace(replace, '')
233
replace = tokens[0]
@@ -137,25 +137,25 @@ gpt_35_turbo = Model(
137
137
gpt_4o = Model(
138
138
name = 'gpt-4o',
139
139
base_provider = 'OpenAI',
140
best_provider = IterListProvider([Blackbox, ChatGptEs, DarkAI, Editee, NexraChatGPT, Airforce, Liaobots, OpenaiChat])
140
best_provider = IterListProvider([Blackbox, ChatGptEs, DarkAI, Editee, NexraChatGPT, Airforce, ChatGpt, Liaobots, OpenaiChat])
141
141
)
142
142
143
143
gpt_4o_mini = Model(
144
144
name = 'gpt-4o-mini',
145
145
base_provider = 'OpenAI',
146
best_provider = IterListProvider([DDG, ChatGptEs, FreeNetfly, Pizzagpt, MagickPen, RubiksAI, Liaobots, Airforce, ChatgptFree, Koala, OpenaiChat, ChatGpt])
146
best_provider = IterListProvider([DDG, ChatGptEs, FreeNetfly, Pizzagpt, MagickPen, RubiksAI, Liaobots, ChatGpt, Airforce, ChatgptFree, Koala, OpenaiChat])
147
147
)
148
148
149
149
gpt_4_turbo = Model(
150
150
name = 'gpt-4-turbo',
151
151
base_provider = 'OpenAI',
152
best_provider = IterListProvider([Liaobots, Airforce, Bing])
152
best_provider = IterListProvider([Liaobots, Airforce, ChatGpt, Bing])
153
153
)
154
154
155
155
gpt_4 = Model(
156
156
name = 'gpt-4',
157
157
base_provider = 'OpenAI',
158
best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraBing, NexraChatGPT, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
158
best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraBing, NexraChatGPT, ChatGpt, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
159
159
)
160
160
161
161
# o1