Skip to main content

Bucket Helper

🇫🇷 · 🇬🇧

CI License: BSD-3-Clause Python

Bucket Helper belongs to a collection of libraries called AI Helpers developed for building Artificial Intelligence.

Utility functions for AWS S3 and any S3-compatible object storage: MinIO, Backblaze B2 S3 API, DigitalOcean Spaces, Cloudflare R2, Wasabi, and friends. Built on boto3. Same shape as sftp-helper: a credentials() loader, the usual CRUD (upload / download / delete / exists / list_prefix), and a remote_tempfile context manager for stage-and-share flows.

Object storage keeps files as flat, addressable blobs, a bucket plus a key such as my-bucket/folder/file.txt, instead of a nested folder tree on a hard drive: nothing to create in advance, no limit on how many files pile up in one place, and every object is reachable straight from a URL. Amazon Web Services built the first popular version of this, S3 (Simple Storage Service), and its wire protocol became the de facto standard: MinIO, Backblaze B2, DigitalOcean Spaces, Cloudflare R2, and Wasabi all speak the same S3 API, so bucket-helper runs unchanged against any of them; only the endpoint URL changes.

🌍 AI Helpers

logo

The Promise

Remote by design. bucket-helper exists to move data to and from object storage you choose: AWS, or any S3-compatible endpoint you point it at (including a MinIO instance on your own network). It is deliberately not local-first and ships no GUI. For a remote reached over SFTP instead of S3, use sftp-helper; for downloading media from a URL, use youtube-helper.

Documentation

💻 Documentation

🗺️ Landscape

📋 Examples

🎯 Triggers

Features

  • CRUD against AWS S3 or any S3-compatible endpoint: upload, download, delete, exists, list_prefix.
  • Works against any S3-compatible provider, MinIO, Backblaze B2 S3 API, DigitalOcean Spaces, Cloudflare R2, Wasabi, by pointing the endpoint_url credential at it; no code changes per provider.
  • Credentials loader (credentials) resolving JSON / YAML / environment variables / .env, in that fallback order.
  • remote_tempfile context manager for stage-and-share flows: upload, hand back the object, auto-delete on block exit, no manual cleanup.
  • Three surfaces, one behavior: Python library, argparse CLI, click CLI twin ([cli] extra), and FastAPI HTTP surface ([api] extra). See the multi-surface section.
  • Docker image ships the HTTP server ready to run.

Installation

Prerequisites: Python 3.10–3.13 and git, cross-platform:

  • 🍎 macOS (Homebrew): brew install python git
  • 🐧 Ubuntu/Debian: sudo apt update && sudo apt install -y python3 python3-pip git
  • 🪟 Windows (PowerShell): winget install Python.Python.3.12 Git.Git

We recommend using Python environments. Check this link if you're unfamiliar with setting one up: 🥸 Tech tips.

From PyPI (recommended)

# Core library (credentials loader + CRUD + remote_tempfile)
pip install bucket-helper

# Optional surfaces
pip install "bucket-helper[cli]"       # click-based CLI twin
pip install "bucket-helper[api]"       # FastAPI HTTP surface

From source (no PyPI)

git clone https://github.com/warith-harchaoui/bucket-helper.git
cd bucket-helper
pip install -e .

# Optional surfaces
pip install -e ".[cli]"
pip install -e ".[api]"

The argparse CLI is always available. The [cli] extra adds the click twin.

Configuration

A ready-to-fill template is committed at settings.yaml.example. Copy it to settings.yaml and edit in place: settings.yaml is gitignored, so you cannot accidentally commit secrets.

cp settings.yaml.example settings.yaml
# then edit settings.yaml with your AWS / MinIO / R2 / B2 credentials

You may also write JSON instead of YAML, use a .env, or set environment variables; bucket-helper falls back in that order via os_helper.get_config. Required keys:

{
  "s3_access_key": "AKIA...",
  "s3_secret_key": "...",
  "s3_bucket":     "my-bucket",
  "s3_https":      "https://my-bucket.s3.eu-west-3.amazonaws.com"
}

Optional keys:

Key Default Notes
s3_region "us-east-1" AWS region; mostly cosmetic for MinIO / R2
s3_endpoint_url empty (= AWS S3) Set this for S3-compatible backends: see table below
s3_prefix empty Default key prefix added by upload(...) when no destination is given
s3_use_path_style "false" Force path-style addressing (endpoint/bucket/key instead of bucket.endpoint/key). Typical for MinIO with custom domains.
s3_verify_ssl "true" Disable only for dev MinIO with self-signed certs

Endpoint URLs for common S3-compatible storage

Set s3_endpoint_url to:

Provider Endpoint
AWS S3 leave empty / unset
MinIO http://minio.example.com:9000 (or https://... with TLS)
DigitalOcean Spaces https://nyc3.digitaloceanspaces.com (region in subdomain)
Cloudflare R2 https://<account_id>.r2.cloudflarestorage.com
Backblaze B2 (S3 API) https://s3.<region>.backblazeb2.com
Wasabi https://s3.<region>.wasabisys.com

Usage

For the full catalog of recipes (uploads / downloads / listings, S3-compatible endpoints such as MinIO / R2 / B2 / Spaces / Wasabi, temporary remote keys with auto-cleanup, mirroring with sftp-helper), see 📋 EXAMPLES.md.

import bucket_helper as bh

# Load creds: JSON / YAML / env / .env (auto-fallback in that order)
cred = bh.credentials("path/to/settings.yaml")

