stateset-embedded
Local-first embedded commerce library for Python, powered by Rust.
Installation
pip install stateset-embedded
Optional framework adapters:
pip install "stateset-embedded[langchain]"
pip install "stateset-embedded[crewai]"
pip install "stateset-embedded[autogen]"
# or install all Python framework helpers together
pip install "stateset-embedded[agents]"
Or build from source:
cd bindings/python
pip install maturin
maturin develop
Quick Start
from stateset_embedded import Commerce, CreateOrderItemInput
# Initialize with SQLite database
commerce = Commerce("./store.db")
# Or use in-memory database for testing
commerce = Commerce(":memory:")
# Create a customer
customer = commerce.customers.create(
email="alice@example.com",
first_name="Alice",
last_name="Smith"
)
print(f"Created customer: {customer.id}")
# Create a product with variant
product = commerce.products.create(
name="Premium Widget",
description="A high-quality widget"
)
# Create inventory
item = commerce.inventory.create_item(
sku="WIDGET-001",
name="Premium Widget",
initial_quantity=100
)
# Check stock
stock = commerce.inventory.get_stock("WIDGET-001")
print(f"Available: {stock.total_available}")
# Create an order
order = commerce.orders.create(
customer_id=customer.id,
items=[
CreateOrderItemInput(
sku="WIDGET-001",
name="Premium Widget",
quantity=2,
unit_price=29.99
)
]
)
print(f"Order {order.order_number}: ${order.total_amount}")
# Ship the order
commerce.orders.ship(order.id, tracking_number="1Z999AA10123456784")
# Analytics
summary = commerce.analytics.sales_summary(period="last30days")
print(f"Revenue: ${summary.total_revenue}")
# Currency conversion (set a rate, then convert)
commerce.currency.set_rate("USD", "EUR", 0.92, source="manual")
conversion = commerce.currency.convert("USD", "EUR", 100.0)
print(f"$100 USD = €{conversion.converted_amount} EUR")
Agent Toolkit
The Python package also ships a native agent toolkit for core embedded commerce operations:
from stateset_embedded import Commerce, create_embedded_agent_toolkit
commerce = Commerce(":memory:")
toolkit = create_embedded_agent_toolkit(commerce, allow_apply=False)
openai_tools = toolkit.get_tools(format="openai")
descriptors = toolkit.create_tool_descriptors(
filter=["list_customers", "list_orders", "get_sales_summary"]
)
callable_registry = toolkit.create_callable_registry(filter=["list_customers"])
langchain_tools = toolkit.create_langchain_tools(filter=["list_customers"])
execution = toolkit.execute_openai_tool_call(
{
"call_id": "py_demo_1",
"function": {
"name": "list_customers",
"arguments": "{\"limit\": 5}",
},
}
)
print(execution["output_message"])
This toolkit is aimed at Python agent runtimes such as CrewAI- or AutoGen-style hosts that need core commerce operations in-process. Use the JS toolkit or MCP server when you need the full registry-generated tool surface and policy runtime.
OpenAI-compatible helper methods are available out of the box, and the framework-specific helpers are available when the corresponding framework packages are installed:
create_tool_descriptors()create_callable_registry()execute_tool()andexecute_tool_calls()create_openai_tools()create_langchain_tools()create_crewai_tools()create_autogen_tools()
Each helper also accepts a tool_factory callback so you can generate your own
framework objects from the native descriptors.
The package also exposes helper modules for direct imports:
from stateset_embedded.generic import create_tool_descriptors, create_callable_registry
from stateset_embedded.openai import create_openai_tools, execute_openai_tool_call
from stateset_embedded.langchain import create_langchain_tools
from stateset_embedded.crewai import create_crewai_tools
from stateset_embedded.autogen import create_autogen_tools
descriptors = create_tool_descriptors(commerce, filter=["list_customers"])
registry = create_callable_registry(commerce, filter=["list_customers"])
openai_tools = create_openai_tools(commerce, filter=["list_customers"])
langchain_tools = create_langchain_tools(commerce, filter=["list_customers"])
crewai_tools = create_crewai_tools(commerce, filter=["count_customers"])
autogen_tools = create_autogen_tools(commerce, filter=["get_sales_summary"])
Runnable repo examples for those module imports live in:
examples/python/openai_tools.pyexamples/python/generic_tools.pyexamples/python/langchain_tools.pyexamples/python/crewai_tools.pyexamples/python/autogen_tools.pyexamples/python/framework_adapters.py
Sequencer Sync
from stateset_embedded import SyncRuntime
import json
runtime = SyncRuntime(json.dumps({
"sequencer_base_url": "http://127.0.0.1:4000",
"engine": {
"agent_id": "agent-1",
"tenant_id": "tenant-1",
"store_id": "store-1",
"outbox_path": "/tmp/stateset-sync-outbox.json",
"state_path": "/tmp/stateset-sync-state.json"
},
"agent_key_id": 7
}))
runtime.record(
"order.created",
"order",
"ORD-1001",
json.dumps({"total": 42.50}),
command_id="cmd-1001",
)
push = runtime.push()
status = runtime.status()
print(push.remote_head)
print(status.caught_up)
SyncRuntime mirrors the Rust SDK sync surface for local event recording,
sequencer health checks, remote-head refresh, push/pull/full-sync operations,
and inspection of confirmations, dead letters, and buffered pulled events.
Typed Python classes are available for the main sync surfaces, and the JSON
helpers remain available when a serialized view is more convenient.
Features
- Local-First: All data stored in SQLite, works offline
- Zero Dependencies: Single native extension, no external services
- Type Safe: Full type hints and IDE support
- Fast: Native Rust performance
- Analytics + Currency: Built-in reporting/forecasting and multi-currency operations
- Vector Search: Semantic search for products/customers (opt-in, OpenAI embeddings)
API Reference
Commerce
Main entry point for all operations.
commerce = Commerce("./store.db") # SQLite file
commerce = Commerce(":memory:") # In-memory database
Customers
# Create
customer = commerce.customers.create(
email="alice@example.com",
first_name="Alice",
last_name="Smith",
phone="+1234567890",
accepts_marketing=True
)
# Get by ID or email
customer = commerce.customers.get(customer_id)
customer = commerce.customers.get_by_email("alice@example.com")
# List all
customers = commerce.customers.list()
# Count
count = commerce.customers.count()
Orders
# Create
order = commerce.orders.create(
customer_id=customer.id,
items=[
CreateOrderItemInput(
sku="SKU-001",
name="Product Name",
quantity=2,
unit_price=29.99
)
],
currency="USD",
notes="Gift wrap please"
)
# Get
order = commerce.orders.get(order_id)
# List all
orders = commerce.orders.list()
# Update status
order = commerce.orders.update_status(order_id, "processing")
# Ship with tracking
order = commerce.orders.ship(order_id, tracking_number="1Z123...")
# Cancel
order = commerce.orders.cancel(order_id)
Products
# Create with variants
from stateset_embedded import CreateProductVariantInput
product = commerce.products.create(
name="Premium Widget",
description="High-quality widget",
variants=[
CreateProductVariantInput(
sku="WIDGET-SM",
price=19.99,
name="Small"
),
CreateProductVariantInput(
sku="WIDGET-LG",
price=29.99,
name="Large"
)
]
)
# Get by ID
product = commerce.products.get(product_id)
# Get variant by SKU
variant = commerce.products.get_variant_by_sku("WIDGET-SM")
# List all
products = commerce.products.list()
Inventory
# Create inventory item
item = commerce.inventory.create_item(
sku="WIDGET-001",
name="Premium Widget",
description="High-quality widget",
initial_quantity=100,
reorder_point=10
)
# Check stock levels
stock = commerce.inventory.get_stock("WIDGET-001")
print(f"On hand: {stock.total_on_hand}")
print(f"Allocated: {stock.total_allocated}")
print(f"Available: {stock.total_available}")
# Adjust stock
commerce.inventory.adjust("WIDGET-001", -5, "Sold 5 units")
commerce.inventory.adjust("WIDGET-001", 50, "Received shipment")
# Reserve for order
reservation = commerce.inventory.reserve(
sku="WIDGET-001",
quantity=2,
reference_type="order",
reference_id=order_id,
expires_in_seconds=3600 # 1 hour
)
# Confirm reservation (deducts from on-hand)
commerce.inventory.confirm_reservation(reservation.id)
# Or release reservation (returns to available)
commerce.inventory.release_reservation(reservation.id)
Vector Search
# Initialize vector search (requires OpenAI API key)
vector = commerce.vector("sk-...")
# Index a product or customer
vector.index_product(product.id)
# Semantic search
results = vector.search_products("wireless bluetooth headphones", limit=10)
for r in results:
print(r.id, r.score, r.name)
# Stats/maintenance
stats = vector.stats()
vector.clear("products")
Returns
from stateset_embedded import CreateReturnItemInput
# Create return request
ret = commerce.returns.create(
order_id=order.id,
reason="defective",
items=[
CreateReturnItemInput(
order_item_id=order.items[0].id,
quantity=1
)
],
reason_details="Product arrived damaged"
)
# Get return
ret = commerce.returns.get(return_id)
# Approve return
ret = commerce.returns.approve(return_id)
# Reject return
ret = commerce.returns.reject(return_id, "Item was used")
# List all returns
returns = commerce.returns.list()
Carts / Checkout
from stateset_embedded import CartAddress, AddCartItemInput
# Create a cart (guest checkout)
cart = commerce.carts.create(customer_email="alice@example.com", currency="USD")
# Add items
commerce.carts.add_item(
cart_id=cart.id,
item=AddCartItemInput(
sku="SKU-001",
name="Widget",
quantity=2,
unit_price=29.99,
),
)
# Set shipping (address + selection)
address = CartAddress(
first_name="Alice",
last_name="Smith",
line1="123 Main St",
city="San Francisco",
postal_code="94105",
country="US",
)
cart = commerce.carts.set_shipping(
cart.id,
address,
shipping_method="standard",
shipping_carrier="ups",
shipping_amount=9.99,
)
# Reserve inventory for cart items (optional)
cart = commerce.carts.reserve_inventory(cart.id)
# Complete checkout (creates an order)
result = commerce.carts.complete(cart.id)
print(result.order_number)
Analytics
# Sales summary
summary = commerce.analytics.sales_summary(period="last30days")
print(summary.total_revenue, summary.order_count)
# Top products / customers
top_products = commerce.analytics.top_products(period="this_month", limit=10)
top_customers = commerce.analytics.top_customers(period="all_time", limit=10)
# Forecasting
forecasts = commerce.analytics.demand_forecast(days_ahead=30)
revenue = commerce.analytics.revenue_forecast(periods_ahead=3, granularity="month")
Currency
# Set an exchange rate
commerce.currency.set_rate("USD", "EUR", 0.92, source="manual")
# Convert currency
conversion = commerce.currency.convert("USD", "EUR", 100.0)
print(conversion.converted_amount)
# Store settings
settings = commerce.currency.get_settings()
settings = commerce.currency.enable_currencies(["USD", "EUR", "GBP"])
Order Statuses
pending- Order created, awaiting confirmationconfirmed- Order confirmedprocessing- Order being processedshipped- Order shippeddelivered- Order deliveredcancelled- Order cancelledrefunded- Order refunded
Return Reasons
defective- Product is defectivenot_as_described- Product not as describedwrong_item- Wrong item receivedno_longer_needed- No longer neededchanged_mind- Changed mindbetter_price_found- Found better price elsewheredamaged- Product arrived damagedother- Other reason
Development
# Install dev dependencies
pip install maturin pytest
# Build in development mode
maturin develop
# Run tests
pytest tests/
# Build release wheel
maturin build --release
License
MIT OR Apache-2.0
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 stateset_embedded-1.23.0.tar.gz.
File metadata
- Download URL: stateset_embedded-1.23.0.tar.gz
- Upload date:
- Size: 2.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9139a31c51c3e20eb969c677b563cc7436524295093e8841fab8d794424943e
|
|
| MD5 |
7477e98b5eb3a3f5dd67aa041df56ccb
|
|
| BLAKE2b-256 |
684496a64d9f8b635306461c1cad9b0e79dad87df1718e512ddc2357700c45bc
|
File details
Details for the file stateset_embedded-1.23.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 7.9 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86c6c03e792c06c0b0351cb157be012f05502c7edf8743f6dac79a60b16920de
|
|
| MD5 |
d8e00596a67fb8981eef695c8887a894
|
|
| BLAKE2b-256 |
c4e349d586e826119d89463b7af79d84751e69f87ca05a04a3060c7fd5e4baba
|
File details
Details for the file stateset_embedded-1.23.0-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae44c9d3a5b94816eee5b963a167993c879351cf848f9e4f2b47b875da29f8a9
|
|
| MD5 |
e83281607897f6d17bb920063390f0be
|
|
| BLAKE2b-256 |
37beae690686b002d2d5d37e3e859d51f85508b42cac08f75611ecc028fbabd3
|
File details
Details for the file stateset_embedded-1.23.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.2 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d277c024c627a26e0d30d4dd3d2bd046b350fec7a2cf26546b2d665bd0c10c32
|
|
| MD5 |
d878fa27e6dc93791b331d97933c8fc2
|
|
| BLAKE2b-256 |
32d4cfcf545c8a6cb7e283f1967906bd93b62f7ad84ef590292c655f1c5f7971
|
File details
Details for the file stateset_embedded-1.23.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 7.9 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63008439379b7e6304dd7cf6b848ec7d188e55d2f9891c2d59d4890cd1e3a5ed
|
|
| MD5 |
c0c94e80ce8c7fc1e1985c1e48b8bb89
|
|
| BLAKE2b-256 |
d916d41df48fd3475b1b150c8009094acac6e5c0404b7707bf73a7b9b3fdda8c
|
File details
Details for the file stateset_embedded-1.23.0-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a99c23fccf925dde8ec37a5b005e108d6ac2c55713662da4f46a582d637d432
|
|
| MD5 |
07f0cb42df528be013983ef8e5c6a1b2
|
|
| BLAKE2b-256 |
ad0f3c06b99d1f5f2de777ea9ddcef1239a750fea98e3464b4d75777925b0956
|
File details
Details for the file stateset_embedded-1.23.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3295703dc3d20e31eff6c74b88a294fe2dae53f49679731deca5519846c4edb8
|
|
| MD5 |
745f92e31d8303ee06cb4d144137fed0
|
|
| BLAKE2b-256 |
58392d756153e034ce9b410834734e1c6c29387ad7ecc61b4740a7d4faed1245
|
File details
Details for the file stateset_embedded-1.23.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 7.9 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ee5541ed08aa7d2e0568411321a6d475cbeee81cd3d07741047f06aad696afe
|
|
| MD5 |
8e4750c1e852105bc9b5c8ba46aa56f6
|
|
| BLAKE2b-256 |
048bca59411323893438f4149624df760f23bd1e3af9f310032b41cb22f65c1e
|
File details
Details for the file stateset_embedded-1.23.0-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a7545a514510c06e64a248abdd5a9fa61b0446844c6bfa6abd87bfe07ff58e1
|
|
| MD5 |
e5a59df1a5b8e4a08f8c359d35c17fa1
|
|
| BLAKE2b-256 |
b232b20bdc4ed47d5c925355502de8f339457b223bdaed964c46dc9a96e4c4a7
|
File details
Details for the file stateset_embedded-1.23.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8abbe5480e75b685310ef77c4afec9495f3d2365294c559d9f2989c45af6f818
|
|
| MD5 |
4410b11bf4e1c69a0616af435a0636e4
|
|
| BLAKE2b-256 |
f753a571237ca62b2d1115a780f0946c729f608ad639ac4dfa52ab72a6039b56
|
File details
Details for the file stateset_embedded-1.23.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 7.9 MB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c425408c28ed4145b1631462af496f3b56c20be0fef054a24353996c968cfcbd
|
|
| MD5 |
d5cb46df124d5f5b69adbf42e3932bdb
|
|
| BLAKE2b-256 |
448608cc98572e6ec8ecf023ced573770a136c36a72e8edb10f36a68781595f1
|
File details
Details for the file stateset_embedded-1.23.0-cp39-cp39-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp39-cp39-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.9, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e1028ba03cb2ceb742429060b1938182d462ab297d895c70177e501dff5abaa
|
|
| MD5 |
b5e4df973be686f4ccf98b6bf402d6a3
|
|
| BLAKE2b-256 |
20479efa88c8df760962ae975228ee8565ab475220e41eb8aad6363596076a8a
|
File details
Details for the file stateset_embedded-1.23.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b6d20a4418cbc4b38d69b7554a189fab6d561feb0747827f1f99235841b04e7
|
|
| MD5 |
af35e50e60b0e63058d909c26e330cdf
|
|
| BLAKE2b-256 |
510a30d3b7cfdeb5c792173f97efe066e937fc108598a7432f8ce68b749e3bb3
|
File details
Details for the file stateset_embedded-1.23.0-cp38-cp38-win_amd64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 7.9 MB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2193532be3e5cd2d2ef5d2ff273c7bf7a4528fb36d281b95c9bfc48dc058277
|
|
| MD5 |
256fd1936f2b57422781406812251891
|
|
| BLAKE2b-256 |
9f6eb31cc1f37bcd70d04853e296f8ccd2bc698ab03ebb07c6e31ae493db69e6
|
File details
Details for the file stateset_embedded-1.23.0-cp38-cp38-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp38-cp38-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 8.3 MB
- Tags: CPython 3.8, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d42f7b917b859ec432f0dcf45f97c35393485be50aa4ae09fd2926c1b5f017a4
|
|
| MD5 |
426f6191bd5e253c7ef79cb544c6a5d7
|
|
| BLAKE2b-256 |
2f9e1cadec680c3176d62620aada161ca83e590ef9aff4b209ff4f9d75bfeaaa
|
File details
Details for the file stateset_embedded-1.23.0-cp38-cp38-macosx_11_0_arm64.whl.
File metadata
- Download URL: stateset_embedded-1.23.0-cp38-cp38-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.8, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e5739386b46e42035f3fe44dec2d00c65b63418533c18ecfa0d277f39fdd091
|
|
| MD5 |
c3ab11ce07805f98476faeaa75505538
|
|
| BLAKE2b-256 |
857ed6d559e0155c80886e8a1ad5b10d20135fd9a0f5ec257057a50909def598
|