mirror of
https://github.com/xtekky/gpt4free.git
synced 2025-12-15 14:51:19 -08:00
Add duckduckgo-search to slim requirements,
Add pass provider as model in the client, Fix missing @property in version utils
This commit is contained in:
parent
6b48af1757
commit
cab71ca8b6
9 changed files with 64 additions and 11 deletions
|
|
@ -292,7 +292,7 @@ client = AsyncClient(provider=g4f.Provider.OpenaiChat)
|
|||
|
||||
response = await client.chat.completions.create(
|
||||
model="gpt-4",
|
||||
provider=g4f.Provider.Bing,
|
||||
provider=g4f.Provider.CopilotAccount,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import g4f
|
|||
|
||||
g4f.debug.logging = True # Enable debug logging
|
||||
g4f.debug.version_check = False # Disable automatic version checking
|
||||
print(g4f.Provider.Bing.params) # Print supported args for Bing
|
||||
print(g4f.Provider.Gemini.params) # Print supported args for Bing
|
||||
|
||||
# Using automatic a provider for the given model
|
||||
## Streamed completion
|
||||
|
|
@ -78,7 +78,7 @@ for message in response:
|
|||
|
||||
Image upload and generation are supported by three main providers:
|
||||
|
||||
- **Bing & Other GPT-4 Providers:** Utilizes Microsoft's Image Creator.
|
||||
- **Microsoft Copilot & Other GPT-4 Providers:** Utilizes Microsoft's Image Creator.
|
||||
- **Google Gemini:** Available for free accounts with IP addresses outside Europe.
|
||||
- **OpenaiChat with GPT-4:** Accessible for users with a Plus subscription.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@ from __future__ import annotations
|
|||
|
||||
import unittest
|
||||
|
||||
from g4f.client import Client, AsyncClient, ChatCompletion, ChatCompletionChunk
|
||||
from g4f.errors import ModelNotFoundError
|
||||
from g4f.client import Client, AsyncClient, ChatCompletion, ChatCompletionChunk, get_model_and_provider
|
||||
from g4f.Provider.Copilot import Copilot
|
||||
from g4f.models import gpt_4o
|
||||
from .mocks import AsyncGeneratorProviderMock, ModelProviderMock, YieldProviderMock
|
||||
|
||||
DEFAULT_MESSAGES = [{'role': 'user', 'content': 'Hello'}]
|
||||
|
|
@ -104,5 +107,35 @@ class TestPassModel(unittest.TestCase):
|
|||
self.assertIsInstance(response, ChatCompletion)
|
||||
self.assertEqual("How are you?", response.choices[0].message.content)
|
||||
|
||||
def test_model_not_found(self):
|
||||
def run_exception():
|
||||
client = Client()
|
||||
client.chat.completions.create(DEFAULT_MESSAGES, "Hello")
|
||||
self.assertRaises(ModelNotFoundError, run_exception)
|
||||
|
||||
def test_best_provider(self):
|
||||
not_default_model = "gpt-4o"
|
||||
model, provider = get_model_and_provider(not_default_model, None, False)
|
||||
self.assertTrue(hasattr(provider, "create_completion"))
|
||||
self.assertEqual(model, not_default_model)
|
||||
|
||||
def test_default_model(self):
|
||||
default_model = ""
|
||||
model, provider = get_model_and_provider(default_model, None, False)
|
||||
self.assertTrue(hasattr(provider, "create_completion"))
|
||||
self.assertEqual(model, default_model)
|
||||
|
||||
def test_provider_as_model(self):
|
||||
provider_as_model = Copilot.__name__
|
||||
model, provider = get_model_and_provider(provider_as_model, None, False)
|
||||
self.assertTrue(hasattr(provider, "create_completion"))
|
||||
self.assertIsInstance(model, str)
|
||||
self.assertEqual(model, Copilot.default_model)
|
||||
|
||||
def test_get_model(self):
|
||||
model, provider = get_model_and_provider(gpt_4o.name, None, False)
|
||||
self.assertTrue(hasattr(provider, "create_completion"))
|
||||
self.assertEqual(model, gpt_4o.name)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
import unittest
|
||||
import asyncio
|
||||
|
||||
import g4f
|
||||
from g4f import ChatCompletion, get_last_provider
|
||||
from g4f.errors import VersionNotFoundError
|
||||
from g4f.Provider import RetryProvider
|
||||
from .mocks import ProviderMock
|
||||
|
||||
|
|
@ -28,3 +30,10 @@ class TestGetLastProvider(unittest.TestCase):
|
|||
self.assertIsInstance(last_provider_dict, dict)
|
||||
self.assertIn('name', last_provider_dict)
|
||||
self.assertEqual(ProviderMock.__name__, last_provider_dict['name'])
|
||||
|
||||
def test_get_latest_version(self):
|
||||
try:
|
||||
self.assertIsInstance(g4f.version.utils.current_version, str)
|
||||
except VersionNotFoundError:
|
||||
pass
|
||||
self.assertIsInstance(g4f.version.utils.latest_version, str)
|
||||
|
|
@ -61,8 +61,14 @@ def get_model_and_provider(model : Union[Model, str],
|
|||
if not provider:
|
||||
if not model:
|
||||
model = default
|
||||
provider = model.best_provider
|
||||
elif isinstance(model, str):
|
||||
if model in ProviderUtils.convert:
|
||||
provider = ProviderUtils.convert[model]
|
||||
model = provider.default_model if hasattr(provider, "default_model") else ""
|
||||
else:
|
||||
raise ModelNotFoundError(f'Model not found: {model}')
|
||||
else:
|
||||
provider = model.best_provider
|
||||
|
||||
if not provider:
|
||||
|
|
|
|||
|
|
@ -1327,6 +1327,8 @@ async function on_api() {
|
|||
}
|
||||
|
||||
async function load_version() {
|
||||
let new_version = document.querySelector(".new_version");
|
||||
if (new_version) return;
|
||||
const versions = await api("version");
|
||||
document.title = 'g4f - ' + versions["version"];
|
||||
let text = "version ~ "
|
||||
|
|
@ -1334,7 +1336,7 @@ async function load_version() {
|
|||
let release_url = 'https://github.com/xtekky/gpt4free/releases/latest';
|
||||
let title = `New version: ${versions["latest_version"]}`;
|
||||
text += `<a href="${release_url}" target="_blank" title="${title}">${versions["version"]}</a> 🆕`;
|
||||
const new_version = document.createElement("div");
|
||||
new_version = document.createElement("div");
|
||||
new_version.classList.add("new_version");
|
||||
const link = `<a href="${release_url}" target="_blank" title="${title}">v${versions["latest_version"]}</a>`;
|
||||
new_version.innerHTML = `g4f ${link} 🆕`;
|
||||
|
|
@ -1344,6 +1346,7 @@ async function load_version() {
|
|||
text += versions["version"];
|
||||
}
|
||||
document.getElementById("version_text").innerHTML = text
|
||||
setTimeout(load_version, 1000 * 60 * 60); // 1 hour
|
||||
}
|
||||
setTimeout(load_version, 100);
|
||||
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@ def get_session_from_browser(url: str, webdriver: WebDriver = None, proxy: str =
|
|||
timeout=timeout,
|
||||
impersonate="chrome"
|
||||
)
|
||||
|
||||
def get_cookie_params_from_dict(cookies: Cookies, url: str = None, domain: str = None) -> list[CookieParam]:
|
||||
[CookieParam.from_json({
|
||||
"name": key,
|
||||
|
|
@ -177,7 +178,7 @@ async def get_nodriver(proxy: str = None, **kwargs)-> Browser:
|
|||
if not has_nodriver:
|
||||
raise MissingRequirementsError('Install "nodriver" package | pip install -U nodriver')
|
||||
user_data_dir = user_config_dir("g4f-nodriver") if has_platformdirs else None
|
||||
debug.log(f"Copilot: Open nodriver with user_dir: {user_data_dir}")
|
||||
debug.log(f"Open nodriver with user_dir: {user_data_dir}")
|
||||
return await nodriver.start(
|
||||
user_data_dir=user_data_dir,
|
||||
browser_args=None if proxy is None else [f"--proxy-server={proxy}"],
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ class VersionUtils:
|
|||
|
||||
raise VersionNotFoundError("Version not found")
|
||||
|
||||
@cached_property
|
||||
@property
|
||||
def latest_version(self) -> str:
|
||||
"""
|
||||
Retrieves the latest version of the 'g4f' package.
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ pycryptodome
|
|||
curl_cffi>=0.6.2
|
||||
aiohttp
|
||||
certifi
|
||||
duckduckgo-search>=6.3.7
|
||||
nest_asyncio
|
||||
werkzeug
|
||||
pillow
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue