langgraph-api 0.17.0.dev1__py3-none-any.whl → 0.17.0.dev3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
langgraph_api/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.17.0.dev1"
1
+ __version__ = "0.17.0.dev3"
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import base64
10
10
  import functools
11
+ import hashlib
11
12
  from typing import TYPE_CHECKING, Any
12
13
 
13
14
  import orjson
@@ -24,17 +25,57 @@ if TYPE_CHECKING:
24
25
  from langgraph_api.encryption.custom import ModelType
25
26
 
26
27
  AES_ENCRYPTED_PREFIX = "encrypted.aes:"
28
+ AES_ENVELOPE_MAGIC = b"LGAES-ENVELOPE\x00\x00"
29
+ AES_ENVELOPE_VERSION = 1
30
+ AES_KEY_ID_SIZE = 16
31
+ AES_ENVELOPE_SIZE = len(AES_ENVELOPE_MAGIC) + 1 + AES_KEY_ID_SIZE
27
32
 
28
33
  # Marker key to identify AES encryption in __encryption_context__
29
34
  AES_ENCRYPTION_TYPE_KEY = "__langgraph_encryption_type__"
30
35
  AES_ENCRYPTION_CONTEXT = {AES_ENCRYPTION_TYPE_KEY: "aes"}
31
36
 
32
37
 
33
- def _get_aes_cipher(key: bytes) -> CipherProtocol:
34
- """Get AES cipher using the SDK's implementation (same as checkpoint encryption)."""
35
- # EncryptedSerializer.from_pycryptodome_aes creates a PycryptodomeAesCipher internally
36
- # We extract it to reuse the exact same encryption format as checkpoints
37
- return EncryptedSerializer.from_pycryptodome_aes(key=key).cipher
38
+ class _EnvelopeAwareAesCipher:
39
+ """Read Go AES envelopes while preserving legacy Python writes."""
40
+
41
+ def __init__(self, key: bytes, legacy: CipherProtocol) -> None:
42
+ self._key = key
43
+ self._legacy = legacy
44
+
45
+ def encrypt(self, plaintext: bytes) -> tuple[str, bytes]:
46
+ return self._legacy.encrypt(plaintext)
47
+
48
+ def decrypt(self, ciphername: str, ciphertext: bytes) -> bytes:
49
+ if not ciphertext.startswith(AES_ENVELOPE_MAGIC):
50
+ return self._legacy.decrypt(ciphername, ciphertext)
51
+ if len(ciphertext) < AES_ENVELOPE_SIZE:
52
+ raise ValueError("invalid AES envelope: header is truncated")
53
+
54
+ header = ciphertext[:AES_ENVELOPE_SIZE]
55
+ if header[len(AES_ENVELOPE_MAGIC)] != AES_ENVELOPE_VERSION:
56
+ raise ValueError(
57
+ f"unsupported AES envelope version {header[len(AES_ENVELOPE_MAGIC)]}"
58
+ )
59
+ expected_key_id = hashlib.sha256(
60
+ b"langgraph-aes-key-id-v1\x00" + self._key
61
+ ).digest()[:AES_KEY_ID_SIZE]
62
+ if header[-AES_KEY_ID_SIZE:] != expected_key_id:
63
+ raise ValueError("AES envelope was encrypted with a different key")
64
+
65
+ from Crypto.Cipher import AES # noqa: PLC0415
66
+
67
+ encrypted = ciphertext[AES_ENVELOPE_SIZE:]
68
+ nonce = encrypted[:16]
69
+ tag = encrypted[16:32]
70
+ cipher = AES.new(self._key, AES.MODE_EAX, nonce=nonce)
71
+ cipher.update(header)
72
+ return cipher.decrypt_and_verify(encrypted[32:], tag)
73
+
74
+
75
+ def get_aes_cipher(key: bytes) -> CipherProtocol:
76
+ """Return cipher compatible with legacy Python and Go envelope formats."""
77
+ legacy = EncryptedSerializer.from_pycryptodome_aes(key=key).cipher
78
+ return _EnvelopeAwareAesCipher(key, legacy)
38
79
 
39
80
 
40
81
  def is_aes_encrypted(value: Any) -> bool:
