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.15.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.15-cp314-cp314-win_amd64.whl (487.8 kB view details)

Uploaded CPython 3.14Windows x86-64

astraapi-0.1.15-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.15-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.15-cp314-cp314-macosx_14_0_arm64.whl (920.0 kB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

astraapi-0.1.15-cp313-cp313-win_amd64.whl (480.7 kB view details)

Uploaded CPython 3.13Windows x86-64

astraapi-0.1.15-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.15-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.15-cp313-cp313-macosx_14_0_arm64.whl (919.9 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

astraapi-0.1.15-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.15-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.15-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.15.tar.gz.

File metadata

  • Download URL: astraapi-0.1.15.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.15.tar.gz
Algorithm Hash digest
SHA256 fd44f4ce84de7f429fb9055aeb029a4e180270caa0b5708cf550aab77a0b9cdd
MD5 781b6c015f99315927c610f6cf79b753
BLAKE2b-256 f25a55598f1c64bd419e2ea21606c87d0b2de05983f93e554139d6f899030eca

See more details on using hashes here.

File details

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

File metadata

  • Download URL: astraapi-0.1.15-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.15-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e4c96f5c44753187713fa4e79214789a6f414de1c3e401d144f8bae5e4e81d7a
MD5 2638f53c112b647e6abe0e844a0c1324
BLAKE2b-256 575e416c0eea8a070b0a4abab9a002ecd4a0c829660d7b67fc2ddc12733e2966

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 12aecc6e03198321bef14ce3d42ed85aad68a025406b9da85a73ab8e4d80553a
MD5 903dc9d562c0d71ec4a5a97e2a2757c5
BLAKE2b-256 8fbf76d6547958d016c7010e8d8c9cdee9248c67159f83e15bb7bacb10edb480

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 aeafac87405527f260906822d9e90921bfc9767b85148a38f737077391a40dc1
MD5 fe956ec68aa4c0f81691f0d4113ac659
BLAKE2b-256 4cafd2e59ed0a4a3b3e85ed8fd69d494ab158d99f7c3df1bddd90c36830f0443

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9b9918726f21fec8b3cf02ac590dbb9d6101b79804f32bc7fb1de39a9348e2d0
MD5 d0ef1d77f6311b9fe2254222423d725d
BLAKE2b-256 2c7849398996d988b485d8ac1bd2ff6f820450048b6e851cd54f9ed383bb0652

See more details on using hashes here.

File details

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

File metadata

  • Download URL: astraapi-0.1.15-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 480.7 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.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cbf032bb3cb2854f428296e194995021ee5d3d0b744767e81bded75261601476
MD5 5e5a11f8fac9d675b36ed00703939897
BLAKE2b-256 097d7054d2c460d3f8acfe550273ce10cab1d9b3cc9864aedb5b8ec84a138880

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a5b2522f482e895e93cd76abc4cc44f35f3a8cf9bb0c52f663f0db8bc1440484
MD5 454059fa0ea9e09f1463fbe49b9dd502
BLAKE2b-256 cb3d691b128acb9b18760e595f6e3aaa1e8e709c902e23a38eea4bf1589d5e6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 010391e1fd8dfda9a689b87f01d7beede39b35981b29d4ef506aba0f0836dd0c
MD5 fecafb900b184177c6da17bae33df2a5
BLAKE2b-256 32c2e6048ba8f2badbcfb484bd060690a5beadc4aabf7adec97c6ff5be213e41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 c5a2c2130c2b14e49a0b600607e9c1e119e381ef41ad27942f2feb752cac7bad
MD5 569c60ba3f0430ef6ed229592eccd1b1
BLAKE2b-256 9c51b9703b22e2648dfb34531294e605b02457afe540aa5bf2ba1f9d6a5ff4d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: astraapi-0.1.15-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.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e6e868ccf0387c3921daa6f9e35c9ea1cc5d1d4ba92dbc83cff0b8a659951832
MD5 22bdaf97042ae58aebdb21a03a6b4863
BLAKE2b-256 057d2aca033a63bcbe61b13210b0ed0dbba5d67a54d204f95b6433d580ff7753

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6aabda7be48707a33df8e2772c887c8766962d20911aed6e030f1999db102253
MD5 ef615824a6b6df63a575b9747ebbfe82
BLAKE2b-256 5d149249b46ad7b735b44ce164e73853fd45dc5cbfcba7bf546ffc56d3cc1d7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9123dbb3ad24535c0c68df0fda997b5482a51e47432e780467b882e14e5c2477
MD5 969b48ddefc82243951a50613615b0d4
BLAKE2b-256 ab26d89feb081d8f5cc3a08c62d75b5d37df786ad0b24ae7981cfc695314227c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for astraapi-0.1.15-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 dbd93d694cf88f2f6754036f52003473a32eb083331533c455e45dc1aeeda771
MD5 94a536c8d71d8e690c853cfe23259c0f
BLAKE2b-256 c12e6ccb9b0f6209fd8ed74498465f7c0fcdcb24df28de4d4ee59db9bb46c243

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