Skip to content

Commit

Permalink
~ |  Merge pull request #872
Browse files Browse the repository at this point in the history
~ | Fix bing provider, Update readme
  • Loading branch information
xtekky authored Sep 2, 2023
2 parents e818fcd + 9bfcc0c commit 9de43a0
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 50 deletions.
106 changes: 92 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,25 +118,99 @@ for message in response:
print(message)
```

providers:
##### Providers:
```py
from g4f.Provider import (
Acytoo,
Aichat,
Ails,
AiService,
AItianhu,
Bard,
Bing,
ChatgptAi,
ChatgptLogin,
DeepAi,
GetGpt
EasyChat,
Equing,
GetGpt,
H2o,
HuggingChat,
Opchatgpts,
OpenAssistant,
OpenaiChat,
Raycast,
Theb,
Vercel,
Wewordle,
Wuguokai,
You,
Yqcloud
)
# Usage:
response = g4f.ChatCompletion.create(..., provider=ProviderName)
```

##### Needs cookies:

# usage:
response = g4f.ChatCompletion.create(..., provider=ProviderName)
Many providers need cookies to work.
In Bing you need a session, where you have passed the captcha.
And in others providers you have to log-in into your account.
If you run the g4l package locally,
cookies from your browsers are readed with `get_cookies`.
Else you have pass them in the parameter `cookies`:
```py
import g4f
from g4f.Provider import (
Bard,
Bing,
H2o,
HuggingChat,
OpenAssistant,
OpenaiChat,
You,
)
# Usage:
response = g4f.ChatCompletion.create(
model=g4f.models.default,
messages=[{"role": "user", "content": "Hello"}],
provider=Bard,
#cookies=g4f.get_cookies(".google.com"),
cookies={"cookie_name": "value", "cookie_name2": "value2"},
auth=True
)
```

##### Async support:

Run providers `async` to improve speed / performance.
The full execution time corresponds to the execution time of the slowest provider.

```py
import g4f, asyncio

async def run_async():
_providers = [
g4f.Provider.Bard,
g4f.Provider.Bing,
g4f.Provider.H2o,
g4f.Provider.HuggingChat,
g4f.Provider.Liaobots,
g4f.Provider.OpenAssistant,
g4f.Provider.OpenaiChat,
g4f.Provider.You,
g4f.Provider.Yqcloud,
]
responses = [
provider.create_async(
model=None,
messages=[{"role": "user", "content": "Hello"}],
)
for provider in _providers
]
responses = await asyncio.gather(*responses)
for idx, provider in enumerate(_providers):
print(f"{provider.__name__}:", responses[idx])

