From 578360b29306c3c3a663806011c0a3494f028de5 Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:09:04 +0200 Subject: [PATCH 1/7] fix disabled thinking mode --- browser_use/agent/views.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/browser_use/agent/views.py b/browser_use/agent/views.py index 6b717d5c1..67f3408e2 100644 --- a/browser_use/agent/views.py +++ b/browser_use/agent/views.py @@ -193,24 +193,25 @@ class AgentOutput(BaseModel): def type_with_custom_actions_no_thinking(custom_actions: type[ActionModel]) -> type[AgentOutput]: """Extend actions with custom actions and exclude thinking field""" - # Create a base model without thinking, but inheriting from AgentOutput - # Override only the fields we need to change - model_ = create_model( + class AgentOutputNoThinking(AgentOutput): + @classmethod + def model_json_schema(cls): + schema = super().model_json_schema() + del schema['properties']['thinking'] + return schema + + model = create_model( 'AgentOutput', - __base__=AgentOutput, - thinking=( - type(None), # type: ignore - Field(default=None, exclude=True), - ), # Exclude thinking from schema + __base__=AgentOutputNoThinking, action=( list[custom_actions], # type: ignore Field(..., description='List of actions to execute', json_schema_extra={'min_items': 1}), ), - __module__=AgentOutput.__module__, + __module__=AgentOutputNoThinking.__module__, ) - model_.__doc__ = 'AgentOutput model with custom actions' - return model_ + model.__doc__ = 'AgentOutput model with custom actions' + return model class AgentHistory(BaseModel): From 512060c546fd93b93a42584c064fbaccf73d99da Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:09:21 +0200 Subject: [PATCH 2/7] fix openai cost calculation --- browser_use/llm/openai/chat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/browser_use/llm/openai/chat.py b/browser_use/llm/openai/chat.py index 2b49ea20f..99b3198ab 100644 --- a/browser_use/llm/openai/chat.py +++ b/browser_use/llm/openai/chat.py @@ -105,7 +105,8 @@ class ChatOpenAI(BaseChatModel): prompt_cache_creation_tokens=None, prompt_image_tokens=None, # Completion - completion_tokens=response.usage.completion_tokens, + completion_tokens=response.usage.completion_tokens + + (response.usage.completion_tokens_details.reasoning_tokens or 0), total_tokens=response.usage.total_tokens, ) if response.usage is not None From 64997091a0c6dcddf8ec4685da2ca17bec696e92 Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:14:37 +0200 Subject: [PATCH 3/7] fix linter --- browser_use/llm/openai/chat.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/browser_use/llm/openai/chat.py b/browser_use/llm/openai/chat.py index 99b3198ab..11b1d8838 100644 --- a/browser_use/llm/openai/chat.py +++ b/browser_use/llm/openai/chat.py @@ -96,6 +96,10 @@ class ChatOpenAI(BaseChatModel): return str(self.model) def _get_usage(self, response: ChatCompletion) -> ChatInvokeUsage | None: + completion_tokens = response.usage.completion_tokens + if response.usage.completion_tokens_details is not None: + completion_tokens += response.usage.completion_tokens_details.reasoning_tokens + usage = ( ChatInvokeUsage( prompt_tokens=response.usage.prompt_tokens, @@ -105,8 +109,7 @@ class ChatOpenAI(BaseChatModel): prompt_cache_creation_tokens=None, prompt_image_tokens=None, # Completion - completion_tokens=response.usage.completion_tokens - + (response.usage.completion_tokens_details.reasoning_tokens or 0), + completion_tokens=completion_tokens, total_tokens=response.usage.total_tokens, ) if response.usage is not None From 86cc3fcf57c9662540d48625dcc5ee01e74640d4 Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:16:46 +0200 Subject: [PATCH 4/7] fix a tiny bit --- browser_use/agent/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser_use/agent/views.py b/browser_use/agent/views.py index 67f3408e2..485547cce 100644 --- a/browser_use/agent/views.py +++ b/browser_use/agent/views.py @@ -195,8 +195,8 @@ class AgentOutput(BaseModel): class AgentOutputNoThinking(AgentOutput): @classmethod - def model_json_schema(cls): - schema = super().model_json_schema() + def model_json_schema(cls, **kwargs): + schema = super().model_json_schema(**kwargs) del schema['properties']['thinking'] return schema From b02ccc3191d181531421a24b4cb5f2a24f507a43 Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:21:57 +0200 Subject: [PATCH 5/7] fix types bro --- browser_use/llm/openai/chat.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/browser_use/llm/openai/chat.py b/browser_use/llm/openai/chat.py index 11b1d8838..79f7d04b8 100644 --- a/browser_use/llm/openai/chat.py +++ b/browser_use/llm/openai/chat.py @@ -109,12 +109,16 @@ class ChatOpenAI(BaseChatModel): prompt_cache_creation_tokens=None, prompt_image_tokens=None, # Completion - completion_tokens=completion_tokens, + completion_tokens=response.usage.completion_tokens + + (response.usage.completion_tokens_details.reasoning_tokens or 0), total_tokens=response.usage.total_tokens, ) if response.usage is not None else None ) + if response.usage is not None and response.usage.completion_tokens_details is not None: + usage.completion_tokens += response.usage.completion_tokens_details.reasoning_tokens + return usage @overload From bcc8a7e54ee0bdfdb53072dadb69bea5bc18934c Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:23:14 +0200 Subject: [PATCH 6/7] fix more --- browser_use/llm/openai/chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser_use/llm/openai/chat.py b/browser_use/llm/openai/chat.py index 79f7d04b8..68ab2da47 100644 --- a/browser_use/llm/openai/chat.py +++ b/browser_use/llm/openai/chat.py @@ -117,7 +117,7 @@ class ChatOpenAI(BaseChatModel): else None ) if response.usage is not None and response.usage.completion_tokens_details is not None: - usage.completion_tokens += response.usage.completion_tokens_details.reasoning_tokens + usage.completion_tokens += response.usage.completion_tokens_details.reasoning_tokens or 0 return usage From 5c370974d8e3756743441d4dedb03f196fc55173 Mon Sep 17 00:00:00 2001 From: mertunsall Date: Thu, 3 Jul 2025 19:28:05 +0200 Subject: [PATCH 7/7] fixxxx --- browser_use/llm/openai/chat.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/browser_use/llm/openai/chat.py b/browser_use/llm/openai/chat.py index 68ab2da47..e91b662c7 100644 --- a/browser_use/llm/openai/chat.py +++ b/browser_use/llm/openai/chat.py @@ -96,12 +96,15 @@ class ChatOpenAI(BaseChatModel): return str(self.model) def _get_usage(self, response: ChatCompletion) -> ChatInvokeUsage | None: - completion_tokens = response.usage.completion_tokens - if response.usage.completion_tokens_details is not None: - completion_tokens += response.usage.completion_tokens_details.reasoning_tokens + if response.usage is not None: + completion_tokens = response.usage.completion_tokens + completion_token_details = response.usage.completion_tokens_details + if completion_token_details is not None: + reasoning_tokens = completion_token_details.reasoning_tokens + if reasoning_tokens is not None: + completion_tokens += reasoning_tokens - usage = ( - ChatInvokeUsage( + usage = ChatInvokeUsage( prompt_tokens=response.usage.prompt_tokens, prompt_cached_tokens=response.usage.prompt_tokens_details.cached_tokens if response.usage.prompt_tokens_details is not None @@ -109,15 +112,11 @@ class ChatOpenAI(BaseChatModel): prompt_cache_creation_tokens=None, prompt_image_tokens=None, # Completion - completion_tokens=response.usage.completion_tokens - + (response.usage.completion_tokens_details.reasoning_tokens or 0), + completion_tokens=completion_tokens, total_tokens=response.usage.total_tokens, ) - if response.usage is not None - else None - ) - if response.usage is not None and response.usage.completion_tokens_details is not None: - usage.completion_tokens += response.usage.completion_tokens_details.reasoning_tokens or 0 + else: + usage = None return usage