Installation
Copy
pip install bijou
Quick Start
Copy
from bijou import BijouClient
# Initialize the client
client = BijouClient(api_key="bijou_your-key")
# Detect an image
result = client.detect("path/to/image.jpg")
print(f"Prediction: {result.prediction}")
print(f"Confidence: {result.confidence:.1%}")
print(f"Verdict: {result.verdict}")
Client Options
Copy
from bijou import BijouClient
client = BijouClient(
api_key="bijou_your-key", # Required
base_url="https://api.trybijou.com/v1", # Optional, defaults to production
timeout=30.0, # Optional, request timeout in seconds
max_retries=3, # Optional, retry attempts for failed requests
)
Detection Methods
From File Path
Copy
result = client.detect("path/to/image.jpg")
From Bytes
Copy
with open("image.jpg", "rb") as f:
image_bytes = f.read()
result = client.detect(image_bytes)
From File Object
Copy
with open("image.jpg", "rb") as f:
result = client.detect(f)
From Base64 String
Copy
import base64
with open("image.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
result = client.detect(b64)
From Path Object
Copy
from pathlib import Path
result = client.detect(Path("image.jpg"))
Detection Result
TheDetectionResult object contains:
Copy
result.prediction # "ai", "real", or "uncertain"
result.confidence # float (0.0 - 1.0)
result.ensemble_score # float (0.0 - 1.0)
result.verdict # "ai_generated", "likely_real", or "uncertain"
result.models_succeeded # int
result.models_total # int
result.model_results # dict of individual model scores
result.detection_latency_ms # int
Error Handling
Copy
from bijou import (
BijouClient,
BijouAPIError,
BijouInsufficientCreditsError,
BijouRateLimitError,
BijouValidationError,
BijouTimeoutError,
)
client = BijouClient(api_key="bijou_your-key")
try:
result = client.detect("image.jpg")
except BijouInsufficientCreditsError as e:
print(f"Out of credits: {e.message}")
except BijouRateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except BijouValidationError as e:
print(f"Invalid input: {e.message}")
except BijouTimeoutError as e:
print(f"Request timed out after {e.timeout_ms}ms")
except BijouAPIError as e:
print(f"API error: {e.message} (HTTP {e.status_code})")
Async Client
For async applications, useAsyncBijouClient:
Copy
import asyncio
from bijou import AsyncBijouClient
async def main():
async with AsyncBijouClient(api_key="bijou_your-key") as client:
result = await client.detect("image.jpg")
print(f"Prediction: {result.prediction}")
asyncio.run(main())
Batch Detection
Process multiple images efficiently:Copy
from bijou import BijouClient
from pathlib import Path
client = BijouClient(api_key="bijou_your-key")
# Submit batch job
images = list(Path("images/").glob("*.jpg"))
job = client.detect_batch(images)
print(f"Job ID: {job.job_id}")
# Wait for results
results = client.wait_for_batch(job.job_id)
for result in results.results:
print(f"{result.prediction}: {result.confidence:.1%}")
Context Manager
The client can be used as a context manager:Copy
from bijou import BijouClient
with BijouClient(api_key="bijou_your-key") as client:
result = client.detect("image.jpg")
print(result.prediction)
# Client is automatically closed
Environment Variables
You can set your API key via environment variable:Copy
export BIJOU_API_KEY=bijou_your-key
Copy
import os
from bijou import BijouClient
client = BijouClient(api_key=os.environ["BIJOU_API_KEY"])
Full Example
Copy
#!/usr/bin/env python3
"""
Bijou AI Detection Example
"""
import os
from pathlib import Path
from bijou import BijouClient, BijouInsufficientCreditsError
def main():
# Initialize client
api_key = os.environ.get("BIJOU_API_KEY")
if not api_key:
print("Set BIJOU_API_KEY environment variable")
return
client = BijouClient(api_key=api_key)
# Process images
image_dir = Path("test_images")
for image_path in image_dir.glob("*.jpg"):
try:
result = client.detect(image_path)
status = "🤖 AI" if result.prediction == "ai" else "📷 Real"
print(f"{image_path.name}: {status} ({result.confidence:.1%})")
# Show individual model scores
for model, data in result.model_results.items():
print(f" {model}: {data['score']:.2f}")
except BijouInsufficientCreditsError:
print("Out of credits! Buy more at trybijou.com/profile")
break
if __name__ == "__main__":
main()