From e45cd78c7f911d7965cb2d7bfacef7fc02b285e0 Mon Sep 17 00:00:00 2001 From: AI Christianson Date: Mon, 3 Mar 2025 23:40:15 -0500 Subject: [PATCH] better ciayn status --- ra_aid/agent_backends/ciayn_agent.py | 59 +++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/ra_aid/agent_backends/ciayn_agent.py b/ra_aid/agent_backends/ciayn_agent.py index 32c8bea..f49bcc7 100644 --- a/ra_aid/agent_backends/ciayn_agent.py +++ b/ra_aid/agent_backends/ciayn_agent.py @@ -14,6 +14,7 @@ from ra_aid.models_params import DEFAULT_TOKEN_LIMIT from ra_aid.prompts.ciayn_prompts import CIAYN_AGENT_SYSTEM_PROMPT, CIAYN_AGENT_HUMAN_PROMPT, EXTRACT_TOOL_CALL_PROMPT, NO_TOOL_CALL_PROMPT from ra_aid.tools.expert import get_model from ra_aid.tools.reflection import get_function_info +from ra_aid.console.output import cpm logger = get_logger(__name__) @@ -181,6 +182,11 @@ class CiaynAgent: # if the eval fails, try to extract it via a model call if validate_function_call_pattern(code): + cpm( + f"Tool call validation failed. Attempting to extract function call using LLM.", + title="⚠ Validation Warning", + border_style="yellow" + ) functions_list = "\n\n".join(self.available_functions) code = self._extract_tool_call(code, functions_list) pass @@ -190,6 +196,11 @@ class CiaynAgent: except Exception as e: error_msg = f"Error: {str(e)} \n Could not execute code: {code}" tool_name = self.extract_tool_name(code) + cpm( + f"Tool execution failed for `{tool_name}`: {str(e)}", + title="❗ Tool Error", + border_style="red" + ) raise ToolExecutionError( error_msg, base_message=msg, tool_name=tool_name ) from e @@ -207,6 +218,11 @@ class CiaynAgent: if not fallback_response: self.chat_history.append(err_msg) + cpm( + f"Tool fallback was attempted but did not succeed. Original error: {str(e)}", + title="❗ Fallback Failed", + border_style="red bold" + ) return "" self.chat_history.append(self.fallback_fixed_msg) @@ -215,6 +231,13 @@ class CiaynAgent: # msg += f"{fallback_response[0]}\n" msg += f"{e.tool_name}\n" msg += f"\n{fallback_response[1]}\n\n" + + cpm( + f"Fallback successful for tool `{e.tool_name}` after {DEFAULT_MAX_TOOL_FAILURES} consecutive failures.", + title="✓ Fallback Success", + border_style="green" + ) + return msg def _create_agent_chunk(self, content: str) -> Dict[str, Any]: @@ -291,6 +314,11 @@ class CiaynAgent: def _extract_tool_call(self, code: str, functions_list: str) -> str: model = get_model() + cpm( + f"Attempting to fix malformed tool call using LLM. Original code:\n```\n{code}\n```", + title="🔧 Tool Call Extraction", + border_style="blue" + ) prompt = EXTRACT_TOOL_CALL_PROMPT.format( functions_list=functions_list, code=code ) @@ -300,10 +328,21 @@ class CiaynAgent: pattern = r"([\w_\-]+)\((.*?)\)" matches = re.findall(pattern, response, re.DOTALL) if len(matches) == 0: + cpm( + "Failed to extract a valid tool call from the model's response.", + title="❗ Extraction Failed", + border_style="red" + ) raise ToolExecutionError("Failed to extract tool call") ma = matches[0][0].strip() mb = matches[0][1].strip().replace("\n", " ") - return f"{ma}({mb})" + fixed_code = f"{ma}({mb})" + cpm( + f"Successfully extracted tool call: `{fixed_code}`", + title="✓ Extraction Success", + border_style="green" + ) + return fixed_code def stream( self, messages_dict: Dict[str, List[Any]], _config: Dict[str, Any] = None @@ -326,12 +365,25 @@ class CiaynAgent: empty_response_count += 1 logger.warning(f"Model returned empty response (count: {empty_response_count})") + cpm( + f"The model returned an empty response (attempt {empty_response_count} of {max_empty_responses}). Requesting the model to make a valid tool call.", + title="⚠ Empty Response", + border_style="yellow bold" + ) + if empty_response_count >= max_empty_responses: # If we've had too many empty responses, raise an error to break the loop from ra_aid.agent_context import mark_agent_crashed crash_message = "Agent failed to make any tool calls after multiple attempts" mark_agent_crashed(crash_message) logger.error(crash_message) + + cpm( + "The agent has crashed after multiple failed attempts to generate a valid tool call.", + title="❗ Agent Crashed", + border_style="red bold" + ) + yield self._create_error_chunk(crash_message) return @@ -350,6 +402,11 @@ class CiaynAgent: yield {} except ToolExecutionError as e: + cpm( + f"Tool execution error: {str(e)}. Attempting fallback...", + title="↻ Fallback Attempt", + border_style="yellow" + ) fallback_response = self.fallback_handler.handle_failure( e, self, self.chat_history )