From ff4d9ae584cd3e9eefee6642c2a5290b63351b0a Mon Sep 17 00:00:00 2001 From: Heiner Lohaus Date: Mon, 2 Oct 2023 17:01:15 +0200 Subject: Add Phind Provider Add release_curl in url_cffi requets Support create image response in Bing --- g4f/Provider/Phind.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 g4f/Provider/Phind.py (limited to 'g4f/Provider/Phind.py') diff --git a/g4f/Provider/Phind.py b/g4f/Provider/Phind.py new file mode 100644 index 00000000..0db4e3c2 --- /dev/null +++ b/g4f/Provider/Phind.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import random +from datetime import datetime + +from ..typing import AsyncGenerator +from ..requests import StreamSession +from .base_provider import AsyncGeneratorProvider, format_prompt + + +class Phind(AsyncGeneratorProvider): + url = "https://www.phind.com" + working = True + supports_gpt_4 = True + + @classmethod + async def create_async_generator( + cls, + model: str, + messages: list[dict[str, str]], + proxy: str = None, + **kwargs + ) -> AsyncGenerator: + chars = 'abcdefghijklmnopqrstuvwxyz0123456789' + user_id = ''.join(random.choice(chars) for _ in range(24)) + data = { + "question": format_prompt(messages), + "webResults": [], + "options": { + "date": datetime.now().strftime("%d.%m.%Y"), + "language": "en", + "detailed": True, + "anonUserId": user_id, + "answerModel": "GPT-4", + "creativeMode": False, + "customLinks": [] + }, + "context":"" + } + headers = { + "Authority": cls.url, + "Accept": "application/json, text/plain, */*", + "Origin": cls.url, + "Referer": f"{cls.url}/" + } + async with StreamSession(headers=headers, timeout=(5, 180), proxies={"https": proxy}, impersonate="chrome107") as session: + async with session.post(f"{cls.url}/api/infer/answer", json=data) as response: + response.raise_for_status() + new_lines = 0 + async for line in response.iter_lines(): + if not line: + continue + if line.startswith(b"data: "): + line = line[6:] + if line.startswith(b""): + continue + if line: + if new_lines: + yield "".join(["\n" for _ in range(int(new_lines / 2))]) + new_lines = 0 + yield line.decode() + else: + new_lines += 1 + + + @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})" -- cgit v1.2.3