/ examples / async_runs / idempotency.sh
idempotency.sh
 1  #!/bin/bash
 2  # CLI Example: Idempotency Key Usage
 3  #
 4  # This example demonstrates how idempotency keys prevent duplicate job submissions.
 5  # Submitting the same request with the same idempotency key returns the existing job.
 6  #
 7  # Requirements:
 8  # - Jobs server running on http://127.0.0.1:8005
 9  #
10  # Usage:
11  #     bash idempotency.sh
12  
13  set -e
14  
15  API_URL="${PRAISONAI_BASE_URL:-http://127.0.0.1:8005}"
16  IDEM_KEY="example-idem-key-$(date +%s)"
17  
18  echo "============================================================"
19  echo "PraisonAI Idempotency Key Example"
20  echo "============================================================"
21  
22  # First submission
23  echo ""
24  echo "1. First submission with Idempotency-Key: $IDEM_KEY"
25  RESPONSE1=$(curl -s -X POST "$API_URL/api/v1/runs" \
26      -H "Content-Type: application/json" \
27      -H "Idempotency-Key: $IDEM_KEY" \
28      -d '{"prompt": "What is 1+1?"}')
29  
30  JOB_ID1=$(echo "$RESPONSE1" | python3 -c "import sys,json; print(json.load(sys.stdin)['job_id'])")
31  echo "   Job ID: $JOB_ID1"
32  
33  # Second submission with same key
34  echo ""
35  echo "2. Second submission with SAME Idempotency-Key: $IDEM_KEY"
36  RESPONSE2=$(curl -s -X POST "$API_URL/api/v1/runs" \
37      -H "Content-Type: application/json" \
38      -H "Idempotency-Key: $IDEM_KEY" \
39      -d '{"prompt": "Different prompt but same key"}')
40  
41  JOB_ID2=$(echo "$RESPONSE2" | python3 -c "import sys,json; print(json.load(sys.stdin)['job_id'])")
42  echo "   Job ID: $JOB_ID2"
43  
44  # Verify same job ID
45  echo ""
46  echo "3. Verification:"
47  if [ "$JOB_ID1" = "$JOB_ID2" ]; then
48      echo "   ✓ SUCCESS: Same job ID returned (no duplicate created)"
49  else
50      echo "   ✗ FAILURE: Different job IDs returned"
51      exit 1
52  fi
53  
54  echo ""
55  echo "============================================================"
56  echo "Idempotency example completed!"
57  echo "============================================================"