0.2.0: new
omnibioaipackage. This SDK is migrating to a unified, ecosystem-wide client under a new import path:from omnibioai import OmniBioAI client = OmniBioAI(access_token="jwt-token") result = client.rag.query("BRCA1 pathway analysis")
OmniBioAIhandles token refresh and error normalization across OmniBioAI services..rag,.models,.tes, and.workflowsare all available now. Noteclient.modelsis task-scoped (client.models.get(task, ref)), not a bare-name lookup --omnibioai-model-registry's actual API has no cross-task name search, so the SDK mirrors its real shape rather than the target example's simplified one..tes(low-level tool execution, e.g.client.tes.submit(tool_id, inputs={...})) and.workflows(high-level named pipelines, e.g.client.workflows.run(workflow_name, inputs={})) are deliberately kept as two separate clients -- see each client's own module docstring..workflows's target service (omnibioai-workflow-bundles) has no confirmed API Gateway route yet; passworkflows_url=explicitly until it does. Nothing existing breaks: the object-registry client documented below is unchanged and fully supported, importable from eitheromnibioai_sdk(as before) oromnibioai(from omnibioai import OmniClient) -- both resolve to the exact same class.
OmniBioAI SDK is a lightweight Python client for interacting with the OmniBioAI platform APIs, including:
- Object Registry (datasets, studies, jobs, workflows)
- Development APIs (
/api/dev/*) - Jupyter-based interactive analysis workflows
The SDK is intentionally thin and explicit — it does not hide API behavior and is designed to evolve alongside the OmniBioAI platform.
- Simple Python client (
OmniClient) - Works with local OmniBioAI development servers
- No Docker required
- Designed for notebooks, scripts, and pipelines
- Explicit auth and base URL control
- Easy to extend with new API endpoints
# From GitHub Packages (requires token with read:packages scope)
pip install omnibioai-sdk \
--index-url https://pip.pkg.github.com/OmniBioAI/simple/
# Or directly from GitHub
pip install git+https://github.com/OmniBioAI/omnibioai-sdk.git
# Or locally during development
pip install -e .Note:
omnibioai-sdkis not currently published to PyPI. Install from GitHub or use the local editable install during development.
from omnibioai_sdk import OmniClient
c = OmniClient(
base_url="http://127.0.0.1:8080", # api-gateway
token="your-jwt-token" # obtain via POST /auth/login
)
objects = c.objects_list()
print(objects["count"])Note: All requests go through
api-gateway(port 8080) which enforces JWT authentication and routes to the correct backend service. Never point the SDK directly at individual services (auth-service, workbench etc.) in production.
import requests
resp = requests.post("http://127.0.0.1:8080/auth/login",
json={"email": "admin@example.com", "password": "yourpassword"})
token = resp.json()["access_token"]
from omnibioai_sdk import OmniClient
c = OmniClient(base_url="http://127.0.0.1:8080", token=token)Or via environment variables:
export OMNIBIOAI_BASE_URL=http://127.0.0.1:8080
export OMNIBIOAI_TOKEN=your-jwt-tokenThe legacy OmniClient (Object Registry API, below) uses simple
header-based authentication — a single static token, no refresh:
Authorization: Bearer dev
You can pass credentials explicitly or via environment variables.
export OMNIBIOAI_BASE_URL=http://127.0.0.1:8080 # api-gateway
export OMNIBIOAI_TOKEN=devThen simply:
c = OmniClient()OmniBioAI (.rag/.models/.tes/.workflows) takes an explicit
access/refresh token pair instead and manages them automatically:
from omnibioai import OmniBioAI
client = OmniBioAI(
access_token="jwt-token",
refresh_token="refresh-token", # optional but required for auto-refresh
)- One shared session, one token pair. All four sub-clients are
constructed against the same
AuthenticatedSession/TokenPair— a refresh triggered by any one of them (e.g..rag.query(...)) is immediately visible to the others on their very next call. - Refresh-on-401, once. A
401triggers exactly one refresh call againstauth_url + /auth/refresh; a second401(or a failed refresh) raisesAuthenticationErrorrather than retrying again — mirroringomnibioai-auth's own refresh-token-family-compromise contract, where re-presenting an already-rotated refresh token is treated as compromise, not a retriable error. client.access_token/client.refresh_tokenreflect the current tokens, which may differ from what you passed to__init__after the first automatic refresh (omnibioai-authrefresh tokens are single-use and rotate on every refresh).X-Trace-Idis generated fresh per call (or supplied by the caller) and recorded onclient.session.last_trace_id, matching the header every IAM Foundation service (gateway, RAG, TES, …) already reads — useful for correlating one client-side error across services.- No local JWT verification. The SDK never decodes or verifies the access/refresh token itself — that's the API Gateway's and each target service's job, not this client's.
| Environment | Base URL | Notes |
|---|---|---|
| Local development | http://127.0.0.1:8080 |
api-gateway direct |
| Via nginx (Studio) | http://localhost/_svc/gateway |
JWT required |
| Production | https://api.omnibioai.org |
TLS + JWT required |
Always use the api-gateway URL for base_url — never point directly at
individual services (workbench :8000, etc.).
Two deliberate exceptions:
OmniBioAI's login/refresh/logout calls go to a separateauth_url(defaulthttps://auth.omnibioai.org), notbase_url— the API Gateway'sSERVICE_MAPhas noauthentry, so those routes aren't reachable through it today. Override withOmniBioAI(..., auth_url=...)for non-default deployments..workflowsdefaults to{base_url}/workflow-bundles, butomnibioai-workflow-bundleshas no confirmed route in the Gateway'sSERVICE_MAPyet — passOmniBioAI(..., workflows_url=...)explicitly until it does.
lst = c.objects_list()
lst["count"]
lst["items"][0]obj = c.object_get("56d3fc3a-709b-4ed0-bf17-8cb73c6746b0")
print(obj["object_type"])
print(obj["metadata"])OmniBioAI supports launching object-aware Jupyter notebooks.
Typical flow:
- User clicks “Analyze in Notebook” in the OmniBioAI UI
- Django endpoint generates a notebook
- JupyterLab opens with the object context preloaded
Inside the notebook:
import os
from omnibioai_sdk import OmniClient
OBJECT_ID = os.environ["OMNIBIOAI_OBJECT_ID"]
c = OmniClient()
obj = c.object_get(OBJECT_ID)
obj["object_type"], obj["metadata"]Recommended dev command:
jupyter lab \
--port 8890 \
--port-retries=0 \
--no-browser \
--notebook-dir . \
--IdentityProvider.token=devtokenAnd set:
export OMNIBIOAI_JUPYTER_BASE=http://127.0.0.1:8890
export OMNIBIOAI_JUPYTER_TOKEN=devtokenomnibioai-sdk/
├── omnibioai/ # new, ecosystem-wide package (0.2.0)
│ ├── __init__.py # exports OmniBioAI, OmniClient, RAGClient,
│ │ # ModelsClient, TESClient, WorkflowsClient
│ ├── client.py # OmniBioAI — top-level client, owns one
│ │ # shared AuthenticatedSession
│ ├── legacy.py # OmniClient, relocated unchanged from
│ │ # omnibioai_sdk/client.py — see below
│ ├── exceptions.py
│ ├── _base.py
│ ├── auth/
│ │ ├── session.py # AuthenticatedSession — auth header
│ │ │ # injection, refresh-on-401, X-Trace-Id
│ │ └── tokens.py # TokenPair — mutated in place on refresh
│ ├── rag/client.py # RAGClient — .query(...)
│ ├── models/client.py # ModelsClient — .get(task, ref), task-scoped
│ ├── tes/client.py # TESClient — .submit(tool_id, inputs=...)
│ └── workflows/client.py # WorkflowsClient — .run(workflow_name, inputs=...)
├── omnibioai_sdk/ # pre-existing package, kept for compatibility
│ ├── __init__.py # re-exports OmniClient from omnibioai/legacy.py
│ └── client.py # re-exports OmniClient from omnibioai/legacy.py
├── tests/
├── pyproject.toml
└── README.md
omnibioai_sdk/ is not a separate, unmaintained package — both of its
modules now just re-export OmniClient from omnibioai/legacy.py, so
from omnibioai_sdk import OmniClient (every existing caller's import)
keeps working unchanged and indefinitely, alongside the new
from omnibioai import OmniClient path.
- No magic: SDK mirrors REST APIs closely
- Dev-first: optimized for local servers and notebooks
- Composable: meant to be imported into pipelines, workflows, and notebooks
- Extensible: new APIs = new methods, not rewrites
Add new API calls by extending OmniClient:
def workflow_list(self):
r = requests.get(
f"{self.base_url}/api/dev/workflows/",
headers=self.headers,
timeout=self.timeout
)
r.raise_for_status()
return r.json()No regeneration or codegen required.
The SDK follows semantic versioning:
0.x→ fast iteration1.0+→ stable API surface
| Package | Purpose |
|---|---|
omnibioai-launcher |
Browser UI — alternative to SDK for interactive use |
omnibioai-model-registry |
Backs .models — ML model versioning (omr CLI + its own Python client) |
omnibioai-rag |
Backs .rag — PubMed/literature query API |
omnibioai-tes |
Backs .tes — low-level, tool_id-addressed execution |
omnibioai-workflow-bundles |
Backs .workflows — named/versioned pipeline execution; no confirmed API Gateway route yet, see URLs by environment |
omnibioai-studio |
Desktop app — manages the full stack the SDK connects to |
omnibioai-iam-client |
Internal service auth SDK (for service-to-service calls) — not used by this SDK itself; see Authentication |
Apache License 2.0
Active development Used internally by the OmniBioAI workbench and services.
For opening objects in JupyterLab, VS Code, or RStudio, see the
omnibioai-launcher
repository. The launcher is a standalone React UI that accepts an
object_id via URL parameter and handles environment dispatch.