langgraph-cli 0.3.6__tar.gz → 0.3.7__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.
Files changed (88) hide show
  1. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/Makefile +2 -1
  2. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/PKG-INFO +3 -3
  3. langgraph_cli-0.3.7/examples/.env.example +3 -0
  4. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/generate_schema.py +1 -8
  5. langgraph_cli-0.3.7/langgraph_cli/__init__.py +1 -0
  6. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/config.py +39 -9
  7. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/pyproject.toml +5 -4
  8. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/schemas/schema.json +28 -4
  9. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/schemas/schema.v0.json +28 -4
  10. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/cli/test_cli.py +3 -1
  11. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/test_config.py +33 -20
  12. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/uv.lock +17 -18
  13. langgraph_cli-0.3.6/examples/.env.example +0 -10
  14. langgraph_cli-0.3.6/tests/unit_tests/cli/__init__.py +0 -0
  15. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/.gitignore +0 -0
  16. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/LICENSE +0 -0
  17. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/README.md +0 -0
  18. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/.gitignore +0 -0
  19. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/Makefile +0 -0
  20. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs/agent.py +0 -0
  21. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs/langgraph.json +0 -0
  22. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs/storm.py +0 -0
  23. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/__init__.py +0 -0
  24. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/graphs_submod/__init__.py +0 -0
  25. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/graphs_submod/agent.py +0 -0
  26. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/graphs_submod/subprompt.txt +0 -0
  27. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/hello.py +0 -0
  28. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/langgraph.json +0 -0
  29. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/prompt.txt +0 -0
  30. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_a/requirements.txt +0 -0
  31. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/graphs_submod/agent.py +0 -0
  32. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/graphs_submod/subprompt.txt +0 -0
  33. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/hello.py +0 -0
  34. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/langgraph.json +0 -0
  35. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/prompt.txt +0 -0
  36. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/requirements.txt +0 -0
  37. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/utils/__init__.py +0 -0
  38. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/graphs_reqs_b/utils/greeter.py +0 -0
  39. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/langgraph.json +0 -0
  40. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/my_app.py +0 -0
  41. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/pipconf.txt +0 -0
  42. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/poetry.lock +0 -0
  43. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/examples/pyproject.toml +0 -0
  44. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/.dockerignore +0 -0
  45. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/.env.example +0 -0
  46. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/.eslintrc.cjs +0 -0
  47. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/.gitignore +0 -0
  48. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/LICENSE +0 -0
  49. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/README.md +0 -0
  50. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/jest.config.js +0 -0
  51. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/langgraph.json +0 -0
  52. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/package.json +0 -0
  53. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/src/agent/graph.ts +0 -0
  54. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/src/agent/state.ts +0 -0
  55. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/static/studio.png +0 -0
  56. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/tests/agent.test.ts +0 -0
  57. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/tests/graph.int.test.ts +0 -0
  58. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/tsconfig.json +0 -0
  59. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/js-examples/yarn.lock +0 -0
  60. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/__main__.py +0 -0
  61. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/analytics.py +0 -0
  62. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/cli.py +0 -0
  63. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/constants.py +0 -0
  64. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/docker.py +0 -0
  65. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/exec.py +0 -0
  66. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/progress.py +0 -0
  67. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/py.typed +0 -0
  68. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/templates.py +0 -0
  69. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/util.py +0 -0
  70. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/langgraph_cli/version.py +0 -0
  71. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/schemas/version.schema.json +0 -0
  72. {langgraph_cli-0.3.6/langgraph_cli → langgraph_cli-0.3.7/tests}/__init__.py +0 -0
  73. {langgraph_cli-0.3.6/tests → langgraph_cli-0.3.7/tests/integration_tests}/__init__.py +0 -0
  74. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/integration_tests/test_cli.py +0 -0
  75. {langgraph_cli-0.3.6/tests/integration_tests → langgraph_cli-0.3.7/tests/unit_tests}/__init__.py +0 -0
  76. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/agent.py +0 -0
  77. {langgraph_cli-0.3.6/tests/unit_tests → langgraph_cli-0.3.7/tests/unit_tests/cli}/__init__.py +0 -0
  78. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/cli/langgraph.json +0 -0
  79. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/cli/pyproject.toml +0 -0
  80. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/cli/test_templates.py +0 -0
  81. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/conftest.py +0 -0
  82. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/graphs/agent.py +0 -0
  83. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/helpers.py +0 -0
  84. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/multiplatform/js.mts +0 -0
  85. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/multiplatform/python.py +0 -0
  86. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/pipconfig.txt +0 -0
  87. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/test_config.json +0 -0
  88. {langgraph_cli-0.3.6 → langgraph_cli-0.3.7}/tests/unit_tests/test_docker.py +0 -0
@@ -4,8 +4,9 @@
4
4
  # TESTING AND COVERAGE
5
5
  ######################
6
6
 
7
+ TEST?= "tests/unit_tests"
7
8
  test:
8
- uv run pytest tests/unit_tests
9
+ uv run pytest $(TEST)
9
10
  test-integration:
10
11
  uv run pytest tests/integration_tests
