Compare commits

..
Author SHA1 Message Date
Sam Crowder 8b7f4efc3a Update changelog via LangGraph Server Changelog Bot 2025-07-11 13:56:39 -07:00
Sam Crowder be0b260a04 COMMIT THAT SHOULD BE SKIPPED NOT INCLUDED IN VERSION BUCKETS 2025-07-11 13:20:59 -07:00
Sam Crowder cad2a84e26 remove 0.2.86 2025-07-11 13:01:26 -07:00
Xin JinandGitHub 4da35babda feat: add copy page button functionality and fix llms-text output (#5419)
* feat: add copy page button functionality and fix llms-text output

- Add copy page button with CSS and JS implementation
- Implement copy page hooks for MkDocs integration
- Fix HTML filtering and DOM text reinterpreted as HTML issues
- Update llms-text target to generate docs/llm.txt instead of docs/llms-full.txt
- Add necessary styling and package.json dependencies

* fix missing button in preview

* remove the over-processing

* disable API reference
2025-07-11 15:13:55 -04:00
Sam CrowderandGitHub c3d882e87a docs: [LangGraph Server Changelog Bot] Changelog updates for new version(s) (#5455)
Update changelog via LangGraph Server Changelog Bot
2025-07-11 11:55:08 -07:00
jitoandGitHub fbade9e300 docs: fix variable reference in agent evaluator example (#5434)
Signed-off-by: jitokim <pigberger70@gmail.com>
2025-07-11 14:57:49 +00:00
jitoandGitHub 0b6a9e345d fix(langgraph): replace _state_schema to state_schema when accessing StateGraph (#5436) 2025-07-11 01:39:59 +00:00
William FHandGitHub 9b9bf88aee fix(checkpoint-postgres): Remove python invalid escape warning (#5441) 2025-07-10 22:38:05 +00:00
William FHandGitHub 67a86f2dc2 fix[docs]: Add missing flags for langgraph up command (#5429) 2025-07-10 02:07:48 +00:00
Sam CrowderandGitHub ad44d1fe66 docs: [LangGraph Changelog Bot] Changelog updates for new version(s) (#5427) 2025-07-09 18:41:03 -07:00
Sam Crowder 5c45f7c330 Update changelog via LangGraph Changelog Bot 2025-07-09 18:06:04 -07:00
Sam CrowderandGitHub bb2f448175 docs: [LangGraph Changelog Bot] Changelog updates for new version(s) (#5425) 2025-07-09 13:55:14 -07:00
Sam Crowder 8a9f3dbf6f Update changelog via LangGraph Changelog Bot 2025-07-09 13:34:04 -07:00
Sam Crowder 63f051ad28 Update changelog via LangGraph Changelog Bot 2025-07-09 13:25:47 -07:00
16 changed files with 410 additions and 43 deletions
+2 -1
View File
@@ -1,3 +1,4 @@
TESTING
# Contributing to LangGraph
Thank you for being interested in contributing to LangGraph!
@@ -291,4 +292,4 @@ def my_function(arg1: int, arg2: str) -> float:
This is a description of the return value.
"""
return 3.14
```
```
+162
View File
@@ -0,0 +1,162 @@
"""
Copy page functionality hooks for MkDocs.
This module provides hooks to inject original markdown content into HTML pages
for the copy page functionality, allowing users to copy clean markdown content
optimized for LLMs.
"""
import json
import re
from pathlib import Path
from typing import Optional
from mkdocs.config.defaults import MkDocsConfig
from mkdocs.structure.pages import Page
def _process_includes(content: str, docs_dir: Path) -> str:
"""Process MkDocs includes like {!../README.md!}."""
include_pattern = r'\{!([^!]+)!\}'
def replace_include(match):
include_path = match.group(1)
# Resolve relative path
if include_path.startswith('../'):
# Go up from docs dir
include_file = docs_dir.parent / include_path[3:]
else:
include_file = docs_dir / include_path
try:
with open(include_file, 'r', encoding='utf-8') as f:
included_content = f.read()
# Remove frontmatter from included content to avoid duplication
included_content = re.sub(r'^---\n.*?\n---\n', '', included_content, flags=re.DOTALL)
return included_content
except:
return f"[Content from {include_path}]"
return re.sub(include_pattern, replace_include, content)
def _clean_markdown(content: str) -> str:
"""Minimal cleanup of markdown content - preserve original as much as possible."""
# Remove frontmatter
content = re.sub(r'^---\n.*?\n---\n', '', content, flags=re.DOTALL)
# Remove script tags (security)
content = re.sub(r'<script[^>]*>.*?</script\s*>', '', content, flags=re.DOTALL | re.IGNORECASE)
# Remove style tags (security)
content = re.sub(r'<style[^>]*>.*?</style\s*>', '', content, flags=re.DOTALL | re.IGNORECASE)
# Remove HTML comments
content = re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL)
# Just strip and return - preserve original structure
return content.strip()
def inject_markdown_content(html: str, page: Page, config: MkDocsConfig) -> str:
"""
Inject the original markdown content into the HTML for copy page functionality.
Args:
html: The HTML content to inject into
page: The MkDocs page object
config: The MkDocs configuration
Returns:
Modified HTML with markdown content injected as JSON
"""
if not hasattr(page, 'file') or not page.file:
return html
# Get the original markdown file path
docs_dir = Path(config.get('docs_dir', 'docs'))
src_path = page.file.src_path
# Handle different file types
if src_path.endswith('.ipynb'):
# For notebook files, we might want to use the converted markdown
# For now, just return the HTML as-is
return html
markdown_file = docs_dir / src_path
if not markdown_file.exists():
return html
try:
# Read the original markdown content
with open(markdown_file, 'r', encoding='utf-8') as f:
markdown_content = f.read()
# Special handling for index page - use relative path to the actual README.md
if src_path == 'index.md':
# Relative path to the repository README.md file (go up two levels from docs/docs)
readme_path = docs_dir.parent.parent / 'README.md'
try:
with open(readme_path, 'r', encoding='utf-8') as f:
readme_content = f.read()
# Remove frontmatter if present
processed_markdown = re.sub(r'^---\n.*?\n---\n', '', readme_content, flags=re.DOTALL)
processed_markdown = processed_markdown.strip()
except Exception as e:
# If we can't read the README, fallback to original behavior
processed_markdown = _process_includes(markdown_content, docs_dir)
processed_markdown = re.sub(r'^---\n.*?\n---\n', '', processed_markdown, flags=re.DOTALL)
processed_markdown = processed_markdown.strip()
else:
# Process any includes in the markdown to get the full content
processed_markdown = _process_includes(markdown_content, docs_dir)
# Clean up the processed markdown normally for other pages
processed_markdown = _clean_markdown(processed_markdown)
# Create the JSON data
markdown_data = {
'markdown': processed_markdown,
'title': page.title or 'Page Content',
'url': page.url or ''
}
# Properly escape the JSON for HTML
json_content = json.dumps(markdown_data, ensure_ascii=False)
json_content = json_content.replace('</', '\\u003c/')
json_content = json_content.replace('<script', '\\u003cscript')
json_content = json_content.replace('</script', '\\u003c/script')
script_content = f'<script id="page-markdown-content" type="application/json">{json_content}</script>'
# Insert before </head> if it exists, otherwise before </body>
if '</head>' in html:
html = html.replace('</head>', f'{script_content}</head>')
elif '</body>' in html:
html = html.replace('</body>', f'{script_content}</body>')
except Exception as e:
# If anything goes wrong, just return the original HTML
# Could log the error here if needed
pass
return html
def on_post_page(output: str, page: Page, config: MkDocsConfig) -> str:
"""
MkDocs hook to inject markdown content into HTML pages.
This hook is called after each page is rendered and injects the original
markdown content as JSON for the copy page functionality.
Args:
output: The HTML output of the page
page: The MkDocs page object
config: The MkDocs configuration
Returns:
Modified HTML with markdown content injected
"""
return inject_markdown_content(output, page, config)
+1 -1
View File
@@ -15,7 +15,7 @@ To evaluate your agent's performance you can use `LangSmith` [evaluations](https
def evaluator(*, outputs: dict, reference_outputs: dict):
# compare agent outputs against reference outputs
output_messages = outputs["messages"]
reference_messages = reference["messages"]
reference_messages = reference_outputs["messages"]
score = compare_messages(output_messages, reference_messages)
return {"key": "evaluator_score", "score": score}
```
+4
View File
@@ -409,6 +409,8 @@ The LangGraph CLI requires a JSON configuration file that follows this [schema](
| Option | Default | Description |
| ---------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `--wait` | | Wait for services to start before returning. Implies --detach |
| `--base-image TEXT` | `langchain/langgraph-api` | Base image to use for the LangGraph API server. Pin to specific versions using version tags. |
| `--image TEXT` | | Docker image to use for the langgraph-api service. If specified, skips building and uses this image directly. |
| `--postgres-uri TEXT` | Local database | Postgres URI to use for the database. |
| `--watch` | | Restart on file changes |
| `--debugger-base-url TEXT` | `http://127.0.0.1:[PORT]` | URL used by the debugger to access LangGraph API. |
@@ -436,6 +438,8 @@ The LangGraph CLI requires a JSON configuration file that follows this [schema](
| Option | Default | Description |
| ---------------------------------------------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| <span style="white-space: nowrap;">`--wait`</span> | | Wait for services to start before returning. Implies --detach |
| <span style="white-space: nowrap;">`--base-image TEXT`</span> | <span style="white-space: nowrap;">`langchain/langgraph-api`</span> | Base image to use for the LangGraph API server. Pin to specific versions using version tags. |
| <span style="white-space: nowrap;">`--image TEXT`</span> | | Docker image to use for the langgraph-api service. If specified, skips building and uses this image directly. |
| <span style="white-space: nowrap;">`--postgres-uri TEXT`</span> | Local database | Postgres URI to use for the database. |
| <span style="white-space: nowrap;">`--watch`</span> | | Restart on file changes |
| <span style="white-space: nowrap;">`-c, --config FILE`</span> | `langgraph.json` | Path to configuration file declaring dependencies, graphs and environment variables. |
@@ -4,54 +4,63 @@
---
v0.2.83, 2025-07-09
## v0.2.86 (2025-07-11)
- Respected tool descriptions in the `/mcp` endpoint.
## v0.2.85 (2025-07-10)
- Added support for the `on_disconnect` field to `runs/wait` and included disconnect logs for better debugging.
## v0.2.84 (2025-07-09)
- Removed unnecessary status updates to streamline thread handling and updated version to 0.2.84.
## v0.2.83 (2025-07-09)
- Reduced the default time-to-live for resumable streams to 2 minutes.
- Enabled data submission to LangSmith and Beacon endpoints based on deployment mode and license configuration.
- Enhanced data submission logic to send data to both Beacon and LangSmith instance based on license configuration.
- Enabled submission of self-hosted data to a Langsmith instance when the endpoint is configured.
v0.2.82, 2025-07-03
- Resolved a race condition in Runs.next by implementing join to lock runs, ensuring reliable execution across concurrent processes.
## v0.2.82 (2025-07-03)
- Addressed a race condition in background runs by implementing a lock using join, ensuring reliable execution across CTEs.
v0.2.81, 2025-07-03
- Ensured successful deployment by retaining an /ok endpoint even when disable_meta=True.
- Improved stream start times by reducing initial wait time and optimizing run status checks.
## v0.2.81 (2025-07-03)
- Optimized run streams by reducing initial wait time to improve responsiveness for older or non-existent runs.
v0.2.80, 2025-07-03
- Resolved a TypeError in the `logger.ainfo()` API call by correcting the parameter passing method.
## v0.2.80 (2025-07-03)
- Corrected parameter passing in the `logger.ainfo()` API call to resolve a TypeError.
v0.2.79, 2025-07-02
- Resolved a JsonDecodeError during checkpointing with remote graphs caused by invalid JSON.
- Added a configuration flag to globally disable webhooks across all routes.
## v0.2.79 (2025-07-02)
- Fixed a JsonDecodeError in checkpointing with remote graph by correcting JSON serialization to handle trailing slashes properly.
- Introduced a configuration flag to disable webhooks globally across all routes.
v0.2.78, 2025-07-02
- Added retry mechanism for webhook calls that experience timeouts.
- Added new HTTP metrics to track requests per second and latency.
## v0.2.78 (2025-07-02)
- Added timeout retries to webhook calls to improve reliability.
- Added HTTP request metrics, including a request count and latency histogram, for enhanced monitoring capabilities.
v0.2.77, 2025-07-02
- Added HTTP metrics for improved performance monitoring.
- Updated the Redis cache delimiter to reduce conflicts with subgraph messages.
## v0.2.77 (2025-07-02)
- Added HTTP metrics to improve performance monitoring.
- Changed the Redis cache delimiter to reduce conflicts with subgraph message names and updated caching behavior.
v0.2.76, 2025-07-01
- Updated the redis cache delimiter to prevent conflicts with subgraph messages.
## v0.2.76 (2025-07-01)
- Updated Redis cache delimiter to prevent conflicts with subgraph messages.
v0.2.74, 2025-06-30
- Ensured thread-safe scheduling of webhooks by using a queue for event handling.
## v0.2.74 (2025-06-30)
- Scheduled webhooks in an isolated loop to ensure thread-safe operations and prevent errors with PYTHONASYNCIODEBUG=1.
v0.2.73, 2025-06-27
- Resolved an infinite loop issue and removed the dict_parser for better logging stability.
- Implemented a 409 error response when encountering a deadlock during the cancellation process.
## v0.2.73 (2025-06-27)
- Fixed an infinite frame loop issue and removed the dict_parser due to structlog's unexpected behavior.
- Throw a 409 error on deadlock occurrence during run cancellations to handle lock conflicts gracefully.
v0.2.72, 2025-06-27
- Added a response to return a 409 error code on deadlock situations during cancellation.
## v0.2.72 (2025-06-27)
- Ensured compatibility with future langgraph versions.
- Implemented a 409 response status to handle deadlock issues during cancellation.
v0.2.71, 2025-06-26
- Resolved an issue with the logging type configuration.
## v0.2.71 (2025-06-26)
- Improved logging for better clarity and detail regarding log types.
v0.2.70, 2025-06-26
- Improved error handling for TimeoutErrors to better distinguish between system and user-generated issues.
## v0.2.70 (2025-06-26)
- Improved error handling to better distinguish and log TimeoutErrors caused by users from internal run timeouts.
v0.2.69, 2025-06-26
- Added sorting and pagination to the crons API and updated schema definitions for accuracy.
## v0.2.69 (2025-06-26)
- Added sorting and pagination to the crons API and updated schema definitions for improved accuracy.
## v0.2.66 (2025-06-26)
- Fixed a 404 error when creating multiple runs with the same thread_id using `on_not_exist="create"`.
+1
View File
@@ -362,6 +362,7 @@ markdown_extensions:
- github-callouts
hooks:
- _scripts/notebook_hooks.py
- _scripts/copy_page_hooks.py
extra:
social:
- icon: fontawesome/brands/js
+16
View File
@@ -0,0 +1,16 @@
/* Minimal CSS for copy page button */
.copy-page-btn {
background: transparent;
border: 1px solid var(--md-default-fg-color--lightest);
padding: 6px 12px;
margin-right: 8px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
color: var(--md-default-fg-color);
transition: all 0.2s ease;
}
.copy-page-btn:hover {
background: var(--md-default-fg-color--lightest);
}
+38
View File
@@ -0,0 +1,38 @@
// Simple copy page functionality - just copy the markdown content
function copyPageAsMarkdown() {
const markdownScript = document.getElementById('page-markdown-content');
if (!markdownScript) {
alert('Markdown content not available for this page');
return;
}
try {
const data = JSON.parse(markdownScript.textContent);
const content = `# ${data.title}\n\nSource: ${window.location.href}\n\n${data.markdown}`;
navigator.clipboard.writeText(content).then(() => {
// Simple notification
const notification = document.createElement('div');
notification.textContent = 'Page content copied to clipboard';
notification.style.cssText = 'position:fixed;top:20px;right:20px;background:#4CAF50;color:white;padding:10px;border-radius:4px;z-index:9999;';
document.body.appendChild(notification);
setTimeout(() => notification.remove(), 3000);
}).catch(() => {
alert('Failed to copy content');
});
} catch (e) {
alert('Failed to parse page content');
}
}
// Add button to header - simpler approach
document.addEventListener('DOMContentLoaded', function() {
const headerSource = document.querySelector('.md-header__source');
if (headerSource) {
const button = document.createElement('button');
button.textContent = 'Copy page';
button.onclick = copyPageAsMarkdown;
button.style.cssText = 'background:none;border:1px solid #ddd;padding:6px 12px;margin-right:8px;border-radius:4px;cursor:pointer;';
headerSource.parentNode.insertBefore(button, headerSource);
}
});
+135
View File
@@ -13,6 +13,130 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
{% block extrahead %}
<meta name="algolia-site-verification" content="165B7E7C89E49946" />
<script>
// Simple copy page functionality - uses original markdown source
function copyPageAsMarkdown() {
const markdownScript = document.getElementById('page-markdown-content');
if (!markdownScript) {
alert('Markdown content not available for this page');
return;
}
try {
let rawContent = markdownScript.textContent;
// Safe HTML entity decoding function
function decodeHtmlEntities(text) {
const parser = new DOMParser();
const doc = parser.parseFromString(text, 'text/html');
return doc.documentElement.textContent || '';
}
// Always decode HTML entities since the browser might encode them
rawContent = decodeHtmlEntities(rawContent);
const data = JSON.parse(rawContent);
const content = `# ${data.title}\n\nSource: ${window.location.href}\n\n${data.markdown}`;
navigator.clipboard.writeText(content).then(() => {
// Simple notification
const notification = document.createElement('div');
notification.textContent = 'Page content copied to clipboard';
notification.style.cssText = 'position:fixed;top:20px;right:20px;background:#4CAF50;color:white;padding:10px 16px;border-radius:4px;z-index:9999;box-shadow:0 2px 10px rgba(0,0,0,0.2);';
document.body.appendChild(notification);
setTimeout(() => notification.remove(), 3000);
}).catch(() => {
alert('Failed to copy content');
});
} catch (e) {
console.error('Failed to parse page content:', e);
alert('Failed to parse page content: ' + e.message);
}
}
// Add dropdown button to header when page loads
document.addEventListener('DOMContentLoaded', function() {
const headerSource = document.querySelector('.md-header__source');
if (headerSource) {
// Create dropdown container
const dropdownContainer = document.createElement('div');
dropdownContainer.style.cssText = 'position:relative;display:inline-block;margin-left:8px;';
// Create main button
const button = document.createElement('button');
button.innerHTML = 'Copy page <span style="margin-left:8px;font-size:12px;color:#9ca3af;">▾</span>';
button.style.cssText = 'background:transparent;border:1px solid #d1d5db;padding:6px 12px;border-radius:4px;cursor:pointer;font-size:14px;color:#374151;transition:all 0.2s ease;white-space:nowrap;display:flex;align-items:center;';
// Create dropdown menu
const dropdown = document.createElement('div');
dropdown.className = 'copy-page-dropdown';
dropdown.style.cssText = 'position:absolute;top:100%;left:0;background:white;border:1px solid #e5e7eb;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,0.15);z-index:1000;min-width:180px;display:none;padding:4px 0;';
// Create dropdown options
const option1 = document.createElement('div');
option1.textContent = 'Copy as Markdown for LLMs';
option1.className = 'copy-page-option';
option1.style.cssText = 'padding:8px 16px;cursor:pointer;font-size:14px;color:#374151;margin:2px 0;';
option1.onmouseover = function() {
this.style.background = document.documentElement.getAttribute('data-md-color-scheme') === 'slate' ? '#4a5568' : '#f8fafc';
};
option1.onmouseout = function() { this.style.background = 'transparent'; };
option1.onclick = function() {
// Check if we're on a reference page
if (window.location.pathname.includes('/reference/')) {
alert('Copy Page not yet available in API reference pages.');
} else {
copyPageAsMarkdown();
}
dropdown.style.display = 'none';
};
const option2 = document.createElement('div');
option2.textContent = "View LangGraph's llms.txt";
option2.className = 'copy-page-option';
option2.style.cssText = 'padding:8px 16px;cursor:pointer;font-size:14px;color:#374151;margin:2px 0;';
option2.onmouseover = function() {
this.style.background = document.documentElement.getAttribute('data-md-color-scheme') === 'slate' ? '#4a5568' : '#f8fafc';
};
option2.onmouseout = function() { this.style.background = 'transparent'; };
option2.onclick = function() {
window.open('/llms-txt-overview/', '_blank');
dropdown.style.display = 'none';
};
// Add options to dropdown
dropdown.appendChild(option1);
dropdown.appendChild(option2);
// Button hover effects
button.onmouseover = function() {
this.style.background = '#f3f4f6';
this.style.borderColor = '#9ca3af';
};
button.onmouseout = function() {
this.style.background = 'transparent';
this.style.borderColor = '#d1d5db';
};
// Toggle dropdown
button.onclick = function(e) {
e.stopPropagation();
dropdown.style.display = dropdown.style.display === 'none' ? 'block' : 'none';
};
// Close dropdown when clicking outside
document.addEventListener('click', function() {
dropdown.style.display = 'none';
});
// Assemble dropdown
dropdownContainer.appendChild(button);
dropdownContainer.appendChild(dropdown);
headerSource.parentNode.insertBefore(dropdownContainer, headerSource.nextSibling);
}
});
</script>
<style>
@import url("https://fonts.googleapis.com/css2?family=Public+Sans&display=swap");
:root {
@@ -198,6 +322,17 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
color: #000000;
}
/* Copy page dropdown dark mode support */
[data-md-color-scheme="slate"] .copy-page-dropdown {
background: #1f2937 !important;
border-color: #374151 !important;
box-shadow: 0 4px 12px rgba(0,0,0,0.5) !important;
}
[data-md-color-scheme="slate"] .copy-page-option {
color: #e5e7eb !important;
}
</style>
{% endblock %}
+2 -1
View File
@@ -9,7 +9,8 @@
"@langchain/core": "^0.3.38",
"@langchain/openai": "^0.4.2",
"msgpack-lite": "^0.1.26",
"nock": "^14.0.1"
"nock": "^14.0.1",
"he": "^1.2.0"
},
"devDependencies": {
"@tsconfig/recommended": "^1.0.8",
@@ -557,7 +557,7 @@ class BasePostgresStore(Generic[C]):
) -> list[tuple[str, Sequence]]:
queries: list[tuple[str, Sequence]] = []
for _, op in list_ops:
query = """
query = r"""
SELECT DISTINCT ON (truncated_prefix) truncated_prefix, prefix
FROM (
SELECT
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "langgraph-checkpoint-postgres"
version = "2.0.21"
version = "2.0.22"
description = "Library with a Postgres implementation of LangGraph checkpoint saver."
authors = []
requires-python = ">=3.9"
+1 -1
View File
@@ -334,7 +334,7 @@ dev = [
[[package]]
name = "langgraph-checkpoint-postgres"
version = "2.0.21"
version = "2.0.22"
source = { editable = "." }
dependencies = [
{ name = "langgraph-checkpoint" },
+2 -2
View File
@@ -794,7 +794,7 @@ class StateGraph(Generic[StateT, InputT, OutputT]):
interrupt_after: All | list[str] | None = None,
debug: bool = False,
name: str | None = None,
) -> CompiledStateGraph[StateT, InputT]:
) -> CompiledStateGraph[StateT, InputT, OutputT]:
"""Compiles the state graph into a `CompiledStateGraph` object.
The compiled graph implements the `Runnable` interface and can be invoked,
@@ -996,7 +996,7 @@ class CompiledStateGraph(
writers=[ChannelWrite(write_entries)],
)
elif node is not None:
input_schema = node.input if node else self.builder._state_schema
input_schema = node.input if node else self.builder.state_schema
input_channels = list(self.builder.schemas[input_schema])
is_single_input = len(input_channels) == 1 and "__root__" in input_channels
if input_schema in self.schema_to_mapper:
+1 -1
View File
@@ -1331,7 +1331,7 @@ dev = [
[[package]]
name = "langgraph-checkpoint-postgres"
version = "2.0.21"
version = "2.0.22"
source = { editable = "../checkpoint-postgres" }
dependencies = [
{ name = "langgraph-checkpoint" },
+1 -1
View File
@@ -397,7 +397,7 @@ dev = [
[[package]]
name = "langgraph-checkpoint-postgres"
version = "2.0.21"
version = "2.0.22"
source = { editable = "../checkpoint-postgres" }
dependencies = [
{ name = "langgraph-checkpoint" },