Skip to main content

AstraAPI framework, high performance, easy to learn, fast to code, ready for production

Project description


⚡ AstraAPI

High-Performance · Easy to Learn · Fast to Code · Ready for Production

PyPI MIT License Status Python C++20 Pydantic v2


AstraAPI is a modern, production-grade Python web framework with a C++20 hot-path core. It is inspired by and fully API-compatible with FastAPI — you get the same beautiful decorator-based routing, automatic OpenAPI docs, Pydantic v2 validation, Depends injection, and WebSocket support, while the inner engine is a compiled C++ extension that handles HTTP parsing, route matching, parameter extraction, JSON serialization, CORS, compression, and response building — with zero Python overhead on the critical path.

"AstraAPI = FastAPI's developer experience + uWebSockets' throughput + Node.js cluster's multi-worker model"


✨ Key Features

Feature Description
🚀 C++20 HTTP Core HTTP parsing, route matching, param extraction, JSON encode/decode — all in compiled C++ (_astraapi_core.so)
🎯 FastAPI-Compatible API Same decorators (@app.get, @app.post, …), Depends, Body, Query, Path, Header, Cookie, Form, File, Security
🔄 Zero-Lock Multi-Worker Each worker is a fully independent OS process with its own GIL, event loop, and memory space. Zero shared state = zero lock contention
🌀 uvloop / winloop Event Loop Uses uvloop (Linux/macOS) or winloop (Windows) instead of CPython's default asyncio loop — up to 2–4× more I/O throughput
📄 Auto OpenAPI + Swagger/ReDoc Built-in /docs (Swagger UI) and /redoc (ReDoc) — served directly from C++ pre-built byte buffers
Pydantic v2 Validation Full request body validation, response model serialization, and model_dump_json — all via Pydantic v2
🛡️ Built-in Middleware CORS, TrustedHost, GZip/Brotli compression, Rate Limiting — implemented in C++ with zero Python allocation per request
🔌 WebSocket Support RFC 6455 compliant WebSocket with C++ ring-buffer frame parsing, echo auto-detection, batch frame building, and per-connection backpressure
⚙️ Lazy Imports Heavy imports (Pydantic, OpenAPI models) are deferred until first access. Cold startup reduced from ~4.7 s → ~1–1.5 s
🔁 Hot Reload File-watching reloader (watchfiles) restarts workers on code change
🧪 Test Client Drop-in TestClient based on httpx for sync/async endpoint testing
📁 Static Files + Jinja2 Templates Plug-and-play static file serving and HTML templating
🔒 Security OAuth2, HTTP Basic/Bearer, API Key — mirrors FastAPI's security utilities
🪝 Lifespan Events on_startup / on_shutdown callbacks and async context-manager lifespan
🖥️ Cross-Platform Linux (SO_REUSEPORT + uvloop), macOS (fork + uvloop), Windows (subprocess + winloop + socket.share)

🌟 Inspired by FastAPI

AstraAPI was directly inspired by FastAPI created by Sebastián Ramírez. Every public-facing API — decorators, dependency injection, parameter declarations, OpenAPI generation, security utilities, response models — is intentionally compatible with FastAPI so that existing FastAPI applications can be migrated with minimal changes.

# This is valid AstraAPI code — and also valid FastAPI code
from astraapi import AstraAPI, Depends
from pydantic import BaseModel

app = AstraAPI(title="My API")

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    return item

What AstraAPI adds on top of the FastAPI mental model:

  • A compiled C++20 extension replaces the entire ASGI hot path
  • A built-in multi-worker supervisor replaces Gunicorn/Uvicorn
  • A uvloop/winloop event loop replaces the default asyncio loop
  • Zero-allocation per-request interning for HTTP method strings, header names, status lines

📦 Installation

pip install astraapi

Note: The package ships a pre-built _astraapi_core.so (Linux) / .pyd (Windows). To build from source:

cd cpp_core && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
cp _astraapi_core*.so ../../astraapi/_astraapi_core.so

🚀 Quick Start

from astraapi import AstraAPI

