返回提交历史
Modified
g4f/Provider/BingCreateImages.py
+2
-2
Modified
g4f/Provider/HuggingChat.py
+21
-14
Added
g4f/Provider/HuggingFace.py
+75
-0
Modified
g4f/Provider/Llama2.py
+12
-4
Modified
g4f/Provider/PerplexityLabs.py
+25
-22
Modified
g4f/Provider/You.py
+34
-7
Modified
g4f/Provider/__init__.py
+1
-0
Modified
g4f/Provider/bing/create_images.py
+3
-1
Modified
g4f/client.py
+35
-19
Modified
g4f/image.py
+4
-0
Modified
g4f/models.py
+21
-6
Modified
g4f/providers/base_provider.py
+1
-1
XFEstudio/gpt4free
Fix HuggingChat and PerplexityLabs and add HuggingFace provider Add more models and image generation in You provider Use You as second default image provider
ec51e9c7
代码差异
12 个文件
+234
-76
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
3
3
import asyncio
4
4
import os
5
from typing import Generator
5
from typing import Iterator, Union
6
6
7
7
from ..cookies import get_cookies
8
8
from ..image import ImageResponse
@@ -16,7 +16,7 @@ class BingCreateImages:
16
16
self.cookies = cookies
17
17
self.proxy = proxy
18
18
19
def create(self, prompt: str) -> Generator[ImageResponse, None, None]:
19
def create(self, prompt: str) -> Iterator[Union[ImageResponse, str]]:
20
20
"""
21
21
Generator for creating imagecompletion based on a prompt.
22
22
@@ -1,12 +1,12 @@
1
1
from __future__ import annotations
2
2
3
import json, uuid
3
import json
4
4
5
5
from aiohttp import ClientSession, BaseConnector
6
6
7
7
from ..typing import AsyncResult, Messages
8
8
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
9
from .helper import format_prompt, get_cookies, get_connector
9
from .helper import format_prompt, get_connector
10
10
11
11
12
12
class HuggingChat(AsyncGeneratorProvider, ProviderModelMixin):
@@ -24,7 +24,6 @@ class HuggingChat(AsyncGeneratorProvider, ProviderModelMixin):
24
24
]
25
25
model_aliases = {
26
26
"openchat/openchat_3.5": "openchat/openchat-3.5-1210",
27
"mistralai/Mixtral-8x7B-Instruct-v0.1": "mistralai/Mistral-7B-Instruct-v0.2"
28
27
}
29
28
30
29
@classmethod
@@ -39,9 +38,11 @@ class HuggingChat(AsyncGeneratorProvider, ProviderModelMixin):
39
38
cookies: dict = None,
40
39
**kwargs
41
40
) -> AsyncResult:
42
if not cookies:
43
cookies = get_cookies(".huggingface.co", False)
44
41
options = {"model": cls.get_model(model)}
42
system_prompt = "\n".join([message["content"] for message in messages if message["role"] == "system"])
43
if system_prompt:
44
options["preprompt"] = system_prompt
45
messages = [message for message in messages if message["role"] != "system"]
45
46
headers = {
46
47
'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',
47
48
}
@@ -50,20 +51,27 @@ class HuggingChat(AsyncGeneratorProvider, ProviderModelMixin):
50
51
headers=headers,
51
52
connector=get_connector(connector, proxy)
52
53
) as session:
53
async with session.post(f"{cls.url}/conversation", json={"model": cls.get_model(model)}, proxy=proxy) as response:
54
async with session.post(f"{cls.url}/conversation", json=options, proxy=proxy) as response:
55
response.raise_for_status()
54
56
conversation_id = (await response.json())["conversationId"]
55
56
send = {
57
"id": str(uuid.uuid4()),
57
async with session.get(f"{cls.url}/conversation/{conversation_id}/__data.json") as response:
58
response.raise_for_status()
59
data: list = (await response.json())["nodes"][1]["data"]
60
keys: list[int] = data[data[0]["messages"]]
61
message_keys: dict = data[keys[0]]
62
message_id: str = data[message_keys["id"]]
63
options = {
64
"id": message_id,
58
65
"inputs": format_prompt(messages),
66
"is_continue": False,
59
67
"is_retry": False,
60
"response_id": str(uuid.uuid4()),
61
68
"web_search": web_search
62
69
}
63
async with session.post(f"{cls.url}/conversation/{conversation_id}", json=send, proxy=proxy) as response:
70
async with session.post(f"{cls.url}/conversation/{conversation_id}", json=options) as response:
64
71
first_token = True
65
72
async for line in response.content:
66
line = json.loads(line[:-1])
73
response.raise_for_status()
74
line = json.loads(line)
67
75
if "type" not in line:
68
76
raise RuntimeError(f"Response: {line}")
69
77
elif line["type"] == "stream":
@@ -74,6 +82,5 @@ class HuggingChat(AsyncGeneratorProvider, ProviderModelMixin):
74
82
yield token
75
83
elif line["type"] == "finalAnswer":
76
84
break
77
78
85
async with session.delete(f"{cls.url}/conversation/{conversation_id}", proxy=proxy) as response:
79
86
response.raise_for_status()
@@ -0,0 +1,75 @@
1
from __future__ import annotations
2
3
import json
4
from aiohttp import ClientSession, BaseConnector
5
6
from ..typing import AsyncResult, Messages
7
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8
from .helper import get_connector
9
from ..errors import RateLimitError, ModelNotFoundError
10
11
class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
12
url = "https://huggingface.co/chat"
13
working = True
14
supports_message_history = True
15
default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
16
17
@classmethod
18
async def create_async_generator(
19
cls,
20
model: str,
21
messages: Messages,
22
stream: bool = True,
23
proxy: str = None,
24
connector: BaseConnector = None,
25
api_base: str = "https://api-inference.huggingface.co",
26
api_key: str = None,
27
max_new_tokens: int = 1024,
28
temperature: float = 0.7,
29
**kwargs
30
) -> AsyncResult:
31
model = cls.get_model(model)
32
headers = {}
33
if api_key is not None:
34
headers["Authorization"] = f"Bearer {api_key}"
35
params = {
36
"return_full_text": False,
37
"max_new_tokens": max_new_tokens,
38
"temperature": temperature,
39
**kwargs
40
}
41
payload = {"inputs": format_prompt(messages), "parameters": params, "stream": stream}
42
async with ClientSession(
43
headers=headers,
44
connector=get_connector(connector, proxy)
45
) as session:
46
async with session.post(f"{api_base.rstrip('/')}/models/{model}", json=payload) as response:
47
if response.status == 429:
48
raise RateLimitError("Rate limit reached. Set a api_key")
49
elif response.status == 404:
50
raise ModelNotFoundError(f"Model is not supported: {model}")
51
elif response.status != 200:
52
raise RuntimeError(f"Response {response.status}: {await response.text()}")
53
if stream:
54
first = True
55
async for line in response.content:
56
if line.startswith(b"data:"):
57
data = json.loads(line[5:])
58
if not data["token"]["special"]:
59
chunk = data["token"]["text"]
60
if first:
61
first = False
62
chunk = chunk.lstrip()
63
yield chunk
64
else:
65
yield (await response.json())[0]["generated_text"].strip()
66
67
def format_prompt(messages: Messages) -> str:
68
system_messages = [message["content"] for message in messages if message["role"] == "system"]
69
question = " ".join([messages[-1]["content"], *system_messages])
70
history = "".join([
71
f"<s>[INST]{messages[idx-1]['content']} [/INST] {message}</s>"
72
for idx, message in enumerate(messages)
73
if message["role"] == "assistant"
74
])
75
return f"{history}<s>[INST] {question} [/INST]"
@@ -28,6 +28,10 @@ class Llama2(AsyncGeneratorProvider, ProviderModelMixin):
28
28
model: str,
29
29
messages: Messages,
30
30
proxy: str = None,
31
system_message: str = "You are a helpful assistant.",
32
temperature: float = 0.75,
33
top_p: float = 0.9,
34
max_tokens: int = 8000,
31
35
**kwargs
32
36
) -> AsyncResult:
33
37
headers = {
@@ -47,14 +51,18 @@ class Llama2(AsyncGeneratorProvider, ProviderModelMixin):
47
51
"TE": "trailers"
48
52
}
49
53
async with ClientSession(headers=headers) as session:
54
system_messages = [message["content"] for message in messages if message["role"] == "system"]
55
if system_messages:
56
system_message = "\n".join(system_messages)
57
messages = [message for message in messages if message["role"] != "system"]
50
58
prompt = format_prompt(messages)
51
59
data = {
52
60
"prompt": prompt,
53
61
"model": cls.get_model(model),
54
"systemPrompt": kwargs.get("system_message", "You are a helpful assistant."),
55
"temperature": kwargs.get("temperature", 0.75),
56
"topP": kwargs.get("top_p", 0.9),
57
"maxTokens": kwargs.get("max_tokens", 8000),
62
"systemPrompt": system_message,
63
"temperature": temperature,
64
"topP": top_p,
65
"maxTokens": max_tokens,
58
66
"image": None
59
67
}
60
68
started = False
@@ -14,17 +14,18 @@ WS_URL = "wss://labs-api.perplexity.ai/socket.io/"
14
14
class PerplexityLabs(AsyncGeneratorProvider, ProviderModelMixin):
15
15
url = "https://labs.perplexity.ai"
16
16
working = True
17
default_model = 'pplx-70b-online'
17
default_model = "sonar-medium-online"
18
18
models = [
19
'pplx-7b-online', 'pplx-70b-online', 'pplx-7b-chat', 'pplx-70b-chat', 'mistral-7b-instruct',
20
'codellama-34b-instruct', 'llama-2-70b-chat', 'llava-7b-chat', 'mixtral-8x7b-instruct',
21
'mistral-medium', 'related'
19
"sonar-small-online", "sonar-medium-online", "sonar-small-chat", "sonar-medium-chat", "mistral-7b-instruct",
20
"codellama-70b-instruct", "llava-v1.5-7b-wrapper", "llava-v1.6-34b", "mixtral-8x7b-instruct",
21
"gemma-2b-it", "gemma-7b-it"
22
"mistral-medium", "related"
22
23
]
23
24
model_aliases = {
24
25
"mistralai/Mistral-7B-Instruct-v0.1": "mistral-7b-instruct",
25
"meta-llama/Llama-2-70b-chat-hf": "llama-2-70b-chat",
26
26
"mistralai/Mixtral-8x7B-Instruct-v0.1": "mixtral-8x7b-instruct",
27
"codellama/CodeLlama-34b-Instruct-hf": "codellama-34b-instruct"
27
"codellama/CodeLlama-70b-Instruct-hf": "codellama-70b-instruct",
28
"llava-v1.5-7b": "llava-v1.5-7b-wrapper"
28
29
}
29
30
30
31
@classmethod
@@ -50,38 +51,40 @@ class PerplexityLabs(AsyncGeneratorProvider, ProviderModelMixin):
50
51
"TE": "trailers",
51
52
}
52
53
async with ClientSession(headers=headers, connector=get_connector(connector, proxy)) as session:
53
t = format(random.getrandbits(32), '08x')
54
t = format(random.getrandbits(32), "08x")
54
55
async with session.get(
55
56
f"{API_URL}?EIO=4&transport=polling&t={t}"
56
57
) as response:
57
58
text = await response.text()
58
59
59
sid = json.loads(text[1:])['sid']
60
sid = json.loads(text[1:])["sid"]
60
61
post_data = '40{"jwt":"anonymous-ask-user"}'
61
62
async with session.post(
62
f'{API_URL}?EIO=4&transport=polling&t={t}&sid={sid}',
63
f"{API_URL}?EIO=4&transport=polling&t={t}&sid={sid}",
63
64
data=post_data
64
65
) as response:
65
assert await response.text() == 'OK'
66
assert await response.text() == "OK"
66
67
67
async with session.ws_connect(f'{WS_URL}?EIO=4&transport=websocket&sid={sid}', autoping=False) as ws:
68
await ws.send_str('2probe')
69
assert(await ws.receive_str() == '3probe')
70
await ws.send_str('5')
68
async with session.ws_connect(f"{WS_URL}?EIO=4&transport=websocket&sid={sid}", autoping=False) as ws:
69
await ws.send_str("2probe")
70
assert(await ws.receive_str() == "3probe")
71
await ws.send_str("5")
71
72
assert(await ws.receive_str())
72
assert(await ws.receive_str() == '6')
73
assert(await ws.receive_str() == "6")
73
74
message_data = {
74
'version': '2.2',
75
'source': 'default',
76
'model': cls.get_model(model),
77
'messages': messages
75
"version": "2.5",
76
"source": "default",
77
"model": cls.get_model(model),
78
"messages": messages
78
79
}
79
await ws.send_str('42' + json.dumps(['perplexity_labs', message_data]))
80
await ws.send_str("42" + json.dumps(["perplexity_labs", message_data]))
80
81
last_message = 0
81
82
while True:
82
83
message = await ws.receive_str()
83
if message == '2':
84
await ws.send_str('3')
84
if message == "2":
85
if last_message == 0:
86
raise RuntimeError("Unknown error")
87
await ws.send_str("3")
85
88
continue
86
89
try:
87
90
data = json.loads(message[2:])[1]
@@ -1,21 +1,37 @@
1
1
from __future__ import annotations
2
2
3
import re
3
4
import json
4
5
import base64
5
6
import uuid
6
7
from aiohttp import ClientSession, FormData, BaseConnector
7
8
8
9
from ..typing import AsyncResult, Messages, ImageType, Cookies
9
from .base_provider import AsyncGeneratorProvider
10
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10
11
from ..providers.helper import get_connector, format_prompt
11
from ..image import to_bytes
12
from ..image import to_bytes, ImageResponse
12
13
from ..requests.defaults import DEFAULT_HEADERS
13
14
14
class You(AsyncGeneratorProvider):
15
class You(AsyncGeneratorProvider, ProviderModelMixin):
15
16
url = "https://you.com"
16
17
working = True
17
18
supports_gpt_35_turbo = True
18
19
supports_gpt_4 = True
20
default_model = "gpt-3.5-turbo"
21
models = [
22
"gpt-3.5-turbo",
23
"gpt-4",
24
"gpt-4-turbo",
25
"claude-instant",
26
"claude-2",
27
"claude-3-opus",
28
"claude-3-sonnet",
29
"gemini-pro",
30
"zephyr"
31
]
32
model_aliases = {
33
"claude-v2": "claude-2"
34
}
19
35
_cookies = None
20
36
_cookies_used = 0
21
37
@@ -35,10 +51,15 @@ class You(AsyncGeneratorProvider):
35
51
connector=get_connector(connector, proxy),
36
52
headers=DEFAULT_HEADERS
37
53
) as client:
38
if image:
54
if image is not None:
39
55
chat_mode = "agent"
40
elif model == "gpt-4":
41
chat_mode = model
56
elif not model or model == cls.default_model:
57
chat_mode = "default"
58
elif model.startswith("dall-e"):
59
chat_mode = "create"
60
else:
61
chat_mode = "custom"
62
model = cls.get_model(model)
42
63
cookies = await cls.get_cookies(client) if chat_mode != "default" else None
43
64
upload = json.dumps([await cls.upload_file(client, cookies, to_bytes(image), image_name)]) if image else ""
44
65
#questions = [message["content"] for message in messages if message["role"] == "user"]
@@ -63,6 +84,8 @@ class You(AsyncGeneratorProvider):
63
84
"userFiles": upload,
64
85
"selectedChatMode": chat_mode,
65
86
}
87
if chat_mode == "custom":
88
params["selectedAIModel"] = model.replace("-", "_")
66
89
async with (client.post if chat_mode == "default" else client.get)(
67
90
f"{cls.url}/api/streamingSearch",
68
91
data=data,
@@ -80,7 +103,11 @@ class You(AsyncGeneratorProvider):
80
103
if event == "youChatToken" and event in data:
81
104
yield data[event]
82
105
elif event == "youChatUpdate" and "t" in data:
83
yield data["t"]
106
match = re.search(r"!\[fig\]\((.+?)\)", data["t"])
107
if match:
108
yield ImageResponse(match.group(1), messages[-1]["content"])
109
else:
110
yield data["t"]
84
111
85
112
@classmethod
86
113
async def upload_file(cls, client: ClientSession, cookies: Cookies, file: bytes, filename: str = None) -> dict:
@@ -46,6 +46,7 @@ from .GptGod import GptGod
46
46
from .GptTalkRu import GptTalkRu
47
47
from .Hashnode import Hashnode
48
48
from .HuggingChat import HuggingChat
49
from .HuggingFace import HuggingFace
49
50
from .Koala import Koala
50
51
from .Liaobots import Liaobots
51
52
from .Llama2 import Llama2
@@ -20,7 +20,7 @@ except ImportError:
20
20
from ...providers.create_images import CreateImagesProvider
21
21
from ..helper import get_connector
22
22
from ...providers.types import ProviderType
23
from ...errors import MissingRequirementsError
23
from ...errors import MissingRequirementsError, RateLimitError
24
24
from ...webdriver import WebDriver, get_driver_cookies, get_browser
25
25
26
26
BING_URL = "https://www.bing.com"
@@ -125,6 +125,8 @@ async def create_images(session: ClientSession, prompt: str, proxy: str = None,
125
125
async with session.post(url, allow_redirects=False, data=payload, timeout=timeout) as response:
126
126
response.raise_for_status()
127
127
text = (await response.text()).lower()
128
if "0 coins available" in text:
129
raise RateLimitError("No coins left. Log in with a different account or wait a while")
128
130
for error in ERRORS:
129
131
if error in text:
130
132
raise RuntimeError(f"Create images failed: {error}")
@@ -10,10 +10,12 @@ from .stubs import ChatCompletion, ChatCompletionChunk, Image, ImagesResponse
10
10
from .typing import Union, Iterator, Messages, ImageType
11
11
from .providers.types import BaseProvider, ProviderType
12
12
from .image import ImageResponse as ImageProviderResponse
13
from .errors import NoImageResponseError, RateLimitError, MissingAuthError
14
from . import get_model_and_provider, get_last_provider
15
13
16
from .Provider.BingCreateImages import BingCreateImages
14
17
from .Provider.needs_auth import Gemini, OpenaiChat
15
from .errors import NoImageResponseError
16
from . import get_model_and_provider, get_last_provider
18
from .Provider.You import You
17
19
18
20
ImageProvider = Union[BaseProvider, object]
19
21
Proxies = Union[dict, str]
@@ -163,6 +165,7 @@ class Chat():
163
165
class ImageModels():
164
166
gemini = Gemini
165
167
openai = OpenaiChat
168
you = You
166
169
167
170
def __init__(self, client: Client) -> None:
168
171
self.client = client
@@ -171,31 +174,44 @@ class ImageModels():
171
174
def get(self, name: str, default: ImageProvider = None) -> ImageProvider:
172
175
return getattr(self, name) if hasattr(self, name) else default or self.default
173
176
177
def iter_image_response(response: Iterator) -> Union[ImagesResponse, None]:
178
for chunk in list(response):
179
if isinstance(chunk, ImageProviderResponse):
180
return ImagesResponse([Image(image) for image in chunk.get_list()])
181
182
def create_image(client: Client, provider: ProviderType, prompt: str, model: str = "", **kwargs) -> Iterator:
183
prompt = f"create a image with: {prompt}"
184
return provider.create_completion(
185
model,
186
[{"role": "user", "content": prompt}],
187
True,
188
proxy=client.get_proxy(),
189
**kwargs
190
)
191
174
192
class Images():
175
193
def __init__(self, client: Client, provider: ImageProvider = None):
176
194
self.client: Client = client
177
195
self.provider: ImageProvider = provider
178
196
self.models: ImageModels = ImageModels(client)
179
197
180
def generate(self, prompt, model: str = None, **kwargs):
198
def generate(self, prompt, model: str = None, **kwargs) -> ImagesResponse:
181
199
provider = self.models.get(model, self.provider)
182
if isinstance(provider, BaseProvider) or isinstance(provider, type) and issubclass(provider, BaseProvider):
183
prompt = f"create a image: {prompt}"
184
response = provider.create_completion(
185
"",
186
[{"role": "user", "content": prompt}],
187
True,
188
proxy=self.client.get_proxy(),
189
**kwargs
190
)
200
if isinstance(provider, type) and issubclass(provider, BaseProvider):
201
response = create_image(self.client, provider, prompt, **kwargs)
191
202
else:
192
response = provider.create(prompt)
193
194
for chunk in response:
195
if isinstance(chunk, ImageProviderResponse):
196
images = [chunk.images] if isinstance(chunk.images, str) else chunk.images
197
return ImagesResponse([Image(image) for image in images])
198
raise NoImageResponseError()
203
try:
204
response = list(provider.create(prompt))
205
except (RateLimitError, MissingAuthError) as e:
206
# Fallback for default provider
207
if self.provider is None:
208
response = create_image(self.client, self.models.you, prompt, model or "dall-e", **kwargs)
209
else:
210
raise e
211
image = iter_image_response(response)
212
if image is None:
213
raise NoImageResponseError()
214
return image
199
215
200
216
def create_variation(self, image: ImageType, model: str = None, **kwargs):
201
217
provider = self.models.get(model, self.provider)
@@ -172,6 +172,7 @@ def process_image(image: Image, new_width: int, new_height: int) -> Image:
172
172
white = new_image('RGB', image.size, (255, 255, 255))
173
173
white.paste(image, mask=image.split()[-1])
174
174
return white
175
# Convert to RGB for jpg format
175
176
elif image.mode != "RGB":
176
177
image = image.convert("RGB")
177
178
return image
@@ -255,6 +256,9 @@ class ImageResponse:
255
256
def get(self, key: str):
256
257
return self.options.get(key)
257
258
259
def get_list(self) -> list[str]:
260
return [self.images] if isinstance(self.images, str) else self.images
261
258
262
class ImageRequest:
259
263
def __init__(
260
264
self,
@@ -10,6 +10,7 @@ from .Provider import (
10
10
GeminiProChat,
11
11
ChatgptNext,
12
12
HuggingChat,
13
HuggingFace,
13
14
ChatgptDemo,
14
15
FreeChatgpt,
15
16
GptForLove,
@@ -112,32 +113,32 @@ llama2_13b = Model(
112
113
llama2_70b = Model(
113
114
name = "meta-llama/Llama-2-70b-chat-hf",
114
115
base_provider = "meta",
115
best_provider = RetryProvider([Llama2, DeepInfra, HuggingChat, PerplexityLabs])
116
best_provider = RetryProvider([Llama2, DeepInfra, HuggingChat])
116
117
)
117
118
118
119
codellama_34b_instruct = Model(
119
120
name = "codellama/CodeLlama-34b-Instruct-hf",
120
121
base_provider = "meta",
121
best_provider = RetryProvider([HuggingChat, PerplexityLabs, DeepInfra])
122
best_provider = RetryProvider([HuggingChat, DeepInfra])
122
123
)
123
124
124
125
codellama_70b_instruct = Model(
125
126
name = "codellama/CodeLlama-70b-Instruct-hf",
126
127
base_provider = "meta",
127
best_provider = DeepInfra
128
best_provider = RetryProvider([DeepInfra, PerplexityLabs])
128
129
)
129
130
130
131
# Mistral
131
132
mixtral_8x7b = Model(
132
133
name = "mistralai/Mixtral-8x7B-Instruct-v0.1",
133
134
base_provider = "huggingface",
134
best_provider = RetryProvider([DeepInfra, HuggingChat, PerplexityLabs])
135
best_provider = RetryProvider([DeepInfra, HuggingChat, HuggingFace, PerplexityLabs])
135
136
)
136
137
137
138
mistral_7b = Model(
138
139
name = "mistralai/Mistral-7B-Instruct-v0.1",
139
140
base_provider = "huggingface",
140
best_provider = RetryProvider([DeepInfra, HuggingChat, PerplexityLabs])
141
best_provider = RetryProvider([DeepInfra, HuggingChat, HuggingFace, PerplexityLabs])
141
142
)
142
143
143
144
# Misc models
@@ -184,6 +185,18 @@ claude_v2 = Model(
184
185
best_provider = RetryProvider([FreeChatgpt, Vercel])
185
186
)
186
187
188
claude_3_opus = Model(
189
name = 'claude-3-opus',
190
base_provider = 'anthropic',
191
best_provider = You
192
)
193
194
claude_3_sonnet = Model(
195
name = 'claude-3-sonnet',
196
base_provider = 'anthropic',
197
best_provider = You
198
)
199
187
200
gpt_35_turbo_16k = Model(
188
201
name = 'gpt-3.5-turbo-16k',
189
202
base_provider = 'openai',
@@ -223,7 +236,7 @@ gpt_4_32k_0613 = Model(
223
236
gemini_pro = Model(
224
237
name = 'gemini-pro',
225
238
base_provider = 'google',
226
best_provider = RetryProvider([FreeChatgpt, GeminiProChat])
239
best_provider = RetryProvider([FreeChatgpt, GeminiProChat, You])
227
240
)
228
241
229
242
pi = Model(
@@ -272,6 +285,8 @@ class ModelUtils:
272
285
'gemini': gemini,
273
286
'gemini-pro': gemini_pro,
274
287
'claude-v2': claude_v2,
288
'claude-3-opus': claude_3_opus,
289
'claude-3-sonnet': claude_3_sonnet,
275
290
'pi': pi
276
291
}
277
292
@@ -274,7 +274,7 @@ class ProviderModelMixin:
274
274
model = cls.default_model
275
275
elif model in cls.model_aliases:
276
276
model = cls.model_aliases[model]
277
elif model not in cls.get_models():
277
elif model not in cls.get_models() and cls.models:
278
278
raise ModelNotSupportedError(f"Model is not supported: {model} in: {cls.__name__}")
279
279
debug.last_model = model
280
280
return model