Python client library for Athena API - CSAM detection and content classification
Project description
Athena Client Library
This is a Python library for interacting with the Athena API (Resolver Unknown CSAM Detection).
Authentication
The Athena client supports two authentication methods:
Static Token Authentication
from resolver_athena_client.client.channel import create_channel
# Use a pre-existing authentication token
channel = create_channel(host="your-host", auth_token="your-token")
OAuth Credential Helper (Recommended)
The credential helper automatically handles OAuth token acquisition and refresh:
import asyncio
from resolver_athena_client.client.channel import CredentialHelper, create_channel_with_credentials
async def main():
# Create credential helper with OAuth settings
credential_helper = CredentialHelper(
client_id="your-oauth-client-id",
client_secret="your-oauth-client-secret",
auth_url="https://crispthinking.auth0.com/oauth/token", # Optional, this is default
audience="crisp-athena-live" # Optional, this is default
)
# Create channel with automatic OAuth handling
channel = await create_channel_with_credentials(
host="your-host",
credential_helper=credential_helper
)
asyncio.run(main())
Environment Variables
For the OAuth example to work, set these environment variables:
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-client-secret"
export ATHENA_HOST="your-athena-host"
OAuth Features
- Automatic token refresh: Tokens are automatically refreshed when they expire
- Thread-safe: Multiple concurrent requests will safely share cached tokens
- Error handling: Comprehensive error handling for OAuth failures
- Configurable: Custom OAuth endpoints and audiences supported
See examples/oauth_example.py for a complete working example.
Examples
examples/example.py- Basic classification example with static tokenexamples/oauth_example.py- OAuth authentication with credential helperexamples/create_image.py- Image generation utilities
TODO
Async pipelines
Make pipeline style invocation of the async interators such that we can
async read file -> async transform -> async classify -> async results
More async pipeline transformers
Add additional pipeline transformers for:
- Image format conversion
- Metadata extraction
- Error recovery and retry
Development
This package uses uv to manage its packages.
To install dependencies, run:
uv sync --dev
To build the package, run:
uv build
To run the standard tests, run:
pytest -m 'not functional'
Developers wishing to run the functional tests should see the Functional Tests section below.
To lint and format the code, run:
ruff check
ruff format
There are pre-commit hooks that will lint, format, and type check the code. Install them with:
pre-commit install
To re-compile the protobuf files, run from the repository's root directory:
bash scripts/compile_proto.sh
Functional Tests
Functional tests require an Athena environment to run against.
Pre-Requisites
You will need:
- An Athena host URL.
- An OAuth client ID and secret with access to the Athena environment.
- An affiliate with Athena enabled.
Preparing your environment
You can set up the environment variables in a .env file in the root of the
repository, or in your shell environment:
You must set the following variables:
ATHENA_HOST=your-athena-host (e.g. localhost:5001)
ATHENA_TEST_AFFILIATE=your-affiliate-id
OAUTH_CLIENT_ID=your-oauth-client-id
OAUTH_CLIENT_SECRET=your-oauth-client-secret
ATHENA_TEST_PLATFORM_TOKEN=a standard platform token - this should be rejected
as only athena specific tokens are accepted.
ATHENA_TEST_EXPIRED_TOKEN=a valid but expired token - this should be rejected.
You can optionally set the following variables:
OAUTH_AUTH_URL=your-oauth-auth-url (default: https://crispthinking.auth0.com/oauth/token)
OAUTH_AUDIENCE=your-oauth-audience (default: crisp-athena-live)
TEST_IMAGE_COUNT=number-of-images-to-test-with (default: 5000) - this is the
number of images the _streaming_ test will use.
TEST_MIN_INTERVAL=minimum-interval-in-ms (default: None, send as fast as
possible) - this is the minimum interval between
images for the _streaming_ test.
ATHENA_NON_EXISTENT_AFFILIATE=non-existent-affiliate-id (default:
thisaffiliatedoesnotexist123) - this is used to test error handling.
ATHENA_NON_PERMITTED_AFFILIATE=non-permitted-affiliate-id (default:
thisaffiliatedoesnothaveathenaenabled) - this is used to test error handling.
Then run the functional tests with:
pytest -m functional
To exclude the e2e tests, which require usage of the live classifier and therefore are unsuitable for regular development runs, use:
pytest -m 'functional and not e2e'
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file resolver_athena_client-1.3.0.tar.gz.
File metadata
- Download URL: resolver_athena_client-1.3.0.tar.gz
- Upload date:
- Size: 30.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1526e8e3e3f76622c6d23c0e621a33a223a607588a925d5682327ba0b6e685f
|
|
| MD5 |
b3fed0a667cdc6e8f9b7d2ed289d20ca
|
|
| BLAKE2b-256 |
a0bb0f65864083ddaeab9384d39b37eca417377dd1d7fc6680edfd2d78687442
|
File details
Details for the file resolver_athena_client-1.3.0-py3-none-any.whl.
File metadata
- Download URL: resolver_athena_client-1.3.0-py3-none-any.whl
- Upload date:
- Size: 41.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
811898e1e5a747631df9fbe5aa7498de915b0db7b26d8853300c0ddce882fb52
|
|
| MD5 |
391a4d1c95e2c5fe12e08e85b1d31428
|
|
| BLAKE2b-256 |
c9e229614bb3c420b7c8a44782139d1c1e60dc65e9b03d2517d5e9a16b572860
|