FastAPI middleware, auth, streaming infrastructure, and context management for the Matrx ecosystem
Project description
matrx-connect
FastAPI connectivity layer for the Matrx ecosystem: auth middleware, streaming-response infrastructure, request-scoped AppContext, and the Emitter protocol. Despite the name, "connect" is about connecting a FastAPI app to the Matrx streaming + auth contract — not database connectivity.
Install
pip install matrx-connect
Python 3.12+ required. Depends only on matrx-utils from the Matrx family.
What's in the box
| Module | What it does |
|---|---|
matrx_connect.context.app_context |
AppContext dataclass + ContextVar + get_app_context / set_app_context / try_get_app_context / clear_app_context |
matrx_connect.context.emitter_protocol |
Emitter protocol — every method any producer can call (send_chunk, send_reasoning, send_phase, send_data, send_info, send_warning, fatal_error, send_end, tool events, …) |
matrx_connect.context.events |
Pydantic event payload schemas shared with the frontend |
matrx_connect.emitters.stream_emitter |
StreamEmitter — the JSONL/NDJSON HTTP streaming implementation |
matrx_connect.emitters.console_emitter |
ConsoleEmitter — dev/test implementation that prints to stdout |
matrx_connect.middleware.auth |
AuthMiddleware — pluggable JWT + admin-token + fingerprint resolution, with a resolve_guest callback hook |
matrx_connect.streaming.response |
create_streaming_response(ctx, task, *args, ...) — the ONLY public entry point for streaming endpoints |
matrx_connect.dependencies |
context_dep — the FastAPI Depends() helper that pulls AppContext into a route handler |
The streaming endpoint pattern
Every streaming route follows this exact shape. It's enforced across every repo that uses matrx-connect, so that the behavior of heartbeats, client disconnects, and error handling stays consistent:
from fastapi import APIRouter, Depends
from matrx_connect import AppContext, context_dep
from matrx_connect.streaming import create_streaming_response
router = APIRouter()
@router.post("/topics/{topic_id}/search")
async def trigger_search(topic_id: str, ctx: AppContext = Depends(context_dep)):
return create_streaming_response(
ctx, _run_search, topic_id,
initial_message="Starting search…", debug_label="ResearchSearch",
)
async def _run_search(emitter, topic_id: str):
# AppContext is already set on the ContextVar.
# Cancellation + exception handling are done for you.
result = await do_work(topic_id)
await emitter.send_data(SearchResult(...).model_dump())
await emitter.send_end()
What create_streaming_response does for you:
- Creates the
StreamEmitter, attaches it toAppContext, and pushesAppContextonto theContextVar. - Spawns the task as a background
asyncio.Task. - Catches
CancelledError(client disconnect) and generic exceptions — the latter are surfaced viaemitter.fatal_error(...). - Emits heartbeat keepalives while the task is running.
- Clears the
ContextVaron exit.
Your task function never touches set_app_context / clear_app_context / CancelledError. If you find yourself reaching for those symbols in application code, extend create_streaming_response instead.
Wiring the auth middleware
from fastapi import FastAPI
from matrx_connect.middleware.auth import AuthMiddleware
app = FastAPI()
app.add_middleware(
AuthMiddleware,
jwt_secret=settings.JWT_SECRET,
admin_token=settings.ADMIN_TOKEN,
admin_user_id=settings.ADMIN_USER_ID,
resolve_guest=my_guest_resolver, # optional callback for fingerprint-based guests
)
After this, every request has an AppContext on request.state.context and context_dep will hand it to any route handler that depends on it.
Standalone-friendliness
matrx-connect has a single sibling dependency (matrx-utils, for verbose-logging). It assumes no ORM, no database, no Supabase — wire those in from your app. The Emitter is a typing.Protocol, so you can hand create_streaming_response any object that satisfies the shape.
Contributing
See CLAUDE.md for package-specific import rules and conventions. This package lives in the aidream monorepo at github.com/AI-Matrix-Engine/aidream-current.
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file matrx_connect-0.1.10.tar.gz.
File metadata
- Download URL: matrx_connect-0.1.10.tar.gz
- Upload date:
- Size: 133.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
588a15394762ad7df64e9b947ceb8efd7fcdcc09bddce3a69931a6f96bf57b95
|
|
| MD5 |
a75273555ef5693505022b0d6965f203
|
|
| BLAKE2b-256 |
6c59a6c7ae651923c9651337990329b9cdd548232547ccd2604a63c5e4f6c334
|
Provenance
The following attestation bundles were made for matrx_connect-0.1.10.tar.gz:
Publisher:
publish-package.yml on AI-Matrix-Engine/aidream
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
matrx_connect-0.1.10.tar.gz -
Subject digest:
588a15394762ad7df64e9b947ceb8efd7fcdcc09bddce3a69931a6f96bf57b95 - Sigstore transparency entry: 2193993815
- Sigstore integration time:
-
Permalink:
AI-Matrix-Engine/aidream@9a2ec293b4e798b25b72c0f39e290dea9623ccfc -
Branch / Tag:
refs/tags/matrx-connect/v0.1.10 - Owner: https://github.com/AI-Matrix-Engine
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@9a2ec293b4e798b25b72c0f39e290dea9623ccfc -
Trigger Event:
push
-
Statement type:
File details
Details for the file matrx_connect-0.1.10-py3-none-any.whl.
File metadata
- Download URL: matrx_connect-0.1.10-py3-none-any.whl
- Upload date:
- Size: 118.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54f4697fdf2015f6826a544dc72ea319e2cbc071cc874202f4b005f4782bf754
|
|
| MD5 |
76569e199635b738ef0ffe32b39a220f
|
|
| BLAKE2b-256 |
3f217e2f3874501021a0288b4dee0aa4b60105c2b294041546911ab8bd869032
|
Provenance
The following attestation bundles were made for matrx_connect-0.1.10-py3-none-any.whl:
Publisher:
publish-package.yml on AI-Matrix-Engine/aidream
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
matrx_connect-0.1.10-py3-none-any.whl -
Subject digest:
54f4697fdf2015f6826a544dc72ea319e2cbc071cc874202f4b005f4782bf754 - Sigstore transparency entry: 2193993824
- Sigstore integration time:
-
Permalink:
AI-Matrix-Engine/aidream@9a2ec293b4e798b25b72c0f39e290dea9623ccfc -
Branch / Tag:
refs/tags/matrx-connect/v0.1.10 - Owner: https://github.com/AI-Matrix-Engine
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@9a2ec293b4e798b25b72c0f39e290dea9623ccfc -
Trigger Event:
push
-
Statement type: