返回提交历史
Added
g4f/Provider/GigaChat.py
+97
-0
Modified
g4f/Provider/__init__.py
+1
-0
Added
g4f/Provider/gigachat_crt/russian_trusted_root_ca_pem.crt
+33
-0
Modified
g4f/models.py
+26
-2
XFEstudio/gpt4free
GigaChat models add
f07173de
代码差异
4 个文件
+157
-2
@@ -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
@@ -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
@@ -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-----
@@ -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,