11
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-cli
3
- Version: 0.3.6
3
+ Version: 0.3.7
4
4
  Summary: CLI for interacting with LangGraph API
5
5
  Project-URL: Repository, https://www.github.com/langchain-ai/langgraph
6
6
  License-Expression: MIT
@@ -9,8 +9,8 @@ Requires-Python: >=3.9
9
9
  Requires-Dist: click>=8.1.7
10
10
  Requires-Dist: langgraph-sdk>=0.1.0; python_version >= '3.11'
11
11
  Provides-Extra: inmem
12
- Requires-Dist: langgraph-api<0.3.0,>=0.2.67; (python_version >= '3.11') and extra == 'inmem'
13
- Requires-Dist: langgraph-runtime-inmem>=0.6.0; (python_version >= '3.11') and extra == 'inmem'
12
+ Requires-Dist: langgraph-api<0.3.0,>=0.2.120; (python_version >= '3.11') and extra == 'inmem'
13
+ Requires-Dist: langgraph-runtime-inmem>=0.6.8; (python_version >= '3.11') and extra == 'inmem'
14
14
  Requires-Dist: python-dotenv>=0.8.0; extra == 'inmem'
15
15
  Description-Content-Type: text/markdown
16
16
 
@@ -0,0 +1,3 @@
1
+ OPENAI_API_KEY=placeholder
2
+ ANTHROPIC_API_KEY=placeholder
3
+ TAVILY_API_KEY=placeholder
@@ -163,14 +163,7 @@ def generate_schema():
163
163
 
164
164
  # Add enum constraint for python_version
165
165
  if "python_version" in python_schema["properties"]:
166
- python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12"]
167
-
168
- # Add enum constraint for image_distro
169
- if "image_distro" in python_schema["properties"]:
170
- python_schema["properties"]["image_distro"]["anyOf"] = [
171
- {"type": "string", "enum": ["debian", "wolfi"]},
172
- {"type": "null"},
173
- ]
166
+ python_schema["properties"]["python_version"]["enum"] = ["3.11", "3.12", "3.13"]
174
167
 
175
168
  # Create Node.js schema with node_version
176
169
  node_schema = {
@@ -0,0 +1 @@
1
+ __version__ = "0.3.7"
@@ -17,6 +17,9 @@ DEFAULT_PYTHON_VERSION = "3.11"
17
17
  DEFAULT_IMAGE_DISTRO = "debian"
18
18
 
19
19
 
20
+ Distros = Literal["debian", "wolfi", "bullseye", "bookworm"]
21
+
22
+
20
23
  class TTLConfig(TypedDict, total=False):
21
24
  """Configuration for TTL (time-to-live) behavior in the store."""
22
25
 
@@ -369,6 +372,13 @@ class Config(TypedDict, total=False):
369
372
  Must be >= 20 if provided.
370
373
  """
371
374
 
375
+ api_version: Optional[str]
376
+ """Optional. Which semantic version of the LangGraph API server to use.
377
+
378
+ Defaults to latest. Check the
379
+ [changelog](https://docs.langchain.com/langgraph-platform/langgraph-server-changelog)
380
+ for more information."""
381
+
372
382
  _INTERNAL_docker_tag: Optional[str]
373
383
  """Optional. Internal use only.
374
384
  """
@@ -378,10 +388,11 @@ class Config(TypedDict, total=False):
378
388
 
379
389
  Defaults to langchain/langgraph-api or langchain/langgraphjs-api."""
380
390
 
381
- image_distro: Optional[str]
391
+ image_distro: Optional[Distros]
382
392
  """Optional. Linux distribution for the base image.
383
393
 
384
- Must be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.
394
+ Must be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.
395
+ If omitted, defaults to 'debian' ('latest').
385
396
  """
386
397
 
387
398
  pip_config_file: Optional[str]
@@ -587,13 +598,28 @@ def validate_config(config: Config) -> Config:
587
598
  )
588
599
 
589
600
  image_distro = config.get("image_distro", DEFAULT_IMAGE_DISTRO)
601
+ internal_docker_tag = config.get("_INTERNAL_docker_tag")
602
+ api_version = config.get("api_version")
603
+ if internal_docker_tag:
604
+ if api_version:
605
+ raise click.UsageError(
606
+ "Cannot specify both _INTERNAL_docker_tag and api_version."
607
+ )
608
+ if api_version:
609
+ try:
610
+ parts = tuple(map(int, api_version.split("-")[0].split(".")))
611
+ if len(parts) > 3:
612
+ raise ValueError(
613
+ "Version must be major or major.minor or major.minor.patch."
614
+ )
615
+ except TypeError:
616
+ raise click.UsageError(f"Invalid version format: {api_version}") from None
590
617
 
591
618
  config = {
592
619
  "node_version": node_version,
593
620
  "python_version": python_version,
594
621
  "pip_config_file": config.get("pip_config_file"),
595
622
  "pip_installer": config.get("pip_installer", "auto"),
596
- "_INTERNAL_docker_tag": config.get("_INTERNAL_docker_tag"),
597
623
  "base_image": config.get("base_image"),
598
624
  "image_distro": image_distro,
599
625
  "dependencies": config.get("dependencies", []),
@@ -608,6 +634,10 @@ def validate_config(config: Config) -> Config:
608
634
  "ui_config": config.get("ui_config"),
609
635
  "keep_pkg_tools": config.get("keep_pkg_tools"),
610
636
  }
637
+ if internal_docker_tag:
638
+ config["_INTERNAL_docker_tag"] = internal_docker_tag
639
+ if api_version:
640
+ config["api_version"] = api_version
611
641
 
612
642
  if config.get("node_version"):
613
643
  node_version = config["node_version"]
@@ -644,17 +674,17 @@ def validate_config(config: Config) -> Config:
644
674
  "Add at least one dependency to 'dependencies' list."
645
675
  )
