@@ -221,6 +221,7 @@ def total_cached_tokens(self, value):
221221 message_tokens_sent = 0
222222 message_tokens_received = 0
223223 message_cached_tokens = 0
224+ message_cost_deferred = None
224225 add_cache_headers = False
225226 cache_warming_thread = None
226227 num_cache_warming_pings = 0
@@ -1497,6 +1498,10 @@ async def _run_linear(self, with_message=None, preproc=True):
14971498 self .show_announcements ()
14981499 self .suppress_announcements_for_next_prompt = True
14991500
1501+ if self .message_cost_deferred and not self .io .spinner_active :
1502+ self .io .tool_output (self .message_cost_deferred )
1503+ self .message_cost_deferred = None
1504+
15001505 await self .io .recreate_input ()
15011506 await self .io .input_task
15021507 user_message = self .io .input_task .result ()
@@ -1645,6 +1650,10 @@ async def input_task(self, preproc):
16451650 self .show_announcements ()
16461651 self .suppress_announcements_for_next_prompt = True
16471652
1653+ if self .message_cost_deferred and not self .io .spinner_active :
1654+ self .io .tool_output (self .message_cost_deferred )
1655+ self .message_cost_deferred = None
1656+
16481657 # Stop spinner before showing announcements or getting input
16491658 self .io .stop_spinner ()
16501659 self .copy_context ()
@@ -2512,7 +2521,11 @@ async def format_in_executor():
25122521 if not self .tui :
25132522 spinner_text += f" • ${ self .format_cost (self .total_cost )} session"
25142523
2515- self .io .start_spinner (spinner_text , coder_uuid = getattr (self , "uuid" , None ))
2524+ if self .io .spinner_active :
2525+ self .io .start_spinner (spinner_text , coder_uuid = getattr (self , "uuid" , None ))
2526+ else :
2527+ self .message_cost_deferred = spinner_text
2528+
25162529 if self .stream :
25172530 self .mdstream = True
25182531 else :
@@ -2635,6 +2648,10 @@ async def format_in_executor():
26352648
26362649 # Ensure any waiting spinner is stopped
26372650 self .io .start_spinner ("Processing Answer..." , coder_uuid = getattr (self , "uuid" , None ))
2651+
2652+ if not self .io .spinner_active :
2653+ self .partial_response_content = self .get_multi_response_content_in_progress (True )
2654+
26382655 self .remove_reasoning_content ()
26392656 self .multi_response_content = ""
26402657
@@ -2980,12 +2997,22 @@ async def _execute_mcp_tools(self, server, tool_calls):
29802997 continue
29812998
29822999 async def do_tool_call ():
3000+ nonlocal session
29833001 from litellm import experimental_mcp_client
29843002
2985- return await experimental_mcp_client .call_openai_tool (
2986- session = session ,
2987- openai_tool = new_tool_call ,
2988- )
3003+ try :
3004+ return await experimental_mcp_client .call_openai_tool (
3005+ session = session ,
3006+ openai_tool = new_tool_call ,
3007+ )
3008+ except Exception as e :
3009+ if server .is_session_expired_error (e ):
3010+ session = await server .reconnect ()
3011+ return await experimental_mcp_client .call_openai_tool (
3012+ session = session ,
3013+ openai_tool = new_tool_call ,
3014+ )
3015+ raise
29893016
29903017 call_result , interrupted = await coroutines .interruptible (
29913018 do_tool_call (), self .interrupt_event
0 commit comments