Minimal Python SDK for Keel
Project description
keel-sdk
Python SDK for the Keel AI governance API.
Keel lets you issue permits before AI calls, enforce policies, track usage, and audit decisions — across any provider.
Install
pip install keel-sdk
Setup
from keel_sdk import KeelClient
client = KeelClient(
base_url="https://api.keel.so",
api_key="keel_sk_...",
)
Permits
Request a permit before making an AI call:
import uuid
from keel_sdk import KeelClient
client = KeelClient(base_url="https://api.keel.so", api_key="keel_sk_...")
permit = client.permits.create({
"project_id": "proj_123",
"idempotency_key": str(uuid.uuid4()),
"subject": {"type": "user", "id": "usr_123"},
"action": {"name": "ai.generate"},
"resource": {
"type": "request",
"id": "req_123",
"attributes": {
"provider": "openai",
"model": "gpt-4o-mini",
"estimated_input_tokens": 200,
"estimated_output_tokens": 500,
},
},
})
if permit["decision"] == "allow":
# proceed with AI call
pass
Async variant:
permit = await client.permits.create_async({...})
Dry run
result = client.permits.dry_run(permit_request)
List and get
permits = client.permits.list(project_id="proj_123", limit=50)
permit = client.permits.get("permit_id")
Report usage
client.permits.report_usage("permit_id", {
"input_tokens": 180,
"output_tokens": 420,
})
Attestation, evidence, lineage
client.permits.attest("permit_id", {"outcome": "success"})
client.permits.add_evidence("permit_id", {"label": "response_hash", "value": "abc123"})
evidence = client.permits.list_evidence("permit_id")
lineage = client.permits.lineage("permit_id")
bundle = client.permits.bundle("permit_id")
Executions
Run a model synchronously:
result = client.executions.create({
"provider": "openai",
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Summarize this document."}],
"permit_id": permit["id"],
})
Stream tokens as they arrive:
for event in client.executions.stream({
"provider": "openai",
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Write a poem."}],
"permit_id": permit["id"],
}):
if event.get("type") == "content_delta":
print(event["delta"], end="", flush=True)
if event.get("type") == "done":
print()
Async streaming:
async for event in client.executions.stream_async({...}):
...
Execute (unified)
result = client.execute.run({
"model": "gpt-4o-mini",
"input": "Translate to Spanish: Hello world",
"provider": "openai",
})
Proxy
Pass requests through to providers with Keel governance applied:
response = client.proxy.openai({
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}],
})
# Also: client.proxy.anthropic(), .google(), .xai(), .meta()
Jobs
Submit async jobs and poll for results:
job = client.jobs.create({
"provider": "openai",
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Analyze this dataset."}],
})
status = client.jobs.get(job["job_id"])
# status["status"]: "pending" | "running" | "completed" | "failed"
API Keys
key = client.api_keys.create()
keys = client.api_keys.list()
single = client.api_keys.get(key["id"])
client.api_keys.revoke(key["id"])
Request Timeline
timeline = client.requests.timeline("request_id")
Error Handling
from keel_sdk import KeelClient, KeelError
try:
client.permits.create(request)
except KeelError as e:
print(e.status) # HTTP status code
print(e.code) # e.g. "permit_denied"
print(e.message) # human-readable message
print(e.field) # field that caused the error, if any
Context Manager
with KeelClient(base_url="...", api_key="...") as client:
permit = client.permits.create({...})
# Async
async with KeelClient(base_url="...", api_key="...") as client:
permit = await client.permits.create_async({...})
Freshness Headers
For replay-protected endpoints:
client = KeelClient(
base_url="https://api.keel.so",
api_key="keel_sk_...",
request_freshness=True,
)
This adds X-Keel-Timestamp and X-Keel-Nonce to every request.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file keel_sdk-0.1.0.tar.gz.
File metadata
- Download URL: keel_sdk-0.1.0.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8db37307ac99b3f78957b304106a6c0f7bdcf704e76781c0bf67f6ff769488fa
|
|
| MD5 |
a40e248cafd2bcdfc272108451d49bc5
|
|
| BLAKE2b-256 |
678d929ff9f4672b69b1717752fd836cf021c292ecc2036a37d0f5040c54ba8c
|
File details
Details for the file keel_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: keel_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ab7a1961d975270ead707777a728a6582fbf384ba5208989ff34f217e6ee8f8
|
|
| MD5 |
7b9f0260054e5bda7622824b25e51031
|
|
| BLAKE2b-256 |
16da61798fb8b645aff329f33b7dd86e9eeaf3bcb4d39be988700366e6eb84be
|