Skip to main content

What changed

The three SDKs are aligned so the same concept has the same name everywhere. This slice renames several public types and removes redundant or dead exports. Behavior is unchanged; the wire format is unchanged.

Renames

ConceptBeforeAfter
Main client handleNode ISdk, Rust IIIIIIClient (all three)
Telemetry configRust WorkerTelemetryMetaTelemetryOptions
Buffered HTTP request and responseApiRequest, ApiResponseHttpRequest, HttpResponse
Stream change event (Rust)StreamCallRequestStreamChangeEvent
Stream join and leave event (Rust)StreamJoinLeaveCallRequestStreamJoinLeaveEvent
Stream change event detailRust StreamEventDetail, Node inline objectStreamChangeEventDetail (all three)
Stream set resultRust SetResultStreamSetResult (all three)
Stream update resultRust UpdateResultStreamUpdateResult (all three)
Stream delete resultRust and Node DeleteResultStreamDeleteResult (all three)
The streaming request and response types keep the StreamRequest and StreamResponse names. The buffered types reclaim the HttpRequest and HttpResponse names from them. EngineFunctions and EngineTriggers are now present in the Python and Rust SDKs as well, not only Node. MergePath (the path argument for merge and append update operations) is now a named export in all three SDKs.

Removals

RemovedSDKReplacement
UpdateBuilderRustuse UpdateSet and UpdateMerge directly
Value re-exportRustdepend on serde_json directly
IIIForbiddenError, IIITimeoutErrorPythoncheck the error code on the invocation error, matching Node and Rust
TriggerActionType aliasNodeuse the TriggerAction value
FieldPath (separate path helper)Rustuse UpdateSet and UpdateMerge; the merge and append path argument is the retained MergePath
Logger re-exportNodeimport from @iii-dev/helpers/observability
OpenTelemetry suite re-exportPythonimport from iii_helpers.observability

Migration

Update any imports that reference the old names. The renames are mechanical. For the removed Python error subclasses, branch on the error code instead of catching the dedicated subclass:
# Before
try:
    ...
except IIIForbiddenError:
    ...
# After
except InvocationError as err:
    if err.code == "forbidden":
        ...

Why

A flat, divergent surface made the SDKs harder to learn and harder to keep in sync. Aligning the names so the same import means the same thing in every language, and dropping exports that duplicated functionality available elsewhere, makes the surface smaller and predictable.