Azure SQL Database checkpoint saver for LangGraph applications
Project description
LangGraph Azure SQL Database Checkpoint Saver
A persistent checkpoint storage implementation for LangGraph applications using Azure SQL Database as the backend.
Features
- Persistent checkpoint storage for LangGraph conversation state
- Both sync and async operations supported
- Azure SQL Database integration with Azure Active Directory authentication
- Thread-based conversation management with checkpoint history
- Flexible configuration with connection strings or individual parameters
- Automatic table creation and schema management
Installation
Basic Installation
pip install langgraph-azure-sql-db-checkpoint
For Async Support
pip install langgraph-azure-sql-db-checkpoint[async]
Development Installation
pip install langgraph-azure-sql-db-checkpoint[dev]
Prerequisites
- Azure SQL Database - You'll need an Azure SQL Database instance
- ODBC Driver - Install "ODBC Driver 18 for SQL Server" on your system
- Authentication - Either Azure AD authentication or SQL username/password
Quick Start
Synchronous Usage
from langgraph_azure_sql_db_checkpoint import AzureSQLCheckpointSaver
from langgraph.graph import StateGraph
# Initialize with Azure AD authentication (recommended)
checkpointer = AzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database"
)
# Setup the database table
checkpointer.setup()
# Use with LangGraph
app = StateGraph(YourStateClass)
# ... define your graph ...
app = app.compile(checkpointer=checkpointer)
# Run with thread_id for persistence
config = {"configurable": {"thread_id": "user123"}}
result = app.invoke({"input": "Hello"}, config)
Asynchronous Usage
from langgraph_azure_sql_db_checkpoint import AsyncAzureSQLCheckpointSaver
import asyncio
async def main():
# Initialize async checkpointer
checkpointer = AsyncAzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database"
)
# Setup the database table
await checkpointer.asetup()
# Use with async LangGraph
app = StateGraph(YourStateClass)
# ... define your graph ...
app = app.compile(checkpointer=checkpointer)
# Run with thread_id for persistence
config = {"configurable": {"thread_id": "user123"}}
result = await app.ainvoke({"input": "Hello"}, config)
# Don't forget to cleanup
await checkpointer.aclose()
asyncio.run(main())
Authentication Options
Azure Active Directory (Recommended)
# Using Azure AD (default)
checkpointer = AzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database",
use_azure_auth=True # This is the default
)
SQL Authentication
# Using SQL username/password
checkpointer = AzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database",
username="your-username",
password="your-password",
use_azure_auth=False
)
Connection String
# Using a full connection string
connection_string = (
"Driver={ODBC Driver 18 for SQL Server};"
"Server=your-server.database.windows.net;"
"Database=your-database;"
"Trusted_Connection=yes;"
"Encrypt=yes;"
)
checkpointer = AzureSQLCheckpointSaver(connection_string=connection_string)
Configuration Options
| Parameter | Type | Default | Description |
|---|---|---|---|
connection_string |
str | None | Full ODBC connection string |
server |
str | None | Azure SQL server name |
database |
str | None | Database name |
username |
str | None | SQL username (if not using Azure AD) |
password |
str | None | SQL password (if not using Azure AD) |
use_azure_auth |
bool | True | Use Azure AD authentication |
driver |
str | "ODBC Driver 18 for SQL Server" | ODBC driver name |
table_name |
str | "langgraph_checkpoints" | Name of the checkpoints table |
checkpoint_ns |
str | "checkpoint" | Checkpoint namespace prefix |
Advanced Usage
Managing Conversation History
# Get conversation history for a thread
history = checkpointer.get_thread_history("user123", limit=10)
for checkpoint_tuple in history:
print(f"Checkpoint: {checkpoint_tuple.checkpoint}")
print(f"Metadata: {checkpoint_tuple.metadata}")
# Clear a conversation thread
checkpointer.clear_thread("user123")
Custom Table Configuration
checkpointer = AzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database",
table_name="my_custom_checkpoints",
checkpoint_ns="my_app"
)
Error Handling
from sqlalchemy.exc import SQLAlchemyError
try:
checkpointer = AzureSQLCheckpointSaver(
server="your-server.database.windows.net",
database="your-database"
)
checkpointer.setup()
except SQLAlchemyError as e:
print(f"Database connection failed: {e}")
# Handle connection errors
except Exception as e:
print(f"Unexpected error: {e}")
Database Schema
The package automatically creates a table with the following schema:
CREATE TABLE langgraph_checkpoints (
thread_id NVARCHAR(500) NOT NULL,
checkpoint_id NVARCHAR(500) NOT NULL,
parent_checkpoint_id NVARCHAR(500) NULL,
checkpoint_data TEXT NOT NULL,
metadata TEXT NULL,
created_at DATETIME NOT NULL DEFAULT GETUTCDATE(),
PRIMARY KEY (thread_id, checkpoint_id)
);
Troubleshooting
Common Issues
-
ODBC Driver Not Found
Install "ODBC Driver 18 for SQL Server" from Microsoft -
Azure AD Authentication Failed
Ensure you're logged in with Azure CLI: az login Or use SQL authentication instead -
Connection Timeout
Check your Azure SQL firewall rules and connection string
Debug Mode
# Enable SQLAlchemy logging for debugging
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
git clone https://github.com/yourusername/langgraph-azure-sql-db-checkpoint.git
cd langgraph-azure-sql-db-checkpoint
pip install -e ".[dev]"
Running Tests
The test file requires additional dependencies that are not part of the main package:
# Install test dependencies
pip install -r requirements-test.txt
# Run the test file (requires Azure SQL connection and OpenAI API setup)
python tests/test_azure_sql_checkpoint.py
Note: The test file requires:
python-dotenvfor environment variable managementlangchain-openaifor the Azure OpenAI integration example- Proper environment variables set in a
.envfile:AZURE_SQL_CONN- Azure SQL connection stringAZURE_DEPLOYMENT_NAME- Azure OpenAI deployment nameAZURE_OPENAI_VERSION- Azure OpenAI API versionAZURE_OPENAI_ENDPOINT- Azure OpenAI endpoint URLAZURE_OPENAI_API_KEY- Azure OpenAI API key
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- LangGraph - The graph-based conversation framework
- SQLAlchemy - Python SQL toolkit and ORM
Support
For issues and questions, please use the GitHub Issues page.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langgraph_azure_sql_db_checkpoint-0.1.2.tar.gz.
File metadata
- Download URL: langgraph_azure_sql_db_checkpoint-0.1.2.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
493776cd6503abd4334c09323845938b61947ddb2d72fa8393350b19898bf13b
|
|
| MD5 |
03062a91be5a0606642ab387a926e740
|
|
| BLAKE2b-256 |
c7af1fbc8ad1bb26b3f9795a734f4d3b65ab258ebe9980347ec2b1c81be28edc
|
File details
Details for the file langgraph_azure_sql_db_checkpoint-0.1.2-py3-none-any.whl.
File metadata
- Download URL: langgraph_azure_sql_db_checkpoint-0.1.2-py3-none-any.whl
- Upload date:
- Size: 10.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e418ff7b4da23989a0092ea943fe4976aeee12c8b8bfa9142b9ff330f306a04
|
|
| MD5 |
06cf1f027e9f5671801afb0510ba3726
|
|
| BLAKE2b-256 |
14e5430532f1209c5e545df7bdf9ab219652c44927da15d25ee25276338f030f
|