646
676
 
647
- if not config["graphs"]:
677
+ if not config.get("graphs"):
648
678
  raise click.UsageError(
649
679
  "No graphs found in config. Add at least one graph to 'graphs' dictionary."
650
680
  )
651
681
 
652
682
  # Validate image_distro config
653
683
  if image_distro := config.get("image_distro"):
654
- if image_distro not in ["debian", "wolfi"]:
684
+ if image_distro not in Distros.__args__:
655
685
  raise click.UsageError(
656
686
  f"Invalid image_distro: '{image_distro}'. "
657
- "Must be either 'debian' or 'wolfi'."
687
+ "Must be one of 'debian', 'bullseye', or 'bookworm'."
658
688
  )
659
689
 
660
690
  if pip_installer := config.get("pip_installer"):
@@ -1465,6 +1495,7 @@ def docker_tag(
1465
1495
  base_image: Optional[str] = None,
1466
1496
  api_version: Optional[str] = None,
1467
1497
  ) -> str:
1498
+ api_version = api_version or config.get("api_version")
1468
1499
  base_image = base_image or default_base_image(config)
1469
1500
 
1470
1501
  image_distro = config.get("image_distro")
@@ -1473,9 +1504,6 @@ def docker_tag(
1473
1504
  if config.get("_INTERNAL_docker_tag"):
1474
1505
  return f"{base_image}:{config['_INTERNAL_docker_tag']}"
1475
1506
 
1476
- if "/langgraph-server" in base_image:
1477
- return f"{base_image}-py{config['python_version']}"
1478
-
1479
1507
  # Build the standard tag format
1480
1508
  language, version = None, None
1481
1509
  if config.get("node_version") and not config.get("python_version"):
@@ -1488,6 +1516,8 @@ def docker_tag(
1488
1516
  # Prepend API version if provided
1489
1517
  if api_version:
1490
1518
  full_tag = f"{api_version}-{language}{version_distro_tag}"
1519
+ elif "/langgraph-server" in base_image and version_distro_tag not in base_image:
1520
+ return f"{base_image}-{language}{version_distro_tag}"
1491
1521
  else:
1492
1522
  full_tag = version_distro_tag
1493
1523
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "langgraph-cli"
7
- version = "0.3.6"
7
+ dynamic = ["version"]
8
8
  description = "CLI for interacting with LangGraph API"
9
9
  authors = []
10
10
  requires-python = ">=3.9"
@@ -15,11 +15,12 @@ dependencies = [
15
15
  "click>=8.1.7",
16
16
  "langgraph-sdk>=0.1.0 ; python_version >= '3.11'",
17
17
  ]
18
-
18
+ [tool.hatch.version]
19
+ path = "langgraph_cli/__init__.py"
19
20
  [project.optional-dependencies]
20
21
  inmem = [
21
- "langgraph-api>=0.2.67,<0.3.0 ; python_version >= '3.11'",
22
- "langgraph-runtime-inmem>=0.6.0 ; python_version >= '3.11'",
22
+ "langgraph-api>=0.2.120,<0.3.0 ; python_version >= '3.11'",
23
+ "langgraph-runtime-inmem>=0.6.8 ; python_version >= '3.11'",
23
24
  "python-dotenv>=0.8.0",
24
25
  ]
25
26
 
@@ -15,7 +15,8 @@
15
15
  "description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
16
16
  "enum": [
17
17
  "3.11",
18
- "3.12"
18
+ "3.12",
19
+ "3.13"
19
20
  ]
20
21
  },
21
22
  "pip_config_file": {
@@ -40,6 +41,17 @@
40
41
  ],
41
42
  "description": "Optional. Internal use only.\n"
42
43
  },
