From a3939cee81674d7124ffd055fb04a02d8c3c15c0 Mon Sep 17 00:00:00 2001 From: jeongHwarr Date: Sat, 26 Jul 2025 14:05:57 +0900 Subject: [PATCH 1/3] Add TextRegeneratorRouterNode to workflow and nodes.py. --- agents/text/modules/nodes.py | 23 +++++++++++++++++++++++ agents/text/workflow.py | 28 ++++++++++++++++++---------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/agents/text/modules/nodes.py b/agents/text/modules/nodes.py index b793de5..9a13852 100644 --- a/agents/text/modules/nodes.py +++ b/agents/text/modules/nodes.py @@ -99,3 +99,26 @@ def execute(self, state: TextState) -> dict: result = self.chain.invoke(input_data) state.update(result) return result + + +class TextRegeneratorRouterNode(BaseNode): + """ + 텍스트 체크 결과를 기반으로 다음 노드를 결정하는 라우터 노드 + """ + + def execute(self, state: TextState) -> dict: + """ + 텍스트 체크 결과를 평가하여 다음 실행할 노드를 결정합니다. + + Args: + state (TextState): 현재 워크플로우 상태 + + Returns: + dict: 다음 노드 정보를 포함한 상태 업데이트 + """ + check_result = state.get("text_content_checker_result", {}) + next_node = ( + "__end__" if check_result.get("success", False) else "text_generation" + ) + + return {"next": next_node} diff --git a/agents/text/workflow.py b/agents/text/workflow.py index e8e9163..b53502b 100644 --- a/agents/text/workflow.py +++ b/agents/text/workflow.py @@ -1,3 +1,5 @@ +from dotenv import load_dotenv + from langgraph.graph import StateGraph from agents.base_workflow import BaseWorkflow @@ -5,6 +7,7 @@ GenTextNode, PersonaExtractionNode, TextContentCheckNode, + TextRegeneratorRouterNode, ) from agents.text.modules.state import TextState @@ -42,22 +45,27 @@ def build(self): # 텍스트 컨텐츠 체커 노드 추가 builder.add_node("text_content_check", TextContentCheckNode()) + # 텍스트 재생성 노드 추가 + builder.add_node("text_check_router", TextRegeneratorRouterNode()) + # 시작 노드에서 페르소나 추출 노드로 연결 builder.add_edge("__start__", "persona_extraction") # 페르소나 추출 노드에서 텍스트 생성 노드로 연결 builder.add_edge("persona_extraction", "text_generation") # 텍스트 생성 노드에서 텍스트 컨텐츠 체커 노드로 연결 builder.add_edge("text_generation", "text_content_check") - # 텍스트 컨텐츠 체커 노드에서 종료 노드로 연결 - builder.add_edge("text_content_check", "__end__") - - # 조건부 에지 추가 예시 - # builder.add_conditional_edges( - # "call_model", - # # call_model 실행이 완료된 후, 다음 노드(들)는 - # # router의 출력을 기반으로 예약됩니다 - # router, - # ) + # 텍스트 컨텐츠 체커 노드에서 텍스트 재생성 노드로 연결 + builder.add_edge("text_content_check", "text_check_router") + + # 조건부 에지 추가 + builder.add_conditional_edges( + "text_check_router", + lambda state: state["next"], # state에서 next 키의 값을 사용 + { + "text_generation": "text_content_check", # 실패시 text_generation으로 돌아감 + "__end__": "__end__", # 성공시 종료 + }, + ) workflow = builder.compile() # 그래프 컴파일 workflow.name = self.name # Workflow 이름 설정 From 7af13457dca1fb4e5d62958e9e617723f667562b Mon Sep 17 00:00:00 2001 From: jeongHwarr Date: Sat, 26 Jul 2025 14:14:13 +0900 Subject: [PATCH 2/3] choir: Remove unused dotenv import from workflow.py --- agents/text/workflow.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/agents/text/workflow.py b/agents/text/workflow.py index b53502b..3732507 100644 --- a/agents/text/workflow.py +++ b/agents/text/workflow.py @@ -1,5 +1,3 @@ -from dotenv import load_dotenv - from langgraph.graph import StateGraph from agents.base_workflow import BaseWorkflow From c95c078b0b8aaf04659fe42ad8e34063998f636b Mon Sep 17 00:00:00 2001 From: jeongHwarr Date: Sat, 26 Jul 2025 14:19:49 +0900 Subject: [PATCH 3/3] chore: Rename TextRegeneratorRouterNode to TextRegenerateRouterNode. --- agents/text/modules/nodes.py | 2 +- agents/text/workflow.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/agents/text/modules/nodes.py b/agents/text/modules/nodes.py index 9a13852..d3271ee 100644 --- a/agents/text/modules/nodes.py +++ b/agents/text/modules/nodes.py @@ -101,7 +101,7 @@ def execute(self, state: TextState) -> dict: return result -class TextRegeneratorRouterNode(BaseNode): +class TextRegenerateRouterNode(BaseNode): """ 텍스트 체크 결과를 기반으로 다음 노드를 결정하는 라우터 노드 """ diff --git a/agents/text/workflow.py b/agents/text/workflow.py index 3732507..fea72bf 100644 --- a/agents/text/workflow.py +++ b/agents/text/workflow.py @@ -5,7 +5,8 @@ GenTextNode, PersonaExtractionNode, TextContentCheckNode, - TextRegeneratorRouterNode, + TextRegenerateRouterNode +, ) from agents.text.modules.state import TextState @@ -44,7 +45,7 @@ def build(self): builder.add_node("text_content_check", TextContentCheckNode()) # 텍스트 재생성 노드 추가 - builder.add_node("text_check_router", TextRegeneratorRouterNode()) + builder.add_node("text_regenerate_router", TextRegenerateRouterNode()) # 시작 노드에서 페르소나 추출 노드로 연결 builder.add_edge("__start__", "persona_extraction") @@ -53,11 +54,11 @@ def build(self): # 텍스트 생성 노드에서 텍스트 컨텐츠 체커 노드로 연결 builder.add_edge("text_generation", "text_content_check") # 텍스트 컨텐츠 체커 노드에서 텍스트 재생성 노드로 연결 - builder.add_edge("text_content_check", "text_check_router") + builder.add_edge("text_content_check", "text_regenerate_router") # 조건부 에지 추가 builder.add_conditional_edges( - "text_check_router", + "text_regenerate_router", lambda state: state["next"], # state에서 next 키의 값을 사용 { "text_generation": "text_content_check", # 실패시 text_generation으로 돌아감