A python client for Radiant AI's Stears Project API
Project description
Stears project Python client for Radiant Polaris server
A lightweight, idiomatic wrapper around the Stears Project Polaris Server REST API, covering every public endpoint exposed by the service. Available in both synchronous and asynchronous variants.
Features
| Capability | Sync Method | Async Method | HTTP Endpoint |
|---|---|---|---|
| Health check | client.health_check() |
await client.health_check() |
GET /health |
| List available artifacts | client.get_artifacts() |
await client.get_artifacts() |
GET /v1/artifacts |
| Extract transactions (URLs only) | client.extract_transactions(artifact_name, urls=[...]) |
await client.extract_transactions(artifact_name, urls=[...]) |
POST /v1/artifacts/{artifact_name}/extract-transactions |
| Get call status and details | client.get_call(call_id) |
await client.get_call(call_id) |
GET /v1/calls/{call_id} |
| Wait for call completion | client.wait_for_completion(call_id) |
await client.wait_for_completion(call_id) |
Polls GET /v1/calls/{call_id} until completion |
All responses are returned as plain Python dictionaries.
Installation
# From PyPI
pip install radiant-client
# Or directly from the repository
pip install -e .
Requirements
For synchronous client:
- Python 3.9+
requestsandpython-dotenv(installed automatically)
For asynchronous client:
- Python 3.9+
aiohttpandpython-dotenv(installed automatically)
Quick start
Synchronous Client
-
Add your API key to a local
.envfile (never commit this!)API_KEY=YOUR_REAL_KEY_HERE
-
Use the sync client
from radiant_client import Client client = Client() # reads the key from .env print(client.health_check()) # {"status": "UP"} print(client.get_artifacts()) # {"artifacts": ["transaction-extractor", …]} # Start extraction data = client.extract_transactions( "transaction-extractor", urls=[ "https://example.com/statement1", "https://example.com/statement2", ], ) print(data) # → {"action_call": "call_id_here"} # Wait for completion result = client.wait_for_completion(data["action_call"]) print(result) # → final extraction results
Asynchronous Client
-
Add your API key to a local
.envfile (never commit this!)API_KEY=YOUR_REAL_KEY_HERE
-
Use the async client
import asyncio from radiant_client import AsyncClient async def main(): # Recommended: use as context manager async with AsyncClient() as client: print(await client.health_check()) # {"status": "UP"} print(await client.get_artifacts()) # {"artifacts": ["transaction-extractor", …]} # Start extraction data = await client.extract_transactions( "transaction-extractor", urls=[ "https://example.com/statement1", "https://example.com/statement2", ], ) print(data) # → {"action_call": "call_id_here"} # Wait for completion result = await client.wait_for_completion(data["action_call"]) print(result) # → final extraction results # Session automatically closed asyncio.run(main())
Alternative: manual session management
async def main(): client = AsyncClient() try: health = await client.health_check() print(health) finally: await client.close() # Important: close the session asyncio.run(main())
Environment configuration
| Variable | Purpose | Default |
|---|---|---|
API_KEY |
Your Radiant Stears project API key | None (required) |
BASE_URL |
Alternative server root (e.g., staging) | None (required) |
Constructor options
Synchronous client (Client):
client = Client(
api_key="optional_override",
base_url="https://custom.server.com",
timeout=30,
session=custom_requests_session # Optional pre-configured requests.Session
)
Asynchronous client (AsyncClient):
client = AsyncClient(
api_key="optional_override",
base_url="https://custom.server.com",
timeout=30,
session=custom_aiohttp_session # Optional pre-configured aiohttp.ClientSession
)
Waiting for completion
Both sync and async clients provide convenience methods to poll for call completion:
# Synchronous
result = client.wait_for_completion(
call_id,
poll_interval=2.0, # seconds between checks
max_wait_time=300.0 # maximum time to wait
)
# Asynchronous
result = await client.wait_for_completion(
call_id,
poll_interval=2.0, # seconds between checks
max_wait_time=300.0 # maximum time to wait
)
Error handling
Any non‑2xx response raises ClientError with the HTTP status code and the server's JSON/text body for easy debugging.
Synchronous:
from radiant_client import Client, ClientError
try:
client.get_call("nonexistent")
except ClientError as err:
print(err) # "GET https://… returned 404: {\"code\":404,…}"
Asynchronous:
from radiant_client import AsyncClient, ClientError
try:
await client.get_call("nonexistent")
except ClientError as err:
print(err) # "GET https://… returned 404: {\"code\":404,…}"
Advanced usage
Synchronous client
- Retries / Back‑off – supply a
requests.Sessionwith anHTTPAdapterconfigured for retries. - Custom headers – configure a
requests.Sessionwith default headers. - Logging – all request details are available; hook in your own logging by subclassing and overriding
_request().
Asynchronous client
- Connection pooling – supply a pre-configured
aiohttp.ClientSessionwith custom connector settings. - Custom timeouts – configure different timeouts for connection, read, etc.
- Retries – use
aiohttp-retryor similar libraries with a custom session. - Concurrent requests – use
asyncio.gather()orasyncio.as_completed()for parallel operations:
async def fetch_multiple_calls():
async with AsyncClient() as client:
tasks = [
client.get_call(call_id)
for call_id in ["call1", "call2", "call3"]
]
results = await asyncio.gather(*tasks)
return results
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
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 radiant_client-0.1.3.tar.gz.
File metadata
- Download URL: radiant_client-0.1.3.tar.gz
- Upload date:
- Size: 8.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.13.1 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bf56a9efd5adeb96729bd7c2bb74f58198a326eb30ebb3e419ec222108b5d90
|
|
| MD5 |
72015b1530560148f37c0f59e66568c1
|
|
| BLAKE2b-256 |
70e2276af656197f73062363207a267d8a9b2b01d6af3e5d96667d5c1e2597ae
|
File details
Details for the file radiant_client-0.1.3-py3-none-any.whl.
File metadata
- Download URL: radiant_client-0.1.3-py3-none-any.whl
- Upload date:
- Size: 7.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.13.1 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd9f3742c6284637c1508e314879b96e9509790f2467406f2bde74f55263a89c
|
|
| MD5 |
97553858ad84ad32cd2b263c29a96287
|
|
| BLAKE2b-256 |
f360f7e35ee5046eb14bc4578142703fbd744eaeb3fda5ccc62540fa2786de08
|