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

XFEstudio/gpt4free

Fix docker build and fix api_base issue in OpenaiAPI providers

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

代码差异

18 个文件 +77 -121
Modified .github/workflows/publish-workflow.yaml +13 -13
@@ -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
Modified g4f/Provider/Airforce.py +2 -2
@@ -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 }
Modified g4f/Provider/Cloudflare.py +2 -2
@@ -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]':
Modified g4f/Provider/DeepInfraChat.py +2 -2
@@ -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)
Modified g4f/Provider/local/Ollama.py +2 -2
@@ -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 )
Modified g4f/Provider/needs_auth/Cerebras.py +0 -2
@@ -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={
Modified g4f/Provider/needs_auth/CopilotAccount.py +1 -2
@@ -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"
Modified g4f/Provider/needs_auth/DeepInfra.py +1 -2
@@ -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,
Modified g4f/Provider/needs_auth/Groq.py +1 -14
@@ -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"}
Modified g4f/Provider/needs_auth/HuggingFaceAPI.py +1 -15
@@ -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 ]
Modified g4f/Provider/needs_auth/OpenaiAPI.py +9 -3
@@ -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:
Modified g4f/Provider/needs_auth/OpenaiChat.py +1 -1
@@ -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,
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