Skip to main content

Python SDK for interacting with the CirtusAI backend API.

Project description

CirtusAI Python SDK

CirtusAI provides a lightweight Python wrapper around the CirtusAI backend API. It enables:

  • Exchanging API keys for access tokens;
  • Reading the identity linked to an API key;
  • Filtering mailbox content (folder, sender, unread flag, date range);
  • Sending messages with optional Base64 attachments;
  • Consistent error handling and session management.

Prerequisite: the backend must expose /api/auth/api-key/login and allow JWT access to mail endpoints.

Installation

pip install cirtusai

For local development inside this repository:

pip install -e ./sdk

Quick Start

from datetime import datetime, timedelta, timezone
from cirtusai import CirtusClient

client = CirtusClient(
    base_url="https://api.cirtusai.com",
    api_key="cai_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
)

# Read identity information
identity = client.get_identity()
print(identity.id, identity.credentials.signature_key)
for asset in identity.assets:
    print(asset.type, asset.address)

# Fetch unread messages from the past week
now = datetime.now(timezone.utc)
messages = client.list_messages(
    unread=True,
    start_date=now - timedelta(days=7),
)
for msg in messages:
    print(msg.subject, msg.created_at)

# Send a message
client.send_message(
    to=["teammate@example.com"],
    subject="Weekly summary",
    content="Please see attached report.",
)

Production vs local: Use https://api.cirtusai.com for production traffic. During development you can point base_url at your sandbox instance (for example http://127.0.0.1:8000) and keep the defaults for api_prefix (/api) and timeouts.

Configuration

CirtusClient accepts a few optional parameters for advanced scenarios:

  • api_prefix: change the API namespace if your deployment serves the backend under a different path.
  • timeout: override the default 10s request timeout.
  • session: supply a pre-configured requests.Session (proxy settings, retries, etc.).
  • auto_authenticate: set to False when you need to defer authentication and call authenticate() manually.

Every public method ensures a valid token is present and will automatically re-authenticate if the server indicates expiration.

Filtering Mail

list_messages supports inline keyword arguments or an explicit MessageFilters object if you prefer strong typing:

from datetime import datetime, timezone
from cirtusai import CirtusClient, MessageFilters

client = CirtusClient(base_url="https://api.cirtusai.com", api_key="cai_...")

last_week = datetime.now(timezone.utc) - timedelta(days=7)
filters = MessageFilters(folder="inbox", unread=True, start_date=last_week, limit=50)

messages = client.list_messages(filters=filters)

You can mix and match: passing folder, sender, unread, start_date, end_date, or limit directly to list_messages will automatically build the same filter payload.

Attachments

Attach Base64 encoded content along with file metadata. You can optionally supply content_type to hint MIME information to downstream systems:

import base64
from cirtusai import Attachment, CirtusClient

client = CirtusClient(base_url="https://api.cirtusai.com", api_key="cai_...")
content = base64.b64encode(b"example").decode()
attachment = Attachment(
    filename="demo.txt",
    content=content,
    size=len(content),
    content_type="text/plain",
)

client.send_message(
    to=["recipient@example.com"],
    subject="Demo",
    content="Sample with attachment",
    attachments=[attachment],
)

Read State & Cleanup

The client exposes helpers for day-to-day mailbox maintenance:

client.set_read_state(ids=[101, 102], unread=False)
client.delete_messages(ids=[203, 204])

Both methods accept any iterable of numeric message IDs and raise if you accidentally pass an empty list so you do not trigger no-op API calls.

Error Handling

The SDK raises a small hierarchy of exceptions:

  • AuthenticationError: API key invalid or session expired;
  • APIError: non-2xx responses with structured error details;
  • CirtusSDKError: networking or client side failures.
from cirtusai import AuthenticationError, APIError

try:
    client.list_messages()
except AuthenticationError:
    client.authenticate(force=True)
except APIError as exc:
    print("Request failed", exc.status_code, exc.detail)

Publishing

To cut a new release:

  1. Update pyproject.toml with the new semantic version.

  2. Install build tooling if needed: python -m pip install --upgrade build twine.

  3. Run the test suite: pytest.

  4. Build and verify the artifacts:

    python -m build
    python -m twine check dist/*
    
  5. Upload to PyPI (requires TWINE_USERNAME/TWINE_PASSWORD or an API token):

    python -m twine upload dist/*
    

Tests

pytest

Tests rely on unittest.mock to stub HTTP behaviour and can run in CI without network access.

Contributing

  1. Fork and clone the repository;
  2. Install dependencies: pip install -e ./sdk[dev];
  3. Ensure pytest passes before submitting pull requests.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cirtusai-0.1.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cirtusai-0.1.0-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file cirtusai-0.1.0.tar.gz.

File metadata

  • Download URL: cirtusai-0.1.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cirtusai-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9b338b799fd9fdb83bc4accc5235a7f9066822c612034d139ac95b23772ac15d
MD5 e3f2694863887d9ab1ddbdbfbd8c4fdc
BLAKE2b-256 245076163647cc93d6677f5179127fd35f2ae59f34b0c9fbc3c40e3f91a0f8f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for cirtusai-0.1.0.tar.gz:

Publisher: publish.yml on CirtusAI/Cirtus-SDK

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cirtusai-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: cirtusai-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for cirtusai-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6c553e1b94c482e33939d6356262fe307a95057293d992140b937b35988006b0
MD5 6f8c8c3ed1bdeeb28f2a6dcba6e70585
BLAKE2b-256 32fd9825c045c1989a35ac63b2f98e757bea07319101207c9261ea2f2acb468f

See more details on using hashes here.

Provenance

The following attestation bundles were made for cirtusai-0.1.0-py3-none-any.whl:

Publisher: publish.yml on CirtusAI/Cirtus-SDK

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page