|
from pr.config import MAX_AUTONOMOUS_ITERATIONS
|
|
from pr.ui import Colors
|
|
|
|
def is_task_complete(response, iteration):
|
|
if 'error' in response:
|
|
return True
|
|
|
|
if 'choices' not in response or not response['choices']:
|
|
return True
|
|
|
|
message = response['choices'][0]['message']
|
|
content = message.get('content', '').lower()
|
|
|
|
completion_keywords = [
|
|
'task complete', 'task is complete', 'finished', 'done',
|
|
'successfully completed', 'task accomplished', 'all done',
|
|
'implementation complete', 'setup complete', 'installation complete'
|
|
]
|
|
|
|
error_keywords = [
|
|
'cannot proceed', 'unable to continue', 'fatal error',
|
|
'cannot complete', 'impossible to'
|
|
]
|
|
|
|
has_tool_calls = 'tool_calls' in message and message['tool_calls']
|
|
mentions_completion = any(keyword in content for keyword in completion_keywords)
|
|
mentions_error = any(keyword in content for keyword in error_keywords)
|
|
|
|
if mentions_error:
|
|
return True
|
|
|
|
if mentions_completion and not has_tool_calls:
|
|
return True
|
|
|
|
if iteration > 5 and not has_tool_calls:
|
|
return True
|
|
|
|
if iteration >= MAX_AUTONOMOUS_ITERATIONS:
|
|
print(f"{Colors.YELLOW}⚠ Maximum iterations reached{Colors.RESET}")
|
|
return True
|
|
|
|
return False
|