@@ -72,7 +113,7 @@ class AesEncryptionInstance:
72
113
  """
73
114
 
74
115
  def __init__(self, key: bytes, allowlist: frozenset[str]) -> None:
75
- self._cipher = _get_aes_cipher(key)
116
+ self._cipher = get_aes_cipher(key)
76
117
  self._allowlist = allowlist
77
118
 
78
119
  def encrypt_value(self, value: Any) -> str:
@@ -271,6 +271,7 @@ class JsonEncryptionWrapper:
271
271
  )
272
272
 
273
273
  custom_decryptor = self._custom.get_json_decryptor(model_type)
274
+ custom_encryptor = self.get_json_encryptor(model_type)
274
275
 
275
276
  async def decryptor(ctx: Any, data: dict[str, Any]) -> dict[str, Any]:
276
277
  # No marker → plaintext passthrough
@@ -287,7 +288,18 @@ class JsonEncryptionWrapper:
287
288
  f"for {model_type}"
288
289
  )
289
290
  aes_decryptor = self._aes.get_json_decryptor(model_type)
290
- return await aes_decryptor(ctx, data)
291
+ plaintext = await aes_decryptor(ctx, data)
292
+ if with_replacement and custom_encryptor is not None:
293
+ try:
294
+ replacement = await custom_encryptor(ctx, plaintext)
295
+ except Exception:
296
+ await logger.aexception(
297
+ "Failed to create AES-to-custom replacement",
298
+ model=model_type,
299
+ )
300
+ replacement = None
301
+ return DecryptResult(plaintext, replacement)
302
+ return plaintext
291
303
 
292
304
  # Custom marker → use custom decryptor
293
305
  if custom_decryptor is None:
langgraph_api/store.py CHANGED
@@ -18,6 +18,7 @@ from langgraph_api.encryption.middleware import (
18
18
  decrypt_response,
19
19
  encrypt_request,
20
20
  )
21
+ from langgraph_api.encryption.shared import ENCRYPTION_CONTEXT_KEY
21
22
  from langgraph_api.timing import profiled_import
22
23
  from langgraph_api.utils.config import run_in_executor
23
24
 
@@ -49,6 +50,20 @@ def _bypass_store_encryption() -> bool:
49
50
  return config.USE_GRPC_STORE or CUSTOM_STORE is not None
50
51
 
51
52
 
53
+ def _bypass_store_decryption(item: dict[str, Any]) -> bool:
54
+ if config.USE_GRPC_STORE or CUSTOM_STORE is None:
55
+ return config.USE_GRPC_STORE
56
+ value = item.get("value")
57
+ return not isinstance(value, dict) or ENCRYPTION_CONTEXT_KEY not in value
58
+
59
+
60
+ async def _decrypt_store_item(item: Any) -> dict[str, Any]:
61
+ data = item.dict()
62
+ return await decrypt_response(
63
+ data, "store", plaintext_from_core=_bypass_store_decryption(data)
64
+ )
65
+
66
+
52
67
  async def put_item(
53
68
  namespace: tuple[str, ...],
54
69
  key: str,
@@ -71,9 +86,7 @@ async def get_item(
71
86
  item = await (await get_store()).aget(namespace, key, refresh_ttl=refresh_ttl)
72
87
  if item is None:
73
88
  return None
74
- return await decrypt_response(
75
- item.dict(), "store", plaintext_from_core=_bypass_store_encryption()
76
- )
89
+ return await _decrypt_store_item(item)
77
90
 
78
91
 
79
92
  async def search_items(
@@ -93,14 +106,7 @@ async def search_items(
93
106
  query=query,
94
107
  refresh_ttl=refresh_ttl,
95
108
  )
96
- return await asyncio.gather(
97
- *(
98
- decrypt_response(
99
- item.dict(), "store", plaintext_from_core=_bypass_store_encryption()
100
- )
101
- for item in items
102
- )
103
- )
109
+ return await asyncio.gather(*(_decrypt_store_item(item) for item in items))
104
110
 
105
111
 
106
112
  async def exit_store():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.17.0.dev1
3
+ Version: 0.17.0.dev3
4
4
  Author-email: Will Fu-Hinthorn <will@langchain.dev>, Josh Rogers <josh@langchain.dev>, Parker Rule <parker@langchain.dev>
5
5
  License: Elastic-2.0
6
6
  License-File: LICENSE
@@ -1,4 +1,4 @@
1
- langgraph_api/__init__.py,sha256=hdE8nT_aX9d97gN6AyRt7YYCNaPhvfqN_BbgcfrGfe0,28
1
+ langgraph_api/__init__.py,sha256=pn1nqezcA97-ZFVVxhAFszcY6u3IehNFsM3IJ5rKGgs,28
2
2
  langgraph_api/_factory_utils.py,sha256=_FqW0olMu2PGLsnRq0ylt3a4jDCe12YIFHExMXI6Nyo,5976
3
3
  langgraph_api/asgi_transport.py,sha256=XApY3lIWBZTMbbsl8dDJzl0cLGirmAGE0SifqZUnXvs,11896
4
4
  langgraph_api/asyncio.py,sha256=Q131e14VVIh7WajMTtM6i4bJIirYxRQIsjpFN_tn7XE,11723
@@ -29,7 +29,7 @@ langgraph_api/serde.py,sha256=sMjrORY2WCNmZEXDaE3lydi1un686qR1E_Wxw4mFgjU,9144
29
29
  langgraph_api/server.py,sha256=L1jGWkvK0fDewyus0xYvYmwQ6k775uNn_mXSKUnIOK0,11245
30
30
  langgraph_api/sse.py,sha256=cChZ7raQUHp8p5BreE_5wMBR8lFO0n7746sV8_HQOrc,4822
31
31
  langgraph_api/state.py,sha256=SC6kOmKXVV2puU37rc3yYveZFgnqP5uI_WidDyE5oXQ,4763
32
- langgraph_api/store.py,sha256=2GqMrCUP6NuCbeYro2XFnNSzA9iOSg_DFpKv2fhZtl8,6771
32
+ langgraph_api/store.py,sha256=fy97OLYtC63yQBWJpM_CqU5y2sT8UU4gXOTEBzugLwQ,7085
33
33
  langgraph_api/stream.py,sha256=0adXgdp7GjLOG5juSViRlae9tSHvKCFYn2eNUi400w0,34097
34
34
  langgraph_api/stream_v2.py,sha256=cmbE566boEgKkjcqqf8OvDqjWh8VzvCCsTTlvUF5Drg,10762
35
35
  langgraph_api/traceblock.py,sha256=GhgAtLhAQ8Z8LHtRQq3par-rfPpRBQp2Q7WBACJq1NI,677
@@ -77,9 +77,9 @@ langgraph_api/config/__init__.py,sha256=irVLC0SYb9s0M5u9yKGCZkUBbLEz2uprfhQ_-AQj
77
77
  langgraph_api/config/_parse.py,sha256=RpfZgFAPJlRMv13AzGr3kAYbIrqHcgjzO8IgeboTw4A,3922
78
78
  langgraph_api/config/schemas.py,sha256=Yi3SZ7uNLSncRe0SyFb0eVqWljDpap8csm9B_xH9IWE,21487
79
79
  langgraph_api/encryption/__init__.py,sha256=gaCZ00CocSbqSqrDn6XJHaSp2CZCnC8qnrD9G4fbzyI,363
80
- langgraph_api/encryption/aes_json.py,sha256=ExLgrthzVYGP4X51TStU2Td_Sn_3-kXHyk6UKTFmzW4,6139
80
+ langgraph_api/encryption/aes_json.py,sha256=OkHKd_JLleMvo1sZtB29ph4sAjC6_kaeNOQqoHyRnSk,7676
81
81
  langgraph_api/encryption/context.py,sha256=58WO3Tbt-1dsAskxyntzKPSHInuWd4jNIUOVGDwz9es,3245
82
- langgraph_api/encryption/custom.py,sha256=S6YPuEcW7aMfY6y43zzXD1ZBWOIi0OpdQhj_69SxFOw,12339
82
+ langgraph_api/encryption/custom.py,sha256=oG8vF8Q_UNQ3Egnc16WhBZSOfYWRVnI4B1QpaC9m8NE,12953
83
83
  langgraph_api/encryption/middleware.py,sha256=j_RtEOSxtHevl4NyJ2YSlozibN8WFJ_ep9Ri1gRDcCM,13121
84
84
  langgraph_api/encryption/shared.py,sha256=WdumeYSb-p0jsUsZp4urvba1oxMzj5rhP6amREllZbM,2732
85
85
  langgraph_api/event_streaming/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
@@ -177,7 +177,7 @@ hatch_build.py,sha256=Nn9N-EFfVqmH5q3iCUrhqX6zc7qT1jLI3gWSBN2xgYQ,1738
177
177
  logging.json,sha256=sBy8HDDPuucpLbLUD6e8t5fsiQjJoklZsbVHi2qQ7aQ,367
178
178
  openapi.json,sha256=JZA_O8Ri_fQ1WORro8chGKr_MswwonMDNuUzgr9DZn4,224235
179
179
  langgraph_grpc_common/__init__.py,sha256=sO7jFHekQxt6zZPhTPZAWLYLB_S8w7-VuJ7NyWFlFNo,97
180
- langgraph_grpc_common/checkpointer.py,sha256=GoSI_wFBRxI-ltJKARI84qPOYT_qH__d0fsMwM8E6BE,15394
180
+ langgraph_grpc_common/checkpointer.py,sha256=qNUrdS8veKuxy-S4-soCvsiB_P0SpoS5jdJ5q6JAzRg,15620
181
181
  langgraph_grpc_common/serde.py,sha256=8q290nZ6TdxbEhCTzwEs44XGi2b-3pfrUeMYY5WGlTY,6179
182
182
  langgraph_grpc_common/store.py,sha256=ae34gPQS260oBh2hcNLzI7-c1xKMs6FVvsJExqFRbhk,4743
183
183
  langgraph_grpc_common/conversion/__init__.py,sha256=pLsOrRtmF9YkgmCPhcfym6lYOB7PCJTRItyo1YK_AT8,208
@@ -185,12 +185,12 @@ langgraph_grpc_common/conversion/_compat.py,sha256=MIEo69I7tfaPskunPGwBCKheksLwx
185
185
  langgraph_grpc_common/conversion/checkpoint.py,sha256=BENL92Wn67Puedf6hWmb6eT_wtuurqd6l0KvICMM5x8,13490
186
186
  langgraph_grpc_common/conversion/config.py,sha256=LmPNpMiJ5JFTAHI_Z9A_zjbxPru5gCbIa-wgs2L9HSk,13458
187
187
  langgraph_grpc_common/conversion/durability.py,sha256=FWhqjzVN4JrrsAL9AwsJkvIorQGNRl14w97Va-WZRk0,991
188
- langgraph_grpc_common/conversion/store.py,sha256=eQQ7YHrMYRsd1jN9LbqvCxGQGErySV_07n3meADiYIE,15237
188
+ langgraph_grpc_common/conversion/store.py,sha256=uftOtzpQ8VuYXMtmEOz-q6N9GpBRKxah4obncVdVky4,15361
189
189
  langgraph_grpc_common/conversion/struct.py,sha256=yk4jpPdywzn8UosAohun21lU5D_IIglOY9rkBhiG-gA,2072
190
190
  langgraph_grpc_common/conversion/value.py,sha256=KW-z0gvpvCq8iWUjjtx8F3XQGM7XsL-D9GzPzdtuMsA,10206
191
191
  langgraph_grpc_common/proto/__init__.py,sha256=YIIlx6_ZbLk-xGwWPmzUhbLGNpo6zIG07zWIKZxTzM4,1471
192
- langgraph_grpc_common/proto/checkpointer_pb2.py,sha256=dQMt9vNXqXDvTU6euvH52uliDsL44BSppJIsAySmPfc,9039
193
- langgraph_grpc_common/proto/checkpointer_pb2.pyi,sha256=Jjr9-oeKGk1wuIFf8m7zoCb9lHty1Bh9u-jxvRvqYLI,23319
192
+ langgraph_grpc_common/proto/checkpointer_pb2.py,sha256=zt24iOYdp1JxkEPedaadztVVegrbGaTTBR2T2nxn-MA,10807
193
+ langgraph_grpc_common/proto/checkpointer_pb2.pyi,sha256=mPimbM8fRqBeeNV_-pDJy5XPd_ypcmio-C1Pe8h-5Ps,26649
194
194
  langgraph_grpc_common/proto/checkpointer_pb2_grpc.py,sha256=FQJK-lC8alOkLltA51aq1ABam62rVerTZRZccTFqUjw,20152
195
195
  langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi,sha256=8fPL90WjHnMaREG7l9qYt5fQePeT8YFWQ0qVy56QtYw,10210
196
196
  langgraph_grpc_common/proto/core_api_pb2.py,sha256=TEBUQnGaEIGQ2yD6JJAhCtGFCp-0DRKIdqB7OT050gw,51386
@@ -249,12 +249,12 @@ langgraph_grpc_common/proto/runner_pb2.py,sha256=MTU1wtNY3SrpuuRX3bBMXuhABTKBwFs
249
249
  langgraph_grpc_common/proto/runner_pb2.pyi,sha256=QLC07iamViYph2ZrrTkvxBgBHAVoCfOnMaESAaVXf_o,6615
250
250
  langgraph_grpc_common/proto/runner_pb2_grpc.py,sha256=FgvbUNy-s8U6rXpPCVSM0qbz8OGKeNBrpNxojmBpaCA,4064
251
251
  langgraph_grpc_common/proto/runner_pb2_grpc.pyi,sha256=f3aq3bDzCTvcZK9M8kb-BYyyL6mm2oFI20FOvc6IvOE,2975
252
- langgraph_grpc_common/proto/store_pb2.py,sha256=JKcuJK0YUC1BSwLUZJWHCQ7AWkzVS9KffakJlF9XFLo,8206
253
- langgraph_grpc_common/proto/store_pb2.pyi,sha256=ItSuXbA2X9bQlHtuEjDGi0fT_gJj2b0sr7XuQkybe3s,28983
252
+ langgraph_grpc_common/proto/store_pb2.py,sha256=VWJ7wtzL9pVmZZKbxMzOzCoiFn58bB2g8L6F7aT63Ow,8260
253
+ langgraph_grpc_common/proto/store_pb2.pyi,sha256=atXejijuYEb9tE0stGQdZcfA9ucMFj-ytTMwvkxwviM,29322
254
254
  langgraph_grpc_common/proto/store_pb2_grpc.py,sha256=Kyt8eV2NXkjh3be_BYytGdD19kNf74961cruonMvCrw,3300
255
255
  langgraph_grpc_common/proto/store_pb2_grpc.pyi,sha256=oS1h2cDoq2OjyM8xazcmc8LwRDC5oCAD0zto2QUmPQw,2027
256
- langgraph_api-0.17.0.dev1.dist-info/METADATA,sha256=yAg5EcrcxufD8MtPBDm63JweSuTV5iHwihvK2G5wCoU,5879
257
- langgraph_api-0.17.0.dev1.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
258
- langgraph_api-0.17.0.dev1.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
259
- langgraph_api-0.17.0.dev1.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
260
- langgraph_api-0.17.0.dev1.dist-info/RECORD,,
256
+ langgraph_api-0.17.0.dev3.dist-info/METADATA,sha256=S367FDSn4V16JCXlT-VkGl5IsUIOmrSFkE7GMvRU76c,5879
257
+ langgraph_api-0.17.0.dev3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
258
+ langgraph_api-0.17.0.dev3.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
259
+ langgraph_api-0.17.0.dev3.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
260
+ langgraph_api-0.17.0.dev3.dist-info/RECORD,,
@@ -77,8 +77,8 @@ class GrpcCheckpointer(BaseCheckpointSaver):
77
77
  ``langgraph_grpc_common.conversion.*`` keep using the
78
78
  process-wide default
79
79
  encryption_context_provider: Optional callable returning the
80
- request-scoped encryption context, sent with writes so the
81
- server can encrypt blobs with the caller's context. Injected
80
+ request-scoped encryption context, sent with reads and writes
81
+ so the server can encrypt blobs with the caller's context. Injected
82
82
  rather than read directly because the context lives in a
83
83
  ``ContextVar`` owned by ``langgraph_api``, which this package
84
84
  does not depend on.
@@ -146,7 +146,8 @@ class GrpcCheckpointer(BaseCheckpointSaver):
146
146
  async def aget_tuple(self, config: RunnableConfig) -> CheckpointTuple | None:
147
147
  with self._scoped():
148
148
  request = checkpointer_pb2.GetTupleRequest(
149
- config=ckpt_conv.checkpoint_config_to_proto(config)
149
+ config=ckpt_conv.checkpoint_config_to_proto(config),
150
+ encryption_context_json=self._encryption_context_json(),
150
151
  )
151
152
 
152
153
  async def _request() -> CheckpointTuple | None:
@@ -276,6 +277,7 @@ class GrpcCheckpointer(BaseCheckpointSaver):
276
277
  config=ckpt_conv.checkpoint_config_to_proto(config),
277
278
  filter_json=convert_dict_to_json_bytes(filter) or b"",
278
279
  before=ckpt_conv.checkpoint_config_to_proto(before),
280
+ encryption_context_json=self._encryption_context_json(),
279
281
  )
280
282
  if limit is not None:
281
283
  request.limit = limit
@@ -393,6 +395,7 @@ class GrpcCheckpointer(BaseCheckpointSaver):
393
395
  # Empty checkpoint_id => server resolves the latest checkpoint.
394
396
  checkpoint_id=configurable.get("checkpoint_id", "") or "",
395
397
  channels=list(channels),
398
+ encryption_context_json=self._encryption_context_json(),
396
399
  )
397
400
 
398
401
  async def _request() -> checkpointer_pb2.GetDeltaChannelHistoryResponse:
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import math
5
6
  from datetime import datetime
6
7
  from typing import TYPE_CHECKING, Any, cast
7
8
 
@@ -61,11 +62,9 @@ def _ensure_index_config(
61
62
  def _ttl_to_proto_minutes(ttl: float | None) -> int:
62
63
  if ttl is None:
63
64
  return 0
64
- if ttl != int(ttl):
65
- raise ValueError(
66
- f"gRPC store only supports integer-minute TTL; got fractional ttl={ttl}"
67
- )
68
- return int(ttl)
65
+ # The API accepts fractional minutes but the store keeps whole minutes;
66
+ # round up so items never expire earlier than requested.
67
+ return math.ceil(ttl)
69
68
 
70
69
 
71
70
  # Ordered comparisons compare the *text* form of the field (value->>key); $eq/$ne
@@ -178,6 +177,7 @@ def op_to_proto(
178
177
  "key": str(op.key),
179
178
  "value_json": orjson.dumps(op.value),
180
179
  "ttlMinutes": _ttl_to_proto_minutes(op.ttl),
180
+ "ttlMinutesExact": op.ttl or 0.0,
181
181
  }
182
182
  if vectors is not None:
183
183
  put_kwargs["vectors"] = list(vectors)
@@ -227,7 +227,9 @@ def op_from_proto(msg: store_pb2.Op) -> Op:
227
227
  if kind == "put":
228
228
  p = msg.put
229
229
  ttl: float | None = None
230
- if p.ttlMinutes:
230
+ if p.ttlMinutesExact:
231
+ ttl = p.ttlMinutesExact
232
+ elif p.ttlMinutes:
231
233
  ttl = float(p.ttlMinutes)
232
234
  return PutOp(
233
235
  namespace=tuple(p.namespace),
@@ -26,7 +26,7 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
26
26
  from . import engine_common_pb2 as engine__common__pb2
27
27
 
28
28
 
29
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x63heckpointer.proto\x12\x0c\x63heckpointer\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x65ngine-common.proto\"\xab\x03\n\nPutRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12,\n\ncheckpoint\x18\x02 \x01(\x0b\x32\x18.engineCommon.Checkpoint\x12\x32\n\x08metadata\x18\x03 \x01(\x0b\x32 .engineCommon.CheckpointMetadata\x12?\n\x0cnew_versions\x18\x04 \x03(\x0b\x32).checkpointer.PutRequest.NewVersionsEntry\x12T\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x33.checkpointer.PutRequest.EncryptionContextJsonEntry\x1a\x32\n\x10NewVersionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\xa9\x02\n\x10PutWritesRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12#\n\x06writes\x18\x02 \x03(\x0b\x32\x13.engineCommon.Write\x12\x0f\n\x07task_id\x18\x03 \x01(\t\x12\x11\n\ttask_path\x18\x04 \x01(\t\x12Z\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x39.checkpointer.PutWritesRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\x86\x01\n\x0c\x43\x61pabilities\x12\x1e\n\x16supports_delete_thread\x18\x01 \x01(\x08\x12\x16\n\x0esupports_prune\x18\x02 \x01(\x08\x12 \n\x18supports_delete_for_runs\x18\x03 \x01(\x08\x12\x1c\n\x14supports_copy_thread\x18\x04 \x01(\x08\"\xa8\x01\n\x0bListRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12\x13\n\x0b\x66ilter_json\x18\x02 \x01(\x0c\x12\x32\n\x06\x62\x65\x66ore\x18\x03 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12\x12\n\x05limit\x18\x04 \x01(\x03H\x00\x88\x01\x01\x42\x08\n\x06_limit\"(\n\x13\x44\x65leteThreadRequest\x12\x11\n\tthread_id\x18\x01 \x01(\t\"\'\n\x14\x44\x65leteForRunsRequest\x12\x0f\n\x07run_ids\x18\x01 \x03(\t\"A\n\x11\x43opyThreadRequest\x12\x16\n\x0e\x66rom_thread_id\x18\x01 \x01(\t\x12\x14\n\x0cto_thread_id\x18\x02 \x01(\t\"\xa1\x01\n\x0cPruneRequest\x12\x12\n\nthread_ids\x18\x01 \x03(\t\x12:\n\x08strategy\x18\x02 \x01(\x0e\x32(.checkpointer.PruneRequest.PruneStrategy\"A\n\rPruneStrategy\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0f\n\x0bKEEP_LATEST\x10\x01\x12\x0e\n\nDELETE_ALL\x10\x02\"E\n\x0fGetTupleRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\"F\n\x0bPutResponse\x12\x37\n\x0bnext_config\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\"H\n\x0cListResponse\x12\x38\n\x11\x63heckpoint_tuples\x18\x01 \x03(\x0b\x32\x1d.engineCommon.CheckpointTuple\"e\n\x10GetTupleResponse\x12<\n\x10\x63heckpoint_tuple\x18\x01 \x01(\x0b\x32\x1d.engineCommon.CheckpointTupleH\x00\x88\x01\x01\x42\x13\n\x11_checkpoint_tuple\"~\n\x18\x44\x65ltaChannelHistoryEntry\x12-\n\x04seed\x18\x01 \x01(\x0b\x32\x1a.engineCommon.ChannelValueH\x00\x88\x01\x01\x12*\n\x06writes\x18\x02 \x03(\x0b\x32\x1a.engineCommon.PendingWriteB\x07\n\x05_seed\"r\n\x1dGetDeltaChannelHistoryRequest\x12\x11\n\tthread_id\x18\x01 \x01(\t\x12\x15\n\rcheckpoint_ns\x18\x02 \x01(\t\x12\x15\n\rcheckpoint_id\x18\x03 \x01(\t\x12\x10\n\x08\x63hannels\x18\x04 \x03(\t\"\xc4\x01\n\x1eGetDeltaChannelHistoryResponse\x12J\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x39.checkpointer.GetDeltaChannelHistoryResponse.EntriesEntry\x1aV\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x35\n\x05value\x18\x02 \x01(\x0b\x32&.checkpointer.DeltaChannelHistoryEntry:\x02\x38\x01\x32\xf1\x05\n\x0c\x43heckpointer\x12:\n\x03Put\x12\x18.checkpointer.PutRequest\x1a\x19.checkpointer.PutResponse\x12\x43\n\tPutWrites\x12\x1e.checkpointer.PutWritesRequest\x1a\x16.google.protobuf.Empty\x12\x45\n\x0fGetCapabilities\x12\x16.google.protobuf.Empty\x1a\x1a.checkpointer.Capabilities\x12=\n\x04List\x12\x19.checkpointer.ListRequest\x1a\x1a.checkpointer.ListResponse\x12I\n\x08GetTuple\x12\x1d.checkpointer.GetTupleRequest\x1a\x1e.checkpointer.GetTupleResponse\x12I\n\x0c\x44\x65leteThread\x12!.checkpointer.DeleteThreadRequest\x1a\x16.google.protobuf.Empty\x12K\n\rDeleteForRuns\x12\".checkpointer.DeleteForRunsRequest\x1a\x16.google.protobuf.Empty\x12\x45\n\nCopyThread\x12\x1f.checkpointer.CopyThreadRequest\x1a\x16.google.protobuf.Empty\x12;\n\x05Prune\x12\x1a.checkpointer.PruneRequest\x1a\x16.google.protobuf.Empty\x12s\n\x16GetDeltaChannelHistory\x12+.checkpointer.GetDeltaChannelHistoryRequest\x1a,.checkpointer.GetDeltaChannelHistoryResponseB?Z=github.com/langchain-ai/langgraph-api/core/internal/engine/pbb\x06proto3')
29
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x63heckpointer.proto\x12\x0c\x63heckpointer\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x65ngine-common.proto\"\xab\x03\n\nPutRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12,\n\ncheckpoint\x18\x02 \x01(\x0b\x32\x18.engineCommon.Checkpoint\x12\x32\n\x08metadata\x18\x03 \x01(\x0b\x32 .engineCommon.CheckpointMetadata\x12?\n\x0cnew_versions\x18\x04 \x03(\x0b\x32).checkpointer.PutRequest.NewVersionsEntry\x12T\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x33.checkpointer.PutRequest.EncryptionContextJsonEntry\x1a\x32\n\x10NewVersionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\xa9\x02\n\x10PutWritesRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12#\n\x06writes\x18\x02 \x03(\x0b\x32\x13.engineCommon.Write\x12\x0f\n\x07task_id\x18\x03 \x01(\t\x12\x11\n\ttask_path\x18\x04 \x01(\t\x12Z\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x39.checkpointer.PutWritesRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\x86\x01\n\x0c\x43\x61pabilities\x12\x1e\n\x16supports_delete_thread\x18\x01 \x01(\x08\x12\x16\n\x0esupports_prune\x18\x02 \x01(\x08\x12 \n\x18supports_delete_for_runs\x18\x03 \x01(\x08\x12\x1c\n\x14supports_copy_thread\x18\x04 \x01(\x08\"\xbd\x02\n\x0bListRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12\x13\n\x0b\x66ilter_json\x18\x02 \x01(\x0c\x12\x32\n\x06\x62\x65\x66ore\x18\x03 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12\x12\n\x05limit\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12U\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x34.checkpointer.ListRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x08\n\x06_limit\"(\n\x13\x44\x65leteThreadRequest\x12\x11\n\tthread_id\x18\x01 \x01(\t\"\'\n\x14\x44\x65leteForRunsRequest\x12\x0f\n\x07run_ids\x18\x01 \x03(\t\"A\n\x11\x43opyThreadRequest\x12\x16\n\x0e\x66rom_thread_id\x18\x01 \x01(\t\x12\x14\n\x0cto_thread_id\x18\x02 \x01(\t\"\xa1\x01\n\x0cPruneRequest\x12\x12\n\nthread_ids\x18\x01 \x03(\t\x12:\n\x08strategy\x18\x02 \x01(\x0e\x32(.checkpointer.PruneRequest.PruneStrategy\"A\n\rPruneStrategy\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0f\n\x0bKEEP_LATEST\x10\x01\x12\x0e\n\nDELETE_ALL\x10\x02\"\xde\x01\n\x0fGetTupleRequest\x12\x32\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\x12Y\n\x17\x65ncryption_context_json\x18\x02 \x03(\x0b\x32\x38.checkpointer.GetTupleRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"F\n\x0bPutResponse\x12\x37\n\x0bnext_config\x18\x01 \x01(\x0b\x32\".engineCommon.EngineRunnableConfig\"H\n\x0cListResponse\x12\x38\n\x11\x63heckpoint_tuples\x18\x01 \x03(\x0b\x32\x1d.engineCommon.CheckpointTuple\"e\n\x10GetTupleResponse\x12<\n\x10\x63heckpoint_tuple\x18\x01 \x01(\x0b\x32\x1d.engineCommon.CheckpointTupleH\x00\x88\x01\x01\x42\x13\n\x11_checkpoint_tuple\"~\n\x18\x44\x65ltaChannelHistoryEntry\x12-\n\x04seed\x18\x01 \x01(\x0b\x32\x1a.engineCommon.ChannelValueH\x00\x88\x01\x01\x12*\n\x06writes\x18\x02 \x03(\x0b\x32\x1a.engineCommon.PendingWriteB\x07\n\x05_seed\"\x99\x02\n\x1dGetDeltaChannelHistoryRequest\x12\x11\n\tthread_id\x18\x01 \x01(\t\x12\x15\n\rcheckpoint_ns\x18\x02 \x01(\t\x12\x15\n\rcheckpoint_id\x18\x03 \x01(\t\x12\x10\n\x08\x63hannels\x18\x04 \x03(\t\x12g\n\x17\x65ncryption_context_json\x18\x05 \x03(\x0b\x32\x46.checkpointer.GetDeltaChannelHistoryRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\xc4\x01\n\x1eGetDeltaChannelHistoryResponse\x12J\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x39.checkpointer.GetDeltaChannelHistoryResponse.EntriesEntry\x1aV\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x35\n\x05value\x18\x02 \x01(\x0b\x32&.checkpointer.DeltaChannelHistoryEntry:\x02\x38\x01\x32\xf1\x05\n\x0c\x43heckpointer\x12:\n\x03Put\x12\x18.checkpointer.PutRequest\x1a\x19.checkpointer.PutResponse\x12\x43\n\tPutWrites\x12\x1e.checkpointer.PutWritesRequest\x1a\x16.google.protobuf.Empty\x12\x45\n\x0fGetCapabilities\x12\x16.google.protobuf.Empty\x1a\x1a.checkpointer.Capabilities\x12=\n\x04List\x12\x19.checkpointer.ListRequest\x1a\x1a.checkpointer.ListResponse\x12I\n\x08GetTuple\x12\x1d.checkpointer.GetTupleRequest\x1a\x1e.checkpointer.GetTupleResponse\x12I\n\x0c\x44\x65leteThread\x12!.checkpointer.DeleteThreadRequest\x1a\x16.google.protobuf.Empty\x12K\n\rDeleteForRuns\x12\".checkpointer.DeleteForRunsRequest\x1a\x16.google.protobuf.Empty\x12\x45\n\nCopyThread\x12\x1f.checkpointer.CopyThreadRequest\x1a\x16.google.protobuf.Empty\x12;\n\x05Prune\x12\x1a.checkpointer.PruneRequest\x1a\x16.google.protobuf.Empty\x12s\n\x16GetDeltaChannelHistory\x12+.checkpointer.GetDeltaChannelHistoryRequest\x1a,.checkpointer.GetDeltaChannelHistoryResponseB?Z=github.com/langchain-ai/langgraph-api/core/internal/engine/pbb\x06proto3')
30
30
 
31
31
  _globals = globals()
32
32
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -40,6 +40,12 @@ if not _descriptor._USE_C_DESCRIPTORS:
40
40
  _globals['_PUTREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
41
41
  _globals['_PUTWRITESREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._loaded_options = None
42
42
  _globals['_PUTWRITESREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
43
+ _globals['_LISTREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._loaded_options = None
44
+ _globals['_LISTREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
45
+ _globals['_GETTUPLEREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._loaded_options = None
46
+ _globals['_GETTUPLEREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
47
+ _globals['_GETDELTACHANNELHISTORYREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._loaded_options = None
48
+ _globals['_GETDELTACHANNELHISTORYREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
43
49
  _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._loaded_options = None
44
50
  _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._serialized_options = b'8\001'
45
51
  _globals['_PUTREQUEST']._serialized_start=87
@@ -55,33 +61,39 @@ if not _descriptor._USE_C_DESCRIPTORS:
55
61
  _globals['_CAPABILITIES']._serialized_start=817
56
62
  _globals['_CAPABILITIES']._serialized_end=951
57
63
  _globals['_LISTREQUEST']._serialized_start=954
58
- _globals['_LISTREQUEST']._serialized_end=1122
59
- _globals['_DELETETHREADREQUEST']._serialized_start=1124
60
- _globals['_DELETETHREADREQUEST']._serialized_end=1164
61
- _globals['_DELETEFORRUNSREQUEST']._serialized_start=1166
62
- _globals['_DELETEFORRUNSREQUEST']._serialized_end=1205
63
- _globals['_COPYTHREADREQUEST']._serialized_start=1207
64
- _globals['_COPYTHREADREQUEST']._serialized_end=1272
65
- _globals['_PRUNEREQUEST']._serialized_start=1275
66
- _globals['_PRUNEREQUEST']._serialized_end=1436
67
- _globals['_PRUNEREQUEST_PRUNESTRATEGY']._serialized_start=1371
68
- _globals['_PRUNEREQUEST_PRUNESTRATEGY']._serialized_end=1436
69
- _globals['_GETTUPLEREQUEST']._serialized_start=1438
70
- _globals['_GETTUPLEREQUEST']._serialized_end=1507
71
- _globals['_PUTRESPONSE']._serialized_start=1509
72
- _globals['_PUTRESPONSE']._serialized_end=1579
73
- _globals['_LISTRESPONSE']._serialized_start=1581
74
- _globals['_LISTRESPONSE']._serialized_end=1653
75
- _globals['_GETTUPLERESPONSE']._serialized_start=1655
76
- _globals['_GETTUPLERESPONSE']._serialized_end=1756
77
- _globals['_DELTACHANNELHISTORYENTRY']._serialized_start=1758
78
- _globals['_DELTACHANNELHISTORYENTRY']._serialized_end=1884
79
- _globals['_GETDELTACHANNELHISTORYREQUEST']._serialized_start=1886
80
- _globals['_GETDELTACHANNELHISTORYREQUEST']._serialized_end=2000
81
- _globals['_GETDELTACHANNELHISTORYRESPONSE']._serialized_start=2003
82
- _globals['_GETDELTACHANNELHISTORYRESPONSE']._serialized_end=2199
83
- _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._serialized_start=2113
84
- _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._serialized_end=2199
85
- _globals['_CHECKPOINTER']._serialized_start=2202
86
- _globals['_CHECKPOINTER']._serialized_end=2955
64
+ _globals['_LISTREQUEST']._serialized_end=1271
65
+ _globals['_LISTREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_start=454
66
+ _globals['_LISTREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_end=514
67
+ _globals['_DELETETHREADREQUEST']._serialized_start=1273
68
+ _globals['_DELETETHREADREQUEST']._serialized_end=1313
69
+ _globals['_DELETEFORRUNSREQUEST']._serialized_start=1315
70
+ _globals['_DELETEFORRUNSREQUEST']._serialized_end=1354
71
+ _globals['_COPYTHREADREQUEST']._serialized_start=1356
72
+ _globals['_COPYTHREADREQUEST']._serialized_end=1421
73
+ _globals['_PRUNEREQUEST']._serialized_start=1424
74
+ _globals['_PRUNEREQUEST']._serialized_end=1585
75
+ _globals['_PRUNEREQUEST_PRUNESTRATEGY']._serialized_start=1520
76
+ _globals['_PRUNEREQUEST_PRUNESTRATEGY']._serialized_end=1585
77
+ _globals['_GETTUPLEREQUEST']._serialized_start=1588
78
+ _globals['_GETTUPLEREQUEST']._serialized_end=1810
79
+ _globals['_GETTUPLEREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_start=454
80
+ _globals['_GETTUPLEREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_end=514
81
+ _globals['_PUTRESPONSE']._serialized_start=1812
82
+ _globals['_PUTRESPONSE']._serialized_end=1882
83
+ _globals['_LISTRESPONSE']._serialized_start=1884
84
+ _globals['_LISTRESPONSE']._serialized_end=1956
85
+ _globals['_GETTUPLERESPONSE']._serialized_start=1958
86
+ _globals['_GETTUPLERESPONSE']._serialized_end=2059
87
+ _globals['_DELTACHANNELHISTORYENTRY']._serialized_start=2061
88
+ _globals['_DELTACHANNELHISTORYENTRY']._serialized_end=2187
89
+ _globals['_GETDELTACHANNELHISTORYREQUEST']._serialized_start=2190
90
+ _globals['_GETDELTACHANNELHISTORYREQUEST']._serialized_end=2471
91
+ _globals['_GETDELTACHANNELHISTORYREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_start=454
92
+ _globals['_GETDELTACHANNELHISTORYREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_end=514
93
+ _globals['_GETDELTACHANNELHISTORYRESPONSE']._serialized_start=2474
94
+ _globals['_GETDELTACHANNELHISTORYRESPONSE']._serialized_end=2670
95
+ _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._serialized_start=2584
96
+ _globals['_GETDELTACHANNELHISTORYRESPONSE_ENTRIESENTRY']._serialized_end=2670
97
+ _globals['_CHECKPOINTER']._serialized_start=2673
98
+ _globals['_CHECKPOINTER']._serialized_end=3426
87
99
  # @@protoc_insertion_point(module_scope)
@@ -24,8 +24,7 @@ DESCRIPTOR: _descriptor.FileDescriptor
24
24
  class PutRequest(_message.Message):
25
25
  """encryption_context_json: request-scoped encryption context, keyed by name
