From 9876205f774cc36292c636904a439590f830a0ca Mon Sep 17 00:00:00 2001 From: Yue Pan <79363355+dcloud347@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:30:55 +0800 Subject: [PATCH 1/2] feat: Add issue question analysis and response nodes with integrated tools --- .../issue_question_analyzer_message_node.py | 47 ++++++++++++++++ .../nodes/issue_question_analyzer_node.py | 56 +++++++++---------- .../nodes/issue_question_response_node.py | 13 +++++ .../subgraphs/issue_question_state.py | 7 ++- .../subgraphs/issue_question_subgraph.py | 39 +++++++++++-- 5 files changed, 128 insertions(+), 34 deletions(-) create mode 100644 prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py create mode 100644 prometheus/lang_graph/nodes/issue_question_response_node.py diff --git a/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py b/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py new file mode 100644 index 0000000..9fbcddb --- /dev/null +++ b/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py @@ -0,0 +1,47 @@ +from typing import Dict + +from langchain_core.messages import HumanMessage + +from prometheus.utils.issue_util import format_issue_info +from prometheus.utils.logger_manager import get_thread_logger + + +class IssueQuestionAnalyzerMessageNode: + FIRST_HUMAN_PROMPT = """\ +I am going to share details about an issue (Question) reported to a codebase and its related context. +Please analyze this question and provide a high-level response of the question: + +1. Issue Understanding: +- Analyze the issue title, description, and comments provided + +2. Answer the question through systematic investigation: + - Identify which specific code elements are related to the question + - Understand the context and interactions related to the question or issue + +3. Provide high-level answer suggestions step by step + +Here is a Github issue description: +-- BEGIN ISSUE -- +{issue_info} +-- END ISSUE -- + +Here is the relevant code context and documentation needed to understand and answer this issue: +--- BEGIN CONTEXT -- +{question_context} +--- END CONTEXT -- + +Based on the above information, please provide a detailed answer to the question. +""" + + def __init__(self): + self._logger, file_handler = get_thread_logger(__name__) + + def __call__(self, state: Dict): + human_message = self.FIRST_HUMAN_PROMPT.format( + issue_info=format_issue_info( + state["issue_title"], state["issue_body"], state["issue_comments"] + ), + question_context="\n\n".join([str(context) for context in state["question_context"]]), + ) + self._logger.debug(f"Sending message to IssueQuestionAnalyzerNode:\n{human_message}") + return {"issue_question_analyzer_messages": [HumanMessage(human_message)]} diff --git a/prometheus/lang_graph/nodes/issue_question_analyzer_node.py b/prometheus/lang_graph/nodes/issue_question_analyzer_node.py index 98e69e3..3318749 100644 --- a/prometheus/lang_graph/nodes/issue_question_analyzer_node.py +++ b/prometheus/lang_graph/nodes/issue_question_analyzer_node.py @@ -1,8 +1,11 @@ +import functools + from langchain_core.language_models.chat_models import BaseChatModel -from langchain_core.messages import HumanMessage, SystemMessage +from langchain_core.messages import SystemMessage +from langchain_core.tools import StructuredTool from prometheus.lang_graph.subgraphs.issue_question_state import IssueQuestionState -from prometheus.utils.issue_util import format_issue_info +from prometheus.tools.web_search import WebSearchTool from prometheus.utils.logger_manager import get_thread_logger @@ -27,38 +30,33 @@ class IssueQuestionAnalyzerNode: Communicate in a clear, technical manner focused on accurate analysis and practical suggestions rather than implementation details. """ - HUMAN_PROMPT = """ - Here is a Github issue description: - -- BEGIN ISSUE -- - {issue_info} - -- END ISSUE -- - - Here is the relevant code context and documentation needed to understand and answer this issue: - --- BEGIN CONTEXT -- - {question_context} - --- END CONTEXT -- - - Based on the above information, please provide a detailed answer to the question. - """ def __init__(self, model: BaseChatModel): self.system_prompt = SystemMessage(self.SYS_PROMPT) - self.model = model + self.web_search_tool = WebSearchTool() + self.tools = self._init_tools() + self.model_with_tools = model.bind_tools(self.tools) + self._logger, file_handler = get_thread_logger(__name__) - def __call__(self, state: IssueQuestionState): - human_prompt = HumanMessage( - self.HUMAN_PROMPT.format( - issue_info=format_issue_info( - state["issue_title"], state["issue_body"], state["issue_comments"] - ), - question_context="\n\n".join( - [str(context) for context in state["question_context"]] - ), - ) + def _init_tools(self): + """Initializes tools for the node.""" + tools = [] + + web_search_fn = functools.partial(self.web_search_tool.web_search) + web_search_tool = StructuredTool.from_function( + func=web_search_fn, + name=self.web_search_tool.web_search.__name__, + description=self.web_search_tool.web_search_spec.description, + args_schema=self.web_search_tool.web_search_spec.input_schema, ) - message_history = [self.system_prompt, human_prompt] - response = self.model.invoke(message_history) + tools.append(web_search_tool) + + return tools + + def __call__(self, state: IssueQuestionState): + message_history = [self.system_prompt] + state["issue_question_analyzer_messages"] + response = self.model_with_tools.invoke(message_history) self._logger.debug(response) - return {"question_response": response.content} + return {"issue_question_analyzer_messages": [response]} diff --git a/prometheus/lang_graph/nodes/issue_question_response_node.py b/prometheus/lang_graph/nodes/issue_question_response_node.py new file mode 100644 index 0000000..508442f --- /dev/null +++ b/prometheus/lang_graph/nodes/issue_question_response_node.py @@ -0,0 +1,13 @@ +from prometheus.lang_graph.subgraphs.issue_question_state import IssueQuestionState +from prometheus.utils.lang_graph_util import get_last_message_content +from prometheus.utils.logger_manager import get_thread_logger + + +class IssueQuestionResponderNode: + def __init__(self): + self._logger, file_handler = get_thread_logger(__name__) + + def __call__(self, state: IssueQuestionState): + response = (get_last_message_content(state["issue_question_analyzer_messages"]),) + self._logger.debug(response) + return {"question_response": response[0]} diff --git a/prometheus/lang_graph/subgraphs/issue_question_state.py b/prometheus/lang_graph/subgraphs/issue_question_state.py index a434599..4888b13 100644 --- a/prometheus/lang_graph/subgraphs/issue_question_state.py +++ b/prometheus/lang_graph/subgraphs/issue_question_state.py @@ -1,4 +1,7 @@ -from typing import Mapping, Sequence, TypedDict +from typing import Annotated, Mapping, Sequence, TypedDict + +from langchain_core.messages import BaseMessage +from langgraph.graph import add_messages from prometheus.models.context import Context @@ -13,4 +16,6 @@ class IssueQuestionState(TypedDict): question_query: str question_context: Sequence[Context] + issue_question_analyzer_messages: Annotated[Sequence[BaseMessage], add_messages] + question_response: str diff --git a/prometheus/lang_graph/subgraphs/issue_question_subgraph.py b/prometheus/lang_graph/subgraphs/issue_question_subgraph.py index 54b29f3..569a4a5 100644 --- a/prometheus/lang_graph/subgraphs/issue_question_subgraph.py +++ b/prometheus/lang_graph/subgraphs/issue_question_subgraph.py @@ -1,16 +1,22 @@ +import functools from typing import Mapping, Sequence from langchain_core.language_models.chat_models import BaseChatModel from langgraph.constants import END from langgraph.graph import StateGraph +from langgraph.prebuilt import ToolNode, tools_condition from prometheus.git.git_repository import GitRepository from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.nodes.context_retrieval_subgraph_node import ContextRetrievalSubgraphNode +from prometheus.lang_graph.nodes.issue_question_analyzer_message_node import ( + IssueQuestionAnalyzerMessageNode, +) from prometheus.lang_graph.nodes.issue_question_analyzer_node import IssueQuestionAnalyzerNode from prometheus.lang_graph.nodes.issue_question_context_message_node import ( IssueQuestionContextMessageNode, ) +from prometheus.lang_graph.nodes.issue_question_response_node import IssueQuestionResponderNode from prometheus.lang_graph.subgraphs.issue_question_state import IssueQuestionState @@ -37,8 +43,17 @@ def __init__( context_key_name="question_context", ) - # Step 2: Analyze the issue and retrieved context to generate a response + # Step 2: Send issue question analyze message + issue_question_analyzer_message_node = IssueQuestionAnalyzerMessageNode() issue_question_analyzer_node = IssueQuestionAnalyzerNode(model=advanced_model) + issue_question_analyzer_tools = ToolNode( + tools=issue_question_analyzer_node.tools, + name="issue_question_analyzer_tools", + messages_key="issue_question_analyzer_messages", + ) + + # Step 3: Get the last response as the final answer + issue_question_responder_node = IssueQuestionResponderNode() # Define the subgraph structure workflow = StateGraph(IssueQuestionState) @@ -46,15 +61,31 @@ def __init__( "issue_question_context_message_node", issue_question_context_message_node ) workflow.add_node("context_retrieval_subgraph_node", context_retrieval_subgraph_node) + + workflow.add_node( + "issue_question_analyzer_message_node", issue_question_analyzer_message_node + ) workflow.add_node("issue_question_analyzer_node", issue_question_analyzer_node) + workflow.add_node("issue_question_analyzer_tools", issue_question_analyzer_tools) + + workflow.add_node("issue_question_responder_node", issue_question_responder_node) # Define the entry point workflow.set_entry_point("issue_question_context_message_node") # Define the workflow transitions workflow.add_edge("issue_question_context_message_node", "context_retrieval_subgraph_node") - workflow.add_edge("context_retrieval_subgraph_node", "issue_question_analyzer_node") - workflow.add_edge("issue_question_analyzer_node", END) + workflow.add_edge("context_retrieval_subgraph_node", "issue_question_analyzer_message_node") + + workflow.add_edge("issue_question_analyzer_message_node", "issue_question_analyzer_node") + workflow.add_conditional_edges( + "issue_question_analyzer_node", + functools.partial(tools_condition, messages_key="issue_question_analyzer_messages"), + {"tools": "issue_question_analyzer_tools", END: "issue_question_responder_node"}, + ) + workflow.add_edge("issue_question_analyzer_tools", "issue_question_analyzer_node") + + workflow.add_edge("issue_question_responder_node", END) # Compile the workflow into an executable subgraph self.subgraph = workflow.compile() @@ -64,7 +95,7 @@ def invoke( issue_title: str, issue_body: str, issue_comments: Sequence[Mapping[str, str]], - recursion_limit: int = 30, + recursion_limit: int = 50, ): config = {"recursion_limit": recursion_limit} From e1ae069fdda5ee0a523bc5675c84e898621e5385 Mon Sep 17 00:00:00 2001 From: Yue Pan <79363355+dcloud347@users.noreply.github.com> Date: Fri, 12 Sep 2025 17:45:09 +0800 Subject: [PATCH 2/2] refactor: Replace logger_manager with standard logging for thread-specific loggers --- prometheus/app/services/issue_service.py | 23 +++++++++++-------- prometheus/docker/base_container.py | 4 ++-- .../bug_fix_verification_subgraph_node.py | 6 +++-- .../lang_graph/nodes/bug_fix_verify_node.py | 5 ++-- .../nodes/bug_fix_verify_structured_node.py | 6 +++-- ...bug_get_regression_context_message_node.py | 6 +++-- ...bug_get_regression_tests_selection_node.py | 6 +++-- .../bug_get_regression_tests_subgraph_node.py | 5 ++-- .../nodes/bug_reproducing_execute_node.py | 5 ++-- .../nodes/bug_reproducing_file_node.py | 5 ++-- .../nodes/bug_reproducing_structured_node.py | 5 ++-- .../bug_reproducing_write_message_node.py | 6 +++-- .../nodes/bug_reproducing_write_node.py | 5 ++-- .../nodes/bug_reproduction_subgraph_node.py | 5 ++-- .../nodes/build_and_test_subgraph_node.py | 5 ++-- .../nodes/context_extraction_node.py | 5 ++-- .../lang_graph/nodes/context_provider_node.py | 5 ++-- .../nodes/context_query_message_node.py | 6 +++-- .../lang_graph/nodes/context_refine_node.py | 6 +++-- .../nodes/context_retrieval_subgraph_node.py | 5 ++-- .../lang_graph/nodes/edit_message_node.py | 5 ++-- prometheus/lang_graph/nodes/edit_node.py | 5 ++-- .../nodes/final_patch_selection_node.py | 5 ++-- .../lang_graph/nodes/general_build_node.py | 5 ++-- .../nodes/general_build_structured_node.py | 6 +++-- .../lang_graph/nodes/general_test_node.py | 5 ++-- .../nodes/general_test_structured_node.py | 6 +++-- ...regression_test_patch_check_result_node.py | 5 ++-- ...ass_regression_test_patch_subgraph_node.py | 5 ++-- ..._pass_regression_test_patch_update_node.py | 6 +++-- .../lang_graph/nodes/git_apply_patch_node.py | 5 ++-- prometheus/lang_graph/nodes/git_diff_node.py | 5 ++-- prometheus/lang_graph/nodes/git_reset_node.py | 6 +++-- .../nodes/issue_bug_analyzer_message_node.py | 5 ++-- .../nodes/issue_bug_analyzer_node.py | 5 ++-- .../nodes/issue_bug_context_message_node.py | 5 ++-- ...e_bug_reproduction_context_message_node.py | 6 +++-- .../nodes/issue_bug_responder_node.py | 6 +++-- .../nodes/issue_bug_subgraph_node.py | 5 ++-- ...sue_classification_context_message_node.py | 6 +++-- .../issue_classification_subgraph_node.py | 6 +++-- .../lang_graph/nodes/issue_classifier_node.py | 6 +++-- .../issue_not_verified_bug_subgraph_node.py | 5 ++-- .../issue_question_analyzer_message_node.py | 5 ++-- .../nodes/issue_question_analyzer_node.py | 5 ++-- .../issue_question_context_message_node.py | 5 ++-- .../nodes/issue_question_response_node.py | 6 +++-- .../nodes/issue_question_subgraph_node.py | 6 +++-- .../nodes/issue_verified_bug_subgraph_node.py | 6 +++-- prometheus/lang_graph/nodes/noop_node.py | 6 ++--- .../nodes/patch_normalization_node.py | 6 ++--- .../lang_graph/nodes/reset_messages_node.py | 6 ++--- .../nodes/run_existing_tests_node.py | 6 +++-- .../run_existing_tests_structure_node.py | 6 +++-- .../nodes/run_existing_tests_subgraph_node.py | 5 ++-- .../nodes/run_regression_tests_node.py | 5 ++-- .../run_regression_tests_structure_node.py | 5 ++-- .../run_regression_tests_subgraph_node.py | 5 ++-- .../lang_graph/nodes/update_container_node.py | 5 ++-- .../nodes/user_defined_build_node.py | 5 ++-- .../nodes/user_defined_test_node.py | 5 ++-- prometheus/tools/web_search.py | 5 ++-- prometheus/utils/logger_manager.py | 1 - 63 files changed, 217 insertions(+), 135 deletions(-) diff --git a/prometheus/app/services/issue_service.py b/prometheus/app/services/issue_service.py index a235b1e..fd6f54b 100644 --- a/prometheus/app/services/issue_service.py +++ b/prometheus/app/services/issue_service.py @@ -1,4 +1,7 @@ +import logging +import threading import traceback +from datetime import datetime from pathlib import Path from typing import Mapping, Optional, Sequence @@ -10,11 +13,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.graphs.issue_graph import IssueGraph from prometheus.lang_graph.graphs.issue_state import IssueType -from prometheus.utils.logger_manager import ( - clear_current_thread_session, - get_thread_logger, - remove_multi_threads_log_file_handler, -) class IssueService(BaseService): @@ -81,8 +79,15 @@ def answer_issue( - issue_type (IssueType): The type of the issue (BUG or QUESTION). """ - # Create thread-specific logger with file handler - ONE LINE! - logger, file_handler = get_thread_logger(__name__, force_new_file=True) + # Set up a dedicated logger for this thread + logger = logging.getLogger(f"thread-{threading.get_ident()}.prometheus") + logger.setLevel(getattr(logging, self.logging_level)) + formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_file = self.answer_issue_log_dir / f"{timestamp}_{threading.get_ident()}.log" + file_handler = logging.FileHandler(log_file) + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) # Construct the working directory if dockerfile_content or image_name: @@ -137,5 +142,5 @@ def answer_issue( return None, False, False, False, None, None finally: # Remove multi-thread file handler - remove_multi_threads_log_file_handler(file_handler, logger.name) - clear_current_thread_session() + logger.removeHandler(file_handler) + file_handler.close() diff --git a/prometheus/docker/base_container.py b/prometheus/docker/base_container.py index c4a99ad..1ca2614 100644 --- a/prometheus/docker/base_container.py +++ b/prometheus/docker/base_container.py @@ -2,6 +2,7 @@ import shutil import tarfile import tempfile +import threading from abc import ABC, abstractmethod from pathlib import Path from typing import Optional, Sequence @@ -10,7 +11,6 @@ import pexpect from prometheus.exceptions.docker_exception import DockerException -from prometheus.utils.logger_manager import get_thread_logger class BaseContainer(ABC): @@ -47,7 +47,7 @@ def __init__( Args: project_path: Path to the project directory to be containerized. """ - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") temp_dir = Path(tempfile.mkdtemp()) temp_project_path = temp_dir / project_path.name shutil.copytree(project_path, temp_project_path) diff --git a/prometheus/lang_graph/nodes/bug_fix_verification_subgraph_node.py b/prometheus/lang_graph/nodes/bug_fix_verification_subgraph_node.py index e741785..4957907 100644 --- a/prometheus/lang_graph/nodes/bug_fix_verification_subgraph_node.py +++ b/prometheus/lang_graph/nodes/bug_fix_verification_subgraph_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langgraph.errors import GraphRecursionError @@ -5,7 +8,6 @@ from prometheus.git.git_repository import GitRepository from prometheus.lang_graph.subgraphs.bug_fix_verification_subgraph import BugFixVerificationSubgraph from prometheus.lang_graph.subgraphs.issue_verified_bug_state import IssueVerifiedBugState -from prometheus.utils.logger_manager import get_thread_logger class BugFixVerificationSubgraphNode: @@ -15,7 +17,7 @@ def __init__( container: BaseContainer, git_repo: GitRepository, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.git_repo = git_repo self.subgraph = BugFixVerificationSubgraph( model=model, diff --git a/prometheus/lang_graph/nodes/bug_fix_verify_node.py b/prometheus/lang_graph/nodes/bug_fix_verify_node.py index fdb7f07..3d59640 100644 --- a/prometheus/lang_graph/nodes/bug_fix_verify_node.py +++ b/prometheus/lang_graph/nodes/bug_fix_verify_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -7,7 +9,6 @@ from prometheus.docker.base_container import BaseContainer from prometheus.lang_graph.subgraphs.bug_fix_verification_state import BugFixVerificationState from prometheus.tools.container_command import ContainerCommandTool -from prometheus.utils.logger_manager import get_thread_logger class BugFixVerifyNode: @@ -54,7 +55,7 @@ def __init__(self, model: BaseChatModel, container: BaseContainer): self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): tools = [] diff --git a/prometheus/lang_graph/nodes/bug_fix_verify_structured_node.py b/prometheus/lang_graph/nodes/bug_fix_verify_structured_node.py index cb344b9..07444c7 100644 --- a/prometheus/lang_graph/nodes/bug_fix_verify_structured_node.py +++ b/prometheus/lang_graph/nodes/bug_fix_verify_structured_node.py @@ -1,10 +1,12 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from prometheus.lang_graph.subgraphs.bug_fix_verification_state import BugFixVerificationState from prometheus.utils.lang_graph_util import get_last_message_content -from prometheus.utils.logger_manager import get_thread_logger class BugFixVerifyStructureOutput(BaseModel): @@ -89,7 +91,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(BugFixVerifyStructureOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BugFixVerificationState): bug_fix_verify_message = get_last_message_content(state["bug_fix_verify_messages"]) diff --git a/prometheus/lang_graph/nodes/bug_get_regression_context_message_node.py b/prometheus/lang_graph/nodes/bug_get_regression_context_message_node.py index 8a24419..97abcee 100644 --- a/prometheus/lang_graph/nodes/bug_get_regression_context_message_node.py +++ b/prometheus/lang_graph/nodes/bug_get_regression_context_message_node.py @@ -1,8 +1,10 @@ +import logging +import threading + from prometheus.lang_graph.subgraphs.bug_get_regression_tests_state import ( BugGetRegressionTestsState, ) from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class BugGetRegressionContextMessageNode: @@ -84,7 +86,7 @@ def test_offset_preserved(self): """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BugGetRegressionTestsState): select_regression_query = self.SELECT_REGRESSION_QUERY.format( diff --git a/prometheus/lang_graph/nodes/bug_get_regression_tests_selection_node.py b/prometheus/lang_graph/nodes/bug_get_regression_tests_selection_node.py index 87e9d31..e4a3f46 100644 --- a/prometheus/lang_graph/nodes/bug_get_regression_tests_selection_node.py +++ b/prometheus/lang_graph/nodes/bug_get_regression_tests_selection_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field @@ -6,7 +9,6 @@ BugGetRegressionTestsState, ) from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class RegressionTestStructuredOutPut(BaseModel): @@ -89,7 +91,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(RegressionTestsStructuredOutPut) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_human_message(self, state: BugGetRegressionTestsState): return self.HUMAN_PROMPT.format( diff --git a/prometheus/lang_graph/nodes/bug_get_regression_tests_subgraph_node.py b/prometheus/lang_graph/nodes/bug_get_regression_tests_subgraph_node.py index 4555419..7adc7d1 100644 --- a/prometheus/lang_graph/nodes/bug_get_regression_tests_subgraph_node.py +++ b/prometheus/lang_graph/nodes/bug_get_regression_tests_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict from langchain_core.language_models.chat_models import BaseChatModel @@ -9,7 +11,6 @@ from prometheus.lang_graph.subgraphs.bug_get_regression_tests_subgraph import ( BugGetRegressionTestsSubgraph, ) -from prometheus.utils.logger_manager import get_thread_logger class BugGetRegressionTestsSubgraphNode: @@ -21,7 +22,7 @@ def __init__( kg: KnowledgeGraph, git_repo: GitRepository, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.subgraph = BugGetRegressionTestsSubgraph( advanced_model=advanced_model, base_model=base_model, diff --git a/prometheus/lang_graph/nodes/bug_reproducing_execute_node.py b/prometheus/lang_graph/nodes/bug_reproducing_execute_node.py index 39eb744..9ae3e42 100644 --- a/prometheus/lang_graph/nodes/bug_reproducing_execute_node.py +++ b/prometheus/lang_graph/nodes/bug_reproducing_execute_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from pathlib import Path from typing import Optional, Sequence @@ -10,7 +12,6 @@ from prometheus.lang_graph.subgraphs.bug_reproduction_state import BugReproductionState from prometheus.tools.container_command import ContainerCommandTool from prometheus.utils.issue_util import format_test_commands -from prometheus.utils.logger_manager import get_thread_logger from prometheus.utils.patch_util import get_updated_files @@ -56,7 +57,7 @@ def __init__( self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): tools = [] diff --git a/prometheus/lang_graph/nodes/bug_reproducing_file_node.py b/prometheus/lang_graph/nodes/bug_reproducing_file_node.py index ca515b1..b996356 100644 --- a/prometheus/lang_graph/nodes/bug_reproducing_file_node.py +++ b/prometheus/lang_graph/nodes/bug_reproducing_file_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -8,7 +10,6 @@ from prometheus.lang_graph.subgraphs.bug_reproduction_state import BugReproductionState from prometheus.tools.file_operation import FileOperationTool from prometheus.utils.lang_graph_util import get_last_message_content -from prometheus.utils.logger_manager import get_thread_logger class BugReproducingFileNode: @@ -41,7 +42,7 @@ def __init__(self, model: BaseChatModel, kg: KnowledgeGraph, local_path: str): self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """Initializes file operation tools.""" diff --git a/prometheus/lang_graph/nodes/bug_reproducing_structured_node.py b/prometheus/lang_graph/nodes/bug_reproducing_structured_node.py index b0cae51..e09de25 100644 --- a/prometheus/lang_graph/nodes/bug_reproducing_structured_node.py +++ b/prometheus/lang_graph/nodes/bug_reproducing_structured_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -10,7 +12,6 @@ format_agent_tool_message_history, get_last_message_content, ) -from prometheus.utils.logger_manager import get_thread_logger class BugReproducingStructuredOutput(BaseModel): @@ -135,7 +136,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(BugReproducingStructuredOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BugReproductionState): bug_reproducing_log = format_agent_tool_message_history( diff --git a/prometheus/lang_graph/nodes/bug_reproducing_write_message_node.py b/prometheus/lang_graph/nodes/bug_reproducing_write_message_node.py index 9aefe39..4f10b4f 100644 --- a/prometheus/lang_graph/nodes/bug_reproducing_write_message_node.py +++ b/prometheus/lang_graph/nodes/bug_reproducing_write_message_node.py @@ -1,8 +1,10 @@ +import logging +import threading + from langchain_core.messages import HumanMessage from prometheus.lang_graph.subgraphs.bug_reproduction_state import BugReproductionState from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class BugReproducingWriteMessageNode: @@ -23,7 +25,7 @@ class BugReproducingWriteMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_human_message(self, state: BugReproductionState): if "reproduced_bug_failure_log" in state and state["reproduced_bug_failure_log"]: diff --git a/prometheus/lang_graph/nodes/bug_reproducing_write_node.py b/prometheus/lang_graph/nodes/bug_reproducing_write_node.py index bf5e312..0773f90 100644 --- a/prometheus/lang_graph/nodes/bug_reproducing_write_node.py +++ b/prometheus/lang_graph/nodes/bug_reproducing_write_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -7,7 +9,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.bug_reproduction_state import BugReproductionState from prometheus.tools.file_operation import FileOperationTool -from prometheus.utils.logger_manager import get_thread_logger class BugReproducingWriteNode: @@ -116,7 +117,7 @@ def __init__(self, model: BaseChatModel, local_path: str, kg: KnowledgeGraph): self.tools = self._init_tools() self.system_prompt = SystemMessage(self.SYS_PROMPT) self.model_with_tools = model.bind_tools(self.tools) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """Initializes file operation tools with the given root path. diff --git a/prometheus/lang_graph/nodes/bug_reproduction_subgraph_node.py b/prometheus/lang_graph/nodes/bug_reproduction_subgraph_node.py index efe3086..860ed62 100644 --- a/prometheus/lang_graph/nodes/bug_reproduction_subgraph_node.py +++ b/prometheus/lang_graph/nodes/bug_reproduction_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Optional, Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -8,7 +10,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.bug_reproduction_subgraph import BugReproductionSubgraph from prometheus.lang_graph.subgraphs.issue_bug_state import IssueBugState -from prometheus.utils.logger_manager import get_thread_logger class BugReproductionSubgraphNode: @@ -21,7 +22,7 @@ def __init__( git_repo: GitRepository, test_commands: Optional[Sequence[str]], ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.git_repo = git_repo self.bug_reproduction_subgraph = BugReproductionSubgraph( advanced_model=advanced_model, diff --git a/prometheus/lang_graph/nodes/build_and_test_subgraph_node.py b/prometheus/lang_graph/nodes/build_and_test_subgraph_node.py index be26ec4..77a7483 100644 --- a/prometheus/lang_graph/nodes/build_and_test_subgraph_node.py +++ b/prometheus/lang_graph/nodes/build_and_test_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Optional, Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -6,7 +8,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.build_and_test_subgraph import BuildAndTestSubgraph from prometheus.lang_graph.subgraphs.issue_bug_state import IssueBugState -from prometheus.utils.logger_manager import get_thread_logger class BuildAndTestSubgraphNode: @@ -25,7 +26,7 @@ def __init__( build_commands=build_commands, test_commands=test_commands, ) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: IssueBugState): exist_build = None diff --git a/prometheus/lang_graph/nodes/context_extraction_node.py b/prometheus/lang_graph/nodes/context_extraction_node.py index 9debb6d..7897794 100644 --- a/prometheus/lang_graph/nodes/context_extraction_node.py +++ b/prometheus/lang_graph/nodes/context_extraction_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -14,7 +16,6 @@ extract_last_tool_messages, transform_tool_messages_to_str, ) -from prometheus.utils.logger_manager import get_thread_logger SYS_PROMPT = """\ You are a context summary agent that summarizes code contexts which is relevant to a given query. @@ -137,7 +138,7 @@ def __init__(self, model: BaseChatModel, root_path: str): structured_llm = model.with_structured_output(ContextExtractionStructuredOutput) self.model = prompt | structured_llm self.root_path = root_path - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: ContextRetrievalState): """ diff --git a/prometheus/lang_graph/nodes/context_provider_node.py b/prometheus/lang_graph/nodes/context_provider_node.py index 221e029..d0fbada 100644 --- a/prometheus/lang_graph/nodes/context_provider_node.py +++ b/prometheus/lang_graph/nodes/context_provider_node.py @@ -6,6 +6,8 @@ """ import functools +import logging +import threading from typing import Dict from langchain.tools import StructuredTool @@ -15,7 +17,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.tools.file_operation import FileOperationTool from prometheus.tools.graph_traversal import GraphTraversalTool -from prometheus.utils.logger_manager import get_thread_logger class ContextProviderNode: @@ -118,7 +119,7 @@ def __init__( ) self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """ diff --git a/prometheus/lang_graph/nodes/context_query_message_node.py b/prometheus/lang_graph/nodes/context_query_message_node.py index a45d251..f1167a8 100644 --- a/prometheus/lang_graph/nodes/context_query_message_node.py +++ b/prometheus/lang_graph/nodes/context_query_message_node.py @@ -1,12 +1,14 @@ +import logging +import threading + from langchain_core.messages import HumanMessage from prometheus.lang_graph.subgraphs.context_retrieval_state import ContextRetrievalState -from prometheus.utils.logger_manager import get_thread_logger class ContextQueryMessageNode: def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: ContextRetrievalState): human_message = HumanMessage(state["query"]) diff --git a/prometheus/lang_graph/nodes/context_refine_node.py b/prometheus/lang_graph/nodes/context_refine_node.py index 309ca73..44ea36a 100644 --- a/prometheus/lang_graph/nodes/context_refine_node.py +++ b/prometheus/lang_graph/nodes/context_refine_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatPromptTemplate @@ -5,7 +8,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.context_retrieval_state import ContextRetrievalState -from prometheus.utils.logger_manager import get_thread_logger class ContextRefineStructuredOutput(BaseModel): @@ -88,7 +90,7 @@ def __init__(self, model: BaseChatModel, kg: KnowledgeGraph): ) structured_llm = model.with_structured_output(ContextRefineStructuredOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_refine_message(self, state: ContextRetrievalState): original_query = state["query"] diff --git a/prometheus/lang_graph/nodes/context_retrieval_subgraph_node.py b/prometheus/lang_graph/nodes/context_retrieval_subgraph_node.py index 7484c10..0cdcf14 100644 --- a/prometheus/lang_graph/nodes/context_retrieval_subgraph_node.py +++ b/prometheus/lang_graph/nodes/context_retrieval_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict, Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -6,7 +8,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.context_retrieval_subgraph import ContextRetrievalSubgraph from prometheus.models.context import Context -from prometheus.utils.logger_manager import get_thread_logger class ContextRetrievalSubgraphNode: @@ -18,7 +19,7 @@ def __init__( query_key_name: str, context_key_name: str, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.context_retrieval_subgraph = ContextRetrievalSubgraph( model=model, kg=kg, diff --git a/prometheus/lang_graph/nodes/edit_message_node.py b/prometheus/lang_graph/nodes/edit_message_node.py index e4b07aa..2728aa7 100644 --- a/prometheus/lang_graph/nodes/edit_message_node.py +++ b/prometheus/lang_graph/nodes/edit_message_node.py @@ -1,10 +1,11 @@ +import logging +import threading from typing import Dict from langchain_core.messages import HumanMessage from prometheus.utils.issue_util import format_issue_info from prometheus.utils.lang_graph_util import get_last_message_content -from prometheus.utils.logger_manager import get_thread_logger class EditMessageNode: @@ -42,7 +43,7 @@ class EditMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_human_message(self, state: Dict): edit_error = "" diff --git a/prometheus/lang_graph/nodes/edit_node.py b/prometheus/lang_graph/nodes/edit_node.py index d79d089..be1854c 100644 --- a/prometheus/lang_graph/nodes/edit_node.py +++ b/prometheus/lang_graph/nodes/edit_node.py @@ -7,6 +7,8 @@ """ import functools +import logging +import threading from typing import Dict from langchain.tools import StructuredTool @@ -15,7 +17,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.tools.file_operation import FileOperationTool -from prometheus.utils.logger_manager import get_thread_logger class EditNode: @@ -123,7 +124,7 @@ def __init__(self, model: BaseChatModel, local_path: str, kg: KnowledgeGraph): self.file_operation_tool = FileOperationTool(local_path, kg) self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """Initializes file operation tools with the given root path. diff --git a/prometheus/lang_graph/nodes/final_patch_selection_node.py b/prometheus/lang_graph/nodes/final_patch_selection_node.py index a3150f1..f61a77c 100644 --- a/prometheus/lang_graph/nodes/final_patch_selection_node.py +++ b/prometheus/lang_graph/nodes/final_patch_selection_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict, Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -5,7 +7,6 @@ from pydantic import BaseModel, Field from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class FinalPatchSelectionStructuredOutput(BaseModel): @@ -126,7 +127,7 @@ def __init__(self, model: BaseChatModel, candidate_patch_key: str): ) structured_llm = model.with_structured_output(FinalPatchSelectionStructuredOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.majority_voting_times = 10 def format_human_message(self, patches: Sequence[str], state: Dict): diff --git a/prometheus/lang_graph/nodes/general_build_node.py b/prometheus/lang_graph/nodes/general_build_node.py index 779c913..a38877e 100644 --- a/prometheus/lang_graph/nodes/general_build_node.py +++ b/prometheus/lang_graph/nodes/general_build_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -8,7 +10,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.build_and_test_state import BuildAndTestState from prometheus.tools.container_command import ContainerCommandTool -from prometheus.utils.logger_manager import get_thread_logger class GeneralBuildNode: @@ -47,7 +48,7 @@ def __init__(self, model: BaseChatModel, container: BaseContainer, kg: Knowledge self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): tools = [] diff --git a/prometheus/lang_graph/nodes/general_build_structured_node.py b/prometheus/lang_graph/nodes/general_build_structured_node.py index c6c7f8f..d04e5e2 100644 --- a/prometheus/lang_graph/nodes/general_build_structured_node.py +++ b/prometheus/lang_graph/nodes/general_build_structured_node.py @@ -6,13 +6,15 @@ identify any failures. """ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from prometheus.lang_graph.subgraphs.build_and_test_state import BuildAndTestState from prometheus.utils.lang_graph_util import format_agent_tool_message_history -from prometheus.utils.logger_manager import get_thread_logger class BuildStructuredOutput(BaseModel): @@ -236,7 +238,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(BuildStructuredOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BuildAndTestState): """Processes build state to generate structured build analysis. diff --git a/prometheus/lang_graph/nodes/general_test_node.py b/prometheus/lang_graph/nodes/general_test_node.py index 7aebf0a..13f8b8b 100644 --- a/prometheus/lang_graph/nodes/general_test_node.py +++ b/prometheus/lang_graph/nodes/general_test_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -8,7 +10,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.build_and_test_state import BuildAndTestState from prometheus.tools.container_command import ContainerCommandTool -from prometheus.utils.logger_manager import get_thread_logger class GeneralTestNode: @@ -64,7 +65,7 @@ def __init__(self, model: BaseChatModel, container: BaseContainer, kg: Knowledge self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): tools = [] diff --git a/prometheus/lang_graph/nodes/general_test_structured_node.py b/prometheus/lang_graph/nodes/general_test_structured_node.py index 31efbf7..174d61c 100644 --- a/prometheus/lang_graph/nodes/general_test_structured_node.py +++ b/prometheus/lang_graph/nodes/general_test_structured_node.py @@ -6,13 +6,15 @@ identify any failures. """ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from prometheus.lang_graph.subgraphs.build_and_test_state import BuildAndTestState from prometheus.utils.lang_graph_util import format_agent_tool_message_history -from prometheus.utils.logger_manager import get_thread_logger class TestStructuredOutput(BaseModel): @@ -285,7 +287,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(TestStructuredOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BuildAndTestState): """Processes test state to generate structured test analysis. diff --git a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_check_result_node.py b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_check_result_node.py index b3a818a..2ddc384 100644 --- a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_check_result_node.py +++ b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_check_result_node.py @@ -1,10 +1,11 @@ +import logging +import threading from collections import Counter from prometheus.lang_graph.subgraphs.get_pass_regression_test_patch_state import ( GetPassRegressionTestPatchState, ) from prometheus.models.test_patch_result import TestedPatchResult -from prometheus.utils.logger_manager import get_thread_logger class GetPassRegressionTestPatchCheckResultNode: @@ -13,7 +14,7 @@ class GetPassRegressionTestPatchCheckResultNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: GetPassRegressionTestPatchState): """ diff --git a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_subgraph_node.py b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_subgraph_node.py index 9aa346f..3243b91 100644 --- a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_subgraph_node.py +++ b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict from langchain_core.language_models.chat_models import BaseChatModel @@ -9,7 +11,6 @@ GetPassRegressionTestPatchSubgraph, ) from prometheus.models.test_patch_result import TestedPatchResult -from prometheus.utils.logger_manager import get_thread_logger class GetPassRegressionTestPatchSubgraphNode: @@ -23,7 +24,7 @@ def __init__( return_str_patch: bool, return_key: str, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.subgraph = GetPassRegressionTestPatchSubgraph( base_model=model, container=container, diff --git a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_update_node.py b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_update_node.py index fe05d82..9830ba9 100644 --- a/prometheus/lang_graph/nodes/get_pass_regression_test_patch_update_node.py +++ b/prometheus/lang_graph/nodes/get_pass_regression_test_patch_update_node.py @@ -1,8 +1,10 @@ +import logging +import threading + from prometheus.git.git_repository import GitRepository from prometheus.lang_graph.subgraphs.get_pass_regression_test_patch_state import ( GetPassRegressionTestPatchState, ) -from prometheus.utils.logger_manager import get_thread_logger class GetPassRegressionTestPatchUpdateNode: @@ -15,7 +17,7 @@ def __init__( git_repo: GitRepository, ): self.git_repo = git_repo - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: GetPassRegressionTestPatchState): """ diff --git a/prometheus/lang_graph/nodes/git_apply_patch_node.py b/prometheus/lang_graph/nodes/git_apply_patch_node.py index 75a397b..a1d0bb4 100644 --- a/prometheus/lang_graph/nodes/git_apply_patch_node.py +++ b/prometheus/lang_graph/nodes/git_apply_patch_node.py @@ -1,7 +1,8 @@ +import logging +import threading from typing import Dict from prometheus.git.git_repository import GitRepository -from prometheus.utils.logger_manager import get_thread_logger class GitApplyPatchNode: @@ -12,7 +13,7 @@ class GitApplyPatchNode: def __init__(self, git_repo: GitRepository, state_patch_name: str): self.git_repo = git_repo self.state_patch_name = state_patch_name - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): """ diff --git a/prometheus/lang_graph/nodes/git_diff_node.py b/prometheus/lang_graph/nodes/git_diff_node.py index 9a7ad2e..47951b5 100644 --- a/prometheus/lang_graph/nodes/git_diff_node.py +++ b/prometheus/lang_graph/nodes/git_diff_node.py @@ -6,10 +6,11 @@ output. """ +import logging +import threading from typing import Dict, Optional from prometheus.git.git_repository import GitRepository -from prometheus.utils.logger_manager import get_thread_logger class GitDiffNode: @@ -32,7 +33,7 @@ def __init__( self.state_patch_name = state_patch_name self.state_excluded_files_key = state_excluded_files_key self.return_list = return_list - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): """Generates a Git diff for the current project state. diff --git a/prometheus/lang_graph/nodes/git_reset_node.py b/prometheus/lang_graph/nodes/git_reset_node.py index c7b26d2..e868f69 100644 --- a/prometheus/lang_graph/nodes/git_reset_node.py +++ b/prometheus/lang_graph/nodes/git_reset_node.py @@ -1,5 +1,7 @@ +import logging +import threading + from prometheus.git.git_repository import GitRepository -from prometheus.utils.logger_manager import get_thread_logger class GitResetNode: @@ -8,7 +10,7 @@ def __init__( git_repo: GitRepository, ): self.git_repo = git_repo - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, _): self._logger.debug("Resetting the git repository") diff --git a/prometheus/lang_graph/nodes/issue_bug_analyzer_message_node.py b/prometheus/lang_graph/nodes/issue_bug_analyzer_message_node.py index 0217832..2b6eb06 100644 --- a/prometheus/lang_graph/nodes/issue_bug_analyzer_message_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_analyzer_message_node.py @@ -1,9 +1,10 @@ +import logging +import threading from typing import Dict from langchain_core.messages import HumanMessage from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueBugAnalyzerMessageNode: @@ -64,7 +65,7 @@ class IssueBugAnalyzerMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_human_message(self, state: Dict): edit_error = "" diff --git a/prometheus/lang_graph/nodes/issue_bug_analyzer_node.py b/prometheus/lang_graph/nodes/issue_bug_analyzer_node.py index 393cf44..cae38ca 100644 --- a/prometheus/lang_graph/nodes/issue_bug_analyzer_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_analyzer_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from typing import Dict from langchain.tools import StructuredTool @@ -6,7 +8,6 @@ from langchain_core.messages import SystemMessage from prometheus.tools.web_search import WebSearchTool -from prometheus.utils.logger_manager import get_thread_logger class IssueBugAnalyzerNode: @@ -70,7 +71,7 @@ def __init__(self, model: BaseChatModel): self.system_prompt = SystemMessage(self.SYS_PROMPT) self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """Initializes tools for the node.""" diff --git a/prometheus/lang_graph/nodes/issue_bug_context_message_node.py b/prometheus/lang_graph/nodes/issue_bug_context_message_node.py index cdf3aac..aa59e57 100644 --- a/prometheus/lang_graph/nodes/issue_bug_context_message_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_context_message_node.py @@ -1,7 +1,8 @@ +import logging +import threading from typing import Dict from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueBugContextMessageNode: @@ -19,7 +20,7 @@ class IssueBugContextMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): bug_fix_query = self.BUG_FIX_QUERY.format( diff --git a/prometheus/lang_graph/nodes/issue_bug_reproduction_context_message_node.py b/prometheus/lang_graph/nodes/issue_bug_reproduction_context_message_node.py index 5f64656..923f573 100644 --- a/prometheus/lang_graph/nodes/issue_bug_reproduction_context_message_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_reproduction_context_message_node.py @@ -1,6 +1,8 @@ +import logging +import threading + from prometheus.lang_graph.subgraphs.bug_reproduction_state import BugReproductionState from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueBugReproductionContextMessageNode: @@ -107,7 +109,7 @@ def test_file_permission_denied(self, mock_open, mock_access): """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: BugReproductionState): bug_reproducing_query = self.BUG_REPRODUCING_QUERY.format( diff --git a/prometheus/lang_graph/nodes/issue_bug_responder_node.py b/prometheus/lang_graph/nodes/issue_bug_responder_node.py index 519fb44..51643f0 100644 --- a/prometheus/lang_graph/nodes/issue_bug_responder_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_responder_node.py @@ -1,9 +1,11 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import HumanMessage, SystemMessage from prometheus.lang_graph.subgraphs.issue_bug_state import IssueBugState from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueBugResponderNode: @@ -47,7 +49,7 @@ def __init__(self, model: BaseChatModel): self.system_prompt = SystemMessage(self.SYS_PROMPT) self.model = model - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_human_message(self, state: IssueBugState) -> HumanMessage: verification_messages = [] diff --git a/prometheus/lang_graph/nodes/issue_bug_subgraph_node.py b/prometheus/lang_graph/nodes/issue_bug_subgraph_node.py index 70fa53f..99a1e1b 100644 --- a/prometheus/lang_graph/nodes/issue_bug_subgraph_node.py +++ b/prometheus/lang_graph/nodes/issue_bug_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Optional, Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -8,7 +10,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.graphs.issue_state import IssueState from prometheus.lang_graph.subgraphs.issue_bug_subgraph import IssueBugSubgraph -from prometheus.utils.logger_manager import get_thread_logger class IssueBugSubgraphNode: @@ -25,7 +26,7 @@ def __init__( git_repo: GitRepository, test_commands: Optional[Sequence[str]] = None, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.container = container self.issue_bug_subgraph = IssueBugSubgraph( advanced_model=advanced_model, diff --git a/prometheus/lang_graph/nodes/issue_classification_context_message_node.py b/prometheus/lang_graph/nodes/issue_classification_context_message_node.py index 39cb9ec..22d99e8 100644 --- a/prometheus/lang_graph/nodes/issue_classification_context_message_node.py +++ b/prometheus/lang_graph/nodes/issue_classification_context_message_node.py @@ -1,6 +1,8 @@ +import logging +import threading + from prometheus.lang_graph.subgraphs.issue_classification_state import IssueClassificationState from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueClassificationContextMessageNode: @@ -71,7 +73,7 @@ class IssueClassificationContextMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: IssueClassificationState): issue_classification_query = self.ISSUE_CLASSIFICATION_QUERY.format( diff --git a/prometheus/lang_graph/nodes/issue_classification_subgraph_node.py b/prometheus/lang_graph/nodes/issue_classification_subgraph_node.py index 21bbd73..a3b0dc0 100644 --- a/prometheus/lang_graph/nodes/issue_classification_subgraph_node.py +++ b/prometheus/lang_graph/nodes/issue_classification_subgraph_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from prometheus.graph.knowledge_graph import KnowledgeGraph @@ -5,7 +8,6 @@ from prometheus.lang_graph.subgraphs.issue_classification_subgraph import ( IssueClassificationSubgraph, ) -from prometheus.utils.logger_manager import get_thread_logger class IssueClassificationSubgraphNode: @@ -15,7 +17,7 @@ def __init__( kg: KnowledgeGraph, local_path: str, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.issue_classification_subgraph = IssueClassificationSubgraph( model=model, kg=kg, diff --git a/prometheus/lang_graph/nodes/issue_classifier_node.py b/prometheus/lang_graph/nodes/issue_classifier_node.py index 83dc5ed..33704e4 100644 --- a/prometheus/lang_graph/nodes/issue_classifier_node.py +++ b/prometheus/lang_graph/nodes/issue_classifier_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field @@ -5,7 +8,6 @@ from prometheus.lang_graph.graphs.issue_state import IssueType from prometheus.lang_graph.subgraphs.issue_classification_state import IssueClassificationState from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueClassifierOutput(BaseModel): @@ -123,7 +125,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(IssueClassifierOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def format_context_info(self, state: IssueClassificationState) -> str: context_info = self.ISSUE_CLASSIFICATION_CONTEXT.format( diff --git a/prometheus/lang_graph/nodes/issue_not_verified_bug_subgraph_node.py b/prometheus/lang_graph/nodes/issue_not_verified_bug_subgraph_node.py index 17d913b..a770fb8 100644 --- a/prometheus/lang_graph/nodes/issue_not_verified_bug_subgraph_node.py +++ b/prometheus/lang_graph/nodes/issue_not_verified_bug_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict from langchain_core.language_models.chat_models import BaseChatModel @@ -9,7 +11,6 @@ from prometheus.lang_graph.subgraphs.issue_not_verified_bug_subgraph import ( IssueNotVerifiedBugSubgraph, ) -from prometheus.utils.logger_manager import get_thread_logger class IssueNotVerifiedBugSubgraphNode: @@ -21,7 +22,7 @@ def __init__( git_repo: GitRepository, container: BaseContainer, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.issue_not_verified_bug_subgraph = IssueNotVerifiedBugSubgraph( advanced_model=advanced_model, diff --git a/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py b/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py index 9fbcddb..f3b8631 100644 --- a/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py +++ b/prometheus/lang_graph/nodes/issue_question_analyzer_message_node.py @@ -1,9 +1,10 @@ +import logging +import threading from typing import Dict from langchain_core.messages import HumanMessage from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueQuestionAnalyzerMessageNode: @@ -34,7 +35,7 @@ class IssueQuestionAnalyzerMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): human_message = self.FIRST_HUMAN_PROMPT.format( diff --git a/prometheus/lang_graph/nodes/issue_question_analyzer_node.py b/prometheus/lang_graph/nodes/issue_question_analyzer_node.py index 3318749..b7e0c61 100644 --- a/prometheus/lang_graph/nodes/issue_question_analyzer_node.py +++ b/prometheus/lang_graph/nodes/issue_question_analyzer_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import SystemMessage @@ -6,7 +8,6 @@ from prometheus.lang_graph.subgraphs.issue_question_state import IssueQuestionState from prometheus.tools.web_search import WebSearchTool -from prometheus.utils.logger_manager import get_thread_logger class IssueQuestionAnalyzerNode: @@ -37,7 +38,7 @@ def __init__(self, model: BaseChatModel): self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): """Initializes tools for the node.""" diff --git a/prometheus/lang_graph/nodes/issue_question_context_message_node.py b/prometheus/lang_graph/nodes/issue_question_context_message_node.py index 929ec8a..64a5718 100644 --- a/prometheus/lang_graph/nodes/issue_question_context_message_node.py +++ b/prometheus/lang_graph/nodes/issue_question_context_message_node.py @@ -1,7 +1,8 @@ +import logging +import threading from typing import Dict from prometheus.utils.issue_util import format_issue_info -from prometheus.utils.logger_manager import get_thread_logger class IssueQuestionContextMessageNode: @@ -20,7 +21,7 @@ class IssueQuestionContextMessageNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): question_query = self.QUESTION_QUERY.format( diff --git a/prometheus/lang_graph/nodes/issue_question_response_node.py b/prometheus/lang_graph/nodes/issue_question_response_node.py index 508442f..3f33733 100644 --- a/prometheus/lang_graph/nodes/issue_question_response_node.py +++ b/prometheus/lang_graph/nodes/issue_question_response_node.py @@ -1,11 +1,13 @@ +import logging +import threading + from prometheus.lang_graph.subgraphs.issue_question_state import IssueQuestionState from prometheus.utils.lang_graph_util import get_last_message_content -from prometheus.utils.logger_manager import get_thread_logger class IssueQuestionResponderNode: def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: IssueQuestionState): response = (get_last_message_content(state["issue_question_analyzer_messages"]),) diff --git a/prometheus/lang_graph/nodes/issue_question_subgraph_node.py b/prometheus/lang_graph/nodes/issue_question_subgraph_node.py index 9b739d1..7ef12bf 100644 --- a/prometheus/lang_graph/nodes/issue_question_subgraph_node.py +++ b/prometheus/lang_graph/nodes/issue_question_subgraph_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langgraph.errors import GraphRecursionError @@ -5,7 +8,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.graphs.issue_state import IssueState from prometheus.lang_graph.subgraphs.issue_question_subgraph import IssueQuestionSubgraph -from prometheus.utils.logger_manager import get_thread_logger class IssueQuestionSubgraphNode: @@ -21,7 +23,7 @@ def __init__( kg: KnowledgeGraph, git_repo: GitRepository, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.issue_question_subgraph = IssueQuestionSubgraph( advanced_model=advanced_model, base_model=base_model, diff --git a/prometheus/lang_graph/nodes/issue_verified_bug_subgraph_node.py b/prometheus/lang_graph/nodes/issue_verified_bug_subgraph_node.py index ff10071..23762ac 100644 --- a/prometheus/lang_graph/nodes/issue_verified_bug_subgraph_node.py +++ b/prometheus/lang_graph/nodes/issue_verified_bug_subgraph_node.py @@ -1,3 +1,6 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langgraph.errors import GraphRecursionError @@ -6,7 +9,6 @@ from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.lang_graph.subgraphs.issue_bug_state import IssueBugState from prometheus.lang_graph.subgraphs.issue_verified_bug_subgraph import IssueVerifiedBugSubgraph -from prometheus.utils.logger_manager import get_thread_logger class IssueVerifiedBugSubgraphNode: @@ -22,7 +24,7 @@ def __init__( kg: KnowledgeGraph, git_repo: GitRepository, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.git_repo = git_repo self.issue_reproduced_bug_subgraph = IssueVerifiedBugSubgraph( advanced_model=advanced_model, diff --git a/prometheus/lang_graph/nodes/noop_node.py b/prometheus/lang_graph/nodes/noop_node.py index 33f0b94..7bd9a56 100644 --- a/prometheus/lang_graph/nodes/noop_node.py +++ b/prometheus/lang_graph/nodes/noop_node.py @@ -5,10 +5,10 @@ node graphs where a connection is needed but no processing is required. """ +import logging +import threading from typing import Dict -from prometheus.utils.logger_manager import get_thread_logger - class NoopNode: """No-operation node that routes workflow without processing. @@ -20,7 +20,7 @@ class NoopNode: """ def __init__(self): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict) -> None: """Routes the workflow without performing any operations. diff --git a/prometheus/lang_graph/nodes/patch_normalization_node.py b/prometheus/lang_graph/nodes/patch_normalization_node.py index ee2a2c4..958b1fb 100644 --- a/prometheus/lang_graph/nodes/patch_normalization_node.py +++ b/prometheus/lang_graph/nodes/patch_normalization_node.py @@ -4,13 +4,13 @@ Provides standardized patch candidates with direct best patch selection. """ +import logging import re +import threading from collections import defaultdict from dataclasses import dataclass from typing import Dict, List, Sequence -from prometheus.utils.logger_manager import get_thread_logger - @dataclass class PatchMetrics: @@ -37,7 +37,7 @@ class PatchNormalizationNode: """ def __init__(self, input_patch_key: str, return_key: str): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.return_key = return_key self.input_patch_key = input_patch_key diff --git a/prometheus/lang_graph/nodes/reset_messages_node.py b/prometheus/lang_graph/nodes/reset_messages_node.py index 90e6ebf..8fef295 100644 --- a/prometheus/lang_graph/nodes/reset_messages_node.py +++ b/prometheus/lang_graph/nodes/reset_messages_node.py @@ -10,10 +10,10 @@ - The same state attribute name is reused """ +import logging +import threading from typing import Dict -from prometheus.utils.logger_manager import get_thread_logger - class ResetMessagesNode: """Resets message states for workflow loop iterations. @@ -36,7 +36,7 @@ def __init__(self, message_state_key: str): be reset during node execution. """ self.message_state_key = message_state_key - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: Dict): """Resets the specified message state for the next iteration. diff --git a/prometheus/lang_graph/nodes/run_existing_tests_node.py b/prometheus/lang_graph/nodes/run_existing_tests_node.py index 24cd41e..c63fb12 100644 --- a/prometheus/lang_graph/nodes/run_existing_tests_node.py +++ b/prometheus/lang_graph/nodes/run_existing_tests_node.py @@ -1,6 +1,8 @@ +import logging +import threading + from prometheus.docker.base_container import BaseContainer from prometheus.lang_graph.subgraphs.run_existing_tests_state import RunExistingTestsState -from prometheus.utils.logger_manager import get_thread_logger class RunExistingTestsNode: @@ -9,7 +11,7 @@ class RunExistingTestsNode: """ def __init__(self, container: BaseContainer): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.container = container def __call__(self, state: RunExistingTestsState): diff --git a/prometheus/lang_graph/nodes/run_existing_tests_structure_node.py b/prometheus/lang_graph/nodes/run_existing_tests_structure_node.py index 5e80ff0..4aead9e 100644 --- a/prometheus/lang_graph/nodes/run_existing_tests_structure_node.py +++ b/prometheus/lang_graph/nodes/run_existing_tests_structure_node.py @@ -1,9 +1,11 @@ +import logging +import threading + from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel from prometheus.lang_graph.subgraphs.run_existing_tests_state import RunExistingTestsState -from prometheus.utils.logger_manager import get_thread_logger class RunExistingTestsStructureOutput(BaseModel): @@ -53,7 +55,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(RunExistingTestsStructureOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, state: RunExistingTestsState): # Get human message from the state diff --git a/prometheus/lang_graph/nodes/run_existing_tests_subgraph_node.py b/prometheus/lang_graph/nodes/run_existing_tests_subgraph_node.py index c4c9ac5..efbe2b2 100644 --- a/prometheus/lang_graph/nodes/run_existing_tests_subgraph_node.py +++ b/prometheus/lang_graph/nodes/run_existing_tests_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict from langchain_core.language_models.chat_models import BaseChatModel @@ -5,7 +7,6 @@ from prometheus.docker.base_container import BaseContainer from prometheus.git.git_repository import GitRepository from prometheus.lang_graph.subgraphs.run_existing_tests_subgraph import RunExistingTestsSubgraph -from prometheus.utils.logger_manager import get_thread_logger class RunExistingTestsSubgraphNode: @@ -17,7 +18,7 @@ def __init__( testing_patch_key: str, existing_test_fail_log_key: str, ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.subgraph = RunExistingTestsSubgraph( base_model=model, container=container, git_repo=git_repo ) diff --git a/prometheus/lang_graph/nodes/run_regression_tests_node.py b/prometheus/lang_graph/nodes/run_regression_tests_node.py index 390c800..ff96b19 100644 --- a/prometheus/lang_graph/nodes/run_regression_tests_node.py +++ b/prometheus/lang_graph/nodes/run_regression_tests_node.py @@ -1,4 +1,6 @@ import functools +import logging +import threading from langchain.tools import StructuredTool from langchain_core.language_models.chat_models import BaseChatModel @@ -7,7 +9,6 @@ from prometheus.docker.base_container import BaseContainer from prometheus.lang_graph.subgraphs.run_regression_tests_state import RunRegressionTestsState from prometheus.tools.container_command import ContainerCommandTool -from prometheus.utils.logger_manager import get_thread_logger class RunRegressionTestsNode: @@ -58,7 +59,7 @@ def __init__(self, model: BaseChatModel, container: BaseContainer): self.tools = self._init_tools() self.model_with_tools = model.bind_tools(self.tools) self.system_prompt = SystemMessage(self.SYS_PROMPT) - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def _init_tools(self): tools = [] diff --git a/prometheus/lang_graph/nodes/run_regression_tests_structure_node.py b/prometheus/lang_graph/nodes/run_regression_tests_structure_node.py index b8f3105..1674eb7 100644 --- a/prometheus/lang_graph/nodes/run_regression_tests_structure_node.py +++ b/prometheus/lang_graph/nodes/run_regression_tests_structure_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Sequence from langchain_core.language_models.chat_models import BaseChatModel @@ -6,7 +8,6 @@ from prometheus.lang_graph.subgraphs.run_regression_tests_state import RunRegressionTestsState from prometheus.utils.lang_graph_util import get_last_message_content -from prometheus.utils.logger_manager import get_thread_logger class RunRegressionTestsStructureOutput(BaseModel): @@ -128,7 +129,7 @@ def __init__(self, model: BaseChatModel): ) structured_llm = model.with_structured_output(RunRegressionTestsStructureOutput) self.model = prompt | structured_llm - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def get_human_message(self, state: RunRegressionTestsState) -> str: # Format the human message using the state diff --git a/prometheus/lang_graph/nodes/run_regression_tests_subgraph_node.py b/prometheus/lang_graph/nodes/run_regression_tests_subgraph_node.py index 678de62..6cd01ac 100644 --- a/prometheus/lang_graph/nodes/run_regression_tests_subgraph_node.py +++ b/prometheus/lang_graph/nodes/run_regression_tests_subgraph_node.py @@ -1,3 +1,5 @@ +import logging +import threading from typing import Dict from langchain_core.language_models.chat_models import BaseChatModel @@ -5,14 +7,13 @@ from prometheus.docker.base_container import BaseContainer from prometheus.lang_graph.subgraphs.run_regression_tests_subgraph import RunRegressionTestsSubgraph -from prometheus.utils.logger_manager import get_thread_logger class RunRegressionTestsSubgraphNode: def __init__( self, model: BaseChatModel, container: BaseContainer, passed_regression_tests_key: str ): - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") self.subgraph = RunRegressionTestsSubgraph( base_model=model, container=container, diff --git a/prometheus/lang_graph/nodes/update_container_node.py b/prometheus/lang_graph/nodes/update_container_node.py index be15191..1757501 100644 --- a/prometheus/lang_graph/nodes/update_container_node.py +++ b/prometheus/lang_graph/nodes/update_container_node.py @@ -6,11 +6,12 @@ between the agent's workspace and the container environment. """ +import logging +import threading from typing import Dict from prometheus.docker.base_container import BaseContainer from prometheus.git.git_repository import GitRepository -from prometheus.utils.logger_manager import get_thread_logger from prometheus.utils.patch_util import get_updated_files @@ -33,7 +34,7 @@ def __init__(self, container: BaseContainer, git_repo: GitRepository): """ self.container = container self.git_repo = git_repo - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, _: Dict): """Synchronizes the current project state with the container.""" diff --git a/prometheus/lang_graph/nodes/user_defined_build_node.py b/prometheus/lang_graph/nodes/user_defined_build_node.py index 7cfa565..f201d3c 100644 --- a/prometheus/lang_graph/nodes/user_defined_build_node.py +++ b/prometheus/lang_graph/nodes/user_defined_build_node.py @@ -1,16 +1,17 @@ +import logging +import threading import uuid from typing import Any from langchain_core.messages import ToolMessage from prometheus.docker.base_container import BaseContainer -from prometheus.utils.logger_manager import get_thread_logger class UserDefinedBuildNode: def __init__(self, container: BaseContainer): self.container = container - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, _: Any): build_output = self.container.run_build() diff --git a/prometheus/lang_graph/nodes/user_defined_test_node.py b/prometheus/lang_graph/nodes/user_defined_test_node.py index 948c3ee..ce77b0e 100644 --- a/prometheus/lang_graph/nodes/user_defined_test_node.py +++ b/prometheus/lang_graph/nodes/user_defined_test_node.py @@ -1,16 +1,17 @@ +import logging +import threading import uuid from typing import Any from langchain_core.messages import ToolMessage from prometheus.docker.base_container import BaseContainer -from prometheus.utils.logger_manager import get_thread_logger class UserDefinedTestNode: def __init__(self, container: BaseContainer): self.container = container - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") def __call__(self, _: Any): test_output = self.container.run_test() diff --git a/prometheus/tools/web_search.py b/prometheus/tools/web_search.py index ecefe3f..78232db 100644 --- a/prometheus/tools/web_search.py +++ b/prometheus/tools/web_search.py @@ -1,3 +1,5 @@ +import logging +import threading from dataclasses import dataclass from typing import Annotated @@ -6,7 +8,6 @@ from prometheus.configuration.config import settings from prometheus.exceptions.web_search_tool_exception import WebSearchToolException -from prometheus.utils.logger_manager import get_thread_logger @dataclass @@ -75,7 +76,7 @@ class WebSearchTool: def __init__(self): """Initialize the web search tool.""" # Load environment variables from .env file - self._logger, file_handler = get_thread_logger(__name__) + self._logger = logging.getLogger(f"thread-{threading.get_ident()}.{__name__}") tavily_api_key = settings.TAVILY_API_KEY if tavily_api_key is None: diff --git a/prometheus/utils/logger_manager.py b/prometheus/utils/logger_manager.py index 0d2c016..19bd053 100644 --- a/prometheus/utils/logger_manager.py +++ b/prometheus/utils/logger_manager.py @@ -363,7 +363,6 @@ def get_thread_logger( file_handler = logger_manager._set_multi_threads_log_file_handler( thread_id, logger_name, force_new_file ) - print(logger_name) logger = get_logger(logger_name) return logger, file_handler