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 services | client.get_services() |
await client.get_services() |
GET /v1/services |
| Extract transactions (URLs or free text) | client.extract_transactions(service_name, urls=[...]) or client.extract_transactions(service_name, text="…") |
await client.extract_transactions(service_name, urls=[...]) or await client.extract_transactions(service_name, text="…") |
POST /v1/service/{service_name}/extract-transactions |
| Track a long‑running task | client.get_task_status(task_id) |
await client.get_task_status(task_id) |
GET /v1/task/{task_id}/status |
| List resources by type | client.get_resources("task") |
await client.get_resources("task") |
GET /v1/resources/{resource_type} |
| Delete a resource | client.delete_resource("task", "my‑task") |
await client.delete_resource("task", "my‑task") |
POST /v1/resource/{resource_type}/{resource_name}/delete |
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 polaris_client import Client client = Client() # reads the key from .env print(client.health_check()) # {"status": "UP"} print(client.get_services()) # {"services": ["transaction-extractor", …]} data = client.extract_transactions( "transaction-extractor", urls=[ "https://example.com/statement1", "https://example.com/statement2", ], ) print(data) # → {"task_id": "…"}
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 polaris_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_services()) # {"services": ["transaction-extractor", …]} data = await client.extract_transactions( "transaction-extractor", urls=[ "https://example.com/statement1", "https://example.com/statement2", ], ) print(data) # → {"task_id": "…"} # 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 |
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
)
Handling resource types
# Both sync and async clients support the same resource type handling
client.get_resources("task") # simple string
client.get_resources(ResourceType.TASK) # safer enum‑like helper
# Async version
await async_client.get_resources("task")
await async_client.get_resources(ResourceType.TASK)
Valid values: agent, namespace, profile, task, cron_task, service, component, context_manager, provider, model, server, resource.
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 polaris_client import Client, ClientError
try:
client.delete_resource("task", "nonexistent")
except ClientError as err:
print(err) # "POST https://… returned 404: {\"code\":404,…}"
Asynchronous:
from polaris_client import AsyncClient, ClientError
try:
await client.delete_resource("task", "nonexistent")
except ClientError as err:
print(err) # "POST 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_services():
async with AsyncClient() as client:
tasks = [
client.get_task_status(task_id)
for task_id in ["task1", "task2", "task3"]
]
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.2.tar.gz.
File metadata
- Download URL: radiant_client-0.1.2.tar.gz
- Upload date:
- Size: 8.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.13.1 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfc880dd003e309ec0aa844c7a7c4dd9a1b5fd264b85e90f5d958f7d9b173a51
|
|
| MD5 |
8df705451366abf6c617121e01090e83
|
|
| BLAKE2b-256 |
5e43c48cdb647729079a293bea1c629ae5dba7387a38d92201de9ce01ddd792a
|
File details
Details for the file radiant_client-0.1.2-py3-none-any.whl.
File metadata
- Download URL: radiant_client-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.13.1 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c2c278977aa855b8f02b8ba4534382de23f983b60ca9a81e20fce6553767052
|
|
| MD5 |
78cac6ae515de237b460c1cd2be1138c
|
|
| BLAKE2b-256 |
c7fbc1e54ba4bc5bb2947884f73503af0e1828683a05fe66f07aea38c5bbe8f2
|