app = AstraAPI()

@app.get("/")
async def root():
    return {"message": "Hello from AstraAPI ⚡"}

# Run with built-in multi-worker server
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, workers=4)

🔄 Complete Request Flow

The following diagram shows the full lifecycle of an HTTP request inside AstraAPI:

┌─────────────────────────────────────────────────────────────────────────────┐
│                          CLIENT  (Browser / HTTP Client)                    │
└────────────────────────────────────┬────────────────────────────────────────┘
                                     │  TCP Connection
                                     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                   MASTER PROCESS  (Supervisor / Accept Thread)              │
│                                                                             │
│  ① listen_sock.accept()  — single blocking accept, no thundering herd      │
│  ② Round-robin dispatch  — SCM_RIGHTS (Linux) / socket.share() (Windows)  │
│  ③ Worker restart        — crashed workers are automatically re-spawned    │
└────────────┬──────────────────────────┬────────────────────────────────────┘
             │ fd / shared socket        │ fd / shared socket
      ┌──────▼──────┐            ┌───────▼──────┐
      │  Worker 0   │            │  Worker 1    │   ... (N workers)
      │  (Process)  │            │  (Process)   │
      │  own GIL    │            │  own GIL     │
      │  own loop   │            │  own loop    │
      └──────┬──────┘            └──────────────┘
             │
             ▼  CppHttpProtocol.data_received()
┌─────────────────────────────────────────────────────────────────────────────┐
│                   C++ HTTP LAYER  (_astraapi_core.so)                       │
│                                                                             │
│  ④ HTTP Parse      — llhttp (Node.js parser, zero-copy view)               │
│  ⑤ Route Match     — Radix trie, O(log n), pre-compiled at startup         │
│  ⑥ Param Extract   — Path params, query string, headers, cookies in C++    │
│  ⑦ JSON Parse      — yyjson (SIMD-accelerated, strict mode)                │
│  ⑧ CORS Check      — case-insensitive origin matching, zero allocation     │
│  ⑨ DI Resolution   — Resolve Depends graph, inject typed params in C++     │
│  ⑩ Compression     — libdeflate (gzip) / Brotli, chosen by Accept-Encoding │
│  ⑪ Rate Limiting   — Sharded mutex counters (16 shards), per-IP           │
└──────────────┬──────────────────────────┬──────────────────────────────────┘
               │                          │
   ┌───────────▼─────────┐    ┌───────────▼─────────────┐
   │  SYNC ENDPOINT      │    │  ASYNC / PYDANTIC        │
   │  (no Python touch)  │    │  ENDPOINT                │
   │                     │    │                          │
   │  C++ builds full    │    │  C++ returns InlineResult│
   │  HTTP response and  │    │  Python: await endpoint  │
   │  calls              │    │  Pydantic validates resp │
   │  transport.write()  │    │  C++ serializes JSON     │
   └─────────────────────┘    └──────────────────────────┘
               │                          │
               └──────────┬───────────────┘
                          ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│                      RESPONSE PATH                                          │
│                                                                             │
│  C++ build_response_from_parts() → pre-cached status lines + headers →     │
│  transport.write(bytes)  — single syscall, keep-alive maintained           │
└─────────────────────────────────────────────────────────────────────────────┘
                          │
                          ▼
                      CLIENT  ✅

Request Flow — Step by Step

  1. TCP Accept — The master supervisor calls accept() once and dispatches the file descriptor to a worker via Unix socket (SCM_RIGHTS on Linux) or socket.share() (Windows). Workers never compete for connections.
  2. data_received — Python's asyncio protocol (CppHttpProtocol) receives raw bytes and calls into _astraapi_core via a single C-extension call.
  3. HTTP Parse — C++ uses the llhttp parser (same as Node.js) to parse headers and body. Strings are interned (PyUnicode_InternFromString) once and reused forever.
  4. Route Match — A compiled radix trie matches the method + path in O(log n). Routes are frozen before workers fork — shared as read-only COW pages.
  5. Parameter Extraction — Path params, query strings, headers, cookies extracted in C++ with zero Python dict construction for sync routes.
  6. Endpoint Dispatch — Sync endpoints return directly; async endpoints yield an InlineResult capsule back to Python which awaits the coroutine.
  7. Pydantic Validation — Response models call model_dump_json() — result is passed back to C++ for final serialization.
  8. Response Write — C++ assembles the full HTTP response from pre-cached byte fragments and calls transport.write() — a single syscall.