26
26
  with JSON-encoded values (e.g. {"tenant_id": "\\"acme\\""}). Writes must pass
27
- it because it lives in a Python ContextVar the core server cannot observe;
28
- reads recover it from the stored blob wrapper.
27
+ it because it lives in a Python ContextVar the core server cannot observe.
29
28
  """
30
29
 
31
30
  DESCRIPTOR: _descriptor.Descriptor
@@ -194,16 +193,39 @@ Global___Capabilities: _TypeAlias = Capabilities # noqa: Y015
194
193
  class ListRequest(_message.Message):
195
194
  DESCRIPTOR: _descriptor.Descriptor
196
195
 
196
+ @_typing.final
197
+ class EncryptionContextJsonEntry(_message.Message):
198
+ DESCRIPTOR: _descriptor.Descriptor
199
+
200
+ KEY_FIELD_NUMBER: _builtins.int
201
+ VALUE_FIELD_NUMBER: _builtins.int
202
+ key: _builtins.str
203
+ value: _builtins.bytes
204
+ def __init__(
205
+ self,
206
+ *,
207
+ key: _builtins.str = ...,
208
+ value: _builtins.bytes = ...,
209
+ ) -> None: ...
210
+ _HasFieldArgType: _TypeAlias = _Never # noqa: Y015
211
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
212
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] # noqa: Y015
213
+ def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
214
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
215
+
197
216
  CONFIG_FIELD_NUMBER: _builtins.int
198
217
  FILTER_JSON_FIELD_NUMBER: _builtins.int
199
218
  BEFORE_FIELD_NUMBER: _builtins.int
200
219
  LIMIT_FIELD_NUMBER: _builtins.int
220
+ ENCRYPTION_CONTEXT_JSON_FIELD_NUMBER: _builtins.int
201
221
  filter_json: _builtins.bytes
202
222
  limit: _builtins.int
203
223
  @_builtins.property
204
224
  def config(self) -> _engine_common_pb2.EngineRunnableConfig: ...
205
225
  @_builtins.property
206
226
  def before(self) -> _engine_common_pb2.EngineRunnableConfig: ...
227
+ @_builtins.property
228
+ def encryption_context_json(self) -> _containers.ScalarMap[_builtins.str, _builtins.bytes]: ...
207
229
  def __init__(
208
230
  self,
209
231
  *,
@@ -211,10 +233,11 @@ class ListRequest(_message.Message):
211
233
  filter_json: _builtins.bytes = ...,
212
234
  before: _engine_common_pb2.EngineRunnableConfig | None = ...,
213
235
  limit: _builtins.int | None = ...,
236
+ encryption_context_json: _abc.Mapping[_builtins.str, _builtins.bytes] | None = ...,
214
237
  ) -> None: ...
215
238
  _HasFieldArgType: _TypeAlias = _typing.Literal["_limit", b"_limit", "before", b"before", "config", b"config", "limit", b"limit"] # noqa: Y015
216
239
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
217
- _ClearFieldArgType: _TypeAlias = _typing.Literal["_limit", b"_limit", "before", b"before", "config", b"config", "filter_json", b"filter_json", "limit", b"limit"] # noqa: Y015
240
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["_limit", b"_limit", "before", b"before", "config", b"config", "encryption_context_json", b"encryption_context_json", "filter_json", b"filter_json", "limit", b"limit"] # noqa: Y015
218
241
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
219
242
  _WhichOneofReturnType__limit: _TypeAlias = _typing.Literal["limit"] # noqa: Y015
220
243
  _WhichOneofArgType__limit: _TypeAlias = _typing.Literal["_limit", b"_limit"] # noqa: Y015
@@ -330,17 +353,41 @@ Global___PruneRequest: _TypeAlias = PruneRequest # noqa: Y015
330
353
  class GetTupleRequest(_message.Message):
331
354
  DESCRIPTOR: _descriptor.Descriptor
332
355
 
356
+ @_typing.final
357
+ class EncryptionContextJsonEntry(_message.Message):
358
+ DESCRIPTOR: _descriptor.Descriptor
359
+
360
+ KEY_FIELD_NUMBER: _builtins.int
361
+ VALUE_FIELD_NUMBER: _builtins.int
362
+ key: _builtins.str
363
+ value: _builtins.bytes
364
+ def __init__(
365
+ self,
366
+ *,
367
+ key: _builtins.str = ...,
368
+ value: _builtins.bytes = ...,
369
+ ) -> None: ...
370
+ _HasFieldArgType: _TypeAlias = _Never # noqa: Y015
371
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
372
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] # noqa: Y015
373
+ def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
374
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
375
+
333
376
  CONFIG_FIELD_NUMBER: _builtins.int
377
+ ENCRYPTION_CONTEXT_JSON_FIELD_NUMBER: _builtins.int
334
378
  @_builtins.property
335
379
  def config(self) -> _engine_common_pb2.EngineRunnableConfig: ...
380
+ @_builtins.property
381
+ def encryption_context_json(self) -> _containers.ScalarMap[_builtins.str, _builtins.bytes]: ...
336
382
  def __init__(
337
383
  self,
338
384
  *,
339
385
  config: _engine_common_pb2.EngineRunnableConfig | None = ...,
386
+ encryption_context_json: _abc.Mapping[_builtins.str, _builtins.bytes] | None = ...,
340
387
  ) -> None: ...
341
388
  _HasFieldArgType: _TypeAlias = _typing.Literal["config", b"config"] # noqa: Y015
342
389
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
343
- _ClearFieldArgType: _TypeAlias = _typing.Literal["config", b"config"] # noqa: Y015
390
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["config", b"config", "encryption_context_json", b"encryption_context_json"] # noqa: Y015
344
391
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
345
392
  def WhichOneof(self, oneof_group: _Never) -> None: ...
346
393
 
@@ -446,10 +493,31 @@ Global___DeltaChannelHistoryEntry: _TypeAlias = DeltaChannelHistoryEntry # noqa
446
493
  class GetDeltaChannelHistoryRequest(_message.Message):
447
494
  DESCRIPTOR: _descriptor.Descriptor
448
495
 
496
+ @_typing.final
497
+ class EncryptionContextJsonEntry(_message.Message):
498
+ DESCRIPTOR: _descriptor.Descriptor
499
+
500
+ KEY_FIELD_NUMBER: _builtins.int
501
+ VALUE_FIELD_NUMBER: _builtins.int
502
+ key: _builtins.str
503
+ value: _builtins.bytes
504
+ def __init__(
505
+ self,
506
+ *,
507
+ key: _builtins.str = ...,
508
+ value: _builtins.bytes = ...,
509
+ ) -> None: ...
510
+ _HasFieldArgType: _TypeAlias = _Never # noqa: Y015
511
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
512
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] # noqa: Y015
513
+ def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
514
+ def WhichOneof(self, oneof_group: _Never) -> None: ...
515
+
449
516
  THREAD_ID_FIELD_NUMBER: _builtins.int
450
517
  CHECKPOINT_NS_FIELD_NUMBER: _builtins.int
451
518
  CHECKPOINT_ID_FIELD_NUMBER: _builtins.int
452
519
  CHANNELS_FIELD_NUMBER: _builtins.int
520
+ ENCRYPTION_CONTEXT_JSON_FIELD_NUMBER: _builtins.int
453
521
  thread_id: _builtins.str
454
522
  """Thread whose delta-channel state to reconstruct."""
455
523
  checkpoint_ns: _builtins.str
@@ -462,6 +530,8 @@ class GetDeltaChannelHistoryRequest(_message.Message):
462
530
  def channels(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]:
463
531
  """Channels to reconstruct."""
464
532
 
533
+ @_builtins.property
534
+ def encryption_context_json(self) -> _containers.ScalarMap[_builtins.str, _builtins.bytes]: ...
465
535
  def __init__(
466
536
  self,
467
537
  *,
@@ -469,10 +539,11 @@ class GetDeltaChannelHistoryRequest(_message.Message):
469
539
  checkpoint_ns: _builtins.str = ...,
470
540
  checkpoint_id: _builtins.str = ...,
471
541
  channels: _abc.Iterable[_builtins.str] | None = ...,
542
+ encryption_context_json: _abc.Mapping[_builtins.str, _builtins.bytes] | None = ...,
472
543
  ) -> None: ...
473
544
  _HasFieldArgType: _TypeAlias = _Never # noqa: Y015
474
545
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
475
- _ClearFieldArgType: _TypeAlias = _typing.Literal["channels", b"channels", "checkpoint_id", b"checkpoint_id", "checkpoint_ns", b"checkpoint_ns", "thread_id", b"thread_id"] # noqa: Y015
546
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["channels", b"channels", "checkpoint_id", b"checkpoint_id", "checkpoint_ns", b"checkpoint_ns", "encryption_context_json", b"encryption_context_json", "thread_id", b"thread_id"] # noqa: Y015
476
547
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
477
548
  def WhichOneof(self, oneof_group: _Never) -> None: ...
478
549
 
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
25
25
  from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
26
26
 
27
27
 
28
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bstore.proto\x12\x05store\x1a\x1bgoogle/protobuf/empty.proto\"\xb5\x01\n\x0c\x42\x61tchRequest\x12\x16\n\x03ops\x18\x01 \x03(\x0b\x32\t.store.Op\x12O\n\x17\x65ncryption_context_json\x18\x02 \x03(\x0b\x32..store.BatchRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"1\n\rBatchResponse\x12 \n\x07results\x18\x01 \x03(\x0b\x32\x0f.store.OpResult\"\xbe\x01\n\x02Op\x12\x1b\n\x03get\x18\x01 \x01(\x0b\x32\x0c.store.GetOpH\x00\x12\x1b\n\x03put\x18\x02 \x01(\x0b\x32\x0c.store.PutOpH\x00\x12!\n\x06\x64\x65lete\x18\x03 \x01(\x0b\x32\x0f.store.DeleteOpH\x00\x12!\n\x06search\x18\x04 \x01(\x0b\x32\x0f.store.SearchOpH\x00\x12\x32\n\x0flist_namespaces\x18\x05 \x01(\x0b\x32\x17.store.ListNamespacesOpH\x00\x42\x04\n\x02op\";\n\x05GetOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nrefreshTTL\x18\x03 \x01(\x08\"*\n\x08\x44\x65leteOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"L\n\x0f\x46ilterCondition\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x02op\x18\x02 \x01(\x0e\x32\x0f.store.FilterOp\x12\x0f\n\x07operand\x18\x03 \x01(\t\"\xa4\x01\n\x08SearchOp\x12\x18\n\x10namespace_prefix\x18\x01 \x03(\t\x12&\n\x06\x66ilter\x18\x02 \x03(\x0b\x32\x16.store.FilterCondition\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\x12\n\nrefreshTTL\x18\x06 \x01(\x08\x12#\n\x06vector\x18\x07 \x01(\x0b\x32\x13.store.VectorSearch\"\x94\x01\n\x0cVectorSearch\x12\x17\n\x0fquery_embedding\x18\x01 \x03(\x02\x12*\n\rdistance_type\x18\x02 \x01(\x0e\x32\x13.store.DistanceType\x12\x17\n\x0fvectors_per_doc\x18\x03 \x01(\x05\x12&\n\x0bvector_type\x18\x04 \x01(\x0e\x32\x11.store.VectorType\"D\n\x0eMatchCondition\x12$\n\nmatch_type\x18\x01 \x01(\x0e\x32\x10.store.MatchType\x12\x0c\n\x04path\x18\x02 \x03(\t\"\x88\x01\n\x10ListNamespacesOp\x12/\n\x10match_conditions\x18\x01 \x03(\x0b\x32\x15.store.MatchCondition\x12\x16\n\tmax_depth\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x42\x0c\n\n_max_depth\"3\n\x0bVectorValue\x12\x11\n\tvaluePath\x18\x01 \x01(\t\x12\x11\n\tembedding\x18\x02 \x03(\x02\"t\n\x05PutOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\nttlMinutes\x18\x04 \x01(\x05\x12#\n\x07vectors\x18\x05 \x03(\x0b\x32\x12.store.VectorValue\"\xb8\x01\n\x08OpResult\x12\x1b\n\x04item\x18\x01 \x01(\x0b\x32\x0b.store.ItemH\x00\x12&\n\x04none\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12%\n\x06search\x18\x03 \x01(\x0b\x32\x13.store.SearchResultH\x00\x12\x36\n\x0flist_namespaces\x18\x04 \x01(\x0b\x32\x1b.store.ListNamespacesResultH\x00\x42\x08\n\x06result\"b\n\x04Item\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\t\x12\x12\n\nupdated_at\x18\x05 \x01(\t\"\x86\x01\n\nSearchItem\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\t\x12\x12\n\nupdated_at\x18\x05 \x01(\t\x12\x12\n\x05score\x18\x06 \x01(\x01H\x00\x88\x01\x01\x42\x08\n\x06_score\"0\n\x0cSearchResult\x12 \n\x05items\x18\x01 \x03(\x0b\x32\x11.store.SearchItem\"\x1a\n\tNamespace\x12\r\n\x05parts\x18\x01 \x03(\t\"<\n\x14ListNamespacesResult\x12$\n\nnamespaces\x18\x01 \x03(\x0b\x32\x10.store.Namespace*\x93\x01\n\x08\x46ilterOp\x12\x19\n\x15\x46ILTER_OP_UNSPECIFIED\x10\x00\x12\x10\n\x0c\x46ILTER_OP_EQ\x10\x01\x12\x10\n\x0c\x46ILTER_OP_NE\x10\x02\x12\x10\n\x0c\x46ILTER_OP_GT\x10\x03\x12\x11\n\rFILTER_OP_GTE\x10\x04\x12\x10\n\x0c\x46ILTER_OP_LT\x10\x05\x12\x11\n\rFILTER_OP_LTE\x10\x06*~\n\x0c\x44istanceType\x12\x1d\n\x19\x44ISTANCE_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14\x44ISTANCE_TYPE_COSINE\x10\x01\x12\x14\n\x10\x44ISTANCE_TYPE_L2\x10\x02\x12\x1f\n\x1b\x44ISTANCE_TYPE_INNER_PRODUCT\x10\x03*Z\n\nVectorType\x12\x1b\n\x17VECTOR_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12VECTOR_TYPE_VECTOR\x10\x01\x12\x17\n\x13VECTOR_TYPE_HALFVEC\x10\x02*U\n\tMatchType\x12\x1a\n\x16MATCH_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11MATCH_TYPE_PREFIX\x10\x01\x12\x15\n\x11MATCH_TYPE_SUFFIX\x10\x02\x32;\n\x05Store\x12\x32\n\x05\x42\x61tch\x12\x13.store.BatchRequest\x1a\x14.store.BatchResponseB?Z=github.com/langchain-ai/langgraph-api/core/internal/engine/pbb\x06proto3')
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bstore.proto\x12\x05store\x1a\x1bgoogle/protobuf/empty.proto\"\xb5\x01\n\x0c\x42\x61tchRequest\x12\x16\n\x03ops\x18\x01 \x03(\x0b\x32\t.store.Op\x12O\n\x17\x65ncryption_context_json\x18\x02 \x03(\x0b\x32..store.BatchRequest.EncryptionContextJsonEntry\x1a<\n\x1a\x45ncryptionContextJsonEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"1\n\rBatchResponse\x12 \n\x07results\x18\x01 \x03(\x0b\x32\x0f.store.OpResult\"\xbe\x01\n\x02Op\x12\x1b\n\x03get\x18\x01 \x01(\x0b\x32\x0c.store.GetOpH\x00\x12\x1b\n\x03put\x18\x02 \x01(\x0b\x32\x0c.store.PutOpH\x00\x12!\n\x06\x64\x65lete\x18\x03 \x01(\x0b\x32\x0f.store.DeleteOpH\x00\x12!\n\x06search\x18\x04 \x01(\x0b\x32\x0f.store.SearchOpH\x00\x12\x32\n\x0flist_namespaces\x18\x05 \x01(\x0b\x32\x17.store.ListNamespacesOpH\x00\x42\x04\n\x02op\";\n\x05GetOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nrefreshTTL\x18\x03 \x01(\x08\"*\n\x08\x44\x65leteOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"L\n\x0f\x46ilterCondition\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x02op\x18\x02 \x01(\x0e\x32\x0f.store.FilterOp\x12\x0f\n\x07operand\x18\x03 \x01(\t\"\xa4\x01\n\x08SearchOp\x12\x18\n\x10namespace_prefix\x18\x01 \x03(\t\x12&\n\x06\x66ilter\x18\x02 \x03(\x0b\x32\x16.store.FilterCondition\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\x12\n\nrefreshTTL\x18\x06 \x01(\x08\x12#\n\x06vector\x18\x07 \x01(\x0b\x32\x13.store.VectorSearch\"\x94\x01\n\x0cVectorSearch\x12\x17\n\x0fquery_embedding\x18\x01 \x03(\x02\x12*\n\rdistance_type\x18\x02 \x01(\x0e\x32\x13.store.DistanceType\x12\x17\n\x0fvectors_per_doc\x18\x03 \x01(\x05\x12&\n\x0bvector_type\x18\x04 \x01(\x0e\x32\x11.store.VectorType\"D\n\x0eMatchCondition\x12$\n\nmatch_type\x18\x01 \x01(\x0e\x32\x10.store.MatchType\x12\x0c\n\x04path\x18\x02 \x03(\t\"\x88\x01\n\x10ListNamespacesOp\x12/\n\x10match_conditions\x18\x01 \x03(\x0b\x32\x15.store.MatchCondition\x12\x16\n\tmax_depth\x18\x02 \x01(\x05H\x00\x88\x01\x01\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x42\x0c\n\n_max_depth\"3\n\x0bVectorValue\x12\x11\n\tvaluePath\x18\x01 \x01(\t\x12\x11\n\tembedding\x18\x02 \x03(\x02\"\x8d\x01\n\x05PutOp\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\nttlMinutes\x18\x04 \x01(\x05\x12#\n\x07vectors\x18\x05 \x03(\x0b\x32\x12.store.VectorValue\x12\x17\n\x0fttlMinutesExact\x18\x06 \x01(\x01\"\xb8\x01\n\x08OpResult\x12\x1b\n\x04item\x18\x01 \x01(\x0b\x32\x0b.store.ItemH\x00\x12&\n\x04none\x18\x02 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00\x12%\n\x06search\x18\x03 \x01(\x0b\x32\x13.store.SearchResultH\x00\x12\x36\n\x0flist_namespaces\x18\x04 \x01(\x0b\x32\x1b.store.ListNamespacesResultH\x00\x42\x08\n\x06result\"b\n\x04Item\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\t\x12\x12\n\nupdated_at\x18\x05 \x01(\t\"\x86\x01\n\nSearchItem\x12\x11\n\tnamespace\x18\x01 \x03(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\x12\n\nvalue_json\x18\x03 \x01(\x0c\x12\x12\n\ncreated_at\x18\x04 \x01(\t\x12\x12\n\nupdated_at\x18\x05 \x01(\t\x12\x12\n\x05score\x18\x06 \x01(\x01H\x00\x88\x01\x01\x42\x08\n\x06_score\"0\n\x0cSearchResult\x12 \n\x05items\x18\x01 \x03(\x0b\x32\x11.store.SearchItem\"\x1a\n\tNamespace\x12\r\n\x05parts\x18\x01 \x03(\t\"<\n\x14ListNamespacesResult\x12$\n\nnamespaces\x18\x01 \x03(\x0b\x32\x10.store.Namespace*\x93\x01\n\x08\x46ilterOp\x12\x19\n\x15\x46ILTER_OP_UNSPECIFIED\x10\x00\x12\x10\n\x0c\x46ILTER_OP_EQ\x10\x01\x12\x10\n\x0c\x46ILTER_OP_NE\x10\x02\x12\x10\n\x0c\x46ILTER_OP_GT\x10\x03\x12\x11\n\rFILTER_OP_GTE\x10\x04\x12\x10\n\x0c\x46ILTER_OP_LT\x10\x05\x12\x11\n\rFILTER_OP_LTE\x10\x06*~\n\x0c\x44istanceType\x12\x1d\n\x19\x44ISTANCE_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14\x44ISTANCE_TYPE_COSINE\x10\x01\x12\x14\n\x10\x44ISTANCE_TYPE_L2\x10\x02\x12\x1f\n\x1b\x44ISTANCE_TYPE_INNER_PRODUCT\x10\x03*Z\n\nVectorType\x12\x1b\n\x17VECTOR_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12VECTOR_TYPE_VECTOR\x10\x01\x12\x17\n\x13VECTOR_TYPE_HALFVEC\x10\x02*U\n\tMatchType\x12\x1a\n\x16MATCH_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11MATCH_TYPE_PREFIX\x10\x01\x12\x15\n\x11MATCH_TYPE_SUFFIX\x10\x02\x32;\n\x05Store\x12\x32\n\x05\x42\x61tch\x12\x13.store.BatchRequest\x1a\x14.store.BatchResponseB?Z=github.com/langchain-ai/langgraph-api/core/internal/engine/pbb\x06proto3')
29
29
 
30
30
  _globals = globals()
31
31
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -35,14 +35,14 @@ if not _descriptor._USE_C_DESCRIPTORS:
35
35
  _globals['DESCRIPTOR']._serialized_options = b'Z=github.com/langchain-ai/langgraph-api/core/internal/engine/pb'
36
36
  _globals['_BATCHREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._loaded_options = None
37
37
  _globals['_BATCHREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_options = b'8\001'
38
- _globals['_FILTEROP']._serialized_start=1925
39
- _globals['_FILTEROP']._serialized_end=2072
40
- _globals['_DISTANCETYPE']._serialized_start=2074
41
- _globals['_DISTANCETYPE']._serialized_end=2200
42
- _globals['_VECTORTYPE']._serialized_start=2202
43
- _globals['_VECTORTYPE']._serialized_end=2292
44
- _globals['_MATCHTYPE']._serialized_start=2294
45
- _globals['_MATCHTYPE']._serialized_end=2379
38
+ _globals['_FILTEROP']._serialized_start=1951
39
+ _globals['_FILTEROP']._serialized_end=2098
40
+ _globals['_DISTANCETYPE']._serialized_start=2100
41
+ _globals['_DISTANCETYPE']._serialized_end=2226
42
+ _globals['_VECTORTYPE']._serialized_start=2228
43
+ _globals['_VECTORTYPE']._serialized_end=2318
44
+ _globals['_MATCHTYPE']._serialized_start=2320
45
+ _globals['_MATCHTYPE']._serialized_end=2405
46
46
  _globals['_BATCHREQUEST']._serialized_start=52
47
47
  _globals['_BATCHREQUEST']._serialized_end=233
48
48
  _globals['_BATCHREQUEST_ENCRYPTIONCONTEXTJSONENTRY']._serialized_start=173
@@ -67,20 +67,20 @@ if not _descriptor._USE_C_DESCRIPTORS:
67
67
  _globals['_LISTNAMESPACESOP']._serialized_end=1187
68
68
  _globals['_VECTORVALUE']._serialized_start=1189
69
69
  _globals['_VECTORVALUE']._serialized_end=1240
70
- _globals['_PUTOP']._serialized_start=1242
71
- _globals['_PUTOP']._serialized_end=1358
72
- _globals['_OPRESULT']._serialized_start=1361
73
- _globals['_OPRESULT']._serialized_end=1545
74
- _globals['_ITEM']._serialized_start=1547
75
- _globals['_ITEM']._serialized_end=1645
76
- _globals['_SEARCHITEM']._serialized_start=1648
77
- _globals['_SEARCHITEM']._serialized_end=1782
78
- _globals['_SEARCHRESULT']._serialized_start=1784
79
- _globals['_SEARCHRESULT']._serialized_end=1832
80
- _globals['_NAMESPACE']._serialized_start=1834
81
- _globals['_NAMESPACE']._serialized_end=1860
82
- _globals['_LISTNAMESPACESRESULT']._serialized_start=1862
83
- _globals['_LISTNAMESPACESRESULT']._serialized_end=1922
84
- _globals['_STORE']._serialized_start=2381
85
- _globals['_STORE']._serialized_end=2440
70
+ _globals['_PUTOP']._serialized_start=1243
71
+ _globals['_PUTOP']._serialized_end=1384
72
+ _globals['_OPRESULT']._serialized_start=1387
73
+ _globals['_OPRESULT']._serialized_end=1571
74
+ _globals['_ITEM']._serialized_start=1573
75
+ _globals['_ITEM']._serialized_end=1671
76
+ _globals['_SEARCHITEM']._serialized_start=1674
77
+ _globals['_SEARCHITEM']._serialized_end=1808
78
+ _globals['_SEARCHRESULT']._serialized_start=1810
79
+ _globals['_SEARCHRESULT']._serialized_end=1858
80
+ _globals['_NAMESPACE']._serialized_start=1860
81
+ _globals['_NAMESPACE']._serialized_end=1886
82
+ _globals['_LISTNAMESPACESRESULT']._serialized_start=1888
83
+ _globals['_LISTNAMESPACESRESULT']._serialized_end=1948
84
+ _globals['_STORE']._serialized_start=2407
85
+ _globals['_STORE']._serialized_end=2466
86
86
  # @@protoc_insertion_point(module_scope)
@@ -472,10 +472,14 @@ class PutOp(_message.Message):
472
472
  VALUE_JSON_FIELD_NUMBER: _builtins.int
473
473
  TTLMINUTES_FIELD_NUMBER: _builtins.int
474
474
  VECTORS_FIELD_NUMBER: _builtins.int
475
+ TTLMINUTESEXACT_FIELD_NUMBER: _builtins.int
475
476
  key: _builtins.str
476
477
  value_json: _builtins.bytes
477
478
  """JSON-encoded value (orjson)."""
478
479
  ttlMinutes: _builtins.int
480
+ """Whole minutes, rounded up; stored as ttl_minutes and used for TTL refresh."""
481
+ ttlMinutesExact: _builtins.float
482
+ """Exact, possibly fractional TTL in minutes; sets the initial expires_at."""
479
483
  @_builtins.property
480
484
  def namespace(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: ...
481
485
  @_builtins.property
@@ -490,10 +494,11 @@ class PutOp(_message.Message):
490
494
  value_json: _builtins.bytes = ...,
491
495
  ttlMinutes: _builtins.int = ...,
492
496
  vectors: _abc.Iterable[Global___VectorValue] | None = ...,
497
+ ttlMinutesExact: _builtins.float = ...,
493
498
  ) -> None: ...
494
499
  _HasFieldArgType: _TypeAlias = _Never # noqa: Y015
495
500
  def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ...
496
- _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "namespace", b"namespace", "ttlMinutes", b"ttlMinutes", "value_json", b"value_json", "vectors", b"vectors"] # noqa: Y015
501
+ _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "namespace", b"namespace", "ttlMinutes", b"ttlMinutes", "ttlMinutesExact", b"ttlMinutesExact", "value_json", b"value_json", "vectors", b"vectors"] # noqa: Y015
497
502
  def ClearField(self, field_name: _ClearFieldArgType) -> None: ...
498
503
  def WhichOneof(self, oneof_group: _Never) -> None: ...
499
504