Block a user
uais-lib (0.2.0)
Published 2026-06-11 18:07:08 +00:00 by admin
Installation
pip install --index-url --extra-index-url https://pypi.org/simple uais-libAbout this package
UAIS paylaşılan kütüphane — Stripe billing + Workspace + Auth wrapper'ları
uais-lib (Python)
PyPI paketi: uais-lib
Modül: uais_lib
UAIS ekosisteminin Python backend ortak katmanı. Studio, VIP, WAI, Content (kısmi) bu paketi import eder.
Kurulum (Phase 1 başında geçerli)
# Tüketici proje pyproject.toml
[project]
dependencies = [
"uais-lib==0.1.0", # production: exact pin
]
veya geliştirme için:
pip install uais-lib
# ya da
uv add uais-lib
Sub-modüller
| Modül | İçerik | Phase |
|---|---|---|
auth/ |
Zitadel OIDC, JWT, API key | 1 |
billing/ |
Stripe Customer + Subscription + Metered + Webhook | 1 |
db/ |
SQLAlchemy + CNPG + RLS | 1 |
queue/ |
NATS JetStream producer + consumer | 1 |
storage/ |
MinIO presigned URL (workspace-scoped) | 1 |
workspace/ |
Workspace + Member + Tier + Quota + Guard | 1 |
audit/ |
Append-only audit log writer | 1 |
webhooks/ |
HMAC sign/verify + idempotency + replay protect | 1 |
errors/ |
UaisError + alt sınıflar |
1 |
observability/ |
Prometheus + Loki helpers | 1 |
personas/ |
Karakter persona profilleri (Sermin, Marcus, …) | 2 |
testing/ |
pytest fixtures (mock_stripe, mock_zitadel, mock_nats) | 1 |
Geliştirme (Phase 1 başında geçerli)
cd python/
uv sync
uv run pytest
uv run ruff check
uv run mypy src/
Phase 0'da kod yok. Phase 1 başında
pyproject.toml.example→pyproject.tomlrename + içerik doldurulur.
Test
- Unit testler
tests/altında, modül-paralel yapı (tests/billing/test_stripe_client.py) - Fixture'lar
uais_lib.testingmodülünde (tüketici de import edip kullanabilir) - Coverage hedefi: %80+
- CI matrix: Python 3.12 + 3.13, OS Ubuntu
Yayın
uv build ile wheel + sdist oluşur. GitHub Actions tag (v0.x.x) basıldığında PyPI'ya push eder.
Tüketici örneği
from uais_lib.auth import require_workspace
from uais_lib.billing import StripeClient
from uais_lib.workspace import WorkspaceGuard, QuotaError
stripe = StripeClient(api_key=settings.STRIPE_KEY)
guard = WorkspaceGuard(db=session, redis=redis)
@router.post("/api/v1/jobs")
async def create_job(workspace = Depends(require_workspace)):
try:
await guard.consume(workspace, kind="image_gen", count=1)
except QuotaError:
raise HTTPException(402)
# ... job submit
Requirements
Requires Python: >=3.12