# Migrating to react-langgraph v0.7
URL: /docs/migrations/react-langgraph-v0-7
Guide to upgrading to the simplified LangGraph integration API.
***
title: Migrating to react-langgraph v0.7
description: Guide to upgrading to the simplified LangGraph integration API.
----------------------------------------------------------------------------
## Overview
This guide helps you migrate from the previous LangGraph integration pattern to the new simplified API introduced in `@assistant-ui/react-langgraph` v0.7. The new API consolidates thread management directly into `useLangGraphRuntime`, eliminating the need for separate runtime hooks and manual thread state management.
## Key Changes
### 1. Simplified Thread Management
The `useLangGraphRuntime` hook now directly handles thread lifecycle:
* No more `useRemoteThreadListRuntime` wrapper
* No more separate runtime hook functions
* Thread management is built into the core runtime
### 2. New `initialize` Parameter
The `stream` function now receives an `initialize` parameter that handles thread creation and loading automatically.
### 3. Direct Cloud Integration
Cloud persistence can now be configured directly in `useLangGraphRuntime` with the `cloud` parameter.
## Migration Steps
### Update Your Runtime Implementation
#### Before (Old Pattern)
```tsx
import {
useCloudThreadListRuntime,
useThreadListItemRuntime,
} from "@assistant-ui/react";
import { useLangGraphRuntime } from "@assistant-ui/react-langgraph";
const useMyLangGraphRuntime = () => {
const threadListItemRuntime = useThreadListItemRuntime();
const runtime = useLangGraphRuntime({
stream: async function* (messages) {
const { externalId } = await threadListItemRuntime.initialize();
if (!externalId) throw new Error("Thread not found");
return sendMessage({
threadId: externalId,
messages,
});
},
onSwitchToThread: async (externalId) => {
const state = await getThreadState(externalId);
return {
messages: state.values.messages,
};
},
});
return runtime;
};
// In your component:
const runtime = useCloudThreadListRuntime({
cloud,
runtimeHook: useMyLangGraphRuntime,
create: async () => {
const { thread_id } = await createThread();
return { externalId: thread_id };
},
});
```
#### After (New Pattern)
```tsx
import { useLangGraphRuntime } from "@assistant-ui/react-langgraph";
// Directly in your component:
const runtime = useLangGraphRuntime({
cloud, // Optional: for cloud persistence
stream: async function* (messages, { initialize }) {
const { externalId } = await initialize();
if (!externalId) throw new Error("Thread not found");
return sendMessage({
threadId: externalId,
messages,
});
},
create: async () => {
const { thread_id } = await createThread();
return { externalId: thread_id };
},
load: async (externalId) => {
const state = await getThreadState(externalId);
return {
messages: state.values.messages,
};
},
});
```
### Update Import Statements
Remove unused imports:
```diff
- import {
- useCloudThreadListRuntime,
- useThreadListItemRuntime,
- } from "@assistant-ui/react";
+ import { AssistantCloud } from "@assistant-ui/react";
```
### Simplify Component Structure
You no longer need a separate runtime hook function. Everything can be defined directly in your component or provider:
```tsx
export function MyRuntimeProvider({ children }) {
const cloud = useMemo(
() => new AssistantCloud({
baseUrl: process.env.NEXT_PUBLIC_ASSISTANT_BASE_URL,
}),
[]
);
const runtime = useLangGraphRuntime({
cloud,
// All configuration inline
stream: async function* (messages, { initialize }) {
// Your stream implementation
},
create: async () => {
// Your create implementation
},
load: async (externalId) => {
// Your load implementation
},
});
return (
{children}
);
}
```
### Update Method Names
Rename methods to match the new API:
* `onSwitchToThread` → `load`
* `onSwitchToNewThread` → handled automatically via `create`
* Thread ID management is now automatic
## API Reference Changes
### Old API
```typescript
type OldLangGraphRuntimeOptions = {
threadId?: string;
stream: (messages: Message[]) => AsyncGenerator;
onSwitchToNewThread?: () => Promise;
onSwitchToThread?: (threadId: string) => Promise;
};
```
### New API
```typescript
type NewLangGraphRuntimeOptions = {
cloud?: AssistantCloud;
stream: (
messages: Message[],
context: {
initialize: () => Promise<{
remoteId: string;
externalId: string | undefined;
}>
}
) => AsyncGenerator;
create?: () => Promise<{ externalId: string }>;
load?: (externalId: string) => Promise;
delete?: (externalId: string) => Promise;
};
```
## Benefits of the New API
1. **Simpler Setup**: No need for multiple runtime hooks and wrappers
2. **Cleaner Code**: All configuration in one place
3. **Better Type Safety**: More explicit types for thread management
4. **Automatic Thread Handling**: The runtime manages thread lifecycle internally
5. **Optional Cloud Integration**: Add cloud persistence with a single parameter
## Common Migration Issues
**Breaking Change**: The `threadId` and `onSwitchToNewThread` parameters are no longer supported. Use the new `create` and `load` methods instead.
### Issue: `threadListItemRuntime` is not defined
**Solution**: Remove references to `useThreadListItemRuntime()`. Use the `initialize` parameter in the stream function instead.
### Issue: Thread switching doesn't work
**Solution**: Ensure you've implemented both `create` and `load` functions. The runtime needs both to manage thread lifecycle.
### Issue: Cloud persistence not working
**Solution**: Pass the `AssistantCloud` instance directly to `useLangGraphRuntime` via the `cloud` parameter.
## Example: Complete Migration
Here's a complete before and after example for a typical LangGraph integration:
### Before
```tsx title="runtime-provider.tsx"
import {
AssistantCloud,
AssistantRuntimeProvider,
useCloudThreadListRuntime,
useThreadListItemRuntime,
} from "@assistant-ui/react";
import { useLangGraphRuntime } from "@assistant-ui/react-langgraph";
const useMyRuntime = () => {
const threadListItemRuntime = useThreadListItemRuntime();
return useLangGraphRuntime({
stream: async function* (messages) {
const { externalId } = await threadListItemRuntime.initialize();
// ... implementation
},
onSwitchToThread: async (externalId) => {
// ... implementation
},
});
};
export function Provider({ children }) {
const cloud = new AssistantCloud({ /* config */ });
const runtime = useCloudThreadListRuntime({
cloud,
runtimeHook: useMyRuntime,
create: async () => { /* ... */ },
});
return (
{children}
);
}
```
### After
```tsx title="runtime-provider.tsx"
import {
AssistantCloud,
AssistantRuntimeProvider,
} from "@assistant-ui/react";
import { useLangGraphRuntime } from "@assistant-ui/react-langgraph";
export function Provider({ children }) {
const cloud = new AssistantCloud({ /* config */ });
const runtime = useLangGraphRuntime({
cloud,
stream: async function* (messages, { initialize }) {
const { externalId } = await initialize();
// ... implementation
},
create: async () => { /* ... */ },
load: async (externalId) => {
// ... implementation (formerly onSwitchToThread)
},
});
return (
{children}
);
}
```
## Need Help?
If you encounter issues during migration:
1. Check the updated [LangGraph documentation](/docs/runtimes/langgraph)
2. Review the [example implementation](https://github.com/assistant-ui/assistant-ui/tree/main/examples/with-langgraph)
3. Report issues on [GitHub](https://github.com/assistant-ui/assistant-ui/issues)