Python Integration¶
This guide covers integrating SIX into Python applications using the requests library and the OpenAI client library.
Prerequisites¶
Set your environment variables:
Method 1: Using requests¶
The most direct approach. Full control over the request and response.
Basic Request¶
import os
import requests
SIX_API_KEY = os.environ["SIX_API_KEY"]
SIX_ENDPOINT = os.environ["SIX_ENDPOINT"]
response = requests.post(
f"{SIX_ENDPOINT}/v1/chat/completions",
headers={
"Authorization": f"Bearer {SIX_API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "default",
"messages": [
{"role": "user", "content": "Summarize HIPAA Section 164.312"}
],
}
)
response.raise_for_status()
data = response.json()
# AI response
content = data["choices"][0]["message"]["content"]
print(content)
# Cryptographic receipt
receipt = data["receipt"]
print(f"Receipt ID: {receipt['receipt_id']}")
print(f"Verified: {receipt['verified']}")
With Privacy Tier¶
response = requests.post(
f"{SIX_ENDPOINT}/v1/chat/completions",
headers={
"Authorization": f"Bearer {SIX_API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "default",
"messages": [
{"role": "system", "content": "You are a compliance assistant."},
{"role": "user", "content": "What are the key SOX 404 requirements?"}
],
"privacy_tier": "sovereign",
}
)
data = response.json()
assert data["receipt"]["routing"] == "sovereign"
Method 2: Using the OpenAI Client¶
If you already use the OpenAI Python client, switch to SIX with two lines:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["SIX_API_KEY"],
base_url=f"{os.environ['SIX_ENDPOINT']}/v1",
)
response = client.chat.completions.create(
model="default",
messages=[
{"role": "user", "content": "Summarize HIPAA Section 164.312"}
],
)
print(response.choices[0].message.content)
Privacy Tier with OpenAI Client¶
Use extra_body to pass SIX-specific fields:
response = client.chat.completions.create(
model="default",
messages=[
{"role": "user", "content": "What are the key SOX 404 requirements?"}
],
extra_body={"privacy_tier": "sovereign"},
)
Receipt Access with OpenAI Client
The OpenAI client library may not directly expose the receipt field on the response object. Access it via the raw response or use the requests library for full receipt access.
Handling Receipts¶
Extracting and Storing Receipts¶
import json
from datetime import datetime
def make_inference(prompt, privacy_tier="standard"):
"""Make an inference and return both content and receipt."""
response = requests.post(
f"{SIX_ENDPOINT}/v1/chat/completions",
headers={
"Authorization": f"Bearer {SIX_API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "default",
"messages": [{"role": "user", "content": prompt}],
"privacy_tier": privacy_tier,
}
)
response.raise_for_status()
data = response.json()
return {
"content": data["choices"][0]["message"]["content"],
"receipt": data["receipt"],
"timestamp": datetime.utcnow().isoformat(),
}
# Usage
result = make_inference(
"Summarize HIPAA Section 164.312",
privacy_tier="sovereign"
)
# Store receipt for audit trail
with open(f"receipts/{result['receipt']['receipt_id']}.json", "w") as f:
json.dump(result["receipt"], f, indent=2)
Verifying Receipts¶
def verify_receipt(receipt_id):
"""Verify a receipt via the SIX API."""
response = requests.get(
f"{SIX_ENDPOINT}/v1/verify/{receipt_id}",
headers={"Authorization": f"Bearer {SIX_API_KEY}"},
)
response.raise_for_status()
result = response.json()
return {
"receipt_id": receipt_id,
"status": result["status"],
"integrity": result["attestation"]["integrity"],
"settlement": result["attestation"]["settlement"],
"verified_at": result["verified_at"],
}
# Verify after inference
verification = verify_receipt(result["receipt"]["receipt_id"])
print(f"Status: {verification['status']}")
print(f"Integrity: {verification['integrity']}")
Batch Verification¶
import os
import glob
def verify_all_receipts(receipts_dir="receipts/"):
"""Verify all stored receipts and generate an audit report."""
results = []
for filepath in glob.glob(os.path.join(receipts_dir, "rcpt_*.json")):
with open(filepath) as f:
receipt = json.load(f)
verification = verify_receipt(receipt["receipt_id"])
results.append(verification)
verified = [r for r in results if r["status"] == "verified"]
failed = [r for r in results if r["status"] != "verified"]
print(f"Total: {len(results)}")
print(f"Verified: {len(verified)}")
print(f"Failed: {len(failed)}")
if failed:
print("\nFailed receipts:")
for r in failed:
print(f" {r['receipt_id']}: {r['status']}")
return results
Error Handling¶
HTTP Errors¶
from requests.exceptions import HTTPError, ConnectionError, Timeout
def safe_inference(prompt, privacy_tier="standard", retries=3):
"""Make an inference with error handling and retries."""
for attempt in range(retries):
try:
response = requests.post(
f"{SIX_ENDPOINT}/v1/chat/completions",
headers={
"Authorization": f"Bearer {SIX_API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "default",
"messages": [{"role": "user", "content": prompt}],
"privacy_tier": privacy_tier,
},
timeout=30,
)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 5))
print(f"Rate limited. Waiting {retry_after}s...")
import time
time.sleep(retry_after)
continue
response.raise_for_status()
return response.json()
except ConnectionError:
print(f"Connection failed (attempt {attempt + 1}/{retries})")
if attempt == retries - 1:
raise
except Timeout:
print(f"Request timed out (attempt {attempt + 1}/{retries})")
if attempt == retries - 1:
raise
except HTTPError as e:
if e.response.status_code >= 500:
print(f"Server error (attempt {attempt + 1}/{retries})")
if attempt == retries - 1:
raise
else:
# Client errors (4xx) should not be retried
raise
return None
API Error Responses¶
def handle_error(response):
"""Parse and handle SIX API error responses."""
if response.status_code >= 400:
error = response.json().get("error", {})
error_type = error.get("type", "unknown")
message = error.get("message", "No message provided")
if error_type == "unauthorized":
print("Check your API key.")
elif error_type == "rate_limited":
print(f"Rate limited: {message}")
elif error_type == "bad_request":
print(f"Invalid request: {message}")
else:
print(f"Error ({error_type}): {message}")
return False
return True
Complete Example¶
A full working example that makes an inference, stores the receipt, and verifies it:
import os
import json
import requests
from datetime import datetime
# Configuration
SIX_API_KEY = os.environ["SIX_API_KEY"]
SIX_ENDPOINT = os.environ["SIX_ENDPOINT"]
RECEIPTS_DIR = "receipts"
os.makedirs(RECEIPTS_DIR, exist_ok=True)
def main():
# 1. Make inference
print("Making inference...")
response = requests.post(
f"{SIX_ENDPOINT}/v1/chat/completions",
headers={
"Authorization": f"Bearer {SIX_API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "default",
"messages": [
{"role": "user", "content": "What are HIPAA technical safeguards?"}
],
"privacy_tier": "sovereign",
},
timeout=30,
)
response.raise_for_status()
data = response.json()
# 2. Use the response
content = data["choices"][0]["message"]["content"]
print(f"Response: {content[:200]}...")
# 3. Store the receipt
receipt = data["receipt"]
receipt_path = os.path.join(RECEIPTS_DIR, f"{receipt['receipt_id']}.json")
with open(receipt_path, "w") as f:
json.dump({
"receipt": receipt,
"prompt_summary": "HIPAA technical safeguards query",
"stored_at": datetime.utcnow().isoformat(),
}, f, indent=2)
print(f"Receipt stored: {receipt_path}")
# 4. Verify the receipt
print("Verifying receipt...")
verify_resp = requests.get(
f"{SIX_ENDPOINT}/v1/verify/{receipt['receipt_id']}",
headers={"Authorization": f"Bearer {SIX_API_KEY}"},
timeout=10,
)
verify_resp.raise_for_status()
result = verify_resp.json()
print(f"Status: {result['status']}")
print(f"Routing: {result['receipt']['routing']}")
print(f"Integrity: {result['attestation']['integrity']}")
print(f"Settlement: {result['attestation']['settlement']}")
if __name__ == "__main__":
main()
Next Steps¶
- cURL Integration -- Command-line examples
- Receipt Format -- Understand receipt fields
- Verification Guide -- Detailed verification walkthrough
- Compliance Guides -- Framework-specific requirements