XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

Fix GigaChat exceptions, Raise missing browser error

f797ec82
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

8 个文件 +30 -34
Modified MANIFEST.in +2 -1
@@ -1,3 +1,4 @@
1 1 recursive-include g4f/gui/server *
2 2 recursive-include g4f/gui/client *
3 recursive-include g4f/Provider/npm *
3 recursive-include g4f/Provider/npm *
4 recursive-include g4f/Provider/gigachat_crt *
Modified g4f/Provider/Bing.py +1 -1
@@ -311,7 +311,7 @@ def create_message(
311 311 "allowedMessageTypes": Defaults.allowedMessageTypes,
312 312 "sliceIds": Defaults.sliceIds[tone],
313 313 "verbosity": "verbose",
314 "scenario": "CopilotMicrosoftCom", # "SERP",
314 "scenario": "CopilotMicrosoftCom" if tone == "copilot" else "SERP",
315 315 "plugins": [{"id": "c310c353-b9f0-4d76-ab0d-1dd5e979cf68", "category": 1}] if web_search else [],
316 316 "traceId": get_random_hex(40),
317 317 "conversationHistoryOptionsSets": ["autosave","savemem","uprofupd","uprofgen"],
Modified g4f/Provider/GigaChat.py +9 -14
@@ -1,35 +1,28 @@
1 1 from __future__ import annotations
2 2
3 import base64
4 3 import os
5 4 import ssl
6 5 import time
7 6 import uuid
8 7
9 8 import json
10 from aiohttp import ClientSession, BaseConnector, TCPConnector
9 from aiohttp import ClientSession, TCPConnector, BaseConnector
11 10 from g4f.requests import raise_for_status
12 11
13 from ..typing import AsyncResult, Messages, ImageType
12 from ..typing import AsyncResult, Messages
14 13 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
15 from ..image import to_bytes, is_accepted_format
16 14 from ..errors import MissingAuthError
17 15 from .helper import get_connector
18 16
19 access_token = ''
17 access_token = ""
20 18 token_expires_at = 0
21 19
22 ssl_ctx = ssl.create_default_context(
23 cafile=os.path.dirname(__file__) + '/gigachat_crt/russian_trusted_root_ca_pem.crt')
24
25
26 20 class GigaChat(AsyncGeneratorProvider, ProviderModelMixin):
27 21 url = "https://developers.sber.ru/gigachat"
28 22 working = True
29 23 supports_message_history = True
30 24 supports_system_message = True
31 25 supports_stream = True
32
33 26 needs_auth = True
34 27 default_model = "GigaChat:latest"
35 28 models = ["GigaChat:latest", "GigaChat-Plus", "GigaChat-Pro"]
@@ -42,18 +35,20 @@ class GigaChat(AsyncGeneratorProvider, ProviderModelMixin):
42 35 stream: bool = True,
43 36 proxy: str = None,
44 37 api_key: str = None,
38 coonector: BaseConnector = None,
45 39 scope: str = "GIGACHAT_API_PERS",
46 40 update_interval: float = 0,
47 41 **kwargs
48 42 ) -> AsyncResult:
49 43 global access_token, token_expires_at
50 44 model = cls.get_model(model)
51
52 45 if not api_key:
53 46 raise MissingAuthError('Missing "api_key"')
54
55 connector = TCPConnector(ssl_context=ssl_ctx)
56
47
48 cafile = os.path.join(os.path.dirname(__file__), "gigachat_crt/russian_trusted_root_ca_pem.crt")
49 ssl_context = ssl.create_default_context(cafile=cafile) if os.path.exists(cafile) else None
50 if connector is None and ssl_context is not None:
51 connector = TCPConnector(ssl_context=ssl_context)
57 52 async with ClientSession(connector=get_connector(connector, proxy)) as session:
58 53 if token_expires_at - int(time.time() * 1000) < 60000:
59 54 async with session.post(url="https://ngw.devices.sberbank.ru:9443/api/v2/oauth",
Modified g4f/Provider/HuggingFace.py +4 -6
@@ -7,6 +7,7 @@ from ..typing import AsyncResult, Messages
7 7 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 8 from .helper import get_connector
9 9 from ..errors import RateLimitError, ModelNotFoundError
10 from ..requests.raise_for_status import raise_for_status
10 11
11 12 class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
12 13 url = "https://huggingface.co/chat"
@@ -44,12 +45,9 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
44 45 connector=get_connector(connector, proxy)
45 46 ) as session:
46 47 async with session.post(f"{api_base.rstrip('/')}/models/{model}", json=payload) as response:
47 if response.status == 429:
48 raise RateLimitError("Rate limit reached. Set a api_key")
49 elif response.status == 404:
48 if response.status == 404:
50 49 raise ModelNotFoundError(f"Model is not supported: {model}")
51 elif response.status != 200:
52 raise RuntimeError(f"Response {response.status}: {await response.text()}")
50 await raise_for_status(response)
53 51 if stream:
54 52 first = True
55 53 async for line in response.content:
@@ -68,7 +66,7 @@ def format_prompt(messages: Messages) -> str:
68 66 system_messages = [message["content"] for message in messages if message["role"] == "system"]
69 67 question = " ".join([messages[-1]["content"], *system_messages])
70 68 history = "".join([
71 f"<s>[INST]{messages[idx-1]['content']} [/INST] {message}</s>"
69 f"<s>[INST]{messages[idx-1]['content']} [/INST] {message['content']}</s>"
72 70 for idx, message in enumerate(messages)
73 71 if message["role"] == "assistant"
74 72 ])
Modified g4f/gui/client/static/css/style.css +4 -6
@@ -653,12 +653,10 @@ select {
653 653 width: 100%;
654 654 }
655 655
656 .bottom_buttons button span {
657 color: var(--colour-3);
658 font-size: 14px;
659 }
660
661 .bottom_buttons button a {
656 .bottom_buttons button a,
657 .bottom_buttons button span,
658 .bottom_buttons .info a,
659 .bottom_buttons .info i {
662 660 color: var(--colour-3);
663 661 font-weight: 500;
664 662 }
Modified g4f/gui/client/static/js/chat.v1.js +3 -3
@@ -819,7 +819,8 @@ async function on_api() {
819 819 if (versions["version"] != versions["latest_version"]) {
820 820 let release_url = 'https://github.com/xtekky/gpt4free/releases/tag/' + versions["latest_version"];
821 821 let title = `New version: ${versions["latest_version"]}`;
822 text += `<a href="${release_url}" target="_blank" title="${title}">${versions["version"]} 🆕</a>`;
822 text += `<a href="${release_url}" target="_blank" title="${title}">${versions["version"]}</a> `;
823 text += `<i class="fa-solid fa-rotate"></i>`
823 824 } else {
824 825 text += versions["version"];
825 826 }
@@ -994,8 +995,7 @@ async function load_provider_models(providerIndex=null) {
994 995 providerSelect.addEventListener("change", () => load_provider_models());
995 996
996 997 function save_storage() {
997 let filename = new Date().toLocaleString()
998 filename += ".json"
998 let filename = `chat ${new Date().toLocaleString()}.json`.replaceAll(":", "-");
999 999 let data = {"options": {"g4f": ""}};
1000 1000 for (let i = 0; i < appStorage.length; i++){
1001 1001 let key = appStorage.key(i);
Modified g4f/providers/base_provider.py +1 -1
@@ -95,7 +95,7 @@ class AbstractProvider(BaseProvider):
95 95 return annotation.__name__ if hasattr(annotation, "__name__") else str(annotation)
96 96
97 97 args = ""
98 for name, param in cls.get_parameters():
98 for name, param in cls.get_parameters().items():
99 99 if name in ("self", "kwargs") or (name == "stream" and not cls.supports_stream):
100 100 continue
101 101 args += f"\n {name}"
Modified g4f/webdriver.py +6 -2
@@ -2,7 +2,7 @@ from __future__ import annotations
2 2
3 3 try:
4 4 from platformdirs import user_config_dir
5 from undetected_chromedriver import Chrome, ChromeOptions
5 from undetected_chromedriver import Chrome, ChromeOptions, find_chrome_executable
6 6 from selenium.webdriver.remote.webdriver import WebDriver
7 7 from selenium.webdriver.remote.webelement import WebElement
8 8 from selenium.webdriver.common.by import By
@@ -39,7 +39,7 @@ try:
39 39 options = ChromeOptions()
40 40 config = self._setup_backend(seleniumwire_options)
41 41 options.add_argument(f"--proxy-server={config['proxy']['httpProxy']}")
42 options.add_argument('--proxy-bypass-list=<-loopback>')
42 options.add_argument("--proxy-bypass-list=<-loopback>")
43 43 options.add_argument("--ignore-certificate-errors")
44 44 super().__init__(*args, options=options, **kwargs)
45 45 has_seleniumwire = True
@@ -66,6 +66,9 @@ def get_browser(
66 66 """
67 67 if not has_requirements:
68 68 raise MissingRequirementsError('Install "undetected_chromedriver" and "platformdirs" package')
69 browser = find_chrome_executable()
70 if browser is None:
71 raise MissingRequirementsError('Install "Google Chrome" browser')
69 72 if user_data_dir is None:
70 73 user_data_dir = user_config_dir("g4f")
71 74 if user_data_dir and debug.logging:
@@ -82,6 +85,7 @@ def get_browser(
82 85 options=options,
83 86 user_data_dir=user_data_dir,
84 87 driver_executable_path=driver,
88 browser_executable_path=browser,
85 89 headless=headless,
86 90 patcher_force_close=True
87 91 )