1. AI Agent Message 모델 설정
메시지 모델에 after_create_commit 및 after_update_commit 콜백을 추가하여 Turbo Stream 브로드캐스트를 활성화합니다.
-
생성 시:
broadcast_append_to를 사용하여messagesdiv에 새 메시지를 추가합니다. 이는 메시지 생성 시 즉각적인 UI 업데이트를 가능하게 합니다. -
업데이트 시:
broadcast_replace_to를 사용하여 특정 메시지 컴포넌트를 교체합니다. 이는 스트리밍 메시지나 메시지 내용 변경 시 유용합니다. 이를 위해 메시지 컴포넌트에는 고유한 ID가 필요합니다.
2. 뷰 (Show 뷰 및 메시지 컴포넌트) 변경
실시간 업데이트를 수신하고 올바르게 렌더링하기 위해 뷰를 조정합니다.
-
Show뷰:turbo_stream_from헬퍼를 사용하여 특정agent_task에 대한 Turbo Stream 채널을 구독합니다. 이로써 해당task와 관련된 모든 Turbo Stream 브로드캐스트를 수신할 수 있게 됩니다. -
MessagesDiv ID: 메시지를 담는div요소의 ID를agent_task_ID_messages형식으로 변경하여 여러 태스크가 동시에 열려 있어도 충돌 없이 작동하도록 합니다. -
메시지 컴포넌트 ID: 각 메시지 컴포넌트(
_message.html.erb)에agent_task_ID_message_ID형식의 고유 ID를 부여합니다. 이는broadcast_replace_to가 특정 메시지를 정확히 찾아 업데이트하는 데 필수적입니다.
3. 컨트롤러 (Create 액션) 최적화
메시지 생성 로직을 간소화하고 Turbo Stream의 이점을 극대화합니다.
-
메시지 렌더링 제거:
create액션에서 메시지를 명시적으로turbo_stream.append하는 로직을 제거합니다. 이제 메시지 모델의after_create_commit콜백이 이 역할을 대신하여 메시지 생성 시 자동으로 UI를 업데이트합니다. -
폼 초기화 유지: 메시지 입력 폼은
turbo_stream.replace를 통해 비어 있는 부분 뷰로 교체하여 계속해서 초기화됩니다.
4. 에이전트 모델 (Agent 모델) 콜백 추가
AI 에이전트의 메시지 처리 방식을 개선합니다.
-
add_message콜백:LangChain assistant에add_message콜백을 추가하여 AI 비서가 새 메시지를 생성할 때 이를 감지합니다. 이 콜백은task.upsert_message를 호출하여 메시지를 데이터베이스에 저장합니다. -
upsert_message메서드: 이 메서드는 메시지 또는 도구 호출의 중복 생성을 방지합니다. 기존 메시지가 이미 존재하면 새로 생성하지 않고, 필요한 경우 업데이트합니다. -
메시지 기록 전달: 에이전트에게 과거 메시지 기록을 전달할 때,
tool_calls및tool_call_id정보도 함께 포함하도록 하여 향후 도구 호출 기능 구현에 대비합니다.
5. 컨트롤러 (Agent Tasks 컨트롤러) 메시지 중복 생성 제거
이전에는 task.agent.run 호출 후 컨트롤러에서 수동으로 메시지를 생성하는 부분이 있었습니다. 이제 에이전트 모델의 add_message 콜백이 메시지 생성을 처리하므로, 컨트롤러의 중복 생성 로직을 제거합니다. 또한, 메시지 렌더링에 더 이상 필요 없는 response 변수도 함께 제거하여 코드를 더욱 간결하게 만듭니다. 이로써 메시지가 두 번 생성되는 문제를 해결하고, Turbo Stream을 통한 단일하고 효율적인 메시지 흐름을 구축합니다.