From c085b0d616cd2882c3a27cf398a47e0177fbdb5a Mon Sep 17 00:00:00 2001 From: Mayne0213 Date: Wed, 24 Dec 2025 13:09:27 +0900 Subject: [PATCH] REFACTOR(ui): hide agent reasoning output - Hide internal agent reasoning messages - Improve UI output clarity --- deploy/k8s/overlays/prod/kustomization.yaml | 2 +- services/backend/chainlit_app.py | 78 ++++++++++++++++----- 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/deploy/k8s/overlays/prod/kustomization.yaml b/deploy/k8s/overlays/prod/kustomization.yaml index 35b2a30..02ff650 100644 --- a/deploy/k8s/overlays/prod/kustomization.yaml +++ b/deploy/k8s/overlays/prod/kustomization.yaml @@ -16,5 +16,5 @@ commonLabels: # 이미지 태그 설정 (ArgoCD Image Updater가 자동으로 업데이트) images: - name: gitea0213.kro.kr/bluemayne/mas - newTag: main-sha-6ee000eaf3da5f8b68d81382de642fdd9d9b0a3b + newTag: main-sha-bc8ae78efc0a375931c73d5c1edbde2b410e4231 diff --git a/services/backend/chainlit_app.py b/services/backend/chainlit_app.py index abe40c6..51a40e9 100644 --- a/services/backend/chainlit_app.py +++ b/services/backend/chainlit_app.py @@ -52,6 +52,10 @@ async def main(message: cl.Message): response_msg = cl.Message(content="") await response_msg.send() + # 상태 표시용 메시지 + status_msg = cl.Message(content="⏳ 작업 중...") + await status_msg.send() + # MAS 그래프 실행 async for event in mas_graph.astream(initial_state): for node_name, state in event.items(): @@ -59,23 +63,65 @@ async def main(message: cl.Message): last_message = state["messages"][-1] agent_name = last_message["role"] agent_content = last_message["content"] - - # 에이전트별 아이콘 - agent_icons = { - "orchestrator": "🎼", - "planning": "📋", - "research": "🔍", - "backend_developer": "⚙️", - "frontend_developer": "🎨", - "infrastructure_engineer": "🏗️", - "review": "✅" - } - icon = agent_icons.get(agent_name, "🤖") - - # 스트리밍 업데이트 - response_msg.content += f"\n\n{icon} **{agent_name}**:\n{agent_content}" - await response_msg.update() + # 사용자에게 보여줄 에이전트만 필터링 + user_facing_agents = ["planning", "research", "backend_developer", + "frontend_developer", "infrastructure_engineer", "review"] + + if agent_name in user_facing_agents: + # 에이전트별 아이콘 + agent_icons = { + "planning": "📋", + "research": "🔍", + "backend_developer": "⚙️", + "frontend_developer": "🎨", + "infrastructure_engineer": "🏗️", + "review": "✅" + } + + agent_display_names = { + "planning": "계획 수립", + "research": "정보 수집", + "backend_developer": "백엔드 개발", + "frontend_developer": "프론트엔드 개발", + "infrastructure_engineer": "인프라 구성", + "review": "코드 리뷰" + } + + icon = agent_icons.get(agent_name, "🤖") + display_name = agent_display_names.get(agent_name, agent_name) + + # 내부 라우팅 정보 제거 (NEXT_AGENT, REASON 등) + cleaned_content = agent_content + for keyword in ["NEXT_AGENT:", "REASON:", "MESSAGE:"]: + if keyword in cleaned_content: + # 라우팅 정보가 포함된 경우 해당 부분 제거 + lines = cleaned_content.split("\n") + cleaned_lines = [line for line in lines if not line.strip().startswith(keyword.replace(":", ""))] + cleaned_content = "\n".join(cleaned_lines) + + # 스트리밍 업데이트 + response_msg.content += f"\n\n{icon} **{display_name}**:\n{cleaned_content.strip()}" + await response_msg.update() + + elif agent_name == "orchestrator": + # Orchestrator는 간단한 상태 메시지만 표시 + current_agent = state.get("current_agent", "") + status_icons = { + "planning": "📋 계획 수립 중...", + "research": "🔍 정보 수집 중...", + "code_backend": "⚙️ 백엔드 코드 작성 중...", + "code_frontend": "🎨 프론트엔드 코드 작성 중...", + "code_infrastructure": "🏗️ 인프라 구성 중...", + "review": "✅ 코드 검토 중...", + "end": "✨ 완료!" + } + status_text = status_icons.get(current_agent, "⏳ 작업 중...") + status_msg.content = status_text + await status_msg.update() + + # 상태 메시지 제거 + await status_msg.remove() # 최종 업데이트 await response_msg.update()