Fix GigaChat exceptions, Raise missing browser error

This commit is contained in:
Heiner Lohaus 2024-03-16 20:02:15 +01:00
parent fb2061da48
commit f797ec828c
8 changed files with 30 additions and 34 deletions

View File

@ -1,3 +1,4 @@
recursive-include g4f/gui/server * recursive-include g4f/gui/server *
recursive-include g4f/gui/client * recursive-include g4f/gui/client *
recursive-include g4f/Provider/npm * recursive-include g4f/Provider/npm *
recursive-include g4f/Provider/gigachat_crt *

View File

@ -311,7 +311,7 @@ def create_message(
"allowedMessageTypes": Defaults.allowedMessageTypes, "allowedMessageTypes": Defaults.allowedMessageTypes,
"sliceIds": Defaults.sliceIds[tone], "sliceIds": Defaults.sliceIds[tone],
"verbosity": "verbose", "verbosity": "verbose",
"scenario": "CopilotMicrosoftCom", # "SERP", "scenario": "CopilotMicrosoftCom" if tone == "copilot" else "SERP",
"plugins": [{"id": "c310c353-b9f0-4d76-ab0d-1dd5e979cf68", "category": 1}] if web_search else [], "plugins": [{"id": "c310c353-b9f0-4d76-ab0d-1dd5e979cf68", "category": 1}] if web_search else [],
"traceId": get_random_hex(40), "traceId": get_random_hex(40),
"conversationHistoryOptionsSets": ["autosave","savemem","uprofupd","uprofgen"], "conversationHistoryOptionsSets": ["autosave","savemem","uprofupd","uprofgen"],

View File

@ -1,35 +1,28 @@
from __future__ import annotations from __future__ import annotations
import base64
import os import os
import ssl import ssl
import time import time
import uuid import uuid
import json import json
from aiohttp import ClientSession, BaseConnector, TCPConnector from aiohttp import ClientSession, TCPConnector, BaseConnector
from g4f.requests import raise_for_status from g4f.requests import raise_for_status
from ..typing import AsyncResult, Messages, ImageType from ..typing import AsyncResult, Messages
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from ..image import to_bytes, is_accepted_format
from ..errors import MissingAuthError from ..errors import MissingAuthError
from .helper import get_connector from .helper import get_connector
access_token = '' access_token = ""
token_expires_at = 0 token_expires_at = 0
ssl_ctx = ssl.create_default_context(
cafile=os.path.dirname(__file__) + '/gigachat_crt/russian_trusted_root_ca_pem.crt')
class GigaChat(AsyncGeneratorProvider, ProviderModelMixin): class GigaChat(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://developers.sber.ru/gigachat" url = "https://developers.sber.ru/gigachat"
working = True working = True
supports_message_history = True supports_message_history = True
supports_system_message = True supports_system_message = True
supports_stream = True supports_stream = True
needs_auth = True needs_auth = True
default_model = "GigaChat:latest" default_model = "GigaChat:latest"
models = ["GigaChat:latest", "GigaChat-Plus", "GigaChat-Pro"] models = ["GigaChat:latest", "GigaChat-Plus", "GigaChat-Pro"]
@ -42,18 +35,20 @@ class GigaChat(AsyncGeneratorProvider, ProviderModelMixin):
stream: bool = True, stream: bool = True,
proxy: str = None, proxy: str = None,
api_key: str = None, api_key: str = None,
coonector: BaseConnector = None,
scope: str = "GIGACHAT_API_PERS", scope: str = "GIGACHAT_API_PERS",
update_interval: float = 0, update_interval: float = 0,
**kwargs **kwargs
) -> AsyncResult: ) -> AsyncResult:
global access_token, token_expires_at global access_token, token_expires_at
model = cls.get_model(model) model = cls.get_model(model)
if not api_key: if not api_key:
raise MissingAuthError('Missing "api_key"') raise MissingAuthError('Missing "api_key"')
connector = TCPConnector(ssl_context=ssl_ctx) cafile = os.path.join(os.path.dirname(__file__), "gigachat_crt/russian_trusted_root_ca_pem.crt")
ssl_context = ssl.create_default_context(cafile=cafile) if os.path.exists(cafile) else None
if connector is None and ssl_context is not None:
connector = TCPConnector(ssl_context=ssl_context)
async with ClientSession(connector=get_connector(connector, proxy)) as session: async with ClientSession(connector=get_connector(connector, proxy)) as session:
if token_expires_at - int(time.time() * 1000) < 60000: if token_expires_at - int(time.time() * 1000) < 60000:
async with session.post(url="https://ngw.devices.sberbank.ru:9443/api/v2/oauth", async with session.post(url="https://ngw.devices.sberbank.ru:9443/api/v2/oauth",

View File

@ -7,6 +7,7 @@ from ..typing import AsyncResult, Messages
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
from .helper import get_connector from .helper import get_connector
from ..errors import RateLimitError, ModelNotFoundError from ..errors import RateLimitError, ModelNotFoundError
from ..requests.raise_for_status import raise_for_status
class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin): class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
url = "https://huggingface.co/chat" url = "https://huggingface.co/chat"
@ -44,12 +45,9 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
connector=get_connector(connector, proxy) connector=get_connector(connector, proxy)
) as session: ) as session:
async with session.post(f"{api_base.rstrip('/')}/models/{model}", json=payload) as response: async with session.post(f"{api_base.rstrip('/')}/models/{model}", json=payload) as response:
if response.status == 429: if response.status == 404:
raise RateLimitError("Rate limit reached. Set a api_key")
elif response.status == 404:
raise ModelNotFoundError(f"Model is not supported: {model}") raise ModelNotFoundError(f"Model is not supported: {model}")
elif response.status != 200: await raise_for_status(response)
raise RuntimeError(f"Response {response.status}: {await response.text()}")
if stream: if stream:
first = True first = True
async for line in response.content: async for line in response.content:
@ -68,7 +66,7 @@ def format_prompt(messages: Messages) -> str:
system_messages = [message["content"] for message in messages if message["role"] == "system"] system_messages = [message["content"] for message in messages if message["role"] == "system"]
question = " ".join([messages[-1]["content"], *system_messages]) question = " ".join([messages[-1]["content"], *system_messages])
history = "".join([ history = "".join([
f"<s>[INST]{messages[idx-1]['content']} [/INST] {message}</s>" f"<s>[INST]{messages[idx-1]['content']} [/INST] {message['content']}</s>"
for idx, message in enumerate(messages) for idx, message in enumerate(messages)
if message["role"] == "assistant" if message["role"] == "assistant"
]) ])

