A self-improving prompt optimization platform that treats prompts like code: versioned, testable, auditable, and continuously improved.
- Prompt Versioning: Immutable prompt versions with lineage tracking
- Multi-dimensional Evaluation: Correctness, format adherence, clarity, verbosity, consistency
- Candidate Generation: Meta-prompting and few-shot enhancement algorithms
- Self-Improvement Loop: Automated prompt optimization with promotion guardrails
- Transparency: Full audit trail with diffs and explanations
- Frontend: Next.js 16 with App Router, React 19, Tailwind CSS
- Backend: FastAPI (Python) for evaluation and generation tasks
- Database: Supabase (PostgreSQL)
- LLM: OpenRouter API
- Node.js 18+ and npm
- Python 3.9+
- Supabase account
- OpenRouter API key
Windows (PowerShell):
# Run the setup script
.\setup-backend.ps1
# Or manually:
cd backend
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env # If .env doesn't exist
# Edit .env with your credentials
uvicorn main:app --reload --port 8001Linux/Mac:
- Navigate to backend directory:
cd backend- Create virtual environment:
python -m venv venv
source venv/bin/activate- Install dependencies:
pip install -r requirements.txt- Create
.envfile:
cp .env.example .env- Fill in your environment variables:
SUPABASE_URL=your_supabase_url
SUPABASE_KEY=your_supabase_anon_key
OPENROUTER_API_KEY=your_openrouter_api_key
BACKEND_URL=http://localhost:8001
-
Set up Supabase database:
- Create a new Supabase project
- Run the SQL from
backend/supabase_schema.sqlin the Supabase SQL editor - Create a storage bucket named "datasets" for dataset files
-
Run the backend:
uvicorn main:app --reload --port 8001Windows (PowerShell):
# Run the setup script
.\setup-frontend.ps1
# Or manually:
cd frontend
npm install
Copy-Item .env.local.example .env.local # If .env.local doesn't exist
# Edit .env.local with your credentials
npm run devLinux/Mac:
- Navigate to frontend directory:
cd frontend- Install dependencies:
npm install- Create
.env.localfile:
cp .env.local.example .env.local- Fill in your environment variables:
NEXT_PUBLIC_API_URL=http://localhost:8001
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
- Run the frontend:
npm run dev- Open http://localhost:3000 in your browser
- Create a Prompt: Navigate to Prompts → New Prompt
- Upload a Dataset: Navigate to Datasets → Upload Dataset
- Run Evaluation: Create an evaluation linking a prompt version to a dataset
- Improve Prompt: Use the improvement loop to generate and test candidates
- Promote: Review candidates and promote the best one to active version
GET /api/prompts- List all promptsPOST /api/prompts- Create a promptGET /api/prompts/{id}- Get a promptGET /api/prompts/{id}/versions- List versionsPOST /api/prompts/{id}/versions- Create versionPOST /api/prompts/{id}/versions/{v}/activate- Activate version
GET /api/datasets- List datasetsPOST /api/datasets- Create datasetGET /api/datasets/{id}- Get dataset
GET /api/evaluations- List evaluationsPOST /api/evaluations- Create evaluationGET /api/evaluations/{id}- Get evaluation
POST /api/improvements/improve- Run improvement loopPOST /api/improvements/promote- Promote candidateGET /api/improvements/promotions- List promotions
prompt-optimization/
├── backend/ # FastAPI backend
│ ├── main.py # FastAPI app
│ ├── routers/ # API routes
│ ├── services/ # Business logic
│ ├── models/ # Pydantic schemas
│ └── db/ # Supabase client
└── frontend/ # Next.js frontend
├── app/ # Next.js App Router
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Dashboard
│ ├── prompts/ # Prompt pages
│ ├── datasets/ # Dataset pages
│ └── evaluations/ # Evaluation pages
├── components/ # React components
├── lib/ # Utilities
└── public/ # Static assets
MIT