asyncio.run(run_async())
```

### interference openai-proxy api (use with openai python package)
Expand Down Expand Up @@ -186,30 +260,34 @@ if __name__ == "__main__":
| Website| Provider| gpt-3.5 | gpt-4 | Streaming | Status | Auth |
| ------ | ------- | ------- | ----- | --------- | ------ | ---- |
| [chat.acytoo.com](https://chat.acytoo.com/) | g4f.provider.Acytoo | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [chat-gpt.org](https://chat-gpt.org/chat) | g4f.provider.Aichat | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [ai.ls](https://ai.ls) | g4f.provider.Ails | ✔️ || ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [chat-gpt.org](https://chat-gpt.org/chat) | g4f.provider.Aichat | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [ai.ls](https://ai.ls) | g4f.provider.Ails | ✔️ || ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [bard.google.com](https://bard.google.com) | g4f.provider.Bard |||| ![Active](https://img.shields.io/badge/Active-brightgreen) | ✔️ |
| [chatgpt.ai](https://chatgpt.ai/gpt-4/) | g4f.provider.ChatgptAi || ✔️ || ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [opchatgpts.net](https://opchatgpts.net) | g4f.provider.ChatgptLogin | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [bing.com](https://bing.com/chat) | g4f.provider.Bing || ✔️ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ✔️ |
| [chatgpt.ai](https://chatgpt.ai/gpt-4/) | g4f.provider.ChatgptAi || ✔️ || ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [opchatgpts.net](https://opchatgpts.net) | g4f.provider.ChatgptLogin | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [deepai.org](https://deepai.org) | g4f.provider.DeepAi | ✔️ || ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [free.easychat.work](https://free.easychat.work) | g4f.provider.EasyChat | ✔️ || ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [next.eqing.tech](https://next.eqing.tech/) | g4f.provider.Equing | ✔️ || ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [chat.getgpt.world](https://chat.getgpt.world/) | g4f.provider.GetGpt | ✔️ || ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [gpt-gm.h2o.ai](https://gpt-gm.h2o.ai) | g4f.provider.H2o ||| ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [opchatgpts.net](https://opchatgpts.net) | g4f.provider.Opchatgpts | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [huggingface.co](https://huggingface.co/chat/) | g4f.provider.HuggingChat |||| ![Active](https://img.shields.io/badge/Active-brightgreen) | ✔️ |
| [liaobots.com](https://liaobots.com) | g4f.provider.Liaobots | ✔️ | ✔️ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [opchatgpts.net](https://opchatgpts.net) | g4f.provider.Opchatgpts | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [open-assistant.io](https://open-assistant.io/chat) | g4f.provider.OpenAssistant |||| ![Active](https://img.shields.io/badge/Active-brightgreen) | ✔️ |
| [chat.openai.com](https://chat.openai.com) | g4f.provider.OpenaiChat | ✔️ | ✔️ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ✔️ |
| [raycast.com](https://raycast.com) | g4f.provider.Raycast | ✔️ | ✔️ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ✔️ |
| [theb.ai](https://theb.ai) | g4f.provider.Theb | ✔️ || ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ✔️ |
| [play.vercel.ai](https://play.vercel.ai) | g4f.provider.Vercel | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [wewordle.org](https://wewordle.org/) | g4f.provider.Wewordle | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [you.com](https://you.com) | g4f.provider.You | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [chat.wuguokai.xyz](https://chat.wuguokai.xyz) | g4f.provider.Wuguokai | ✔️ ||| ![Unknown](https://img.shields.io/badge/Unknown-grey) ||
| [you.com](https://you.com) | g4f.provider.You | ✔️ || ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [chat9.yqcloud.top](https://chat9.yqcloud.top/) | g4f.provider.Yqcloud | ✔️ ||| ![Active](https://img.shields.io/badge/Active-brightgreen) ||
| [www.aitianhu.com](https://www.aitianhu.com/) | g4f.provider.AItianhu | ✔️ ||| ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [aiservice.vercel.app](https://aiservice.vercel.app/) | g4f.provider.AiService | ✔️ ||| ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [bing.com](https://bing.com/chat) | g4f.provider.Bing || ✔️ || ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [chat.dfehub.com](https://chat.dfehub.com/) | g4f.provider.DfeHub | ✔️ || ✔️ | ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [chat9.fastgpt.me](https://chat9.fastgpt.me/) | g4f.provider.FastGpt | ✔️ || ✔️ | ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [forefront.com](https://forefront.com) | g4f.provider.Forefront | ✔️ || ✔️ | ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [liaobots.com](https://liaobots.com) | g4f.provider.Liaobots | ✔️ | ✔️ | ✔️ | ![Inactive](https://img.shields.io/badge/Inactive-red) | ✔️ |
| [supertest.lockchat.app](http://supertest.lockchat.app) | g4f.provider.Lockchat | ✔️ | ✔️ | ✔️ | ![Inactive](https://img.shields.io/badge/Inactive-red) ||
| [p5.v50.ltd](https://p5.v50.ltd) | g4f.provider.V50 | ✔️ ||| ![Inactive](https://img.shields.io/badge/Inactive-red) ||

Expand Down
21 changes: 2 additions & 19 deletions g4f/Provider/Bing.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,32 +26,15 @@ def create_async_generator(
prompt = messages[-1]["content"]
context = create_context(messages[:-1])

if cookies:
if cookies and "SRCHD" in cookies:
#TODO: Will implement proper cookie retrieval later and use a try-except mechanism in 'stream_generate' instead of defaulting the cookie value like this
cookies_dict = {
'MUID' : '',
'BCP' : '',
'MUIDB' : '',
'USRLOC' : '',
'SRCHD' : 'AF=hpcodx',
'MMCASM' : '',
'_UR' : '',
'ANON' : '',
'NAP' : '',
'ABDEF' : '',
'SRCHD' : cookies["SRCHD"],
'PPLState' : '1',
'KievRPSSecAuth': '',
'_U' : '',
'SUID' : '',
'_EDGE_S' : '',
'WLS' : '',
'_HPVN' : '',
'_SS' : '',
'_clck' : '',
'SRCHUSR' : '',
'_RwBf' : '',
'SRCHHPGUSR' : '',
'ipv6' : '',
}

return stream_generate(prompt, context, cookies_dict)
Expand Down
1 change: 1 addition & 0 deletions g4f/Provider/Liaobots.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

class Liaobots(AsyncGeneratorProvider):
url = "https://liaobots.com"
working = True
supports_stream = True
supports_gpt_35_turbo = True
supports_gpt_4 = True
Expand Down
6 changes: 2 additions & 4 deletions g4f/Provider/Wuguokai.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import random, requests, json
import random, requests
from ..typing import Any, CreateResult
from .base_provider import BaseProvider


class Wuguokai(BaseProvider):
url = 'https://chat.wuguokai.xyz'
supports_gpt_35_turbo = True
supports_stream = False
needs_auth = False
working = True

@staticmethod
Expand Down Expand Up @@ -43,7 +41,7 @@ def create_completion(
"userId": f"#/chat/{random.randint(1,99999999)}",
"usingContext": True
}
response = requests.post("https://ai-api20.wuguokai.xyz/api/chat-process", headers=headers, data=json.dumps(data),proxies=kwargs['proxy'] if 'proxy' in kwargs else {})
response = requests.post("https://ai-api20.wuguokai.xyz/api/chat-process", headers=headers, timeout=3, json=data, proxies=kwargs['proxy'] if 'proxy' in kwargs else {})
_split = response.text.split("> 若回答失败请重试或多刷新几次界面后重试")
if response.status_code == 200:
if len(_split) > 1:
Expand Down
2 changes: 1 addition & 1 deletion g4f/Provider/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from .V50 import V50
from .Wuguokai import Wuguokai

from .base_provider import BaseProvider
from .base_provider import BaseProvider, AsyncProvider, AsyncGeneratorProvider

__all__ = [
'BaseProvider',
Expand Down
6 changes: 3 additions & 3 deletions testing/test_needs_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,14 @@
No Stream Total: 10.14 secs
"""

print("Yqcloud:", end="")
print("Bing: ", end="")
for response in log_time_yield(
g4f.ChatCompletion.create,
model=g4f.models.gpt_35_turbo,
messages=[{"role": "user", "content": _instruct}],
provider=g4f.Provider.Yqcloud,
provider=g4f.Provider.Bing,
#cookies=g4f.get_cookies(".huggingface.co"),
stream=True,
#stream=True,
auth=True
):
print(response, end="")
Expand Down
48 changes: 39 additions & 9 deletions tool/readme_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,35 @@
sys.path.append(str(Path(__file__).parent.parent))

from g4f import models, Provider
from g4f.Provider.base_provider import BaseProvider
from g4f.Provider.base_provider import BaseProvider, AsyncProvider
from testing.test_providers import test

def main():
print_providers()
print("\n", "-" * 50, "\n")
print_models()

def print_imports():
print("##### Providers:")
print("```py")
print("from g4f.Provider import (")
for _provider in get_providers():
if _provider.working:
print(f" {_provider.__name__},")
print(")")
print("# Usage:")
print("response = g4f.ChatCompletion.create(..., provider=ProviderName)")
print("```")
print()
print()

def print_async():
print("##### Async support:")
print("```py")
print("from g4f.Provider import (")
for _provider in get_providers():
if issubclass(_provider, AsyncProvider):
print(f" {_provider.__name__},")
print(")")
print("```")
print()
print()

def print_providers():
lines = [
Expand Down Expand Up @@ -48,18 +69,23 @@ def print_providers():
print("\n".join(lines))


def get_providers() -> list[type[BaseProvider]]:
def get_provider_names() -> list[str]:
provider_names = dir(Provider)
ignore_names = [
"base_provider",
"BaseProvider",
"AsyncProvider",
"AsyncGeneratorProvider"
]
provider_names = [
return [
provider_name
for provider_name in provider_names
if not provider_name.startswith("__") and provider_name not in ignore_names
]
return [getattr(Provider, provider_name) for provider_name in provider_names]


def get_providers() -> list[type[BaseProvider]]:
return [getattr(Provider, provider_name) for provider_name in get_provider_names()]


def print_models():
Expand Down Expand Up @@ -107,4 +133,8 @@ def get_models():


if __name__ == "__main__":
main()
print_imports()
print_async()
print_providers()
print("\n", "-" * 50, "\n")
print_models()

0 comments on commit 9de43a0

Please sign in to comment.