Official Mesa Python SDK
Project description
mesa-sdk
Official Mesa Python SDK.
This is the primary Python SDK for Mesa. It wraps the generated mesa-rest client with ergonomic async resource namespaces and automatic org inference.
Python 3.10+ is required.
Install
pip install mesa-sdk
Quick Start
import asyncio
from mesa_sdk import Mesa
async def main():
async with Mesa(api_key="mk_...") as mesa:
repos = await mesa.repos.list()
print(repos)
asyncio.run(main())
Usage
Org Resolution
The SDK resolves your default organization automatically via /whoami on first use. You can bypass this by passing org to the constructor or overriding per-call:
# Default: org inferred from /whoami (lazy, cached)
mesa = Mesa(api_key="mk_...")
repos = await mesa.repos.list()
# Constructor org bypasses /whoami entirely
mesa = Mesa(api_key="mk_...", org="acme")
repos = await mesa.repos.list()
# Per-call override
repos = await mesa.repos.list(org="other-org")
Repositories
# List
repos = await mesa.repos.list()
# Create
repo = await mesa.repos.create(name="my-repo")
# Get
repo = await mesa.repos.get(repo="my-repo")
# Update
repo = await mesa.repos.update(repo="my-repo", name="renamed")
# Delete
await mesa.repos.delete(repo="my-repo")
Bookmarks
bookmarks = await mesa.bookmarks.list(repo="my-repo")
await mesa.bookmarks.create(repo="my-repo", name="feature-x", change_id="abc123")
await mesa.bookmarks.move(repo="my-repo", bookmark="feature-x", change_id="def456")
await mesa.bookmarks.merge(repo="my-repo", source="feature-x", target="main")
await mesa.bookmarks.delete(repo="my-repo", bookmark="feature-x")
Changes
from mesa_sdk import Author, FileUpsert
changes = await mesa.changes.list(repo="my-repo")
change = await mesa.changes.create(
repo="my-repo",
base_change_id="abc123",
message="Add feature",
author=Author(name="Alice", email="alice@example.com"),
files=[FileUpsert(path="hello.txt", content="Hello, world!")],
)
change = await mesa.changes.get(repo="my-repo", change_id="def456")
Content & Diffs
content = await mesa.content.get(repo="my-repo", change_id="abc123")
diff = await mesa.diffs.get(
repo="my-repo",
base_change_id="abc123",
head_change_id="def456",
)
API Keys
keys = await mesa.api_keys.list()
key = await mesa.api_keys.create(name="ci-key", scopes=["read", "write"])
await mesa.api_keys.revoke(key_id=key.id)
Webhook Targets
endpoints = await mesa.webhook_targets.list()
endpoint = await mesa.webhook_targets.create(url="https://example.com/hook", events=["change.created"])
await mesa.webhook_targets.update(webhook_target_id=endpoint.id, events=["push"])
await mesa.webhook_targets.delete(webhook_target_id=endpoint.id)
Virtual Filesystem
Mount repositories as a local filesystem for direct file I/O. The mount() context manager handles setup and teardown automatically.
async with mesa.fs.mount(repos=["my-repo"]) as fs:
data = await fs.read("/my-repo/src/main.py")
await fs.write("/my-repo/src/new_file.py", b"print('hello')")
entries = await fs.readdir("/my-repo/src")
Read-only Mounts
Use mode="ro" when you only need to read files. Write operations will raise PermissionError.
async with mesa.fs.mount(repos=["my-repo"], mode="ro") as fs:
data = await fs.read("/my-repo/README.md")
Multiple Repos
Mount several repositories at once. Each repo appears as a top-level directory.
async with mesa.fs.mount(repos=["repo-a", "repo-b"]) as fs:
a = await fs.read("/repo-a/file.txt")
b = await fs.read("/repo-b/file.txt")
Pin to Bookmark or Change
Use RepoConfig to pin a mount to a specific bookmark or change.
from mesa_sdk import RepoConfig
async with mesa.fs.mount(repos=[
RepoConfig("my-repo", bookmark="feature-x"),
RepoConfig("other-repo", change_id="abc123"),
]) as fs:
data = await fs.read("/my-repo/file.txt")
Bash
Run shell commands inside the mounted filesystem with fs.bash().
async with mesa.fs.mount(repos=["my-repo"]) as fs:
bash = fs.bash(env={"FOO": "bar"}, cwd="/my-repo", timeout_ms=30000)
result = await bash.exec("ls -la")
print(result.stdout, result.stderr, result.exit_code)
bash.exec() returns an ExecResult with stdout: bytes, stderr: bytes, and exit_code: int.
Changes and Bookmarks (on the Filesystem)
Create and manage changes and bookmarks directly from a mounted filesystem.
async with mesa.fs.mount(repos=["my-repo"]) as fs:
# Changes
change = await fs.changes.new("my-repo", bookmark="main")
change = await fs.changes.edit("my-repo", change_id="abc123")
changes = await fs.changes.list("my-repo", limit=50)
# Bookmarks
await fs.bookmarks.create("my-repo", "feature-y")
bookmarks = await fs.bookmarks.list("my-repo")
Disk Cache
Enable on-disk caching to speed up repeated mounts.
from mesa_sdk import DiskCacheConfig
async with mesa.fs.mount(
repos=["my-repo"],
disk_cache=DiskCacheConfig(path="/tmp/mesa-cache", max_size_bytes=1_000_000_000),
) as fs:
data = await fs.read("/my-repo/file.txt")
Filesystem Errors
Filesystem operations raise standard Python exceptions:
| Exception | Condition |
|---|---|
FileNotFoundError |
Path does not exist |
FileExistsError |
Path already exists (e.g. mkdir without parents) |
IsADirectoryError |
Expected a file, got a directory |
NotADirectoryError |
Expected a directory, got a file |
PermissionError |
Write operation on a read-only mount |
OSError |
General I/O failure |
NotImplementedError |
Operation not supported (e.g. link) |
Raw Client Access
For operations not covered by the resource namespaces, you can use the underlying mesa-rest AuthenticatedClient directly:
from mesa_rest.api.repo import list_repos
response = await list_repos.asyncio_detailed("acme", client=mesa.raw)
Configuration
Mesa accepts the following keyword arguments:
| Parameter | Type | Default | Description |
|---|---|---|---|
api_key |
str | None |
MESA_API_KEY env var |
API key for authentication |
api_url |
str |
https://api.mesa.dev/v1 |
Base URL for the Mesa API |
org |
str | None |
Resolved from /whoami |
Default organization slug |
user_agent |
str | None |
None |
Custom user agent suffix |
Error Handling
The SDK raises typed exceptions for API errors:
from mesa_sdk import Mesa, NotFoundError, AuthenticationError
async with Mesa() as mesa:
try:
repo = await mesa.repos.get(repo="nonexistent")
except NotFoundError:
print("Repo not found")
except AuthenticationError:
print("Invalid API key")
| Exception | HTTP Status | Description |
|---|---|---|
ValidationError |
400, 406 | Invalid request parameters |
AuthenticationError |
401 | Invalid or missing API key |
AuthorizationError |
403 | Insufficient permissions |
NotFoundError |
404 | Resource not found |
ConflictError |
409 | Resource conflict |
RateLimitError |
429 | Rate limit exceeded |
ServerError |
5xx | Server-side error |
All API exceptions inherit from ApiError, which inherits from MesaError.
Package Relationship
mesa-sdkis the ergonomic, main SDK.mesa-restis the generated REST client used under the hood.
Use mesa.raw when you need direct access to the generated AuthenticatedClient.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
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 mesa_sdk-0.28.1-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: mesa_sdk-0.28.1-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.2 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d1d64a20e686bdd376cc5dc6be16988e840489d212cdd4a2b984907756f54f5
|
|
| MD5 |
f78f55c5a481b1b2e56e8233cc7699fb
|
|
| BLAKE2b-256 |
5ce34e7bc9cc88a70e1f3239183a8276a571cc8e1e9599bc6b85a3178c4ae9a4
|
File details
Details for the file mesa_sdk-0.28.1-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: mesa_sdk-0.28.1-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 6.7 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebf347a02103ce918354032ef43a9fd6b78052cd2b746a89298ee24c2dc407e7
|
|
| MD5 |
97f6c96f34efdbfd18ae84e068625a48
|
|
| BLAKE2b-256 |
3646e7dfca8264c0dadcba14442dc2c3ec2bb3593ec8c0721f9c97077154f498
|
File details
Details for the file mesa_sdk-0.28.1-cp310-abi3-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: mesa_sdk-0.28.1-cp310-abi3-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 7.1 MB
- Tags: CPython 3.10+, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24b344350ff4950ea2274cfd1473369525e77541e7cace16d33d39205a126431
|
|
| MD5 |
a75c5fd92856324378c7e75135329eef
|
|
| BLAKE2b-256 |
2afece00059d95dcb773570e36762b3e32c29cfc0fbb2005a9a51708ed24819f
|
File details
Details for the file mesa_sdk-0.28.1-cp310-abi3-manylinux_2_34_aarch64.whl.
File metadata
- Download URL: mesa_sdk-0.28.1-cp310-abi3-manylinux_2_34_aarch64.whl
- Upload date:
- Size: 6.6 MB
- Tags: CPython 3.10+, manylinux: glibc 2.34+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08c69d9077eb98a2baf4093c4aff7913c4fbd4409de212fd02b77938bfd1c222
|
|
| MD5 |
69e33511d229df331111b2cba2d63673
|
|
| BLAKE2b-256 |
eba0574a32d5dbfb11efe86db9e9e273d85648ba4aa0bf4dfddec82c22d8a0a1
|
File details
Details for the file mesa_sdk-0.28.1-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: mesa_sdk-0.28.1-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.4 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3293e9a617b68f1799b46f8b72fbfbc221a13208c5d8488dcee11c7f180f8920
|
|
| MD5 |
ba51bfcb20148fbce0975432c24df530
|
|
| BLAKE2b-256 |
9e950fca2675cf767f182baefcfdec1fb1dea7f2f5fd0ddc2285def3aebb4291
|