🏗️ Worker Architecture

┌──────────────────────────────────────────────────────────────────────┐
│                        ASTRAAPI  PROCESS MODEL                       │
├──────────────────────────────────────────────────────────────────────┤
│                                                                      │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │              MASTER  (Supervisor Process)                    │   │
│   │                                                              │   │
│   │  • listen_sock.accept() ──► round-robin dispatch           │   │
│   │  • Monitors child PIDs via os.waitpid()                    │   │
│   │  • Auto-restarts crashed workers                           │   │
│   │  • Tunes sysctl (somaxconn, tcp_max_syn_backlog)           │   │
│   │  • Raises fd limit (RLIMIT_NOFILE → 65535)                 │   │
│   └──────────┬──────────────┬────────────────┬─────────────────┘   │
│              │              │                │                       │
│    SCM_RIGHTS│   socket.    │  SO_REUSEPORT  │                       │
│    (Linux)   │   share()    │  (kernel does  │  + ─ ─  N workers    │
│              │  (Windows)   │   balancing)   │                       │
│    ┌─────────▼──┐  ┌────────▼──┐  ┌──────────▼──┐                  │
│    │  Worker 0  │  │  Worker 1  │  │  Worker N   │                  │
│    │            │  │            │  │             │                  │
│    │ own GIL    │  │  own GIL   │  │  own GIL    │                  │
│    │ own memory │  │ own memory │  │ own memory  │                  │
│    │ own loop   │  │ own loop   │  │ own loop    │                  │
│    │ uvloop/    │  │ uvloop/    │  │ uvloop/     │                  │
│    │ winloop    │  │ winloop    │  │ winloop     │                  │
│    │            │  │            │  │             │                  │
│    │ CPU pinned │  │ CPU pinned │  │ CPU pinned  │ ← sched_setaff. │
│    │ (core 0)   │  │ (core 1)   │  │ (core N%k)  │                  │
│    └────────────┘  └────────────┘  └─────────────┘                  │
│                                                                      │
│  • Route table frozen before fork → shared as read-only COW pages   │
│  • Zero IPC after startup (SO_REUSEPORT mode)                       │
└──────────────────────────────────────────────────────────────────────┘

Linux — Three Modes (Best → Fallback)

Mode How it works Latency
SO_REUSEPORT Each worker binds its own socket; kernel dispatches SYN packets directly — no master accept thread, no IPC Lowest
Master-Accept + SCM_RIGHTS Master calls accept(), sends fd to worker via sendmsg + SCM_RIGHTS over Unix socketpair Low
Shared socket Single listen socket shared via socket.share() Moderate

Windows

Master uses socket.share(pid) + socket.fromshare() over AF_INET socketpairs. Same round-robin guarantee, no thundering herd.


⚡ Why AstraAPI is Faster Than Uvicorn + Gunicorn

The table below compares what happens on every single request:

Component Uvicorn + Gunicorn AstraAPI
HTTP Parsing Python ASGI scope dict allocation (7+ keys) C++ llhttp, zero Python dict
Route Matching Python regex, dictionary lookup per route C++ radix trie, O(log n), pre-compiled
Param Extraction Python re.match() + dict construction C++ param_extractor, direct struct write
JSON Decode Python json.loads() / orjson.loads() C++ yyjson SIMD parser
JSON Encode Python json.dumps() / orjson.dumps() C++ yyjson writer, single allocation
CORS Python middleware, dict lookups, .encode() calls C++ case-insensitive origin match, no alloc
GZip Python gzip module (GIL-bound) C++ libdeflate (2–3× faster than zlib)
Brotli Requires separate brotli middleware C++ Brotli native, auto-negotiated
Response Build Python bytearray + string formatting C++ pre-cached status lines + single memcpy
Worker Model Gunicorn master-accept → WSGI/ASGI overhead Zero-lock independent processes, no arbiter GIL
Event Loop Default asyncio (libuv-less) uvloop / winloop (libuv-based, 2–4× faster I/O)
Startup Time FastAPI ~4–5 s cold import AstraAPI ~1–1.5 s (lazy imports)
String Interning .encode() per request for method/headers Pre-interned PyUnicode_InternFromString at startup
Memory per request Multiple dict + list allocations in Python Reused C++ buffer pool (buffer_pool.cpp)