44
+ "api_version": {
45
+ "anyOf": [
46
+ {
47
+ "type": "string"
48
+ },
49
+ {
50
+ "type": "null"
51
+ }
52
+ ],
53
+ "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
54
+ },
43
55
  "auth": {
44
56
  "anyOf": [
45
57
  {
@@ -122,8 +134,9 @@
122
134
  "image_distro": {
123
135
  "anyOf": [
124
136
  {
125
- "type": "string",
126
137
  "enum": [
138
+ "bookworm",
139
+ "bullseye",
127
140
  "debian",
128
141
  "wolfi"
129
142
  ]
@@ -132,7 +145,7 @@
132
145
  "type": "null"
133
146
  }
134
147
  ],
135
- "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
148
+ "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
136
149
  },
137
150
  "keep_pkg_tools": {
138
151
  "anyOf": [
@@ -221,6 +234,17 @@
221
234
  ],
222
235
  "description": "Optional. Internal use only.\n"
223
236
  },
237
+ "api_version": {
238
+ "anyOf": [
239
+ {
240
+ "type": "string"
241
+ },
242
+ {
243
+ "type": "null"
244
+ }
245
+ ],
246
+ "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
247
+ },
224
248
  "auth": {
225
249
  "anyOf": [
226
250
  {
@@ -313,7 +337,7 @@
313
337
  "type": "null"
314
338
  }
315
339
  ],
316
- "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
340
+ "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
317
341
  },
318
342
  "keep_pkg_tools": {
319
343
  "anyOf": [
@@ -15,7 +15,8 @@
15
15
  "description": "Optional. Python version in 'major.minor' format (e.g. '3.11').\nMust be at least 3.11 or greater for this deployment to function properly.\n",
16
16
  "enum": [
17
17
  "3.11",
18
- "3.12"
18
+ "3.12",
19
+ "3.13"
19
20
  ]
20
21
  },
21
22
  "pip_config_file": {
@@ -40,6 +41,17 @@
40
41
  ],
41
42
  "description": "Optional. Internal use only.\n"
42
43
  },
44
+ "api_version": {
45
+ "anyOf": [
46
+ {
47
+ "type": "string"
48
+ },
49
+ {
50
+ "type": "null"
51
+ }
52
+ ],
53
+ "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
54
+ },
43
55
  "auth": {
44
56
  "anyOf": [
45
57
  {
@@ -122,8 +134,9 @@
122
134
  "image_distro": {
123
135
  "anyOf": [
124
136
  {
125
- "type": "string",
126
137
  "enum": [
138
+ "bookworm",
139
+ "bullseye",
127
140
  "debian",
128
141
  "wolfi"
129
142
  ]
@@ -132,7 +145,7 @@
132
145
  "type": "null"
133
146
  }
134
147
  ],
135
- "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
148
+ "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
136
149
  },
137
150
  "keep_pkg_tools": {
138
151
  "anyOf": [
@@ -221,6 +234,17 @@
221
234
  ],
222
235
  "description": "Optional. Internal use only.\n"
223
236
  },
237
+ "api_version": {
238
+ "anyOf": [
239
+ {
240
+ "type": "string"
241
+ },
242
+ {
243
+ "type": "null"
244
+ }
245
+ ],
246
+ "description": "Optional. Which semantic version of the LangGraph API server to use.\n\nDefaults to latest. Check the\nfor more information.\n"
247
+ },
224
248
  "auth": {
225
249
  "anyOf": [
226
250
  {
@@ -313,7 +337,7 @@
313
337
  "type": "null"
314
338
  }
315
339
  ],
316
- "description": "Optional. Linux distribution for the base image.\n\nMust be either 'debian' or 'wolfi'. If omitted, defaults to 'debian'.\n"
340
+ "description": "Optional. Linux distribution for the base image.\n\nMust be one of 'wolfi', 'debian', 'bullseye', or 'bookworm'.\nIf omitted, defaults to 'debian' ('latest').\n"
317
341
  },
318
342
  "keep_pkg_tools": {
319
343
  "anyOf": [
@@ -381,7 +381,9 @@ def test_dockerfile_command_with_base_image() -> None:
381
381
  assert save_path.exists()
382
382
  with open(save_path) as f:
383
383
  dockerfile = f.read()
384
- assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile)
384
+ assert re.match("FROM langchain/langgraph-server:0.2-py3.*", dockerfile), (
385
+ "\n".join(dockerfile.splitlines()[:3])
386
+ )
385
387
 
386
388
 
387
389
  def test_dockerfile_command_with_docker_compose() -> None:
@@ -38,7 +38,6 @@ def test_validate_config():
38
38
  }
39
39
  actual_config = validate_config(expected_config)
40
40
  expected_config = {
41
- "_INTERNAL_docker_tag": None,
42
41
  "base_image": None,
43
42
  "python_version": "3.11",
44
43
  "node_version": None,
@@ -61,7 +60,6 @@ def test_validate_config():
61
60
  # full config
62
61
  env = ".env"
63
62
  expected_config = {
64
- "_INTERNAL_docker_tag": None,
65
63
  "base_image": None,
66
64
  "python_version": "3.12",
67
65
  "node_version": None,
@@ -190,7 +188,6 @@ def test_validate_config_image_distro():
190
188
  }
191
189
  )
192
190
  assert "Invalid image_distro: 'ubuntu'" in str(exc_info.value)
193
- assert "Must be either 'debian' or 'wolfi'" in str(exc_info.value)
194
191
 
195
192
  with pytest.raises(click.UsageError) as exc_info:
196
193
  validate_config(
@@ -1339,19 +1336,22 @@ def test_docker_tag_different_node_versions_with_distro():
1339
1336
  assert tag == expected_tag, f"Failed for Node.js {node_version}"
1340
1337
 
1341
1338
 
1342
- def test_docker_tag_with_api_version():
1339
+ @pytest.mark.parametrize("in_config", [False, True])
1340
+ def test_docker_tag_with_api_version(in_config: bool):
1343
1341
  """Test docker_tag function with api_version parameter."""
1344
1342
 
1345
1343
  # Test 1: Python config with api_version and default distro
1344
+ version = "0.2.74"
1346
1345
  config = validate_config(
1347
1346
  {
1348
1347
  "python_version": "3.11",
1349
1348
  "dependencies": ["."],
1350
1349
  "graphs": {"agent": "./agent.py:graph"},
1350
+ "api_version": version if in_config else None,
1351
1351
  }
1352
1352
  )
1353
- tag = docker_tag(config, api_version="0.2.74")
1354
- assert tag == "langchain/langgraph-api:0.2.74-py3.11"
1353
+ tag = docker_tag(config, api_version=version if not in_config else None)
1354
+ assert tag == f"langchain/langgraph-api:{version}-py3.11"
1355
1355
 
1356
1356
  # Test 2: Python config with api_version and wolfi distro
1357
1357
  config = validate_config(
@@ -1360,20 +1360,22 @@ def test_docker_tag_with_api_version():
1360
1360
  "dependencies": ["."],
1361
1361
  "graphs": {"agent": "./agent.py:graph"},
1362
1362
  "image_distro": "wolfi",
1363
+ "api_version": version if in_config else None,
1363
1364
  }
1364
1365
  )
1365
- tag = docker_tag(config, api_version="0.2.74")
1366
- assert tag == "langchain/langgraph-api:0.2.74-py3.12-wolfi"
1366
+ tag = docker_tag(config, api_version=version if not in_config else None)
1367
+ assert tag == f"langchain/langgraph-api:{version}-py3.12-wolfi"
1367
1368
 
1368
1369
  # Test 3: Node.js config with api_version and default distro
1369
1370
  config = validate_config(
1370
1371
  {
1371
1372
  "node_version": "20",
1372
1373
  "graphs": {"agent": "./agent.js:graph"},
1374
+ "api_version": version if in_config else None,
1373
1375
  }
1374
1376
  )
1375
- tag = docker_tag(config, api_version="0.2.74")
1376
- assert tag == "langchain/langgraphjs-api:0.2.74-node20"
1377
+ tag = docker_tag(config, api_version=version if not in_config else None)
1378
+ assert tag == f"langchain/langgraphjs-api:{version}-node20"
1377
1379
 
1378
1380
  # Test 4: Node.js config with api_version and wolfi distro
1379
1381
  config = validate_config(
@@ -1381,10 +1383,11 @@ def test_docker_tag_with_api_version():
1381
1383
  "node_version": "20",
1382
1384
  "graphs": {"agent": "./agent.js:graph"},
1383
1385
  "image_distro": "wolfi",
1386
+ "api_version": version if in_config else None,
1384
1387
  }
1385
1388
  )
1386
- tag = docker_tag(config, api_version="0.2.74")
1387
- assert tag == "langchain/langgraphjs-api:0.2.74-node20-wolfi"
1389
+ tag = docker_tag(config, api_version=version if not in_config else None)
1390
+ assert tag == f"langchain/langgraphjs-api:{version}-node20-wolfi"
1388
1391
 
1389
1392
  # Test 5: Custom base image with api_version
1390
1393
  config = validate_config(
@@ -1393,10 +1396,15 @@ def test_docker_tag_with_api_version():
1393
1396
  "dependencies": ["."],
1394
1397
  "graphs": {"agent": "./agent.py:graph"},
1395
1398
  "base_image": "my-registry/custom-image",
1399
+ "api_version": version if in_config else None,
1396
1400
  }
1397
1401
  )
1398
- tag = docker_tag(config, base_image="my-registry/custom-image", api_version="1.0.0")
1399
- assert tag == "my-registry/custom-image:1.0.0-py3.11"
1402
+ tag = docker_tag(
1403
+ config,
1404
+ base_image="my-registry/custom-image",
1405
+ api_version=version if not in_config else None,
1406
+ )
1407
+ assert tag == f"my-registry/custom-image:{version}-py3.11"
1400
1408
 
1401
1409
  # Test 6: api_version with different Python versions
1402
1410
  for python_version in ["3.11", "3.12", "3.13"]:
@@ -1405,10 +1413,11 @@ def test_docker_tag_with_api_version():
1405
1413
  "python_version": python_version,
1406
1414
  "dependencies": ["."],
1407
1415
  "graphs": {"agent": "./agent.py:graph"},
1416
+ "api_version": version if in_config else None,
1408
1417
  }
1409
1418
  )
1410
- tag = docker_tag(config, api_version="0.2.74")
1411
- assert tag == f"langchain/langgraph-api:0.2.74-py{python_version}"
1419
+ tag = docker_tag(config, api_version=version if not in_config else None)
1420
+ assert tag == f"langchain/langgraph-api:{version}-py{python_version}"
1412
1421
 
1413
1422
  # Test 7: Without api_version should work as before
1414
1423
  config = validate_config(
@@ -1428,10 +1437,11 @@ def test_docker_tag_with_api_version():
1428
1437
  "node_version": "20",
1429
1438
  "dependencies": ["."],
1430
1439
  "graphs": {"python": "./agent.py:graph", "js": "./agent.js:graph"},
1440
+ "api_version": version if in_config else None,
1431
1441
  }
1432
1442
  )
1433
- tag = docker_tag(config, api_version="0.2.74")
1434
- assert tag == "langchain/langgraph-api:0.2.74-py3.11"
1443
+ tag = docker_tag(config, api_version=version if not in_config else None)
1444
+ assert tag == f"langchain/langgraph-api:{version}-py3.11"
1435
1445
 
1436
1446
  # Test 9: api_version with _INTERNAL_docker_tag should ignore api_version
1437
1447
  config = validate_config(
@@ -1451,12 +1461,15 @@ def test_docker_tag_with_api_version():
1451
1461
  "python_version": "3.11",
1452
1462
  "dependencies": ["."],
1453
1463
  "graphs": {"agent": "./agent.py:graph"},
1464
+ "api_version": version if in_config else None,
1454
1465
  }
1455
1466
  )
