This guide helps you migrate from AGIRAILS Python SDK v1.x to v2.0.
SDK v2 is a complete rewrite with:
- Async-first architecture (all operations use
async/await) - Three-tier API (Basic, Standard, Advanced)
- Full TypeScript SDK parity
- Enhanced security (SSRF protection, timing-safe comparisons)
- Mock runtime for local development
v1 (sync):
from agirails import ACTPClient
client = ACTPClient(private_key="0x...")v2 (async):
from agirails import ACTPClient
import asyncio
async def main():
client = await ACTPClient.create(
mode="mock", # or "testnet", "mainnet"
private_key="0x..."
)
# ... use client
asyncio.run(main())v1:
tx_id = client.create_transaction(
provider="0x...",
amount=100_000_000, # 100 USDC
deadline=1735689600
)v2 (Basic API):
result = await client.basic.pay(
to="0x...",
amount=100_000_000,
service="text-generation"
)
tx_id = result.tx_idv2 (Standard API):
tx = await client.standard.create_transaction(
provider="0x...",
amount=100_000_000,
deadline=1735689600,
dispute_window=7200
)
tx_id = tx.tx_idv1:
client.transition_state(tx_id, "DELIVERED")v2:
await client.standard.deliver(
tx_id=tx_id,
result={"output": "Generated text..."},
result_cid="bafybeig..." # Optional IPFS CID
)v1:
client.link_escrow(tx_id, escrow_id)
client.release_escrow(tx_id)v2:
await client.standard.link_escrow(tx_id, escrow_id)
await client.standard.release(tx_id)v1:
try:
client.create_transaction(...)
except Exception as e:
print(f"Error: {e}")v2 (structured errors):
from agirails.errors import (
ACTPError,
InvalidStateTransition,
InsufficientFunds,
DeadlineExpired
)
try:
await client.standard.create_transaction(...)
except InvalidStateTransition as e:
print(f"Cannot transition: {e.from_state} → {e.to_state}")
except InsufficientFunds as e:
print(f"Need {e.required}, have {e.available}")
except DeadlineExpired as e:
print(f"Deadline was {e.deadline}, now {e.current_time}")
except ACTPError as e:
print(f"ACTP Error [{e.code}]: {e.message}")Develop locally without blockchain:
client = await ACTPClient.create(mode="mock")
# Time manipulation for testing deadlines
await client.time.advance(hours=24)
# State persists to .actp/mock-state.jsonfrom agirails.level0 import ServiceDirectory, request, provide
# Register as provider
directory = ServiceDirectory()
directory.register("text-generation", "0xMyAddress", {"model": "gpt-4"})
# Request service
result = await request(
service="text-generation",
input={"prompt": "Hello"},
max_price=1_000_000
)from agirails.level1 import Agent, AgentConfig
config = AgentConfig(
name="TextGenAgent",
services=["text-generation"],
pricing={"base": 100_000, "per_token": 100}
)
agent = Agent(config)
@agent.on_job
async def handle_job(job):
result = await generate_text(job.input)
await job.complete(result)
await agent.start()from agirails.builders import DeliveryProofBuilder
proof = await DeliveryProofBuilder.build(
tx_id=tx_id,
result={"output": "..."},
provider_did="did:ethr:84532:0x...",
consumer_did="did:ethr:84532:0x..."
)
# Verify proof
is_valid = await DeliveryProofBuilder.verify(proof)client = ACTPClient(
rpc_url="https://...",
private_key="0x...",
kernel_address="0x..."
)client = await ACTPClient.create(
mode="testnet", # Auto-configures Base Sepolia
private_key="0x...",
# Optional overrides
config={
"rpc_url": "https://...",
"kernel_address": "0x...",
"escrow_address": "0x...",
"gas_limit": 500_000
}
)| v1 | v2 | Notes |
|---|---|---|
AGIRAILS_RPC_URL |
AGIRAILS_RPC_URL |
Same |
AGIRAILS_PRIVATE_KEY |
AGIRAILS_PRIVATE_KEY |
Same |
AGIRAILS_KERNEL |
AGIRAILS_KERNEL_ADDRESS |
Renamed |
| - | AGIRAILS_MODE |
New: mock, testnet, mainnet |
State values remain the same (0-7), but import path changed:
v1:
from agirails import Statev2:
from agirails.types import TransactionState
# or
from agirails import State # Alias still worksv1:
agirails tx create --provider 0x... --amount 100
agirails tx listv2:
actp pay --to 0x... --amount 100 --service text-gen
actp tx list
actp tx get <tx_id>
actp balance- Update imports to use async client
- Wrap all SDK calls in
async/await - Update error handling to use structured exceptions
- Replace
client.method()withclient.basic.method()orclient.standard.method() - Update CLI commands from
agirailstoactp - Test with mock mode before testnet
- Update environment variables
- Documentation: See README.md
- Issues: https://github.com/agirails/python-sdk/issues
- Discord: #python-sdk channel
- Email: developers@agirails.io