langgraph-api 0.0.45__tar.gz → 0.0.46__tar.gz

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 (103) hide show
  1. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/PKG-INFO +3 -3
  2. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/ui.py +19 -14
  3. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/cli.py +9 -0
  4. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/config.py +3 -0
  5. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/graph.py +1 -1
  6. langgraph_api-0.0.46/langgraph_api/js/build.mts +68 -0
  7. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/package.json +2 -1
  8. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/api.test.mts +94 -74
  9. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/compose-postgres.yml +1 -0
  10. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/package.json +3 -0
  11. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/yarn.lock +5 -0
  12. langgraph_api-0.0.46/langgraph_api/js/ui.py +93 -0
  13. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/yarn.lock +26 -6
  14. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/lifespan.py +3 -0
  15. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/pyproject.toml +3 -3
  16. langgraph_api-0.0.45/langgraph_api/js/build.mts +0 -105
  17. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/LICENSE +0 -0
  18. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/README.md +0 -0
  19. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/__init__.py +0 -0
  20. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/__init__.py +0 -0
  21. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/assistants.py +0 -0
  22. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/mcp.py +0 -0
  23. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/meta.py +0 -0
  24. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/openapi.py +0 -0
  25. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/runs.py +0 -0
  26. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/store.py +0 -0
  27. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/api/threads.py +0 -0
  28. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/asyncio.py +0 -0
  29. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/__init__.py +0 -0
  30. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/custom.py +0 -0
  31. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/langsmith/__init__.py +0 -0
  32. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/langsmith/backend.py +0 -0
  33. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/langsmith/client.py +0 -0
  34. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/middleware.py +0 -0
  35. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/noop.py +0 -0
  36. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/auth/studio_user.py +0 -0
  37. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/command.py +0 -0
  38. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/cron_scheduler.py +0 -0
  39. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/errors.py +0 -0
  40. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/http.py +0 -0
  41. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/.gitignore +0 -0
  42. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/base.py +0 -0
  43. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/client.mts +0 -0
  44. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/errors.py +0 -0
  45. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/global.d.ts +0 -0
  46. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/remote.py +0 -0
  47. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/schema.py +0 -0
  48. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/graph.mts +0 -0
  49. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/hooks.mjs +0 -0
  50. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/parser/parser.mts +0 -0
  51. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/parser/parser.worker.mjs +0 -0
  52. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/schema/types.mts +0 -0
  53. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/schema/types.template.mts +0 -0
  54. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/utils/importMap.mts +0 -0
  55. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  56. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/src/utils/serde.mts +0 -0
  57. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/sse.py +0 -0
  58. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/.gitignore +0 -0
  59. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/agent.css +0 -0
  60. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/agent.mts +0 -0
  61. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/agent.ui.tsx +0 -0
  62. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/delay.mts +0 -0
  63. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/dynamic.mts +0 -0
  64. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/error.mts +0 -0
  65. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/langgraph.json +0 -0
  66. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/nested.mts +0 -0
  67. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/graphs/weather.mts +0 -0
  68. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/parser.test.mts +0 -0
  69. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/js/tests/utils.mts +0 -0
  70. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/logging.py +0 -0
  71. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/metadata.py +0 -0
  72. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/middleware/__init__.py +0 -0
  73. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/middleware/http_logger.py +0 -0
  74. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/middleware/private_network.py +0 -0
  75. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/models/__init__.py +0 -0
  76. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/models/run.py +0 -0
  77. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/patch.py +0 -0
  78. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/queue_entrypoint.py +0 -0
  79. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/route.py +0 -0
  80. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/schema.py +0 -0
  81. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/serde.py +0 -0
  82. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/server.py +0 -0
  83. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/sse.py +0 -0
  84. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/state.py +0 -0
  85. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/stream.py +0 -0
  86. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/thread_ttl.py +0 -0
  87. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/utils.py +0 -0
  88. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/validation.py +0 -0
  89. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/webhook.py +0 -0
  90. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_api/worker.py +0 -0
  91. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_license/__init__.py +0 -0
  92. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_license/middleware.py +0 -0
  93. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_license/validation.py +0 -0
  94. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/__init__.py +0 -0
  95. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/checkpoint.py +0 -0
  96. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/database.py +0 -0
  97. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/inmem_stream.py +0 -0
  98. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/ops.py +0 -0
  99. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/queue.py +0 -0
  100. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/retry.py +0 -0
  101. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/langgraph_storage/store.py +0 -0
  102. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/logging.json +0 -0
  103. {langgraph_api-0.0.45 → langgraph_api-0.0.46}/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: langgraph-api
3
- Version: 0.0.45
3
+ Version: 0.0.46
4
4
  Summary:
5
5
  License: Elastic-2.0
6
6
  Author: Nuno Campos
@@ -13,13 +13,13 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Dist: blockbuster (>=1.5.24,<2.0.0)
15
15
  Requires-Dist: cloudpickle (>=3.0.0,<4.0.0)
