Check if task is done. This is the default behavior. Derived classes can override this. Args: result (ChatDocument|None): result from a responder r (Responder|None): responder that produced the result Not used here, but could be used b
(
self, result: ChatDocument | None = None, r: Responder | None = None
)
| 1989 | return dominant_msgs == recent_msgs |
| 1990 | |
| 1991 | def done( |
| 1992 | self, result: ChatDocument | None = None, r: Responder | None = None |
| 1993 | ) -> Tuple[bool, StatusCode]: |
| 1994 | """ |
| 1995 | Check if task is done. This is the default behavior. |
| 1996 | Derived classes can override this. |
| 1997 | Args: |
| 1998 | result (ChatDocument|None): result from a responder |
| 1999 | r (Responder|None): responder that produced the result |
| 2000 | Not used here, but could be used by derived classes. |
| 2001 | Returns: |
| 2002 | bool: True if task is done, False otherwise |
| 2003 | StatusCode: status code indicating why task is done |
| 2004 | """ |
| 2005 | if self._is_kill(): |
| 2006 | return (True, StatusCode.KILL) |
| 2007 | result = result or self.pending_message |
| 2008 | |
| 2009 | # Check if task should be done if message contains a tool |
| 2010 | if self.config.done_if_tool and result is not None: |
| 2011 | if isinstance(result, ChatDocument) and self.agent.try_get_tool_messages( |
| 2012 | result, all_tools=True |
| 2013 | ): |
| 2014 | return (True, StatusCode.DONE) |
| 2015 | |
| 2016 | # Check done sequences |
| 2017 | if self._parsed_done_sequences and result is not None: |
| 2018 | # Get the message chain from the current result |
| 2019 | msg_chain = self._get_message_chain(result) |
| 2020 | |
| 2021 | # Use last responder if r not provided |
| 2022 | responder = r if r is not None else self._last_responder |
| 2023 | |
| 2024 | # Check each sequence |
| 2025 | for sequence in self._parsed_done_sequences: |
| 2026 | if self._matches_sequence_with_current( |
| 2027 | msg_chain, sequence, result, responder |
| 2028 | ): |
| 2029 | seq_name = sequence.name or "unnamed" |
| 2030 | logger.info(f"Task {self.name} done: matched sequence '{seq_name}'") |
| 2031 | return (True, StatusCode.DONE) |
| 2032 | |
| 2033 | allow_done_string = self.config.recognize_string_signals |
| 2034 | # An entity decided task is done, either via DoneTool, |
| 2035 | # or by explicitly saying DONE |
| 2036 | done_result = result is not None and ( |
| 2037 | ( |
| 2038 | DONE in (result.content if isinstance(result, str) else result.content) |
| 2039 | and allow_done_string |
| 2040 | ) |
| 2041 | or any( |
| 2042 | isinstance(t, (DoneTool, AgentDoneTool, FinalResultTool)) |
| 2043 | for t in result.tool_messages |
| 2044 | ) |
| 2045 | ) |
| 2046 | |
| 2047 | user_quit = ( |
| 2048 | result is not None |
no test coverage detected