사전 요구사항
useStream() React hook은 LangGraph를 React 애플리케이션에 통합하는 원활한 방법을 제공합니다. 스트리밍, 상태 관리 및 분기 로직의 모든 복잡성을 처리하여 훌륭한 채팅 경험을 구축하는 데 집중할 수 있도록 합니다.
주요 기능:
- Messages 스트리밍: 메시지 청크 스트림을 처리하여 완전한 메시지 형성
- 메시지, 인터럽트, 로딩 상태 및 오류에 대한 자동 상태 관리
- 대화 분기: 채팅 기록의 모든 지점에서 대체 대화 경로 생성
- UI 독립적 설계: 자체 컴포넌트 및 스타일링 사용 가능
useStream()을 사용하는 방법을 살펴보겠습니다.
useStream()은 맞춤형 채팅 경험을 만들기 위한 견고한 기반을 제공합니다. 사전 구축된 채팅 컴포넌트 및 인터페이스를 원하신다면 CopilotKit 및 assistant-ui도 확인해보시기 바랍니다.
Installation
Example
UI 커스터마이징
useStream() hook은 복잡한 상태 관리를 백그라운드에서 처리하여 UI를 구축할 수 있는 간단한 인터페이스를 제공합니다. 기본적으로 제공되는 기능은 다음과 같습니다:
- Thread 상태 관리
- 로딩 및 오류 상태
- Interrupts
- 메시지 처리 및 업데이트
- 분기 지원
로딩 상태
isLoading 속성은 스트림이 활성화되어 있는지 알려주며, 다음과 같은 작업을 수행할 수 있습니다:
- 로딩 인디케이터 표시
- 처리 중 입력 필드 비활성화
- 취소 버튼 표시
페이지 새로고침 후 스트림 재개
useStream() hook은 reconnectOnMount: true를 설정하여 마운트 시 진행 중인 run을 자동으로 재개할 수 있습니다. 이는 페이지 새로고침 후 스트림을 계속하는 데 유용하며, 다운타임 동안 생성된 메시지와 이벤트가 손실되지 않도록 보장합니다.
window.sessionStorage에 저장되며, reconnectOnMount에 커스텀 storage를 전달하여 교체할 수 있습니다. storage는 thread에 대한 진행 중인 run ID를 유지하는 데 사용됩니다(lg:stream:${threadId} 키 아래).
joinStream 함수를 사용하여 스트림을 재개함으로써 수동으로 재개 프로세스를 관리할 수도 있습니다. run을 생성할 때 streamResumable: true를 전달해야 합니다. 그렇지 않으면 일부 이벤트가 손실될 수 있습니다.
Thread 관리
내장된 thread 관리로 대화를 추적할 수 있습니다. 현재 thread ID에 액세스하고 새 thread가 생성될 때 알림을 받을 수 있습니다:threadId를 저장하는 것을 권장합니다.
메시지 처리
useStream() hook은 서버로부터 받은 메시지 청크를 추적하고 이를 연결하여 완전한 메시지를 형성합니다. 완성된 메시지 청크는 messages 속성을 통해 검색할 수 있습니다.
기본적으로 messagesKey는 messages로 설정되어 있으며, 새 메시지 청크를 values["messages"]에 추가합니다. 메시지를 다른 키에 저장하는 경우 messagesKey의 값을 변경할 수 있습니다.
useStream() hook은 streamMode: "messages-tuple"을 사용하여 그래프 노드 내의 모든 LangChain chat model 호출로부터 메시지 스트림(즉, 개별 LLM 토큰)을 수신합니다. 메시지 스트리밍에 대한 자세한 내용은 streaming 가이드를 참조하세요.
Interrupts
useStream() hook은 interrupt 속성을 노출하며, 이는 thread의 마지막 interrupt로 채워집니다. interrupt를 사용하여 다음을 수행할 수 있습니다:
- 노드를 실행하기 전에 확인 UI 렌더링
- 사용자 입력 대기, 에이전트가 사용자에게 명확한 질문을 할 수 있도록 허용
분기
각 메시지에 대해getMessagesMetadata()를 사용하여 메시지가 처음 표시된 첫 번째 checkpoint를 가져올 수 있습니다. 그런 다음 첫 번째 표시된 checkpoint 이전의 checkpoint에서 새 run을 생성하여 thread에 새 분기를 만들 수 있습니다.
분기는 다음과 같은 방법으로 생성할 수 있습니다:
- 이전 사용자 메시지 편집.
- 이전 assistant 메시지의 재생성 요청.
experimental_branchTree 속성을 사용하여 thread의 트리 표현을 가져올 수 있으며, 이는 메시지 기반이 아닌 그래프에 대한 분기 컨트롤을 렌더링하는 데 사용할 수 있습니다.
Optimistic Updates
에이전트에 네트워크 요청을 수행하기 전에 클라이언트 상태를 낙관적으로 업데이트하여 에이전트가 요청을 보기 전에 사용자 메시지를 즉시 표시하는 등 사용자에게 즉각적인 피드백을 제공할 수 있습니다.캐시된 Thread 표시
initialValues 옵션을 사용하여 서버에서 기록을 로드하는 동안 캐시된 thread 데이터를 즉시 표시할 수 있습니다. 이는 기존 thread로 이동할 때 캐시된 데이터를 즉시 표시하여 사용자 경험을 개선합니다.
Optimistic Thread 생성
submit 함수의 threadId 옵션을 사용하여 thread가 실제로 생성되기 전에 thread ID를 알아야 하는 optimistic UI 패턴을 활성화할 수 있습니다.
TypeScript
useStream() hook은 TypeScript로 작성된 앱에 친화적이며 상태에 대한 타입을 지정하여 더 나은 타입 안전성과 IDE 지원을 받을 수 있습니다.
ConfigurableType:config.configurable속성의 타입 (기본값:Record<string, unknown>)InterruptType: interrupt 값의 타입 - 즉,interrupt(...)함수의 내용 (기본값:unknown)CustomEventType: 커스텀 이벤트의 타입 (기본값:unknown)UpdateType: submit 함수의 타입 (기본값:Partial<State>)
import type { ... } 지시문을 통해).
Event 처리
useStream() hook은 다양한 이벤트에 응답하는 데 도움이 되는 여러 callback 옵션을 제공합니다:
onError: 오류가 발생할 때 호출됩니다.onFinish: 스트림이 완료될 때 호출됩니다.onUpdateEvent: update 이벤트가 수신될 때 호출됩니다.onCustomEvent: 커스텀 이벤트가 수신될 때 호출됩니다. 커스텀 이벤트를 스트리밍하는 방법은 streaming 가이드를 참조하세요.onMetadataEvent: Run ID와 Thread ID를 포함하는 metadata 이벤트가 수신될 때 호출됩니다.
더 알아보기
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.