返回提交历史
Modified
.github/workflows/publish-workflow.yaml
+13
-13
Modified
g4f/Provider/Airforce.py
+2
-2
Modified
g4f/Provider/Cloudflare.py
+2
-2
Modified
g4f/Provider/DeepInfraChat.py
+2
-2
Modified
g4f/Provider/local/Ollama.py
+2
-2
Modified
g4f/Provider/needs_auth/Cerebras.py
+0
-2
Modified
g4f/Provider/needs_auth/CopilotAccount.py
+1
-2
Modified
g4f/Provider/needs_auth/DeepInfra.py
+1
-2
Modified
g4f/Provider/needs_auth/Groq.py
+1
-14
Modified
g4f/Provider/needs_auth/HuggingFaceAPI.py
+1
-15
Modified
g4f/Provider/needs_auth/OpenaiAPI.py
+9
-3
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+1
-1
Modified
g4f/Provider/needs_auth/PerplexityApi.py
+2
-14
Modified
g4f/Provider/needs_auth/ThebApi.py
+2
-2
Modified
g4f/Provider/needs_auth/xAI.py
+1
-14
Modified
g4f/gui/client/static/css/style.css
+3
-3
Modified
g4f/gui/client/static/js/chat.v1.js
+31
-25
Modified
g4f/requests/__init__.py
+3
-3
XFEstudio/gpt4free
Fix docker build and fix api_base issue in OpenaiAPI providers
5b76f2cd
代码差异
18 个文件
+77
-121
@@ -57,19 +57,19 @@ jobs:
57
57
username: ${{ github.repository_owner }}
58
58
password: ${{ secrets.GHCR_PAT }}
59
59
60
- name: Build and push armv7 image
61
uses: docker/build-push-action@v5
62
with:
63
context: .
64
file: docker/Dockerfile-armv7
65
platforms: linux/arm/v7
66
push: true
67
tags: |
68
hlohaus789/g4f:latest-armv7
69
hlohaus789/g4f:${{ github.ref_name }}-armv7
70
labels: ${{ steps.metadata.outputs.labels }}
71
build-args: |
72
G4F_VERSION=${{ github.ref_name }}
60
# - name: Build and push armv7 image
61
# uses: docker/build-push-action@v5
62
# with:
63
# context: .
64
# file: docker/Dockerfile-armv7
65
# platforms: linux/arm/v7
66
# push: true
67
# tags: |
68
# hlohaus789/g4f:latest-armv7
69
# hlohaus789/g4f:${{ github.ref_name }}-armv7
70
# labels: ${{ steps.metadata.outputs.labels }}
71
# build-args: |
72
# G4F_VERSION=${{ github.ref_name }}
73
73
74
74
- name: Build and push small images
75
75
uses: docker/build-push-action@v5
@@ -158,7 +158,7 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
158
158
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
159
159
"Accept": "image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5",
160
160
"Accept-Language": "en-US,en;q=0.5",
161
"Accept-Encoding": "gzip, deflate, br, zstd",
161
"Accept-Encoding": "gzip, deflate, br",
162
162
"Content-Type": "application/json",
163
163
"Authorization": f"Bearer {api_key}",
164
164
}
@@ -192,7 +192,7 @@ class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
192
192
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
193
193
"Accept": "application/json, text/event-stream",
194
194
"Accept-Language": "en-US,en;q=0.5",
195
"Accept-Encoding": "gzip, deflate, br, zstd",
195
"Accept-Encoding": "gzip, deflate, br",
196
196
"Content-Type": "application/json",
197
197
"Authorization": f"Bearer {api_key}",
198
198
}
@@ -79,9 +79,9 @@ class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin):
79
79
cls._args["cookies"] = merge_cookies(cls._args["cookies"] , response)
80
80
try:
81
81
await raise_for_status(response)
82
except ResponseStatusError as e:
82
except ResponseStatusError:
83
83
cls._args = None
84
raise e
84
raise
85
85
async for line in response.iter_lines():
86
86
if line.startswith(b'data: '):
87
87
if line == b'data: [DONE]':
@@ -7,6 +7,7 @@ class DeepInfraChat(OpenaiAPI):
7
7
label = "DeepInfra Chat"
8
8
url = "https://deepinfra.com/chat"
9
9
working = True
10
api_base = "https://api.deepinfra.com/v1/openai"
10
11
11
12
default_model = 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo'
12
13
models = [
@@ -34,7 +35,6 @@ class DeepInfraChat(OpenaiAPI):
34
35
model: str,
35
36
messages: Messages,
36
37
proxy: str = None,
37
api_base: str = "https://api.deepinfra.com/v1/openai",
38
38
**kwargs
39
39
) -> AsyncResult:
40
40
headers = {
@@ -46,4 +46,4 @@ class DeepInfraChat(OpenaiAPI):
46
46
'X-Deepinfra-Source': 'web-page',
47
47
'accept': 'text/event-stream',
48
48
}
49
return super().create_async_generator(model, messages, proxy, api_base=api_base, headers=headers, **kwargs)
49
return super().create_async_generator(model, messages, proxy, headers=headers, **kwargs)
@@ -31,10 +31,10 @@ class Ollama(OpenaiAPI):
31
31
api_base: str = None,
32
32
**kwargs
33
33
) -> AsyncResult:
34
if not api_base:
34
if api_base is None:
35
35
host = os.getenv("OLLAMA_HOST", "localhost")
36
36
port = os.getenv("OLLAMA_PORT", "11434")
37
37
api_base: str = f"http://{host}:{port}/v1"
38
38
return super().create_async_generator(
39
39
model, messages, api_base=api_base, **kwargs
40
)
40
)
@@ -25,7 +25,6 @@ class Cerebras(OpenaiAPI):
25
25
cls,
26
26
model: str,
27
27
messages: Messages,
28
api_base: str = api_base,
29
28
api_key: str = None,
30
29
cookies: Cookies = None,
31
30
**kwargs
@@ -41,7 +40,6 @@ class Cerebras(OpenaiAPI):
41
40
api_key = data.get("user", {}).get("demoApiKey")
42
41
async for chunk in super().create_async_generator(
43
42
model, messages,
44
api_base=api_base,
45
43
impersonate="chrome",
46
44
api_key=api_key,
47
45
headers={
@@ -1,9 +1,8 @@
1
1
from __future__ import annotations
2
2
3
from ..base_provider import ProviderModelMixin
4
3
from ..Copilot import Copilot
5
4
6
class CopilotAccount(Copilot, ProviderModelMixin):
5
class CopilotAccount(Copilot):
7
6
needs_auth = True
8
7
parent = "Copilot"
9
8
default_model = "Copilot"
@@ -8,6 +8,7 @@ class DeepInfra(OpenaiAPI):
8
8
label = "DeepInfra"
9
9
url = "https://deepinfra.com"
10
10
working = True
11
api_base = "https://api.deepinfra.com/v1/openai",
11
12
needs_auth = True
12
13
supports_stream = True
13
14
supports_message_history = True
@@ -27,7 +28,6 @@ class DeepInfra(OpenaiAPI):
27
28
model: str,
28
29
messages: Messages,
29
30
stream: bool,
30
api_base: str = "https://api.deepinfra.com/v1/openai",
31
31
temperature: float = 0.7,
32
32
max_tokens: int = 1028,
33
33
**kwargs
@@ -50,7 +50,6 @@ class DeepInfra(OpenaiAPI):
50
50
return super().create_async_generator(
51
51
model, messages,
52
52
stream=stream,
53
api_base=api_base,
54
53
temperature=temperature,
55
54
max_tokens=max_tokens,
56
55
headers=headers,
@@ -1,7 +1,6 @@
1
1
from __future__ import annotations
2
2
3
3
from .OpenaiAPI import OpenaiAPI
4
from ...typing import AsyncResult, Messages
5
4
6
5
class Groq(OpenaiAPI):
7
6
label = "Groq"
@@ -29,16 +28,4 @@ class Groq(OpenaiAPI):
29
28
"whisper-large-v3",
30
29
"whisper-large-v3-turbo",
31
30
]
32
model_aliases = {"mixtral-8x7b": "mixtral-8x7b-32768", "llama2-70b": "llama2-70b-4096"}
33
34
@classmethod
35
def create_async_generator(
36
cls,
37
model: str,
38
messages: Messages,
39
api_base: str = api_base,
40
**kwargs
41
) -> AsyncResult:
42
return super().create_async_generator(
43
model, messages, api_base=api_base, **kwargs
44
)
31
model_aliases = {"mixtral-8x7b": "mixtral-8x7b-32768", "llama2-70b": "llama2-70b-4096"}
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
3
3
from .OpenaiAPI import OpenaiAPI
4
4
from .HuggingChat import HuggingChat
5
from ...typing import AsyncResult, Messages
6
5
7
6
class HuggingFaceAPI(OpenaiAPI):
8
7
label = "HuggingFace (Inference API)"
@@ -13,17 +12,4 @@ class HuggingFaceAPI(OpenaiAPI):
13
12
default_vision_model = default_model
14
13
models = [
15
14
*HuggingChat.models
16
]
17
18
@classmethod
19
def create_async_generator(
20
cls,
21
model: str,
22
messages: Messages,
23
api_base: str = api_base,
24
max_tokens: int = 500,
25
**kwargs
26
) -> AsyncResult:
27
return super().create_async_generator(
28
model, messages, api_base=api_base, max_tokens=max_tokens, **kwargs
29
)
15
]
@@ -23,10 +23,12 @@ class OpenaiAPI(AsyncGeneratorProvider, ProviderModelMixin):
23
23
fallback_models = []
24
24
25
25
@classmethod
26
def get_models(cls, api_key: str = None, api_base: str = api_base) -> list[str]:
26
def get_models(cls, api_key: str = None, api_base: str = None) -> list[str]:
27
27
if not cls.models:
28
28
try:
29
29
headers = {}
30
if api_base is None:
31
api_base = cls.api_base
30
32
if api_key is not None:
31
33
headers["authorization"] = f"Bearer {api_key}"
32
34
response = requests.get(f"{api_base}/models", headers=headers)
@@ -48,7 +50,7 @@ class OpenaiAPI(AsyncGeneratorProvider, ProviderModelMixin):
48
50
timeout: int = 120,
49
51
images: ImagesType = None,
50
52
api_key: str = None,
51
api_base: str = api_base,
53
api_base: str = None,
52
54
temperature: float = None,
53
55
max_tokens: int = None,
54
56
top_p: float = None,
@@ -61,6 +63,8 @@ class OpenaiAPI(AsyncGeneratorProvider, ProviderModelMixin):
61
63
) -> AsyncResult:
62
64
if cls.needs_auth and api_key is None:
63
65
raise MissingAuthError('Add a "api_key"')
66
if api_base is None:
67
api_base = cls.api_base
64
68
if images is not None:
65
69
if not model and hasattr(cls, "default_vision_model"):
66
70
model = cls.default_vision_model
@@ -134,8 +138,10 @@ class OpenaiAPI(AsyncGeneratorProvider, ProviderModelMixin):
134
138
elif "error" in data:
135
139
if "code" in data["error"]:
136
140
raise ResponseError(f'Error {data["error"]["code"]}: {data["error"]["message"]}')
137
else:
141
elif "message" in data["error"]:
138
142
raise ResponseError(data["error"]["message"])
143
else:
144
raise ResponseError(data["error"])
139
145
140
146
@classmethod
141
147
def get_headers(cls, stream: bool, api_key: str = None, headers: dict = None) -> dict:
@@ -438,7 +438,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
438
438
async for line in response.iter_lines():
439
439
async for chunk in cls.iter_messages_line(session, line, conversation):
440
440
yield chunk
441
if not history_disabled and RequestConfig.access_token is not None:
441
if not history_disabled and cls._api_key is not None:
442
442
yield SynthesizeData(cls.__name__, {
443
443
"conversation_id": conversation.conversation_id,
444
444
"message_id": conversation.message_id,