Aller au contenu principal

Solde et recharges automatiques

Surveiller et automatiser les recharges

La combinaison du suivi du solde prépayé et des analytics d’utilisation permet de mettre en place un système de recharges intelligentes. Plutôt que de recharger manuellement, vous pouvez automatiser le processus en fonction de seuils et de prévisions de consommation.

Consulter le solde en détail

Rappel de l’endpoint de consultation du solde :

curl "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/prepaid/balance" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY"

La réponse contient le solde actuel et l’historique des transactions (achats et consommations).

Système de recharge automatique

Voici un script complet qui surveille le solde et recharge automatiquement quand nécessaire :

import requests
from datetime import datetime, timedelta

MANAGEMENT_API = "https://management-api.x.ai"
MGMT_KEY = "xai-mgmt-..."
TEAM_ID = "team-..."

# Configuration
MIN_BALANCE = 50.00      # Seuil de recharge
TOP_UP_AMOUNT = 200.00   # Montant de recharge
MAX_MONTHLY = 1000.00    # Plafond mensuel

def get_balance():
    """Récupère le solde prépayé actuel."""
    resp = requests.get(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
        headers={"Authorization": f"Bearer {MGMT_KEY}"}
    )
    return resp.json().get("balance", 0)

def get_monthly_top_ups():
    """Calcule le total des recharges du mois en cours."""
    resp = requests.get(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
        headers={"Authorization": f"Bearer {MGMT_KEY}"}
    )
    # Filtrer les transactions du mois courant
    transactions = resp.json().get("transactions", [])
    current_month = datetime.now().strftime("%Y-%m")
    monthly_total = sum(
        t.get("amount", 0)
        for t in transactions
        if t.get("type") == "top-up" and t.get("date", "").startswith(current_month)
    )
    return monthly_total

def top_up(amount):
    """Effectue une recharge."""
    resp = requests.post(
        f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/top-up",
        headers={
            "Authorization": f"Bearer {MGMT_KEY}",
            "Content-Type": "application/json"
        },
        json={"amount": amount}
    )
    return resp.status_code == 200

# Logique de recharge
balance = get_balance()
monthly_spent = get_monthly_top_ups()

if balance < MIN_BALANCE:
    remaining_budget = MAX_MONTHLY - monthly_spent
    if remaining_budget >= TOP_UP_AMOUNT:
        if top_up(TOP_UP_AMOUNT):
            print(f"Rechargé de ${TOP_UP_AMOUNT:.2f}. Nouveau solde estimé : ${balance + TOP_UP_AMOUNT:.2f}")
        else:
            print("Erreur lors de la recharge")
    else:
        print(f"Plafond mensuel atteint (${monthly_spent:.2f} / ${MAX_MONTHLY:.2f})")
else:
    print(f"Solde suffisant : ${balance:.2f}")

Prévision de consommation

Utilisez les analytics pour estimer quand vos crédits seront épuisés :

import requests
from datetime import datetime, timedelta

MANAGEMENT_API = "https://management-api.x.ai"
MGMT_KEY = "xai-mgmt-..."
TEAM_ID = "team-..."

# Consommation des 7 derniers jours
end = datetime.now()
start = end - timedelta(days=7)

usage_resp = requests.post(
    f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/usage",
    headers={
        "Authorization": f"Bearer {MGMT_KEY}",
        "Content-Type": "application/json"
    },
    json={
        "analyticsRequest": {
            "timeRange": {
                "startTime": start.strftime("%Y-%m-%d %H:%M:%S"),
                "endTime": end.strftime("%Y-%m-%d %H:%M:%S"),
                "timezone": "Europe/Paris"
            },
            "timeUnit": "DAY",
            "values": [{"name": "cost", "aggregation": "SUM"}]
        }
    }
)

# Calculer la moyenne quotidienne
data_points = usage_resp.json().get("dataPoints", [])
daily_costs = [p.get("value", 0) for p in data_points]
avg_daily_cost = sum(daily_costs) / len(daily_costs) if daily_costs else 0

# Estimer les jours restants
balance_resp = requests.get(
    f"{MANAGEMENT_API}/v1/billing/teams/{TEAM_ID}/prepaid/balance",
    headers={"Authorization": f"Bearer {MGMT_KEY}"}
)
current_balance = balance_resp.json().get("balance", 0)

if avg_daily_cost > 0:
    days_remaining = current_balance / avg_daily_cost
    exhaustion_date = datetime.now() + timedelta(days=days_remaining)
    print(f"Consommation moyenne : ${avg_daily_cost:.2f}/jour")
    print(f"Solde actuel : ${current_balance:.2f}")
    print(f"Épuisement estimé : {exhaustion_date.strftime('%d/%m/%Y')} ({days_remaining:.0f} jours)")

Dashboard de suivi intégré

Combinez tous les indicateurs dans un script de monitoring :

#!/bin/bash
echo "=== Dashboard xAI - $(date '+%d/%m/%Y %H:%M') ==="

# Solde prépayé
BALANCE=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/prepaid/balance" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('balance', 'N/A'))")
echo "Solde prépayé : $BALANCE $"

# Charges postpaid
POSTPAID=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/postpaid/invoice/preview" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('totalAmount', 'N/A'))")
echo "Charges postpaid : $POSTPAID $"

# Limite de dépenses
LIMIT=$(curl -s "https://management-api.x.ai/v1/billing/teams/$TEAM_ID/postpaid/spending-limits" \
  -H "Authorization: Bearer $MANAGEMENT_API_KEY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('monthlyLimit', 'N/A'))")
echo "Limite mensuelle : $LIMIT $"

Points clés à retenir

  • Automatisez les recharges avec un seuil minimum et un plafond mensuel
  • Utilisez les analytics pour prévoir la date d’épuisement des crédits
  • Combinez solde prépayé, charges postpaid et limites dans un dashboard unifié
  • Les crédits ne sont pas remboursables — calibrez les recharges automatiques avec prudence
  • Intégrez ces scripts dans votre cron ou votre pipeline CI/CD