1456
1467
  tag = docker_tag(
1457
- config, base_image="langchain/langgraph-server:0.2", api_version="0.2.74"
1468
+ config,
1469
+ base_image="langchain/langgraph-server",
1470
+ api_version=version if not in_config else None,
1458
1471
  )
1459
- assert tag == "langchain/langgraph-server:0.2-py3.11"
1472
+ assert tag == f"langchain/langgraph-server:{version}-py3.11"
1460
1473
 
1461
1474
 
1462
1475
  def test_config_to_docker_with_api_version():
@@ -471,7 +471,7 @@ wheels = [
471
471
 
472
472
  [[package]]
473
473
  name = "langgraph"
474
- version = "0.5.3"
474
+ version = "0.6.6"
475
475
  source = { registry = "https://pypi.org/simple" }
476
476
  dependencies = [
477
477
  { name = "langchain-core", marker = "python_full_version >= '3.11'" },
@@ -481,14 +481,14 @@ dependencies = [
481
481
  { name = "pydantic", marker = "python_full_version >= '3.11'" },
482
482
  { name = "xxhash", marker = "python_full_version >= '3.11'" },
483
483
  ]
484
- sdist = { url = "https://files.pythonhosted.org/packages/99/f4/f4ebb83dff589b31d4a11c0d3c9c39a55d41f2a722dfb78761f7ed95e96d/langgraph-0.5.3.tar.gz", hash = "sha256:36d4b67f984ff2649d447826fc99b1a2af3e97599a590058f20750048e4f548f", size = 442591, upload-time = "2025-07-14T20:10:02.907Z" }
484
+ sdist = { url = "https://files.pythonhosted.org/packages/02/2b/59f0b2985467ec84b006dd41ec31c0aae43a7f16722d5514292500b871c9/langgraph-0.6.6.tar.gz", hash = "sha256:e7d3cefacf356f8c01721b166b67b3bf581659d5361a3530f59ecd9b8448eca7", size = 465452, upload-time = "2025-08-20T04:02:13.915Z" }
485
485
  wheels = [
486
- { url = "https://files.pythonhosted.org/packages/d7/2f/11be9302d3a213debcfe44355453a1e8fd7ee5e3138edeb8bd82b56bc8f6/langgraph-0.5.3-py3-none-any.whl", hash = "sha256:9819b88a6ef6134a0fa6d6121a81b202dc3d17b25cf7ea3fe4d7669b9b252b5d", size = 143774, upload-time = "2025-07-14T20:10:01.497Z" },
486
+ { url = "https://files.pythonhosted.org/packages/e4/ef/81fce0a80925cd89987aa641ff01573e3556a24f2d205112862a69df7fd3/langgraph-0.6.6-py3-none-any.whl", hash = "sha256:a2283a5236abba6c8307c1a485c04e8a0f0ffa2be770878782a7bf2deb8d7954", size = 153274, upload-time = "2025-08-20T04:02:12.251Z" },
487
487
  ]
488
488
 
489
489
  [[package]]
490
490
  name = "langgraph-api"
491
- version = "0.2.96"
491
+ version = "0.2.137"
492
492
  source = { registry = "https://pypi.org/simple" }
493
493
  dependencies = [
494
494
  { name = "cloudpickle", marker = "python_full_version >= '3.11'" },
@@ -511,9 +511,9 @@ dependencies = [
511
511
  { name = "uvicorn", marker = "python_full_version >= '3.11'" },
512
512
  { name = "watchfiles", marker = "python_full_version >= '3.11'" },
513
513
  ]
514
- sdist = { url = "https://files.pythonhosted.org/packages/ee/4c/837c5ce4aab704b6b13f27c5dd6330dabaf2f25d198032cb18e5d5dcaa53/langgraph_api-0.2.96.tar.gz", hash = "sha256:c498b5542a952d194121cdbe5a4b04e2f48fbc37480141ea2b87ba39a132ddb1", size = 238776, upload-time = "2025-07-17T17:57:47.274Z" }
514
+ sdist = { url = "https://files.pythonhosted.org/packages/05/13/bb3601d76d35f285564ff4b963f3c946aaa854ebc910d89d5ed535a8e2e8/langgraph_api-0.2.137.tar.gz", hash = "sha256:7791bda6ae91e305b3bc95ece338c67dd89f3d5cf735e7ef1ffe381fc2629b44", size = 255804, upload-time = "2025-08-20T07:32:43.969Z" }
515
515
  wheels = [
516
- { url = "https://files.pythonhosted.org/packages/d9/7f/dfae9bc0f85a98bbd96d00df2a39e8b8386977e8ce4a6199d1065bb3709d/langgraph_api-0.2.96-py3-none-any.whl", hash = "sha256:304d424d7a85735489fab1764b439e8219739619ad708b9465b8b8f421f17b37", size = 194393, upload-time = "2025-07-17T17:57:45.89Z" },
516
+ { url = "https://files.pythonhosted.org/packages/1e/d3/bbf69e3443313a014cbe1365f21f7930dd86e2273b6d1aa1d75f03db5221/langgraph_api-0.2.137-py3-none-any.whl", hash = "sha256:42a914903a2722fc12e846f4607a2b5d9f39a084fe091036f3385d9b69c9c8e8", size = 206034, upload-time = "2025-08-20T07:32:42.498Z" },
517
517
  ]
518
518
 
519
519
  [[package]]
@@ -531,7 +531,6 @@ wheels = [
531
531
 
532
532
  [[package]]
533
533
  name = "langgraph-cli"
534
- version = "0.3.6"
535
534
  source = { editable = "." }
536
535
  dependencies = [
537
536
  { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
@@ -561,8 +560,8 @@ dev = [
561
560
  [package.metadata]
562
561
  requires-dist = [
563
562
  { name = "click", specifier = ">=8.1.7" },
564
- { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.67,<0.3.0" },
565
- { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.0" },
563
+ { name = "langgraph-api", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.2.120,<0.3.0" },
564
+ { name = "langgraph-runtime-inmem", marker = "python_full_version >= '3.11' and extra == 'inmem'", specifier = ">=0.6.8" },
566
565
  { name = "langgraph-sdk", marker = "python_full_version >= '3.11'", specifier = ">=0.1.0" },
567
566
  { name = "python-dotenv", marker = "extra == 'inmem'", specifier = ">=0.8.0" },
568
567
  ]
@@ -582,20 +581,20 @@ dev = [
582
581
 
583
582
  [[package]]
584
583
  name = "langgraph-prebuilt"
585
- version = "0.5.2"
584
+ version = "0.6.4"
586
585
  source = { registry = "https://pypi.org/simple" }
587
586
  dependencies = [
588
587
  { name = "langchain-core", marker = "python_full_version >= '3.11'" },
589
588
  { name = "langgraph-checkpoint", marker = "python_full_version >= '3.11'" },
590
589
  ]
591
- sdist = { url = "https://files.pythonhosted.org/packages/bb/11/98134c47832fbde0caf0e06f1a104577da9215c358d7854093c1d835b272/langgraph_prebuilt-0.5.2.tar.gz", hash = "sha256:2c900a5be0d6a93ea2521e0d931697cad2b646f1fcda7aa5c39d8d7539772465", size = 117808, upload-time = "2025-06-30T19:52:48.307Z" }
590
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/21/9b198d11732101ee8cdf30af98d0b4f11254c768de15173e57f5260fd14b/langgraph_prebuilt-0.6.4.tar.gz", hash = "sha256:e9e53b906ee5df46541d1dc5303239e815d3ec551e52bb03dd6463acc79ec28f", size = 125695, upload-time = "2025-08-07T18:17:57.333Z" }
592
591
  wheels = [
593
- { url = "https://files.pythonhosted.org/packages/c3/64/6bc45ab9e0e1112698ebff579fe21f5606ea65cd08266995a357e312a4d2/langgraph_prebuilt-0.5.2-py3-none-any.whl", hash = "sha256:1f4cd55deca49dffc3e5127eec12fcd244fc381321002f728afa88642d5ec59d", size = 23776, upload-time = "2025-06-30T19:52:47.494Z" },
592
+ { url = "https://files.pythonhosted.org/packages/0a/7f/973b0d9729d9693d6e5b4bc5f3ae41138d194cb7b16b0ed230020beeb13a/langgraph_prebuilt-0.6.4-py3-none-any.whl", hash = "sha256:819f31d88b84cb2729ff1b79db2d51e9506b8fb7aaacfc0d359d4fe16e717344", size = 28025, upload-time = "2025-08-07T18:17:56.493Z" },
594
593
  ]
595
594
 
596
595
  [[package]]
597
596
  name = "langgraph-runtime-inmem"
598
- version = "0.6.0"
597
+ version = "0.8.0"
599
598
  source = { registry = "https://pypi.org/simple" }
600
599
  dependencies = [
601
600
  { name = "blockbuster", marker = "python_full_version >= '3.11'" },
@@ -605,22 +604,22 @@ dependencies = [
605
604
  { name = "starlette", marker = "python_full_version >= '3.11'" },
606
605
  { name = "structlog", marker = "python_full_version >= '3.11'" },
607
606
  ]
608
- sdist = { url = "https://files.pythonhosted.org/packages/04/0c/d145c6d83d36efda17b10812760711b77ec05f5bbe962c961d75b32e3c17/langgraph_runtime_inmem-0.6.0.tar.gz", hash = "sha256:b09675789a331be4a2b387c9c46de8772c4c8418e74c057b4ca24e85c25acae3", size = 77618, upload-time = "2025-07-17T16:51:01.504Z" }
607
+ sdist = { url = "https://files.pythonhosted.org/packages/8c/94/02b58b1c137cfca6507f6c495e5794fd542b1f5269ef89fb662799be4b8c/langgraph_runtime_inmem-0.8.0.tar.gz", hash = "sha256:3082273f65650665b4a3875241721087fd51e675eb0227b18dc271839ce99594", size = 79510, upload-time = "2025-08-18T09:00:09.162Z" }
609
608
  wheels = [
610
- { url = "https://files.pythonhosted.org/packages/12/6a/9dc5769b5d2f97d1feacbbf93b180c359dff7462454b37dfef8aed4ebcf7/langgraph_runtime_inmem-0.6.0-py3-none-any.whl", hash = "sha256:312dab25bec6557f1edf95cb8bd7c8bb52f7f4bfeecaf66e7001662f095c9079", size = 29317, upload-time = "2025-07-17T16:51:00.622Z" },
609
+ { url = "https://files.pythonhosted.org/packages/7a/0e/b09c1aff0bcfdb1357be212b4a5d55f5b98644eae7fab6b115aa463e99fa/langgraph_runtime_inmem-0.8.0-py3-none-any.whl", hash = "sha256:85398321fc186618b0957c4d8629cc059fce2e7f57a4756ef83a75575791da1b", size = 31626, upload-time = "2025-08-18T09:00:08.256Z" },
611
610
  ]
612
611
 
613
612
  [[package]]
614
613
  name = "langgraph-sdk"
615
- version = "0.1.73"
614
+ version = "0.2.2"
616
615
  source = { registry = "https://pypi.org/simple" }
617
616
  dependencies = [
618
617
  { name = "httpx", marker = "python_full_version >= '3.11'" },
619
618
  { name = "orjson", marker = "python_full_version >= '3.11'" },
620
619
  ]
621
- sdist = { url = "https://files.pythonhosted.org/packages/ba/e8/daf0271f91e93b10566533955c00ee16e471066755c2efd1ba9a887a7eab/langgraph_sdk-0.1.73.tar.gz", hash = "sha256:6e6dcdf66bcf8710739899616856527a72a605ce15beb76fbac7f4ce0e2ad080", size = 72157, upload-time = "2025-07-14T23:57:22.765Z" }
620
+ sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/ea929b5b3827615802f020abdaa6d4a6f9d59ab764f65559fa6f87a6dda6/langgraph_sdk-0.2.2.tar.gz", hash = "sha256:9484e8071953df75d7aaf9845d82db3595e485af7d5dcc235c9b32c52362e1fc", size = 77981, upload-time = "2025-08-18T19:25:42.596Z" }
622
621
  wheels = [
623
- { url = "https://files.pythonhosted.org/packages/77/86/56e01e715e5b0028cdaff1492a89e54fa12e18c21e03b805a10ea36ecd5a/langgraph_sdk-0.1.73-py3-none-any.whl", hash = "sha256:a60ac33f70688ad07051edff1d5ed8089c8f0de1f69dc900be46e095ca20eed8", size = 50222, upload-time = "2025-07-14T23:57:21.42Z" },
622
+ { url = "https://files.pythonhosted.org/packages/01/0d/dfa633c6b85e973e7d4383e9b92603b7e910e89768411daeb7777bfbae04/langgraph_sdk-0.2.2-py3-none-any.whl", hash = "sha256:1afbec01ade166f8b6ce18782875415422eb70dcb82852aeaa373e6152db4b82", size = 52017, upload-time = "2025-08-18T19:25:40.567Z" },
624
623
  ]
625
624
 
626
625
  [[package]]
@@ -1,10 +0,0 @@
1
- OPENAI_API_KEY=placeholder
2
- ANTHROPIC_API_KEY=placeholder
3
- TAVILY_API_KEY=placeholder
4
- LANGCHAIN_TRACING_V2=false
5
- LANGCHAIN_ENDPOINT=placeholder
6
- LANGCHAIN_API_KEY=placeholder
7
- LANGCHAIN_PROJECT=placeholder
8
- LANGGRAPH_AUTH_TYPE=noop
9
- LANGSMITH_AUTH_ENDPOINT=placeholder
10
- LANGSMITH_TENANT_ID=placeholder
File without changes
File without changes
File without changes
File without changes