mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-22 11:46:43 +02:00
- Add uload project with apps/web structure
- Reorganize from flat to monorepo structure
- Remove PocketBase binary and local data
- Update to pnpm and @uload/web namespace
- Add picture project to monorepo
- Remove embedded git repository
- Unify all package names to @{project}/{app} schema:
- @maerchenzauber/* (was @storyteller/*)
- @manacore/* (was manacore-*, manacore)
- @manadeck/* (was web, backend, manadeck)
- @memoro/* (was memoro-web, landing, memoro)
- @picture/* (already unified)
- @uload/web
- Add convenient dev scripts for all apps:
- pnpm dev:{project}:web
- pnpm dev:{project}:landing
- pnpm dev:{project}:mobile
- pnpm dev:{project}:backend
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
371 lines
9.5 KiB
Markdown
371 lines
9.5 KiB
Markdown
# Supabase Edge Functions - Image Generation System
|
|
|
|
## Overview
|
|
|
|
This directory contains the **refactored asynchronous image generation system** using a job queue pattern. The system is designed for scalability, reliability, and maintainability.
|
|
|
|
## What Changed?
|
|
|
|
### Before (Legacy System)
|
|
- Single monolithic 667-line `generate-image` function
|
|
- Client waits 30-60 seconds for response (blocking)
|
|
- Difficult to scale or add features
|
|
- No retry mechanism
|
|
- Single point of failure
|
|
|
|
### After (Queue System)
|
|
- 3 focused Edge Functions + job queue
|
|
- Client gets instant response (~100ms)
|
|
- Jobs processed by background worker
|
|
- Automatic retries on failure
|
|
- Easy to scale horizontally
|
|
- Clean separation of concerns
|
|
|
|
## System Components
|
|
|
|
### 1. start-generation
|
|
**Purpose**: Accept generation request and return immediately
|
|
|
|
- Validates user authentication
|
|
- Creates generation record
|
|
- Enqueues job for background processing
|
|
- Returns instantly with generation_id
|
|
|
|
**[View Code](./start-generation/index.ts)**
|
|
|
|
---
|
|
|
|
### 2. process-jobs (Worker)
|
|
**Purpose**: Background worker that processes queued jobs
|
|
|
|
- Triggered by pg_cron every minute
|
|
- Claims and processes up to 3 jobs in parallel
|
|
- Handles 'generate-image' and 'download-image' jobs
|
|
- Manages retries and error handling
|
|
|
|
**[View Code](./process-jobs/index.ts)** | **[Documentation](./process-jobs/README.md)**
|
|
|
|
---
|
|
|
|
### 3. process-generation (Module)
|
|
**Purpose**: Handle Replicate API interaction
|
|
|
|
- Extracted from original 667-line function
|
|
- Supports 15+ AI models with model-specific logic
|
|
- Handles aspect ratios, img2img, polling
|
|
- Can be imported as module or called standalone
|
|
|
|
**[View Code](./process-generation/index.ts)** | **[Documentation](./process-generation/README.md)**
|
|
|
|
---
|
|
|
|
### 4. generate-image (Legacy)
|
|
**Status**: Deprecated but kept for backward compatibility
|
|
|
|
The original monolithic function. Still works but doesn't use the queue system. Will be gradually phased out.
|
|
|
|
**[View Code](./generate-image/index.ts)**
|
|
|
|
## Documentation
|
|
|
|
### 📘 [ARCHITECTURE.md](./ARCHITECTURE.md)
|
|
Complete system architecture, database schema, and design decisions.
|
|
|
|
**Read this to understand:**
|
|
- How the system works end-to-end
|
|
- Database tables and functions
|
|
- Job flow and state transitions
|
|
- Performance characteristics
|
|
- Monitoring and scaling strategies
|
|
|
|
### 🚀 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)
|
|
Step-by-step deployment instructions.
|
|
|
|
**Follow this to deploy:**
|
|
1. Create database schema
|
|
2. Deploy Edge Functions
|
|
3. Set up pg_cron job
|
|
4. Test the system
|
|
5. Monitor and scale
|
|
|
|
### ⚡ [QUICK_REFERENCE.md](./QUICK_REFERENCE.md)
|
|
Quick commands and code snippets for daily use.
|
|
|
|
**Use this for:**
|
|
- Common SQL queries
|
|
- Quick fixes
|
|
- Client code examples
|
|
- Configuration values
|
|
- Troubleshooting
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
```bash
|
|
npm install -g supabase
|
|
supabase login
|
|
supabase link --project-ref YOUR_PROJECT_REF
|
|
```
|
|
|
|
### Deploy
|
|
```bash
|
|
# From apps/mobile directory
|
|
npx supabase functions deploy start-generation
|
|
npx supabase functions deploy process-generation
|
|
npx supabase functions deploy process-jobs
|
|
|
|
# Set secrets
|
|
npx supabase secrets set REPLICATE_API_TOKEN=your_token_here
|
|
```
|
|
|
|
### Set Up Database
|
|
Run SQL from [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) to create:
|
|
- `job_queue` table
|
|
- `enqueue_job()` function
|
|
- `claim_next_job()` function
|
|
- `complete_job()` function
|
|
- pg_cron schedule
|
|
|
|
### Test
|
|
```bash
|
|
# Test start-generation
|
|
curl -X POST https://YOUR_PROJECT.supabase.co/functions/v1/start-generation \
|
|
-H "Authorization: Bearer YOUR_ANON_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"prompt":"test","model_id":"black-forest-labs/flux-schnell","width":1024,"height":1024}'
|
|
|
|
# Manually trigger worker
|
|
curl -X POST https://YOUR_PROJECT.supabase.co/functions/v1/process-jobs \
|
|
-H "Authorization: Bearer YOUR_ANON_KEY"
|
|
```
|
|
|
|
## Architecture Diagram
|
|
|
|
```
|
|
┌─────────────┐
|
|
│ Client │
|
|
└─────┬───────┘
|
|
│ POST /start-generation
|
|
↓
|
|
┌─────────────────────┐
|
|
│ start-generation │ ← Returns immediately (~100ms)
|
|
│ • Auth check │
|
|
│ • Create record │
|
|
│ • Enqueue job │
|
|
└─────┬───────────────┘
|
|
│
|
|
↓ Job inserted
|
|
┌─────────────────────┐
|
|
│ job_queue table │
|
|
└─────┬───────────────┘
|
|
│
|
|
↓ pg_cron every minute
|
|
┌─────────────────────┐
|
|
│ process-jobs │ ← Background worker
|
|
│ • Claim 3 jobs │
|
|
│ • Process in || │
|
|
└───┬─────────┬───────┘
|
|
│ │
|
|
↓ ↓
|
|
┌───────┐ ┌──────────┐
|
|
│ Gen │ │ Download │
|
|
│ Image │ │ Image │
|
|
└───┬───┘ └────┬─────┘
|
|
│ │
|
|
↓ ↓
|
|
┌────────────────────┐
|
|
│ process-generation │ ← Replicate API
|
|
│ • Model params │
|
|
│ • API calls │
|
|
│ • Polling │
|
|
└────────────────────┘
|
|
```
|
|
|
|
## Key Features
|
|
|
|
### 🚀 Instant Response
|
|
- Client gets response in ~100ms
|
|
- No more 30-60 second waits
|
|
- Better UX, faster perceived performance
|
|
|
|
### 🔄 Automatic Retries
|
|
- Jobs retry up to 3 times on failure
|
|
- Transient errors handled gracefully
|
|
- Clear error messages for debugging
|
|
|
|
### 📈 Scalable
|
|
- Process multiple jobs in parallel
|
|
- Easy to increase throughput
|
|
- Horizontal scaling via pg_cron frequency
|
|
|
|
### 🛠 Maintainable
|
|
- Clean separation of concerns
|
|
- Each function has single responsibility
|
|
- Well-documented code
|
|
- Easy to add new features
|
|
|
|
### 🔍 Observable
|
|
- Comprehensive logging
|
|
- Database-backed job history
|
|
- Easy to monitor and debug
|
|
- Clear status progression
|
|
|
|
## Supported Models
|
|
|
|
The system supports 15+ AI models:
|
|
|
|
**Fast Models (< 5 seconds)**
|
|
- FLUX Schnell
|
|
- SDXL Lightning
|
|
|
|
**Quality Models (30-60 seconds)**
|
|
- FLUX Dev, FLUX 1.1 Pro
|
|
- SDXL, Ideogram V3
|
|
- Imagen 4, SD 3.5
|
|
|
|
**Specialized**
|
|
- Recraft V3 (SVG output)
|
|
- SeeDream, Qwen Image
|
|
|
|
All models include:
|
|
- Automatic aspect ratio handling
|
|
- Model-specific parameter optimization
|
|
- Image-to-image support (where available)
|
|
|
|
## Performance
|
|
|
|
### Default Configuration
|
|
- **Throughput**: ~180 generations/hour
|
|
- **Latency**: 30-60 seconds (depends on model)
|
|
- **Concurrency**: 3 parallel jobs
|
|
- **Reliability**: 95%+ success rate
|
|
|
|
### Scaled Configuration
|
|
With 10 parallel jobs and 30-second intervals:
|
|
- **Throughput**: ~1,200 generations/hour
|
|
|
|
## Monitoring
|
|
|
|
### Quick Health Check
|
|
```sql
|
|
-- Check queue
|
|
SELECT status, COUNT(*) FROM job_queue GROUP BY status;
|
|
|
|
-- Check recent generations
|
|
SELECT status, COUNT(*) FROM image_generations
|
|
WHERE created_at > now() - interval '1 hour'
|
|
GROUP BY status;
|
|
```
|
|
|
|
### Key Metrics
|
|
- Queue depth (pending jobs)
|
|
- Processing time
|
|
- Error rate
|
|
- Throughput (jobs/hour)
|
|
|
|
See [QUICK_REFERENCE.md](./QUICK_REFERENCE.md) for more queries.
|
|
|
|
## Troubleshooting
|
|
|
|
### Jobs Not Processing
|
|
1. Check pg_cron is scheduled: `SELECT * FROM cron.job;`
|
|
2. Check function logs in Supabase Dashboard
|
|
3. Manually trigger: `curl .../process-jobs`
|
|
|
|
### High Error Rate
|
|
1. Check job errors: `SELECT error_message FROM job_queue WHERE status='failed';`
|
|
2. Verify Replicate API token is valid
|
|
3. Check Replicate service status
|
|
|
|
### Stuck Jobs
|
|
Reset jobs stuck in processing:
|
|
```sql
|
|
UPDATE job_queue SET status='pending', attempt_number=0
|
|
WHERE status='processing' AND updated_at < now() - interval '15 minutes';
|
|
```
|
|
|
|
## Migration Path
|
|
|
|
### Current State
|
|
- Both legacy and queue systems are running
|
|
- New features should use queue system
|
|
- Existing code still works with legacy function
|
|
|
|
### Next Steps
|
|
1. Update mobile app to use start-generation
|
|
2. Update web app to use start-generation
|
|
3. Monitor queue system for 1-2 weeks
|
|
4. Deprecate legacy generate-image function
|
|
5. Remove legacy code
|
|
|
|
### Rollback
|
|
If issues occur, simply revert clients to use `generate-image` function.
|
|
|
|
## Development
|
|
|
|
### Local Testing
|
|
```bash
|
|
# Start Supabase locally
|
|
npx supabase start
|
|
|
|
# Serve functions
|
|
npx supabase functions serve
|
|
|
|
# Test in another terminal
|
|
curl http://localhost:54321/functions/v1/start-generation ...
|
|
```
|
|
|
|
### Adding New Job Types
|
|
1. Add handler in `processJob()` function
|
|
2. Create processing logic
|
|
3. Update documentation
|
|
4. Deploy
|
|
|
|
Example:
|
|
```typescript
|
|
case 'my-new-job-type':
|
|
await processMyNewJobType(job, supabaseAdmin);
|
|
break;
|
|
```
|
|
|
|
## Code Statistics
|
|
|
|
- **start-generation**: ~220 lines
|
|
- **process-jobs**: ~500 lines
|
|
- **process-generation**: ~565 lines
|
|
- **Total new code**: ~1,285 lines
|
|
- **Legacy function**: ~667 lines
|
|
- **Lines saved**: Cleaner, more maintainable
|
|
|
|
## Contributing
|
|
|
|
When making changes:
|
|
1. Update relevant README.md
|
|
2. Update ARCHITECTURE.md if design changes
|
|
3. Test locally first
|
|
4. Deploy and verify in production
|
|
5. Monitor for 24 hours
|
|
|
|
## Related Documentation
|
|
|
|
- [Supabase Edge Functions](https://supabase.com/docs/guides/functions)
|
|
- [Replicate API](https://replicate.com/docs)
|
|
- [pg_cron](https://github.com/citusdata/pg_cron)
|
|
|
|
## Support
|
|
|
|
For issues:
|
|
1. Check [QUICK_REFERENCE.md](./QUICK_REFERENCE.md) for common fixes
|
|
2. Review function logs in Supabase Dashboard
|
|
3. Check job_queue table for error details
|
|
4. Review [ARCHITECTURE.md](./ARCHITECTURE.md) for design questions
|
|
|
|
## License
|
|
|
|
Part of the Picture monorepo. See root LICENSE file.
|
|
|
|
---
|
|
|
|
**Status**: ✅ Production Ready
|
|
|
|
Last Updated: 2025-10-09
|