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

XFEstudio/gpt4free

GigaChat models add

f07173de
vlad <master.redstone@yandex.ru>
提交于

代码差异

4 个文件 +157 -2
Added g4f/Provider/GigaChat.py +97 -0
@@ -0,0 +1,97 @@
1 from __future__ import annotations
2
3 import base64
4 import os
5 import ssl
6 import time
7 import uuid
8
9 import json
10 from aiohttp import ClientSession, BaseConnector, TCPConnector
11 from g4f.requests import raise_for_status
12
13 from ..typing import AsyncResult, Messages, ImageType
14 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
15 from ..image import to_bytes, is_accepted_format
16 from ..errors import MissingAuthError
17 from .helper import get_connector
18
19 access_token = ''
20 token_expires_at = 0
21
22 ssl_ctx = ssl.create_default_context(
23 cafile=os.path.dirname(__file__) + '/gigachat_crt/russian_trusted_root_ca_pem.crt')
24
25
26 class GigaChat(AsyncGeneratorProvider, ProviderModelMixin):
27 url = "https://developers.sber.ru/gigachat"
28 working = True
29 supports_message_history = True
30 supports_system_message = True
31 supports_stream = True
32
33 needs_auth = True
34 default_model = "GigaChat:latest"
35 models = ["GigaChat:latest", "GigaChat-Plus", "GigaChat-Pro"]
36
37 @classmethod
38 async def create_async_generator(
39 cls,
40 model: str,
41 messages: Messages,
42 stream: bool = True,
43 proxy: str = None,
44 api_key: str = None,
45 scope: str = "GIGACHAT_API_PERS",
46 update_interval: float = 0,
47 **kwargs
48 ) -> AsyncResult:
49 global access_token, token_expires_at
50 model = cls.get_model(model)
51
52 if not api_key:
53 raise MissingAuthError('Missing "api_key"')
54
55 connector = TCPConnector(ssl_context=ssl_ctx)
56
57 async with ClientSession(connector=get_connector(connector, proxy)) as session:
58 if token_expires_at - int(time.time() * 1000) < 60000:
59 async with session.post(url="https://ngw.devices.sberbank.ru:9443/api/v2/oauth",
60 headers={"Authorization": f"Bearer {api_key}",
61 "RqUID": str(uuid.uuid4()),
62 "Content-Type": "application/x-www-form-urlencoded"},
63 data={"scope": scope}) as response:
64 await raise_for_status(response)
65 data = await response.json()
66 access_token = data['access_token']
67 token_expires_at = data['expires_at']
68
69 async with session.post(url="https://gigachat.devices.sberbank.ru/api/v1/chat/completions",
70 headers={"Authorization": f"Bearer {access_token}"},
71 json={
72 "model": model,
73 "messages": messages,
74 "stream": stream,
75 "update_interval": update_interval,
76 **kwargs
77 }) as response:
78 await raise_for_status(response)
79
80 async for line in response.content:
81 if not stream:
82 yield json.loads(line.decode("utf-8"))['choices'][0]['message']['content']
83 return
84
85 if line and line.startswith(b"data:"):
86 line = line[6:-1] # remove "data: " prefix and "\n" suffix
87 if line.strip() == b"[DONE]":
88 return
89 else:
90 msg = json.loads(line.decode("utf-8"))['choices'][0]
91 content = msg['delta']['content']
92
93 if content:
94 yield content
95
96 if 'finish_reason' in msg:
97 return
Modified g4f/Provider/__init__.py +1 -0
@@ -24,6 +24,7 @@ from .DeepInfra import DeepInfra
24 24 from .FlowGpt import FlowGpt
25 25 from .FreeChatgpt import FreeChatgpt
26 26 from .FreeGpt import FreeGpt
27 from .GigaChat import GigaChat
27 28 from .GeminiPro import GeminiPro
28 29 from .GeminiProChat import GeminiProChat
29 30 from .GptTalkRu import GptTalkRu
Added g4f/Provider/gigachat_crt/russian_trusted_root_ca_pem.crt +33 -0
@@ -0,0 +1,33 @@
1 -----BEGIN CERTIFICATE-----
2 MIIFwjCCA6qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx
3 PzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu
4 ZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg
5 Q0EwHhcNMjIwMzAxMjEwNDE1WhcNMzIwMjI3MjEwNDE1WjBwMQswCQYDVQQGEwJS
6 VTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg
7 YW5kIENvbW11bmljYXRpb25zMSAwHgYDVQQDDBdSdXNzaWFuIFRydXN0ZWQgUm9v
8 dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMfFOZ8pUAL3+r2n
9 qqE0Zp52selXsKGFYoG0GM5bwz1bSFtCt+AZQMhkWQheI3poZAToYJu69pHLKS6Q
10 XBiwBC1cvzYmUYKMYZC7jE5YhEU2bSL0mX7NaMxMDmH2/NwuOVRj8OImVa5s1F4U
11 zn4Kv3PFlDBjjSjXKVY9kmjUBsXQrIHeaqmUIsPIlNWUnimXS0I0abExqkbdrXbX
12 YwCOXhOO2pDUx3ckmJlCMUGacUTnylyQW2VsJIyIGA8V0xzdaeUXg0VZ6ZmNUr5Y
13 Ber/EAOLPb8NYpsAhJe2mXjMB/J9HNsoFMBFJ0lLOT/+dQvjbdRZoOT8eqJpWnVD
14 U+QL/qEZnz57N88OWM3rabJkRNdU/Z7x5SFIM9FrqtN8xewsiBWBI0K6XFuOBOTD
15 4V08o4TzJ8+Ccq5XlCUW2L48pZNCYuBDfBh7FxkB7qDgGDiaftEkZZfApRg2E+M9
16 G8wkNKTPLDc4wH0FDTijhgxR3Y4PiS1HL2Zhw7bD3CbslmEGgfnnZojNkJtcLeBH
17 BLa52/dSwNU4WWLubaYSiAmA9IUMX1/RpfpxOxd4Ykmhz97oFbUaDJFipIggx5sX
18 ePAlkTdWnv+RWBxlJwMQ25oEHmRguNYf4Zr/Rxr9cS93Y+mdXIZaBEE0KS2iLRqa
19 OiWBki9IMQU4phqPOBAaG7A+eP8PAgMBAAGjZjBkMB0GA1UdDgQWBBTh0YHlzlpf
20 BKrS6badZrHF+qwshzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzAS
21 BgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
22 AAOCAgEAALIY1wkilt/urfEVM5vKzr6utOeDWCUczmWX/RX4ljpRdgF+5fAIS4vH
23 tmXkqpSCOVeWUrJV9QvZn6L227ZwuE15cWi8DCDal3Ue90WgAJJZMfTshN4OI8cq
24 W9E4EG9wglbEtMnObHlms8F3CHmrw3k6KmUkWGoa+/ENmcVl68u/cMRl1JbW2bM+
25 /3A+SAg2c6iPDlehczKx2oa95QW0SkPPWGuNA/CE8CpyANIhu9XFrj3RQ3EqeRcS
26 AQQod1RNuHpfETLU/A2gMmvn/w/sx7TB3W5BPs6rprOA37tutPq9u6FTZOcG1Oqj
27 C/B7yTqgI7rbyvox7DEXoX7rIiEqyNNUguTk/u3SZ4VXE2kmxdmSh3TQvybfbnXV
28 4JbCZVaqiZraqc7oZMnRoWrXRG3ztbnbes/9qhRGI7PqXqeKJBztxRTEVj8ONs1d
29 WN5szTwaPIvhkhO3CO5ErU2rVdUr89wKpNXbBODFKRtgxUT70YpmJ46VVaqdAhOZ
30 D9EUUn4YaeLaS8AjSF/h7UkjOibNc4qVDiPP+rkehFWM66PVnP1Msh93tc+taIfC
31 EYVMxjh8zNbFuoc7fzvvrFILLe7ifvEIUqSVIC/AzplM/Jxw7buXFeGP1qVCBEHq
32 391d/9RAfaZ12zkwFsl+IKwE/OZxW8AHa9i1p4GO0YSNuczzEm4=
33 -----END CERTIFICATE-----
Modified g4f/models.py +26 -2
@@ -2,7 +2,7 @@ from __future__ import annotations
2 2
3 3 from dataclasses import dataclass
4 4
5 from .Provider import RetryProvider, ProviderType
5 from .Provider import RetryProvider, ProviderType
6 6 from .Provider import (
7 7 Chatgpt4Online,
8 8 PerplexityLabs,
@@ -15,6 +15,7 @@ from .Provider import (
15 15 ChatgptAi,
16 16 DeepInfra,
17 17 ChatBase,
18 GigaChat,
18 19 Liaobots,
19 20 FreeGpt,
20 21 Llama2,
@@ -95,6 +96,24 @@ gpt_4_turbo = Model(
95 96 best_provider = Bing
96 97 )
97 98
99 gigachat = Model(
100 name = 'GigaChat:latest',
101 base_provider = 'gigachat',
102 best_provider = GigaChat
103 )
104
105 gigachat_plus = Model(
106 name = 'GigaChat-Plus',
107 base_provider = 'gigachat',
108 best_provider = GigaChat
109 )
110
111 gigachat_pro = Model(
112 name = 'GigaChat-Pro',
113 base_provider = 'gigachat',
114 best_provider = GigaChat
115 )
116
98 117 llama2_7b = Model(
99 118 name = "meta-llama/Llama-2-7b-chat-hf",
100 119 base_provider = 'meta',
@@ -271,7 +290,12 @@ class ModelUtils:
271 290 'llama2-70b': llama2_70b,
272 291 'codellama-34b-instruct': codellama_34b_instruct,
273 292 'codellama-70b-instruct': codellama_70b_instruct,
274
293
294 # GigaChat
295 'gigachat' : gigachat,
296 'gigachat_plus': gigachat_plus,
297 'gigachat_pro' : gigachat_pro,
298
275 299 'mixtral-8x7b': mixtral_8x7b,
276 300 'mistral-7b': mistral_7b,
277 301 'dolphin-mixtral-8x7b': dolphin_mixtral_8x7b,