import os
from fastapi import FastAPI, Header, Request, Response
from fastapi.responses import JSONResponse
from hilt_sdk import (
HiltApiError,
HiltClient,
PAYMENT_REQUIRED_HEADER,
PAYMENT_RESPONSE_HEADER,
PAYMENT_SIGNATURE_HEADER,
decode_x402_header,
)
app = FastAPI()
hilt = HiltClient(api_key=os.environ["HILT_API_KEY"])
PRODUCT = "pro-ai-api"
@app.post("/ai/pro")
def pro_endpoint(
request: Request,
response: Response,
x_customer_id: str = Header(...),
x_request_id: str = Header(...),
payment_signature: str | None = Header(None, alias=PAYMENT_SIGNATURE_HEADER),
):
payment_response = None
if payment_signature:
payload = decode_x402_header(payment_signature)
session_id = payload["accepted"]["extra"]["hilt"]["paymentSessionId"]
settled = hilt.pay_api.settle_x402(
{"payment_session_id": session_id, "payment_signature": payment_signature},
idempotency_key=f"settle-{x_request_id}",
)
payment_response = settled["headers"][PAYMENT_RESPONSE_HEADER]
try:
consumption = hilt.pay_api.consume_entitlement(
{
"external_product_id": PRODUCT,
"external_customer_id": x_customer_id,
"units": 1,
"metadata": {"request_id": x_request_id},
},
idempotency_key=f"consume-{x_request_id}",
)
except HiltApiError as error:
if error.error_code not in {
"entitlement_not_found",
"entitlement_not_active",
"usage_balance_insufficient",
}:
raise
session = hilt.pay_api.create_payment_session(
{
"external_product_id": PRODUCT,
"external_customer_id": x_customer_id,
"payment_protocol": "x402",
"settlement_rail": "solana_usdc",
"metadata": {"resource": str(request.url)},
},
idempotency_key=f"payment-{x_request_id}",
)
payment_session = session["payment_session"]
required = payment_session["payment_requirement"]["headers"][PAYMENT_REQUIRED_HEADER]
return JSONResponse(
{"error": "payment_required", "payment_session": payment_session},
status_code=402,
headers={PAYMENT_REQUIRED_HEADER: required, "Cache-Control": "no-store"},
)
if payment_response:
response.headers[PAYMENT_RESPONSE_HEADER] = payment_response
return {"result": "paid work can run", "consumption": consumption}