langgraph-api 0.5.0__py3-none-any.whl → 0.5.2__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.
Potentially problematic release.
This version of langgraph-api might be problematic. Click here for more details.
- langgraph_api/__init__.py +1 -1
- langgraph_api/api/assistants.py +64 -60
- langgraph_api/config.py +7 -1
- langgraph_api/grpc_ops/client.py +91 -0
- langgraph_api/grpc_ops/ops.py +49 -61
- langgraph_api/js/package.json +5 -5
- langgraph_api/js/src/graph.mts +20 -0
- langgraph_api/js/yarn.lock +137 -187
- langgraph_api/route.py +14 -4
- {langgraph_api-0.5.0.dist-info → langgraph_api-0.5.2.dist-info}/METADATA +2 -2
- {langgraph_api-0.5.0.dist-info → langgraph_api-0.5.2.dist-info}/RECORD +14 -14
- {langgraph_api-0.5.0.dist-info → langgraph_api-0.5.2.dist-info}/WHEEL +0 -0
- {langgraph_api-0.5.0.dist-info → langgraph_api-0.5.2.dist-info}/entry_points.txt +0 -0
- {langgraph_api-0.5.0.dist-info → langgraph_api-0.5.2.dist-info}/licenses/LICENSE +0 -0
langgraph_api/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.5.
|
|
1
|
+
__version__ = "0.5.2"
|
langgraph_api/api/assistants.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from functools import partial
|
|
1
2
|
from typing import Any
|
|
2
3
|
from uuid import uuid4
|
|
3
4
|
|
|
@@ -37,7 +38,7 @@ from langgraph_api.validation import (
|
|
|
37
38
|
ConfigValidator,
|
|
38
39
|
)
|
|
39
40
|
from langgraph_runtime.checkpoint import Checkpointer
|
|
40
|
-
from langgraph_runtime.database import connect
|
|
41
|
+
from langgraph_runtime.database import connect as base_connect
|
|
41
42
|
from langgraph_runtime.ops import Assistants
|
|
42
43
|
from langgraph_runtime.retry import retry_db
|
|
43
44
|
|
|
@@ -45,6 +46,8 @@ logger = structlog.stdlib.get_logger(__name__)
|
|
|
45
46
|
|
|
46
47
|
CrudAssistants = GrpcAssistants if FF_USE_CORE_API else Assistants
|
|
47
48
|
|
|
49
|
+
connect = partial(base_connect, supports_core_api=FF_USE_CORE_API)
|
|
50
|
+
|
|
48
51
|
EXCLUDED_CONFIG_SCHEMA = (
|
|
49
52
|
"__pregel_checkpointer",
|
|
50
53
|
"__pregel_store",
|
|
@@ -255,7 +258,7 @@ async def get_assistant_graph(
|
|
|
255
258
|
assistant_id = get_assistant_id(str(request.path_params["assistant_id"]))
|
|
256
259
|
validate_uuid(assistant_id, "Invalid assistant ID: must be a UUID")
|
|
257
260
|
async with connect() as conn:
|
|
258
|
-
assistant_ = await
|
|
261
|
+
assistant_ = await CrudAssistants.get(conn, assistant_id)
|
|
259
262
|
assistant = await fetchone(assistant_)
|
|
260
263
|
config = json_loads(assistant["config"])
|
|
261
264
|
configurable = config.setdefault("configurable", {})
|
|
@@ -312,43 +315,44 @@ async def get_assistant_subgraphs(
|
|
|
312
315
|
assistant_id = request.path_params["assistant_id"]
|
|
313
316
|
validate_uuid(assistant_id, "Invalid assistant ID: must be a UUID")
|
|
314
317
|
async with connect() as conn:
|
|
315
|
-
assistant_ = await
|
|
318
|
+
assistant_ = await CrudAssistants.get(conn, assistant_id)
|
|
316
319
|
assistant = await fetchone(assistant_)
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
)
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
320
|
+
|
|
321
|
+
config = json_loads(assistant["config"])
|
|
322
|
+
configurable = config.setdefault("configurable", {})
|
|
323
|
+
configurable.update(get_configurable_headers(request.headers))
|
|
324
|
+
async with get_graph(
|
|
325
|
+
assistant["graph_id"],
|
|
326
|
+
config,
|
|
327
|
+
checkpointer=Checkpointer(),
|
|
328
|
+
store=(await api_store.get_store()),
|
|
329
|
+
) as graph:
|
|
330
|
+
namespace = request.path_params.get("namespace")
|
|
331
|
+
|
|
332
|
+
if isinstance(graph, BaseRemotePregel):
|
|
333
|
+
return ApiResponse(
|
|
334
|
+
await graph.fetch_subgraphs(
|
|
335
|
+
namespace=namespace,
|
|
336
|
+
recurse=request.query_params.get("recurse", "False")
|
|
337
|
+
in ("true", "True"),
|
|
338
|
+
)
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
try:
|
|
342
|
+
return ApiResponse(
|
|
343
|
+
{
|
|
344
|
+
ns: _graph_schemas(subgraph)
|
|
345
|
+
async for ns, subgraph in graph.aget_subgraphs(
|
|
331
346
|
namespace=namespace,
|
|
332
347
|
recurse=request.query_params.get("recurse", "False")
|
|
333
348
|
in ("true", "True"),
|
|
334
349
|
)
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
async for ns, subgraph in graph.aget_subgraphs(
|
|
342
|
-
namespace=namespace,
|
|
343
|
-
recurse=request.query_params.get("recurse", "False")
|
|
344
|
-
in ("true", "True"),
|
|
345
|
-
)
|
|
346
|
-
}
|
|
347
|
-
)
|
|
348
|
-
except NotImplementedError:
|
|
349
|
-
raise HTTPException(
|
|
350
|
-
422, detail="The graph does not support visualization"
|
|
351
|
-
) from None
|
|
350
|
+
}
|
|
351
|
+
)
|
|
352
|
+
except NotImplementedError:
|
|
353
|
+
raise HTTPException(
|
|
354
|
+
422, detail="The graph does not support visualization"
|
|
355
|
+
) from None
|
|
352
356
|
|
|
353
357
|
|
|
354
358
|
@retry_db
|
|
@@ -359,40 +363,40 @@ async def get_assistant_schemas(
|
|
|
359
363
|
assistant_id = request.path_params["assistant_id"]
|
|
360
364
|
validate_uuid(assistant_id, "Invalid assistant ID: must be a UUID")
|
|
361
365
|
async with connect() as conn:
|
|
362
|
-
assistant_ = await
|
|
363
|
-
# TODO Implementa cache so we can de-dent and release this connection.
|
|
366
|
+
assistant_ = await CrudAssistants.get(conn, assistant_id)
|
|
364
367
|
assistant = await fetchone(assistant_)
|
|
365
|
-
config = json_loads(assistant["config"])
|
|
366
|
-
configurable = config.setdefault("configurable", {})
|
|
367
|
-
configurable.update(get_configurable_headers(request.headers))
|
|
368
|
-
async with get_graph(
|
|
369
|
-
assistant["graph_id"],
|
|
370
|
-
config,
|
|
371
|
-
checkpointer=Checkpointer(),
|
|
372
|
-
store=(await api_store.get_store()),
|
|
373
|
-
) as graph:
|
|
374
|
-
if isinstance(graph, BaseRemotePregel):
|
|
375
|
-
schemas = await graph.fetch_state_schema()
|
|
376
|
-
return ApiResponse(
|
|
377
|
-
{
|
|
378
|
-
"graph_id": assistant["graph_id"],
|
|
379
|
-
"input_schema": schemas.get("input"),
|
|
380
|
-
"output_schema": schemas.get("output"),
|
|
381
|
-
"state_schema": schemas.get("state"),
|
|
382
|
-
"config_schema": schemas.get("config"),
|
|
383
|
-
"context_schema": schemas.get("context"),
|
|
384
|
-
}
|
|
385
|
-
)
|
|
386
|
-
|
|
387
|
-
schemas = _graph_schemas(graph)
|
|
388
368
|
|
|
369
|
+
config = json_loads(assistant["config"])
|
|
370
|
+
configurable = config.setdefault("configurable", {})
|
|
371
|
+
configurable.update(get_configurable_headers(request.headers))
|
|
372
|
+
async with get_graph(
|
|
373
|
+
assistant["graph_id"],
|
|
374
|
+
config,
|
|
375
|
+
checkpointer=Checkpointer(),
|
|
376
|
+
store=(await api_store.get_store()),
|
|
377
|
+
) as graph:
|
|
378
|
+
if isinstance(graph, BaseRemotePregel):
|
|
379
|
+
schemas = await graph.fetch_state_schema()
|
|
389
380
|
return ApiResponse(
|
|
390
381
|
{
|
|
391
382
|
"graph_id": assistant["graph_id"],
|
|
392
|
-
|
|
383
|
+
"input_schema": schemas.get("input"),
|
|
384
|
+
"output_schema": schemas.get("output"),
|
|
385
|
+
"state_schema": schemas.get("state"),
|
|
386
|
+
"config_schema": schemas.get("config"),
|
|
387
|
+
"context_schema": schemas.get("context"),
|
|
393
388
|
}
|
|
394
389
|
)
|
|
395
390
|
|
|
391
|
+
schemas = _graph_schemas(graph)
|
|
392
|
+
|
|
393
|
+
return ApiResponse(
|
|
394
|
+
{
|
|
395
|
+
"graph_id": assistant["graph_id"],
|
|
396
|
+
**schemas,
|
|
397
|
+
}
|
|
398
|
+
)
|
|
399
|
+
|
|
396
400
|
|
|
397
401
|
@retry_db
|
|
398
402
|
async def patch_assistant(
|
langgraph_api/config.py
CHANGED
|
@@ -291,6 +291,13 @@ ALLOW_PRIVATE_NETWORK = env("ALLOW_PRIVATE_NETWORK", cast=bool, default=False)
|
|
|
291
291
|
See https://developer.chrome.com/blog/private-network-access-update-2024-03
|
|
292
292
|
"""
|
|
293
293
|
|
|
294
|
+
# gRPC client pool size for persistence server.
|
|
295
|
+
GRPC_CLIENT_POOL_SIZE = env("GRPC_CLIENT_POOL_SIZE", cast=int, default=5)
|
|
296
|
+
|
|
297
|
+
# Minimum payload size to use the dedicated thread pool for JSON parsing.
|
|
298
|
+
# (Otherwise, the payload is parsed directly in the event loop.)
|
|
299
|
+
JSON_THREAD_POOL_MINIMUM_SIZE_BYTES = 100 * 1024 # 100 KB
|
|
300
|
+
|
|
294
301
|
HTTP_CONFIG = env("LANGGRAPH_HTTP", cast=_parse_schema(HttpConfig), default=None)
|
|
295
302
|
STORE_CONFIG = env("LANGGRAPH_STORE", cast=_parse_schema(StoreConfig), default=None)
|
|
296
303
|
|
|
@@ -395,7 +402,6 @@ N_JOBS_PER_WORKER = env("N_JOBS_PER_WORKER", cast=int, default=10)
|
|
|
395
402
|
BG_JOB_TIMEOUT_SECS = env("BG_JOB_TIMEOUT_SECS", cast=float, default=3600)
|
|
396
403
|
|
|
397
404
|
FF_CRONS_ENABLED = env("FF_CRONS_ENABLED", cast=bool, default=True)
|
|
398
|
-
FF_RICH_THREADS = env("FF_RICH_THREADS", cast=bool, default=True)
|
|
399
405
|
FF_LOG_DROPPED_EVENTS = env("FF_LOG_DROPPED_EVENTS", cast=bool, default=False)
|
|
400
406
|
FF_LOG_QUERY_AND_PARAMS = env("FF_LOG_QUERY_AND_PARAMS", cast=bool, default=False)
|
|
401
407
|
|
langgraph_api/grpc_ops/client.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""gRPC client wrapper for LangGraph persistence services."""
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
import os
|
|
4
5
|
|
|
5
6
|
import structlog
|
|
@@ -10,6 +11,10 @@ from .generated.core_api_pb2_grpc import AdminStub, AssistantsStub, ThreadsStub
|
|
|
10
11
|
logger = structlog.stdlib.get_logger(__name__)
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
# Shared global client pool
|
|
15
|
+
_client_pool: "GrpcClientPool | None" = None
|
|
16
|
+
|
|
17
|
+
|
|
13
18
|
class GrpcClient:
|
|
14
19
|
"""gRPC client for LangGraph persistence services."""
|
|
15
20
|
|
|
@@ -90,3 +95,89 @@ class GrpcClient:
|
|
|
90
95
|
"Client not connected. Use async context manager or call connect() first."
|
|
91
96
|
)
|
|
92
97
|
return self._admin_stub
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class GrpcClientPool:
|
|
101
|
+
"""Pool of gRPC clients for load distribution."""
|
|
102
|
+
|
|
103
|
+
def __init__(self, pool_size: int = 5, server_address: str | None = None):
|
|
104
|
+
self.pool_size = pool_size
|
|
105
|
+
self.server_address = server_address
|
|
106
|
+
self.clients: list[GrpcClient] = []
|
|
107
|
+
self._current_index = 0
|
|
108
|
+
self._init_lock = asyncio.Lock()
|
|
109
|
+
self._initialized = False
|
|
110
|
+
|
|
111
|
+
async def _initialize(self):
|
|
112
|
+
"""Initialize the pool of clients."""
|
|
113
|
+
async with self._init_lock:
|
|
114
|
+
if self._initialized:
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
await logger.ainfo(
|
|
118
|
+
"Initializing gRPC client pool",
|
|
119
|
+
pool_size=self.pool_size,
|
|
120
|
+
server_address=self.server_address,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
for _ in range(self.pool_size):
|
|
124
|
+
client = GrpcClient(server_address=self.server_address)
|
|
125
|
+
await client.connect()
|
|
126
|
+
self.clients.append(client)
|
|
127
|
+
|
|
128
|
+
self._initialized = True
|
|
129
|
+
await logger.ainfo(
|
|
130
|
+
f"gRPC client pool initialized with {self.pool_size} clients"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
async def get_client(self) -> GrpcClient:
|
|
134
|
+
"""Get next client using round-robin selection.
|
|
135
|
+
|
|
136
|
+
Round-robin without strict locking - slight races are acceptable
|
|
137
|
+
and result in good enough distribution under high load.
|
|
138
|
+
"""
|
|
139
|
+
if not self._initialized:
|
|
140
|
+
await self._initialize()
|
|
141
|
+
|
|
142
|
+
idx = self._current_index % self.pool_size
|
|
143
|
+
self._current_index = idx + 1
|
|
144
|
+
return self.clients[idx]
|
|
145
|
+
|
|
146
|
+
async def close(self):
|
|
147
|
+
"""Close all clients in the pool."""
|
|
148
|
+
if self._initialized:
|
|
149
|
+
await logger.ainfo(f"Closing gRPC client pool ({self.pool_size} clients)")
|
|
150
|
+
for client in self.clients:
|
|
151
|
+
await client.close()
|
|
152
|
+
self.clients.clear()
|
|
153
|
+
self._initialized = False
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
async def get_shared_client() -> GrpcClient:
|
|
157
|
+
"""Get a gRPC client from the shared pool.
|
|
158
|
+
|
|
159
|
+
Uses a pool of channels for better performance under high concurrency.
|
|
160
|
+
Each channel is a separate TCP connection that can handle ~100-200
|
|
161
|
+
concurrent streams effectively.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
A GrpcClient instance from the pool
|
|
165
|
+
"""
|
|
166
|
+
global _client_pool
|
|
167
|
+
if _client_pool is None:
|
|
168
|
+
from langgraph_api import config
|
|
169
|
+
|
|
170
|
+
_client_pool = GrpcClientPool(
|
|
171
|
+
pool_size=config.GRPC_CLIENT_POOL_SIZE,
|
|
172
|
+
server_address=os.getenv("GRPC_SERVER_ADDRESS"),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
return await _client_pool.get_client()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
async def close_shared_client():
|
|
179
|
+
"""Close the shared gRPC client pool."""
|
|
180
|
+
global _client_pool
|
|
181
|
+
if _client_pool is not None:
|
|
182
|
+
await _client_pool.close()
|
|
183
|
+
_client_pool = None
|
langgraph_api/grpc_ops/ops.py
CHANGED
|
@@ -32,7 +32,7 @@ from langgraph_api.schema import (
|
|
|
32
32
|
)
|
|
33
33
|
from langgraph_api.serde import json_dumpb, json_loads
|
|
34
34
|
|
|
35
|
-
from .client import
|
|
35
|
+
from .client import get_shared_client
|
|
36
36
|
from .generated import core_api_pb2 as pb
|
|
37
37
|
|
|
38
38
|
GRPC_STATUS_TO_HTTP_STATUS = {
|
|
@@ -539,9 +539,8 @@ class Assistants(Authenticated):
|
|
|
539
539
|
select=select,
|
|
540
540
|
)
|
|
541
541
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
response = await client.assistants.Search(request)
|
|
542
|
+
client = await get_shared_client()
|
|
543
|
+
response = await client.assistants.Search(request)
|
|
545
544
|
|
|
546
545
|
# Convert response to expected format
|
|
547
546
|
assistants = [
|
|
@@ -578,9 +577,8 @@ class Assistants(Authenticated):
|
|
|
578
577
|
filters=auth_filters or {},
|
|
579
578
|
)
|
|
580
579
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
response = await client.assistants.Get(request)
|
|
580
|
+
client = await get_shared_client()
|
|
581
|
+
response = await client.assistants.Get(request)
|
|
584
582
|
|
|
585
583
|
# Convert and yield the result
|
|
586
584
|
assistant = proto_to_assistant(response)
|
|
@@ -637,9 +635,8 @@ class Assistants(Authenticated):
|
|
|
637
635
|
metadata=dict_to_struct(metadata or {}),
|
|
638
636
|
)
|
|
639
637
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
response = await client.assistants.Create(request)
|
|
638
|
+
client = await get_shared_client()
|
|
639
|
+
response = await client.assistants.Create(request)
|
|
643
640
|
|
|
644
641
|
# Convert and yield the result
|
|
645
642
|
assistant = proto_to_assistant(response)
|
|
@@ -700,9 +697,8 @@ class Assistants(Authenticated):
|
|
|
700
697
|
if context:
|
|
701
698
|
request.context.CopyFrom(dict_to_struct(context))
|
|
702
699
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
response = await client.assistants.Patch(request)
|
|
700
|
+
client = await get_shared_client()
|
|
701
|
+
response = await client.assistants.Patch(request)
|
|
706
702
|
|
|
707
703
|
# Convert and yield the result
|
|
708
704
|
assistant = proto_to_assistant(response)
|
|
@@ -730,9 +726,8 @@ class Assistants(Authenticated):
|
|
|
730
726
|
filters=auth_filters or {},
|
|
731
727
|
)
|
|
732
728
|
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
await client.assistants.Delete(request)
|
|
729
|
+
client = await get_shared_client()
|
|
730
|
+
await client.assistants.Delete(request)
|
|
736
731
|
|
|
737
732
|
# Return the deleted ID
|
|
738
733
|
async def generate_result():
|
|
@@ -765,9 +760,8 @@ class Assistants(Authenticated):
|
|
|
765
760
|
filters=auth_filters or {},
|
|
766
761
|
)
|
|
767
762
|
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
response = await client.assistants.SetLatest(request)
|
|
763
|
+
client = await get_shared_client()
|
|
764
|
+
response = await client.assistants.SetLatest(request)
|
|
771
765
|
|
|
772
766
|
# Convert and yield the result
|
|
773
767
|
assistant = proto_to_assistant(response)
|
|
@@ -803,9 +797,8 @@ class Assistants(Authenticated):
|
|
|
803
797
|
offset=offset,
|
|
804
798
|
)
|
|
805
799
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
response = await client.assistants.GetVersions(request)
|
|
800
|
+
client = await get_shared_client()
|
|
801
|
+
response = await client.assistants.GetVersions(request)
|
|
809
802
|
|
|
810
803
|
# Convert and yield the results
|
|
811
804
|
async def generate_results():
|
|
@@ -849,9 +842,8 @@ class Assistants(Authenticated):
|
|
|
849
842
|
metadata=dict_to_struct(metadata or {}),
|
|
850
843
|
)
|
|
851
844
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
response = await client.assistants.Count(request)
|
|
845
|
+
client = await get_shared_client()
|
|
846
|
+
response = await client.assistants.Count(request)
|
|
855
847
|
|
|
856
848
|
return int(response.count)
|
|
857
849
|
|
|
@@ -913,24 +905,22 @@ class Threads(Authenticated):
|
|
|
913
905
|
if ids:
|
|
914
906
|
normalized_ids = [_normalize_uuid(thread_id) for thread_id in ids]
|
|
915
907
|
threads: list[Thread] = []
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
continue
|
|
933
|
-
threads.append(thread)
|
|
908
|
+
client = await get_shared_client()
|
|
909
|
+
for thread_id in normalized_ids:
|
|
910
|
+
request = pb.GetThreadRequest(
|
|
911
|
+
thread_id=pb.UUID(value=_normalize_uuid(thread_id)),
|
|
912
|
+
filters=auth_filters or {},
|
|
913
|
+
)
|
|
914
|
+
response = await client.threads.Get(request)
|
|
915
|
+
thread = proto_to_thread(response)
|
|
916
|
+
|
|
917
|
+
if status and thread["status"] != status:
|
|
918
|
+
continue
|
|
919
|
+
if metadata and not _json_contains(thread["metadata"], metadata):
|
|
920
|
+
continue
|
|
921
|
+
if values and not _json_contains(thread.get("values") or {}, values):
|
|
922
|
+
continue
|
|
923
|
+
threads.append(thread)
|
|
934
924
|
|
|
935
925
|
total = len(threads)
|
|
936
926
|
paginated = threads[offset : offset + limit]
|
|
@@ -964,10 +954,10 @@ class Threads(Authenticated):
|
|
|
964
954
|
if select:
|
|
965
955
|
request_kwargs["select"] = select
|
|
966
956
|
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
957
|
+
client = await get_shared_client()
|
|
958
|
+
response = await client.threads.Search(
|
|
959
|
+
pb.SearchThreadsRequest(**request_kwargs)
|
|
960
|
+
)
|
|
971
961
|
|
|
972
962
|
threads = [proto_to_thread(thread) for thread in response.threads]
|
|
973
963
|
cursor = offset + limit if len(threads) == limit else None
|
|
@@ -1014,10 +1004,8 @@ class Threads(Authenticated):
|
|
|
1014
1004
|
)
|
|
1015
1005
|
request_kwargs["status"] = mapped_status
|
|
1016
1006
|
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
pb.CountThreadsRequest(**request_kwargs)
|
|
1020
|
-
)
|
|
1007
|
+
client = await get_shared_client()
|
|
1008
|
+
response = await client.threads.Count(pb.CountThreadsRequest(**request_kwargs))
|
|
1021
1009
|
|
|
1022
1010
|
return int(response.count)
|
|
1023
1011
|
|
|
@@ -1035,8 +1023,8 @@ class Threads(Authenticated):
|
|
|
1035
1023
|
thread_id=pb.UUID(value=_normalize_uuid(thread_id)),
|
|
1036
1024
|
filters=auth_filters or {},
|
|
1037
1025
|
)
|
|
1038
|
-
|
|
1039
|
-
|
|
1026
|
+
client = await get_shared_client()
|
|
1027
|
+
response = await client.threads.Get(request)
|
|
1040
1028
|
|
|
1041
1029
|
thread = proto_to_thread(response)
|
|
1042
1030
|
|
|
@@ -1077,8 +1065,8 @@ class Threads(Authenticated):
|
|
|
1077
1065
|
if ttl_config is not None:
|
|
1078
1066
|
request.ttl.CopyFrom(ttl_config)
|
|
1079
1067
|
|
|
1080
|
-
|
|
1081
|
-
|
|
1068
|
+
client = await get_shared_client()
|
|
1069
|
+
response = await client.threads.Create(request)
|
|
1082
1070
|
thread = proto_to_thread(response)
|
|
1083
1071
|
|
|
1084
1072
|
async def generate_result():
|
|
@@ -1118,8 +1106,8 @@ class Threads(Authenticated):
|
|
|
1118
1106
|
if ttl_config is not None:
|
|
1119
1107
|
request.ttl.CopyFrom(ttl_config)
|
|
1120
1108
|
|
|
1121
|
-
|
|
1122
|
-
|
|
1109
|
+
client = await get_shared_client()
|
|
1110
|
+
response = await client.threads.Patch(request)
|
|
1123
1111
|
|
|
1124
1112
|
thread = proto_to_thread(response)
|
|
1125
1113
|
|
|
@@ -1147,8 +1135,8 @@ class Threads(Authenticated):
|
|
|
1147
1135
|
filters=auth_filters or {},
|
|
1148
1136
|
)
|
|
1149
1137
|
|
|
1150
|
-
|
|
1151
|
-
|
|
1138
|
+
client = await get_shared_client()
|
|
1139
|
+
response = await client.threads.Delete(request)
|
|
1152
1140
|
|
|
1153
1141
|
deleted_id = UUID(response.value)
|
|
1154
1142
|
|
|
@@ -1176,8 +1164,8 @@ class Threads(Authenticated):
|
|
|
1176
1164
|
filters=auth_filters or {},
|
|
1177
1165
|
)
|
|
1178
1166
|
|
|
1179
|
-
|
|
1180
|
-
|
|
1167
|
+
client = await get_shared_client()
|
|
1168
|
+
response = await client.threads.Copy(request)
|
|
1181
1169
|
|
|
1182
1170
|
thread = proto_to_thread(response)
|
|
1183
1171
|
|
langgraph_api/js/package.json
CHANGED
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
"@langchain/langgraph-checkpoint": "^1.0.0",
|
|
17
17
|
"@types/json-schema": "^7.0.15",
|
|
18
18
|
"@typescript/vfs": "^1.6.0",
|
|
19
|
-
"dedent": "^1.
|
|
19
|
+
"dedent": "^1.7.0",
|
|
20
20
|
"exit-hook": "^4.0.0",
|
|
21
|
-
"hono": "^4.10.
|
|
21
|
+
"hono": "^4.10.4",
|
|
22
22
|
"p-queue": "^8.0.1",
|
|
23
23
|
"p-retry": "^6.2.0",
|
|
24
|
-
"tsx": "^4.
|
|
24
|
+
"tsx": "^4.20.6",
|
|
25
25
|
"typescript": "^5.5.4",
|
|
26
26
|
"undici": "^6.21.2",
|
|
27
27
|
"uuid": "^10.0.0",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"@types/react-dom": "^19.0.3",
|
|
41
41
|
"jose": "^6.0.10",
|
|
42
42
|
"postgres": "^3.4.4",
|
|
43
|
-
"prettier": "^3.
|
|
44
|
-
"vitest": "^
|
|
43
|
+
"prettier": "^3.6.2",
|
|
44
|
+
"vitest": "^4.0.6"
|
|
45
45
|
},
|
|
46
46
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
|
47
47
|
}
|
langgraph_api/js/src/graph.mts
CHANGED
|
@@ -62,6 +62,17 @@ export async function resolveGraph(
|
|
|
62
62
|
return "compile" in graph && typeof graph.compile === "function";
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
const isCompiledGraph = (
|
|
66
|
+
graph: GraphLike,
|
|
67
|
+
): graph is CompiledGraph<string> => {
|
|
68
|
+
if (typeof graph !== "object" || graph == null) return false;
|
|
69
|
+
return (
|
|
70
|
+
"builder" in graph &&
|
|
71
|
+
typeof graph.builder === "object" &&
|
|
72
|
+
graph.builder != null
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
|
|
65
76
|
const graph: GraphUnknown = await import(sourceFile).then(
|
|
66
77
|
(module) => module[exportSymbol || "default"],
|
|
67
78
|
);
|
|
@@ -73,6 +84,15 @@ export async function resolveGraph(
|
|
|
73
84
|
|
|
74
85
|
const afterResolve = (graphLike: GraphLike): CompiledGraph<string> => {
|
|
75
86
|
const graph = isGraph(graphLike) ? graphLike.compile() : graphLike;
|
|
87
|
+
|
|
88
|
+
// TODO: hack, remove once LangChain 1.x createAgent is fixed
|
|
89
|
+
// LangGraph API will assign it's checkpointer by setting it
|
|
90
|
+
// via `graph.checkpointer = ...` and `graph.store = ...`, and the 1.x `createAgent`
|
|
91
|
+
// hides the underlying `StateGraph` instance, so we need to access it directly.
|
|
92
|
+
if (!isCompiledGraph(graph) && "graph" in graph) {
|
|
93
|
+
return (graph as { graph: CompiledGraph<string> }).graph;
|
|
94
|
+
}
|
|
95
|
+
|
|
76
96
|
return graph;
|
|
77
97
|
};
|
|
78
98
|
|
langgraph_api/js/yarn.lock
CHANGED
|
@@ -180,10 +180,10 @@
|
|
|
180
180
|
resolved "https://registry.yarnpkg.com/@hono/zod-validator/-/zod-validator-0.2.2.tgz#929a1c40aee5eac1ed9c84094d6d977e0b70187a"
|
|
181
181
|
integrity sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==
|
|
182
182
|
|
|
183
|
-
"@jridgewell/sourcemap-codec@^1.5.
|
|
184
|
-
version "1.5.
|
|
185
|
-
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.
|
|
186
|
-
integrity sha512-
|
|
183
|
+
"@jridgewell/sourcemap-codec@^1.5.5":
|
|
184
|
+
version "1.5.5"
|
|
185
|
+
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
|
|
186
|
+
integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
|
|
187
187
|
|
|
188
188
|
"@langchain/core@^1.0.1":
|
|
189
189
|
version "1.0.1"
|
|
@@ -374,6 +374,11 @@
|
|
|
374
374
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz#848f99b0d9936d92221bb6070baeff4db6947a30"
|
|
375
375
|
integrity sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==
|
|
376
376
|
|
|
377
|
+
"@standard-schema/spec@^1.0.0":
|
|
378
|
+
version "1.0.0"
|
|
379
|
+
resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c"
|
|
380
|
+
integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==
|
|
381
|
+
|
|
377
382
|
"@tailwindcss/node@4.0.11":
|
|
378
383
|
version "4.0.11"
|
|
379
384
|
resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.0.11.tgz#0d635f7e4fb4407f61da2e81404e7dfb8ce500c9"
|
|
@@ -467,6 +472,19 @@
|
|
|
467
472
|
postcss "^8.4.41"
|
|
468
473
|
tailwindcss "4.0.11"
|
|
469
474
|
|
|
475
|
+
"@types/chai@^5.2.2":
|
|
476
|
+
version "5.2.3"
|
|
477
|
+
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a"
|
|
478
|
+
integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==
|
|
479
|
+
dependencies:
|
|
480
|
+
"@types/deep-eql" "*"
|
|
481
|
+
assertion-error "^2.0.1"
|
|
482
|
+
|
|
483
|
+
"@types/deep-eql@*":
|
|
484
|
+
version "4.0.2"
|
|
485
|
+
resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd"
|
|
486
|
+
integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==
|
|
487
|
+
|
|
470
488
|
"@types/estree@1.0.7":
|
|
471
489
|
version "1.0.7"
|
|
472
490
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8"
|
|
@@ -528,64 +546,63 @@
|
|
|
528
546
|
dependencies:
|
|
529
547
|
debug "^4.1.1"
|
|
530
548
|
|
|
531
|
-
"@vitest/expect@
|
|
532
|
-
version "
|
|
533
|
-
resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-
|
|
534
|
-
integrity sha512-
|
|
549
|
+
"@vitest/expect@4.0.6":
|
|
550
|
+
version "4.0.6"
|
|
551
|
+
resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.6.tgz#33df10e2f9728b7338c2a2331c75814d1f840ab7"
|
|
552
|
+
integrity sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==
|
|
535
553
|
dependencies:
|
|
536
|
-
"@
|
|
537
|
-
"@
|
|
538
|
-
|
|
539
|
-
|
|
554
|
+
"@standard-schema/spec" "^1.0.0"
|
|
555
|
+
"@types/chai" "^5.2.2"
|
|
556
|
+
"@vitest/spy" "4.0.6"
|
|
557
|
+
"@vitest/utils" "4.0.6"
|
|
558
|
+
chai "^6.0.1"
|
|
559
|
+
tinyrainbow "^3.0.3"
|
|
540
560
|
|
|
541
|
-
"@vitest/mocker@
|
|
542
|
-
version "
|
|
543
|
-
resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-
|
|
544
|
-
integrity sha512-
|
|
561
|
+
"@vitest/mocker@4.0.6":
|
|
562
|
+
version "4.0.6"
|
|
563
|
+
resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-4.0.6.tgz#3e27579d4444ca113685fc040961ce4b415ba5d2"
|
|
564
|
+
integrity sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==
|
|
545
565
|
dependencies:
|
|
546
|
-
"@vitest/spy" "
|
|
566
|
+
"@vitest/spy" "4.0.6"
|
|
547
567
|
estree-walker "^3.0.3"
|
|
548
|
-
magic-string "^0.30.
|
|
568
|
+
magic-string "^0.30.19"
|
|
549
569
|
|
|
550
|
-
"@vitest/pretty-format@
|
|
551
|
-
version "
|
|
552
|
-
resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-
|
|
553
|
-
integrity sha512-
|
|
570
|
+
"@vitest/pretty-format@4.0.6":
|
|
571
|
+
version "4.0.6"
|
|
572
|
+
resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-4.0.6.tgz#af838540d3cd6b29c5d434fbdd36eb2543b040a3"
|
|
573
|
+
integrity sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==
|
|
554
574
|
dependencies:
|
|
555
|
-
tinyrainbow "^
|
|
575
|
+
tinyrainbow "^3.0.3"
|
|
556
576
|
|
|
557
|
-
"@vitest/runner@
|
|
558
|
-
version "
|
|
559
|
-
resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-
|
|
560
|
-
integrity sha512-
|
|
577
|
+
"@vitest/runner@4.0.6":
|
|
578
|
+
version "4.0.6"
|
|
579
|
+
resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-4.0.6.tgz#5a938015cfb202b96cbff4688400f1cd4899b40a"
|
|
580
|
+
integrity sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==
|
|
561
581
|
dependencies:
|
|
562
|
-
"@vitest/utils" "
|
|
582
|
+
"@vitest/utils" "4.0.6"
|
|
563
583
|
pathe "^2.0.3"
|
|
564
584
|
|
|
565
|
-
"@vitest/snapshot@
|
|
566
|
-
version "
|
|
567
|
-
resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-
|
|
568
|
-
integrity sha512-
|
|
585
|
+
"@vitest/snapshot@4.0.6":
|
|
586
|
+
version "4.0.6"
|
|
587
|
+
resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-4.0.6.tgz#5cf47e396123cc379944632e908e74fb78d58f13"
|
|
588
|
+
integrity sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==
|
|
569
589
|
dependencies:
|
|
570
|
-
"@vitest/pretty-format" "
|
|
571
|
-
magic-string "^0.30.
|
|
590
|
+
"@vitest/pretty-format" "4.0.6"
|
|
591
|
+
magic-string "^0.30.19"
|
|
572
592
|
pathe "^2.0.3"
|
|
573
593
|
|
|
574
|
-
"@vitest/spy@
|
|
575
|
-
version "
|
|
576
|
-
resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-
|
|
577
|
-
integrity sha512-
|
|
578
|
-
dependencies:
|
|
579
|
-
tinyspy "^3.0.2"
|
|
594
|
+
"@vitest/spy@4.0.6":
|
|
595
|
+
version "4.0.6"
|
|
596
|
+
resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-4.0.6.tgz#3860eb53cfe333c5eefe8b510eb7d71da7f4bd70"
|
|
597
|
+
integrity sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==
|
|
580
598
|
|
|
581
|
-
"@vitest/utils@
|
|
582
|
-
version "
|
|
583
|
-
resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-
|
|
584
|
-
integrity sha512-
|
|
599
|
+
"@vitest/utils@4.0.6":
|
|
600
|
+
version "4.0.6"
|
|
601
|
+
resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-4.0.6.tgz#e8ce743a4a5adcd7228823249b643bc894c0955d"
|
|
602
|
+
integrity sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==
|
|
585
603
|
dependencies:
|
|
586
|
-
"@vitest/pretty-format" "
|
|
587
|
-
|
|
588
|
-
tinyrainbow "^2.0.0"
|
|
604
|
+
"@vitest/pretty-format" "4.0.6"
|
|
605
|
+
tinyrainbow "^3.0.3"
|
|
589
606
|
|
|
590
607
|
ansi-styles@^4.1.0:
|
|
591
608
|
version "4.3.0"
|
|
@@ -643,11 +660,6 @@ bundle-name@^4.1.0:
|
|
|
643
660
|
dependencies:
|
|
644
661
|
run-applescript "^7.0.0"
|
|
645
662
|
|
|
646
|
-
cac@^6.7.14:
|
|
647
|
-
version "6.7.14"
|
|
648
|
-
resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959"
|
|
649
|
-
integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
|
|
650
|
-
|
|
651
663
|
camelcase@6:
|
|
652
664
|
version "6.3.0"
|
|
653
665
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
|
|
@@ -658,16 +670,10 @@ caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688:
|
|
|
658
670
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz#cde16fa8adaa066c04aec2967b6cde46354644c4"
|
|
659
671
|
integrity sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==
|
|
660
672
|
|
|
661
|
-
chai@^
|
|
662
|
-
version "
|
|
663
|
-
resolved "https://registry.yarnpkg.com/chai/-/chai-
|
|
664
|
-
integrity sha512-
|
|
665
|
-
dependencies:
|
|
666
|
-
assertion-error "^2.0.1"
|
|
667
|
-
check-error "^2.1.1"
|
|
668
|
-
deep-eql "^5.0.1"
|
|
669
|
-
loupe "^3.1.0"
|
|
670
|
-
pathval "^2.0.0"
|
|
673
|
+
chai@^6.0.1:
|
|
674
|
+
version "6.2.0"
|
|
675
|
+
resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce"
|
|
676
|
+
integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==
|
|
671
677
|
|
|
672
678
|
chalk@^4.1.2:
|
|
673
679
|
version "4.1.2"
|
|
@@ -677,11 +683,6 @@ chalk@^4.1.2:
|
|
|
677
683
|
ansi-styles "^4.1.0"
|
|
678
684
|
supports-color "^7.1.0"
|
|
679
685
|
|
|
680
|
-
check-error@^2.1.1:
|
|
681
|
-
version "2.1.1"
|
|
682
|
-
resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc"
|
|
683
|
-
integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==
|
|
684
|
-
|
|
685
686
|
color-convert@^1.9.3:
|
|
686
687
|
version "1.9.3"
|
|
687
688
|
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
|
@@ -764,17 +765,10 @@ csstype@^3.0.2:
|
|
|
764
765
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
|
765
766
|
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
|
766
767
|
|
|
767
|
-
debug@^4.1.1:
|
|
768
|
-
version "4.3
|
|
769
|
-
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.
|
|
770
|
-
integrity sha512-
|
|
771
|
-
dependencies:
|
|
772
|
-
ms "^2.1.3"
|
|
773
|
-
|
|
774
|
-
debug@^4.4.0:
|
|
775
|
-
version "4.4.0"
|
|
776
|
-
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
|
|
777
|
-
integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
|
|
768
|
+
debug@^4.1.1, debug@^4.4.3:
|
|
769
|
+
version "4.4.3"
|
|
770
|
+
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
|
|
771
|
+
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
|
|
778
772
|
dependencies:
|
|
779
773
|
ms "^2.1.3"
|
|
780
774
|
|
|
@@ -783,15 +777,10 @@ decamelize@1.2.0:
|
|
|
783
777
|
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
|
784
778
|
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
|
|
785
779
|
|
|
786
|
-
dedent@^1.5.3:
|
|
787
|
-
version "1.
|
|
788
|
-
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.
|
|
789
|
-
integrity sha512-
|
|
790
|
-
|
|
791
|
-
deep-eql@^5.0.1:
|
|
792
|
-
version "5.0.2"
|
|
793
|
-
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341"
|
|
794
|
-
integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==
|
|
780
|
+
dedent@^1.5.3, dedent@^1.7.0:
|
|
781
|
+
version "1.7.0"
|
|
782
|
+
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.0.tgz#c1f9445335f0175a96587be245a282ff451446ca"
|
|
783
|
+
integrity sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==
|
|
795
784
|
|
|
796
785
|
default-browser-id@^5.0.0:
|
|
797
786
|
version "5.0.0"
|
|
@@ -912,16 +901,21 @@ exit-hook@^4.0.0:
|
|
|
912
901
|
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-4.0.0.tgz#c1e16ebd03d3166f837b1502dac755bb5c460d58"
|
|
913
902
|
integrity sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==
|
|
914
903
|
|
|
915
|
-
expect-type@^1.2.
|
|
916
|
-
version "1.2.
|
|
917
|
-
resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.
|
|
918
|
-
integrity sha512
|
|
904
|
+
expect-type@^1.2.2:
|
|
905
|
+
version "1.2.2"
|
|
906
|
+
resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3"
|
|
907
|
+
integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==
|
|
919
908
|
|
|
920
909
|
fdir@^6.4.4:
|
|
921
910
|
version "6.4.5"
|
|
922
911
|
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.5.tgz#328e280f3a23699362f95f2e82acf978a0c0cb49"
|
|
923
912
|
integrity sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==
|
|
924
913
|
|
|
914
|
+
fdir@^6.5.0:
|
|
915
|
+
version "6.5.0"
|
|
916
|
+
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350"
|
|
917
|
+
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
|
|
918
|
+
|
|
925
919
|
fecha@^4.2.0:
|
|
926
920
|
version "4.2.3"
|
|
927
921
|
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
|
|
@@ -949,11 +943,6 @@ generic-names@^4.0.0:
|
|
|
949
943
|
dependencies:
|
|
950
944
|
loader-utils "^3.2.0"
|
|
951
945
|
|
|
952
|
-
get-func-name@^2.0.1:
|
|
953
|
-
version "2.0.2"
|
|
954
|
-
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
|
|
955
|
-
integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
|
|
956
|
-
|
|
957
946
|
get-tsconfig@^4.7.5:
|
|
958
947
|
version "4.8.1"
|
|
959
948
|
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471"
|
|
@@ -971,10 +960,10 @@ has-flag@^4.0.0:
|
|
|
971
960
|
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
|
972
961
|
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
|
973
962
|
|
|
974
|
-
hono@^4.10.
|
|
975
|
-
version "4.10.
|
|
976
|
-
resolved "https://registry.yarnpkg.com/hono/-/hono-4.10.
|
|
977
|
-
integrity sha512-
|
|
963
|
+
hono@^4.10.4, hono@^4.5.4:
|
|
964
|
+
version "4.10.4"
|
|
965
|
+
resolved "https://registry.yarnpkg.com/hono/-/hono-4.10.4.tgz#226f19a7be0f524c3acb736f5c9da5bd081954ca"
|
|
966
|
+
integrity sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg==
|
|
978
967
|
|
|
979
968
|
icss-utils@^5.0.0, icss-utils@^5.1.0:
|
|
980
969
|
version "5.1.0"
|
|
@@ -1155,24 +1144,12 @@ logform@^2.2.0, logform@^2.7.0:
|
|
|
1155
1144
|
safe-stable-stringify "^2.3.1"
|
|
1156
1145
|
triple-beam "^1.3.0"
|
|
1157
1146
|
|
|
1158
|
-
|
|
1159
|
-
version "
|
|
1160
|
-
resolved "https://registry.yarnpkg.com/
|
|
1161
|
-
integrity sha512-
|
|
1162
|
-
dependencies:
|
|
1163
|
-
get-func-name "^2.0.1"
|
|
1164
|
-
|
|
1165
|
-
loupe@^3.1.3:
|
|
1166
|
-
version "3.1.3"
|
|
1167
|
-
resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2"
|
|
1168
|
-
integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==
|
|
1169
|
-
|
|
1170
|
-
magic-string@^0.30.17:
|
|
1171
|
-
version "0.30.17"
|
|
1172
|
-
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
|
|
1173
|
-
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
|
|
1147
|
+
magic-string@^0.30.19:
|
|
1148
|
+
version "0.30.21"
|
|
1149
|
+
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"
|
|
1150
|
+
integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
|
|
1174
1151
|
dependencies:
|
|
1175
|
-
"@jridgewell/sourcemap-codec" "^1.5.
|
|
1152
|
+
"@jridgewell/sourcemap-codec" "^1.5.5"
|
|
1176
1153
|
|
|
1177
1154
|
ms@^2.1.1, ms@^2.1.3:
|
|
1178
1155
|
version "2.1.3"
|
|
@@ -1271,20 +1248,15 @@ pathe@^2.0.3:
|
|
|
1271
1248
|
resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
|
|
1272
1249
|
integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
|
|
1273
1250
|
|
|
1274
|
-
pathval@^2.0.0:
|
|
1275
|
-
version "2.0.0"
|
|
1276
|
-
resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25"
|
|
1277
|
-
integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==
|
|
1278
|
-
|
|
1279
1251
|
picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1:
|
|
1280
1252
|
version "1.1.1"
|
|
1281
1253
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
|
|
1282
1254
|
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
|
|
1283
1255
|
|
|
1284
|
-
picomatch@^4.0.2:
|
|
1285
|
-
version "4.0.
|
|
1286
|
-
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.
|
|
1287
|
-
integrity sha512-
|
|
1256
|
+
picomatch@^4.0.2, picomatch@^4.0.3:
|
|
1257
|
+
version "4.0.3"
|
|
1258
|
+
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
|
|
1259
|
+
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
|
|
1288
1260
|
|
|
1289
1261
|
postcss-modules-extract-imports@^3.1.0:
|
|
1290
1262
|
version "3.1.0"
|
|
@@ -1355,10 +1327,10 @@ postgres@^3.4.4:
|
|
|
1355
1327
|
resolved "https://registry.yarnpkg.com/postgres/-/postgres-3.4.4.tgz#adbe08dc1fff0dea3559aa4f83ded70a289a6cb8"
|
|
1356
1328
|
integrity sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==
|
|
1357
1329
|
|
|
1358
|
-
prettier@^3.
|
|
1359
|
-
version "3.
|
|
1360
|
-
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.
|
|
1361
|
-
integrity sha512-
|
|
1330
|
+
prettier@^3.6.2:
|
|
1331
|
+
version "3.6.2"
|
|
1332
|
+
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
|
|
1333
|
+
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
|
1362
1334
|
|
|
1363
1335
|
readable-stream@^3.4.0, readable-stream@^3.6.2:
|
|
1364
1336
|
version "3.6.2"
|
|
@@ -1528,38 +1500,28 @@ tinyexec@^0.3.2:
|
|
|
1528
1500
|
resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2"
|
|
1529
1501
|
integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
|
|
1530
1502
|
|
|
1531
|
-
tinyglobby@^0.2.13:
|
|
1532
|
-
version "0.2.
|
|
1533
|
-
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.
|
|
1534
|
-
integrity sha512-
|
|
1503
|
+
tinyglobby@^0.2.13, tinyglobby@^0.2.15:
|
|
1504
|
+
version "0.2.15"
|
|
1505
|
+
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2"
|
|
1506
|
+
integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
|
|
1535
1507
|
dependencies:
|
|
1536
|
-
fdir "^6.
|
|
1537
|
-
picomatch "^4.0.
|
|
1508
|
+
fdir "^6.5.0"
|
|
1509
|
+
picomatch "^4.0.3"
|
|
1538
1510
|
|
|
1539
|
-
|
|
1540
|
-
version "
|
|
1541
|
-
resolved "https://registry.yarnpkg.com/
|
|
1542
|
-
integrity sha512-
|
|
1543
|
-
|
|
1544
|
-
tinyrainbow@^2.0.0:
|
|
1545
|
-
version "2.0.0"
|
|
1546
|
-
resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294"
|
|
1547
|
-
integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==
|
|
1548
|
-
|
|
1549
|
-
tinyspy@^3.0.2:
|
|
1550
|
-
version "3.0.2"
|
|
1551
|
-
resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a"
|
|
1552
|
-
integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==
|
|
1511
|
+
tinyrainbow@^3.0.3:
|
|
1512
|
+
version "3.0.3"
|
|
1513
|
+
resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-3.0.3.tgz#984a5b1c1b25854a9b6bccbe77964d0593d1ea42"
|
|
1514
|
+
integrity sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==
|
|
1553
1515
|
|
|
1554
1516
|
triple-beam@^1.3.0:
|
|
1555
1517
|
version "1.4.1"
|
|
1556
1518
|
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
|
|
1557
1519
|
integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
|
|
1558
1520
|
|
|
1559
|
-
tsx@^4.19.3:
|
|
1560
|
-
version "4.
|
|
1561
|
-
resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.
|
|
1562
|
-
integrity sha512-
|
|
1521
|
+
tsx@^4.19.3, tsx@^4.20.6:
|
|
1522
|
+
version "4.20.6"
|
|
1523
|
+
resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.20.6.tgz#8fb803fd9c1f70e8ccc93b5d7c5e03c3979ccb2e"
|
|
1524
|
+
integrity sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==
|
|
1563
1525
|
dependencies:
|
|
1564
1526
|
esbuild "~0.25.0"
|
|
1565
1527
|
get-tsconfig "^4.7.5"
|
|
@@ -1609,18 +1571,7 @@ uuid@^9.0.0:
|
|
|
1609
1571
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
|
|
1610
1572
|
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
|
|
1611
1573
|
|
|
1612
|
-
vite
|
|
1613
|
-
version "3.1.4"
|
|
1614
|
-
resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.1.4.tgz#13f10b2cb155197a971cb2761664ec952c6cae18"
|
|
1615
|
-
integrity sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==
|
|
1616
|
-
dependencies:
|
|
1617
|
-
cac "^6.7.14"
|
|
1618
|
-
debug "^4.4.0"
|
|
1619
|
-
es-module-lexer "^1.7.0"
|
|
1620
|
-
pathe "^2.0.3"
|
|
1621
|
-
vite "^5.0.0 || ^6.0.0"
|
|
1622
|
-
|
|
1623
|
-
"vite@^5.0.0 || ^6.0.0", vite@^6.1.6, vite@^6.4.1:
|
|
1574
|
+
"vite@^6.0.0 || ^7.0.0", vite@^6.1.6, vite@^6.4.1:
|
|
1624
1575
|
version "6.4.1"
|
|
1625
1576
|
resolved "https://registry.yarnpkg.com/vite/-/vite-6.4.1.tgz#afbe14518cdd6887e240a4b0221ab6d0ce733f96"
|
|
1626
1577
|
integrity sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==
|
|
@@ -1634,31 +1585,30 @@ vite-node@3.1.4:
|
|
|
1634
1585
|
optionalDependencies:
|
|
1635
1586
|
fsevents "~2.3.3"
|
|
1636
1587
|
|
|
1637
|
-
vitest@^
|
|
1638
|
-
version "
|
|
1639
|
-
resolved "https://registry.yarnpkg.com/vitest/-/vitest-
|
|
1640
|
-
integrity sha512-
|
|
1641
|
-
dependencies:
|
|
1642
|
-
"@vitest/expect" "
|
|
1643
|
-
"@vitest/mocker" "
|
|
1644
|
-
"@vitest/pretty-format" "
|
|
1645
|
-
"@vitest/runner" "
|
|
1646
|
-
"@vitest/snapshot" "
|
|
1647
|
-
"@vitest/spy" "
|
|
1648
|
-
"@vitest/utils" "
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
expect-type "^1.2.
|
|
1652
|
-
magic-string "^0.30.
|
|
1588
|
+
vitest@^4.0.6:
|
|
1589
|
+
version "4.0.6"
|
|
1590
|
+
resolved "https://registry.yarnpkg.com/vitest/-/vitest-4.0.6.tgz#a0cbc78192cce8726d06c471b8e5b5b9cc6beea5"
|
|
1591
|
+
integrity sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==
|
|
1592
|
+
dependencies:
|
|
1593
|
+
"@vitest/expect" "4.0.6"
|
|
1594
|
+
"@vitest/mocker" "4.0.6"
|
|
1595
|
+
"@vitest/pretty-format" "4.0.6"
|
|
1596
|
+
"@vitest/runner" "4.0.6"
|
|
1597
|
+
"@vitest/snapshot" "4.0.6"
|
|
1598
|
+
"@vitest/spy" "4.0.6"
|
|
1599
|
+
"@vitest/utils" "4.0.6"
|
|
1600
|
+
debug "^4.4.3"
|
|
1601
|
+
es-module-lexer "^1.7.0"
|
|
1602
|
+
expect-type "^1.2.2"
|
|
1603
|
+
magic-string "^0.30.19"
|
|
1653
1604
|
pathe "^2.0.3"
|
|
1605
|
+
picomatch "^4.0.3"
|
|
1654
1606
|
std-env "^3.9.0"
|
|
1655
1607
|
tinybench "^2.9.0"
|
|
1656
1608
|
tinyexec "^0.3.2"
|
|
1657
|
-
tinyglobby "^0.2.
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
vite "^5.0.0 || ^6.0.0"
|
|
1661
|
-
vite-node "3.1.4"
|
|
1609
|
+
tinyglobby "^0.2.15"
|
|
1610
|
+
tinyrainbow "^3.0.3"
|
|
1611
|
+
vite "^6.0.0 || ^7.0.0"
|
|
1662
1612
|
why-is-node-running "^2.3.0"
|
|
1663
1613
|
|
|
1664
1614
|
why-is-node-running@^2.3.0:
|
langgraph_api/route.py
CHANGED
|
@@ -14,6 +14,7 @@ from starlette.responses import JSONResponse
|
|
|
14
14
|
from starlette.routing import Route, compile_path, get_name
|
|
15
15
|
from starlette.types import ASGIApp, Receive, Scope, Send
|
|
16
16
|
|
|
17
|
+
from langgraph_api import config
|
|
17
18
|
from langgraph_api.serde import json_dumpb
|
|
18
19
|
from langgraph_api.utils import get_auth_ctx, with_user
|
|
19
20
|
|
|
@@ -58,10 +59,11 @@ class ApiResponse(JSONResponse):
|
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
def _json_loads(content: bytearray, schema: SchemaType) -> typing.Any:
|
|
61
|
-
|
|
62
|
+
"""Parse JSON and validate schema. Used by threadpool for large payloads."""
|
|
63
|
+
json_data = orjson.loads(content)
|
|
62
64
|
if schema is not None:
|
|
63
|
-
schema.validate(
|
|
64
|
-
return
|
|
65
|
+
schema.validate(json_data)
|
|
66
|
+
return json_data
|
|
65
67
|
|
|
66
68
|
|
|
67
69
|
class ApiRequest(Request):
|
|
@@ -76,8 +78,16 @@ class ApiRequest(Request):
|
|
|
76
78
|
async def json(self, schema: SchemaType = None) -> typing.Any:
|
|
77
79
|
if not hasattr(self, "_json"):
|
|
78
80
|
body = await self.body()
|
|
81
|
+
|
|
82
|
+
# Hybrid approach for optimal performance:
|
|
83
|
+
# - Small payloads: parse directly (fast, no queueing/thread pool limitations)
|
|
84
|
+
# - Large payloads: use dedicated thread pool (safer, doesn't block event loop)
|
|
79
85
|
try:
|
|
80
|
-
self._json =
|
|
86
|
+
self._json = (
|
|
87
|
+
await run_in_threadpool(_json_loads, body, schema)
|
|
88
|
+
if len(body) > config.JSON_THREAD_POOL_MINIMUM_SIZE_BYTES
|
|
89
|
+
else _json_loads(body, schema)
|
|
90
|
+
)
|
|
81
91
|
except orjson.JSONDecodeError as e:
|
|
82
92
|
raise HTTPException(
|
|
83
93
|
status_code=422, detail="Invalid JSON in request body"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: langgraph-api
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
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
|
|
@@ -13,7 +13,7 @@ Requires-Dist: httpx>=0.25.0
|
|
|
13
13
|
Requires-Dist: jsonschema-rs<0.30,>=0.20.0
|
|
14
14
|
Requires-Dist: langchain-core>=0.3.64
|
|
15
15
|
Requires-Dist: langgraph-checkpoint<4,>=3
|
|
16
|
-
Requires-Dist: langgraph-runtime-inmem<0.
|
|
16
|
+
Requires-Dist: langgraph-runtime-inmem<0.17.0,>=0.16.0
|
|
17
17
|
Requires-Dist: langgraph-sdk>=0.2.0
|
|
18
18
|
Requires-Dist: langgraph<2,>=0.4.10
|
|
19
19
|
Requires-Dist: langsmith>=0.3.45
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
langgraph_api/__init__.py,sha256=
|
|
1
|
+
langgraph_api/__init__.py,sha256=isJrmDBLRag7Zc2UK9ZovWGOv7ji1Oh-zJtJMNJFkXw,22
|
|
2
2
|
langgraph_api/asgi_transport.py,sha256=XtiLOu4WWsd-xizagBLzT5xUkxc9ZG9YqwvETBPjBFE,5161
|
|
3
3
|
langgraph_api/asyncio.py,sha256=FEEkLm_N-15cbElo4vQ309MkDKBZuRqAYV8VJ1DocNw,9860
|
|
4
4
|
langgraph_api/cli.py,sha256=aEI2pfztEEziIwUk2imiLkNVK1LapMp_3dxvcar1org,18341
|
|
5
5
|
langgraph_api/command.py,sha256=Bh-rvuTLwdHCqFWryCjB1M8oWxPBwRBUjMNj_04KPxM,852
|
|
6
|
-
langgraph_api/config.py,sha256=
|
|
6
|
+
langgraph_api/config.py,sha256=YK0tQ3ZbbI3GgqLcX4-Jayzt4iJX3gsFaa8IeTWEGXM,17047
|
|
7
7
|
langgraph_api/cron_scheduler.py,sha256=25wYzEQrhPEivZrAPYOmzLPDOQa-aFogU37mTXc9TJk,2566
|
|
8
8
|
langgraph_api/errors.py,sha256=zlnl3xXIwVG0oGNKKpXf1an9Rn_SBDHSyhe53hU6aLw,1858
|
|
9
9
|
langgraph_api/executor_entrypoint.py,sha256=CaX813ygtf9CpOaBkfkQXJAHjFtmlScCkrOvTDmu4Aw,750
|
|
@@ -16,7 +16,7 @@ langgraph_api/logging.py,sha256=o5iVARqtFYKIcRrK2nk1ymcKEiVYKd_dHmhXLF2khFI,6090
|
|
|
16
16
|
langgraph_api/metadata.py,sha256=Ah5x5TB8O1VAypzDa1UTrsptS1hjy9z-PuNF8WYl3VM,8597
|
|
17
17
|
langgraph_api/patch.py,sha256=J0MmcfpZG15SUVaVcI0Z4x_c0-0rbbT7Pwh9fDAQOpA,1566
|
|
18
18
|
langgraph_api/queue_entrypoint.py,sha256=z3ZUBl3CpnMm0KFPqCuGvSohPAmYQbhAdyRizSJSClM,8481
|
|
19
|
-
langgraph_api/route.py,sha256=
|
|
19
|
+
langgraph_api/route.py,sha256=wh2vMKksTpXJRQ_rLLrFXBSlG608fSMJguZATSWu0Y8,5593
|
|
20
20
|
langgraph_api/schema.py,sha256=spZ_XPT4AMJfw2YatsdnMZZLzgB9Sm3YR8n0SlgGdJ8,8480
|
|
21
21
|
langgraph_api/self_hosted_logs.py,sha256=9ljOz3KH3O1SwsD7eTKnreyJ80NbeR7nj7SuxBlrmCc,4422
|
|
22
22
|
langgraph_api/self_hosted_metrics.py,sha256=3FFezxjU0Vs-bsH39f4Dcwn7fporTLHV9REQ3UQ315A,14004
|
|
@@ -33,7 +33,7 @@ langgraph_api/webhook.py,sha256=SvSM1rdnNtiH4q3JQYmAqJUk2Sable5xAcwOLuRhtlo,1723
|
|
|
33
33
|
langgraph_api/worker.py,sha256=HHgf590xElF7v02lgn0lG0iK2v2sENMjdx7TVFCvYXY,15399
|
|
34
34
|
langgraph_api/api/__init__.py,sha256=wrnxz_204b2Vhv4-N0WpiPf-ZpDDlmIQkbh-TiXPnOo,5997
|
|
35
35
|
langgraph_api/api/a2a.py,sha256=HIHZkLnIcM1u1FJti-L2NH-h1I9BZ_d-QW9z3gFonn8,53995
|
|
36
|
-
langgraph_api/api/assistants.py,sha256=
|
|
36
|
+
langgraph_api/api/assistants.py,sha256=OCup8rXk0HaqWqDhOLz59f1KSTS5fwxXrCaDgyopges,17981
|
|
37
37
|
langgraph_api/api/mcp.py,sha256=qe10ZRMN3f-Hli-9TI8nbQyWvMeBb72YB1PZVbyqBQw,14418
|
|
38
38
|
langgraph_api/api/meta.py,sha256=_jG61UKs0J_alsCDgIwCAx1rX5pYuUwKrmOEpWnzR1I,4817
|
|
39
39
|
langgraph_api/api/openapi.py,sha256=If-z1ckXt-Yu5bwQytK1LWyX_T7G46UtLfixgEP8hwc,11959
|
|
@@ -50,8 +50,8 @@ langgraph_api/auth/langsmith/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
50
50
|
langgraph_api/auth/langsmith/backend.py,sha256=JVf8-q1IvB5EeiLJge3cOtPvDg6qHzK_4cR-R8hPXXQ,3753
|
|
51
51
|
langgraph_api/auth/langsmith/client.py,sha256=79kwCVeHU64nsHsxWipfZhf44lM6vfs2nlfTxlJF6LU,4142
|
|
52
52
|
langgraph_api/grpc_ops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
langgraph_api/grpc_ops/client.py,sha256=
|
|
54
|
-
langgraph_api/grpc_ops/ops.py,sha256=
|
|
53
|
+
langgraph_api/grpc_ops/client.py,sha256=Qr07JVaJrMr3jWQKFHngyC3gqsj-VNLzahbnpj1vDO8,5753
|
|
54
|
+
langgraph_api/grpc_ops/ops.py,sha256=6L7OiKcVQgAVjkrWiGO5o1pnkZ1Fcas1H3ULtyp0vbo,37442
|
|
55
55
|
langgraph_api/grpc_ops/generated/__init__.py,sha256=dRiB_iGscPKdMpuLp9ueLwAmIfRaNjNXC64ABtb4cg8,135
|
|
56
56
|
langgraph_api/grpc_ops/generated/core_api_pb2.py,sha256=l209i8cIazfs-zPTlt2jUg_og82oiDT4QMQCYAhU0P4,42262
|
|
57
57
|
langgraph_api/grpc_ops/generated/core_api_pb2.pyi,sha256=6fnrjKRdN1-jJfHagLHhdlVog1cLkLoAc9fvTBzeFdM,49429
|
|
@@ -65,15 +65,15 @@ langgraph_api/js/client.http.mts,sha256=FeVM53vduTPCyMPaYs__kmB3iWcz0k0om811DG0J
|
|
|
65
65
|
langgraph_api/js/client.mts,sha256=8T5wp_114c2wGPfktY77StTnejhYL3ZWBmLwaUvp5XU,32333
|
|
66
66
|
langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
|
|
67
67
|
langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
|
|
68
|
-
langgraph_api/js/package.json,sha256=
|
|
68
|
+
langgraph_api/js/package.json,sha256=V0QYOBlL7oHw2XOefDsoTJ8F1f6ApSQc-sU0JKixpf8,1330
|
|
69
69
|
langgraph_api/js/remote.py,sha256=gBk273R7esmXg8aR6InxasNFc5E6Qju2bv2DhmmGJyU,38676
|
|
70
70
|
langgraph_api/js/schema.py,sha256=M4fLtr50O1jck8H1hm_0W4cZOGYGdkrB7riLyCes4oY,438
|
|
71
71
|
langgraph_api/js/sse.py,sha256=hHkbncnYnXNIbHhAWneGWYkHp4UhhhGB7-MYtDrY264,4141
|
|
72
72
|
langgraph_api/js/traceblock.mts,sha256=QtGSN5VpzmGqDfbArrGXkMiONY94pMQ5CgzetT_bKYg,761
|
|
73
73
|
langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
|
|
74
74
|
langgraph_api/js/ui.py,sha256=l9regrvKIxLOjH5SIYE2nhr8QCKLK1Q_1pZgxdL71X4,2488
|
|
75
|
-
langgraph_api/js/yarn.lock,sha256=
|
|
76
|
-
langgraph_api/js/src/graph.mts,sha256=
|
|
75
|
+
langgraph_api/js/yarn.lock,sha256=rgbpcHxgQ9jk3SkPAJiDsYKJKUcZ8M-43jO25AKzNj0,81970
|
|
76
|
+
langgraph_api/js/src/graph.mts,sha256=etZd27NaoVevyitJ-LAUue0HeR7V3F2YNeSGwWHm13s,3417
|
|
77
77
|
langgraph_api/js/src/load.hooks.mjs,sha256=xNVHq75W0Lk6MUKl1pQYrx-wtQ8_neiUyI6SO-k0ecM,2235
|
|
78
78
|
langgraph_api/js/src/preload.mjs,sha256=8m3bYkf9iZLCQzKAYAdU8snxUwAG3dVLwGvAjfGfgIc,959
|
|
79
79
|
langgraph_api/js/src/utils/files.mts,sha256=nU09Y8lN8SYsg0x2ffmbIW8LEDBl-SWkmxsoXunFU0M,219
|
|
@@ -110,8 +110,8 @@ langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,11
|
|
|
110
110
|
LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
|
|
111
111
|
logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
|
|
112
112
|
openapi.json,sha256=Oi2tU1b8PsXb-6XNHafQvcZv934vLNQhBNPYXr9e2nU,172620
|
|
113
|
-
langgraph_api-0.5.
|
|
114
|
-
langgraph_api-0.5.
|
|
115
|
-
langgraph_api-0.5.
|
|
116
|
-
langgraph_api-0.5.
|
|
117
|
-
langgraph_api-0.5.
|
|
113
|
+
langgraph_api-0.5.2.dist-info/METADATA,sha256=iprZsWl-ZmZR7k6yynxElJFfFd20zOhBjUpqE8_0Ebo,4186
|
|
114
|
+
langgraph_api-0.5.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
115
|
+
langgraph_api-0.5.2.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
|
|
116
|
+
langgraph_api-0.5.2.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
|
|
117
|
+
langgraph_api-0.5.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|