A modern REST API service for managing and serving AI prompts
Project description
🚀 Exemplar Prompt Hub
📑 Table of Contents
- Features
- Getting Started
- Running Tests
- Contributing
- License
- API Documentation
- API Usage Examples
- Project Structure
- Database Table Structure
- Updating Prompts with Versioning
A modern REST API service for managing and serving AI prompts. This service provides a centralized repository for storing, versioning, and retrieving prompts for various AI applications. It uses PostgreSQL as the database for robust and scalable data management.
✨ Features
For a detailed checklist of implemented and planned features, see FEATURES.md.
- RESTful API for prompt management
- Version control for prompts
- Tag-based prompt organization
- Metadata support for prompts
- Authentication and authorization
- Search and filtering capabilities
🛠️ Getting Started
Prerequisites
- Python 3.8 or higher
- pip (Python package manager)
- Git
- PostgreSQL (for database)
- Docker and Docker Compose (for containerized setup)
Installation
Using pip
You can install the package directly from PyPI:
pip install exemplar-prompt-hub
Or install from the source:
# Clone the repository
git clone https://github.com/yourusername/exemplar-prompt-hub.git
cd exemplar-prompt-hub
# Install the package
pip install -e .
After installation, you can use the following commands:
prompt-hub- Start the FastAPI serverprompt-hub-ui- Start the Streamlit UI
Using Docker
The easiest way to get started is using Docker Compose:
-
Clone the repository:
git clone https://github.com/yourusername/exemplar-prompt-hub.git cd exemplar-prompt-hub
-
Start the services:
docker-compose up -d
This will start:
- FastAPI backend at http://localhost:8000
- PostgreSQL database at localhost:5432
- Streamlit UI at http://localhost:8501
-
Access the services:
- API Documentation: http://localhost:8000/docs
- Streamlit UI: http://localhost:8501
-
Stop the services:
docker-compose down
Manual Installation
If you prefer to run the services manually:
-
Clone the repository:
git clone https://github.com/yourusername/exemplar-prompt-hub.git cd exemplar-prompt-hub
-
Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows, use `venv\\Scripts\\activate`
-
Install dependencies:
pip install -r requirements.txt
-
Set up environment variables:
- Copy
.env.exampleto.env:cp .env.example .env
- Edit
.envto configure your database and other settings.
- Copy
-
Start the application:
uvicorn app.main:app --reload
Running Tests
To run the tests, use:
pytest
For detailed test coverage, use:
pytest --cov=app --cov-report=term-missing
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For detailed contribution guidelines, please refer to the CONTRIBUTING.md file.
License
This project is licensed under the MIT License - see the LICENSE file for details.
📚 API Documentation
Once the server is running, you can access the interactive API documentation at:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
🔄 API Usage Examples
Here are some example curl commands to interact with the API:
Create a Prompt
curl -X POST "http://localhost:8000/api/v1/prompts/" \
-H "Content-Type: application/json" \
-d '{
"name": "example-prompt",
"text": "This is an example prompt text",
"description": "A sample prompt for demonstration",
"version": 1,
"meta": {
"author": "test-user",
"category": "example"
},
"tags": ["example", "test"]
}'
Get All Prompts
# Get all prompts
curl "http://localhost:8000/api/v1/prompts/"
# Get prompts with search
curl "http://localhost:8000/api/v1/prompts/?search=example"
# Get prompts with tag filter
curl "http://localhost:8000/api/v1/prompts/?tag=test"
# Get prompts with pagination
curl "http://localhost:8000/api/v1/prompts/?skip=0&limit=10"
Get a Specific Prompt
# Replace {prompt_id} with actual ID
curl "http://localhost:8000/api/v1/prompts/1"
Update a Prompt
# Replace {prompt_id} with actual ID
curl -X PUT "http://localhost:8000/api/v1/prompts/1" \
-H "Content-Type: application/json" \
-d '{
"name": "updated-example-prompt",
"text": "This is the updated prompt text",
"description": "Updated description",
"version": 2,
"meta": {
"author": "test-user",
"category": "example",
"updated": true
},
"tags": ["example", "test", "updated"]
}'
Delete a Prompt
# Replace {prompt_id} with actual ID
curl -X DELETE "http://localhost:8000/api/v1/prompts/1"
Complete Flow Example
Here's a complete flow example using a single prompt:
# 1. Create a new prompt
CREATE_RESPONSE=$(curl -s -X POST "http://localhost:8000/api/v1/prompts/" \
-H "Content-Type: application/json" \
-d '{
"name": "flow-example",
"text": "Initial prompt text",
"description": "Example for complete flow",
"version": 1,
"meta": {"author": "test-user"},
"tags": ["flow", "example"]
}')
# Extract prompt ID from response
PROMPT_ID=$(echo $CREATE_RESPONSE | jq -r '.id')
# 2. Get the created prompt
curl "http://localhost:8000/api/v1/prompts/$PROMPT_ID"
# 3. Update the prompt
curl -X PUT "http://localhost:8000/api/v1/prompts/$PROMPT_ID" \
-H "Content-Type: application/json" \
-d '{
"text": "Updated prompt text",
"description": "Updated description",
"version": 2,
"meta": {"author": "test-user", "updated": true},
"tags": ["flow", "example", "updated"]
}'
# 4. Get the updated prompt
curl "http://localhost:8000/api/v1/prompts/$PROMPT_ID"
# 5. Delete the prompt
curl -X DELETE "http://localhost:8000/api/v1/prompts/$PROMPT_ID"
# 6. Verify deletion
curl "http://localhost:8000/api/v1/prompts/$PROMPT_ID"
Note: The complete flow example requires jq to be installed for JSON parsing. You can install it using:
- Ubuntu/Debian:
sudo apt-get install jq - macOS:
brew install jq - Windows: Download from https://stedolan.github.io/jq/download/
📁 Project Structure
exemplar-prompt-hub/
├── app/
│ ├── api/ # API endpoints
│ ├── core/ # Core functionality
│ ├── db/ # Database models and session
│ ├── schemas/ # Pydantic models
│ └── main.py # Application entry point
├── tests/ # Test files
├── .env # Environment variables
├── .env.example # Example environment variables
├── requirements.txt # Project dependencies
└── README.md # Project documentation
📊 Database Table Structure
The application uses the following database tables:
Prompts Table
- id: Integer (Primary Key)
- name: String (Unique)
- text: String
- description: String
- version: Integer
- meta: JSON
- created_at: DateTime
- updated_at: DateTime
Tags Table
- id: Integer (Primary Key)
- name: String (Unique)
PromptVersions Table
- id: Integer (Primary Key)
- prompt_id: Integer (Foreign Key to Prompts)
- version: Integer
- text: String
- meta: JSON
- created_at: DateTime
🔄 Updating Prompts with Versioning
To update a prompt with versioning, follow these steps:
-
Retrieve the Prompt: Use the
GET /api/v1/prompts/{prompt_id}endpoint to retrieve the prompt you want to update. -
Update the Prompt: Use the
PUT /api/v1/prompts/{prompt_id}endpoint to update the prompt. You can include the following fields:- name: (Optional) The new name of the prompt.
- text: (Optional) The new text of the prompt.
- description: (Optional) The new description of the prompt.
- version: (Optional) The new version number.
- meta: (Optional) Any additional metadata.
-
Versioning Logic:
- If you provide a new version number, the system will create a new entry in the
PromptVersions
- If you provide a new version number, the system will create a new entry in the
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 exemplar_prompt_hub-0.1.2.tar.gz.
File metadata
- Download URL: exemplar_prompt_hub-0.1.2.tar.gz
- Upload date:
- Size: 16.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd455c593d07bf2f7f67e69862a6464ae6aad6ad3395f4bb3adac6d40b350813
|
|
| MD5 |
ba70b5623d9d7b40196ba38f35434acf
|
|
| BLAKE2b-256 |
b6f976e3b386aea48bdf06ccd75a779eea952d8d5f4d48d6a91a4b6965a08034
|
File details
Details for the file exemplar_prompt_hub-0.1.2-py3-none-any.whl.
File metadata
- Download URL: exemplar_prompt_hub-0.1.2-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7315c6a1eb3630637134c298d5ba7fe74c7c2d09c95ec2df3d2ad880fb1ba899
|
|
| MD5 |
8f595603df1457a3cab5cafa4534b794
|
|
| BLAKE2b-256 |
5b5419e70539f461b7b5732714e72ea1cfa5560adcb95211f554c84224cfc496
|