From 757f565041819627302d84de8a7c9ba47b5244d6 Mon Sep 17 00:00:00 2001 From: Vyacheslav Artemyev Date: Tue, 17 Jun 2025 10:01:26 +0300 Subject: [PATCH 1/3] fix kb --- db/chunks.json | 38 ++++++++++++++++---------------- db/embeddings.npy | Bin 147584 -> 147584 bytes main.py | 10 ++++----- scripts/build_knowledge_base.py | 18 +++++---------- 4 files changed, 29 insertions(+), 37 deletions(-) diff --git a/db/chunks.json b/db/chunks.json index cef79a3..8848241 100644 --- a/db/chunks.json +++ b/db/chunks.json @@ -1,6 +1,6 @@ [ { - "text": "Testing Guidelines\n1. Test Structure: Arrange-Act-Assert (AAA)\nAll tests should follow the AAA pattern for clarity and readability. Arrange: Prepare all necessary data and mocks. Act: Call the function or method being tested. Assert: Check that the result meets expectations. ```python def test_user_creation(): # Arrange user_data = {\"username\": \"test\", \"email\": \"test@example.com\"} mock_db = MagicMock()\n# Act\ncreated_user = create_user(db=mock_db, data=user_data)", + "text": "Testing Guidelines\n1. Test Structure: Arrange-Act-Assert (AAA)\nAll tests should follow the AAA pattern for clarity and readability.\nArrange: Prepare all necessary data and mocks.\nAct: Call the function or method being tested.\nAssert: Check that the result meets expectations.\n```python def test_user_creation(): # Arrange user_data = {\"username\": \"test\", \"email\": \"test@example.com\"} mock_db = MagicMock()\n# Act\ncreated_user = create_user(db=mock_db, data=user_data)", "source": "testing_guidelines.md", "metadata": { "tags": [], @@ -9,7 +9,7 @@ } }, { - "text": "# Assert\nassert created_user.username == user_data[\"username\"]\nmock_db.add.assert_called_once()\n```\n2. Test Naming\nTest function names should be descriptive and start with test_. Follow the format test___. Example: test_add_items_with_negative_quantity_raises_error()\n3. Use pytest.raises for Exception Testing\nTo verify that code correctly raises exceptions, use the pytest.raises context manager. ```python import pytest\ndef test_divide_by_zero_raises_exception(): with pytest.raises(ZeroDivisionError): divide(10, 0) ```", + "text": "# Assert\nassert created_user.username == user_data[\"username\"]\nmock_db.add.assert_called_once()\n```\n2. Test Naming\nTest function names should be descriptive and start with test_. Follow the format test___.\nExample: test_add_items_with_negative_quantity_raises_error()\n3. Use pytest.raises for Exception Testing\nTo verify that code correctly raises exceptions, use the pytest.raises context manager.\n```python import pytest\ndef test_divide_by_zero_raises_exception(): with pytest.raises(ZeroDivisionError): divide(10, 0) ```", "source": "testing_guidelines.md", "metadata": { "tags": [], @@ -18,7 +18,7 @@ } }, { - "text": "Error Handling Principles\n1. Prefer Specific Exceptions\nAlways catch the most specific exception type possible. Avoid using except Exception: unless absolutely necessary. Bad: python try: # some code except Exception as e: log.error(\"An error occurred\")\nGood: python try: # some code except FileNotFoundError as e: log.error(f\"File not found: {e}\") except (KeyError, ValueError) as e: log.warning(f\"Data error: {e}\")\n2. Use Custom Exceptions\nFor errors specific to your application's domain logic, create your own exception classes.", + "text": "Error Handling Principles\n1. Prefer Specific Exceptions\nAlways catch the most specific exception type possible. Avoid using except Exception: unless absolutely necessary.\nBad: python try: # some code except Exception as e: log.error(\"An error occurred\")\nGood: python try: # some code except FileNotFoundError as e: log.error(f\"File not found: {e}\") except (KeyError, ValueError) as e: log.warning(f\"Data error: {e}\")\n2. Use Custom Exceptions", "source": "error_handling.md", "metadata": { "tags": [], @@ -27,7 +27,7 @@ } }, { - "text": "This makes the code more readable and allows calling code to handle specific failures precisely. ```python class InsufficientBalanceError(Exception): \"\"\"Exception raised when the account balance is too low.\"\"\" pass\ndef withdraw(amount): if amount > current_balance: raise InsufficientBalanceError(\"Insufficient funds in the account\") ```\n3. Log Errors Correctly\nWhen catching an exception, be sure to log the full information, including the stack trace, to simplify debugging. ```python import logging\ntry: # ... except Exception as e: logging.error(\"An unexpected error occurred\", exc_info=True)", + "text": "For errors specific to your application's domain logic, create your own exception classes. This makes the code more readable and allows calling code to handle specific failures precisely.\n```python class InsufficientBalanceError(Exception): \"\"\"Exception raised when the account balance is too low.\"\"\" pass\ndef withdraw(amount): if amount > current_balance: raise InsufficientBalanceError(\"Insufficient funds in the account\") ```\n3. Log Errors Correctly\nWhen catching an exception, be sure to log the full information, including the stack trace, to simplify debugging.\n```python import logging", "source": "error_handling.md", "metadata": { "tags": [], @@ -36,43 +36,43 @@ } }, { - "text": "API Design Principles\nResources: Use plural nouns for endpoint naming (e.g., /users, /products). HTTP Methods: Use the correct HTTP verbs for actions:\nGET for retrieving data. POST for creating new resources. PUT / PATCH for updating. DELETE for deleting. Versioning: Include the API version in the URL (e.g., /api/v1/users).", - "source": "api_design.md", + "text": "try: # ... except Exception as e: logging.error(\"An unexpected error occurred\", exc_info=True)", + "source": "error_handling.md", "metadata": { "tags": [], - "full_path": "knowledge/api_design.md", - "chunk_id": "api_design.md_0" + "full_path": "knowledge/error_handling.md", + "chunk_id": "error_handling.md_2" } }, { - "text": "Python Style Guide\nNaming: Use snake_case for variables and functions. Class names should use CamelCase. Constants should be in UPPER_SNAKE_CASE. Line Length: The maximum line length is 99 characters. Docstrings: All public modules, functions, classes, and methods must have Google-style docstrings. Imports: Group imports in the following order: standard library, third-party libraries, local application. String Formatting\nf-strings: Always prefer f-strings for formatting instead of str.format() or the % operator.", - "source": "python_style_guide.md", + "text": "API Design Principles\nResources: Use plural nouns for endpoint naming (e.g., /users, /products).\nHTTP Methods: Use the correct HTTP verbs for actions:\nGET for retrieving data.\nPOST for creating new resources.\nPUT / PATCH for updating.\nDELETE for deleting.\nVersioning: Include the API version in the URL (e.g., /api/v1/users).", + "source": "api_design.md", "metadata": { "tags": [], - "full_path": "knowledge/python_style_guide.md", - "chunk_id": "python_style_guide.md_0" + "full_path": "knowledge/api_design.md", + "chunk_id": "api_design.md_0" } }, { - "text": "Good: user_info = f\"User {user.name} with ID {user.id}\"\nBad: user_info = \"User {} with ID {}\".format(user.name, user.id)\nList Comprehensions\nSimplicity: Use list comprehensions to create lists from existing iterables, but only if the logic remains simple and readable. If complex logic or multiple nested loops are required, use a regular for loop.", + "text": "Python Style Guide\nNaming: Use snake_case for variables and functions. Class names should use CamelCase. Constants should be in UPPER_SNAKE_CASE.\nLine Length: The maximum line length is 99 characters.\nDocstrings: All public modules, functions, classes, and methods must have Google-style docstrings.\nImports: Group imports in the following order: standard library, third-party libraries, local application.\nString Formatting\nf-strings: Always prefer f-strings for formatting instead of str.format() or the % operator.\nGood: user_info = f\"User {user.name} with ID {user.id}\"", "source": "python_style_guide.md", "metadata": { "tags": [], "full_path": "knowledge/python_style_guide.md", - "chunk_id": "python_style_guide.md_1" + "chunk_id": "python_style_guide.md_0" } }, { - "text": "Good: squares = [x*x for x in range(10)]\nAvoid (hard to read): complex_list = [x + y for x in range(10) for y in range(5) if x % 2 == 0 if y % 3 == 0]", + "text": "Bad: user_info = \"User {} with ID {}\".format(user.name, user.id)\nList Comprehensions\nSimplicity: Use list comprehensions to create lists from existing iterables, but only if the logic remains simple and readable. If complex logic or multiple nested loops are required, use a regular for loop.\nGood: squares = [x*x for x in range(10)]\nAvoid (hard to read): complex_list = [x + y for x in range(10) for y in range(5) if x % 2 == 0 if y % 3 == 0]", "source": "python_style_guide.md", "metadata": { "tags": [], "full_path": "knowledge/python_style_guide.md", - "chunk_id": "python_style_guide.md_2" + "chunk_id": "python_style_guide.md_1" } }, { - "text": "Agent Tool Creation Guide\nThis document outlines the best practices for creating new tool functions that can be used by AI agents in our system. 1. Tool Function Structure\nEvery tool must be a wrapper around the core logic and accept a single argument of type Dict[str, Any]. This ensures a unified interface for all tools. ```python\nCorrect\ndef my_tool(input_data: Dict[str, Any]) -> str: #... Incorrect\ndef my_tool(param1: str, param2: int) -> str: #... ```\n2. Mandatory Error Handling\nA tool should never crash with an unhandled exception.", + "text": "Agent Tool Creation Guide\nThis document outlines the best practices for creating new tool functions that can be used by AI agents in our system.\n1. Tool Function Structure\nEvery tool must be a wrapper around the core logic and accept a single argument of type Dict[str, Any]. This ensures a unified interface for all tools.\n```python\nCorrect\ndef my_tool(input_data: Dict[str, Any]) -> str: #...\nIncorrect\ndef my_tool(param1: str, param2: int) -> str: #... ```\n2. Mandatory Error Handling", "source": "tool_creation_guide.md", "metadata": { "tags": [ @@ -83,7 +83,7 @@ } }, { - "text": "Always use try-except and return an informative error message as a string. python def substring_tool(input_data: Dict[str, Any]) -> str: try: text = input_data['text'] start = input_data['start'] # ... core logic ... return result except KeyError as e: return f\"Error: Missing required key {e} in input_data.\" except Exception as e: return f\"An unexpected error occurred: {e}\"\n3. Detailed Docstrings\nAlways write detailed docstrings in Google-style. Describe the function's purpose, all keys in the input_data dictionary, and the return value. 4.", + "text": "A tool should never crash with an unhandled exception. Always use try-except and return an informative error message as a string.\npython def substring_tool(input_data: Dict[str, Any]) -> str: try: text = input_data['text'] start = input_data['start'] # ... core logic ... return result except KeyError as e: return f\"Error: Missing required key {e} in input_data.\" except Exception as e: return f\"An unexpected error occurred: {e}\"\n3. Detailed Docstrings", "source": "tool_creation_guide.md", "metadata": { "tags": [ @@ -94,7 +94,7 @@ } }, { - "text": "Tool Definition (_tool_def)\nEvery tool must have a corresponding _tool_def definition. This is a dictionary that describes the function's signature for the OpenAI API, allowing the agent to understand how to call your tool.", + "text": "Always write detailed docstrings in Google-style. Describe the function's purpose, all keys in the input_data dictionary, and the return value.\n4. Tool Definition (_tool_def)\nEvery tool must have a corresponding _tool_def definition. This is a dictionary that describes the function's signature for the OpenAI API, allowing the agent to understand how to call your tool.", "source": "tool_creation_guide.md", "metadata": { "tags": [ diff --git a/db/embeddings.npy b/db/embeddings.npy index d192fff4c621826cde84f3118c2274016fc8688c..d3dae643c21a6a912034617b5d0ea5bbffa62c36 100644 GIT binary patch literal 147584 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≷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 hpSnTzjk=fQggTw#0_<#f+aaZT<{{#8t5$yl~ literal 147584 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 diff --git a/main.py b/main.py index 0335b92..ab3df99 100644 --- a/main.py +++ b/main.py @@ -28,8 +28,8 @@ def main(): model = "gpt-4o-mini" - print("--- Multi-Agent System Initialized ---") - print("Enter your request. Type 'exit' to close.") + logging.info("--- Multi-Agent System Initialized ---") + logging.info("Enter your request. Type 'exit' to close.") orchestrator = Orchestrator(api_key=api_key, model=model) @@ -37,7 +37,7 @@ def main(): while True: user_query = input("\033[94mYou > \033[0m") if user_query.lower() in ['exit', 'quit']: - print("Shutting down...") + logging.info("Shutting down...") break if not user_query.strip(): @@ -46,10 +46,10 @@ def main(): # The orchestrator handles the entire process final_result = orchestrator.run(user_query) - print(f"\033[92mFinal Answer >\033[0m {final_result}") + logging.info(f"\033[92mFinal Answer >\033[0m {final_result}") except (KeyboardInterrupt, EOFError): - print("\nShutting down...") + logging.error("\nShutting down...") if __name__ == "__main__": main() \ No newline at end of file diff --git a/scripts/build_knowledge_base.py b/scripts/build_knowledge_base.py index acf4692..19c09b8 100644 --- a/scripts/build_knowledge_base.py +++ b/scripts/build_knowledge_base.py @@ -14,7 +14,7 @@ from openai import OpenAI from unstructured.partition.md import partition_md from rank_bm25 import BM25Okapi -from semchunk.chunker import SemanticChunker +import semchunk # --- Configuration --- load_dotenv() @@ -38,18 +38,10 @@ raise ValueError("OPENAI_API_KEY is not set in the environment variables.") client = OpenAI(api_key=api_key) +# Initialize the semantic chunker from isaacus-dev/semchunk +# This chunker works with token counts, not embedding models. tokenizer = tiktoken.get_encoding("cl100k_base") -# Initialize the semantic chunker -semantic_chunker = SemanticChunker( - embed_model=client, - model_name=EMBEDDING_MODEL, - max_chunk_size=TEXT_CHUNK_MAX_TOKENS, - # The 'breakpoint_percentile_threshold' is a key parameter to tune. - # It determines how different two sentences must be to create a split. - # Lower value = more splits, higher value = fewer splits. - # Let's start with a value that often works well. - breakpoint_percentile_threshold=90 -) +chunker = semchunk.chunkerify(tokenizer, TEXT_CHUNK_MAX_TOKENS) def load_and_partition_documents(directory: Path) -> List[Dict[str, Any]]: """ @@ -90,7 +82,7 @@ def semantic_chunk_document(doc: Dict[str, Any]) -> List[Dict[str, Any]]: logging.info(f"Semantically chunking '{doc['source']}'...") try: # The chunker returns a list of text strings - chunk_texts = semantic_chunker.chunk(doc["text"]) + chunk_texts = chunker(doc["text"]) chunks_with_metadata = [] for i, chunk_text in enumerate(chunk_texts): From 420f9a971eea1fd6114e575188bfa4a361316f73 Mon Sep 17 00:00:00 2001 From: Vyacheslav Artemyev Date: Tue, 17 Jun 2025 13:05:07 +0300 Subject: [PATCH 2/3] fix --- app/agents/agent.py | 191 ++++++++++++++++------------ app/agents/roles/coding_agent.py | 13 +- app/agents/roles/standard_roles.py | 65 ++++++---- app/agents/roles/task_decomposer.py | 50 ++++---- app/agents/tools.py | 75 +++-------- app/factory/agent_factory.py | 86 +++---------- app/orchestration/orchestrator.py | 177 +++++++++----------------- db/memory.db | Bin 12288 -> 12288 bytes 8 files changed, 273 insertions(+), 384 deletions(-) diff --git a/app/agents/agent.py b/app/agents/agent.py index 81f5f9f..774335e 100644 --- a/app/agents/agent.py +++ b/app/agents/agent.py @@ -15,12 +15,31 @@ from app.agents.tools import ( read_file_tool, read_file_tool_def, list_files_tool, list_files_tool_def, + write_to_file_tool, write_to_file_tool_def, ) from app.agents.web_search_tool import web_search_tool, web_search_tool_def from app.agents.memory_tool import save_memory_tool, save_memory_tool_def from app.memory.memory_manager import MemoryManager from app.safety.custom_guardrails import CustomGuardrailManager +def _extract_json_from_response(response_text: str) -> Optional[str]: + """ + Extracts a JSON object from a string that might be wrapped in markdown code blocks. + """ + # Regex to find JSON wrapped in ```json ... ``` or just ``` ... ``` + match = re.search(r'```(json\s*)?(?P\{.*?\})```', response_text, re.DOTALL) + if match: + return match.group('json') + + # If no markdown block is found, assume the whole string is a JSON object + # and try to find the start of a JSON object. + first_brace = response_text.find('{') + last_brace = response_text.rfind('}') + if first_brace != -1 and last_brace != -1: + return response_text[first_brace:last_brace+1] + + return None + class ToolExecutionError(Exception): """Custom exception for errors during tool execution.""" pass @@ -113,6 +132,7 @@ def __init__( # Add default tools self.add_tool(read_file_tool, read_file_tool_def) self.add_tool(list_files_tool, list_files_tool_def) + self.add_tool(write_to_file_tool, write_to_file_tool_def) self.add_tool(web_search_tool, web_search_tool_def) self.add_tool(save_memory_tool, save_memory_tool_def) @@ -247,35 +267,31 @@ def _get_user_input(self) -> Optional[str]: return None def _get_model_response(self) -> str: - """ - Отправляет текущую историю беседы в OpenAI и возвращает текстовый ответ модели. - """ + """Получает и возвращает ответ от модели.""" + logging.info(f"Sending request to OpenAI with {len(self.conversation_history)} messages.") try: - logging.info(f"Sending request to OpenAI with {len(self.conversation_history)} messages.") response = self.client.chat.completions.create( model=self.model, messages=self.conversation_history, - # Убираем tools и tool_choice, так как теперь мы парсим JSON + # tools=self.get_openai_tools(), + # tool_choice="auto", + temperature=0.1, + top_p=0.1, + response_format={"type": "json_object"} ) return response.choices[0].message.content or "" - except Exception as e: - logging.error(f"Error calling OpenAI API: {e}", exc_info=True) - return json.dumps({ - "thought": "An API error occurred. I cannot proceed.", - "answer": f"API Error: {e}" - }) + except APIError as e: + logging.error("OpenAI API error: %s", e) + return f'{{"thought": "Encountered an API error. I should try again.", "action": {{"name": "wait", "input": {{"seconds": 2}}}}}}' def execute_task(self, briefing: str) -> str: """ - Выполняет одну задачу на основе предоставленного брифинга, используя ReAct цикл. + Основной цикл выполнения задачи агентом. """ - logging.info(f"Agent {self.name} received task.") - - # 1. Prepare Prompts - knowledge_context = self._enrich_with_knowledge(self._create_rag_query(briefing)) if self.use_rag else "" + # 1. Формируем системный промпт tools_description = self._get_tools_description() memory_context = self._get_memory_context() - + system_prompt = self.system_prompt_template.format( agent_name=self.name, agent_role=self.role, @@ -284,81 +300,92 @@ def execute_task(self, briefing: str) -> str: memory_context=memory_context ) - final_system_prompt = f"{knowledge_context}\n{system_prompt}" + self.conversation_history = [{"role": "system", "content": system_prompt}] + self.conversation_history.append({"role": "user", "content": briefing}) - self.conversation_history = [ - {"role": "system", "content": final_system_prompt}, - {"role": "user", "content": briefing} - ] - - # 2. Start ReAct Loop + # 2. Основной цикл Reason-Act for i in range(self.max_iterations): logging.info(f"--- Iteration {i+1}/{self.max_iterations} ---") - model_response_str = self._get_model_response() - self.conversation_history.append({"role": "assistant", "content": model_response_str}) - + # 3. Получаем ответ от модели + response_text = self._get_model_response() + + # --- Guardrails Input Check --- + # guardrail_verdict = self.guardrail_manager.check_input(response_text) + # if guardrail_verdict: + # final_answer = f"Input check failed: {guardrail_verdict}" + # logging.warning(final_answer) + # self.conversation_history.append({"role": "assistant", "content": final_answer}) + # return final_answer + + # 4. Парсим JSON из ответа + json_response = None try: - parsed_response = json.loads(model_response_str) - thought = parsed_response.get("thought") - if thought: - logging.info(f"🤖 Thought: {thought}") - else: - raise ValueError("Missing 'thought' in response.") - - if parsed_response.get("answer"): - final_answer = parsed_response["answer"] - # Validate final answer with guardrails before returning - validated_answer = self.guardrail_manager.validate_and_format_response(final_answer) - logging.info(f"✅ Agent {self.name} finished task with answer: {validated_answer}") - return validated_answer - - elif parsed_response.get("tool"): - tool_name = parsed_response["tool"]["name"] - tool_input = parsed_response["tool"]["input"] + # Используем новую функцию для извлечения JSON + cleaned_response = _extract_json_from_response(response_text) + if not cleaned_response: + raise json.JSONDecodeError("No JSON object found in response", response_text, 0) + + json_response = json.loads(cleaned_response) + + self.conversation_history.append({"role": "assistant", "content": cleaned_response}) - if not tool_name: - raise ValueError("Missing 'name' in action.") + except json.JSONDecodeError: + error_message = f"Error parsing model response: Expecting value: line 1 column 1 (char 0). Response was: '{response_text}'" + logging.error(error_message) + # Добавляем сообщение об ошибке в историю, чтобы модель могла исправиться + self.conversation_history.append({ + "role": "user", + "content": f"Your last response was not a valid JSON. Please correct your output to be a single JSON object. Error: {error_message}" + }) + continue # Переходим к следующей итерации, чтобы модель могла исправиться + + # 5. Извлекаем мысль и действие/ответ + thought = json_response.get("thought") + action = json_response.get("action") + answer = json_response.get("answer") + + logging.info(f"Thought: {thought}") + + if answer: + logging.info(f"Final Answer: {answer}") + # --- Guardrails Output Check --- + # guardrail_verdict = self.guardrail_manager.check_output(answer) + # if guardrail_verdict: + # final_answer = f"Output check failed: {guardrail_verdict}" + # logging.warning(final_answer) + # return final_answer + + return answer - logging.info(f"🛠️ Action: Calling tool '{tool_name}' with input: {tool_input}") - tool_result = self._execute_tool(tool_name, tool_input) + if action: + tool_name = action.get("name") + tool_input = action.get("input", {}) + + if tool_name and isinstance(tool_input, dict): + logging.info(f"Action: {tool_name}({tool_input})") + try: + # 6. Выполняем инструмент + tool_result = self._execute_tool(tool_name, tool_input) + observation = f"Tool {tool_name} executed successfully. Result:\n{tool_result}" + except ToolExecutionError as e: + observation = str(e) # Используем сообщение из кастомного исключения - observation = f"Tool '{tool_name}' returned:\n```\n{tool_result}\n```" - logging.info(f"👀 Observation: {observation}") - self.conversation_history.append({"role": "user", "content": observation}) + logging.info(f"Observation: {observation}") + + # 7. Добавляем результат в историю для следующего шага + self.conversation_history.append({"role": "user", "content": f"Observation: {observation}"}) else: - raise ValueError("Response must contain 'action' or 'answer'.") - - except ToolExecutionError as e: - error_message = f"A tool failed to execute: {e}" - logging.error(error_message) - # Запускаем цикл рефлексии - reflection_prompt = ( - f"CRITICAL_ERROR: Your last action failed with the following error: '{e}'.\n" - "You MUST analyze this error and the execution history to understand what went wrong.\n" - "Then, devise a new plan. Either try a different approach, use a different tool, or modify the input to the tool.\n" - "Your next 'thought' MUST explain how you are correcting your course of action." - ) - self.conversation_history.append({"role": "user", "content": reflection_prompt}) - continue # Продолжаем цикл, чтобы агент мог ответить на сообщение об ошибке - - except (json.JSONDecodeError, ValueError) as e: - error_message = f"Error parsing model response: {e}. Response was: '{model_response_str}'" - logging.error(error_message) - # Даем агенту шанс исправиться - error_feedback = ( - f"Error: Your last response was not a valid JSON object. " - f"Please correct your output to strictly follow the required format. " - f"The `thought` field is mandatory, and you must include either an `action` or an `answer`. " - f"Error details: {e}" - ) - self.conversation_history.append({"role": "user", "content": error_feedback}) - continue + logging.warning("Invalid action format in model response.") + self.conversation_history.append({"role": "user", "content": "Observation: Invalid action format. Please provide a valid 'name' and 'input' for the action."}) + else: + logging.warning("Model did not provide an 'action' or 'answer'.") + # Просим модель предоставить либо действие, либо финальный ответ + self.conversation_history.append({"role": "user", "content": "Observation: You must provide either an 'action' or a final 'answer'."}) - warning_message = f"Agent {self.name} reached max iterations ({self.max_iterations}) without a final answer." - logging.warning(warning_message) - # Validate the warning message as well, in case it contains sensitive info (less likely but good practice) - return warning_message + final_answer = f"Agent {self.name} reached max iterations ({self.max_iterations}) without a final answer." + logging.warning(final_answer) + return final_answer def run(self) -> None: """Запускает основной цикл общения с агентом в интерактивном режиме.""" diff --git a/app/agents/roles/coding_agent.py b/app/agents/roles/coding_agent.py index f1a69ef..25179d8 100644 --- a/app/agents/roles/coding_agent.py +++ b/app/agents/roles/coding_agent.py @@ -3,8 +3,9 @@ from app.agents.agent import Agent from app.agents.tools import ( read_file_tool, read_file_tool_def, - edit_file_tool, edit_file_tool_def, + write_to_file_tool, write_to_file_tool_def, list_files_tool, list_files_tool_def, + run_tests_tool, run_tests_tool_def ) @@ -15,9 +16,10 @@ def __init__(self, name: str, role: str, goal: str, **kwargs): # Добавляем специфику роли в цель, чтобы она попала в основной промпт refined_goal = ( f"{goal}\n\n" - "IMPORTANT: Your primary goal is to make precise, targeted changes (surgical edits). " - "Do not rewrite entire files. Instead, identify the specific function, method, " - "or block of code that needs changing and use the 'edit_file_tool' to replace only that part." + "IMPORTANT: Your primary goal is to write high-quality, efficient, and clean Python code. " + "You must follow the provided coding standards. " + "When you need to modify a file, read its content first, then provide the full, complete, updated content to the 'write_to_file_tool'. " + "This tool will overwrite the entire file with your new content." ) super().__init__( @@ -28,8 +30,9 @@ def __init__(self, name: str, role: str, goal: str, **kwargs): ) # Self-register tools self.add_tool(read_file_tool, read_file_tool_def) - self.add_tool(edit_file_tool, edit_file_tool_def) self.add_tool(list_files_tool, list_files_tool_def) + self.add_tool(write_to_file_tool, write_to_file_tool_def) + self.add_tool(run_tests_tool, run_tests_tool_def) # Старый system_prompt и _create_initial_messages больше не нужны, # так как вся логика теперь в базовом классе Agent. \ No newline at end of file diff --git a/app/agents/roles/standard_roles.py b/app/agents/roles/standard_roles.py index 723e462..190c41a 100644 --- a/app/agents/roles/standard_roles.py +++ b/app/agents/roles/standard_roles.py @@ -1,43 +1,52 @@ -""" -This module defines the standard roles for specialized agents in the system. -""" +"""This module defines the standard agent roles and their configurations.""" -# Configuration for an agent specialized in file system operations +# Default configuration for a general-purpose agent +DEFAULT_AGENT = { + "name": "DefaultAgent", + "role": "A helpful and versatile AI assistant.", + "goal": "Fulfill the user's request to the best of your ability." +} + +# Configuration for a file system expert agent FILESYSTEM_EXPERT = { "name": "FileSystemExpert", - "role": "An expert in browsing and reading files on a local file system.", - "goal": "To help users understand the project structure by listing and reading files.", - "tools": ["list_files", "read_file", "save_memory"] + "role": "An expert in interacting with the local file system.", + "goal": "Manage files and directories, such as creating, reading, and writing files." } -# Configuration for an agent specialized in web searching +# Configuration for a web search expert agent WEB_SEARCH_EXPERT = { "name": "WebSearchExpert", - "role": "An expert in searching the web for real-time information.", - "goal": "To find the most relevant and up-to-date information online in response to a user's query.", - "tools": ["web_search", "save_memory"] + "role": "An expert in finding information on the web.", + "goal": "Answer questions and provide information by searching the web." } -# Add other specialized agent configurations here as needed. -# For example, a CodeWriterAgent, a DatabaseExpert, etc. +# Configuration for a coding agent +CODING_AGENT = { + "name": "CodingAgent", + "role": "A professional coder who writes high-quality, efficient, and clean Python code according to provided standards.", + "goal": "Write high-quality, efficient, and clean Python code according to provided standards." +} -ALL_ROLES = { - "FileSystemExpert": FILESYSTEM_EXPERT, - "WebSearchExpert": WEB_SEARCH_EXPERT, +# Configuration for a reviewer agent +REVIEWER_AGENT = { + "name": "ReviewerAgent", + "role": "A meticulous reviewer who ensures code quality, adherence to standards, and correctness.", + "goal": "Ensure code quality, adherence to standards, and correctness." } -# Configuration for the planner agent -PLANNER_AGENT = { - "name": "PlannerAgent", - "role": "A master planner who specializes in breaking down complex goals into a sequence of actionable steps for a team of specialized agents.", - "goal": "To create a clear, step-by-step JSON plan that efficiently leads to the user's desired outcome.", - "tools": [] # The planner does not use tools, it only thinks. +# Configuration for a testing agent +TESTING_AGENT = { + "name": "TestingAgent", + "role": "Software Quality Assurance Engineer", + "goal": "Thoroughly test code to find bugs and ensure reliability." } -# Configuration for the evaluator agent -EVALUATOR_AGENT = { - "name": "EvaluatorAgent", - "role": "A meticulous evaluator who analyzes multiple execution plans and selects the most optimal one.", - "goal": "To choose the most efficient, logical, and safe plan from a given set of options.", - "tools": [] # The evaluator only thinks and chooses. +# A dictionary of all available agent roles that the Orchestrator can assign tasks to. +ALL_ROLES = { + "FileSystemExpert": FILESYSTEM_EXPERT, + "WebSearchExpert": WEB_SEARCH_EXPERT, + "CodingAgent": CODING_AGENT, + "ReviewerAgent": REVIEWER_AGENT, + "TestingAgent": TESTING_AGENT, } \ No newline at end of file diff --git a/app/agents/roles/task_decomposer.py b/app/agents/roles/task_decomposer.py index 867aa19..90215dc 100644 --- a/app/agents/roles/task_decomposer.py +++ b/app/agents/roles/task_decomposer.py @@ -19,18 +19,33 @@ def __init__(self, name: str, role: str, goal: str, **kwargs): ) self.system_prompt = """ You are an expert project manager. Your task is to break down a high-level user goal into a concise, step-by-step plan. -Each step must be a single, clear action assigned to one of the available roles. +Each step must be a single, clear action assigned to an appropriate agent. +Combine simple, related actions into a single, comprehensive step. For example, instead of one step to create a file and another to write to it, create a single step that does both. -# AVAILABLE ROLES: -- CodingAgent: Writes, modifies, and fixes code. -- TestingAgent: Runs tests and reports results. -- ReviewerAgent: Performs code reviews, checking for quality and adherence to standards. -- EvaluatorAgent: Analyzes test failures and creates bug reports. +# AVAILABLE ROLES & THEIR KEY TOOLS: +- **FileSystemExpert**: Works with files. Key tool: `write_to_file_tool(path, content)`. +- **CodingAgent**: Writes, modifies, and fixes Python code. Key tool: `write_to_file_tool(path, content)`. +- **TestingAgent**: Runs tests. Key tool: `run_tests_tool(path)`. +- **ReviewerAgent**: Performs code reviews. Key tool: `read_file_tool(path)`. # OUTPUT FORMAT: Your output MUST be a single JSON object with a single key "plan", which contains a list of steps. Do not include any other text, explanation, or markdown code fences. -# EXAMPLE: +# EXAMPLE 1: Simple file operation +Goal: "Create a file named 'hello.txt' and write 'Hello World' in it." + +Your output: +{ + "plan": [ + { + "step": 1, + "agent": "FileSystemExpert", + "task": "Create a new file 'hello.txt' with the content 'Hello World'." + } + ] +} + +# EXAMPLE 2: More complex coding task Goal: "Create a function to add two numbers and test it." Your output: @@ -38,27 +53,18 @@ def __init__(self, name: str, role: str, goal: str, **kwargs): "plan": [ { "step": 1, - "assignee": "CodingAgent", - "task": "Create a new function 'add(a, b)' in 'app/utils/math.py'", - "description": "Implement the core logic for the addition function." + "agent": "CodingAgent", + "task": "Create a new file 'app/utils/math.py' with an 'add(a, b)' function that returns the sum of two numbers." }, { "step": 2, - "assignee": "ReviewerAgent", - "task": "Review the 'add' function in 'app/utils/math.py'", - "description": "Ensure the code quality and correctness of the new function." + "agent": "CodingAgent", + "task": "Create a new test file 'tests/test_math.py' to test the 'add' function. Include at least one test case." }, { "step": 3, - "assignee": "CodingAgent", - "task": "Create a new test file 'tests/test_math.py' with tests for the 'add' function", - "description": "Write unit tests to verify the behavior of the 'add' function." - }, - { - "step": 4, - "assignee": "TestingAgent", - "task": "Run the tests in 'tests/test_math.py'", - "description": "Execute the newly created tests to confirm the function works as expected." + "agent": "TestingAgent", + "task": "Run the tests in 'tests/test_math.py'." } ] } diff --git a/app/agents/tools.py b/app/agents/tools.py index 8930a05..0ecb94c 100644 --- a/app/agents/tools.py +++ b/app/agents/tools.py @@ -37,7 +37,7 @@ def list_files_tool(input_data: Dict[str, Any]) -> str: input_data (Dict[str, Any]): Словарь, который может содержать ключ 'path' с путем к директории. По умолчанию - текущая. Returns: - Отформатированное дерево файлов и директории в виде строки. + Отформатированное дерево файлов и директорий в виде строки. """ path = input_data.get("path", ".") if not os.path.isdir(path): @@ -58,66 +58,32 @@ def list_files_tool(input_data: Dict[str, Any]) -> str: return output.strip() -def edit_file_tool(input_data: Dict[str, Any]) -> str: +def write_to_file_tool(input_data: Dict[str, Any]) -> str: """ - Создает, перезаписывает, добавляет или заменяет контент в файле. - - 'overwrite': Полностью перезаписывает файл. - - 'append': Добавляет контент в конец файла. - - 'replace': Заменяет один фрагмент строки на другой. + Создает новый файл или полностью перезаписывает существующий. Args: input_data (Dict[str, Any]): Словарь, содержащий: 'path' (str): Путь к файлу. - 'mode' (str): Режим работы ('overwrite', 'append', 'replace'). - 'content' (str, optional): Содержимое для 'overwrite' или 'append'. - 'old_content' (str, optional): Исходный фрагмент для 'replace'. - 'new_content' (str, optional): Новый фрагмент для 'replace'. + 'content' (str): Содержимое для записи. """ path = input_data.get("path") - mode = input_data.get("mode", "overwrite") + content = input_data.get("content") - if not path: - return "Ошибка: Аргумент 'path' обязателен." - if mode not in ['overwrite', 'append', 'replace']: - return "Ошибка: Недопустимый режим. Используйте 'overwrite', 'append' или 'replace'." + if not path or content is None: + return "Ошибка: Аргументы 'path' и 'content' обязательны." try: + # Убедимся, что директория для файла существует directory = os.path.dirname(path) if directory: os.makedirs(directory, exist_ok=True) - - if mode == 'replace': - old_content = input_data.get("old_content") - new_content = input_data.get("new_content") - if old_content is None or new_content is None: - return "Ошибка: Для режима 'replace' необходимы 'old_content' и 'new_content'." - - with open(path, "r", encoding="utf-8") as f: - file_content = f.read() - - if old_content not in file_content: - return f"Ошибка: Исходный фрагмент 'old_content' не найден в файле '{path}'." - - file_content = file_content.replace(old_content, new_content, 1) - - with open(path, "w", encoding="utf-8") as f: - f.write(file_content) - return f"Файл '{path}' успешно обновлен в режиме 'replace'." - - else: # overwrite or append - content = input_data.get("content") - if content is None: - return f"Ошибка: Для режима '{mode}' обязателен аргумент 'content'." - - write_mode = "w" if mode == "overwrite" else "a" - with open(path, write_mode, encoding="utf-8") as f: - f.write(content) - return f"Файл '{path}' успешно обновлен в режиме '{mode}'." - - except FileNotFoundError: - return f"Ошибка: Файл не найден по пути '{path}'." + + with open(path, "w", encoding="utf-8") as f: + f.write(content) + return f"Файл '{path}' успешно создан/перезаписан." except Exception as e: - return f"Ошибка: Не удалось выполнить операцию с файлом '{path}': {e}" + return f"Ошибка: Не удалось записать в файл '{path}': {e}" def delete_file_tool(input_data: Dict[str, Any]) -> str: @@ -212,21 +178,18 @@ def run_tests_tool(input_data: Dict[str, Any]) -> str: }, } -edit_file_tool_def = { +write_to_file_tool_def = { "type": "function", "function": { - "name": "edit_file_tool", - "description": "Создает, перезаписывает, добавляет или заменяет контент в файле. Режимы: 'overwrite', 'append', 'replace'.", + "name": "write_to_file_tool", + "description": "Создает новый файл или полностью перезаписывает существующий указанным контентом.", "parameters": { "type": "object", "properties": { - "path": {"type": "string", "description": "Полный путь к файлу."}, - "mode": {"type": "string", "enum": ["overwrite", "append", "replace"], "description": "Режим записи."}, - "content": {"type": "string", "description": "Содержимое для 'overwrite' или 'append'."}, - "old_content": {"type": "string", "description": "Исходный фрагмент для 'replace'."}, - "new_content": {"type": "string", "description": "Новый фрагмент для 'replace'."}, + "path": {"type": "string", "description": "Полный путь к файлу (включая имя файла)."}, + "content": {"type": "string", "description": "Полное содержимое для записи в файл."}, }, - "required": ["path", "mode"], + "required": ["path", "content"], }, }, } diff --git a/app/factory/agent_factory.py b/app/factory/agent_factory.py index 36a148c..4f79597 100644 --- a/app/factory/agent_factory.py +++ b/app/factory/agent_factory.py @@ -1,75 +1,27 @@ """ -Factory for creating agent teams from configuration. +Factory for creating specialized agents. """ -import logging -import yaml -import os -from importlib import import_module -from typing import Dict, Tuple, Any, List +from typing import Dict, Any from app.agents.agent import Agent -from app.agents.roles.task_decomposer import TaskDecomposer -from app.agents.tools import read_file_tool, read_file_tool_def, list_files_tool, list_files_tool_def +from app.agents.tools import ( + read_file_tool, read_file_tool_def, + list_files_tool, list_files_tool_def, + write_to_file_tool, write_to_file_tool_def, + run_tests_tool, run_tests_tool_def +) from app.agents.web_search_tool import web_search_tool, web_search_tool_def -from app.agents.memory_tool import save_memory_tool, save_memory_tool_def # A mapping of tool names to their functions and definitions +# This makes it easy to add tools to agents based on their config. AVAILABLE_TOOLS = { "read_file": (read_file_tool, read_file_tool_def), "list_files": (list_files_tool, list_files_tool_def), + "write_to_file": (write_to_file_tool, write_to_file_tool_def), + "run_tests": (run_tests_tool, run_tests_tool_def), "web_search": (web_search_tool, web_search_tool_def), - "save_memory": (save_memory_tool, save_memory_tool_def), } -def load_config(path: str) -> dict: - """Loads a YAML configuration file.""" - with open(path, 'r') as f: - return yaml.safe_load(f) - -def get_class_from_string(class_path: str): - """Dynamically imports a class from a string path.""" - module_path, class_name = class_path.rsplit('.', 1) - module = import_module(module_path) - return getattr(module, class_name) - -def create_agent_team(main_config_path: str) -> Tuple[TaskDecomposer, Dict[str, Agent]]: - """ - Creates and configures the agent team based on YAML files. - - Args: - main_config_path (str): The path to the main configuration file. - - Returns: - A tuple containing the TaskDecomposer and the dictionary of worker agents. - """ - logging.info("Loading configurations from %s...", main_config_path) - main_config = load_config(main_config_path) - - workers = {} - api_key = os.getenv("OPENAI_API_KEY") - common_kwargs = {"api_key": api_key, "model": main_config.get('default_model', 'o4-mini')} - - for agent_name, agent_info in main_config['agents'].items(): - logging.info(f"Initializing {agent_name}...") - - agent_config_path = agent_info['config_path'] - agent_config = load_config(agent_config_path) - - agent_class = get_class_from_string(agent_info['_target_']) - - init_params = agent_config.copy() - init_params.update(common_kwargs) - - agent_instance = agent_class(**init_params) - - # The logic for adding tools has been moved to the agent classes themselves. - # The factory is now cleaner and only responsible for instantiation. - - workers[agent_name] = agent_instance - - task_decomposer = workers.pop("TaskDecomposer") - return task_decomposer, workers - class AgentFactory: """ A factory class for creating different types of specialized agents. @@ -84,8 +36,7 @@ def create_agent( Creates an agent based on a configuration dictionary. Args: - agent_config: A dictionary containing the agent's name, role, goal, - and a list of tool names it should have. + agent_config: A dictionary containing the agent's name, role, and goal. api_key: The OpenAI API key. model: The name of the model to use. @@ -95,8 +46,10 @@ def create_agent( name = agent_config.get("name", "SpecializedAgent") role = agent_config.get("role", "An assistant") goal = agent_config.get("goal", "To complete tasks efficiently.") - tool_names = agent_config.get("tools", []) + # In our new simplified system, the base Agent class already + # includes all the necessary tools by default. + # We just need to instantiate it with the correct persona. agent = Agent( name=name, role=role, @@ -104,14 +57,5 @@ def create_agent( api_key=api_key, model=model ) - - # Clear default tools and add only the specified ones - agent.tools = {} - agent.tool_definitions = [] - - for tool_name in tool_names: - if tool_name in AVAILABLE_TOOLS: - tool_func, tool_def = AVAILABLE_TOOLS[tool_name] - agent.add_tool(tool_func, tool_def) return agent \ No newline at end of file diff --git a/app/orchestration/orchestrator.py b/app/orchestration/orchestrator.py index f50a655..91230b1 100644 --- a/app/orchestration/orchestrator.py +++ b/app/orchestration/orchestrator.py @@ -1,6 +1,6 @@ """ -This module defines the Orchestrator, the central brain of the multi-agent team. -It creates a plan and manages its execution by delegating tasks to specialized agents. +This module defines the Orchestrator. +It is the central brain that creates a plan and executes it by delegating tasks to agents. """ import json import logging @@ -8,68 +8,51 @@ from openai import OpenAI from app.factory.agent_factory import AgentFactory -from app.agents.roles.standard_roles import ALL_ROLES, PLANNER_AGENT, EVALUATOR_AGENT +from app.agents.roles.standard_roles import ALL_ROLES -# Updated prompt to ask for multiple plans (Tree-of-Thoughts) +# A new, simplified, and much more direct planner prompt. +# This prompt is designed to generate a single, efficient plan. PLANNER_PROMPT_TEMPLATE = """ -You are a master planner for a team of AI agents. Your job is to create THREE DISTINCT step-by-step plans to accomplish the user's goal. +You are an expert project planner. Your job is to create a single, efficient, step-by-step plan to accomplish the user's goal. **User's Goal:** "{user_goal}" -**Available Team of Specialists:** -{agents_description} +**Available Team of Specialists & Their Key Tools:** +- **FileSystemExpert**: Ideal for file operations. Key tool: `write_to_file_tool(path, content)`. +- **CodingAgent**: For writing and modifying Python code. Key tool: `write_to_file_tool(path, content)`. +- **TestingAgent**: For running tests. Key tool: `run_tests_tool(path)`. +- **ReviewerAgent**: For code reviews. Key tool: `read_file_tool(path)`. -Based on the goal, create a JSON object with a key "plans", containing a list of THREE different plans. Each plan is a JSON array of tasks. Each task must have: -- `step`: An integer for the step number (e.g., 1, 2, 3). -- `agent`: The name of the single most appropriate agent from the available team. -- `task`: A clear and specific instruction for the agent. +**Your Task:** +Create a JSON object with a key "plan" containing a list of tasks. Each task must have: +- `step`: An integer for the step number. +- `agent`: The name of the single most appropriate agent from the team. +- `task`: A clear and specific instruction for that agent. -**Important Rules:** -- The three plans should represent different strategies to achieve the goal. -- Your entire response MUST be a single, valid JSON object like: `{{"plans": [[...plan1...], [...plan2...], [...plan3...]]}}` +**CRITICAL RULES:** +1. **BE EFFICIENT:** Combine related actions. Instead of one step to create a file and another to write to it, create a SINGLE step: "Create the file 'file.txt' with the content '...'" and assign it to the appropriate agent. +2. **BE PRECISE:** The task description must contain all the necessary information for the agent to act. If the goal is to write to a file, the 'task' must include the content to be written. +3. **JSON ONLY:** Your entire response MUST be a single, valid JSON object. **Example:** -{{ - "plans": [ - [ - {{"step": 1, "agent": "WebSearchExpert", "task": "Find official pytest docs."}} - ], - [ - {{"step": 1, "agent": "FileSystemExpert", "task": "Check existing test files for pytest usage examples."}} - ], - [ - {{"step": 1, "agent": "WebSearchExpert", "task": "Search for tutorials on how to use pytest with FastAPI."}} - ] - ] -}} -""" - -EVALUATOR_PROMPT_TEMPLATE = """ -You are a meticulous and rational Evaluator. Your task is to analyze a list of proposed plans and select the single best one to achieve the user's goal. - -**User's Goal:** -"{user_goal}" +Goal: "Create a file named 'hello.txt' and write 'Hello World' in it." -**Proposed Plans:** -{plans_json_string} - -**Evaluation Criteria:** -1. **Efficiency:** Which plan is likely to achieve the goal in the fewest steps? -2. **Robustness:** Which plan is least likely to fail or run into errors? -3. **Clarity:** Which plan is the most logical and straightforward? - -Based on your analysis, respond with a JSON object containing the index (starting from 0) of the best plan. - -**Example:** +Your output: {{ - "best_plan_index": 1 + "plan": [ + {{ + "step": 1, + "agent": "FileSystemExpert", + "task": "Create the file 'hello.txt' and write the following content into it: Hello World" + }} + ] }} """ class Orchestrator: """ - Creates multiple plans, evaluates them, and manages the execution of the best one. + Creates a single, efficient plan and manages its execution. """ def __init__(self, api_key: str, model: str = "gpt-4o-mini"): self.client = OpenAI(api_key=api_key) @@ -85,16 +68,11 @@ def _get_agents_description(self) -> str: descriptions.append(f"- Agent: {name}\n - Role: {config['role']}\n - Best for: {config['goal']}") return "\n".join(descriptions) - def _create_plan(self, user_goal: str) -> List[List[Dict[str, Any]]]: - """ - Uses the PlannerAgent's logic to create multiple distinct plans. - """ - logging.info(f"Orchestrator is creating multiple plans for the goal: '{user_goal}'") - agents_description = self._get_agents_description() - prompt = PLANNER_PROMPT_TEMPLATE.format( - user_goal=user_goal, - agents_description=agents_description - ) + def _create_plan(self, user_goal: str) -> List[Dict[str, Any]]: + """Creates a single, direct plan to achieve the user's goal.""" + logging.info(f"Orchestrator is creating a plan for the goal: '{user_goal}'") + + prompt = PLANNER_PROMPT_TEMPLATE.format(user_goal=user_goal) try: response = self.client.chat.completions.create( @@ -102,46 +80,13 @@ def _create_plan(self, user_goal: str) -> List[List[Dict[str, Any]]]: messages=[{"role": "user", "content": prompt}], response_format={"type": "json_object"} ) - # We expect a dict with a "plans" key, which is a list of lists - plan_variants = json.loads(response.choices[0].message.content or "{}").get("plans", []) - logging.info(f"Planner proposed {len(plan_variants)} plans.") - return plan_variants + content = response.choices[0].message.content or "{}" + plan = json.loads(content).get("plan", []) + logging.info("Planner proposed a plan with %s steps.", len(plan)) + return plan except Exception as e: - logging.error(f"Failed to create plans: {e}", exc_info=True) - return [] - - def _evaluate_and_select_plan(self, user_goal: str, plans: List[List[Dict[str, Any]]]) -> List[Dict[str, Any]]: - """Uses the Evaluator's logic to select the best plan.""" - if not plans: + logging.error(f"Failed to create a valid plan: {e}", exc_info=True) return [] - if len(plans) == 1: - logging.info("Only one plan was generated, selecting it by default.") - return plans[0] - - logging.info("Evaluating plans to select the best one...") - prompt = EVALUATOR_PROMPT_TEMPLATE.format( - user_goal=user_goal, - plans_json_string=json.dumps(plans, indent=2) - ) - - try: - response = self.client.chat.completions.create( - model=self.model, - messages=[{"role": "user", "content": prompt}], - response_format={"type": "json_object"} - ) - choice = json.loads(response.choices[0].message.content or "{}") - best_plan_index = choice.get("best_plan_index", 0) - - if 0 <= best_plan_index < len(plans): - logging.info(f"Evaluator selected plan #{best_plan_index + 1}.") - return plans[best_plan_index] - else: - logging.warning("Evaluator returned an invalid index, defaulting to the first plan.") - return plans[0] - except Exception as e: - logging.error(f"Failed to evaluate plans: {e}. Defaulting to the first plan.", exc_info=True) - return plans[0] def _create_briefing(self, goal: str, plan: List[Dict[str, Any]], current_task: Dict[str, Any]) -> str: """Creates a detailed context (briefing) for an agent.""" @@ -152,41 +97,38 @@ def _create_briefing(self, goal: str, plan: List[Dict[str, Any]], current_task: history_log = "Here are the results from the previous steps:\n" for record in self.execution_history: history_log += ( - f"Step {record['step']} ({record['agent']}) completed.\n" - f"Task: {record['task']}\n" - f"Result: {record['result']}\n\n" + f"- Step {record['step']} ({record['agent']}) completed.\n" + f" Task: {record['task']}\n" + f" Result: {record['result']}\n\n" ) + # The agent needs the full context to make good decisions. return ( f"**Overall Goal:** {goal}\n\n" - f"**Full Plan:** {json.dumps(plan, indent=2)}\n\n" + f"**Full Plan:**\n{json.dumps(plan, indent=2)}\n\n" f"**Execution History:**\n{history_log}\n" f"-----------------------------------\n" f"**Your Current Task (Step {current_task['step']}):**\n" - f"Your task is: \"{current_task['task']}\".\n" - f"Analyze the goal, plan, and history, then execute your task to produce the required result." + f"Your task is: \"{current_task['task']}\".\n\n" + f"Analyze the goal, plan, and history, then use your tools to execute your task and produce the required result. " + f"The 'task' description contains all the information you need." ) def run(self, user_goal: str) -> str: """ - Runs the full orchestration process: generate multiple plans, evaluate them, and execute the best one. + Runs the full orchestration process: create a plan and execute it. """ self.execution_history = [] - # 1. Create multiple plan variants - plan_variants = self._create_plan(user_goal) - if not plan_variants: - return "I'm sorry, I couldn't create any plans to address your request. Please try rephrasing it." - - # 2. Evaluate and select the best plan - best_plan = self._evaluate_and_select_plan(user_goal, plan_variants) - if not best_plan: - return "I'm sorry, I couldn't select a valid plan to execute. Please try again." + # 1. Create a single, efficient plan + plan = self._create_plan(user_goal) + if not plan: + return "I'm sorry, I couldn't create a plan to address your request. Please try rephrasing it." - print(f"\033[95mOrchestrator's Selected Plan:\033[0m\n{json.dumps(best_plan, indent=2)}") + print(f"\033[95mOrchestrator's Plan:\033[0m\n{json.dumps(plan, indent=2, ensure_ascii=False)}") - # 3. Execute the selected plan step-by-step - for task in best_plan: + # 2. Execute the plan step-by-step + for task in plan: agent_name = task.get("agent") task_description = task.get("task") @@ -196,17 +138,13 @@ def run(self, user_goal: str) -> str: logging.info(f"--- Executing Step {task['step']}: {task_description} (Agent: {agent_name}) ---") - # Create the specialist agent agent_config = ALL_ROLES[agent_name] specialist_agent = self.agent_factory.create_agent(agent_config, self.api_key, self.model) - # Create the briefing for the agent - briefing = self._create_briefing(user_goal, best_plan, task) + briefing = self._create_briefing(user_goal, plan, task) - # Execute the task result = specialist_agent.execute_task(briefing) - # Save the result to history self.execution_history.append({ "step": task['step'], "agent": agent_name, @@ -216,6 +154,5 @@ def run(self, user_goal: str) -> str: logging.info(f"--- Step {task['step']} Result: {result} ---") - # Return the result of the final step final_result = self.execution_history[-1]["result"] if self.execution_history else "The plan was executed, but there is no final result." return final_result \ No newline at end of file diff --git a/db/memory.db b/db/memory.db index 551fff0f9ae10747e5b2b9abd2a1020795c8b589..82281f2be808a1a70ad90ab7978605bc04c837f0 100644 GIT binary patch literal 12288 zcmeI2&rcIU6vuZdKZHVQ6BCX;;-NH9+;%CY^YqDBOW01+SpM1Tko z0U|&IhyW2F0z}|K0?R%9W0RBesxZnXb2m-gwywEsv&pPVXE!ik(sH^6dhUKfgAUsX z%c!#{yfU^g%L8NaxcnyN`!sE9eN8Z@zE)>-+u7~x_nh+D`6)~cL6^p>kT2@mL#+hM zrTk*9v4RmiRAOZg%?T-1vCRM#tOMn!c1SaUn!N)|C)F5sh(S0J|h(K_U7Ti18MZ#XeM+NVxj(#_ak?QKMyYje*_PL zw}-wBJsbRq2GocE5g-CYfCvx)B0vQGC4pMFPuh#A^A0lvx7I;y;5`{`GKg+4)3m3> zj);O`RbkuVzCrYncYX>=EQdc6jYh-d6};58#-qS3VFMS_NhO(zE3@%L8WKuYQL<{f zHhL{ON-cC9I>}Ud1a-z++}Op`kmco=DVc04lU35?;Vair%fYMFn8T@*hpt>BSsuJ< zjhWfKz8fgAuIiX0m8Rn`OF)%7tRisJ1{K>92De<;G8}F1ovT)gFvZ*we(f1uScOIX%$5!CtmjV|X z{!)9vfBs0iNF}}fzdZU~!Ur`XKm>>Y5g-CYfCvx)B0vO)01+SpMBu+Ca8nM%<<5UC Ggnt7xC6a&u delta 43 qcmZojXh@hK&B!=W#+i|EW5N=CCI*4cf(keJCpIXu@iG7boC^R0GYeG! From 35588ee56631d05371d841426ba3924452a6e95e Mon Sep 17 00:00:00 2001 From: Vyacheslav Artemyev Date: Tue, 17 Jun 2025 15:40:23 +0300 Subject: [PATCH 3/3] fix --- app/agents/agent.py | 134 ++++++----------------------- app/agents/roles/standard_roles.py | 20 +++-- app/agents/tools.py | 51 ++++++++++- app/factory/agent_factory.py | 21 ++++- app/orchestration/orchestrator.py | 101 +++++++++++----------- db/memory.db | Bin 12288 -> 12288 bytes temp_test_run_data.json | 1 - tests/test_tools.py | 0 8 files changed, 159 insertions(+), 169 deletions(-) delete mode 100644 temp_test_run_data.json delete mode 100644 tests/test_tools.py diff --git a/app/agents/agent.py b/app/agents/agent.py index 774335e..23ed897 100644 --- a/app/agents/agent.py +++ b/app/agents/agent.py @@ -47,18 +47,22 @@ class ToolExecutionError(Exception): # Новый системный промпт, основанный на ReAct (Reason + Act) REACT_SYSTEM_PROMPT = """ You are a smart, autonomous AI agent. Your name is {agent_name}, and your role is {agent_role}. -Your ultimate goal is: {agent_goal}. + +Your current, specific task is described below. Focus ONLY on this task. +--- +{task_description} +--- You operate in a loop of Thought, Action, and Observation. At each step, you MUST respond in a specific JSON format. Your entire response must be a single JSON object. -1. **Thought**: First, think about your plan. Analyze the user's request, your goal, and the previous steps. Describe your reasoning for the current action. This is a mandatory field. +1. **Thought**: First, think about your plan to accomplish your assigned task. Analyze the task description and the previous steps. Describe your reasoning for the current action. This is a mandatory field. 2. **Action** or **Answer**: Based on your thought, you must choose ONE of the following: a. `action`: An object representing the tool to use. It must contain: - `name`: The name of the tool to execute. - `input`: An object with the parameters for the tool. - b. `answer`: A final, comprehensive answer to the user's request. Use this ONLY when the task is fully complete. + b. `answer`: A final, comprehensive summary of what you did to complete YOUR ASSIGNED TASK. Use this ONLY when your specific task is fully complete. # AVAILABLE TOOLS: You have access to the following tools. Use them to gather information and perform actions. @@ -89,7 +93,7 @@ class ToolExecutionError(Exception): - Your ENTIRE output MUST be a single, valid JSON object. Do not add any text before or after the JSON. - You must choose either `action` or `answer`, not both. - The `thought` field is always required. -- Think step by step. Your goal is to complete the task, not just use tools. +- Once you have completed your specific task, you MUST use the 'answer' field to finish your work. """ # Настройка логирования @@ -129,12 +133,8 @@ def __init__( # Initialize Guardrails self.guardrail_manager = CustomGuardrailManager(api_key=api_key) - # Add default tools - self.add_tool(read_file_tool, read_file_tool_def) - self.add_tool(list_files_tool, list_files_tool_def) - self.add_tool(write_to_file_tool, write_to_file_tool_def) - self.add_tool(web_search_tool, web_search_tool_def) - self.add_tool(save_memory_tool, save_memory_tool_def) + # Tools are now added by the AgentFactory based on the role's configuration. + # The base agent starts with an empty toolset. # RAG specific attributes self.use_rag = use_rag @@ -157,64 +157,6 @@ def add_tool(self, tool_func: Callable, tool_definition: Dict[str, Any]): self.tools[tool_name] = tool_func self.tool_definitions.append(tool_definition) - def get_openai_tools(self) -> Optional[List[Dict[str, Any]]]: - """Возвращает список определений инструментов для OpenAI API.""" - if not self.tool_definitions: - return None - return self.tool_definitions - - def _create_rag_query(self, briefing: str) -> str: - """ - Creates a focused query for RAG from the detailed briefing. - Extracts the current task and the last result from history. - """ - task_match = re.search(r"\*\*YOUR CURRENT TASK \(Step .*\):\*\*\n\n\*\*Task:\*\* (.*)\n\*\*Description:\*\* (.*)", briefing) - history_match = re.search(r"\*\*EXECUTION HISTORY:\*\*\n(.*)", briefing, re.DOTALL) - - if not task_match: - return briefing # Fallback to full briefing - - task = task_match.group(1) - description = task_match.group(2) - - query_parts = [f"Task: {task}", f"Description: {description}"] - - if history_match: - history_str = history_match.group(1).strip() - # Get the last entry from the history - last_entry = history_str.split("- **Step")[0].strip() - if last_entry: - query_parts.append(f"Context from previous step: {last_entry}") - - focused_query = "\n".join(query_parts) - logging.info(f"Created focused RAG query for {self.name}: '{focused_query}'") - return focused_query - - def _enrich_with_knowledge(self, query: str) -> str: - """Enriches a query with context from the knowledge base if RAG is enabled.""" - if not self.use_rag or not self.retriever: - return "" - - top_k = self.rag_config.get("top_k", 3) - filters = self.rag_config.get("filters", None) - - logging.info(f"Agent '{self.name}' is retrieving knowledge with top_k={top_k}, filters={filters}") - retrieved_knowledge = self.retriever.retrieve(query=query, top_k=top_k, filters=filters) - - if not retrieved_knowledge: - logging.info("No specific internal standards found for this query.") - return "" - - formatted_knowledge = "\n\n---\n\n".join( - [f"Source: {chunk['source']}\n\n{chunk['text']}" for chunk in retrieved_knowledge] - ) - knowledge_context = ( - "Before you begin, consult these internal standards and best practices:" - f"\n\n--- RELEVANT KNOWLEDGE ---\n{formatted_knowledge}\n--------------------------\n" - ) - logging.info(f"Knowledge context added for agent '{self.name}'.") - return knowledge_context - def _get_memory_context(self) -> str: """Retrieves relevant facts from long-term memory.""" recent_facts = self.memory_manager.get_recent_facts(limit=10) @@ -257,15 +199,6 @@ def _get_tools_description(self) -> str: ) return "\n".join(desc) - def _get_user_input(self) -> Optional[str]: - """Обрабатывает получение ввода от пользователя.""" - print("\033[94mВы:\033[0m ", end="") - try: - user_input = input() - return user_input if user_input.strip() else None - except EOFError: - return None - def _get_model_response(self) -> str: """Получает и возвращает ответ от модели.""" logging.info(f"Sending request to OpenAI with {len(self.conversation_history)} messages.") @@ -292,16 +225,18 @@ def execute_task(self, briefing: str) -> str: tools_description = self._get_tools_description() memory_context = self._get_memory_context() + # The 'briefing' from the orchestrator is the definitive task. system_prompt = self.system_prompt_template.format( agent_name=self.name, agent_role=self.role, - agent_goal=self.goal, + task_description=briefing, # The briefing is the task tools_description=tools_description, memory_context=memory_context ) self.conversation_history = [{"role": "system", "content": system_prompt}] - self.conversation_history.append({"role": "user", "content": briefing}) + # A simple message to kick off the process. + self.conversation_history.append({"role": "user", "content": "Begin your task."}) # 2. Основной цикл Reason-Act for i in range(self.max_iterations): @@ -356,11 +291,24 @@ def execute_task(self, briefing: str) -> str: # logging.warning(final_answer) # return final_answer - return answer + return str(answer) # Ensure answer is a string if action: + # The model sometimes returns a string in the 'action' field when it should + # be providing a final 'answer'. We'll treat this as a final answer to + # make the system more robust. + if not isinstance(action, dict): + logging.warning(f"Model provided 'action' as a string instead of an object: '{action}'. Treating as Final Answer.") + return str(action) + tool_name = action.get("name") tool_input = action.get("input", {}) + + # The model sometimes tries to call 'answer' as a tool. This is incorrect. + # We'll catch this and treat it as the final answer. + if tool_name == 'answer': + logging.warning("Model incorrectly used 'answer' as a tool name. Treating as Final Answer.") + return json.dumps(tool_input) if isinstance(tool_input, dict) else str(tool_input) if tool_name and isinstance(tool_input, dict): logging.info(f"Action: {tool_name}({tool_input})") @@ -387,29 +335,3 @@ def execute_task(self, briefing: str) -> str: logging.warning(final_answer) return final_answer - def run(self) -> None: - """Запускает основной цикл общения с агентом в интерактивном режиме.""" - print(f"Запуск агента '{self.name}' в интерактивном режиме. Введите 'exit' для завершения.") - - while True: - try: - user_input = input("\033[94mВы > \033[0m") - if user_input.lower() == 'exit': - print("Завершение сеанса.") - break - - if not user_input.strip(): - continue - - # Используем execute_task для обработки ввода пользователя - print(f"\033[93m{self.name} >\033[0m", end="", flush=True) - final_response = self.execute_task(user_input) - - # Печатаем финальный ответ, который execute_task вернул - # execute_task уже логирует промежуточные шаги - print(final_response) - - except (KeyboardInterrupt, EOFError): - print("\nЗавершение сеанса.") - break - diff --git a/app/agents/roles/standard_roles.py b/app/agents/roles/standard_roles.py index 190c41a..5a6e6aa 100644 --- a/app/agents/roles/standard_roles.py +++ b/app/agents/roles/standard_roles.py @@ -7,39 +7,47 @@ "goal": "Fulfill the user's request to the best of your ability." } +# Base configurations with specific tools for each agent role. +# The factory will use the 'tools' list to equip each agent. + # Configuration for a file system expert agent FILESYSTEM_EXPERT = { "name": "FileSystemExpert", "role": "An expert in interacting with the local file system.", - "goal": "Manage files and directories, such as creating, reading, and writing files." + "goal": "Manage files and directories, such as creating, reading, and writing files.", + "tools": ["read_file", "list_files", "write_to_file", "update_file"], } # Configuration for a web search expert agent WEB_SEARCH_EXPERT = { "name": "WebSearchExpert", "role": "An expert in finding information on the web.", - "goal": "Answer questions and provide information by searching the web." + "goal": "Answer questions and provide information by searching the web.", + "tools": ["web_search"], } # Configuration for a coding agent CODING_AGENT = { "name": "CodingAgent", - "role": "A professional coder who writes high-quality, efficient, and clean Python code according to provided standards.", - "goal": "Write high-quality, efficient, and clean Python code according to provided standards." + "role": "A professional coder who writes high-quality, efficient, and clean Python code.", + "goal": "Write high-quality, efficient, and clean Python code according to provided standards.", + "tools": ["read_file", "list_files", "write_to_file", "run_tests", "update_file"], } # Configuration for a reviewer agent REVIEWER_AGENT = { "name": "ReviewerAgent", "role": "A meticulous reviewer who ensures code quality, adherence to standards, and correctness.", - "goal": "Ensure code quality, adherence to standards, and correctness." + "goal": "Ensure code quality, adherence to standards, and correctness.", + "tools": ["read_file"], } # Configuration for a testing agent TESTING_AGENT = { "name": "TestingAgent", "role": "Software Quality Assurance Engineer", - "goal": "Thoroughly test code to find bugs and ensure reliability." + "goal": "Thoroughly test code to find bugs and ensure reliability.", + "tools": ["run_tests", "read_file"], } # A dictionary of all available agent roles that the Orchestrator can assign tasks to. diff --git a/app/agents/tools.py b/app/agents/tools.py index 0ecb94c..bc77c90 100644 --- a/app/agents/tools.py +++ b/app/agents/tools.py @@ -30,9 +30,8 @@ def read_file_tool(input_data: Dict[str, Any]) -> str: def list_files_tool(input_data: Dict[str, Any]) -> str: """ - Рекурсивно выводит дерево файлов и директорий по указанному пути, - игнорируя служебные файлы/директории. Помогает понять структуру проекта. - + Выводит список файлов и директорий по указанному пути. + Args: input_data (Dict[str, Any]): Словарь, который может содержать ключ 'path' с путем к директории. По умолчанию - текущая. @@ -147,6 +146,30 @@ def run_tests_tool(input_data: Dict[str, Any]) -> str: return f"Критическая ошибка: Не удалось запустить тесты. Причина: {e}" +def update_file_tool(input_data: Dict[str, Any]) -> str: + """ + Appends content to an existing file. If the file doesn't exist, it creates it. + + Args: + input_data (Dict[str, Any]): A dictionary containing: + 'path' (str): The path to the file. + 'content' (str): The content to append to the file. + """ + path = input_data.get("path") + content = input_data.get("content") + + if not path or content is None: + return "Error: 'path' and 'content' are required arguments." + + try: + # 'a' mode appends to the file, and creates it if it doesn't exist. + with open(path, "a", encoding="utf-8") as f: + f.write("\n\n" + content) + return f"Content successfully appended to '{path}'." + except Exception as e: + return f"Error: Could not update file '{path}': {e}" + + # Определения инструментов (Tool Definitions) read_file_tool_def = { "type": "function", @@ -223,3 +246,25 @@ def run_tests_tool(input_data: Dict[str, Any]) -> str: }, }, } + +update_file_tool_def = { + "type": "function", + "function": { + "name": "update_file_tool", + "description": "Appends content to an existing file. Creates the file if it does not exist.", + "parameters": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "The path to the file to be updated." + }, + "content": { + "type": "string", + "description": "The content to append to the file." + } + }, + "required": ["path", "content"] + } + } +} diff --git a/app/factory/agent_factory.py b/app/factory/agent_factory.py index 4f79597..5479ad3 100644 --- a/app/factory/agent_factory.py +++ b/app/factory/agent_factory.py @@ -8,9 +8,11 @@ read_file_tool, read_file_tool_def, list_files_tool, list_files_tool_def, write_to_file_tool, write_to_file_tool_def, + update_file_tool, update_file_tool_def, run_tests_tool, run_tests_tool_def ) from app.agents.web_search_tool import web_search_tool, web_search_tool_def +from app.agents.memory_tool import save_memory_tool, save_memory_tool_def # A mapping of tool names to their functions and definitions # This makes it easy to add tools to agents based on their config. @@ -18,8 +20,10 @@ "read_file": (read_file_tool, read_file_tool_def), "list_files": (list_files_tool, list_files_tool_def), "write_to_file": (write_to_file_tool, write_to_file_tool_def), + "update_file": (update_file_tool, update_file_tool_def), "run_tests": (run_tests_tool, run_tests_tool_def), "web_search": (web_search_tool, web_search_tool_def), + "save_memory": (save_memory_tool, save_memory_tool_def), } class AgentFactory: @@ -46,10 +50,9 @@ def create_agent( name = agent_config.get("name", "SpecializedAgent") role = agent_config.get("role", "An assistant") goal = agent_config.get("goal", "To complete tasks efficiently.") + tool_names = agent_config.get("tools", []) - # In our new simplified system, the base Agent class already - # includes all the necessary tools by default. - # We just need to instantiate it with the correct persona. + # Create a base agent agent = Agent( name=name, role=role, @@ -57,5 +60,17 @@ def create_agent( api_key=api_key, model=model ) + + # Add only the tools specified in the agent's configuration + for tool_name in tool_names: + if tool_name in AVAILABLE_TOOLS: + tool_func, tool_def = AVAILABLE_TOOLS[tool_name] + agent.add_tool(tool_func, tool_def) + else: + # This could be a configuration error, but we'll just log it for now. + print(f"Warning: Tool '{tool_name}' not found for agent '{name}'.") + + # The 'save_memory' tool is essential for all agents to learn. + agent.add_tool(save_memory_tool, save_memory_tool_def) return agent \ No newline at end of file diff --git a/app/orchestration/orchestrator.py b/app/orchestration/orchestrator.py index 91230b1..01e7230 100644 --- a/app/orchestration/orchestrator.py +++ b/app/orchestration/orchestrator.py @@ -13,38 +13,61 @@ # A new, simplified, and much more direct planner prompt. # This prompt is designed to generate a single, efficient plan. PLANNER_PROMPT_TEMPLATE = """ -You are an expert project planner. Your job is to create a single, efficient, step-by-step plan to accomplish the user's goal. +You are an expert project planner and a senior software architect. Your job is to create a robust, production-ready, step-by-step plan to accomplish the user's goal. **User's Goal:** "{user_goal}" -**Available Team of Specialists & Their Key Tools:** -- **FileSystemExpert**: Ideal for file operations. Key tool: `write_to_file_tool(path, content)`. -- **CodingAgent**: For writing and modifying Python code. Key tool: `write_to_file_tool(path, content)`. -- **TestingAgent**: For running tests. Key tool: `run_tests_tool(path)`. -- **ReviewerAgent**: For code reviews. Key tool: `read_file_tool(path)`. +**Project Structure & Quality Standards:** +- **Tool Directory**: All new tools MUST be appended to the existing file `app/agents/tools.py`. Do NOT create new files for tools. +- **Test Directory**: All new tests for tools MUST be appended to the existing file `tests/agents/test_tools.py`. Do NOT create new files for tests. +- **Code Quality**: All generated Python functions MUST include detailed Google-style docstrings explaining their purpose, arguments, and return values. +- **Test Quality**: Tests MUST be written using `pytest`. Each feature MUST have multiple tests covering standard cases, edge cases (e.g., empty strings, null inputs, different data types), and potential failure modes. +- **Mandatory Review**: Any plan that involves writing or modifying code MUST include a final step where the `ReviewerAgent` inspects the newly created files. + +**Available Team of Specialists & Their Exact Responsibilities:** +- **CodingAgent**: Writes and modifies Python code. Can ONLY use `write_to_file_tool`, `read_file_tool`, and `list_files_tool`. Assign ALL code and test writing/modification tasks to this agent. +- **TestingAgent**: Runs tests using `pytest`. Can ONLY use `run_tests_tool` and `read_file_tool`. It CANNOT write or modify files. Assign ONLY test execution tasks to this agent. +- **ReviewerAgent**: Performs code reviews. Can ONLY use `read_file_tool`. It CANNOT write, modify, or test code. Assign ONLY file review tasks to this agent. +- **FileSystemExpert**: Handles generic file operations. Can ONLY use `write_to_file_tool`, `read_file_tool`, and `list_files_tool`. **Your Task:** Create a JSON object with a key "plan" containing a list of tasks. Each task must have: - `step`: An integer for the step number. -- `agent`: The name of the single most appropriate agent from the team. -- `task`: A clear and specific instruction for that agent. +- `agent`: The name of the single most appropriate agent from the team based on their exact responsibilities. +- `task`: A clear and specific instruction for that agent, including full file paths and complete, high-quality code with docstrings. **CRITICAL RULES:** -1. **BE EFFICIENT:** Combine related actions. Instead of one step to create a file and another to write to it, create a SINGLE step: "Create the file 'file.txt' with the content '...'" and assign it to the appropriate agent. -2. **BE PRECISE:** The task description must contain all the necessary information for the agent to act. If the goal is to write to a file, the 'task' must include the content to be written. -3. **JSON ONLY:** Your entire response MUST be a single, valid JSON object. +1. **ADHERE TO STANDARDS:** Your plan MUST follow all project structure and quality standards defined above. +2. **CORRECT ASSIGNMENT:** Assign tasks ONLY to agents that have the tools and responsibilities to complete them. +3. **BE PRECISE:** The task description must contain all necessary information, including full code content. +4. **JSON ONLY:** Your entire response MUST be a single, valid JSON object. -**Example:** -Goal: "Create a file named 'hello.txt' and write 'Hello World' in it." +**Example of a HIGH-QUALITY Plan:** +Goal: "Create a Python tool to reverse a string." Your output: {{ "plan": [ {{ "step": 1, - "agent": "FileSystemExpert", - "task": "Create the file 'hello.txt' and write the following content into it: Hello World" + "agent": "CodingAgent", + "task": "Read the content of 'app/agents/tools.py'. If the 'reverse_string_tool' function does not already exist, append the following code to the end of the file: \\n\\n# ... (existing code) ...\\n\\ndef reverse_string_tool(input_data: dict) -> str:\\n '''Reverses a string.'''\\n return input_data.get('text', '')[::-1]\\n\\nreverse_string_tool_def = {{...}} # (full tool definition here)" + }}, + {{ + "step": 2, + "agent": "CodingAgent", + "task": "Read the content of 'tests/agents/test_tools.py'. If tests for 'reverse_string_tool' do not already exist, append new tests to the end of the file." + }}, + {{ + "step": 3, + "agent": "TestingAgent", + "task": "Run all tests in 'tests/test_tools.py' to verify correctness of all tools, including the newly added one." + }}, + {{ + "step": 4, + "agent": "ReviewerAgent", + "task": "Review the final code in 'app/agents/tools.py' and 'tests/agents/test_tools.py' for quality and correctness." }} ] }} @@ -61,13 +84,6 @@ def __init__(self, api_key: str, model: str = "gpt-4o-mini"): self.api_key = api_key self.execution_history: List[Dict[str, Any]] = [] - def _get_agents_description(self) -> str: - """Creates a formatted string describing the available worker agents.""" - descriptions = [] - for name, config in ALL_ROLES.items(): - descriptions.append(f"- Agent: {name}\n - Role: {config['role']}\n - Best for: {config['goal']}") - return "\n".join(descriptions) - def _create_plan(self, user_goal: str) -> List[Dict[str, Any]]: """Creates a single, direct plan to achieve the user's goal.""" logging.info(f"Orchestrator is creating a plan for the goal: '{user_goal}'") @@ -88,32 +104,6 @@ def _create_plan(self, user_goal: str) -> List[Dict[str, Any]]: logging.error(f"Failed to create a valid plan: {e}", exc_info=True) return [] - def _create_briefing(self, goal: str, plan: List[Dict[str, Any]], current_task: Dict[str, Any]) -> str: - """Creates a detailed context (briefing) for an agent.""" - history_log = "" - if not self.execution_history: - history_log = "This is the first step. No execution history yet." - else: - history_log = "Here are the results from the previous steps:\n" - for record in self.execution_history: - history_log += ( - f"- Step {record['step']} ({record['agent']}) completed.\n" - f" Task: {record['task']}\n" - f" Result: {record['result']}\n\n" - ) - - # The agent needs the full context to make good decisions. - return ( - f"**Overall Goal:** {goal}\n\n" - f"**Full Plan:**\n{json.dumps(plan, indent=2)}\n\n" - f"**Execution History:**\n{history_log}\n" - f"-----------------------------------\n" - f"**Your Current Task (Step {current_task['step']}):**\n" - f"Your task is: \"{current_task['task']}\".\n\n" - f"Analyze the goal, plan, and history, then use your tools to execute your task and produce the required result. " - f"The 'task' description contains all the information you need." - ) - def run(self, user_goal: str) -> str: """ Runs the full orchestration process: create a plan and execute it. @@ -141,8 +131,19 @@ def run(self, user_goal: str) -> str: agent_config = ALL_ROLES[agent_name] specialist_agent = self.agent_factory.create_agent(agent_config, self.api_key, self.model) - briefing = self._create_briefing(user_goal, plan, task) - + # This briefing is now lean and focused. It does NOT contain the overall goal. + briefing = "" + if self.execution_history: + briefing += ( + "Here's a summary of what has been done so far:\n" + + "\n".join([f"- {record['result']}" for record in self.execution_history]) + ) + briefing += ( + f"\nYour specific, immediate task is: '{task_description}'.\n" + "Focus ONLY on completing this single task. Do not move on to other tasks. " + "Once you have completed your task, provide a 'Final Answer' with a summary of what you did." + ) + result = specialist_agent.execute_task(briefing) self.execution_history.append({ diff --git a/db/memory.db b/db/memory.db index 82281f2be808a1a70ad90ab7978605bc04c837f0..e4164daf5524225a7e22e76198b2924d1fee5090 100644 GIT binary patch literal 12288 zcmeHNTTdHD6kY=+!GH;E3XeT854Ia)e8CuR6{)V{wkYOOXHiR~YPDX^;)(WRcE>op zHKb~!zW242`q;--t@_r#0Dq%>=pV>K&a5x8UDJRfkgCpzwRdJ`&gGjq-#H6B{r)^@Ra0FTNCP~2B`w{}qAc6mohj9qDHIs>KrxdJ=8c0T*ns!KR=B@FL>XKvPdc;+kyGOZotY;| zP#VM~(B>bWV-cv6CO$&3xT>wWHct0Ytf?_>mg9R?(d@%gLqpe0T5~lQjj6R5e{=$M z2W$szHw;wZ&+aO-(Q^n( zKf%`t2H^k+b;%;;5!2{S;gt&SCOPl8tbEkc%-FEnSfoMFpGZ6b5p;|+BJqCt@Y<#R zDqIkv2B<2pxKtG$Jb;L*T1YFZ8tItYcY%+_;?ZHo$mHbo=99OA(zA57#L?#1au&S& zZuK|EYZ9Fr6gdt_m~YMqJ8@m>?M2k}Xy8ELPW5PgXs3KeAAb_GJ`tm-Nb=ov9%#@Z z?NP-kIh{4`pyK#AC;d%GvZt(*LE0|$QHXxRHzxsAQbZO;Gfh8LIQG3L<_)BAI_h8w z88~k&+=!l(5xxmMnOtoi_1x>=h6%ZUG{&HY;e9pCQpmIgIhC)?UAvBKZT5O~Y@#c* z(6#Hx)Ml<*$NI*z;B8cL=trsE!aB!hP^Y}y!Iw5ax{*sfIM!V1w6H8fX2;;e>Z>=2 z5-;HoY(bl13DzNUhz=YYtbAAlYbw*}R7!&}%g@E8oGoa#(2RGl60>JNoPTxp``OQD zzn-6VLw9_*rt)$sCucW|X;cv(;G+Q(+n9%VA=XPngS8_Td0vzMU6)4$mV3uO5-#Dn zXvh^`Pp0r?5cMoyHjJ+5Mkf7a3dMIRoFEU{q>TycDeLe!&kpq=^!a9SqQj8AqAq08 z$(w*IRrq28^(=M{VJD$nWUPP2YFL7!N0@kcjXiMGMz>>K&gE$UWv^w67va;B*xUMk zlIy0n3oIFJ?Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0{?jg?gl1T K1Ec@7u=ENC3D4;O delta 43 zcmZojXh@hK%_ulg#+gxYW5N=CW&zIj$?O7(8w=w(nbHI%f0Rt!{7zC(j8Omp8hQ+< diff --git a/temp_test_run_data.json b/temp_test_run_data.json deleted file mode 100644 index c19e7ec..0000000 --- a/temp_test_run_data.json +++ /dev/null @@ -1 +0,0 @@ -{"dict_test_cases": {}, "testCases": [], "metricScores": [], "configurations": {}} \ No newline at end of file diff --git a/tests/test_tools.py b/tests/test_tools.py deleted file mode 100644 index e69de29..0000000