mirror of https://github.com/xtekky/gpt4free
commit
d765551b97
@ -0,0 +1,67 @@
|
||||
has_module = False
|
||||
try:
|
||||
from hugchat.hugchat import ChatBot
|
||||
except ImportError:
|
||||
has_module = False
|
||||
|
||||
from .base_provider import BaseProvider, get_cookies
|
||||
from g4f.typing import CreateResult
|
||||
|
||||
class Hugchat(BaseProvider):
|
||||
url = "https://huggingface.co/chat/"
|
||||
needs_auth = True
|
||||
working = has_module
|
||||
llms = ['OpenAssistant/oasst-sft-6-llama-30b-xor', 'meta-llama/Llama-2-70b-chat-hf']
|
||||
|
||||
@classmethod
|
||||
def create_completion(
|
||||
cls,
|
||||
model: str,
|
||||
messages: list[dict[str, str]],
|
||||
stream: bool = False,
|
||||
proxy: str = None,
|
||||
cookies: str = get_cookies(".huggingface.co"),
|
||||
**kwargs
|
||||
) -> CreateResult:
|
||||
bot = ChatBot(
|
||||
cookies=cookies
|
||||
)
|
||||
|
||||
if proxy and "://" not in proxy:
|
||||
proxy = f"http://{proxy}"
|
||||
bot.session.proxies = {"http": proxy, "https": proxy}
|
||||
|
||||
if model:
|
||||
try:
|
||||
if not isinstance(model, int):
|
||||
model = cls.llms.index(model)
|
||||
bot.switch_llm(model)
|
||||
except:
|
||||
raise RuntimeError(f"Model are not supported: {model}")
|
||||
|
||||
if len(messages) > 1:
|
||||
formatted = "\n".join(
|
||||
["%s: %s" % (message["role"], message["content"]) for message in messages]
|
||||
)
|
||||
prompt = f"{formatted}\nAssistant:"
|
||||
else:
|
||||
prompt = messages.pop()["content"]
|
||||
|
||||
try:
|
||||
yield bot.chat(prompt, **kwargs)
|
||||
finally:
|
||||
bot.delete_conversation(bot.current_conversation)
|
||||
bot.current_conversation = ""
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
@property
|
||||
def params(cls):
|
||||
params = [
|
||||
("model", "str"),
|
||||
("messages", "list[dict[str, str]]"),
|
||||
("stream", "bool"),
|
||||
("proxy", "str"),
|
||||
]
|
||||
param = ", ".join([": ".join(p) for p in params])
|
||||
return f"g4f.provider.{cls.__name__} supports: ({param})"
|
@ -0,0 +1,74 @@
|
||||
has_module = True
|
||||
try:
|
||||
from revChatGPT.V1 import AsyncChatbot
|
||||
except ImportError:
|
||||
has_module = False
|
||||
from .base_provider import AsyncGeneratorProvider, get_cookies
|
||||
from ..typing import AsyncGenerator
|
||||
|
||||
class OpenaiChat(AsyncGeneratorProvider):
|
||||
url = "https://chat.openai.com"
|
||||
needs_auth = True
|
||||
working = has_module
|
||||
supports_gpt_35_turbo = True
|
||||
supports_gpt_4 = True
|
||||
supports_stream = True
|
||||
|
||||
@classmethod
|
||||
async def create_async_generator(
|
||||
cls,
|
||||
model: str,
|
||||
messages: list[dict[str, str]],
|
||||
proxy: str = None,
|
||||
access_token: str = None,
|
||||
cookies: dict = None,
|
||||
**kwargs
|
||||
) -> AsyncGenerator:
|
||||
|
||||
config = {"access_token": access_token, "model": model}
|
||||
if proxy:
|
||||
if "://" not in proxy:
|
||||
proxy = f"http://{proxy}"
|
||||
config["proxy"] = proxy
|
||||
|
||||
bot = AsyncChatbot(
|
||||
config=config
|
||||
)
|
||||
|
||||
if not access_token:
|
||||
cookies = cookies if cookies else get_cookies("chat.openai.com")
|
||||
response = await bot.session.get("https://chat.openai.com/api/auth/session", cookies=cookies)
|
||||
access_token = response.json()["accessToken"]
|
||||
bot.set_access_token(access_token)
|
||||
|
||||
if len(messages) > 1:
|
||||
formatted = "\n".join(
|
||||
["%s: %s" % ((message["role"]).capitalize(), message["content"]) for message in messages]
|
||||
)
|
||||
prompt = f"{formatted}\nAssistant:"
|
||||
else:
|
||||
prompt = messages.pop()["content"]
|
||||
|
||||
returned = None
|
||||
async for message in bot.ask(prompt):
|
||||
message = message["message"]
|
||||
if returned:
|
||||
if message.startswith(returned):
|
||||
new = message[len(returned):]
|
||||
if new:
|
||||
yield new
|
||||
else:
|
||||
yield message
|
||||
returned = message
|
||||
|
||||
@classmethod
|
||||
@property
|
||||
def params(cls):
|
||||
params = [
|
||||
("model", "str"),
|
||||
("messages", "list[dict[str, str]]"),
|
||||
("stream", "bool"),
|
||||
("proxy", "str"),
|
||||
]
|
||||
param = ", ".join([": ".join(p) for p in params])
|
||||
return f"g4f.provider.{cls.__name__} supports: ({param})"
|
@ -0,0 +1,95 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import asyncio
|
||||
from time import time
|
||||
|
||||
sys.path.append(str(Path(__file__).parent.parent))
|
||||
|
||||
import g4f
|
||||
|
||||
providers = [g4f.Provider.OpenaiChat, g4f.Provider.Bard, g4f.Provider.Bing]
|
||||
|
||||
# Async support
|
||||
async def log_time_async(method: callable, **kwargs):
|
||||
start = time()
|
||||
result = await method(**kwargs)
|
||||
secs = f"{round(time() - start, 2)} secs"
|
||||
if result:
|
||||
return " ".join([result, secs])
|
||||
return secs
|
||||
|
||||
def log_time_yield(method: callable, **kwargs):
|
||||
start = time()
|
||||
result = yield from method(**kwargs)
|
||||
yield f" {round(time() - start, 2)} secs"
|
||||
|
||||
def log_time(method: callable, **kwargs):
|
||||
start = time()
|
||||
result = method(**kwargs)
|
||||
secs = f"{round(time() - start, 2)} secs"
|
||||
if result:
|
||||
return " ".join([result, secs])
|
||||
return secs
|
||||
|
||||
async def run_async():
|
||||
responses = []
|
||||
for provider in providers:
|
||||
responses.append(log_time_async(
|
||||
provider.create_async,
|
||||
model=None,
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
log_time=True
|
||||
))
|
||||
responses = await asyncio.gather(*responses)
|
||||
for idx, provider in enumerate(providers):
|
||||
print(f"{provider.__name__}:", responses[idx])
|
||||
print("Async Total:", asyncio.run(log_time_async(run_async)))
|
||||
|
||||
# Streaming support:
|
||||
def run_stream():
|
||||
for provider in providers:
|
||||
print(f"{provider.__name__}: ", end="")
|
||||
for response in log_time_yield(
|
||||
provider.create_completion,
|
||||
model=None,
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
):
|
||||
print(response, end="")
|
||||
print()
|
||||
print("Stream Total:", log_time(run_stream))
|
||||
|
||||
# No streaming support:
|
||||
def create_completion():
|
||||
for provider in providers:
|
||||
print(f"{provider.__name__}:", end=" ")
|
||||
for response in log_time_yield(
|
||||
g4f.Provider.Bard.create_completion,
|
||||
model=None,
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
):
|
||||
print(response, end="")
|
||||
print()
|
||||
print("No Stream Total:", log_time(create_completion))
|
||||
|
||||
for response in g4f.Provider.Hugchat.create_completion(
|
||||
model=None,
|
||||
messages=[{"role": "user", "content": "Hello, tell about you."}],
|
||||
):
|
||||
print("Hugchat:", response)
|
||||
|
||||
"""
|
||||
OpenaiChat: Hello! How can I assist you today? 2.0 secs
|
||||
Bard: Hello! How can I help you today? 3.44 secs
|
||||
Bing: Hello, this is Bing. How can I help? 😊 4.14 secs
|
||||
Async Total: 4.25 secs
|
||||
|
||||
OpenaiChat: Hello! How can I assist you today? 1.85 secs
|
||||
Bard: Hello! How can I help you today? 3.38 secs
|
||||
Bing: Hello, this is Bing. How can I help? 😊 6.14 secs
|
||||
Stream Total: 11.37 secs
|
||||
|
||||
OpenaiChat: Hello! How can I help you today? 3.28 secs
|
||||
Bard: Hello there! How can I help you today? 3.58 secs
|
||||
Bing: Hello! How can I help you today? 3.28 secs
|
||||
No Stream Total: 10.14 secs
|
||||
"""
|
Loading…
Reference in New Issue