quix-ai-sdk
Prompt in, analysis out. One method launches a Quix.AI agent session: a sandboxed sub-agent writes fresh analysis code for your prompt, queries the lakehouse, and streams conclusions back.
from quix_ai_sdk import run
result = run("Compare sector times between the two fastest laps of the last session")
print(result) # the agent's conclusions
result.activities # typed log: tools called, code generated, queries run
result.session_id # resume handle + audit id
Install
uv add quix-ai-sdk # or: pip install quix-ai-sdk
Configuration (env only)
| variable | meaning |
|---|---|
Quix__Portal__Api |
portal base URL |
Quix__Workspace__Id |
workspace scope for the analysis sandbox |
QUIX_TOKEN |
a user PAT — see below |
Quix__Workspace__Idis only required forrun()/stream()(the analysis sandbox) — theagents/knowledge/mcpadmin surface doesn't need it.
QUIX_TOKEN must be a user PAT. Quix.AI sessions are user-owned — opening one requires a real user's PAT. The
Quix__Sdk__Tokenthat deployments auto-inject is a service token and cannot run Quix.AI sessions. Deployments that run analyses (e.g. automated post-race summaries) must therefore addQUIX_TOKENas a secret. Missing vars raiseMissingConfigErrornaming the variable.
Acting as a user
Web apps forwarding a logged-in user's token pass token= to run() or stream():
result = run("Summarize", token=request.user.quix_token)
The env QUIX_TOKEN is the default; token= is the only per-call override.
When a real user triggers the run, pass their token — fall back to env
QUIX_TOKEN only for headless/automated runs (attribution and permissions
follow the token). Never log the token value or call args containing it.
Streaming
import asyncio
from quix_ai_sdk import stream, TextChunk, Done
async def main():
async for event in stream("Find anomalies in brake temperature"):
if isinstance(event, TextChunk):
print(event.text, end="")
elif isinstance(event, Done):
print(f"\nsession: {event.session_id}")
asyncio.run(main())
Distilled events: TextChunk, ToolCalled, CodeGenerated, QueryRan,
Progress, Failed, Done. Pass raw=True for wire-level SSE dicts.
Follow-ups
first = run("Summarize the session")
more = run("Expand on the tyre wear point", resume=first.session_id)
Provisioning (0.3): agents / knowledge / mcp
One-time setup of the AI resources your analyses run on. These live in
submodules (agents, knowledge, mcp), not in the root namespace. Every
write needs an org-admin user PAT (token= per call or env QUIX_TOKEN).
from quix_ai_sdk import agents, runs
agent_id = agents.ensure_analysis_agent(token=ORG_ADMIN_PAT) # once per org
result = runs.run(f"Analyze test {test_id} ...", agent_id=agent_id)
ensure_analysis_agent() creates (or updates) an org agent with a curated,
versioned system prompt shipped in-package: lakehouse query discipline, the
delegate_task sandbox workflow, honest handling of missing data. Append
app-specific rules with extra_prompt=. All ensure_* functions are
idempotent and support dry_run=True previews. Full guide: docs/admin.md.
Failure model
- Agent outcome → in the result:
result.status == "failed", detail inresult.error. Never raises. - Infrastructure → typed exceptions under
QuixAIError:MissingConfigError,AuthError,RunTimeout,StreamInterrupted. - A dropped stream cancels the run server-side (platform behavior). The
session survives:
StreamInterrupted.session_idfeedsresume=. The SDK never auto-retries — a retried run duplicates cost and side effects.
Logging
The SDK logs to stdlib logging under the quix_ai_sdk logger and never
configures handlers. Suggested app-side setup:
import logging
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)-8s] [%(name)s] %(message)s"))
logging.getLogger("quix_ai_sdk").setLevel(logging.INFO)
logging.getLogger("quix_ai_sdk").addHandler(handler)
More runnable examples in examples/. Module docs in docs/.
Metadata
Release files for quix-ai-sdk 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| quix_ai_sdk-0.3.0.tar.gz | 26.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quix_ai_sdk-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.7 kB
Release files / quix_ai_sdk-0.3.0.tar.gz
| Download URL | quix_ai_sdk-0.3.0.tar.gz |
|---|---|
| Size | 26.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f369005612ecc39f2c3679c7eb4bf8258d619d8ffcc547d1c167dd69850917ff
|
|
BLAKE2b-256 checksum How to use checksums |
eee24d8042ddce4b8ab33b6fa1bd5fb5f6f43336ea8e8622ff38886c1960a674
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quix_ai_sdk-0.3.0-py3-none-any.whl
| Download URL | quix_ai_sdk-0.3.0-py3-none-any.whl |
|---|---|
| Size | 31.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3e2b93e297bf5d2f0db24b3f02e27941e2c4d3bb57371773a0c710ed7aa655db
|
|
BLAKE2b-256 checksum How to use checksums |
b17c38dcc25bf795bb8c55744f21a3c52f1e891d0756ef28f908233cc44a0fd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|