slimfaas-client
Python client to connect Jobs or virtual functions to SlimFaas via WebSocket. Lets any process receive async requests and publish/subscribe events without exposing an HTTP port.
Links:
- PyPI package: https://pypi.org/project/slimfaas-client
- GitHub repository: https://github.com/SlimPlanet/SlimFaas
- SlimFaas website: https://slimfaas.dev/
Requirements
- Python ≥ 3.10
- UV as package manager
Installation
uv add slimfaas-client
# or from source
uv pip install -e .
Quick start
import asyncio
from slimfaas_client import (
SlimFaasClient, SlimFaasClientConfig,
SubscribeEventConfig, FunctionVisibility,
AsyncRequest, PublishEvent,
)
async def handle_request(req: AsyncRequest) -> int:
"""Called when SlimFaas sends an async-function request.
Return an HTTP status code (200 = success, 500 = error, 202 = long processing)."""
print(f"{req.method} {req.path}{req.query}")
print(f"Body: {req.body}")
return 200
async def handle_event(evt: PublishEvent) -> None:
"""Called when SlimFaas publishes a publish-event."""
print(f"Event '{evt.event_name}': {evt.body}")
async def main():
config = SlimFaasClientConfig(
function_name="my-job",
subscribe_events=[
SubscribeEventConfig(name="order-created"),
SubscribeEventConfig(name="order-updated"),
],
default_visibility=FunctionVisibility.PUBLIC,
number_parallel_request=5,
)
async with SlimFaasClient("ws://slimfaas:5003/ws", config) as client:
client.on_async_request(handle_request)
client.on_publish_event(handle_event)
await client.run_forever()
asyncio.run(main())
Full configuration
from slimfaas_client import (
SlimFaasClientConfig, SubscribeEventConfig, PathVisibilityConfig,
FunctionVisibility, FunctionTrust,
)
config = SlimFaasClientConfig(
function_name="my-job",
# SlimFaas/DependsOn
depends_on=["other-function"],
# SlimFaas/SubscribeEvents — each entry may override visibility individually
subscribe_events=[
SubscribeEventConfig(name="my-event", visibility=FunctionVisibility.PUBLIC),
SubscribeEventConfig(name="internal-event"), # inherits default_visibility
],
# SlimFaas/DefaultVisibility
default_visibility=FunctionVisibility.PUBLIC, # or PRIVATE
# SlimFaas/PathsStartWithVisibility
paths_start_with_visibility=[
PathVisibilityConfig(path="/admin", visibility=FunctionVisibility.PRIVATE),
],
# SlimFaas/Configuration
configuration='{"key": "value"}',
# SlimFaas/ReplicasStartAsSoonAsOneFunctionRetrieveARequest
replicas_start_as_soon_as_one_function_retrieve_a_request=True,
# SlimFaas/NumberParallelRequest
number_parallel_request=10,
# SlimFaas/NumberParallelRequestPerPod
number_parallel_request_per_pod=5,
# SlimFaas/DefaultTrust
default_trust=FunctionTrust.TRUSTED, # or UNTRUSTED
)
Sync streaming (HTTP-over-WebSocket)
from slimfaas_client import SyncRequest
async def handle_sync(req: SyncRequest) -> None:
body = b'{"status": "ok"}'
await req.response.start(200, {"Content-Type": ["application/json"]})
await req.response.write(body)
await req.response.complete()
client.on_sync_request(handle_sync)
Long-running requests (status 202)
Return 202 to acknowledge the request without completing it yet,
then call send_callback when done:
async def handle_long(req: AsyncRequest) -> int:
asyncio.create_task(process_in_background(req))
return 202 # "I'll handle it — will call back"
async def process_in_background(req: AsyncRequest) -> None:
await asyncio.sleep(10)
await client.send_callback(req.element_id, 200)
Dependency injection
The handlers are plain async functions, so you can close over any dependency you resolved from your DI framework:
# Example with a database session from SQLAlchemy
from sqlalchemy.ext.asyncio import AsyncSession
async def make_handler(session: AsyncSession):
async def handle_request(req: AsyncRequest) -> int:
await session.execute(...) # use the injected session
return 200
return handle_request
client.on_async_request(await make_handler(db_session))
Automatic reconnection
The client reconnects automatically after a disconnection. Configure the delay between attempts and the keepalive ping interval:
client = SlimFaasClient(
"ws://...",
config,
reconnect_delay=10.0,
ping_interval=30.0, # use 0 to disable keepalive pings
)
Important rules
-
function_namemust not match an existing Kubernetes Deployment name. SlimFaas will reject the registration with aSlimFaasRegistrationError. -
All clients sharing the same
function_namemust have the exact same configuration. Mismatches are rejected on connection.
Development
uv sync --extra dev
uv run pytest
Metadata
Release files for slimfaas-client 0.86.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| slimfaas_client-0.86.4.tar.gz | 79.7 kB | Without provenance | Details for slimfaas_client-0.86.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| slimfaas_client-0.86.4-py3-none-any.whl | Python 3 | none | any | Details for slimfaas_client-0.86.4-py3-none-any.whl |
Total release size: 92.9 kB
Release files / slimfaas_client-0.86.4.tar.gz
| Download URL | slimfaas_client-0.86.4.tar.gz |
|---|---|
| Size | 79.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24bd8291613f3675d81f18bf8fc59b52452ede61750e5dd16784633c4e6c44b3
|
|
BLAKE2b-256 checksum How to use checksums |
1349da5a4f2c37845f4c533c34b1647d108d9be523aba62bd369d9d5c819b23d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / slimfaas_client-0.86.4-py3-none-any.whl
| Download URL | slimfaas_client-0.86.4-py3-none-any.whl |
|---|---|
| Size | 13.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e9d0bde4092500148c38aa99ed6781bbc27299cc109c2b3ec051d152d208a4d9
|
|
BLAKE2b-256 checksum How to use checksums |
f76484f73571c914586efd66bfbf4b2df29e8911e6e9d41497658fcdf70d2d30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for slimfaas-client 0.86.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.