Key Architectural Advantages

1. C++ on the hot path, Python only where needed

Sync endpoint:   TCP bytes → C++ parse → C++ route → C++ params → C++ response  (zero Python)
Async endpoint:  TCP bytes → C++ parse → C++ route → C++ params → Python await → C++ serialize

2. Zero thundering herd

Gunicorn's default pre-fork model has all workers call accept() simultaneously, causing a kernel stampede on connection arrival. AstraAPI's master process accepts once and dispatches — workers consume from a queue with guaranteed even distribution (Node.js cluster SCHED_RR pattern).

3. Per-worker CPU affinity

os.sched_setaffinity(0, {worker_id % cpu_count})

Each worker is pinned to a dedicated CPU core, eliminating L2/L3 cache thrashing and TLB flushes caused by process migration across cores.

4. Pre-warmed buffer pool

A C++ buffer_pool pre-allocates std::vector<char> buffers at startup. Per-request allocation becomes an O(1) list pop — no malloc/free on the critical path.

5. Route table frozen and COW-shared

Before forking, app._sync_routes_to_core() freezes the radix trie. All workers inherit it as read-only copy-on-write pages — never copied, never locked.

6. Lazy imports cut startup time by 3–4×

# Heavy imports (pydantic, openapi, routing) deferred to first use
# `from astraapi import AstraAPI` → ~1-1.5s  (vs ~4.7s eager)

🔌 WebSocket Architecture

Client  ──WS Frame──►  C++ ws_frame_parser (ring buffer, RFC 6455)
                            │
                            ▼
                    _WsFastChannel.feed()  ──► Python endpoint await
                            │
                  (echo detected?) ──YES──►  _handle_ws_frames_echo_fd
                            │                 (direct FD write, no Python)
                           NO
                            ▼
                    Python endpoint processes frame
                            │
                    ws.send_text() / send_bytes() / send_json()
                            │
                    C++ ws_build_frame_bytes()  (single allocation)
                            │
                    transport.write()
  • Echo auto-detection: if an endpoint echoes received data, AstraAPI switches to a direct-fd echo handler that bypasses Python entirely
  • Batch frame building: multiple sends within the same event loop tick are coalesced into a single transport.write() via _ws_build_frames_batch
  • Backpressure: pauses transport reading when buffer > 256 messages or 8 MB, resumes at 64 messages / 2 MB
  • WebSocket Groups: broadcast to N connections using pre-built frames (_ws_groups.py) — frame built once, sent to all

🧩 Project Structure

astraapi/
├── __init__.py              # Lazy-import gateway (startup: ~1.5s)
├── applications.py          # AstraAPI class — main app entrypoint
├── routing.py               # APIRouter, APIRoute, path operation decorators
├── _cpp_server.py           # asyncio.Protocol bridge to C++ core
├── _multiworker.py          # Zero-lock multi-worker supervisor
├── _astraapi_core.so        # Compiled C++20 extension
├── _request.py              # Request object
├── _response.py             # Response classes (JSON, HTML, Stream, File…)
├── _routing_base.py         # Base routing primitives
├── _middleware_impl.py      # Middleware stack builder
├── _websocket.py            # WebSocket wrapper (CppWebSocket)
├── _ws_groups.py            # WebSocket group broadcast
├── param_functions.py       # Body, Query, Path, Header, Cookie, Form, File, Depends, Security
├── dependencies/            # DI resolver
├── openapi/                 # OpenAPI schema generation
└── security/                # OAuth2, HTTP Basic/Bearer, API Key

