LangSmith는 React 컴포넌트를 graph 코드와 함께 배치할 수 있도록 지원합니다. 이를 통해 graph를 위한 특정 UI 컴포넌트를 구축하는 데 집중하면서 Agent Chat과 같은 기존 채팅 인터페이스에 쉽게 연결하고 실제로 필요할 때만 코드를 로드할 수 있습니다.
Tutorial
1. UI 컴포넌트 정의 및 구성
먼저, 첫 번째 UI 컴포넌트를 생성합니다. 각 컴포넌트에 대해 graph 코드에서 컴포넌트를 참조하는 데 사용될 고유 식별자를 제공해야 합니다.src/agent/ui.tsx
langgraph.json 구성에서 UI 컴포넌트를 정의합니다:
ui 섹션은 graph에서 사용할 UI 컴포넌트를 가리킵니다. 기본적으로 graph 이름과 동일한 키를 사용하는 것을 권장하지만, 원하는 대로 컴포넌트를 분할할 수 있습니다. 자세한 내용은 UI 컴포넌트의 namespace 사용자 정의를 참조하세요.
LangSmith는 UI 컴포넌트 코드와 스타일을 자동으로 번들링하고 LoadExternalComponent 컴포넌트에서 로드할 수 있는 외부 자산으로 제공합니다. react 및 react-dom과 같은 일부 종속성은 번들에서 자동으로 제외됩니다.
CSS와 Tailwind 4.x도 기본적으로 지원되므로 UI 컴포넌트에서 Tailwind 클래스와 shadcn/ui를 자유롭게 사용할 수 있습니다.
- src/agent/ui.tsx
- src/agent/styles.css
2. graph에서 UI 컴포넌트 전송
- Python
- JS
src/agent.py
3. React 애플리케이션에서 UI 요소 처리
클라이언트 측에서는useStream()과 LoadExternalComponent를 사용하여 UI 요소를 표시할 수 있습니다.
src/app/page.tsx
LoadExternalComponent는 LangSmith에서 UI 컴포넌트의 JS와 CSS를 가져와 shadow DOM에서 렌더링하여 애플리케이션의 나머지 부분과 스타일 격리를 보장합니다.
How-to 가이드
클라이언트 측에서 커스텀 컴포넌트 제공
클라이언트 애플리케이션에 이미 로드된 컴포넌트가 있는 경우, LangSmith에서 UI 코드를 가져오지 않고 직접 렌더링할 컴포넌트 맵을 제공할 수 있습니다.컴포넌트 로딩 중 로딩 UI 표시
컴포넌트가 로딩 중일 때 렌더링할 fallback UI를 제공할 수 있습니다.UI 컴포넌트의 namespace 사용자 정의
기본적으로LoadExternalComponent는 useStream() hook의 assistantId를 사용하여 UI 컴포넌트의 코드를 가져옵니다. LoadExternalComponent 컴포넌트에 namespace prop을 제공하여 이를 사용자 정의할 수 있습니다.
- src/app/page.tsx
- langgraph.json
UI 컴포넌트에서 thread state 접근 및 상호작용
useStreamContext hook을 사용하여 UI 컴포넌트 내부에서 thread state에 접근할 수 있습니다.
클라이언트 컴포넌트에 추가 컨텍스트 전달
LoadExternalComponent 컴포넌트에 meta prop을 제공하여 클라이언트 컴포넌트에 추가 컨텍스트를 전달할 수 있습니다.
useStreamContext hook을 사용하여 UI 컴포넌트에서 meta prop에 접근할 수 있습니다.
서버에서 UI 메시지 스트리밍
useStream() hook의 onCustomEvent 콜백을 사용하여 노드 실행이 완료되기 전에 UI 메시지를 스트리밍할 수 있습니다. 이는 LLM이 응답을 생성하는 동안 UI 컴포넌트를 업데이트할 때 특히 유용합니다.
ui.push() / push_ui_message()를 호출하여 UI 컴포넌트에 업데이트를 푸시할 수 있습니다.
- Python
- JS
- ui.tsx
state에서 UI 메시지 제거
RemoveMessage를 추가하여 state에서 메시지를 제거할 수 있는 것과 유사하게, UI 메시지의 ID로remove_ui_message / ui.delete를 호출하여 state에서 UI 메시지를 제거할 수 있습니다.
- Python
- JS
더 알아보기
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.