16
- Requires-Dist: cryptography (>=43.0.3,<44.0.0)
16
+ Requires-Dist: cryptography (>=42.0.0,<45.0)
17
17
  Requires-Dist: httpx (>=0.25.0)
18
18
  Requires-Dist: jsonschema-rs (>=0.20.0,<0.30)
19
19
  Requires-Dist: langchain-core (>=0.2.38,<0.4.0)
20
20
  Requires-Dist: langgraph (>=0.2.56,<0.4.0)
21
21
  Requires-Dist: langgraph-checkpoint (>=2.0.23,<3.0)
22
- Requires-Dist: langgraph-sdk (>=0.1.59,<0.2.0)
22
+ Requires-Dist: langgraph-sdk (>=0.1.61,<0.2.0)
23
23
  Requires-Dist: langsmith (>=0.1.63,<0.4.0)
24
24
  Requires-Dist: orjson (>=3.9.7)
25
25
  Requires-Dist: pyjwt (>=2.9.0,<3.0.0)
@@ -1,34 +1,39 @@
1
1
  import json
2
2
  import os
3
- from functools import lru_cache
4
- from pathlib import Path
5
3
  from typing import TypedDict
6
4
 
5
+ from anyio import open_file
7
6
  from orjson import loads
8
7
  from starlette.responses import Response
9
8
  from starlette.routing import BaseRoute, Mount
10
9
  from starlette.staticfiles import StaticFiles
11
10
 
11
+ from langgraph_api.js.ui import UI_PUBLIC_DIR, UI_SCHEMAS_FILE
12
12
  from langgraph_api.route import ApiRequest, ApiRoute
13
13
 
14
- # Get path to built UI assets
15
- UI_DIR = Path(os.path.dirname(__file__)).parent / "js" / "ui"
16
- SCHEMAS_FILE = Path(os.path.dirname(__file__)).parent / "js" / "client.ui.schemas.json"
17
-
18
14
 
19
15
  class UiSchema(TypedDict):
20
16
  name: str
21
17
  assets: list[str]
22
18
 
23
19
 
24
- @lru_cache(maxsize=1)
25
- def load_ui_schemas() -> dict[str, UiSchema]:
20
+ _UI_SCHEMAS_CACHE: dict[str, UiSchema] | None = None
21
+
22
+
23
+ async def load_ui_schemas() -> dict[str, UiSchema]:
26
24
  """Load and cache UI schema mappings from JSON file."""
27
- if not SCHEMAS_FILE.exists():
28
- return {}
25
+ global _UI_SCHEMAS_CACHE
26
+
27
+ if _UI_SCHEMAS_CACHE is not None:
28
+ return _UI_SCHEMAS_CACHE
29
+
30
+ if not UI_SCHEMAS_FILE.exists():
31
+ _UI_SCHEMAS_CACHE = {}
32
+ else:
33
+ async with await open_file(UI_SCHEMAS_FILE, mode="r") as f:
34
+ _UI_SCHEMAS_CACHE = loads(await f.read())
29
35
 
30
- with open(SCHEMAS_FILE) as f:
31
- return loads(f.read())
36
+ return _UI_SCHEMAS_CACHE
32
37
 
33
38
 
34
39
  async def handle_ui(request: ApiRequest) -> Response:
@@ -38,7 +43,7 @@ async def handle_ui(request: ApiRequest) -> Response:
38
43
  message = await request.json(schema=None)
39
44
 
40
45
  # Load UI file paths from schema
41
- schemas = load_ui_schemas()
46
+ schemas = await load_ui_schemas()
42
47
 
43
48
  if graph_id not in schemas:
44
49
  return Response(f"UI not found for graph '{graph_id}'", status_code=404)
@@ -64,5 +69,5 @@ async def handle_ui(request: ApiRequest) -> Response:
64
69
 
65
70
  ui_routes: list[BaseRoute] = [
66
71
  ApiRoute("/ui/{graph_id}", handle_ui, methods=["POST"]),
67
- Mount("/ui", StaticFiles(directory=UI_DIR, check_dir=False)),
72
+ Mount("/ui", StaticFiles(directory=UI_PUBLIC_DIR, check_dir=False)),
68
73
  ]
