返回提交历史
Modified
g4f/Provider/Blackbox2.py
+10
-11
Modified
g4f/Provider/needs_auth/Cerebras.py
+10
-8
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+1
-1
Modified
g4f/gui/client/index.html
+13
-13
Modified
g4f/gui/client/static/css/style.css
+2
-1
Modified
g4f/gui/client/static/js/chat.v1.js
+2
-0
XFEstudio/gpt4free
Hide api_key fields from disabeld providers
68c7a92e
代码差异
6 个文件
+38
-34
@@ -6,7 +6,7 @@ import re
6
6
import json
7
7
from pathlib import Path
8
8
from aiohttp import ClientSession
9
from typing import AsyncGenerator
9
from typing import AsyncIterator
10
10
11
11
from ..typing import AsyncResult, Messages
12
12
from ..image import ImageResponse
@@ -21,12 +21,12 @@ class Blackbox2(AsyncGeneratorProvider, ProviderModelMixin):
21
21
"llama-3.1-70b": "https://www.blackbox.ai/api/improve-prompt",
22
22
"flux": "https://www.blackbox.ai/api/image-generator"
23
23
}
24
24
25
25
working = True
26
26
supports_system_message = True
27
27
supports_message_history = True
28
28
supports_stream = False
29
29
30
30
default_model = 'llama-3.1-70b'
31
31
chat_models = ['llama-3.1-70b']
32
32
image_models = ['flux']
@@ -97,15 +97,14 @@ class Blackbox2(AsyncGeneratorProvider, ProviderModelMixin):
97
97
messages: Messages,
98
98
prompt: str = None,
99
99
proxy: str = None,
100
prompt: str = None,
101
100
max_retries: int = 3,
102
101
delay: int = 1,
103
102
max_tokens: int = None,
104
103
**kwargs
105
) -> AsyncGenerator[str, None]:
104
) -> AsyncResult:
106
105
if not model:
107
106
model = cls.default_model
108
107
109
108
if model in cls.chat_models:
110
109
async for result in cls._generate_text(model, messages, proxy, max_retries, delay, max_tokens):
111
110
yield result
@@ -125,13 +124,13 @@ class Blackbox2(AsyncGeneratorProvider, ProviderModelMixin):
125
124
max_retries: int = 3,
126
125
delay: int = 1,
127
126
max_tokens: int = None,
128
) -> AsyncGenerator[str, None]:
127
) -> AsyncIterator[str]:
129
128
headers = cls._get_headers()
130
129
131
130
async with ClientSession(headers=headers) as session:
132
131
license_key = await cls._get_license_key(session)
133
132
api_endpoint = cls.api_endpoints[model]
134
133
135
134
data = {
136
135
"messages": messages,
137
136
"max_tokens": max_tokens,
@@ -162,7 +161,7 @@ class Blackbox2(AsyncGeneratorProvider, ProviderModelMixin):
162
161
model: str,
163
162
prompt: str,
164
163
proxy: str = None
165
) -> AsyncGenerator[ImageResponse, None]:
164
) -> AsyncIterator[ImageResponse]:
166
165
headers = cls._get_headers()
167
166
api_endpoint = cls.api_endpoints[model]
168
167
@@ -170,11 +169,11 @@ class Blackbox2(AsyncGeneratorProvider, ProviderModelMixin):
170
169
data = {
171
170
"query": prompt
172
171
}
173
172
174
173
async with session.post(api_endpoint, headers=headers, json=data, proxy=proxy) as response:
175
174
response.raise_for_status()
176
175
response_data = await response.json()
177
176
178
177
if 'markdown' in response_data:
179
178
image_url = response_data['markdown'].split('(')[1].split(')')[0]
180
179
yield ImageResponse(images=image_url, alt=prompt)
@@ -16,6 +16,7 @@ class Cerebras(OpenaiAPI):
16
16
models = [
17
17
"llama3.1-70b",
18
18
"llama3.1-8b",
19
"llama-3.3-70b"
19
20
]
20
21
model_aliases = {"llama-3.1-70b": "llama3.1-70b", "llama-3.1-8b": "llama3.1-8b"}
21
22
@@ -29,14 +30,15 @@ class Cerebras(OpenaiAPI):
29
30
cookies: Cookies = None,
30
31
**kwargs
31
32
) -> AsyncResult:
32
if api_key is None and cookies is None:
33
cookies = get_cookies(".cerebras.ai")
34
async with ClientSession(cookies=cookies) as session:
35
async with session.get("https://inference.cerebras.ai/api/auth/session") as response:
36
raise_for_status(response)
37
data = await response.json()
38
if data:
39
api_key = data.get("user", {}).get("demoApiKey")
33
if api_key is None:
34
if cookies is None:
35
cookies = get_cookies(".cerebras.ai")
36
async with ClientSession(cookies=cookies) as session:
37
async with session.get("https://inference.cerebras.ai/api/auth/session") as response:
38
await raise_for_status(response)
39
data = await response.json()
40
if data:
41
api_key = data.get("user", {}).get("demoApiKey")
40
42
async for chunk in super().create_async_generator(
41
43
model, messages,
42
44
api_base=api_base,
@@ -504,7 +504,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
504
504
await cls.login()
505
505
async with StreamSession(
506
506
impersonate="chrome",
507
timeout=900
507
timeout=0
508
508
) as session:
509
509
async with session.get(
510
510
f"{cls.url}/backend-api/synthesize",
@@ -150,47 +150,47 @@
150
150
<label for="recognition-language" class="label" title="">Speech recognition language</label>
151
151
<input type="text" id="recognition-language" value="" placeholder="navigator.language"/>
152
152
</div>
153
<div class="field box">
153
<div class="field box hidden">
154
154
<label for="BingCreateImages-api_key" class="label" title="">Microsoft Designer in Bing:</label>
155
155
<textarea id="BingCreateImages-api_key" name="BingCreateImages[api_key]" placeholder=""_U" cookie"></textarea>
156
156
</div>
157
<div class="field box">
157
<div class="field box hidden">
158
158
<label for="Cerebras-api_key" class="label" title="">Cerebras Inference:</label>
159
159
<textarea id="Cerebras-api_key" name="Cerebras[api_key]" placeholder="api_key"></textarea>
160
160
</div>
161
<div class="field box">
161
<div class="field box hidden">
162
162
<label for="DeepInfra-api_key" class="label" title="">DeepInfra:</label>
163
163
<textarea id="DeepInfra-api_key" name="DeepInfra[api_key]" class="DeepInfraImage-api_key" placeholder="api_key"></textarea>
164
164
</div>
165
<div class="field box">
165
<div class="field box hidden">
166
166
<label for="GeminiPro-api_key" class="label" title="">Gemini API:</label>
167
167
<textarea id="GeminiPro-api_key" name="GeminiPro[api_key]" placeholder="api_key"></textarea>
168
168
</div>
169
<div class="field box">
169
<div class="field box hidden">
170
170
<label for="Groq-api_key" class="label" title="">Groq:</label>
171
171
<textarea id="Groq-api_key" name="Groq[api_key]" placeholder="api_key"></textarea>
172
172
</div>
173
<div class="field box">
173
<div class="field box hidden">
174
174
<label for="HuggingFace-api_key" class="label" title="">HuggingFace:</label>
175
175
<textarea id="HuggingFace-api_key" name="HuggingFace[api_key]" class="HuggingFaceAPI-api_key" placeholder="api_key"></textarea>
176
176
</div>
177
<div class="field box">
178
<label for="Openai-api_key" class="label" title="">OpenAI API:</label>
179
<textarea id="Openai-api_key" name="Openai[api_key]" placeholder="api_key"></textarea>
177
<div class="field box hidden">
178
<label for="OpenaiAPI-api_key" class="label" title="">OpenAI API:</label>
179
<textarea id="OpenaiAPI-api_key" name="OpenaiAPI[api_key]" placeholder="api_key"></textarea>
180
180
</div>
181
<div class="field box">
181
<div class="field box hidden">
182
182
<label for="OpenRouter-api_key" class="label" title="">OpenRouter:</label>
183
183
<textarea id="OpenRouter-api_key" name="OpenRouter[api_key]" placeholder="api_key"></textarea>
184
184
</div>
185
<div class="field box">
185
<div class="field box hidden">
186
186
<label for="PerplexityApi-api_key" class="label" title="">Perplexity API:</label>
187
187
<textarea id="PerplexityApi-api_key" name="PerplexityApi[api_key]" placeholder="api_key"></textarea>
188
188
</div>
189
<div class="field box">
189
<div class="field box hidden">
190
190
<label for="Replicate-api_key" class="label" title="">Replicate:</label>
191
191
<textarea id="Replicate-api_key" name="Replicate[api_key]" class="ReplicateImage-api_key" placeholder="api_key"></textarea>
192
192
</div>
193
<div class="field box">
193
<div class="field box hidden">
194
194
<label for="xAI-api_key" class="label" title="">xAI:</label>
195
195
<textarea id="xAI-api_key" name="xAI[api_key]" placeholder="api_key"></textarea>
196
196
</div>
@@ -1022,7 +1022,8 @@ ul {
1022
1022
}
1023
1023
1024
1024
.settings h3 {
1025
padding-left: 50px;
1025
padding-left: 54px;
1026
padding-top: 18px;
1026
1027
}
1027
1028
1028
1029
.buttons {
@@ -1293,6 +1293,7 @@ const load_provider_option = (input, provider_name) => {
1293
1293
providerSelect.querySelectorAll(`option[data-parent="${provider_name}"]`).forEach(
1294
1294
(el) => el.removeAttribute("disabled")
1295
1295
);
1296
settings.querySelector(`.field:has(#${provider_name}-api_key)`)?.classList.remove("hidden");
1296
1297
} else {
1297
1298
modelSelect.querySelectorAll(`option[data-providers*="${provider_name}"]`).forEach(
1298
1299
(el) => {
@@ -1307,6 +1308,7 @@ const load_provider_option = (input, provider_name) => {
1307
1308
providerSelect.querySelectorAll(`option[data-parent="${provider_name}"]`).forEach(
1308
1309
(el) => el.setAttribute("disabled", "disabled")
1309
1310
);
1311
settings.querySelector(`.field:has(#${provider_name}-api_key)`)?.classList.add("hidden");
1310
1312
}
1311
1313
};
1312
1314