Skip to main content

Installation

pip install bijou

Quick Start

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

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

result = client.detect("path/to/image.jpg")

From Bytes

with open("image.jpg", "rb") as f:
    image_bytes = f.read()

result = client.detect(image_bytes)

From File Object

with open("image.jpg", "rb") as f:
    result = client.detect(f)

From Base64 String

import base64

with open("image.jpg", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

result = client.detect(b64)

From Path Object

from pathlib import Path

result = client.detect(Path("image.jpg"))

Detection Result

The DetectionResult object contains:
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

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, use AsyncBijouClient:
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:
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:
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:
export BIJOU_API_KEY=bijou_your-key
import os
from bijou import BijouClient

client = BijouClient(api_key=os.environ["BIJOU_API_KEY"])

Full Example

#!/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()