View File

@ -653,12 +653,10 @@ select {
width: 100%; width: 100%;
} }
.bottom_buttons button span { .bottom_buttons button a,
color: var(--colour-3); .bottom_buttons button span,
font-size: 14px; .bottom_buttons .info a,
} .bottom_buttons .info i {
.bottom_buttons button a {
color: var(--colour-3); color: var(--colour-3);
font-weight: 500; font-weight: 500;
} }

View File

@ -819,7 +819,8 @@ async function on_api() {
if (versions["version"] != versions["latest_version"]) { if (versions["version"] != versions["latest_version"]) {
let release_url = 'https://github.com/xtekky/gpt4free/releases/tag/' + versions["latest_version"]; let release_url = 'https://github.com/xtekky/gpt4free/releases/tag/' + versions["latest_version"];
let title = `New version: ${versions["latest_version"]}`; let title = `New version: ${versions["latest_version"]}`;
text += `<a href="${release_url}" target="_blank" title="${title}">${versions["version"]} 🆕</a>`; text += `<a href="${release_url}" target="_blank" title="${title}">${versions["version"]}</a> `;
text += `<i class="fa-solid fa-rotate"></i>`
} else { } else {
text += versions["version"]; text += versions["version"];
} }
@ -994,8 +995,7 @@ async function load_provider_models(providerIndex=null) {
providerSelect.addEventListener("change", () => load_provider_models()); providerSelect.addEventListener("change", () => load_provider_models());
function save_storage() { function save_storage() {
let filename = new Date().toLocaleString() let filename = `chat ${new Date().toLocaleString()}.json`.replaceAll(":", "-");
filename += ".json"
let data = {"options": {"g4f": ""}}; let data = {"options": {"g4f": ""}};
for (let i = 0; i < appStorage.length; i++){ for (let i = 0; i < appStorage.length; i++){
let key = appStorage.key(i); let key = appStorage.key(i);

View File

@ -95,7 +95,7 @@ class AbstractProvider(BaseProvider):
return annotation.__name__ if hasattr(annotation, "__name__") else str(annotation) return annotation.__name__ if hasattr(annotation, "__name__") else str(annotation)
args = "" args = ""
for name, param in cls.get_parameters(): for name, param in cls.get_parameters().items():
if name in ("self", "kwargs") or (name == "stream" and not cls.supports_stream): if name in ("self", "kwargs") or (name == "stream" and not cls.supports_stream):
continue continue
args += f"\n {name}" args += f"\n {name}"

View File

@ -2,7 +2,7 @@ from __future__ import annotations
try: try:
from platformdirs import user_config_dir from platformdirs import user_config_dir
from undetected_chromedriver import Chrome, ChromeOptions from undetected_chromedriver import Chrome, ChromeOptions, find_chrome_executable
from selenium.webdriver.remote.webdriver import WebDriver from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
@ -39,7 +39,7 @@ try:
options = ChromeOptions() options = ChromeOptions()
config = self._setup_backend(seleniumwire_options) config = self._setup_backend(seleniumwire_options)
options.add_argument(f"--proxy-server={config['proxy']['httpProxy']}") options.add_argument(f"--proxy-server={config['proxy']['httpProxy']}")
options.add_argument('--proxy-bypass-list=<-loopback>') options.add_argument("--proxy-bypass-list=<-loopback>")
options.add_argument("--ignore-certificate-errors") options.add_argument("--ignore-certificate-errors")
super().__init__(*args, options=options, **kwargs) super().__init__(*args, options=options, **kwargs)
has_seleniumwire = True has_seleniumwire = True
@ -66,6 +66,9 @@ def get_browser(
""" """
if not has_requirements: if not has_requirements:
raise MissingRequirementsError('Install "undetected_chromedriver" and "platformdirs" package') raise MissingRequirementsError('Install "undetected_chromedriver" and "platformdirs" package')
browser = find_chrome_executable()
if browser is None:
raise MissingRequirementsError('Install "Google Chrome" browser')
if user_data_dir is None: if user_data_dir is None:
user_data_dir = user_config_dir("g4f") user_data_dir = user_config_dir("g4f")
if user_data_dir and debug.logging: if user_data_dir and debug.logging:
@ -82,6 +85,7 @@ def get_browser(
options=options, options=options,
user_data_dir=user_data_dir, user_data_dir=user_data_dir,
driver_executable_path=driver, driver_executable_path=driver,
browser_executable_path=browser,
headless=headless, headless=headless,
patcher_force_close=True patcher_force_close=True
) )