I am struggling to understand how threads and assistants work within the LangGraph Platform Framework
How I think it works
- create an assistant that’s associate with a graph
- For each conversation, create a thread
- access that thread object for conversation history/objects
What i am experiencing instead
- create assistant
- start conversation on thread 1
- start conversation on thread 2
- get thread 2 – contains message objects from thread 1
Below are the commands i’m using and some objects to illustrate this behavior
Run thread 1
http://localhost:2024/threads/73db4e56-58b1-4b62-ad2d-bdd37bda4c4a/runs/wait
Sent with Config object:
Configuration(
recursion_limit=1000,
deployment_url='http://localhost:2024',
user_id='user_123456',
stories_category='general',
personality_role="You are a mischievious Discord bot. You are not lame or uncool or annoying. \nYou try to speak back in the same style as the user.\nYou are succinct and don't ramble.\n",
graph_name='analyst_create_analysts',
thread_id='73db4e56-58b1-4b62-ad2d-bdd37bda4c4a'
)
Run thread 2
http: //localhost:2024/threads/2457e3c3-c626-4866-8a93-38b5de849098/runs/wait
Sent with Config Object:
Configuration(
recursion_limit=1000,
deployment_url='http://localhost:2024',
user_id='user_123456',
stories_category='general',
personality_role="You are a mischievious Discord bot. You are not lame or uncool or annoying. \nYou try to speak back in the same style as the user.\nYou are succinct and don't ramble.\n",
graph_name='analyst_create_analysts',
thread_id='2457e3c3-c626-4866-8a93-38b5de849098'
)
Get Thread 1
curl 'http: //localhost:2024/threads/73db4e56-58b1-4b62-ad2d-bdd37bda4c4a'
Result:
{
"thread_id": "73db4e56-58b1-4b62-ad2d-bdd37bda4c4a",
"created_at": "2025-07-22T23:13:07.259839+00:00",
"updated_at": "2025-07-22T23:13:18.569738+00:00",
"metadata": {
"graph_id": "analyst_create_analysts",
"assistant_id": "d6a3c5bd-74fd-459d-aa0d-b38a854b5220"
},
"status": "idle",
"config": {
"recursion_limit": 1000,
"deployment_url": "http: //localhost:2024",
"user_id": "user_123456",
"stories_category": "general",
"personality_role": "You are a mischievious Discord bot. You are not lame or uncool or annoying. \nYou try to speak back in the same style as the user.\nYou are succinct and don't ramble.\n",
"graph_name": "",
"thread_id": "2dcdfc2c-5231-41b7-91d7-386341c00aee",
"configurable": {
"langgraph_auth_user": null,
"langgraph_auth_user_id": "",
"langgraph_auth_permissions": [
]
}
},
"values": {
"messages": [
{
"content": "Yo, what's good? Just chillin' here, ready to vibe. You got somethin' on your mind or just droppin' a quick hello?",
"additional_kwargs": {
"selected_analysts": [
"The Tactile Explorer",
"The Minimalist Observer",
"The Grotesque Disruptor"
],
"direction": null,
"analyst_creation_instructions": " Given these analysts: {selected_analysts}, create detailed personas for each one. Return as JSON array with name, role, affiliation and description fields",
"system_prompt": "You are an assistant that generates analyst personas."
},
"response_metadata": {
},
"type": "human",
"name": null,
"id": "262d9df2-f512-473b-b841-2c2f4c68b6b6",
"example": false
}
]
},
"interrupts": {
}
}
Get Thread 2
curl 'http: //localhost:2024/threads/2457e3c3-c626-4866-8a93-38b5de849098'
Result (includes message object from thread 1):
{
"thread_id": "2457e3c3-c626-4866-8a93-38b5de849098",
"created_at": "2025-07-22T23:13:22.437333+00:00",
"updated_at": "2025-07-22T23:13:33.119084+00:00",
"metadata": {
"graph_id": "analyst_create_analysts",
"assistant_id": "d6a3c5bd-74fd-459d-aa0d-b38a854b5220"
},
"status": "idle",
"config": {
"recursion_limit": 1000,
"deployment_url": "http://localhost:2024",
"user_id": "user_123456",
"stories_category": "general",
"personality_role": "You are a mischievious Discord bot. You are not lame or uncool or annoying. \nYou try to speak back in the same style as the user.\nYou are succinct and don't ramble.\n",
"graph_name": "",
"thread_id": "2dcdfc2c-5231-41b7-91d7-386341c00aee",
"configurable": {
"langgraph_auth_user": null,
"langgraph_auth_user_id": "",
"langgraph_auth_permissions": [
]
}
},
"values": {
"messages": [
{
"content": "Yo, what's good? Just chillin' here, ready to vibe. You got somethin' on your mind or just droppin' a quick hello?",
"additional_kwargs": {
"selected_analysts": [
"The Tactile Explorer",
"The Minimalist Observer",
"The Grotesque Disruptor"
],
"direction": null,
"analyst_creation_instructions": " Given these analysts: {selected_analysts}, create detailed personas for each one. Return as JSON array with name, role, affiliation and description fields",
"system_prompt": "You are an assistant that generates analyst personas."
},
"response_metadata": {
},
"type": "human",
"name": null,
"id": "262d9df2-f512-473b-b841-2c2f4c68b6b6",
"example": false
},
{
"content": "✅",
"additional_kwargs": {
"selected_analysts": [
"The Minimalist Observer",
"The Tactile Explorer",
"The Hyperpop Provocateur"
],
"direction": null,
"analyst_creation_instructions": " Given these analysts: {selected_analysts}, create detailed personas for each one. Return as JSON array with name, role, affiliation and description fields",
"system_prompt": "You are an assistant that generates analyst personas."
},
"response_metadata": {
},
"type": "human",
"name": null,
"id": "47aae390-b828-48f3-8230-da93d1593015",
"example": false
}
]
},
"interrupts": {
}
What’s also maybe odd is that the config object returned with each get result shows a totally separate thread_id that was provided when I initialized the assistant, however i am clearly creating new thread ids and they are being created or else the get commands would not be working.