Skip to content

Commit b7c7262

Browse files
Refactor logging to use log levels and improve clarity
Standardizes logging across all provider modules and utilities by passing log messages directly to write_log with appropriate log levels (error, warning, debug). Removes redundant 'ERROR:' and 'WARNING:' prefixes from messages, relying on the log level instead. This improves log clarity, consistency, and enables better filtering of log output.
1 parent 1caa406 commit b7c7262

13 files changed

Lines changed: 77 additions & 64 deletions

File tree

python/mllmcelltype/annotate.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def annotate_clusters(
8181
api_key = load_api_key(provider)
8282
if not api_key:
8383
error_msg = f"API key not found for provider: {provider}"
84-
write_log(f"ERROR: {error_msg}", level="error")
84+
write_log(error_msg, level="error")
8585
raise ValueError(error_msg)
8686

8787
# Create prompt
@@ -110,7 +110,7 @@ def annotate_clusters(
110110
provider_func = PROVIDER_FUNCTIONS.get(provider.lower())
111111
if not provider_func:
112112
error_msg = f"Unknown provider: {provider}"
113-
write_log(f"ERROR: {error_msg}", level="error")
113+
write_log(error_msg, level="error")
114114
raise ValueError(error_msg)
115115

116116
# Process request
@@ -133,7 +133,7 @@ def annotate_clusters(
133133

134134
except Exception as e:
135135
error_msg = f"Error during annotation: {str(e)}"
136-
write_log(f"ERROR: {error_msg}", level="error")
136+
write_log(error_msg, level="error")
137137
raise
138138

139139

@@ -202,7 +202,7 @@ def batch_annotate_clusters(
202202
api_key = load_api_key(provider)
203203
if not api_key:
204204
error_msg = f"API key not found for provider: {provider}"
205-
write_log(f"ERROR: {error_msg}", level="error")
205+
write_log(error_msg, level="error")
206206
raise ValueError(error_msg)
207207

208208
# Create batch prompt
@@ -243,7 +243,7 @@ def batch_annotate_clusters(
243243
provider_func = PROVIDER_FUNCTIONS.get(provider.lower())
244244
if not provider_func:
245245
error_msg = f"Unknown provider: {provider}"
246-
write_log(f"ERROR: {error_msg}", level="error")
246+
write_log(error_msg, level="error")
247247
raise ValueError(error_msg)
248248

249249
# Process request
@@ -396,7 +396,7 @@ def batch_annotate_clusters(
396396

397397
except Exception as e:
398398
error_msg = f"Error during batch annotation: {str(e)}"
399-
write_log(f"ERROR: {error_msg}", level="error")
399+
write_log(error_msg, level="error")
400400
raise
401401

402402

@@ -467,7 +467,7 @@ def get_model_response(
467467
api_key = load_api_key(provider)
468468
if not api_key:
469469
error_msg = f"API key not found for provider: {provider}"
470-
write_log(f"ERROR: {error_msg}", level="error")
470+
write_log(error_msg, level="error")
471471
raise ValueError(error_msg)
472472

473473
# Check cache
@@ -486,7 +486,7 @@ def get_model_response(
486486
provider_func = PROVIDER_FUNCTIONS.get(provider.lower())
487487
if not provider_func:
488488
error_msg = f"Unknown provider: {provider}"
489-
write_log(f"ERROR: {error_msg}", level="error")
489+
write_log(error_msg, level="error")
490490
raise ValueError(error_msg)
491491

492492
# Call provider function
@@ -507,5 +507,5 @@ def get_model_response(
507507
return result
508508
except Exception as e:
509509
error_msg = f"Error getting model response: {str(e)}"
510-
write_log(f"ERROR: {error_msg}", level="error")
510+
write_log(error_msg, level="error")
511511
raise

python/mllmcelltype/providers/anthropic.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_anthropic(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "Anthropic API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Check for deprecated models that will be retired on July 21, 2025
@@ -43,7 +43,8 @@ def process_anthropic(
4343

4444
if model in deprecated_models:
4545
write_log(
46-
f"WARNING: Model '{model}' will be retired on {deprecated_models[model]}. Please migrate to a newer model."
46+
f"Model '{model}' will be retired on {deprecated_models[model]}. Please migrate to a newer model.",
47+
level="warning",
4748
)
4849
write_log("Recommended migrations:")
4950
if model.startswith("claude-2"):
@@ -131,7 +132,7 @@ def process_anthropic(
131132
lines = content.strip().split("\n")
132133

133134
write_log(f"Got response with {len(lines)} lines")
134-
write_log(f"Raw response from Anthropic:\n{lines}")
135+
write_log(f"Raw response from Anthropic:\n{lines}", level="debug")
135136

136137
# Count the number of expected lines (clusters)
137138
input_lines = prompt.split("\n")
@@ -217,10 +218,11 @@ def process_anthropic_direct(
217218
try:
218219
error_message = response.json()
219220
error_detail = error_message.get("error", {}).get("message", f"model: {model}")
220-
write_log(f"ERROR: Anthropic API request failed: {error_detail}")
221+
write_log(f"Anthropic API request failed: {error_detail}", level="error")
221222
except (ValueError, KeyError, json.JSONDecodeError):
222223
write_log(
223-
f"ERROR: Anthropic API request failed with status {response.status_code}"
224+
f"Anthropic API request failed with status {response.status_code}",
225+
level="error",
224226
)
225227

226228
# If rate limited, wait and retry

python/mllmcelltype/providers/deepseek.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def process_deepseek(
3030
# Check if API key is provided and not empty
3131
if not api_key:
3232
error_msg = "DeepSeek API key is missing or empty"
33-
write_log(f"ERROR: {error_msg}")
33+
write_log(error_msg, level="error")
3434
raise ValueError(error_msg)
3535

3636
# Use custom URL or default URL
@@ -97,7 +97,8 @@ def process_deepseek(
9797
if response.status_code != 200:
9898
error_message = response.json()
9999
write_log(
100-
f"ERROR: DeepSeek API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}"
100+
f"DeepSeek API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}",
101+
level="error",
101102
)
102103

103104
# If rate limited, wait and retry
@@ -113,7 +114,7 @@ def process_deepseek(
113114
content = response.json()
114115
res = content["choices"][0]["message"]["content"].strip().split("\n")
115116
write_log(f"Got response with {len(res)} lines")
116-
write_log(f"Raw response from DeepSeek:\n{res}")
117+
write_log(f"Raw response from DeepSeek:\n{res}", level="debug")
117118

118119
# Clean up results (remove commas at the end of lines)
119120
return [line.rstrip(",") for line in res]
@@ -128,7 +129,8 @@ def process_deepseek(
128129
time.sleep(wait_time)
129130
else:
130131
write_log(
131-
f"ERROR: All retry attempts failed with timeout. Last error: {str(e)}"
132+
f"All retry attempts failed with timeout. Last error: {str(e)}",
133+
level="error",
132134
)
133135
raise
134136

@@ -142,7 +144,8 @@ def process_deepseek(
142144
time.sleep(wait_time)
143145
else:
144146
write_log(
145-
f"ERROR: All retry attempts failed with connection error. Last error: {str(e)}"
147+
f"All retry attempts failed with connection error. Last error: {str(e)}",
148+
level="error",
146149
)
147150
raise
148151

@@ -153,7 +156,7 @@ def process_deepseek(
153156
write_log(f"Waiting {wait_time} seconds before retrying...")
154157
time.sleep(wait_time)
155158
else:
156-
write_log(f"ERROR: All retry attempts failed. Last error: {str(e)}")
159+
write_log(f"All retry attempts failed. Last error: {str(e)}", level="error")
157160
raise
158161

159162
# Should not reach here if all retries fail (exception would be raised)

python/mllmcelltype/providers/gemini.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_gemini(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "Google API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Initialize the client
@@ -55,7 +55,7 @@ def process_gemini(
5555
# Parse the response
5656
result = response.text.strip().split("\n")
5757
write_log(f"Got response with {len(result)} lines")
58-
write_log(f"Raw response from Gemini:\n{result}")
58+
write_log(f"Raw response from Gemini:\n{result}", level="debug")
5959

6060
# Clean up results (remove commas at the end of lines)
6161
return [line.rstrip(",") for line in result]

python/mllmcelltype/providers/grok.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_grok(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "Grok API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Use custom URL or default URL
@@ -49,7 +49,7 @@ def process_grok(
4949
write_log(f"Using model: {model}")
5050

5151
# Process all input at once
52-
write_log("Processing input in 1 chunk")
52+
write_log("Processing input in 1 chunk", level="debug")
5353

5454
# Prepare the request body
5555
body = {"model": model, "messages": [{"role": "user", "content": prompt}]}
@@ -69,7 +69,8 @@ def process_grok(
6969
if response.status_code != 200:
7070
error_message = response.json()
7171
write_log(
72-
f"ERROR: Grok API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}"
72+
f"Grok API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}",
73+
level="error",
7374
)
7475

7576
# If rate limited, wait and retry
@@ -85,10 +86,10 @@ def process_grok(
8586
content = response.json()
8687
res = content["choices"][0]["message"]["content"].strip().split("\n")
8788
write_log(f"Got response with {len(res)} lines")
88-
write_log(f"Raw response from Grok:\n{res}")
89+
write_log(f"Raw response from Grok:\n{res}", level="debug")
8990

9091
# Success, exit retry loop
91-
write_log("All chunks processed successfully")
92+
write_log("All chunks processed successfully", level="debug")
9293
# Clean up results (remove commas at the end of lines)
9394
return [line.rstrip(",") for line in res]
9495

python/mllmcelltype/providers/minimax.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_minimax(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "MiniMax API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Use custom URL or default URL
@@ -67,31 +67,32 @@ def process_minimax(
6767
for attempt in range(max_retries):
6868
try:
6969
# Log request details for debugging
70-
write_log(f"Request URL: {url}")
71-
write_log(f"Request headers: {headers}")
72-
write_log(f"Request body: {json.dumps(body)}")
70+
write_log(f"Request URL: {url}", level="debug")
71+
write_log(f"Request headers: {headers}", level="debug")
72+
write_log(f"Request body: {json.dumps(body)}", level="debug")
7373

7474
response = requests.post(
7575
url=url, headers=headers, data=json.dumps(body), timeout=30
7676
)
7777

7878
# Log response details
79-
write_log(f"Response status code: {response.status_code}")
80-
write_log(f"Response headers: {response.headers}")
79+
write_log(f"Response status code: {response.status_code}", level="debug")
80+
write_log(f"Response headers: {response.headers}", level="debug")
8181

8282
# Check for errors
8383
if response.status_code != 200:
8484
try:
8585
error_message = response.json()
86-
write_log(f"ERROR: MiniMax API request failed: {error_message}")
86+
write_log(f"MiniMax API request failed: {error_message}", level="error")
8787
write_log(
8888
f"Error details: {error_message.get('error', {}).get('message', 'Unknown error')}"
8989
)
9090
except (ValueError, KeyError, json.JSONDecodeError):
9191
write_log(
92-
f"ERROR: MiniMax API request failed with status {response.status_code}"
92+
f"MiniMax API request failed with status {response.status_code}",
93+
level="error",
9394
)
94-
write_log(f"Response text: {response.text}")
95+
write_log(f"Response text: {response.text}", level="debug")
9596

9697
# If rate limited, wait and retry
9798
if response.status_code == 429 and attempt < max_retries - 1:
@@ -119,7 +120,7 @@ def process_minimax(
119120
raise ValueError(f"Unexpected response format: {content}")
120121

121122
write_log(f"Got response with {len(res)} lines")
122-
write_log(f"Raw response from MiniMax:\n{res}")
123+
write_log(f"Raw response from MiniMax:\n{res}", level="debug")
123124

124125
# Clean up results (remove commas at the end of lines)
125126
return [line.rstrip(",") for line in res]

python/mllmcelltype/providers/openai.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_openai(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "OpenAI API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Use custom URL or default URL
@@ -73,7 +73,8 @@ def process_openai(
7373
if response.status_code != 200:
7474
error_message = response.json()
7575
write_log(
76-
f"ERROR: OpenAI API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}"
76+
f"OpenAI API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}",
77+
level="error",
7778
)
7879

7980
# If rate limited, wait and retry
@@ -89,7 +90,7 @@ def process_openai(
8990
content = response.json()
9091
res = content["choices"][0]["message"]["content"].strip().split("\n")
9192
write_log(f"Got response with {len(res)} lines")
92-
write_log(f"Raw response from OpenAI:\n{res}")
93+
write_log(f"Raw response from OpenAI:\n{res}", level="debug")
9394

9495
# Clean up results (remove commas at the end of lines)
9596
return [line.rstrip(",") for line in res]

python/mllmcelltype/providers/openrouter.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def process_openrouter(
2929
# Check if API key is provided and not empty
3030
if not api_key:
3131
error_msg = "OpenRouter API key is missing or empty"
32-
write_log(f"ERROR: {error_msg}")
32+
write_log(error_msg, level="error")
3333
raise ValueError(error_msg)
3434

3535
# Use custom URL or default URL
@@ -57,7 +57,8 @@ def process_openrouter(
5757
and not model.startswith("mistralai/")
5858
):
5959
write_log(
60-
f"Warning: Model ID '{model}' may not be in the correct format for OpenRouter. Expected format: 'provider/model'"
60+
f"Model ID '{model}' may not be in the correct format for OpenRouter. Expected format: 'provider/model'",
61+
level="warning",
6162
)
6263

6364
# Prepare the request body
@@ -87,7 +88,8 @@ def process_openrouter(
8788
if response.status_code != 200:
8889
error_message = response.json()
8990
write_log(
90-
f"ERROR: OpenRouter API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}"
91+
f"OpenRouter API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}",
92+
level="error",
9193
)
9294

9395
# If rate limited, wait and retry
@@ -103,7 +105,7 @@ def process_openrouter(
103105
content = response.json()
104106
res = content["choices"][0]["message"]["content"].strip().split("\n")
105107
write_log(f"Got response with {len(res)} lines")
106-
write_log(f"Raw response from OpenRouter:\n{res}")
108+
write_log(f"Raw response from OpenRouter:\n{res}", level="debug")
107109

108110
# Clean up results (remove commas at the end of lines)
109111
return [line.rstrip(",") for line in res]

python/mllmcelltype/providers/qwen.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def process_qwen(
2828
# Check if API key is provided and not empty
2929
if not api_key:
3030
error_msg = "DashScope API key is missing or empty"
31-
write_log(f"ERROR: {error_msg}")
31+
write_log(error_msg, level="error")
3232
raise ValueError(error_msg)
3333

3434
# Use custom URL or smart selection
@@ -74,7 +74,8 @@ def process_qwen(
7474
if response.status_code != 200:
7575
error_message = response.json()
7676
write_log(
77-
f"ERROR: Qwen API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}"
77+
f"Qwen API request failed: {error_message.get('error', {}).get('message', 'Unknown error')}",
78+
level="error",
7879
)
7980

8081
# If rate limited, wait and retry
@@ -90,7 +91,7 @@ def process_qwen(
9091
content = response.json()
9192
res = content["choices"][0]["message"]["content"].strip().split("\n")
9293
write_log(f"Got response with {len(res)} lines")
93-
write_log(f"Raw response from Qwen:\n{res}")
94+
write_log(f"Raw response from Qwen:\n{res}", level="debug")
9495

9596
# Clean up results (remove commas at the end of lines)
9697
return [line.rstrip(",") for line in res]

0 commit comments

Comments
 (0)