Skip to content

Commit c6d1ab3

Browse files
committed
Add: "Show Available Providers" button in sidebar
1 parent 784dc87 commit c6d1ab3

File tree

2 files changed

+60
-34
lines changed

2 files changed

+60
-34
lines changed

app.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
st.session_state.openai_api_key = None
2323
st.session_state.serpapi_api_key = None
2424
st.session_state.g4f_provider = None
25+
st.session_state.button_clicked = None
26+
27+
28+
if 'response' not in st.session_state:
29+
st.session_state['response'] = ['How can I help you?']
30+
31+
if 'query' not in st.session_state:
32+
st.session_state['query'] = ['Hi']
33+
2534
app_logger = logger.get_logger(__name__)
2635

2736

@@ -84,9 +93,22 @@ def load_api_key() -> None:
8493
"#### Select a provider if you want to use free model. "
8594
"([details](https://github.com/xtekky/gpt4free#models))"
8695
),
87-
(GPT4Free().PROVIDER_MAPPING.keys())
96+
(GPT4Free().providers_table.keys())
8897
)
8998

99+
st.session_state.button_clicked = st.button(
100+
'Show Available Providers',
101+
help='Click to test which providers are currently available.',
102+
type='primary'
103+
)
104+
if st.session_state.button_clicked:
105+
available_providers = GPT4Free().find_available_providers()
106+
st.session_state.query.append('What are the available providers right now?')
107+
st.session_state.response.append(
108+
'The current available providers are:\n'
109+
f'{available_providers}'
110+
)
111+
90112

91113
def upload_and_process_pdf() -> list:
92114
st.write('#### Upload a PDF file:')
@@ -128,25 +150,26 @@ def upload_and_process_pdf() -> list:
128150
def get_response(query: str) -> str:
129151
app_logger.info(f'\033[36mUser Query: {query}\033[0m')
130152
try:
131-
if model is not None:
153+
if model is not None and query:
132154
response = model.run(query)
133155
app_logger.info(f'\033[36mLLM Response: {response}\033[0m')
134156
return response
135157
return (
136158
'Your model still not created.\n'
137159
'1. If you are using gpt4free model, '
138160
'try to re-select a provider. '
139-
'(Ailis, DeepAi are more stable)\n'
161+
'(Click the "Show Available Providers" button in sidebar)\n'
140162
'2. If you are using openai model, '
141-
'try to re-pass openai api key.'
163+
'try to re-pass openai api key.\n'
164+
'3. Or you did not pass the PDF file successfully.'
142165
)
143166
except Exception as e:
144167
app_logger.info(f'{__file__}: {e}')
145168
return (
146169
'Something wrong in docGPT...\n'
147170
'1. If you are using gpt4free model, '
148171
'try to select the different provider. '
149-
'(Ailis, DeepAi are more stable)\n'
172+
'(Click the "Show Available Providers" button in sidebar)\n'
150173
'2. If you are using openai model, '
151174
'check your usage for openai api key.'
152175
)
@@ -169,12 +192,6 @@ def get_response(query: str) -> str:
169192
del docs
170193
st.write('---')
171194

172-
if 'response' not in st.session_state:
173-
st.session_state['response'] = ['How can I help you?']
174-
175-
if 'query' not in st.session_state:
176-
st.session_state['query'] = ['Hi']
177-
178195
user_container = st.container()
179196
response_container = st.container()
180197

@@ -184,7 +201,7 @@ def get_response(query: str) -> str:
184201
placeholder='Enter your question'
185202
)
186203

187-
if query and query != '':
204+
if query and query != '' and not st.session_state.button_clicked:
188205
response = get_response(query)
189206
st.session_state.query.append(query)
190207
st.session_state.response.append(response)

docGPT/docGPT.py

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -197,26 +197,9 @@ def run(self, query: str) -> str:
197197

198198

199199
class GPT4Free(LLM):
200-
PROVIDER_MAPPING = {
201-
'g4f.Provider.AItianhu': g4f.Provider.AItianhu,
202-
'g4f.Provider.Acytoo': g4f.Provider.Acytoo,
203-
'g4f.Provider.Aichat': g4f.Provider.Aichat,
204-
'g4f.Provider.Ails': g4f.Provider.Ails,
205-
'g4f.Provider.Aivvm': g4f.Provider.Aivvm,
206-
'g4f.Provider.ChatBase': g4f.Provider.ChatBase,
207-
'g4f.Provider.ChatgptAi': g4f.Provider.ChatgptAi,
208-
'g4f.Provider.ChatgptLogin': g4f.Provider.ChatgptLogin,
209-
'g4f.Provider.DeepAi': g4f.Provider.DeepAi,
210-
'g4f.Provider.Opchatgpts': g4f.Provider.Opchatgpts,
211-
'g4f.Provider.OpenaiChat': g4f.Provider.OpenaiChat,
212-
'g4f.Provider.Raycast': g4f.Provider.Raycast,
213-
'g4f.Provider.Theb': g4f.Provider.Theb,
214-
'g4f.Provider.Vercel': g4f.Provider.Vercel,
215-
'g4f.Provider.Vitalentum': g4f.Provider.Vitalentum,
216-
'g4f.Provider.Wewordle': g4f.Provider.Wewordle,
217-
'g4f.Provider.Ylokh': g4f.Provider.Ylokh,
218-
'g4f.Provider.You': g4f.Provider.You,
219-
'g4f.Provider.Yqcloud': g4f.Provider.Yqcloud,
200+
providers_table = {
201+
f'g4f.Provider.{provider}': getattr(g4f.Provider, provider)
202+
for provider in g4f.Provider.__all__
220203
}
221204
provider: str = 'g4f.Provider.DeepAi'
222205

@@ -233,12 +216,38 @@ def _call(
233216
try:
234217
# print(f'\033[36mPromopt: {prompt}\033[0m')
235218
module_logger.info(
236-
f'\033[36mProvider: {self.PROVIDER_MAPPING[self.provider]}\033[0m'
219+
f'\033[36mProvider: {self.providers_table[self.provider]}\033[0m'
237220
)
238221
return g4f.ChatCompletion.create(
239222
model="gpt-3.5-turbo",
240223
messages=[{"role": "user", "content": prompt}],
241-
provider=self.PROVIDER_MAPPING[self.provider]
224+
provider=self.providers_table[self.provider]
242225
)
243226
except Exception as e:
244227
module_logger.info(f'{__file__}: {e}')
228+
229+
def _test_provider(self, provider: g4f.Provider) -> str:
230+
try:
231+
g4f.ChatCompletion.create(
232+
model="gpt-3.5-turbo",
233+
messages=[{"role": "user", "content": 'Hi, this is test'}],
234+
provider=provider
235+
)
236+
return provider.__name__
237+
except Exception as e:
238+
print(e)
239+
return
240+
241+
def find_available_providers(self) -> list:
242+
"""Test all the providers then find out which are available"""
243+
from multiprocessing.dummy import Pool as ThreadPool
244+
245+
with ThreadPool(10) as pool:
246+
available_providers = pool.map(
247+
self._test_provider, self.providers_table.values()
248+
)
249+
250+
return [
251+
available_provider for available_provider in available_providers
252+
if available_provider is not None
253+
]

0 commit comments

Comments
 (0)