Overview
The sardis-langchain package provides native LangChain tools for autonomous agent payments. Integrate Sardis wallets into any LangChain agent (ReAct, OpenAI Functions, Conversational, etc.) with a single toolkit.
When to Use LangChain
Python Agent Development : Build agents with LangChain’s Python framework
Multi-Tool Workflows : Combine payments with LangChain’s ecosystem (web search, databases, APIs)
ReAct Agents : Reasoning + Acting patterns for complex procurement tasks
Custom Chains : Build payment workflows with LCEL (LangChain Expression Language)
Installation
pip install sardis-langchain langchain langchain-openai
Requires Python 3.9+ and langchain-core>=0.1.0
Quick Start
from sardis import SardisClient
from sardis_langchain import SardisToolkit
from langchain.agents import AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
# Initialize Sardis
client = SardisClient( api_key = "sk_live_..." )
wallet = client.wallets.create(
name = "procurement-agent" ,
chain = "base" ,
currency = "USDC" ,
limit_per_tx = 100.00 ,
limit_total = 500.00 ,
)
# Create LangChain tools
toolkit = SardisToolkit( client = client, wallet_id = wallet.wallet_id)
tools = toolkit.get_tools()
# Create agent
llm = ChatOpenAI( model = "gpt-4o" , temperature = 0 )
prompt = PromptTemplate.from_template(
"""You are a procurement agent with a Sardis wallet.
Answer the user's request using the following tools:
{tools}
Question: {input}
{agent_scratchpad} """
)
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor( agent = agent, tools = tools, verbose = True )
# Execute
result = executor.invoke({
"input" : "Check my balance and pay $30 to Anthropic for API credits"
})
print (result[ "output" ])
The SardisToolkit provides 5 LangChain tools:
sardis_pay Execute policy-enforced payment
sardis_check_balance Check balance and spending limits
sardis_check_policy Dry-run policy validation
sardis_set_policy Update spending policy from natural language
sardis_list_transactions View transaction history
sardis_pay
Execute a payment with automatic policy enforcement:
@tool
def sardis_pay ( to : str , amount : str , token : str , purpose : str ) -> str :
"""Execute a payment through Sardis with policy enforcement.
Args:
to: Recipient address or merchant identifier (e.g. 'openai.com')
amount: Amount in USD (e.g. '25.00')
token: Stablecoin to use - one of USDC, USDT, EURC
purpose: Reason for the payment
"""
Example:
result = sardis_pay(
to = "openai.com" ,
amount = "25.00" ,
token = "USDC" ,
purpose = "API credits for GPT-4o"
)
# Returns: "Status: completed | Amount: 25.00 USDC | TX: 0x7f3b...a2c9 | Chain: base"
sardis_check_balance
Check wallet balance and remaining limits:
@tool
def sardis_balance () -> str :
"""Check the current wallet balance and spending limits."""
Returns:
Wallet: wallet_abc123 | Chain: base | Balance: 1000.00 USDC
sardis_check_policy
Validate a payment before execution:
from sardis_langchain import SardisCheckPolicyTool
policy_tool = SardisCheckPolicyTool( client = client, wallet_id = wallet.wallet_id)
result = policy_tool._run(
amount = "500.00" ,
to = "aws.amazon.com" ,
token = "USDC" ,
purpose = "EC2 hosting"
)
sardis_set_policy
Update spending policy using natural language:
result = executor.invoke({
"input" : "Set my spending policy to: Max $100 per transaction, daily limit $500"
})
sardis_list_transactions
View recent transaction history:
result = executor.invoke({
"input" : "Show me my last 10 transactions"
})
toolkit = SardisToolkit( client = client, wallet_id = wallet.wallet_id)
tools = toolkit.get_tools()
For agents that should only execute payments:
tools = toolkit.get_payment_tools() # pay + balance + policy check
Import and use specific tools:
from sardis_langchain import (
SardisPayTool,
SardisCheckBalanceTool,
SardisCheckPolicyTool,
)
tools = [
SardisPayTool( client = client, wallet_id = wallet.wallet_id),
SardisCheckBalanceTool( client = client, wallet_id = wallet.wallet_id),
]
Agent Types
ReAct Agent
Reasoning + Acting pattern for complex tasks:
from langchain.agents import create_react_agent, AgentExecutor
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor( agent = agent, tools = tools)
OpenAI Functions Agent
Use OpenAI’s function calling:
from langchain.agents import create_openai_functions_agent
agent = create_openai_functions_agent(llm, tools, prompt)
executor = AgentExecutor( agent = agent, tools = tools)
Conversational Agent
Chat-based agent with memory:
from langchain.agents import create_conversational_retrieval_agent
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory( memory_key = "chat_history" )
agent = create_conversational_retrieval_agent(
llm = llm,
tools = tools,
memory = memory,
)
Structured Chat Agent
For complex multi-turn conversations:
from langchain.agents import create_structured_chat_agent
agent = create_structured_chat_agent(llm, tools, prompt)
executor = AgentExecutor( agent = agent, tools = tools)
Callback Handler
Track Sardis operations with the built-in callback handler:
from sardis_langchain import SardisCallbackHandler
handler = SardisCallbackHandler()
executor = AgentExecutor(
agent = agent,
tools = tools,
callbacks = [handler],
verbose = True ,
)
result = executor.invoke({ "input" : "Pay $25 to OpenAI" })
# Inspect audit trail
for record in handler.get_payment_records():
print ( f "Payment: $ { record.amount } to { record.recipient } " )
print ( f "Status: { record.status } " )
print ( f "TX Hash: { record.tx_hash } " )
LCEL Chains
Use Sardis tools in LangChain Expression Language chains:
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# Create a payment chain
payment_chain = (
{ "input" : RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
result = payment_chain.invoke( "Pay $50 to AWS for hosting" )
Policy Enforcement
Every payment is validated against the wallet’s policy:
wallet = client.wallets.create(
name = "agent" ,
chain = "base" ,
policy = "Max $100 per transaction, daily limit $500, allowed vendors: openai.com anthropic.com" ,
)
toolkit = SardisToolkit( client = client, wallet_id = wallet.wallet_id)
# This payment will be blocked (exceeds per-tx limit)
result = executor.invoke({
"input" : "Pay $150 to OpenAI"
})
# Output: "Payment rejected: Amount $150.00 exceeds per-transaction limit of $100.00"
# This payment will be blocked (vendor not allowed)
result = executor.invoke({
"input" : "Pay $50 to random-vendor.com"
})
# Output: "Payment rejected: Vendor random-vendor.com is not in the allowed list"
Simulation Mode
Test agents without real funds:
# No API key needed for simulation
client = SardisClient() # Defaults to simulation mode
wallet = client.wallets.create( name = "test-agent" , chain = "base" )
toolkit = SardisToolkit( client = client, wallet_id = wallet.wallet_id)
tools = toolkit.get_tools()
# All operations execute locally - no API calls, no real money
Example: Multi-Vendor Procurement
examples/langchain_sardis_agent.py
#!/usr/bin/env python3
from decimal import Decimal
from langchain.agents import AgentExecutor, create_react_agent
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from sardis import SardisClient
from sardis_langchain import SardisToolkit
# Initialize Sardis
sardis = SardisClient( api_key = "sk_live_..." )
agent = sardis.agents.create( name = "langchain-agent" )
wallet = sardis.wallets.create(
agent_id = agent.agent_id,
chain = "base" ,
currency = "USDC" ,
limit_per_tx = Decimal( "200.00" ),
limit_total = Decimal( "1000.00" ),
)
# Create toolkit
toolkit = SardisToolkit( client = sardis, wallet_id = wallet.wallet_id)
tools = toolkit.get_tools()
# Agent prompt
PROMPT = PromptTemplate.from_template( """
You are a procurement agent with a Sardis wallet.
Before making any payment:
1. State what you're purchasing and why
2. Check the wallet balance
3. Execute the payment with a clear purpose
Tools: {tools}
Tool names: {tool_names}
Question: {input}
Thought: {agent_scratchpad}
""" )
# Create and run agent
llm = ChatOpenAI( model = "gpt-4o" , temperature = 0 )
agent = create_react_agent(llm, tools, PROMPT )
executor = AgentExecutor( agent = agent, tools = tools, verbose = True )
result = executor.invoke({
"input" : "Purchase $30 of Anthropic API credits and $15 of GitHub Copilot. Check balance first."
})
print (result[ "output" ])
Best Practices
1. Always Check Balance First
PROMPT = """
Before making any payment:
1. Check wallet balance using sardis_check_balance
2. Verify the payment is within limits
3. Execute the payment
"""
2. Use Policy Checks for Large Amounts
PROMPT = """
For payments over $100:
1. First use sardis_check_policy to verify
2. Then execute with sardis_pay
"""
3. Provide Clear Purpose
# Good
sardis_pay( to = "openai.com" , amount = "25.00" , purpose = "GPT-4o API credits for Q1 research" )
# Bad
sardis_pay( to = "openai.com" , amount = "25.00" , purpose = "API" )
4. Handle Policy Rejections
PROMPT = """
If a payment is rejected:
1. Explain why to the user
2. Suggest alternatives (lower amount, different vendor)
3. Request human approval if needed
"""
Troubleshooting
ValueError : Tool sardis_pay not found
Ensure toolkit is initialized:
toolkit = SardisToolkit( client = client, wallet_id = wallet.wallet_id)
tools = toolkit.get_tools() # Don't forget to call get_tools()
API Key Error
AuthenticationError: Invalid API key
Verify your API key:
client = SardisClient( api_key = "sk_live_..." ) # Must start with sk_live_ or sk_test_
Policy Rejection
Payment rejected: Amount exceeds daily limit
Check wallet limits:
wallet = client.wallets.get(wallet.wallet_id)
print ( f "Daily limit: $ { wallet.limit_daily } " )
print ( f "Spent today: $ { wallet.spent_today } " )
Next Steps
OpenAI Integration Use Sardis with OpenAI function calling
CrewAI Teams Build multi-agent procurement teams
Policy Engine Deep dive into spending policy rules
API Reference Full Python SDK documentation