Skip to content

Commit 0819d82

Browse files
committed
refactor: error handling with an exception class
1 parent 4a64e7b commit 0819d82

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

src/utils/utils.py

+16-15
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from langchain_google_genai import ChatGoogleGenerativeAI
1111
from langchain_ollama import ChatOllama
1212
from langchain_openai import AzureChatOpenAI, ChatOpenAI
13-
import gradio as gr
1413

1514
from .llm import DeepSeekR1ChatOpenAI, DeepSeekR1ChatOllama
1615

@@ -29,7 +28,7 @@ def get_llm_model(provider: str, **kwargs):
2928
if provider not in {"ollama"}:
3029
api_key = get_config_value(provider, "api_key", **kwargs)
3130
if not api_key:
32-
handle_api_key_error(provider)
31+
raise MissingAPIKeyError(provider)
3332

3433
base_url = get_config_value(provider, "base_url", **kwargs)
3534
model_name = get_config_value(provider, "model", **kwargs)
@@ -121,10 +120,24 @@ def get_llm_model(provider: str, **kwargs):
121120
else:
122121
raise ValueError(f"Unsupported provider: {provider}")
123122

123+
class MissingAPIKeyError(Exception):
124+
"""Custom exception raised when an API key is missing."""
125+
def __init__(self, provider: str):
126+
self.provider = provider
127+
super().__init__(self.message())
128+
129+
def message(self):
130+
provider_display = PROVIDER_DISPLAY_NAMES.get(self.provider, self.provider.upper())
131+
config = get_provider_config(self.provider)
132+
env_var = config.get("api_key_env")
133+
return (f"💥 {provider_display} API key not found! 🔑 Please set the "
134+
f"`{env_var}` environment variable or provide it in the UI.")
135+
124136
def update_model_dropdown(llm_provider, api_key=None, base_url=None):
125137
"""
126138
Update the model name dropdown with predefined models for the selected provider.
127139
"""
140+
import gradio as gr
128141
# Use API keys from .env if not provided
129142
if not api_key:
130143
api_key = get_config_value(llm_provider, "api_key")
@@ -136,18 +149,6 @@ def update_model_dropdown(llm_provider, api_key=None, base_url=None):
136149
return gr.Dropdown(choices=MODEL_NAMES[llm_provider], value=MODEL_NAMES[llm_provider][0], interactive=True)
137150
return gr.Dropdown(choices=[], value="", interactive=True, allow_custom_value=True)
138151

139-
def handle_api_key_error(provider: str):
140-
"""
141-
Handles the missing API key error by raising a gr.Error with a clear message.
142-
"""
143-
provider_display = PROVIDER_DISPLAY_NAMES.get(provider, provider.upper())
144-
config = get_provider_config(provider)
145-
env_var = config.get("api_key_env")
146-
raise gr.Error(
147-
f"💥 {provider_display} API key not found! 🔑 Please set the "
148-
f"`{env_var}` environment variable or provide it in the UI."
149-
)
150-
151152
def encode_image(img_path):
152153
if not img_path:
153154
return None
@@ -210,5 +211,5 @@ async def capture_screenshot(browser_context):
210211
)
211212
encoded = base64.b64encode(screenshot).decode('utf-8')
212213
return encoded
213-
except Exception as e:
214+
except Exception:
214215
return None

webui.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from src.controller.custom_controller import CustomController
3535
from gradio.themes import Citrus, Default, Glass, Monochrome, Ocean, Origin, Soft, Base
3636
from src.utils.default_config_settings import default_config, load_config_from_file, save_config_to_file, save_current_config, update_ui_from_config
37-
from src.utils.utils import update_model_dropdown, get_latest_files, capture_screenshot
37+
from src.utils.utils import update_model_dropdown, get_latest_files, capture_screenshot, MissingAPIKeyError
3838

3939

4040
# Global variables for persistence
@@ -242,8 +242,8 @@ async def run_browser_agent(
242242
gr.update(interactive=True) # Re-enable run button
243243
)
244244

245-
except gr.Error:
246-
raise
245+
except MissingAPIKeyError as e:
246+
raise gr.Error(e.message())
247247

248248
except Exception as e:
249249
import traceback

0 commit comments

Comments
 (0)