About SmooAI
SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.
Learn more on smoo.ai
SmooAI Packages
Check out other SmooAI packages at smoo.ai/open-source
About smooai-file (Python)
File operations that don't lie — magic-byte MIME detection catches spoofed extensions, size + content validation is built in, and local / URL / S3 / bytes / stream sources all speak the same typed async API. Stream-first so a large upload doesn't blow your memory.
Python Package
This is the Python port of @smooai/file, mirroring the feature set of the TypeScript version with idiomatic async/await Python. The package provides the same unified File class with automatic MIME type detection, rich metadata, and full S3 integration.
Install
pip install smooai-file
or with uv:
uv add smooai-file
Multi-Language Support
smooai-file is available as native implementations in TypeScript, Python, Rust, and Go — each built with idiomatic patterns for its ecosystem.
| Language | Package | Install |
|---|---|---|
| TypeScript | @smooai/file |
pnpm add @smooai/file |
| Python | smooai-file |
pip install smooai-file |
| Rust | smooai-file |
cargo add smooai-file |
| Go | github.com/SmooAI/file/go/file/v2 |
go get github.com/SmooAI/file/go/file/v2 |
Key Features
Stream-First Design
- Async-native with
asynciothroughout - Memory-efficient processing via
aiofiles - Supports both async iterators and sync file-like objects
- Lazy byte handling wherever possible
Multiple File Sources
- Local Filesystem — async read/write with
aiofiles, stat metadata - URLs — automatic download via
httpx, header metadata extraction - S3 Objects — direct AWS S3 integration (download and upload) via
boto3, ETag and Content-Type extraction - Bytes — in-memory buffers with full metadata support
- Streams — async iterators and sync file-like objects
Intelligent File Type Detection
Automatic MIME type and extension detection using a priority cascade:
- Magic-byte inspection of file contents
- HTTP response headers (
Content-Type,Content-Disposition) - S3 object metadata
- File extension fallback
Rich Metadata
- File name and extension
- MIME type
- File size
- Last modified and created timestamps
- SHA-256 (and other algorithm) checksums
- URL and filesystem path
- Source type (
FILE,URL,S3,BYTES,STREAM)
Examples
Basic Usage
import asyncio
from smooai_file import File
async def main():
# Create from a local path
file = await File.from_file("/path/to/document.pdf")
# Read contents
content = await file.read() # bytes
text = await file.read_text() # str (UTF-8)
# Access metadata
print(file.name) # "document.pdf"
print(file.mime_type) # "application/pdf"
print(file.size) # 102400
print(file.extension) # "pdf"
print(file.path) # "/path/to/document.pdf"
print(file.last_modified) # datetime(...)
asyncio.run(main())
URL Download
import asyncio
from smooai_file import File
async def main():
# Fetch from a URL (uses httpx under the hood)
file = await File.from_url("https://example.com/report.pdf")
# MIME type detected from Content-Type header and magic bytes
print(file.mime_type) # "application/pdf"
print(file.size) # populated from Content-Length header
# Save to disk
original, saved = await file.save("/tmp/report.pdf")
print(saved.path) # "/tmp/report.pdf"
asyncio.run(main())
S3 Integration
import asyncio
from smooai_file import File
async def main():
# Download from S3
file = await File.from_s3("my-bucket", "reports/report.pdf")
# Upload to S3 (sets ContentType, ContentLength, ContentDisposition)
await file.upload_to_s3("my-bucket", "archive/report.pdf")
# Save to S3 and get a new S3-backed File instance
original, s3_file = await file.save_to_s3("my-bucket", "archive/report.pdf")
# Move to S3 (deletes local source if applicable)
s3_file = await file.move_to_s3("my-bucket", "archive/report.pdf")
# Generate a pre-signed URL (expires in 1 hour)
signed_url = await s3_file.get_signed_url(expires_in=3600)
print(signed_url)
asyncio.run(main())
Stream Handling
import asyncio
from smooai_file import File
async def my_async_generator():
yield b"hello "
yield b"world"
async def main():
# From an async iterator
file = await File.from_stream(my_async_generator())
text = await file.read_text()
print(text) # "hello world"
# From a sync file-like object
with open("/path/to/file.bin", "rb") as f:
file = await File.from_stream(f)
print(file.mime_type)
asyncio.run(main())
File Operations
import asyncio
from smooai_file import File
async def main():
file = await File.from_file("/tmp/notes.txt")
# Append and prepend (local files only)
await file.append("new line\n")
await file.prepend("# Header\n")
# Truncate to 1 KB
await file.truncate(1024)
# Compute checksum
digest = await file.checksum("sha256")
print(digest) # 64-char hex string
# Filesystem checks
print(await file.exists()) # True
print(await file.is_readable()) # True
print(await file.is_writable()) # True
# Move to a new location (deletes source)
moved = await file.move("/tmp/archive/notes.txt")
# Delete
await moved.delete()
asyncio.run(main())
Built With
- Python 3.11+ with full type hints
- aiofiles — async filesystem I/O
- httpx — async HTTP client for URL downloads
- boto3 — AWS SDK for S3 integration
- puremagic — pure-Python magic-byte MIME detection (no libmagic system dep)
Related Packages
- @smooai/file — TypeScript/Node.js version
- smooai-file (Rust) — Rust version
github.com/SmooAI/file/go/file/v2— Go version
Development
uv sync
uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build
Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.
Contact
Brent Rager
Smoo Github: https://github.com/SmooAI
License
MIT © SmooAI
Metadata
Release files for smooai-file 2.2.21
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| smooai_file-2.2.21.tar.gz | 85.1 kB | Without provenance | Details for smooai_file-2.2.21.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| smooai_file-2.2.21-py3-none-any.whl | Python 3 | none | any | Details for smooai_file-2.2.21-py3-none-any.whl |
Total release size: 106.5 kB
Release files / smooai_file-2.2.21.tar.gz
| Download URL | smooai_file-2.2.21.tar.gz |
|---|---|
| Size | 85.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
551ad9a6a52f2df908ec0ea0ffdd8e186966c79fe66900fee96de2fa4cf6257a
|
|
BLAKE2b-256 checksum How to use checksums |
13c4986951d436c7555baf8f857ab96cdd1409679899c4cc45dfd72e3348f09f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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 / smooai_file-2.2.21-py3-none-any.whl
| Download URL | smooai_file-2.2.21-py3-none-any.whl |
|---|---|
| Size | 21.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1bb1d8b1b23e45c9287c3be7f0d66a745d503d5cd8d27c58242311ef97e71d1d
|
|
BLAKE2b-256 checksum How to use checksums |
54b8587bd798d569f89973bef94b2e9e72ffb81be6e2d50a2142c2a582d51eac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}
|
Security for smooai-file 2.2.21
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.