Skip to main content

litellm-ucash

Bill LiteLLM LLM proxy calls via U.CASH pay-per-token. Non-custodial.

litellm-ucash is a LiteLLM custom logger/callback that, after every successful completion, computes the token cost in USD and mints a U.CASH checkout for that amount. Payers settle in crypto (or fiat cards via the merchant's own Stripe) directly to your U.CASH store. Funds never touch this package: it only mints payment links, so the integration is non-custodial end to end.

  • Per-request billing keyed on a stable external_reference, so retries never double-mint (idempotent checkout creation).
  • Two modes:
    • link (default, browser/app-safe): builds a hosted pay.u.cash/embed.php link for the cost and attaches it to the response. No server secret needed.
    • server (server route): calls pay.u.cash/payment/ajax.php to create a tracked, idempotent checkout and attaches the payment URL + transaction id.
  • The store Cloud Token is publishable: it can mint checkouts that pay your store but cannot move funds. Safe to ship in proxy config and frontends.
  • Falls back to a tiny rate card when LiteLLM's own cost calculation is unavailable, so there is always a number to bill.

Install

pip install litellm-ucash

From source (editable):

git clone https://github.com/UdotCASH/litellm-ucash
cd litellm-ucash
pip install -e .

Quick start (Python)

import litellm
from ucash_litellm import UCashPayLogger

# Register the U.CASH pay-per-token logger as a global LiteLLM callback.
litellm.callbacks = [UCashPayLogger(cloud_token="st_YOUR_STORE_CLOUD_TOKEN")]

resp = litellm.completion(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Say hello."}],
)

# The payment link + billed USD are attached to the response metadata.
meta = getattr(resp, "_hidden_params", {}) or {}
print("billed_usd:", meta.get("ucash_billed_usd"))
print("pay_link:  ", meta.get("ucash_payment_url"))

In server mode the callback also returns a tracked checkout:

from ucash_litellm import UCashPayLogger

logger = UCashPayLogger(cloud_token="st_YOUR_STORE_CLOUD_TOKEN", mode="server")

The checkout is attached to the response as meta["ucash_checkout"] (a Checkout with payment_url, transaction_id, external_reference).

LiteLLM proxy usage (config.yaml)

The LiteLLM proxy reads callbacks from litellm_settings.callbacks. Point it at the env-driven factory so no code edit is needed:

# config.yaml
model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY

litellm_settings:
  callbacks: ucash_litellm.config.logger_from_env

general_settings:
  master_key: sk-litellm-master

Then set environment variables and run the proxy:

export UCASH_CLOUD_TOKEN="st_YOUR_STORE_CLOUD_TOKEN"
export OPENAI_API_KEY="sk-..."

# optional:
# UCASH_MODE=server            # mint tracked checkouts server-side (default: link)
# UCASH_MARKUP_PCT=10          # add a 10% margin on top of cost
# UCASH_MIN_USD=0.05           # skip minting checkouts below 5 cents
# UCASH_CURRENCY=USD
# UCASH_TITLE_PREFIX="My App"

litellm --config config.yaml

A full example config lives in examples/config.yaml.

How the cost is computed

  1. If LiteLLM already computed a cost (response.cost or the hidden response_cost), that value is used as-is. This is the recommended path: it honors LiteLLM's provider pricing, caching discounts, and any litellm_params cost overrides.
  2. Otherwise the package estimates from usage tokens using a small fallback rate card (ucash_litellm.pricing.DEFAULT_RATES_PER_M). This is a safety net, not authoritative pricing. Override it with UCashPayLogger(..., rates={...}) if you want your own card.

A configurable markup_pct lets you add margin on top of cost (e.g. markup_pct=10 for a 10% surcharge). Checkouts below min_usd (default $0.01) are skipped to avoid dust.

How U.CASH settlement works

This package only mints checkouts. It never holds or moves funds.

  • Client-side hosted pay link (link mode, default): builds GET https://pay.u.cash/embed.php with cloud, amount, currency, title, external_reference, redirect. The payer is sent to the hosted U.CASH checkout and picks a coin there.
  • Server-side tracked checkout (server mode): posts to POST https://pay.u.cash/payment/ajax.php with function=create-transaction, amount, currency_code, cryptocurrency_code (empty string, so the payer chooses the coin at the hosted checkout), external_reference, title, redirect, cloud, idempotent=1. The response is { "success": true, "response": [paymentUrl, transactionId, ...] }; the payment URL is the array element that starts with http(s)://. Creation is idempotent per external_reference, so retries return the same checkout rather than minting a duplicate.

Payers can settle in crypto, or by fiat card if the store connects its own Stripe processor in the U.CASH dashboard.

What this package does NOT do (honest limitations)

  • It does not gate or block the LLM call. It records a payable checkout after the call succeeds. Use it where you surface the payment link to the end user (your app, your agent UI, your API response), or reconcile it server-side via external_reference.
  • It does not automatically verify that a given request was paid before serving it. LiteLLM + U.CASH is a billing surface; gating access is your app's job (for example, by checking payment status against external_reference on your own backend before returning the response).
  • U.CASH checkouts are one-time, pay-per-call. There is no automatic recurring crypto subscription; per-call billing is the natural fit and that is what this package implements.
  • The fallback rate card is a convenience. For production accuracy, rely on LiteLLM's cost calculation (default) or pass your own rates.

Configuration reference

Option Env var Default Description
cloud_token UCASH_CLOUD_TOKEN (required) Store Cloud Token. Publishable.
mode UCASH_MODE link link (hosted URL) or server (tracked checkout).
currency UCASH_CURRENCY USD Checkout currency.
title_prefix UCASH_TITLE_PREFIX LLM Prefix for the checkout title.
min_usd UCASH_MIN_USD 0.01 Minimum USD to mint a checkout.
markup_pct UCASH_MARKUP_PCT 0.0 Percentage markup added to cost.

Tests

pip install -e ".[dev]"
pytest -q

Tests use respx to mock the U.CASH HTTP endpoints; no network is required.

Set up your pay.u.cash account

  1. Sign up at pay.u.cash, then click the verification link in the email.
  2. Set receive addresses under Settings -> Addresses (raw address, ENS, Unstoppable Domains, or FIO).
  3. Create a store under Account -> Stores and copy its Store Cloud Token (use the store-level token, not the account-wide one).
  4. For fiat cards, connect your own Stripe under Settings -> Payment processors.

Publish (maintainers only)

This repo ships packaging files but does not auto-publish. To release to PyPI:

pip install build twine
python -m build
twine upload dist/*

The first publish requires a PyPI API token scoped to the litellm-ucash project (or "All projects" for a brand-new project name).

License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

litellm_ucash-0.1.0.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

litellm_ucash-0.1.0-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file litellm_ucash-0.1.0.tar.gz.

File metadata

  • Download URL: litellm_ucash-0.1.0.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for litellm_ucash-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f2efaa46348c87e7a15c5da9153219173a7293813daf1ce679ee1b06c06d0de3
MD5 bf2d387c7599ad33beb1a9460a3ba6c0
BLAKE2b-256 74e5815d33d5d1ebe45513f41c956294abdac59277e2bae50a269218adce4124

See more details on using hashes here.

File details

Details for the file litellm_ucash-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: litellm_ucash-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for litellm_ucash-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fefae94ea910f5f2c7680da288458625c20738037e9ec5e88bb5b02bfd97c1e8
MD5 a8264c2d6681bda61d4cf47e55a6ad41
BLAKE2b-256 0075831d52403e92646692d80ae01b72e201de19d24d7a39c0902de7aca913dc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page