langgraph-api 0.2.45__py3-none-any.whl → 0.2.46__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 +35 -35
- langgraph_api/api/runs.py +10 -1
- langgraph_api/js/remote.py +25 -33
- langgraph_api/stream.py +2 -5
- langgraph_api/worker.py +196 -204
- {langgraph_api-0.2.45.dist-info → langgraph_api-0.2.46.dist-info}/METADATA +1 -1
- {langgraph_api-0.2.45.dist-info → langgraph_api-0.2.46.dist-info}/RECORD +12 -12
- openapi.json +386 -106
- {langgraph_api-0.2.45.dist-info → langgraph_api-0.2.46.dist-info}/WHEEL +0 -0
- {langgraph_api-0.2.45.dist-info → langgraph_api-0.2.46.dist-info}/entry_points.txt +0 -0
- {langgraph_api-0.2.45.dist-info → langgraph_api-0.2.46.dist-info}/licenses/LICENSE +0 -0
langgraph_api/worker.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import time
|
|
3
3
|
from collections.abc import AsyncGenerator
|
|
4
|
-
from contextlib import
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
5
|
from datetime import UTC, datetime
|
|
6
6
|
from typing import TypedDict, cast
|
|
7
7
|
|
|
@@ -20,17 +20,13 @@ from langgraph_api.errors import UserInterrupt, UserRollback
|
|
|
20
20
|
from langgraph_api.js.errors import RemoteException
|
|
21
21
|
from langgraph_api.metadata import incr_runs
|
|
22
22
|
from langgraph_api.schema import Run
|
|
23
|
+
from langgraph_api.state import state_snapshot_to_thread_state
|
|
23
24
|
from langgraph_api.stream import astream_state, consume
|
|
24
|
-
from langgraph_api.utils import
|
|
25
|
+
from langgraph_api.utils import with_user
|
|
25
26
|
from langgraph_runtime.database import connect
|
|
26
27
|
from langgraph_runtime.ops import Runs, Threads
|
|
27
28
|
from langgraph_runtime.retry import RETRIABLE_EXCEPTIONS
|
|
28
29
|
|
|
29
|
-
try:
|
|
30
|
-
from psycopg.errors import InFailedSqlTransaction
|
|
31
|
-
except ImportError:
|
|
32
|
-
InFailedSqlTransaction = ()
|
|
33
|
-
|
|
34
30
|
logger = structlog.stdlib.get_logger(__name__)
|
|
35
31
|
|
|
36
32
|
|
|
@@ -90,45 +86,41 @@ async def worker(
|
|
|
90
86
|
if request_created_at is not None
|
|
91
87
|
else None
|
|
92
88
|
)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
)
|
|
112
|
-
run_stream_started_at
|
|
113
|
-
|
|
114
|
-
"Starting background run",
|
|
115
|
-
run_started_at=run_started_at.isoformat(),
|
|
116
|
-
run_creation_ms=run_creation_ms,
|
|
117
|
-
run_queue_ms=ms(run_started_at, run["created_at"]),
|
|
118
|
-
run_stream_start_ms=ms(run_stream_started_at, run_started_at),
|
|
119
|
-
)
|
|
89
|
+
temporary = run["kwargs"].get("temporary", False)
|
|
90
|
+
resumable = run["kwargs"].get("resumable", False)
|
|
91
|
+
run_created_at = run["created_at"].isoformat()
|
|
92
|
+
lg_logging.set_logging_context(
|
|
93
|
+
{
|
|
94
|
+
"run_id": str(run_id),
|
|
95
|
+
"run_attempt": attempt,
|
|
96
|
+
"thread_id": str(run.get("thread_id")),
|
|
97
|
+
"assistant_id": str(run.get("assistant_id")),
|
|
98
|
+
"graph_id": _get_graph_id(run),
|
|
99
|
+
"request_id": _get_request_id(run),
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
run_stream_started_at = datetime.now(UTC)
|
|
103
|
+
await logger.ainfo(
|
|
104
|
+
"Starting background run",
|
|
105
|
+
run_started_at=run_started_at.isoformat(),
|
|
106
|
+
run_creation_ms=run_creation_ms,
|
|
107
|
+
run_queue_ms=ms(run_started_at, run["created_at"]),
|
|
108
|
+
run_stream_start_ms=ms(run_stream_started_at, run_started_at),
|
|
109
|
+
)
|
|
120
110
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
111
|
+
def on_checkpoint(checkpoint_arg: CheckpointPayload):
|
|
112
|
+
nonlocal checkpoint
|
|
113
|
+
checkpoint = checkpoint_arg
|
|
124
114
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
115
|
+
def on_task_result(task_result: TaskResultPayload):
|
|
116
|
+
if checkpoint is not None:
|
|
117
|
+
for task in checkpoint["tasks"]:
|
|
118
|
+
if task["id"] == task_result["id"]:
|
|
119
|
+
task.update(task_result)
|
|
120
|
+
break
|
|
131
121
|
|
|
122
|
+
async with Runs.enter(run_id, main_loop) as done:
|
|
123
|
+
# attempt the run
|
|
132
124
|
try:
|
|
133
125
|
if attempt > BG_JOB_MAX_RETRIES:
|
|
134
126
|
await logger.aerror(
|
|
@@ -155,70 +147,25 @@ async def worker(
|
|
|
155
147
|
)
|
|
156
148
|
|
|
157
149
|
raise RuntimeError(error_message)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
150
|
+
async with set_auth_ctx_for_run(run["kwargs"]):
|
|
151
|
+
if temporary:
|
|
152
|
+
stream = astream_state(cast(Run, run), attempt, done)
|
|
153
|
+
else:
|
|
154
|
+
stream = astream_state(
|
|
155
|
+
cast(Run, run),
|
|
156
|
+
attempt,
|
|
157
|
+
done,
|
|
158
|
+
on_checkpoint=on_checkpoint,
|
|
159
|
+
on_task_result=on_task_result,
|
|
160
|
+
)
|
|
161
|
+
await asyncio.wait_for(
|
|
162
|
+
consume(stream, run_id, resumable),
|
|
163
|
+
BG_JOB_TIMEOUT_SECS,
|
|
169
164
|
)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
BG_JOB_TIMEOUT_SECS,
|
|
173
|
-
)
|
|
174
|
-
run_ended_at_dt = datetime.now(UTC)
|
|
175
|
-
run_ended_at = run_ended_at_dt.isoformat()
|
|
176
|
-
await logger.ainfo(
|
|
177
|
-
"Background run succeeded",
|
|
178
|
-
run_id=str(run_id),
|
|
179
|
-
run_attempt=attempt,
|
|
180
|
-
run_created_at=run_created_at,
|
|
181
|
-
run_started_at=run_started_at.isoformat(),
|
|
182
|
-
run_ended_at=run_ended_at,
|
|
183
|
-
run_exec_ms=ms(run_ended_at_dt, run_started_at),
|
|
184
|
-
run_completed_in_ms=(
|
|
185
|
-
int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
|
|
186
|
-
if request_created_at is not None
|
|
187
|
-
else None
|
|
188
|
-
),
|
|
189
|
-
)
|
|
190
|
-
status = "success"
|
|
191
|
-
await Runs.set_status(conn, run_id, "success")
|
|
192
|
-
except TimeoutError as e:
|
|
193
|
-
exception = e
|
|
194
|
-
status = "timeout"
|
|
195
|
-
run_ended_at = datetime.now(UTC).isoformat()
|
|
196
|
-
await logger.awarning(
|
|
197
|
-
"Background run timed out",
|
|
198
|
-
run_id=str(run_id),
|
|
199
|
-
run_attempt=attempt,
|
|
200
|
-
run_created_at=run_created_at,
|
|
201
|
-
run_started_at=run_started_at.isoformat(),
|
|
202
|
-
run_ended_at=run_ended_at,
|
|
203
|
-
run_exec_ms=ms(datetime.now(UTC), run_started_at),
|
|
204
|
-
run_completed_in_ms=(
|
|
205
|
-
int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
|
|
206
|
-
if request_created_at is not None
|
|
207
|
-
else None
|
|
208
|
-
),
|
|
209
|
-
)
|
|
210
|
-
await Runs.set_status(conn, run_id, "timeout")
|
|
211
|
-
except UserRollback as e:
|
|
212
|
-
exception = e
|
|
213
|
-
status = "rollback"
|
|
214
|
-
run_ended_at_dt = datetime.now(UTC)
|
|
215
|
-
run_ended_at = run_ended_at_dt.isoformat()
|
|
216
|
-
try:
|
|
217
|
-
# Need to close the pipeline to re-use the connection
|
|
218
|
-
await exit_stack.aclose()
|
|
219
|
-
await Runs.delete(conn, run_id, thread_id=run["thread_id"])
|
|
165
|
+
run_ended_at_dt = datetime.now(UTC)
|
|
166
|
+
run_ended_at = run_ended_at_dt.isoformat()
|
|
220
167
|
await logger.ainfo(
|
|
221
|
-
"Background run
|
|
168
|
+
"Background run succeeded",
|
|
222
169
|
run_id=str(run_id),
|
|
223
170
|
run_attempt=attempt,
|
|
224
171
|
run_created_at=run_created_at,
|
|
@@ -231,118 +178,163 @@ async def worker(
|
|
|
231
178
|
else None
|
|
232
179
|
),
|
|
233
180
|
)
|
|
181
|
+
except Exception as ee:
|
|
182
|
+
# Note we don't handle asyncio.CancelledError here, as we want to
|
|
183
|
+
# let it bubble up and rollback db transaction, thus marking the run
|
|
184
|
+
# as available to be picked up by another worker
|
|
185
|
+
exception = ee
|
|
234
186
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
187
|
+
# handle exceptions and set status
|
|
188
|
+
async with connect() as conn:
|
|
189
|
+
if exception is None:
|
|
190
|
+
status = "success"
|
|
191
|
+
await Runs.set_status(conn, run_id, "success")
|
|
192
|
+
# If a stateful run succeeded but no checkpoint was returned, likely
|
|
193
|
+
# there was a retriable exception that resumed right at the end
|
|
194
|
+
if checkpoint is None and not temporary:
|
|
195
|
+
await logger.ainfo(
|
|
196
|
+
"Fetching missing checkpoint for webhook",
|
|
197
|
+
run_id=str(run_id),
|
|
198
|
+
run_attempt=attempt,
|
|
199
|
+
)
|
|
200
|
+
try:
|
|
201
|
+
state_snapshot = await Threads.State.get(
|
|
202
|
+
conn, run["kwargs"]["config"]
|
|
203
|
+
)
|
|
204
|
+
checkpoint = state_snapshot_to_thread_state(state_snapshot)
|
|
205
|
+
except Exception:
|
|
206
|
+
await logger.aerror(
|
|
207
|
+
"Failed to fetch missing checkpoint for webhook. Continuing...",
|
|
208
|
+
exc_info=True,
|
|
209
|
+
run_id=str(run_id),
|
|
210
|
+
run_attempt=attempt,
|
|
211
|
+
)
|
|
212
|
+
elif isinstance(exception, TimeoutError):
|
|
213
|
+
status = "timeout"
|
|
214
|
+
run_ended_at = datetime.now(UTC).isoformat()
|
|
215
|
+
await logger.awarning(
|
|
216
|
+
"Background run timed out",
|
|
238
217
|
run_id=str(run_id),
|
|
239
218
|
run_attempt=attempt,
|
|
240
219
|
run_created_at=run_created_at,
|
|
241
|
-
|
|
220
|
+
run_started_at=run_started_at.isoformat(),
|
|
221
|
+
run_ended_at=run_ended_at,
|
|
222
|
+
run_exec_ms=ms(datetime.now(UTC), run_started_at),
|
|
223
|
+
run_completed_in_ms=(
|
|
224
|
+
int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
|
|
225
|
+
if request_created_at is not None
|
|
226
|
+
else None
|
|
227
|
+
),
|
|
242
228
|
)
|
|
243
|
-
|
|
244
|
-
|
|
229
|
+
await Runs.set_status(conn, run_id, "timeout")
|
|
230
|
+
elif isinstance(exception, UserRollback):
|
|
231
|
+
status = "rollback"
|
|
232
|
+
run_ended_at_dt = datetime.now(UTC)
|
|
233
|
+
run_ended_at = run_ended_at_dt.isoformat()
|
|
234
|
+
try:
|
|
235
|
+
await Runs.delete(conn, run_id, thread_id=run["thread_id"])
|
|
245
236
|
await logger.ainfo(
|
|
246
|
-
"
|
|
237
|
+
"Background run rolled back",
|
|
247
238
|
run_id=str(run_id),
|
|
248
239
|
run_attempt=attempt,
|
|
249
240
|
run_created_at=run_created_at,
|
|
241
|
+
run_started_at=run_started_at.isoformat(),
|
|
242
|
+
run_ended_at=run_ended_at,
|
|
243
|
+
run_exec_ms=ms(run_ended_at_dt, run_started_at),
|
|
244
|
+
run_completed_in_ms=(
|
|
245
|
+
int(
|
|
246
|
+
(run_ended_at_dt.timestamp() * 1_000)
|
|
247
|
+
- request_created_at
|
|
248
|
+
)
|
|
249
|
+
if request_created_at is not None
|
|
250
|
+
else None
|
|
251
|
+
),
|
|
250
252
|
)
|
|
251
|
-
|
|
252
|
-
|
|
253
|
+
except HTTPException as e:
|
|
254
|
+
if e.status_code == 404:
|
|
255
|
+
await logger.ainfo(
|
|
256
|
+
"Ignoring rollback error for missing run",
|
|
257
|
+
run_id=str(run_id),
|
|
258
|
+
run_attempt=attempt,
|
|
259
|
+
run_created_at=run_created_at,
|
|
260
|
+
)
|
|
261
|
+
else:
|
|
262
|
+
raise
|
|
253
263
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
)
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
)
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
# delete or set status of thread
|
|
310
|
-
if temporary:
|
|
311
|
-
await Threads.delete(conn, run["thread_id"])
|
|
312
|
-
else:
|
|
313
|
-
try:
|
|
314
|
-
await Threads.set_status(conn, run["thread_id"], checkpoint, exception)
|
|
315
|
-
except HTTPException as e:
|
|
316
|
-
if e.status_code == 404:
|
|
317
|
-
await logger.ainfo(
|
|
318
|
-
"Ignoring set_status error for missing thread", exc=str(e)
|
|
319
|
-
)
|
|
264
|
+
checkpoint = None # reset the checkpoint
|
|
265
|
+
elif isinstance(exception, UserInterrupt):
|
|
266
|
+
status = "interrupted"
|
|
267
|
+
run_ended_at_dt = datetime.now(UTC)
|
|
268
|
+
run_ended_at = run_ended_at_dt.isoformat()
|
|
269
|
+
await logger.ainfo(
|
|
270
|
+
"Background run interrupted",
|
|
271
|
+
run_id=str(run_id),
|
|
272
|
+
run_attempt=attempt,
|
|
273
|
+
run_created_at=run_created_at,
|
|
274
|
+
run_started_at=run_started_at.isoformat(),
|
|
275
|
+
run_ended_at=run_ended_at,
|
|
276
|
+
run_exec_ms=ms(run_ended_at_dt, run_started_at),
|
|
277
|
+
run_completed_in_ms=(
|
|
278
|
+
int((run_ended_at_dt.timestamp() * 1_000) - request_created_at)
|
|
279
|
+
if request_created_at is not None
|
|
280
|
+
else None
|
|
281
|
+
),
|
|
282
|
+
)
|
|
283
|
+
await Runs.set_status(conn, run_id, "interrupted")
|
|
284
|
+
elif isinstance(exception, RETRIABLE_EXCEPTIONS):
|
|
285
|
+
status = "retry"
|
|
286
|
+
run_ended_at_dt = datetime.now(UTC)
|
|
287
|
+
run_ended_at = run_ended_at_dt.isoformat()
|
|
288
|
+
await logger.awarning(
|
|
289
|
+
f"Background run failed, will retry. Exception: {exception}",
|
|
290
|
+
exc_info=True,
|
|
291
|
+
run_id=str(run_id),
|
|
292
|
+
run_attempt=attempt,
|
|
293
|
+
run_created_at=run_created_at,
|
|
294
|
+
run_started_at=run_started_at.isoformat(),
|
|
295
|
+
run_ended_at=run_ended_at,
|
|
296
|
+
run_exec_ms=ms(run_ended_at_dt, run_started_at),
|
|
297
|
+
)
|
|
298
|
+
await Runs.set_status(conn, run_id, "pending")
|
|
299
|
+
else:
|
|
300
|
+
status = "error"
|
|
301
|
+
run_ended_at_dt = datetime.now(UTC)
|
|
302
|
+
run_ended_at = run_ended_at_dt.isoformat()
|
|
303
|
+
await logger.aexception(
|
|
304
|
+
f"Background run failed. Exception: {exception}",
|
|
305
|
+
exc_info=not isinstance(exception, RemoteException),
|
|
306
|
+
run_id=str(run_id),
|
|
307
|
+
run_attempt=attempt,
|
|
308
|
+
run_created_at=run_created_at,
|
|
309
|
+
run_started_at=run_started_at.isoformat(),
|
|
310
|
+
run_ended_at=run_ended_at,
|
|
311
|
+
run_exec_ms=ms(run_ended_at_dt, run_started_at),
|
|
312
|
+
)
|
|
313
|
+
await Runs.set_status(conn, run_id, "error")
|
|
314
|
+
|
|
315
|
+
# delete or set status of thread
|
|
316
|
+
if not isinstance(exception, RETRIABLE_EXCEPTIONS):
|
|
317
|
+
if temporary:
|
|
318
|
+
await Threads.delete(conn, run["thread_id"])
|
|
320
319
|
else:
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
320
|
+
try:
|
|
321
|
+
await Threads.set_status(
|
|
322
|
+
conn, run["thread_id"], checkpoint, exception
|
|
323
|
+
)
|
|
324
|
+
except HTTPException as e:
|
|
325
|
+
if e.status_code == 404:
|
|
326
|
+
await logger.ainfo(
|
|
327
|
+
"Ignoring set_status error for missing thread",
|
|
328
|
+
exc=str(e),
|
|
329
|
+
)
|
|
330
|
+
else:
|
|
331
|
+
raise
|
|
325
332
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
run_id=str(run_id),
|
|
332
|
-
run_attempt=attempt,
|
|
333
|
-
)
|
|
334
|
-
try:
|
|
335
|
-
state_snapshot = await Threads.State.get(
|
|
336
|
-
conn, run["kwargs"]["config"], subgraphs=True
|
|
337
|
-
)
|
|
338
|
-
checkpoint = {"values": state_snapshot.values}
|
|
339
|
-
except Exception:
|
|
340
|
-
await logger.aerror(
|
|
341
|
-
"Failed to fetch missing checkpoint for webhook. Continuing...",
|
|
342
|
-
exc_info=True,
|
|
343
|
-
run_id=str(run_id),
|
|
344
|
-
run_attempt=attempt,
|
|
345
|
-
)
|
|
333
|
+
if isinstance(exception, RETRIABLE_EXCEPTIONS):
|
|
334
|
+
# re-raise so Runs.enter knows not to mark as done
|
|
335
|
+
# Runs.enter will catch the exception, but what triggers the retry
|
|
336
|
+
# is setting the status to "pending"
|
|
337
|
+
raise exception
|
|
346
338
|
|
|
347
339
|
return WorkerResult(
|
|
348
340
|
checkpoint=checkpoint,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
langgraph_api/__init__.py,sha256=
|
|
1
|
+
langgraph_api/__init__.py,sha256=UXWRy3OxZgq8UtpnFH0qpST_16fmfqlmJEOi5Y-OrzI,23
|
|
2
2
|
langgraph_api/asgi_transport.py,sha256=eqifhHxNnxvI7jJqrY1_8RjL4Fp9NdN4prEub2FWBt8,5091
|
|
3
3
|
langgraph_api/asyncio.py,sha256=nelZwKL7iOjM5GHj1rVjiPE7igUIKLNKtc-3urxmlfo,9250
|
|
4
4
|
langgraph_api/cli.py,sha256=9Ou3tGDDY_VVLt5DFle8UviJdpI4ZigC5hElYvq2-To,14519
|
|
@@ -19,18 +19,18 @@ langgraph_api/server.py,sha256=Z_VL-kIphybTRDWBIqHMfRhgCmAFyTRqAGlgnHQF0Zg,6973
|
|
|
19
19
|
langgraph_api/sse.py,sha256=F7swfjKBDrlUmXZ_dWuDVHtp-3o1Cpjq1lwp0bJD-nw,4223
|
|
20
20
|
langgraph_api/state.py,sha256=8jx4IoTCOjTJuwzuXJKKFwo1VseHjNnw_CCq4x1SW14,2284
|
|
21
21
|
langgraph_api/store.py,sha256=_xGhdwEIMoY1_hIy_oWwxZp4Y7FH833BNJfgFIhT80E,4640
|
|
22
|
-
langgraph_api/stream.py,sha256=
|
|
22
|
+
langgraph_api/stream.py,sha256=Rb9mIeG7nnGtKJhImzkNlE3c0g6C0yM6bbYXQs5GOHU,13560
|
|
23
23
|
langgraph_api/thread_ttl.py,sha256=-Ox8NFHqUH3wGNdEKMIfAXUubY5WGifIgCaJ7npqLgw,1762
|
|
24
24
|
langgraph_api/utils.py,sha256=92mSti9GfGdMRRWyESKQW5yV-75Z9icGHnIrBYvdypU,3619
|
|
25
25
|
langgraph_api/validation.py,sha256=zMuKmwUEBjBgFMwAaeLZmatwGVijKv2sOYtYg7gfRtc,4950
|
|
26
26
|
langgraph_api/webhook.py,sha256=1ncwO0rIZcj-Df9sxSnFEzd1gP1bfS4okeZQS8NSRoE,1382
|
|
27
|
-
langgraph_api/worker.py,sha256=
|
|
27
|
+
langgraph_api/worker.py,sha256=CWXSc4LHQLtNPJgCJC2khw6jb3DNKXnqQ4oB8-UyNSY,15163
|
|
28
28
|
langgraph_api/api/__init__.py,sha256=YVzpbn5IQotvuuLG9fhS9QMrxXfP4s4EpEMG0n4q3Nw,5625
|
|
29
|
-
langgraph_api/api/assistants.py,sha256=
|
|
29
|
+
langgraph_api/api/assistants.py,sha256=6IPVKQBlI95-Z4nYdqBY9st9oynGJAocL67cwnDaZCk,15744
|
|
30
30
|
langgraph_api/api/mcp.py,sha256=RvRYgANqRzNQzSmgjNkq4RlKTtoEJYil04ot9lsmEtE,14352
|
|
31
31
|
langgraph_api/api/meta.py,sha256=S6vj9lvVlZhRYDyefFtJMlqYTPxfYGC5EQKD5hx8Kp8,2946
|
|
32
32
|
langgraph_api/api/openapi.py,sha256=362m6Ny8wOwZ6HrDK9JAVUzPkyLYWKeV1E71hPOaA0U,11278
|
|
33
|
-
langgraph_api/api/runs.py,sha256=
|
|
33
|
+
langgraph_api/api/runs.py,sha256=9jU9C4myBhgZXyvR9MzNn9KrpNo7DvWbg8uNeWzSmKE,19524
|
|
34
34
|
langgraph_api/api/store.py,sha256=TSeMiuMfrifmEnEbL0aObC2DPeseLlmZvAMaMzPgG3Y,5535
|
|
35
35
|
langgraph_api/api/threads.py,sha256=ogMKmEoiycuaV3fa5kpupDohJ7fwUOfVczt6-WSK4FE,9322
|
|
36
36
|
langgraph_api/api/ui.py,sha256=2nlipYV2nUGR4T9pceaAbgN1lS3-T2zPBh7Nv3j9eZQ,2479
|
|
@@ -52,7 +52,7 @@ langgraph_api/js/client.mts,sha256=N9CTH7mbXGSD-gpv-XyruYsHI-rgrObL8cQoAp5s3_U,3
|
|
|
52
52
|
langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
|
|
53
53
|
langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
|
|
54
54
|
langgraph_api/js/package.json,sha256=7_qkj-b0_bpHFFyBDgGaZl3BeuSqkbCD7wNn-ZvQeGA,1333
|
|
55
|
-
langgraph_api/js/remote.py,sha256=
|
|
55
|
+
langgraph_api/js/remote.py,sha256=TwEpmUm6bTLnH8Ku4zCP3cCHyNrYJMIFs4TRUHQTI8Y,35796
|
|
56
56
|
langgraph_api/js/schema.py,sha256=7idnv7URlYUdSNMBXQcw7E4SxaPxCq_Oxwnlml8q5ik,408
|
|
57
57
|
langgraph_api/js/sse.py,sha256=lsfp4nyJyA1COmlKG9e2gJnTttf_HGCB5wyH8OZBER8,4105
|
|
58
58
|
langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
|
|
@@ -85,9 +85,9 @@ langgraph_runtime/retry.py,sha256=V0duD01fO7GUQ_btQkp1aoXcEOFhXooGVP6q4yMfuyY,11
|
|
|
85
85
|
langgraph_runtime/store.py,sha256=7mowndlsIroGHv3NpTSOZDJR0lCuaYMBoTnTrewjslw,114
|
|
86
86
|
LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
|
|
87
87
|
logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
|
|
88
|
-
openapi.json,sha256=
|
|
89
|
-
langgraph_api-0.2.
|
|
90
|
-
langgraph_api-0.2.
|
|
91
|
-
langgraph_api-0.2.
|
|
92
|
-
langgraph_api-0.2.
|
|
93
|
-
langgraph_api-0.2.
|
|
88
|
+
openapi.json,sha256=RDaC5RO3ypsQubo6SeNxXys7cLtC0-1WY5LXZ6P-Ak4,141659
|
|
89
|
+
langgraph_api-0.2.46.dist-info/METADATA,sha256=oU8b8_iGeOqDDk2CkTTfL0zaQQ0PJrKWsShXi6xIFfE,3891
|
|
90
|
+
langgraph_api-0.2.46.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
91
|
+
langgraph_api-0.2.46.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
|
|
92
|
+
langgraph_api-0.2.46.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
|
|
93
|
+
langgraph_api-0.2.46.dist-info/RECORD,,
|