From 8af84f8f3a985f78479c318f6b203962eada080d Mon Sep 17 00:00:00 2001 From: yurekami Date: Mon, 29 Dec 2025 01:01:02 +0900 Subject: [PATCH 1/2] Fix code quality issues and add health check endpoints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix duplicate function name bug in controller.py where `worker_api_get_status` was defined twice, causing the test_connection endpoint to shadow the worker status endpoint - Fix PEP 8 violation: use `is None` instead of `== None` in model_worker.py - Fix type comparison: use `isinstance()` instead of `type() ==` in openai_api_server.py for better Pythonic style - Add `/health` endpoint to both controller and openai_api_server for load balancer and orchestration system compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- fastchat/serve/controller.py | 8 +++++++- fastchat/serve/model_worker.py | 2 +- fastchat/serve/openai_api_server.py | 8 +++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fastchat/serve/controller.py b/fastchat/serve/controller.py index 42d928403..47477529c 100644 --- a/fastchat/serve/controller.py +++ b/fastchat/serve/controller.py @@ -346,10 +346,16 @@ async def worker_api_get_status(request: Request): @app.get("/test_connection") -async def worker_api_get_status(request: Request): +async def test_connection(request: Request): return "success" +@app.get("/health") +async def health_check(): + """Health check endpoint for load balancers and orchestration systems.""" + return {"status": "ok"} + + def create_controller(): parser = argparse.ArgumentParser() parser.add_argument("--host", type=str, default="localhost") diff --git a/fastchat/serve/model_worker.py b/fastchat/serve/model_worker.py index 683a78556..8e04f50a5 100644 --- a/fastchat/serve/model_worker.py +++ b/fastchat/serve/model_worker.py @@ -90,7 +90,7 @@ def __init__( debug=debug, ) self.device = device - if self.tokenizer.pad_token == None: + if self.tokenizer.pad_token is None: self.tokenizer.pad_token = self.tokenizer.eos_token self.context_len = get_context_length(self.model.config) self.generate_stream_func = get_generate_stream_function(self.model, model_path) diff --git a/fastchat/serve/openai_api_server.py b/fastchat/serve/openai_api_server.py index a6ffee96b..4ce49147e 100644 --- a/fastchat/serve/openai_api_server.py +++ b/fastchat/serve/openai_api_server.py @@ -304,7 +304,7 @@ async def get_gen_params( if msg_role == "system": conv.set_system_message(message["content"]) elif msg_role == "user": - if type(message["content"]) == list: + if isinstance(message["content"], list): image_list = [ item["image_url"]["url"] for item in message["content"] @@ -394,6 +394,12 @@ async def get_conv(model_name: str, worker_addr: str): return conv_template +@app.get("/health") +async def health_check(): + """Health check endpoint for load balancers and orchestration systems.""" + return {"status": "ok"} + + @app.get("/v1/models", dependencies=[Depends(check_api_key)]) async def show_available_models(): controller_address = app_settings.controller_address From 3d64a476a3e06f3cbebbe9a46856dd37996ad17d Mon Sep 17 00:00:00 2001 From: yurekami Date: Mon, 29 Dec 2025 01:13:11 +0900 Subject: [PATCH 2/2] Fix bare except clauses with specific exception types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace overly broad `except:` clauses with specific exception types to: - Prevent catching KeyboardInterrupt and SystemExit - Make error handling more explicit and debuggable - Follow Python best practices (PEP 8) Changes: - utils.py: Catch (KeyError, TypeError) in image moderation retry loop - api_provider.py: Catch (IndexError, AttributeError, KeyError) in Reka API stream iteration, also include error message in response - monitor.py: Catch (IndexError, KeyError) in model name lookup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- fastchat/serve/api_provider.py | 4 ++-- fastchat/serve/monitor/monitor.py | 2 +- fastchat/utils.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fastchat/serve/api_provider.py b/fastchat/serve/api_provider.py index 2e967e3ef..59b77e337 100644 --- a/fastchat/serve/api_provider.py +++ b/fastchat/serve/api_provider.py @@ -1262,9 +1262,9 @@ def reka_api_stream_iter( for chunk in response: try: yield {"text": chunk.responses[0].chunk.content, "error_code": 0} - except: + except (IndexError, AttributeError, KeyError) as e: yield { - "text": f"**API REQUEST ERROR** ", + "text": f"**API REQUEST ERROR** {e}", "error_code": 1, } diff --git a/fastchat/serve/monitor/monitor.py b/fastchat/serve/monitor/monitor.py index 462e38187..00754cbad 100644 --- a/fastchat/serve/monitor/monitor.py +++ b/fastchat/serve/monitor/monitor.py @@ -886,7 +886,7 @@ def get_model_name(model_key): "Model" ].values[0] return model_name - except: + except (IndexError, KeyError): return None combined_table = [] diff --git a/fastchat/utils.py b/fastchat/utils.py index d3531928f..dcb2833c8 100644 --- a/fastchat/utils.py +++ b/fastchat/utils.py @@ -450,7 +450,7 @@ def image_moderation_request(image_bytes, endpoint, api_key): try: if response["Status"]["Code"] == 3000: break - except: + except (KeyError, TypeError): time.sleep(0.5) return response