@@ -129,6 +129,8 @@ def run_server(
129
129
  store: typing.Optional["StoreConfig"] = None,
130
130
  auth: AuthConfig | None = None,
131
131
  http: typing.Optional["HttpConfig"] = None,
132
+ ui: dict | None = None,
133
+ ui_config: dict | None = None,
132
134
  studio_url: str | None = None,
133
135
  disable_persistence: bool = False,
134
136
  allow_blocking: bool = False,
@@ -190,6 +192,9 @@ def run_server(
190
192
  LANGSMITH_LANGGRAPH_API_VARIANT="local_dev",
191
193
  LANGGRAPH_AUTH=json.dumps(auth) if auth else None,
192
194
  LANGGRAPH_HTTP=json.dumps(http) if http else None,
195
+ LANGGRAPH_UI=json.dumps(ui) if ui else None,
196
+ LANGGRAPH_UI_CONFIG=json.dumps(ui_config) if ui_config else None,
197
+ LANGGRAPH_UI_BUNDLER="true",
193
198
  LANGGRAPH_API_URL=local_url,
194
199
  LANGGRAPH_DISABLE_FILE_PERSISTENCE=str(disable_persistence).lower(),
195
200
  # If true, we will not raise on blocking IO calls (via blockbuster)
@@ -349,6 +354,8 @@ def main():
349
354
 
350
355
  graphs = config_data.get("graphs", {})
351
356
  auth = config_data.get("auth")
357
+ ui = config_data.get("ui")
358
+ ui_config = config_data.get("ui_config")
352
359
  run_server(
353
360
  args.host,
354
361
  args.port,
@@ -360,6 +367,8 @@ def main():
360
367
  wait_for_client=args.wait_for_client,
361
368
  env=config_data.get("env", None),
362
369
  auth=auth,
370
+ ui=ui,
371
+ ui_config=ui_config,
363
372
  )
364
373
 
365
374
 
@@ -325,3 +325,6 @@ USES_INDEXING = (
325
325
  USES_CUSTOM_APP = HTTP_CONFIG and HTTP_CONFIG.get("app")
326
326
 
327
327
  API_VARIANT = env("LANGSMITH_LANGGRAPH_API_VARIANT", cast=str, default="")
328
+
329
+ # UI
330
+ UI_USE_BUNDLER = env("LANGGRAPH_UI_BUNDLER", cast=bool, default=False)
@@ -289,7 +289,7 @@ def _handle_exception(task: asyncio.Task) -> None:
289
289
 
290
290
 
291
291
  async def stop_remote_graphs() -> None:
292
- logger.info("Cancelling remote graphs")
292
+ logger.info("Shutting down remote graphs")
293
293
  for task in js_bg_tasks:
294
294
  task.cancel("Stopping remote graphs.")
295
295
 
@@ -0,0 +1,68 @@
1
+ /// <reference types="./global.d.ts" />
2
+
3
+ import { z } from "zod";
4
+ import * as fs from "node:fs/promises";
5
+ import * as path from "node:path";
6
+ import {
7
+ filterValidGraphSpecs,
8
+ GraphSchema,
9
+ resolveGraph,
10
+ runGraphSchemaWorker,
11
+ } from "./src/graph.mts";
12
+ import { build } from "@langchain/langgraph-ui";
13
+
14
+ const __dirname = new URL(".", import.meta.url).pathname;
15
+
16
+ async function main() {
17
+ const specs = filterValidGraphSpecs(
18
+ z.record(z.string()).parse(JSON.parse(process.env.LANGSERVE_GRAPHS))
19
+ );
20
+
21
+ const GRAPH_SCHEMAS: Record<string, Record<string, GraphSchema> | false> = {};
22
+ let failed = false;
23
+
24
+ try {
25
+ await Promise.all(
26
+ specs.map(async ([graphId, rawSpec]) => {
27
+ console.info(`[${graphId}]: Checking for source file existence`);
28
+ const { resolved, ...spec } = await resolveGraph(rawSpec, {
29
+ onlyFilePresence: true,
30
+ });
31
+
32
+ try {
33
+ console.info(`[${graphId}]: Extracting schema`);
34
+ GRAPH_SCHEMAS[graphId] = await runGraphSchemaWorker(spec, {
35
+ timeoutMs: 120_000,
36
+ });
37
+ } catch (error) {
38
+ console.error(`[${graphId}]: Error extracting schema: ${error}`);
39
+ GRAPH_SCHEMAS[graphId] = false;
40
+ }
41
+ })
42
+ );
43
+
44
+ await fs.writeFile(
45
+ path.resolve(__dirname, "client.schemas.json"),
46
+ JSON.stringify(GRAPH_SCHEMAS),
47
+ { encoding: "utf-8" }
48
+ );
49
+ } catch (error) {
50
+ console.error(`Error resolving graphs: ${error}`);
51
+ failed = true;
52
+ }
53
+
54
+ // Build Gen UI assets
55
+ try {
56
+ console.info("Checking for UI assets");
57
+ await fs.mkdir(path.resolve(__dirname, "ui"), { recursive: true });
58
+
59
+ await build({ output: path.resolve(__dirname, "ui") });
60
+ } catch (error) {
61
+ console.error(`Error building UI: ${error}`);
62
+ failed = true;
63
+ }
64
+
65
+ if (failed) process.exit(1);
66
+ }
67
+
68
+ main();
@@ -24,7 +24,8 @@
24
24
  "undici": "^6.21.1",
25
25
  "uuid": "^10.0.0",
26
26
  "winston": "^3.17.0",
27
- "@langchain/langgraph-api": "~0.0.19",
27
+ "@langchain/langgraph-api": "~0.0.20",
28
+ "@langchain/langgraph-ui": "~0.0.20",
28
29
  "zod": "^3.23.8"
29
30
  },
30
31
  "resolutions": {