A FastAPI service for high-quality synthetic text generation using LLMs. Built for reliability and scalability.
- Async, distributed job processing with Celery + Redis (broker + result backend)
- Pluggable LLM client with OpenAI, Anthropic (stub), and Mock implementations
- Jinja2 prompt templates with versioning and enhanced prompting options
- Quality filtering, rate limiting, and data augmentation services
- Strong typing via Pydantic v2, clear separation of concerns, and test coverage
- API: FastAPI app (
app/main.py, routes inapp/routers/) - Job queue: Celery workers (
app/celery_app.py, tasks inapp/services/celery_tasks.py) - Broker/Backend: Redis (via Docker or local)
- Services: prompt rendering, quality filtering, augmentation, rate limiting (
app/services/) - LLM client: pluggable factory (
app/utils/llm_client.py) - Job management:
JobStoreabstraction wrapping Celery (app/services/job_store.py)
Key endpoints:
POST /api/generate– create a generation jobPOST /api/generate-enhanced– few-shot, tone/sentiment controls, quality filteringPOST /api/generate-augmented– apply CDA/ADA/CADA augmentation strategiesGET /api/result/{job_id}– fetch job status/resultPOST /api/validate– validate a request and estimate costGET /api/health– health of service and workersGET /api/test-llm– smoke test of configured LLM client
- Python 3.11+
- Redis 7+
- OpenAI API key (if not using the default Mock provider)
# From repository root
docker compose up --build -d
# Services
# - API: http://localhost:8000
# - Flower (Celery): http://localhost:5555
# - Redis: localhost:6379To tail logs:
docker compose logs -f --tail=200# 1) Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# 2) Install dependencies
pip install -r requirements.txt
# 3) Start Redis (Docker or local)
docker run -d -p 6379:6379 redis:7-alpine
# or: redis-server
# 4) Export environment (optional if using defaults)
export DEFAULT_LLM_PROVIDER=mock
export REDIS_URL=redis://localhost:6379/0
# 5) Start the API
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000Start background workers in separate terminals:
# Celery workers (example queues and concurrency)
celery -A app.celery_app worker --loglevel=info --queues=generation --concurrency=4 --hostname=generation-worker@%h
celery -A app.celery_app worker --loglevel=info --queues=augmentation --concurrency=2 --hostname=augmentation-worker@%h
celery -A app.celery_app worker --loglevel=info --queues=maintenance --concurrency=1 --hostname=maintenance-worker@%h
# Celery Beat (scheduled tasks)
celery -A app.celery_app beat --loglevel=info
# Flower (monitoring)
celery -A app.celery_app flower --port=5555 --broker=redis://localhost:6379/0Convenience scripts are available under scripts/ for local development.
Configuration is driven by environment variables (or a .env file). Defaults are provided in app/config.py.
# API
API_TITLE="DataForge API"
API_VERSION="1.0.0"
DEBUG=false
# Redis
REDIS_URL="redis://localhost:6379/0"
# Job Processing
MAX_SAMPLES_PER_REQUEST=50
# Celery
CELERY_WORKER_CONCURRENCY=4
CELERY_TASK_TIME_LIMIT=600
CELERY_TASK_SOFT_TIME_LIMIT=300
# LLM
DEFAULT_LLM_PROVIDER=openai # openai | anthropic | mock
OPENAI_API_KEY=your_key_here
OPENAI_MODEL=gpt-4o
OPENAI_MAX_TOKENS=500
OPENAI_PROMPT_RATE_PER_1K=0.005
OPENAI_COMPLETION_RATE_PER_1K=0.015curl -X POST "http://localhost:8000/api/generate" \
-H "Content-Type: application/json" \
-d '{
"product": "mobile banking app",
"count": 5,
"version": "v1",
"temperature": 0.7
}'curl "http://localhost:8000/api/result/<job_id>"curl -X POST "http://localhost:8000/api/validate" \
-H "Content-Type: application/json" \
-d '{
"product": "e-commerce platform",
"count": 10
}'# Enhanced (few-shot, tone, sentiment, quality filtering)
curl -X POST "http://localhost:8000/api/generate-enhanced" \
-H "Content-Type: application/json" \
-d '{
"product": "CRM suite",
"count": 3,
"version": "v1",
"temperature": 0.7
}'
# Augmented (CDA/ADA/CADA)
curl -X POST "http://localhost:8000/api/generate-augmented?augmentation_strategies=CDA&augment_ratio=0.5" \
-H "Content-Type: application/json" \
-d '{
"product": "analytics platform",
"count": 3,
"version": "v1",
"temperature": 0.7
}'curl "http://localhost:8000/api/health"
curl -X POST "http://localhost:8000/api/test-llm"app/
main.py # FastAPI app factory and wiring
celery_app.py # Celery app setup (queues, beat, flower)
routers/
generation.py # API endpoints
services/
celery_service.py # Celery job service (wraps task submission/status)
celery_tasks.py # Celery tasks (generation, enhanced, augmented)
job_store.py # Unified job store abstraction over Celery
quality_service.py # Quality filtering and scoring
data_augmentation_service.py
rate_limiting_service.py
prompt_service.py
generation_service.py
utils/
llm_client.py # LLM client interface + implementations
token_utils.py # Token and cost estimation
templates/ # Jinja2 templates
# Install dev dependencies
pip install -r requirements.txt
# Run tests
pytest
# With coverage
pytest --cov=app tests/The suite includes tests for API routes, JobStore, token utilities, rate limiting, augmentation, and quality filtering.
- Flower dashboard at
http://localhost:5555for Celery - Centralized logging to stdout (container-friendly)
- Health endpoint at
/api/health
JobStoreabstracts job creation/status/cancel and defers to Celery- LLM client is pluggable; the Mock client is default-friendly for local dev
- Quality filtering performs length checks, deduplication, and heuristic scoring; can be tuned via
QualityFilterConfig - Rate limiter supports header parsing and token/request buckets
- Create a feature branch:
git checkout -b feature/name - Make changes with tests
- Run
pytest - Open a PR
MIT