openai as an optional extra#
Status: Accepted
Date: 2026-05-29
Deciders: saia-python maintainers
Context and Problem Statement#
saia-python ships an OpenAI-compatibility layer (create_openai_client() and
the SAIAClient.openai / .openai_async properties) built on the openai SDK.
Everything else — chat, voice, ARCANA, documents, models, rate limits — speaks
the SAIA REST API directly through requests. Should openai be a mandatory
dependency of the whole package?
Originally it was: openai sat in the core dependencies and was imported at
package-import time (__init__ → openai_compat → import openai). That
contradicted the documentation, which described openai as optional and
promised a friendly ImportError — impossible when a missing openai breaks
import saia_python itself.
Decision Drivers#
The OpenAI layer is a single function; the native client never needs
openai.openaiis heavy (pullshttpx,pydantic,anyio, …).The documentation already promised an
[openai]extra and a graceful failure.Consistency with the existing
tqdmpattern (already imported lazily).
Considered Options#
Optional extra + lazy import — move
openaito[project.optional-dependencies]and import it insidecreate_openai_client().Keep it mandatory — leave
openaiin core deps and delete the “optional” wording from the docs.
Decision Outcome#
Chosen option: optional extra + lazy import. openai moved to an [openai]
extra (pip install saia-python[openai]); the import openai now lives inside
create_openai_client(), guarded by a try/except that raises a clear
ImportError with install instructions. The core package installs and imports
with just requests + tomlkit (+ tqdm).
Consequences#
Good — lean base install; the heavy SDK is opt-in.
Good — the documented behavior is now true, and the property-level lazy import finally has an effect.
Good — internally consistent with the
tqdmoptional-import pattern.Trade-off — a plain
pip install saia-pythonno longer providesclient.openai; users must add the extra. Mitigated by the explicitImportError, and thetestextra depends on[openai]so CI is unaffected.
Confirmation#
import saia_python no longer pulls openai into sys.modules (verified);
tests/test_openai_compat.py uses pytest.importorskip("openai") so the suite
is correct whether or not the extra is installed.
More Information#
If the OpenAI-compatibility layer ever becomes a headline, always-available
feature, the only change required is moving openai>=1.0 back to core
dependencies — the lazy import remains harmless. Relates to ADR-0003.