More performance improvements in checkpointing and channels (#1685)

* Performance improvements in checkpointer libs

- Use sha1 instead of md5 for hashing (faster in python 3.x)
- Use orjson instead of json for json dumping (sadly can't use for json loading)

* Update tests

* Update

* Use random number instead of hash for get_version_number

* Avoid saving writes for the last task to complete in each step

- only when possible, exceptions for ERROR, INTERRUPT, SEND

* Make Channel.from_checkpoint a regular function

- context manager no longer needed since Context became a managed value

* Use __slots__ for Channels

* Fix for kafka
This commit is contained in:
Nuno Campos
2024-09-12 21:08:30 -07:00
committed by GitHub
parent 8a80b1d3b1
commit 66fc7c96aa
20 changed files with 199 additions and 337 deletions
@@ -1,4 +1,4 @@
from hashlib import md5
import random
from typing import Any, List, Optional, Tuple
from langchain_core.runnables import RunnableConfig
@@ -8,7 +8,6 @@ from langgraph.checkpoint.base import (
WRITES_IDX_MAP,
BaseCheckpointSaver,
Checkpoint,
EmptyChannelError,
get_checkpoint_id,
)
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
@@ -244,11 +243,8 @@ class BasePostgresSaver(BaseCheckpointSaver):
else:
current_v = int(current.split(".")[0])
next_v = current_v + 1
try:
next_h = md5(self.serde.dumps_typed(channel.checkpoint())[1]).hexdigest()
except EmptyChannelError:
next_h = ""
return f"{next_v:032}.{next_h}"
next_h = random.random()
return f"{next_v:032}.{next_h:016}"
def _search_where(
self,