cpp_core/
├── src/
│   ├── app.cpp              # CoreApp, HTTP handler, InlineResult
│   ├── router.cpp           # Radix trie route matching
│   ├── http_parser.cpp      # llhttp wrapper
│   ├── param_extractor.cpp  # Path/query/header param extraction
│   ├── json_writer.cpp      # yyjson-based JSON serialization
│   ├── json_parser.cpp      # yyjson-based JSON parsing
│   ├── ws_frame_parser.cpp  # RFC 6455 WebSocket frame parser
│   ├── ws_ring_buffer.cpp   # Ring buffer for WS frames
│   ├── middleware_engine.cpp # CORS, TrustedHost in C++
│   ├── body_parser.cpp      # JSON/form body parsing
│   ├── response_pipeline.cpp# Response assembly
│   └── dependency_resolver.cpp # C++ DI graph resolution
├── third_party/
│   ├── llhttp/              # Node.js HTTP parser
│   ├── yyjson/              # Fast JSON (SIMD)
│   └── ryu/                 # Fast float→string (d2s)
└── CMakeLists.txt           # C++20, -O3 -march=native -flto

⚙️ Configuration

app = AstraAPI(
    title="My API",
    version="1.0.0",
    description="API description (Markdown supported)",
    docs_url="/docs",          # Swagger UI
    redoc_url="/redoc",        # ReDoc
    openapi_url="/openapi.json",
    root_path="/api/v1",       # For reverse proxy setups
)

app.run(
    host="0.0.0.0",
    port=8000,
    workers=4,         # Number of worker processes
    reload=False,      # Enable hot reload (dev only)
)

📚 Dependencies

Package Role
pydantic ≥ 2.7 Request/response validation and serialization
uvloop (Linux/macOS) High-performance asyncio event loop
winloop (Windows) High-performance asyncio event loop for Windows
orjson Fast JSON fallback for Python-side serialization
watchfiles File change detection for hot reload
annotated-doc Rich type annotation documentation

Optional (install via pip install astraapi[standard]): httpx, jinja2, python-multipart, email-validator, pydantic-settings, pydantic-extra-types


🤝 Contributing

See CONTRIBUTING.md for how to set up the development environment, build the C++ core, and run the test suite.


📄 License

MIT License — see LICENSE.


Made with ⚡ by Lumos Labs HQ · Inspired by FastAPI

Download files

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

Source Distribution

astraapi-0.1.16.tar.gz (1.5 MB view details)

Uploaded Source

Built Distributions

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

astraapi-0.1.16-cp314-cp314-win_amd64.whl (487.8 kB view details)

Uploaded CPython 3.14Windows x86-64

