From de63c31d43426be1e276db111cdc4d31b4f6767f Mon Sep 17 00:00:00 2001 From: andienguyen-ecoligo Date: Sat, 21 Feb 2026 12:30:57 -0500 Subject: [PATCH] fix(providers): normalize empty reasoning_content to None at provider level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #947 fixed the consumer side (context.py) but the root cause is at the provider level — getattr returns "" (empty string) instead of None when reasoning_content is empty. This causes DeepSeek API to reject the request with "Missing reasoning_content field" error. `"" or None` evaluates to None, preventing empty strings from propagating downstream. Fixes #946 --- nanobot/providers/custom_provider.py | 2 +- nanobot/providers/litellm_provider.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nanobot/providers/custom_provider.py b/nanobot/providers/custom_provider.py index f190ccf..4022d9e 100644 --- a/nanobot/providers/custom_provider.py +++ b/nanobot/providers/custom_provider.py @@ -40,7 +40,7 @@ class CustomProvider(LLMProvider): return LLMResponse( content=msg.content, tool_calls=tool_calls, finish_reason=choice.finish_reason or "stop", usage={"prompt_tokens": u.prompt_tokens, "completion_tokens": u.completion_tokens, "total_tokens": u.total_tokens} if u else {}, - reasoning_content=getattr(msg, "reasoning_content", None), + reasoning_content=getattr(msg, "reasoning_content", None) or None, ) def get_default_model(self) -> str: diff --git a/nanobot/providers/litellm_provider.py b/nanobot/providers/litellm_provider.py index 58c9ac2..784f02c 100644 --- a/nanobot/providers/litellm_provider.py +++ b/nanobot/providers/litellm_provider.py @@ -257,7 +257,7 @@ class LiteLLMProvider(LLMProvider): "total_tokens": response.usage.total_tokens, } - reasoning_content = getattr(message, "reasoning_content", None) + reasoning_content = getattr(message, "reasoning_content", None) or None return LLMResponse( content=message.content,