chore: standardize string quotes and fix import ordering across multiple modules
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from pr.autonomous.detection import is_task_complete
|
||||
from pr.autonomous.mode import run_autonomous_mode, process_response_autonomous
|
||||
from pr.autonomous.mode import process_response_autonomous, run_autonomous_mode
|
||||
|
||||
__all__ = ['is_task_complete', 'run_autonomous_mode', 'process_response_autonomous']
|
||||
__all__ = ["is_task_complete", "run_autonomous_mode", "process_response_autonomous"]
|
||||
|
||||
+21
-10
@@ -1,28 +1,39 @@
|
||||
from pr.config import MAX_AUTONOMOUS_ITERATIONS
|
||||
from pr.ui import Colors
|
||||
|
||||
|
||||
def is_task_complete(response, iteration):
|
||||
if 'error' in response:
|
||||
if "error" in response:
|
||||
return True
|
||||
|
||||
if 'choices' not in response or not response['choices']:
|
||||
if "choices" not in response or not response["choices"]:
|
||||
return True
|
||||
|
||||
message = response['choices'][0]['message']
|
||||
content = message.get('content', '').lower()
|
||||
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'
|
||||
"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'
|
||||
"cannot proceed",
|
||||
"unable to continue",
|
||||
"fatal error",
|
||||
"cannot complete",
|
||||
"impossible to",
|
||||
]
|
||||
|
||||
has_tool_calls = 'tool_calls' in message and message['tool_calls']
|
||||
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)
|
||||
|
||||
|
||||
+105
-63
@@ -1,11 +1,13 @@
|
||||
import time
|
||||
import json
|
||||
import logging
|
||||
from pr.ui import Colors, display_tool_call, print_autonomous_header
|
||||
import time
|
||||
|
||||
from pr.autonomous.detection import is_task_complete
|
||||
from pr.core.context import truncate_tool_result
|
||||
from pr.ui import Colors, display_tool_call
|
||||
|
||||
logger = logging.getLogger("pr")
|
||||
|
||||
logger = logging.getLogger('pr')
|
||||
|
||||
def run_autonomous_mode(assistant, task):
|
||||
assistant.autonomous_mode = True
|
||||
@@ -14,25 +16,32 @@ def run_autonomous_mode(assistant, task):
|
||||
logger.debug(f"=== AUTONOMOUS MODE START ===")
|
||||
logger.debug(f"Task: {task}")
|
||||
|
||||
assistant.messages.append({
|
||||
"role": "user",
|
||||
"content": f"{task}"
|
||||
})
|
||||
assistant.messages.append({"role": "user", "content": f"{task}"})
|
||||
|
||||
try:
|
||||
while True:
|
||||
assistant.autonomous_iterations += 1
|
||||
|
||||
logger.debug(f"--- Autonomous iteration {assistant.autonomous_iterations} ---")
|
||||
logger.debug(f"Messages before context management: {len(assistant.messages)}")
|
||||
logger.debug(
|
||||
f"--- Autonomous iteration {assistant.autonomous_iterations} ---"
|
||||
)
|
||||
logger.debug(
|
||||
f"Messages before context management: {len(assistant.messages)}"
|
||||
)
|
||||
|
||||
from pr.core.context import manage_context_window
|
||||
assistant.messages = manage_context_window(assistant.messages, assistant.verbose)
|
||||
|
||||
logger.debug(f"Messages after context management: {len(assistant.messages)}")
|
||||
assistant.messages = manage_context_window(
|
||||
assistant.messages, assistant.verbose
|
||||
)
|
||||
|
||||
logger.debug(
|
||||
f"Messages after context management: {len(assistant.messages)}"
|
||||
)
|
||||
|
||||
from pr.core.api import call_api
|
||||
from pr.tools.base import get_tools_definition
|
||||
|
||||
response = call_api(
|
||||
assistant.messages,
|
||||
assistant.model,
|
||||
@@ -40,10 +49,10 @@ def run_autonomous_mode(assistant, task):
|
||||
assistant.api_key,
|
||||
assistant.use_tools,
|
||||
get_tools_definition(),
|
||||
verbose=assistant.verbose
|
||||
verbose=assistant.verbose,
|
||||
)
|
||||
|
||||
if 'error' in response:
|
||||
if "error" in response:
|
||||
logger.error(f"API error in autonomous mode: {response['error']}")
|
||||
print(f"{Colors.RED}Error: {response['error']}{Colors.RESET}")
|
||||
break
|
||||
@@ -74,22 +83,23 @@ def run_autonomous_mode(assistant, task):
|
||||
assistant.autonomous_mode = False
|
||||
logger.debug("=== AUTONOMOUS MODE END ===")
|
||||
|
||||
|
||||
def process_response_autonomous(assistant, response):
|
||||
if 'error' in response:
|
||||
if "error" in response:
|
||||
return f"Error: {response['error']}"
|
||||
|
||||
if 'choices' not in response or not response['choices']:
|
||||
if "choices" not in response or not response["choices"]:
|
||||
return "No response from API"
|
||||
|
||||
message = response['choices'][0]['message']
|
||||
message = response["choices"][0]["message"]
|
||||
assistant.messages.append(message)
|
||||
|
||||
if 'tool_calls' in message and message['tool_calls']:
|
||||
if "tool_calls" in message and message["tool_calls"]:
|
||||
tool_results = []
|
||||
|
||||
for tool_call in message['tool_calls']:
|
||||
func_name = tool_call['function']['name']
|
||||
arguments = json.loads(tool_call['function']['arguments'])
|
||||
for tool_call in message["tool_calls"]:
|
||||
func_name = tool_call["function"]["name"]
|
||||
arguments = json.loads(tool_call["function"]["arguments"])
|
||||
|
||||
result = execute_single_tool(assistant, func_name, arguments)
|
||||
result = truncate_tool_result(result)
|
||||
@@ -97,16 +107,19 @@ def process_response_autonomous(assistant, response):
|
||||
status = "success" if result.get("status") == "success" else "error"
|
||||
display_tool_call(func_name, arguments, status, result)
|
||||
|
||||
tool_results.append({
|
||||
"tool_call_id": tool_call['id'],
|
||||
"role": "tool",
|
||||
"content": json.dumps(result)
|
||||
})
|
||||
tool_results.append(
|
||||
{
|
||||
"tool_call_id": tool_call["id"],
|
||||
"role": "tool",
|
||||
"content": json.dumps(result),
|
||||
}
|
||||
)
|
||||
|
||||
for result in tool_results:
|
||||
assistant.messages.append(result)
|
||||
from pr.core.api import call_api
|
||||
from pr.tools.base import get_tools_definition
|
||||
|
||||
follow_up = call_api(
|
||||
assistant.messages,
|
||||
assistant.model,
|
||||
@@ -114,59 +127,88 @@ def process_response_autonomous(assistant, response):
|
||||
assistant.api_key,
|
||||
assistant.use_tools,
|
||||
get_tools_definition(),
|
||||
verbose=assistant.verbose
|
||||
verbose=assistant.verbose,
|
||||
)
|
||||
return process_response_autonomous(assistant, follow_up)
|
||||
|
||||
content = message.get('content', '')
|
||||
content = message.get("content", "")
|
||||
from pr.ui import render_markdown
|
||||
|
||||
return render_markdown(content, assistant.syntax_highlighting)
|
||||
|
||||
|
||||
def execute_single_tool(assistant, func_name, arguments):
|
||||
logger.debug(f"Executing tool in autonomous mode: {func_name}")
|
||||
logger.debug(f"Tool arguments: {arguments}")
|
||||
|
||||
from pr.tools import (
|
||||
http_fetch, run_command, run_command_interactive, read_file, write_file,
|
||||
list_directory, mkdir, chdir, getpwd, db_set, db_get, db_query,
|
||||
web_search, web_search_news, python_exec, index_source_directory,
|
||||
search_replace, open_editor, editor_insert_text, editor_replace_text,
|
||||
editor_search, close_editor, create_diff, apply_patch, tail_process, kill_process
|
||||
apply_patch,
|
||||
chdir,
|
||||
close_editor,
|
||||
create_diff,
|
||||
db_get,
|
||||
db_query,
|
||||
db_set,
|
||||
editor_insert_text,
|
||||
editor_replace_text,
|
||||
editor_search,
|
||||
getpwd,
|
||||
http_fetch,
|
||||
index_source_directory,
|
||||
kill_process,
|
||||
list_directory,
|
||||
mkdir,
|
||||
open_editor,
|
||||
python_exec,
|
||||
read_file,
|
||||
run_command,
|
||||
run_command_interactive,
|
||||
search_replace,
|
||||
tail_process,
|
||||
web_search,
|
||||
web_search_news,
|
||||
write_file,
|
||||
)
|
||||
from pr.tools.filesystem import (
|
||||
clear_edit_tracker,
|
||||
display_edit_summary,
|
||||
display_edit_timeline,
|
||||
)
|
||||
from pr.tools.patch import display_file_diff
|
||||
from pr.tools.filesystem import display_edit_summary, display_edit_timeline, clear_edit_tracker
|
||||
|
||||
func_map = {
|
||||
'http_fetch': lambda **kw: http_fetch(**kw),
|
||||
'run_command': lambda **kw: run_command(**kw),
|
||||
'tail_process': lambda **kw: tail_process(**kw),
|
||||
'kill_process': lambda **kw: kill_process(**kw),
|
||||
'run_command_interactive': lambda **kw: run_command_interactive(**kw),
|
||||
'read_file': lambda **kw: read_file(**kw),
|
||||
'write_file': lambda **kw: write_file(**kw, db_conn=assistant.db_conn),
|
||||
'list_directory': lambda **kw: list_directory(**kw),
|
||||
'mkdir': lambda **kw: mkdir(**kw),
|
||||
'chdir': lambda **kw: chdir(**kw),
|
||||
'getpwd': lambda **kw: getpwd(**kw),
|
||||
'db_set': lambda **kw: db_set(**kw, db_conn=assistant.db_conn),
|
||||
'db_get': lambda **kw: db_get(**kw, db_conn=assistant.db_conn),
|
||||
'db_query': lambda **kw: db_query(**kw, db_conn=assistant.db_conn),
|
||||
'web_search': lambda **kw: web_search(**kw),
|
||||
'web_search_news': lambda **kw: web_search_news(**kw),
|
||||
'python_exec': lambda **kw: python_exec(**kw, python_globals=assistant.python_globals),
|
||||
'index_source_directory': lambda **kw: index_source_directory(**kw),
|
||||
'search_replace': lambda **kw: search_replace(**kw),
|
||||
'open_editor': lambda **kw: open_editor(**kw),
|
||||
'editor_insert_text': lambda **kw: editor_insert_text(**kw),
|
||||
'editor_replace_text': lambda **kw: editor_replace_text(**kw),
|
||||
'editor_search': lambda **kw: editor_search(**kw),
|
||||
'close_editor': lambda **kw: close_editor(**kw),
|
||||
'create_diff': lambda **kw: create_diff(**kw),
|
||||
'apply_patch': lambda **kw: apply_patch(**kw),
|
||||
'display_file_diff': lambda **kw: display_file_diff(**kw),
|
||||
'display_edit_summary': lambda **kw: display_edit_summary(),
|
||||
'display_edit_timeline': lambda **kw: display_edit_timeline(**kw),
|
||||
'clear_edit_tracker': lambda **kw: clear_edit_tracker(),
|
||||
"http_fetch": lambda **kw: http_fetch(**kw),
|
||||
"run_command": lambda **kw: run_command(**kw),
|
||||
"tail_process": lambda **kw: tail_process(**kw),
|
||||
"kill_process": lambda **kw: kill_process(**kw),
|
||||
"run_command_interactive": lambda **kw: run_command_interactive(**kw),
|
||||
"read_file": lambda **kw: read_file(**kw),
|
||||
"write_file": lambda **kw: write_file(**kw, db_conn=assistant.db_conn),
|
||||
"list_directory": lambda **kw: list_directory(**kw),
|
||||
"mkdir": lambda **kw: mkdir(**kw),
|
||||
"chdir": lambda **kw: chdir(**kw),
|
||||
"getpwd": lambda **kw: getpwd(**kw),
|
||||
"db_set": lambda **kw: db_set(**kw, db_conn=assistant.db_conn),
|
||||
"db_get": lambda **kw: db_get(**kw, db_conn=assistant.db_conn),
|
||||
"db_query": lambda **kw: db_query(**kw, db_conn=assistant.db_conn),
|
||||
"web_search": lambda **kw: web_search(**kw),
|
||||
"web_search_news": lambda **kw: web_search_news(**kw),
|
||||
"python_exec": lambda **kw: python_exec(
|
||||
**kw, python_globals=assistant.python_globals
|
||||
),
|
||||
"index_source_directory": lambda **kw: index_source_directory(**kw),
|
||||
"search_replace": lambda **kw: search_replace(**kw),
|
||||
"open_editor": lambda **kw: open_editor(**kw),
|
||||
"editor_insert_text": lambda **kw: editor_insert_text(**kw),
|
||||
"editor_replace_text": lambda **kw: editor_replace_text(**kw),
|
||||
"editor_search": lambda **kw: editor_search(**kw),
|
||||
"close_editor": lambda **kw: close_editor(**kw),
|
||||
"create_diff": lambda **kw: create_diff(**kw),
|
||||
"apply_patch": lambda **kw: apply_patch(**kw),
|
||||
"display_file_diff": lambda **kw: display_file_diff(**kw),
|
||||
"display_edit_summary": lambda **kw: display_edit_summary(),
|
||||
"display_edit_timeline": lambda **kw: display_edit_timeline(**kw),
|
||||
"clear_edit_tracker": lambda **kw: clear_edit_tracker(),
|
||||
}
|
||||
|
||||
if func_name in func_map:
|
||||
|
||||
Reference in New Issue
Block a user