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 +1 -1
- langgraph_api/encryption/aes_json.py +47 -6
- langgraph_api/encryption/custom.py +13 -1
- langgraph_api/store.py +17 -11
- {langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/METADATA +1 -1
- {langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/RECORD +15 -15
- langgraph_grpc_common/checkpointer.py +6 -3
- langgraph_grpc_common/conversion/store.py +8 -6
- langgraph_grpc_common/proto/checkpointer_pb2.py +42 -30
- langgraph_grpc_common/proto/checkpointer_pb2.pyi +76 -5
- langgraph_grpc_common/proto/store_pb2.py +25 -25
- langgraph_grpc_common/proto/store_pb2.pyi +6 -1
- {langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/WHEEL +0 -0
- {langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/entry_points.txt +0 -0
- {langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/licenses/LICENSE +0 -0
langgraph_api/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.17.0.
|
|
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
|
-
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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,4 +1,4 @@
|
|
|
1
|
-
langgraph_api/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
193
|
-
langgraph_grpc_common/proto/checkpointer_pb2.pyi,sha256=
|
|
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=
|
|
253
|
-
langgraph_grpc_common/proto/store_pb2.pyi,sha256=
|
|
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.
|
|
257
|
-
langgraph_api-0.17.0.
|
|
258
|
-
langgraph_api-0.17.0.
|
|
259
|
-
langgraph_api-0.17.0.
|
|
260
|
-
langgraph_api-0.17.0.
|
|
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
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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.
|
|
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\"\
|
|
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=
|
|
59
|
-
_globals['
|
|
60
|
-
_globals['
|
|
61
|
-
_globals['
|
|
62
|
-
_globals['
|
|
63
|
-
_globals['
|
|
64
|
-
_globals['
|
|
65
|
-
_globals['
|
|
66
|
-
_globals['
|
|
67
|
-
_globals['
|
|
68
|
-
_globals['
|
|
69
|
-
_globals['
|
|
70
|
-
_globals['
|
|
71
|
-
_globals['
|
|
72
|
-
_globals['
|
|
73
|
-
_globals['
|
|
74
|
-
_globals['
|
|
75
|
-
_globals['
|
|
76
|
-
_globals['
|
|
77
|
-
_globals['
|
|
78
|
-
_globals['
|
|
79
|
-
_globals['
|
|
80
|
-
_globals['
|
|
81
|
-
_globals['
|
|
82
|
-
_globals['
|
|
83
|
-
_globals['
|
|
84
|
-
_globals['
|
|
85
|
-
_globals['
|
|
86
|
-
_globals['
|
|
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\"
|
|
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=
|
|
39
|
-
_globals['_FILTEROP']._serialized_end=
|
|
40
|
-
_globals['_DISTANCETYPE']._serialized_start=
|
|
41
|
-
_globals['_DISTANCETYPE']._serialized_end=
|
|
42
|
-
_globals['_VECTORTYPE']._serialized_start=
|
|
43
|
-
_globals['_VECTORTYPE']._serialized_end=
|
|
44
|
-
_globals['_MATCHTYPE']._serialized_start=
|
|
45
|
-
_globals['_MATCHTYPE']._serialized_end=
|
|
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=
|
|
71
|
-
_globals['_PUTOP']._serialized_end=
|
|
72
|
-
_globals['_OPRESULT']._serialized_start=
|
|
73
|
-
_globals['_OPRESULT']._serialized_end=
|
|
74
|
-
_globals['_ITEM']._serialized_start=
|
|
75
|
-
_globals['_ITEM']._serialized_end=
|
|
76
|
-
_globals['_SEARCHITEM']._serialized_start=
|
|
77
|
-
_globals['_SEARCHITEM']._serialized_end=
|
|
78
|
-
_globals['_SEARCHRESULT']._serialized_start=
|
|
79
|
-
_globals['_SEARCHRESULT']._serialized_end=
|
|
80
|
-
_globals['_NAMESPACE']._serialized_start=
|
|
81
|
-
_globals['_NAMESPACE']._serialized_end=
|
|
82
|
-
_globals['_LISTNAMESPACESRESULT']._serialized_start=
|
|
83
|
-
_globals['_LISTNAMESPACESRESULT']._serialized_end=
|
|
84
|
-
_globals['_STORE']._serialized_start=
|
|
85
|
-
_globals['_STORE']._serialized_end=
|
|
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
|
|
|
File without changes
|
{langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{langgraph_api-0.17.0.dev1.dist-info → langgraph_api-0.17.0.dev3.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|