chunk-engine
Framework Integration

Python

chunk-engine (py-chunks) in FastAPI, Flask, Django, Litestar, aiohttp, and Celery.

View raw

py-chunks ships upload-aware helpers so you rarely handle bytes yourself: get_chunks_from_upload for framework upload objects, get_chunks_from_bytes(data, filename) for raw bytes, plus the matching stream_chunks_from_* variants. See Input Sources.

FastAPI

from fastapi import FastAPI, File, UploadFile
from py_chunks import get_chunks_from_upload

app = FastAPI()

@app.post("/chunk/")
async def chunk_document(file: UploadFile = File(...)):
    chunks = get_chunks_from_upload(file)
    return {"chunks": chunks}

FastAPI — streaming response

Forward each chunk as NDJSON while the document is still being parsed:

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse
from py_chunks import stream_chunks_from_upload
import json

app = FastAPI()

@app.post("/chunk/stream/")
async def chunk_stream(file: UploadFile = File(...)):
    def generate():
        for chunk in stream_chunks_from_upload(file):
            yield json.dumps(chunk) + "\n"
    return StreamingResponse(generate(), media_type="application/x-ndjson")

FastAPI — Markdown conversion

from fastapi import FastAPI, File, UploadFile
from py_chunks import get_markdown

app = FastAPI()

@app.post("/markdown/")
async def to_markdown(file: UploadFile = File(...)):
    data = await file.read()
    return {"markdown": get_markdown(data, filename=file.filename)}

Flask

from flask import Flask, request
from py_chunks import get_chunks_from_bytes

app = Flask(__name__)

@app.post("/chunk")
def chunk_document():
    file = request.files["document"]
    chunks = get_chunks_from_bytes(file.read(), file.filename)
    return {"chunks": chunks}

Django

from django.http import JsonResponse
from py_chunks import get_chunks_from_upload

def chunk_view(request):
    if request.FILES:
        chunks = get_chunks_from_upload(request.FILES["document"])
        return JsonResponse({"chunks": chunks})
    return JsonResponse({"error": "No file"}, status=400)

Litestar

from litestar import Litestar, post
from litestar.datastructures import UploadFile
from litestar.enums import RequestEncodingType
from litestar.params import Body
from py_chunks import get_chunks_from_bytes

@post("/chunk")
async def chunk_document(
    data: UploadFile = Body(media_type=RequestEncodingType.MULTI_PART),
) -> dict:
    content = await data.read()
    return {"chunks": get_chunks_from_bytes(content, data.filename)}

app = Litestar([chunk_document])

aiohttp

from aiohttp import web
from py_chunks import get_chunks_from_bytes

async def chunk_document(request):
    reader = await request.multipart()
    field = await reader.next()               # the "document" part
    data = await field.read(decode=False)
    chunks = get_chunks_from_bytes(data, field.filename)
    return web.json_response({"chunks": chunks})

app = web.Application()
app.add_routes([web.post("/chunk", chunk_document)])

Celery — background job

Chunking is CPU work; run it off the request path in a worker.

import celery
from py_chunks import get_chunks

@celery.task
def process_document(file_path: str):
    chunks = get_chunks(file_path, mode="semantic")
    # embed + persist to your vector store here
    return len(chunks)

Async uploads

If an upload object's read() is a coroutine (some ASGI stacks), get_chunks_from_upload raises TypeError. Read the bytes yourself and use the bytes API: data = await file.read(); get_chunks_from_bytes(data, file.filename). See Error Handling.

On this page