Python SDK for the iii engine. Use when building workers, registering functions, or invoking triggers in Python.
58
66%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/iii-python-sdk/SKILL.mdThe Python SDK for connecting sync and async workers to the iii engine.
Full API reference: https://iii.dev/docs/api-reference/sdk-python
pip install iii-sdk
| Export | Purpose |
|---|---|
register_worker(address, options?) | Connect to the engine and return the client |
InitOptions(...) | Worker name, timeout, headers, reconnect, telemetry |
iii.register_function(id, handler, **options) | Register a sync or async local handler |
iii.register_function(id, HttpInvocationConfig(...)) | Register an external HTTP endpoint as a function |
iii.register_trigger({ type, function_id, config, metadata? }) | Bind a trigger to a function |
iii.trigger(request) | Invoke a function synchronously |
await iii.trigger_async(request) | Invoke a function asynchronously |
iii.create_channel() / await iii.create_channel_async() | Create binary/text channels |
ChannelReader / ChannelWriter | Consume/write channel payloads |
get_context() | Access logger and trace context inside handlers |
Logger | Structured logs |
OtelConfig | OpenTelemetry options |
IIIInvocationError / IIIForbiddenError / IIITimeoutError | SDK error classes |
on_connection_state_change(callback) | Monitor connection state |
register_worker() returns a synchronous client.ApiResponse uses camelCase statusCode (pydantic alias), not status_codewhile True: await asyncio.sleep(60) to keep the event loop aliveasyncio.to_thread() for CPU-heavy sync work inside handlerstrigger_async(request) and a synchronous trigger(request). Use trigger_async inside async handlers, and trigger in synchronous scripts or threads where blocking behavior is desired.trigger() / trigger_async() and bind engine::functions-available with register_trigger(). See /docs/how-to/discover-workers-functions-triggers.from iii import HttpInvocationConfig
iii.register_function(
"orders::validate",
validate_order,
description="Validate an order",
metadata={"owner": "orders"},
)
iii.register_function(
"legacy::charge",
HttpInvocationConfig(
url="https://legacy.example.com/charge",
method="POST",
timeout_ms=5000,
auth={"type": "api_key", "header": "X-API-Key", "value_key": "LEGACY_API_KEY"},
),
)HTTP auth supports hmac, bearer, and api_key. Pass environment variable names in secret_key, token_key, or value_key, not raw secrets.
channel = iii.create_channel() in sync code.channel = await iii.create_channel_async() in async code.channel.reader_ref or channel.writer_ref through trigger payloads.ChannelWriter.write(bytes) sends binary chunks; send_message() sends text.ChannelReader supports read_all(), on_message(callback), and async iteration for incremental binary chunks.Catch IIIInvocationError for remote failures. IIIForbiddenError maps to FORBIDDEN; IIITimeoutError maps to TIMEOUT. All invocation errors expose code, message, function_id, stacktrace, and invocation_id when the engine provides them.
# Async invocation (non-blocking, typical inside handlers)
result = await iii.trigger_async({
"function_id": "greet",
"payload": {"name": "World"}
})
# Sync invocation (blocks the current thread, useful in sync contexts)
result = iii.trigger({
"function_id": "greet",
"payload": {"name": "World"}
})iii-functions-and-triggersiii-http-middlewareiii-channelsiii-error-handlingiii-node-sdkiii-rust-sdkiii-browser-sdkiii-python-sdk in the iii engine.a7ebbbb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.