# Upload a local file
uri = bh.upload("local.txt", cred, "folder/uploaded.txt")
# uri == "s3://my-bucket/folder/uploaded.txt"

assert bh.exists(uri, cred)

# Download
bh.download(uri, "downloaded.txt", cred)

# List
for key in bh.list_prefix("folder/", cred):
    print(key)

# Delete
bh.delete(uri, cred)

MinIO example

cred = {
    "s3_access_key":      "minioadmin",
    "s3_secret_key":      "minioadmin",
    "s3_bucket":          "uploads",
    "s3_https":           "http://minio.example.com:9000/uploads",
    "s3_endpoint_url":    "http://minio.example.com:9000",
    "s3_use_path_style":  "true",
    "s3_region":          "us-east-1",  # MinIO accepts any region string
}

bh.make_bucket("uploads", cred)
bh.upload("file.bin", cred, "file.bin")

Stage-and-share with remote_tempfile

Drop a generated file at a unique random key, hand the public URL to a downstream worker / webhook, and the object is deleted on block exit (even if the body raises):

import bucket_helper as bh
import requests

cred = bh.credentials("path/to/settings.yaml")

with bh.remote_tempfile(cred, ext="json", prefix="runs") as (s3_addr, public_url):
    bh.upload("payload.json", cred, s3_addr, content_type="application/json")
    # Hand the URL to something that fetches it once.
    requests.post("https://hook.example.com/process", json={"input_url": public_url}).raise_for_status()
# Object is gone here, no manual cleanup.

Multi-surface exposure

Every public function in the library is also exposed as:

  • argparse CLI: bucket-helper <subcommand> (installed by default).
  • click CLI: bucket-helper-click <subcommand> (install [cli] extra).
  • FastAPI HTTP: uvicorn bucket_helper.api:app --host 0.0.0.0 --port 8000 (install [api] extra).
  • MCP: bucket-helper-mcp exposes the same HTTP surface as MCP tools for any MCP-aware agent host (install [mcp] extra).

Both CLIs share the same subcommand names and flags; pick your favourite.

The exhaustive catalogue of what triggers the toolkit (natural-language phrasings, commands, functions, address cues, and explicit SKIP rules) lives in TRIGGERS.md.

CLI examples

# argparse CLI (always available)
bucket-helper upload      --config settings.yaml --input local.txt --key folder/uploaded.txt
bucket-helper exists      --config settings.yaml --key folder/uploaded.txt
bucket-helper download    --config settings.yaml --key folder/uploaded.txt --output back.txt
bucket-helper list        --config settings.yaml --prefix folder/
bucket-helper delete      --config settings.yaml --key folder/uploaded.txt
bucket-helper make-bucket --config settings.yaml --bucket new-bucket
bucket-helper tempfile    --config settings.yaml --ext json --prefix runs
bucket-helper strip-path  --config settings.yaml --address s3://my-bucket/path/to/obj

# click CLI: same verbs, same flags
bucket-helper-click upload --config settings.yaml --input local.txt --key folder/uploaded.txt

HTTP server

# Serve HTTP (default credentials picked up from BUCKET_HELPER_CONFIG)
BUCKET_HELPER_CONFIG=$PWD/settings.yaml uvicorn bucket_helper.api:app --host 0.0.0.0 --port 8000
# → Swagger UI at http://localhost:8000/docs

Per-request credentials can also be sent as multipart form fields (s3_access_key / s3_secret_key / s3_bucket / s3_https / …).

Docker

docker build -t bucket-helper .
docker run --rm -p 8000:8000 \
  -e BUCKET_HELPER_CONFIG=/config/settings.yaml \
  -v $PWD/settings.yaml:/config/settings.yaml:ro \
  bucket-helper

See also: TRIGGERS.md (what invokes the toolkit) and GUI.md (visual product design plan; no GUI ships, bucket-helper is remote object-storage plumbing).

Author

Acknowledgements

Special thanks to Mohamed Chelali and Bachir Zerroug for fruitful discussions.

License

This project is licensed under the BSD-3-Clause License; see the LICENSE file for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bucket_helper-1.1.2.tar.gz (37.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bucket_helper-1.1.2-py3-none-any.whl (30.3 kB view details)

Uploaded Python 3

File details

Details for the file bucket_helper-1.1.2.tar.gz.

File metadata

  • Download URL: bucket_helper-1.1.2.tar.gz
  • Upload date:
  • Size: 37.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for bucket_helper-1.1.2.tar.gz
Algorithm Hash digest
SHA256 ae31f62ac0df182c4e1f66a0cfcb3bb85268051d8c0eb4f750cb8588a909fdb8
MD5 bc2bda1e2afa8e9ce2c37733b3fb7263
BLAKE2b-256 512888235c099d7f2bf8d21b3e68d8a557df31e444b0844fcad32bdfbdedc83a

See more details on using hashes here.

File details

Details for the file bucket_helper-1.1.2-py3-none-any.whl.

File metadata

  • Download URL: bucket_helper-1.1.2-py3-none-any.whl
  • Upload date:
  • Size: 30.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for bucket_helper-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e3aacb4c15e1f3e5d9c2639c6fa8593d779f066b8ee28e8787fb3931bddd8145
MD5 c952ac5187bfa47a8ac6bff633b2079b
BLAKE2b-256 4188458f6afcca38472b2cbda4101a763e442b73183ae004c5c19ee765ebdcda

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.1.2 This release

2 files

1.1.1

2 files

1.1.0

2 files

1.0.0

2 files

0.4.1

2 files

0.3.0

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page