astraapi-0.1.16-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.16-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.16-cp314-cp314-macosx_14_0_arm64.whl (920.0 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

astraapi-0.1.16-cp313-cp313-win_amd64.whl (480.8 kB view details)

Uploaded CPython 3.13Windows x86-64

astraapi-0.1.16-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.16-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.16-cp313-cp313-macosx_14_0_arm64.whl (919.9 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

astraapi-0.1.16-cp312-cp312-win_amd64.whl (480.8 kB view details)

Uploaded CPython 3.12Windows x86-64

astraapi-0.1.16-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

astraapi-0.1.16-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

astraapi-0.1.16-cp312-cp312-macosx_14_0_arm64.whl (919.9 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

Details for the file astraapi-0.1.16.tar.gz.

File metadata

  • Download URL: astraapi-0.1.16.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.16.tar.gz
Algorithm Hash digest
SHA256 e2d3c0bdaaf28aa676dd385d577bf6757c7e0d1e5602e2be1c0218fd5a3ed3fd
MD5 68736471694e17e99a2a4bf27e19c86b
BLAKE2b-256 254359c66230b0a5dfa42d912bc6ff1a85e665b975c6a473fad4af2cbac25d81

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.16-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 487.8 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.16-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b69c3e56c52571bd45a182a7a7424fb695f5bd43be304ec8c3635d5640711061
MD5 e29565b9dc568cb853b13d0838a20f18
BLAKE2b-256 7fac280c57d3e55ec78acacb3c19d85fc3d8e374e8e494d06a02d1db771a54d0

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 839e8845aef7f8b54e48beb3037622432a034baacf31951ed475bf8bf01a48eb
MD5 4e8bf485eaa6d71f4adebe561548824c
BLAKE2b-256 e8d85fb12ea5c0b19e466b2f9d0abd0ce0fce7279165fb02db74df279475fcf1

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a413567e9eace4410402d3235ee47edf90f6c1c30f84b0ae1bdab6b6e4cf40b9
MD5 2e7361f5fe9e00d37b9a5387efbcf9a7
BLAKE2b-256 fbcba58633e7c40f63abc48b5eaa1a52f839f07fa10c4be8fc0cfabd0d08db97

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 cde3818f367a591881366042533d39393088899471f1efae87c807bb0a8dda92
MD5 6fb1e9ab20b194d426946b879cd29e29
BLAKE2b-256 dd01896d90b2cad819b95cf324decaaa5271f2146b97cc9a8d328392218b28d6

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.16-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 480.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.16-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cc96d22ef4b54c77ea04e6825c9df0fada71bed52bf67c4322581ea42a95d607
MD5 d076cb920c61c301004604793f09b29b
BLAKE2b-256 1a9d8d7974775ea2f1b52d40315708e585207ca7b7f9ea1b853be5a4b64b854e

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2f8d32747f1a4f3c1dd2f7e60b69bbec538d7d2b0ab9d4b1fa8771d79ec7b6e2
MD5 19c2b31db2e46323d631e64ccd06defc
BLAKE2b-256 eab8c2db7703843396dbdcb9040137c8512d4733aef7c5bdc190ba10502b57f1

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a7b49a735d0574ab35e488e4e57b2b58724099020dd30ca2f3bac9f661f5052d
MD5 bc440696d42b858deac84ec9f6fba7a3
BLAKE2b-256 b3db07a70e2ba405da26f436a15d744f725a97066c21fcfc3e062df7a9db3b29

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f668dcc88cc67ba55210b1aff8ecd97d56ac907edfde1383971bb83af0dbb55c
MD5 ad8728b2706dfe4e991d3051f48331b7
BLAKE2b-256 b10c1a221600dc100a2250608bf28712b97a4dc334d1ef4974a30ef2eecd10cd

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: astraapi-0.1.16-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 480.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for astraapi-0.1.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 62107e0069e9b1f4878c045102bb2857d0368e431f776e9dbc2d3c4e38f36453
MD5 b46966f9d0be912ece9aa01726522358
BLAKE2b-256 5193f5ecccc272a337f64430b4ef30213245ab49ddf63d921bacde80c4d5807b

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f63b288b4a5d9066f6f92f0cba59b84b940e5be6425df9d3de38bc243f66dddf
MD5 cdbecf6790a9c1d1fd77542f315dc722
BLAKE2b-256 7e684b3f176bde778baa4455d14cd50864cbeec2c5679541e9ed9508be88b3b3

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1876a9e475d97b9d655509b0e306741aa766cb0a762d8d1a2ff98491cc8479c8
MD5 92cb2b75a1800e69cf46a42e4fca44b7
BLAKE2b-256 c3356eaa73a8e95173a0d6e2f8a88c155a2985a1217ee106bb2c5bd28263766a

See more details on using hashes here.

File details

Details for the file astraapi-0.1.16-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for astraapi-0.1.16-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6d8619e8249392fcbb98ecc6532f1d930ef4959a626e85a7db329bc85fa5bbb8
MD5 119d9c4547c7dc8c9f18d2cc8292f370
BLAKE2b-256 6053435c18d595b0062c4924c5b0a47fa40a8ef8ccc0b03ac700362361f65940

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page