langgraph-api 0.0.48__py3-none-any.whl → 0.1.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.

Files changed (50) hide show
  1. langgraph_api/__init__.py +1 -1
  2. langgraph_api/api/__init__.py +2 -2
  3. langgraph_api/api/assistants.py +3 -3
  4. langgraph_api/api/meta.py +9 -11
  5. langgraph_api/api/runs.py +3 -3
  6. langgraph_api/api/store.py +2 -2
  7. langgraph_api/api/threads.py +3 -3
  8. langgraph_api/auth/custom.py +25 -4
  9. langgraph_api/cli.py +3 -1
  10. langgraph_api/config.py +3 -0
  11. langgraph_api/cron_scheduler.py +3 -3
  12. langgraph_api/graph.py +6 -14
  13. langgraph_api/js/base.py +17 -0
  14. langgraph_api/js/build.mts +3 -3
  15. langgraph_api/js/client.mts +64 -3
  16. langgraph_api/js/global.d.ts +1 -0
  17. langgraph_api/js/package.json +4 -3
  18. langgraph_api/js/remote.py +96 -5
  19. langgraph_api/js/src/graph.mts +0 -6
  20. langgraph_api/js/src/utils/files.mts +4 -0
  21. langgraph_api/js/tests/api.test.mts +80 -80
  22. langgraph_api/js/tests/auth.test.mts +648 -0
  23. langgraph_api/js/tests/compose-postgres.auth.yml +59 -0
  24. langgraph_api/js/tests/graphs/agent_simple.mts +79 -0
  25. langgraph_api/js/tests/graphs/auth.mts +106 -0
  26. langgraph_api/js/tests/graphs/package.json +3 -1
  27. langgraph_api/js/tests/graphs/yarn.lock +9 -4
  28. langgraph_api/js/yarn.lock +18 -23
  29. langgraph_api/metadata.py +7 -0
  30. langgraph_api/models/run.py +10 -1
  31. langgraph_api/queue_entrypoint.py +1 -1
  32. langgraph_api/server.py +2 -2
  33. langgraph_api/stream.py +5 -4
  34. langgraph_api/thread_ttl.py +2 -2
  35. langgraph_api/worker.py +4 -25
  36. {langgraph_api-0.0.48.dist-info → langgraph_api-0.1.2.dist-info}/METADATA +1 -2
  37. {langgraph_api-0.0.48.dist-info → langgraph_api-0.1.2.dist-info}/RECORD +42 -44
  38. langgraph_runtime/__init__.py +39 -0
  39. langgraph_api/lifespan.py +0 -74
  40. langgraph_storage/checkpoint.py +0 -123
  41. langgraph_storage/database.py +0 -200
  42. langgraph_storage/inmem_stream.py +0 -109
  43. langgraph_storage/ops.py +0 -2172
  44. langgraph_storage/queue.py +0 -186
  45. langgraph_storage/retry.py +0 -31
  46. langgraph_storage/store.py +0 -100
  47. {langgraph_storage → langgraph_api/js}/__init__.py +0 -0
  48. {langgraph_api-0.0.48.dist-info → langgraph_api-0.1.2.dist-info}/LICENSE +0 -0
  49. {langgraph_api-0.0.48.dist-info → langgraph_api-0.1.2.dist-info}/WHEEL +0 -0
  50. {langgraph_api-0.0.48.dist-info → langgraph_api-0.1.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,79 @@
1
+ import {
2
+ StateGraph,
3
+ END,
4
+ Send,
5
+ MessagesAnnotation,
6
+ Annotation,
7
+ START,
8
+ LangGraphRunnableConfig,
9
+ } from "@langchain/langgraph";
10
+ import { BaseMessage, ToolMessage } from "@langchain/core/messages";
11
+ import { FakeListChatModel } from "@langchain/core/utils/testing";
12
+
13
+ const getStableModel = (() => {
14
+ const cached: Record<string, FakeListChatModel> = {};
15
+ return (threadId: string) => {
16
+ cached[threadId] ??= new FakeListChatModel({
17
+ responses: ["begin", "end\u2028"],
18
+ });
19
+ return cached[threadId];
20
+ };
21
+ })();
22
+
23
+ const AgentState = Annotation.Root({
24
+ key_one: Annotation<string>(),
25
+ key_two: Annotation<string>(),
26
+ sleep: Annotation<number>(),
27
+ messages: MessagesAnnotation.spec.messages,
28
+ });
29
+
30
+ async function callModel(
31
+ state: typeof AgentState.State,
32
+ config: LangGraphRunnableConfig
33
+ ): Promise<typeof AgentState.Update> {
34
+ let userId: string | undefined;
35
+
36
+ if (config.configurable?.langgraph_auth_user != null) {
37
+ const user = config.configurable?.langgraph_auth_user as
38
+ | { identity: string }
39
+ | undefined;
40
+
41
+ userId = user?.identity;
42
+ }
43
+
44
+ const model = getStableModel(config.configurable?.thread_id ?? "$");
45
+ const existing = await config.store?.get([userId ?? "ALL"], "key_one");
46
+ if (!existing) {
47
+ const text = state.messages.at(-1)?.content;
48
+ await config.store?.put([userId ?? "ALL"], "key_one", { text });
49
+ }
50
+
51
+ const response = await model.invoke(state.messages);
52
+ const result: typeof AgentState.Update = { messages: [response] };
53
+ return result;
54
+ }
55
+
56
+ async function callTool(
57
+ message: BaseMessage
58
+ ): Promise<typeof AgentState.Update> {
59
+ const response = new ToolMessage(
60
+ `tool_call__${message.content}`,
61
+ "tool_call_id"
62
+ );
63
+ return { messages: [response] };
64
+ }
65
+
66
+ function shouldContinue(state: typeof AgentState.State): typeof END | Send {
67
+ const lastMessage = state.messages.at(-1);
68
+ if ((lastMessage?.content as string).startsWith("end")) return END;
69
+ return new Send("tool", lastMessage);
70
+ }
71
+
72
+ const workflow = new StateGraph(AgentState)
73
+ .addNode("agent", callModel)
74
+ .addNode("tool", callTool)
75
+ .addEdge(START, "agent")
76
+ .addConditionalEdges("agent", shouldContinue)
77
+ .addEdge("tool", "agent");
78
+
79
+ export const graph = workflow.compile();
@@ -0,0 +1,106 @@
1
+ import { Auth, HTTPException } from "@langchain/langgraph-sdk/auth";
2
+ import { JWTPayload, jwtVerify } from "jose";
3
+
4
+ const SECRET_KEY = new TextEncoder().encode(
5
+ "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
6
+ );
7
+ const ALGORITHM = "HS256";
8
+
9
+ const USERS_DB: Record<
10
+ string,
11
+ {
12
+ username: string;
13
+ identity: string;
14
+ full_name: string;
15
+ email: string;
16
+ permissions: string[];
17
+ hashed_password: string;
18
+ disabled: boolean;
19
+ }
20
+ > = {
21
+ johndoe: {
22
+ username: "johndoe",
23
+ identity: "johndoe",
24
+ full_name: "John Doe",
25
+ email: "johndoe@example.com",
26
+ permissions: ["read", "write", "assistants:write", "me"],
27
+ hashed_password:
28
+ "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
29
+ disabled: false,
30
+ },
31
+ alice: {
32
+ username: "alice",
33
+ identity: "alice",
34
+ full_name: "Alice Chains",
35
+ email: "alicechains@example.com",
36
+ permissions: ["read", "write", "assistants:write", "me"],
37
+ hashed_password:
38
+ "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
39
+ disabled: true,
40
+ },
41
+ };
42
+ export const auth = new Auth()
43
+ .authenticate(async (request) => {
44
+ const authorization = request.headers.get("Authorization");
45
+
46
+ const exc = new HTTPException(401, {
47
+ message: "Could not validate credentials",
48
+ headers: { "WWW-Authenticate": "Bearer" },
49
+ });
50
+
51
+ if (!authorization?.toLocaleLowerCase().startsWith("bearer ")) {
52
+ throw exc;
53
+ }
54
+
55
+ let payload: JWTPayload | undefined;
56
+ try {
57
+ const token = authorization.split(" ")[1];
58
+ const result = await jwtVerify(token, SECRET_KEY, {
59
+ algorithms: [ALGORITHM],
60
+ });
61
+ payload = result.payload;
62
+ } catch (error) {
63
+ throw new HTTPException(401, {
64
+ message: "Failed to verify JWT token",
65
+ cause: error,
66
+ });
67
+ }
68
+
69
+ const scopes = (payload["scopes"] ?? []) as string[];
70
+ const username = payload["sub"] as string | undefined;
71
+ const user = username ? USERS_DB[username] : null;
72
+ if (!user) throw exc;
73
+
74
+ let permissions = user.permissions ?? [];
75
+ permissions = scopes.filter((scope) => permissions.includes(scope));
76
+
77
+ return { ...user, permissions };
78
+ })
79
+ .on("*", ({ permissions }) => {
80
+ if (!permissions?.length) {
81
+ throw new HTTPException(403, { message: "Not authorized" });
82
+ }
83
+ })
84
+ .on("assistants:create", ({ value, user, permissions }) => {
85
+ if (!permissions?.includes("assistants:write")) {
86
+ throw new HTTPException(403, { message: "Not authorized" });
87
+ }
88
+
89
+ value.metadata ??= {};
90
+ value.metadata["owner"] = user.identity;
91
+ })
92
+ .on("assistants:search", (params) => ({ owner: params.user.identity }))
93
+ .on(["threads", "assistants"], ({ action, value, user }) => {
94
+ const filters = { owner: user.identity };
95
+ if (action === "create" || action === "update" || action === "create_run") {
96
+ value.metadata ??= {};
97
+ value.metadata["owner"] = user.identity;
98
+ }
99
+ return filters;
100
+ })
101
+ .on("store", ({ value, user }) => {
102
+ const identity = user.identity;
103
+ if (!identity || !value.namespace?.includes(identity)) {
104
+ throw new HTTPException(403, { message: "Not authorized" });
105
+ }
106
+ });
@@ -2,7 +2,9 @@
2
2
  "private": true,
3
3
  "dependencies": {
4
4
  "@langchain/core": "^0.3.40",
5
- "@langchain/langgraph": "^0.2.49"
5
+ "@langchain/langgraph": "^0.2.49",
6
+ "@langchain/langgraph-sdk": "^0.0.66",
7
+ "jose": "^6.0.10"
6
8
  },
7
9
  "devDependencies": {
8
10
  "tailwindcss": "^4.1.1"
@@ -32,10 +32,10 @@
32
32
  dependencies:
33
33
  uuid "^10.0.0"
34
34
 
35
- "@langchain/langgraph-sdk@~0.0.32":
36
- version "0.0.36"
37
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.36.tgz#b375884552ae3f1c7bf68a0248104786754d04cd"
38
- integrity sha512-KkAZM0uXBaMcD/dpGTBppOhbvNX6gz+Y1zFAC898OblegFkSvICrkd0oRQ5Ro/GWK/NAoDymnMUDXeZDdUkSuw==
35
+ "@langchain/langgraph-sdk@^0.0.66", "@langchain/langgraph-sdk@~0.0.32":
36
+ version "0.0.66"
37
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.66.tgz#1a31c3b30d9cffff59910d95c77832e4606b7c3b"
38
+ integrity sha512-l0V4yfKXhHaTRK/1bKMfZ14k3wWZu27DWTlCUnbYJvdo7os5srhONgPCOqQgpazhi5EhXbW2EVgeu/wLW2zH6Q==
39
39
  dependencies:
40
40
  "@types/json-schema" "^7.0.15"
41
41
  p-queue "^6.6.2"
@@ -131,6 +131,11 @@ has-flag@^4.0.0:
131
131
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
132
132
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
133
133
 
134
+ jose@^6.0.10:
135
+ version "6.0.10"
136
+ resolved "https://registry.yarnpkg.com/jose/-/jose-6.0.10.tgz#52d96e1a671b4c02e13b71e0d35abea2e774712b"
137
+ integrity sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==
138
+
134
139
  js-tiktoken@^1.0.12:
135
140
  version "1.0.12"
136
141
  resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211"
@@ -203,15 +203,15 @@
203
203
  zod "^3.22.4"
204
204
  zod-to-json-schema "^3.22.3"
205
205
 
206
- "@langchain/langgraph-api@~0.0.20":
207
- version "0.0.20"
208
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-api/-/langgraph-api-0.0.20.tgz#32e5cfa736ea938d53fa61285bf673901f37e029"
209
- integrity sha512-MZA/6/th0oliK4UJb3SiEWwnMb/HO3sTr73uQxGoRJwjqCKJgYrnXHkU1eunclPcCeG86DanbEf/Rsn7UR4WeA==
206
+ "@langchain/langgraph-api@~0.0.21":
207
+ version "0.0.21"
208
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-api/-/langgraph-api-0.0.21.tgz#95e84d941298e3b6bcaa749d6cdb030d9bdaa5a3"
209
+ integrity sha512-vQLxvYf3opVBdg5ZosObfwqJgfpLu729+Fz2sq9k+8tIMI0XKFnQw+UKTKyQYOUnsyDjRfZFr64AX2vRkWgF1w==
210
210
  dependencies:
211
211
  "@babel/code-frame" "^7.26.2"
212
212
  "@hono/node-server" "^1.12.0"
213
213
  "@hono/zod-validator" "^0.2.2"
214
- "@langchain/langgraph-ui" "0.0.20"
214
+ "@langchain/langgraph-ui" "0.0.21"
215
215
  "@types/json-schema" "^7.0.15"
216
216
  "@typescript/vfs" "^1.6.0"
217
217
  dedent "^1.5.3"
@@ -242,30 +242,20 @@
242
242
  dependencies:
243
243
  uuid "^10.0.0"
244
244
 
245
- "@langchain/langgraph-sdk@^0.0.60":
246
- version "0.0.60"
247
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.60.tgz#eee259632f362298b23712ccf393903daf8affc9"
248
- integrity sha512-7ndeAdw1afVY72HpKEGw7AyuDlD7U3e4jxaJflxA+PXaFPiE0d/hQYvlPT84YmvqNzJN605hv7YcrOju2573bQ==
245
+ "@langchain/langgraph-sdk@^0.0.66", "@langchain/langgraph-sdk@~0.0.32":
246
+ version "0.0.66"
247
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.66.tgz#1a31c3b30d9cffff59910d95c77832e4606b7c3b"
248
+ integrity sha512-l0V4yfKXhHaTRK/1bKMfZ14k3wWZu27DWTlCUnbYJvdo7os5srhONgPCOqQgpazhi5EhXbW2EVgeu/wLW2zH6Q==
249
249
  dependencies:
250
250
  "@types/json-schema" "^7.0.15"
251
251
  p-queue "^6.6.2"
252
252
  p-retry "4"
253
253
  uuid "^9.0.0"
254
254
 
255
- "@langchain/langgraph-sdk@~0.0.32":
256
- version "0.0.36"
257
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.36.tgz#b375884552ae3f1c7bf68a0248104786754d04cd"
258
- integrity sha512-KkAZM0uXBaMcD/dpGTBppOhbvNX6gz+Y1zFAC898OblegFkSvICrkd0oRQ5Ro/GWK/NAoDymnMUDXeZDdUkSuw==
259
- dependencies:
260
- "@types/json-schema" "^7.0.15"
261
- p-queue "^6.6.2"
262
- p-retry "4"
263
- uuid "^9.0.0"
264
-
265
- "@langchain/langgraph-ui@0.0.20", "@langchain/langgraph-ui@~0.0.20":
266
- version "0.0.20"
267
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-ui/-/langgraph-ui-0.0.20.tgz#9075acef91c287cfafa81d4eef34a6a51ba1a4d1"
268
- integrity sha512-x6fF6STKx0gsCAtEqEwyIib6klwLboqvpXsobHVeFOx6qGqOGsVKbq6rgCIKxQz8tZeSQVXslas4/20SFUjwKA==
255
+ "@langchain/langgraph-ui@0.0.21", "@langchain/langgraph-ui@~0.0.21":
256
+ version "0.0.21"
257
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-ui/-/langgraph-ui-0.0.21.tgz#522c87f602954b8bcb75f63b983ec2de18c14b3f"
258
+ integrity sha512-9XauIpo6KkztOmp4ayR+2gzCPHsGIZJl2x5EwPwCnipzsLo0zbm6Frc8fLZyZtaZrU3sIhVpguLB8ORYPKsB3g==
269
259
  dependencies:
270
260
  "@commander-js/extra-typings" "^13.0.0"
271
261
  commander "^13.0.0"
@@ -1034,6 +1024,11 @@ jiti@^2.4.2:
1034
1024
  resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
1035
1025
  integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
1036
1026
 
1027
+ jose@^6.0.10:
1028
+ version "6.0.10"
1029
+ resolved "https://registry.yarnpkg.com/jose/-/jose-6.0.10.tgz#52d96e1a671b4c02e13b71e0d35abea2e774712b"
1030
+ integrity sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==
1031
+
1037
1032
  js-tiktoken@^1.0.12:
1038
1033
  version "1.0.15"
1039
1034
  resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.15.tgz#92a7d829f6950c2cfb35cc52555502e3d6e2ebac"
langgraph_api/metadata.py CHANGED
@@ -11,7 +11,10 @@ from langgraph_api.config import (
11
11
  LANGSMITH_API_KEY,
12
12
  LANGSMITH_AUTH_ENDPOINT,
13
13
  USES_CUSTOM_APP,
14
+ USES_CUSTOM_AUTH,
14
15
  USES_INDEXING,
16
+ USES_STORE_TTL,
17
+ USES_THREAD_TTL,
15
18
  )
16
19
  from langgraph_api.http import http_request
17
20
  from langgraph_license.validation import plus_features_enabled
@@ -95,8 +98,12 @@ async def metadata_loop() -> None:
95
98
  "langgraph.platform.variant": VARIANT,
96
99
  "langgraph.platform.host": HOST,
97
100
  "langgraph.platform.plan": PLAN,
101
+ # user app features
98
102
  "user_app.uses_indexing": USES_INDEXING,
99
103
  "user_app.uses_custom_app": USES_CUSTOM_APP,
104
+ "user_app.uses_custom_auth": USES_CUSTOM_AUTH,
105
+ "user_app.uses_thread_ttl": USES_THREAD_TTL,
106
+ "user_app.uses_store_ttl": USES_STORE_TTL,
100
107
  },
101
108
  "measures": {
102
109
  "langgraph.platform.runs": runs,
@@ -23,7 +23,7 @@ from langgraph_api.schema import (
23
23
  StreamMode,
24
24
  )
25
25
  from langgraph_api.utils import AsyncConnectionProto, get_auth_ctx
26
- from langgraph_storage.ops import Runs, logger
26
+ from langgraph_runtime.ops import Runs, logger
27
27
 
28
28
 
29
29
  class RunCreateDict(TypedDict):
@@ -177,6 +177,15 @@ async def create_valid_run(
177
177
  payload,
178
178
  run_id=run_id,
179
179
  )
180
+ if (
181
+ thread_id is None
182
+ and (command := payload.get("command"))
183
+ and command.get("resume")
184
+ ):
185
+ raise HTTPException(
186
+ status_code=400,
187
+ detail="You must provide a thread_id when resuming.",
188
+ )
180
189
  temporary = thread_id is None and payload.get("on_completion", "delete") == "delete"
181
190
  stream_mode, multitask_strategy, prevent_insert_if_inflight = assign_defaults(
182
191
  payload
@@ -8,7 +8,7 @@ import pathlib
8
8
  import structlog
9
9
  import uvloop
10
10
 
11
- from langgraph_api.lifespan import lifespan
11
+ from langgraph_runtime.lifespan import lifespan
12
12
 
13
13
  logger = structlog.stdlib.get_logger(__name__)
14
14
 
langgraph_api/server.py CHANGED
@@ -22,12 +22,12 @@ from langgraph_api.errors import (
22
22
  validation_error_handler,
23
23
  value_error_handler,
24
24
  )
25
- from langgraph_api.lifespan import lifespan
25
+ from langgraph_runtime.lifespan import lifespan
26
26
  from langgraph_api.middleware.http_logger import AccessLoggerMiddleware
27
27
  from langgraph_api.middleware.private_network import PrivateNetworkMiddleware
28
28
  from langgraph_api.utils import SchemaGenerator
29
29
  from langgraph_license.middleware import LicenseValidationMiddleware
30
- from langgraph_storage.retry import OVERLOADED_EXCEPTIONS
30
+ from langgraph_runtime.retry import OVERLOADED_EXCEPTIONS
31
31
  from langgraph_sdk.client import configure_loopback_transports
32
32
 
33
33
  logging.captureWarnings(True)
langgraph_api/stream.py CHANGED
@@ -30,9 +30,9 @@ from langgraph_api.metadata import HOST, PLAN, USER_API_URL, incr_nodes
30
30
  from langgraph_api.schema import Run, StreamMode
31
31
  from langgraph_api.serde import json_dumpb
32
32
  from langgraph_api.utils import AsyncConnectionProto
33
- from langgraph_storage.checkpoint import Checkpointer
34
- from langgraph_storage.ops import Runs
35
- from langgraph_storage.store import Store
33
+ from langgraph_runtime.checkpoint import Checkpointer
34
+ from langgraph_runtime.ops import Runs
35
+ from langgraph_runtime.store import Store
36
36
 
37
37
  logger = structlog.stdlib.get_logger(__name__)
38
38
 
@@ -260,12 +260,13 @@ async def consume(stream: AnyStream, run_id: str) -> None:
260
260
  run_id, mode, await run_in_executor(None, json_dumpb, payload)
261
261
  )
262
262
  except Exception as e:
263
+ g = e
263
264
  if isinstance(e, ExceptionGroup):
264
265
  e = e.exceptions[0]
265
266
  await Runs.Stream.publish(
266
267
  run_id, "error", await run_in_executor(None, json_dumpb, e)
267
268
  )
268
- raise e from None
269
+ raise e from g
269
270
 
270
271
 
271
272
  def get_feedback_urls(run_id: str, feedback_keys: list[str]) -> dict[str, str]:
@@ -5,7 +5,7 @@ import asyncio
5
5
  import structlog
6
6
 
7
7
  from langgraph_api.config import THREAD_TTL
8
- from langgraph_storage.database import connect
8
+ from langgraph_runtime.database import connect
9
9
 
10
10
  logger = structlog.stdlib.get_logger(__name__)
11
11
 
@@ -30,7 +30,7 @@ async def thread_ttl_sweep_loop():
30
30
  interval_minutes=sweep_interval_minutes,
31
31
  )
32
32
 
33
- from langgraph_storage.ops import Threads
33
+ from langgraph_runtime.ops import Threads
34
34
 
35
35
  while True:
36
36
  await asyncio.sleep(sweep_interval_minutes * 60)
langgraph_api/worker.py CHANGED
@@ -26,20 +26,15 @@ from langgraph_api.stream import (
26
26
  consume,
27
27
  )
28
28
  from langgraph_api.utils import set_auth_ctx, with_user
29
- from langgraph_storage.database import connect
30
- from langgraph_storage.ops import Runs, Threads
31
- from langgraph_storage.retry import RETRIABLE_EXCEPTIONS
29
+ from langgraph_runtime.database import connect
30
+ from langgraph_runtime.ops import Runs, Threads
31
+ from langgraph_runtime.retry import RETRIABLE_EXCEPTIONS
32
32
 
33
33
  try:
34
34
  from psycopg.errors import InFailedSqlTransaction
35
35
  except ImportError:
36
36
  InFailedSqlTransaction = ()
37
37
 
38
- try:
39
- from blockbuster import BlockingError
40
- except ImportError:
41
- BlockingError = ()
42
-
43
38
  logger = structlog.stdlib.get_logger(__name__)
44
39
 
45
40
 
@@ -247,23 +242,6 @@ async def worker(
247
242
  await Runs.set_status(conn, run_id, "pending")
248
243
  raise
249
244
  except Exception as exc:
250
- if isinstance(exc, BlockingError):
251
- # Only occurs in the dev server
252
- exc.add_note(
253
- "Heads up! LangGraph identified a synchronous blocking call in your code. "
254
- "When running in an ASGI web server, blocking calls can degrade performance for everyone since they tie up the event loop.\n\n"
255
- "Here are your options to fix this:\n\n"
256
- "1. Best approach: Convert any blocking code to use async/await patterns\n"
257
- " For example, use 'await aiohttp.get()' instead of 'requests.get()'\n\n"
258
- "2. Quick fix: Move blocking operations to a separate thread\n"
259
- " Example: 'await asyncio.to_thread(your_blocking_function)'\n\n"
260
- "3. Override (if you can't change the code):\n"
261
- " - For development: Run 'langgraph dev --allow-blocking'\n"
262
- " - For deployment: Set 'BG_JOB_ISOLATED_LOOPS=true' environment variable\n\n"
263
- "These blocking operations can prevent health checks and slow down other runs in your deployment. "
264
- "Following these recommendations will help keep your LangGraph application running smoothly!"
265
- )
266
-
267
245
  exception = exc
268
246
  status = "error"
269
247
  run_ended_at = datetime.now(UTC).isoformat()
@@ -296,6 +274,7 @@ async def worker(
296
274
  # Note we don't handle asyncio.CancelledError here, as we want to
297
275
  # let it bubble up and rollback db transaction, thus marking the run
298
276
  # as available to be picked up by another worker
277
+
299
278
  return {
300
279
  "checkpoint": checkpoint,
301
280
  "status": status,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: langgraph-api
3
- Version: 0.0.48
3
+ Version: 0.1.2
4
4
  Summary:
5
5
  License: Elastic-2.0
6
6
  Author: Nuno Campos
@@ -11,7 +11,6 @@ Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
- Requires-Dist: blockbuster (>=1.5.24,<2.0.0)
15
14
  Requires-Dist: cloudpickle (>=3.0.0,<4.0.0)
16
15
  Requires-Dist: cryptography (>=42.0.0,<45.0)
17
16
  Requires-Dist: httpx (>=0.25.0)
@@ -1,105 +1,103 @@
1
1
  LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
2
- langgraph_api/__init__.py,sha256=WvtDrm5o4jAYjOF-kumI_Il7bjdj2Nr-QuEWD_sgdXQ,23
3
- langgraph_api/api/__init__.py,sha256=qNcg8QJydef0gM-vYJlxITMRZw-9r1vw8zqm2raqqYE,5493
4
- langgraph_api/api/assistants.py,sha256=WwaBtx1MpGn9gdJ8P9fkorJHMVrJKHt1nvtw0OCZcdw,14353
2
+ langgraph_api/__init__.py,sha256=rnObPjuBcEStqSO0S6gsdS_ot8ITOQjVj_-P1LUUYpg,22
3
+ langgraph_api/api/__init__.py,sha256=ohkuKTIYaWMAnr2pck2XAMrg4srA418VM76GQWRf5tU,5493
4
+ langgraph_api/api/assistants.py,sha256=i-nxkScUB2g8bTVGtQIp1psABXlaY1aVx9pkB_UiRH8,14353
5
5
  langgraph_api/api/mcp.py,sha256=KbR19dtFCpJEiKYj3IfepAuJij8YZVELuVp7JY_yu_o,13754
6
- langgraph_api/api/meta.py,sha256=ifJ_Ki0Qf2DYbmY6OKlqKhLGxbt55gm0lEqH1A0cJbw,2790
6
+ langgraph_api/api/meta.py,sha256=M1JHcuZGEn8E-ZpuEbNBJ6SoAwZBCcPOq0NRHMCplR8,2713
7
7
  langgraph_api/api/openapi.py,sha256=f9gfmWN2AMKNUpLCpSgZuw_aeOF9jCXPdOtFT5PaTWM,10960
8
- langgraph_api/api/runs.py,sha256=qAXfgZjjaMBfwPnlnAogvemtKZZeshNSIMQqcW20tGs,18010
9
- langgraph_api/api/store.py,sha256=XNNZFRlvgReidq9u7mg-i7pjwz21BdP9Qw3Jr5Ra9Fk,5447
10
- langgraph_api/api/threads.py,sha256=QbAy7MRupWKDUhmC6_LKU2ExJbLJ6Z-CJG2gSpcMXtc,9163
8
+ langgraph_api/api/runs.py,sha256=dhHZ3xu7V0anftqzXaOYnhVEryJpVeqzu60MFiUw4u8,18010
9
+ langgraph_api/api/store.py,sha256=G4Fm8hgFLlJUW5_ekLS_IOgCfpFy-TK9uq5r9QTOELQ,5447
10
+ langgraph_api/api/threads.py,sha256=EvKJDnZDWutKoB5KoTP40NPEqG5LJ-Iw97TLYHkhLbw,9163
11
11
  langgraph_api/api/ui.py,sha256=kdCQ-p0voxAqIFc72aqqzdPGH2v-yEBKzjRE6cUPvpU,2201
12
12
  langgraph_api/asyncio.py,sha256=h0eZ7aoDGnJpoxnHLZABVlj1jQ78UxjgiHntTmAEWek,8613
13
13
  langgraph_api/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- langgraph_api/auth/custom.py,sha256=sPYkF-xTdGIn_WMSE2tfR_azg_azzXPRWwUfCye6GQ8,21401
14
+ langgraph_api/auth/custom.py,sha256=QR49PnIfPPQZ6ygWmnMkSuAzgOpBBUbbz5kJ2yVwGmQ,21934
15
15
  langgraph_api/auth/langsmith/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  langgraph_api/auth/langsmith/backend.py,sha256=InScaL-HYCnxYEauhxU198gRZV9pJn9SzzBoR9Edn7g,2654
17
17
  langgraph_api/auth/langsmith/client.py,sha256=eKchvAom7hdkUXauD8vHNceBDDUijrFgdTV8bKd7x4Q,3998
18
18
  langgraph_api/auth/middleware.py,sha256=jU8aDSIZHdzCGdifejRF7ndHkSjBtqIHcBwFIuUdHEA,1875
19
19
  langgraph_api/auth/noop.py,sha256=Bk6Nf3p8D_iMVy_OyfPlyiJp_aEwzL-sHrbxoXpCbac,586
20
20
  langgraph_api/auth/studio_user.py,sha256=FzFQRROKDlA9JjtBuwyZvk6Mbwno5M9RVYjDO6FU3F8,186
21
- langgraph_api/cli.py,sha256=W8rf3v4rMwv9W-tK_9yqcc7waQezMMlpBoy64WSGLMw,12682
21
+ langgraph_api/cli.py,sha256=eVX8zGeQAoVMotib2s-QhIQWQX1JInpVMItkTTgG_dU,12833
22
22
  langgraph_api/command.py,sha256=3O9v3i0OPa96ARyJ_oJbLXkfO8rPgDhLCswgO9koTFA,768
23
- langgraph_api/config.py,sha256=OJ6_9UCkPYNpUEB17EIU1nO0zQd3_T3G1Dr-ag0J8hE,10218
24
- langgraph_api/cron_scheduler.py,sha256=9yzbbGxzNgJdIg4ZT7yu2oTwT_wRuPxD1c2sbbd52xs,2630
23
+ langgraph_api/config.py,sha256=ZxVQitVzc9Rp9_j3myjW_NcSJ463kUAMmbxmmOS-tXY,10357
24
+ langgraph_api/cron_scheduler.py,sha256=i87j4pJrcsmsqMKeKUs69gaAjrGaSM3pM3jnXdN5JDQ,2630
25
25
  langgraph_api/errors.py,sha256=Bu_i5drgNTyJcLiyrwVE_6-XrSU50BHf9TDpttki9wQ,1690
26
- langgraph_api/graph.py,sha256=v7qj60MBQKfEx_0kmw9AsPygCQsOLmrJ1MkVkt4-GiM,21086
26
+ langgraph_api/graph.py,sha256=GZtVXyP1l-nKlcRmB9s_m0U9UnifPUzIBBjDXmT11oo,20959
27
27
  langgraph_api/http.py,sha256=gYbxxjY8aLnsXeJymcJ7G7Nj_yToOGpPYQqmZ1_ggfA,5240
28
28
  langgraph_api/js/.gitignore,sha256=l5yI6G_V6F1600I1IjiUKn87f4uYIrBAYU1MOyBBhg4,59
29
- langgraph_api/js/base.py,sha256=xkBp5bwRrbpMFaAMViEU-qIlnsJuu3X_G8sa1pqNZK0,227
30
- langgraph_api/js/build.mts,sha256=oyP1GTnWAWl_dC4ny-h_9WxvWfZ8eJihGdrVdmMe81k,1834
31
- langgraph_api/js/client.mts,sha256=GJv846jWBRL0W_Yr6XtDu3UdYjdpndQ2v6dOfAhJXi0,26953
29
+ langgraph_api/js/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ langgraph_api/js/base.py,sha256=udYS5_OmmJI_d7kEUv0H4FINprZOW6tdXRkKDEdzNvc,469
31
+ langgraph_api/js/build.mts,sha256=4xcjo9rufSPUnnihdYp1EnDPSoaDQDV6aN8_UMjKp-g,1916
32
+ langgraph_api/js/client.mts,sha256=7v5BcWsR5w6wGCsxhm6xryBgI-5vfu2Or1YmT-GdKyY,28766
32
33
  langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
33
- langgraph_api/js/global.d.ts,sha256=yDusqAyzVYhxfwqqcERUzucu2Pw9ma3-ug4DFyUvQfs,167
34
- langgraph_api/js/package.json,sha256=oNcWe7UIoJtqzoIVr47px6-1n8KziqwEhyi4wBpzTQ0,1266
35
- langgraph_api/js/remote.py,sha256=dDrxJhe9Nm1OQREoa811GeXHygiBHTtHjvEVglOGfto,24808
34
+ langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
35
+ langgraph_api/js/package.json,sha256=7lAok4cUtnfbE2E2P1FQDZgwmsZSQSl5O6eDoh1va-I,1289
36
+ langgraph_api/js/remote.py,sha256=OHxjncX1AAahUurlntkcgMYl852XgT19OxJeuvfEFsc,27959
36
37
  langgraph_api/js/schema.py,sha256=7idnv7URlYUdSNMBXQcw7E4SxaPxCq_Oxwnlml8q5ik,408
37
- langgraph_api/js/src/graph.mts,sha256=otgztTNzNJpeF2IOrpNuuwbSbpAy4eFE5dHtUd7eQwU,3742
38
+ langgraph_api/js/src/graph.mts,sha256=g86jOvbHj1B0o1jatBc2X5_JEZW2DSNwgUJ_kw1k8Cw,3569
38
39
  langgraph_api/js/src/hooks.mjs,sha256=XtktgmIHlls_DsknAuwib-z7TqCm0haRoTXvnkgzMuo,601
39
40
  langgraph_api/js/src/parser/parser.mts,sha256=c7WLEtMMwtVzir9O8VpJFVHKuLjtI86rde-In2lvaM0,13217
40
41
  langgraph_api/js/src/parser/parser.worker.mjs,sha256=2K6D0GlUmkk7LE39I8mryB8VZVE3-N9Cblji-ArPhFo,386
41
42
  langgraph_api/js/src/schema/types.mts,sha256=SRCYZTWjxyc7528DaapR_DCm3G5bfDSh4vf-JsYpk0w,62633
42
43
  langgraph_api/js/src/schema/types.template.mts,sha256=Dbjj_8d-OubqH4QY_OaxSu8ocZ4dVjI94oncL20fqtk,2235
44
+ langgraph_api/js/src/utils/files.mts,sha256=MXC-3gy0pkS82AjPBoUN83jY_qg37WSAPHOA7DwfB4M,141
43
45
  langgraph_api/js/src/utils/importMap.mts,sha256=pX4TGOyUpuuWF82kXcxcv3-8mgusRezOGe6Uklm2O5A,1644
44
46
  langgraph_api/js/src/utils/pythonSchemas.mts,sha256=98IW7Z_VP7L_CHNRMb3_MsiV3BgLE2JsWQY_PQcRR3o,685
45
47
  langgraph_api/js/src/utils/serde.mts,sha256=OuyyO9btvwWd55rU_H4x91dFEJiaPxL-lL9O6Zgo908,742
46
48
  langgraph_api/js/sse.py,sha256=lsfp4nyJyA1COmlKG9e2gJnTttf_HGCB5wyH8OZBER8,4105
47
- langgraph_api/js/tests/api.test.mts,sha256=cu2d5De-QsQUH9-e1vjxDOcUfPRV3bRKWuymAAOZeXk,62845
49
+ langgraph_api/js/tests/api.test.mts,sha256=DLuwYcLp8EwSEi27WP-Uc92og23OZldJxG0Wc5rXsNY,62951
50
+ langgraph_api/js/tests/auth.test.mts,sha256=A8JXfEep6S4jzduoSZeRQkqq9WsFbVE8Bvi3Hj_zx2w,21600
51
+ langgraph_api/js/tests/compose-postgres.auth.yml,sha256=iPfJbCeYZdV6GiRLiDn_f7qgpG4TyyGaQ4lV-ZXr6Qk,1768
48
52
  langgraph_api/js/tests/compose-postgres.yml,sha256=yz99nUy4Gm8vXuE5cnp2ekPzv7x5XWdwFPB9muAqeGE,1861
49
53
  langgraph_api/js/tests/graphs/.gitignore,sha256=26J8MarZNXh7snXD5eTpV3CPFTht5Znv8dtHYCLNfkw,12
50
54
  langgraph_api/js/tests/graphs/agent.css,sha256=QgcOC0W7IBsrg4pSqqpull-WTgtULZfx_lF_5ZxLdag,23
51
55
  langgraph_api/js/tests/graphs/agent.mts,sha256=E9WMv0alMv0njUEECqEsqoRk9NXJUgXW7SyQJ3GOZ8k,5396
52
56
  langgraph_api/js/tests/graphs/agent.ui.tsx,sha256=JDFJdpdIS6rglkXTaROSb1Is0j1kt5wN9ML8W4cuht8,175
57
+ langgraph_api/js/tests/graphs/agent_simple.mts,sha256=Ge7jzkV-DsSmJM9RBFrfMIONCtvU-_Ci2PqS9GaYf6w,2231
58
+ langgraph_api/js/tests/graphs/auth.mts,sha256=kF2TZP3n_urWigf0qgejZqTe93-341_Mhqe_qnBO_Io,3195
53
59
  langgraph_api/js/tests/graphs/command.mts,sha256=YO1_cEs_n9VsH_-IediLnI4Yc8KRlp4qrprUZXpAlwM,1163
54
60
  langgraph_api/js/tests/graphs/delay.mts,sha256=CFneKxqI4bGGK0lYjSbe80QirowPQlsRSuhDUKfydhk,703
55
61
  langgraph_api/js/tests/graphs/dynamic.mts,sha256=Wf_-keF7lkEfp_iyI45nlFGCeU8ARLQ8axc0LXh7TyE,659
56
62
  langgraph_api/js/tests/graphs/error.mts,sha256=l4tk89449dj1BnEF_0ZcfPt0Ikk1gl8L1RaSnRfr3xo,487
57
63
  langgraph_api/js/tests/graphs/langgraph.json,sha256=h6hV1wkNEUIpLBX9JOUKqtIBvbhvzyLEuWtBIHteseg,265
58
64
  langgraph_api/js/tests/graphs/nested.mts,sha256=4G7jSOSaFVQAza-_ARbK-Iai1biLlF2DIPDZXf7PLIY,1245
59
- langgraph_api/js/tests/graphs/package.json,sha256=SSYv9rN8XLeCKnVctKKwnksvy0RMh-Z9pC0j1lG17PM,174
65
+ langgraph_api/js/tests/graphs/package.json,sha256=xVclKB1ofQDeTocnu8gvxghPZg2llsIOcn47RuuIOHs,240
60
66
  langgraph_api/js/tests/graphs/weather.mts,sha256=A7mLK3xW8h5B-ZyJNAyX2M2fJJwzPJzXs4DYesJwreQ,1655
61
- langgraph_api/js/tests/graphs/yarn.lock,sha256=PWHTM2Wg9mdiovQBC7yMXfb382ffGux8z7hoQE6oWAQ,10673
67
+ langgraph_api/js/tests/graphs/yarn.lock,sha256=JP_za1t56zCne5O8QOc-kLrGrUDwSnBZ25F8tVObUuU,10957
62
68
  langgraph_api/js/tests/parser.test.mts,sha256=dEC8KTqKygeb1u39ZvpPqCT4HtfPD947nLmITt2buxA,27883
63
69
  langgraph_api/js/tests/utils.mts,sha256=q1V9gvT63v95onlfK9W4iv3n9ZJO3h-0RD9TdDYuRyY,439
64
70
  langgraph_api/js/ui.py,sha256=XNT8iBcyT8XmbIqSQUWd-j_00HsaWB2vRTVabwFBkik,2439
65
- langgraph_api/js/yarn.lock,sha256=m4erGgHd30Enxdu1wKnohnzotZiEDvXh-H83qitf_W4,83812
66
- langgraph_api/lifespan.py,sha256=SfVZj0SQdsIfYwvN5s4dfxGMb7MMlGe40DghCGDFaTQ,2915
71
+ langgraph_api/js/yarn.lock,sha256=A4b9TS9cljYvyc-7RF9QY0zcP_NFJMe2-RVeTSlX2DY,83691
67
72
  langgraph_api/logging.py,sha256=JJIzbNIgLCN6ClQ3tA-Mm5ffuBGvpRDSZsEvnIlsuu4,3693
68
- langgraph_api/metadata.py,sha256=bAeN3NwibBuXUVPjOEbEUJMnhUXe_VdTGw508VNeav4,3655
73
+ langgraph_api/metadata.py,sha256=iM_3qaxFk1ItB4E5VaVb4n_mbqXzqZFMknVcHXnV0mI,3937
69
74
  langgraph_api/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
75
  langgraph_api/middleware/http_logger.py,sha256=aj4mdisRobFePkD3Iy6-w_Mujwx4TQRaEhPvSd6HgLk,3284
71
76
  langgraph_api/middleware/private_network.py,sha256=eYgdyU8AzU2XJu362i1L8aSFoQRiV7_aLBPw7_EgeqI,2111
72
77
  langgraph_api/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- langgraph_api/models/run.py,sha256=85-pyyvosFAot8WrWl2QjCje-2c4lhattYvoAEMqztA,11000
78
+ langgraph_api/models/run.py,sha256=6zl3t1_LAr5v2AIcrFSWDG5rLvqREeswXJymuGx6AT8,11258
74
79
  langgraph_api/patch.py,sha256=Dgs0PXHytekX4SUL6KsjjN0hHcOtGLvv1GRGbh6PswU,1408
75
- langgraph_api/queue_entrypoint.py,sha256=4xICUxXarNV8DhnaqAMhVi3xCmyVKCL3J5NzHxPA9Xc,1835
80
+ langgraph_api/queue_entrypoint.py,sha256=gjtajZfnDXhsi7JElfmkY-p0ENBiKBDJ4Ugiw-exapw,1839
76
81
  langgraph_api/route.py,sha256=fM4qYCGbmH0a3_cV8uKocb1sLklehxO6HhdRXqLK6OM,4421
77
82
  langgraph_api/schema.py,sha256=Frh_YOC3S1cDAMPUVanNi78ooSXK2WFpu9YkIVz5h14,5433
78
83
  langgraph_api/serde.py,sha256=D5t_HeABMYKRAsoXWaWG0IsdaYM8yOXIez2wJUTIgT8,3963
79
- langgraph_api/server.py,sha256=bnXOOYztQmqR-QVpEFoRWB5Fzd33PuEIlwBK2R7W8NE,4849
84
+ langgraph_api/server.py,sha256=Chjk-TddIVKqYqulRJb7AGYW6GZS3aU3T8ApNS7azGA,4853
80
85
  langgraph_api/sse.py,sha256=2wNodCOP2eg7a9mpSu0S3FQ0CHk2BBV_vv0UtIgJIcc,4034
81
86
  langgraph_api/state.py,sha256=8jx4IoTCOjTJuwzuXJKKFwo1VseHjNnw_CCq4x1SW14,2284
82
- langgraph_api/stream.py,sha256=lhjnom-T8GbquUZry-KSkajnqYjElaIERhPiXPtpw1E,11354
83
- langgraph_api/thread_ttl.py,sha256=QS9C7cx63KBh82_I6DqOb42-5mLTqTvneL8FJeX3aqU,1765
87
+ langgraph_api/stream.py,sha256=SN96CLJ5QnSQ2YWRrkQb4K8XkdoSbloyFRj8N1vKcs8,11369
88
+ langgraph_api/thread_ttl.py,sha256=4vch4nu1UOiYcqYRd7bTHsfs0Ei_lXuy9nBQ0uVJLyo,1765
84
89
  langgraph_api/utils.py,sha256=92mSti9GfGdMRRWyESKQW5yV-75Z9icGHnIrBYvdypU,3619
85
90
  langgraph_api/validation.py,sha256=Qo3EkSRXzIRe3GRuqRWbElTcUXRMXMyA1w0VbMvdwME,4934
86
91
  langgraph_api/webhook.py,sha256=1ncwO0rIZcj-Df9sxSnFEzd1gP1bfS4okeZQS8NSRoE,1382
87
- langgraph_api/worker.py,sha256=CLmohk3B03OTsKHq_ZPhujMHFSuc694qeEL4VNSxHvg,12679
92
+ langgraph_api/worker.py,sha256=DX_EZZs47cfb4_1owBkjiq-Mrr2vUoeGjotWvKY21uc,11290
88
93
  langgraph_license/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
94
  langgraph_license/middleware.py,sha256=_ODIYzQkymr6W9_Fp9wtf1kAQspnpsmr53xuzyF2GA0,612
90
95
  langgraph_license/validation.py,sha256=Uu_G8UGO_WTlLsBEY0gTVWjRR4czYGfw5YAD3HLZoj0,203
91
- langgraph_storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- langgraph_storage/checkpoint.py,sha256=Qq0y6vdh27qdF3h5nOLT5CcX9Rj2bcFqkVOMeCaGoK4,4036
93
- langgraph_storage/database.py,sha256=sZjZvMcvbr_6dX0d1YrYEccVuQozIfkiWt8bdlXGVYU,5849
94
- langgraph_storage/inmem_stream.py,sha256=LjJSAxsh_E0ywqEMzdWJk8Hy_Jn9oQByzycss-fANng,3264
95
- langgraph_storage/ops.py,sha256=ksJPrjdFRXRGYffrdLvk06Ec-OT1E_Q6qB1_rbdF0w8,75800
96
- langgraph_storage/queue.py,sha256=IGjzCzYaGhbR9_Y37p1Hbd5uQkN9_IGzYkT_5lcPU54,7595
97
- langgraph_storage/retry.py,sha256=XmldOP4e_H5s264CagJRVnQMDFcEJR_dldVR1Hm5XvM,763
98
- langgraph_storage/store.py,sha256=JB9jZ87GE19MVN9wgl3-esgR2eIkeipws9q6qsPWkgc,3399
96
+ langgraph_runtime/__init__.py,sha256=3stEi5ECApK7l0Y7q4vN-fQQz8cgJ9lyqAyhqDBqags,1075
99
97
  logging.json,sha256=3RNjSADZmDq38eHePMm1CbP6qZ71AmpBtLwCmKU9Zgo,379
100
98
  openapi.json,sha256=YW4ND-N3adriEoNwxw7UD9endO2xUZoodCtwVIfa2dU,132261
101
- langgraph_api-0.0.48.dist-info/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
102
- langgraph_api-0.0.48.dist-info/METADATA,sha256=0Bi2FktyQZbXA3aE3Q1YDCmaGh0Vwiswtk_x1xSUtz0,4165
103
- langgraph_api-0.0.48.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
104
- langgraph_api-0.0.48.dist-info/entry_points.txt,sha256=3EYLgj89DfzqJHHYGxPH4A_fEtClvlRbWRUHaXO7hj4,77
105
- langgraph_api-0.0.48.dist-info/RECORD,,
99
+ langgraph_api-0.1.2.dist-info/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
100
+ langgraph_api-0.1.2.dist-info/METADATA,sha256=AXwaqScw3Ar7ugD1VPcHsz1QZ-Aa7HuCGY2fsWe5Aho,4119
101
+ langgraph_api-0.1.2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
102
+ langgraph_api-0.1.2.dist-info/entry_points.txt,sha256=3EYLgj89DfzqJHHYGxPH4A_fEtClvlRbWRUHaXO7hj4,77
103
+ langgraph_api-0.1.2.dist-info/RECORD,,