From 326ff983241429a8dac44395889efb258e621344 Mon Sep 17 00:00:00 2001 From: zhangzhefang Date: Mon, 3 Nov 2025 15:12:12 +0800 Subject: [PATCH 1/2] fix(llm): handle None response in total_token_count_from_response - Add isinstance(resp, dict) checks before using 'in' operator - Prevents TypeError when resp is not a dictionary - Applies fix to new location: common/token_utils.py Fixes #10933 Signed-off-by: Zhang Zhefang --- common/token_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/token_utils.py b/common/token_utils.py index 29f10f7eb45..92d0d574cd5 100644 --- a/common/token_utils.py +++ b/common/token_utils.py @@ -50,19 +50,19 @@ def total_token_count_from_response(resp): except Exception: pass - if 'usage' in resp and 'total_tokens' in resp['usage']: + if isinstance(resp, dict) and 'usage' in resp and 'total_tokens' in resp['usage']: try: return resp["usage"]["total_tokens"] except Exception: pass - if 'usage' in resp and 'input_tokens' in resp['usage'] and 'output_tokens' in resp['usage']: + if isinstance(resp, dict) and 'usage' in resp and 'input_tokens' in resp['usage'] and 'output_tokens' in resp['usage']: try: return resp["usage"]["input_tokens"] + resp["usage"]["output_tokens"] except Exception: pass - if 'meta' in resp and 'tokens' in resp['meta'] and 'input_tokens' in resp['meta']['tokens'] and 'output_tokens' in resp['meta']['tokens']: + if isinstance(resp, dict) and 'meta' in resp and 'tokens' in resp['meta'] and 'input_tokens' in resp['meta']['tokens'] and 'output_tokens' in resp['meta']['tokens']: try: return resp["meta"]["tokens"]["input_tokens"] + resp["meta"]["tokens"]["output_tokens"] except Exception: From b48d00c61a2e94930fffbb4982883ee72655da95 Mon Sep 17 00:00:00 2001 From: zhangzhefang Date: Tue, 4 Nov 2025 11:34:50 +0800 Subject: [PATCH 2/2] docs(llm): add docstring to total_token_count_from_response - Clarify function purpose and return behavior - Document handling of None responses - Improve code maintainability --- common/token_utils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/token_utils.py b/common/token_utils.py index 92d0d574cd5..4d5220fc9f6 100644 --- a/common/token_utils.py +++ b/common/token_utils.py @@ -35,6 +35,12 @@ def num_tokens_from_string(string: str) -> int: return 0 def total_token_count_from_response(resp): + """ + Extract token count from LLM response in various formats. + + Handles None responses and different response structures from various LLM providers. + Returns 0 if token count cannot be determined. + """ if resp is None: return 0