mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-08 03:08:45 +00:00
293 lines
7.3 KiB
Markdown
293 lines
7.3 KiB
Markdown
# Mock Prompt Management Server
|
|
|
|
A reference implementation of the [LiteLLM Generic Prompt Management API](https://docs.litellm.ai/docs/adding_provider/generic_prompt_management_api).
|
|
|
|
This FastAPI server demonstrates how to build a prompt management API that integrates with LiteLLM without requiring a PR to the LiteLLM repository.
|
|
|
|
## Quick Start
|
|
|
|
### 1. Install Dependencies
|
|
|
|
```bash
|
|
pip install fastapi uvicorn pydantic
|
|
```
|
|
|
|
### 2. Start the Server
|
|
|
|
```bash
|
|
python mock_prompt_management_server.py
|
|
```
|
|
|
|
The server will start on `http://localhost:8080`
|
|
|
|
### 3. Test the Endpoint
|
|
|
|
```bash
|
|
# Get a prompt
|
|
curl "http://localhost:8080/beta/litellm_prompt_management?prompt_id=hello-world-prompt"
|
|
|
|
# Get a prompt with authentication
|
|
curl "http://localhost:8080/beta/litellm_prompt_management?prompt_id=hello-world-prompt" \
|
|
-H "Authorization: Bearer test-token-12345"
|
|
|
|
# List all prompts
|
|
curl "http://localhost:8080/prompts"
|
|
|
|
# Get prompt variables
|
|
curl "http://localhost:8080/prompts/hello-world-prompt/variables"
|
|
```
|
|
|
|
## Using with LiteLLM
|
|
|
|
### Configuration
|
|
|
|
Create a `config.yaml` file:
|
|
|
|
```yaml
|
|
model_list:
|
|
- model_name: gpt-3.5-turbo
|
|
litellm_params:
|
|
model: openai/gpt-3.5-turbo
|
|
api_key: os.environ/OPENAI_API_KEY
|
|
|
|
prompts:
|
|
- prompt_id: "hello-world-prompt"
|
|
litellm_params:
|
|
prompt_integration: "generic_prompt_management"
|
|
api_base: http://localhost:8080
|
|
api_key: test-token-12345
|
|
```
|
|
|
|
### Start LiteLLM Proxy
|
|
|
|
```bash
|
|
litellm --config config.yaml
|
|
```
|
|
|
|
### Make a Request
|
|
|
|
```bash
|
|
curl http://0.0.0.0:4000/v1/chat/completions \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer sk-1234" \
|
|
-d '{
|
|
"model": "gpt-3.5-turbo",
|
|
"prompt_id": "hello-world-prompt",
|
|
"prompt_variables": {
|
|
"domain": "data science",
|
|
"task": "analyzing customer behavior"
|
|
},
|
|
"messages": [
|
|
{"role": "user", "content": "Please help me get started"}
|
|
]
|
|
}'
|
|
```
|
|
|
|
## Available Prompts
|
|
|
|
The server includes several example prompts:
|
|
|
|
| Prompt ID | Description | Variables |
|
|
|-----------|-------------|-----------|
|
|
| `hello-world-prompt` | Basic helpful assistant | `domain`, `task` |
|
|
| `code-review-prompt` | Code review assistant | `years_experience`, `language`, `code` |
|
|
| `customer-support-prompt` | Customer support agent | `company_name`, `customer_message` |
|
|
| `data-analysis-prompt` | Data analysis expert | `analysis_type`, `dataset_name`, `data` |
|
|
| `creative-writing-prompt` | Creative writing assistant | `genre`, `length`, `topic` |
|
|
|
|
## Authentication
|
|
|
|
The server supports optional Bearer token authentication. Valid tokens for testing:
|
|
|
|
- `test-token-12345`
|
|
- `dev-token-67890`
|
|
- `prod-token-abcdef`
|
|
|
|
If no `Authorization` header is provided, requests are allowed (for testing purposes).
|
|
|
|
## API Endpoints
|
|
|
|
### LiteLLM Spec Endpoints
|
|
|
|
#### `GET /beta/litellm_prompt_management`
|
|
|
|
Get a prompt by ID (required by LiteLLM).
|
|
|
|
**Query Parameters:**
|
|
- `prompt_id` (required): The prompt ID
|
|
- `project_name` (optional): Project filter
|
|
- `slug` (optional): Slug filter
|
|
- `version` (optional): Version filter
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"prompt_id": "hello-world-prompt",
|
|
"prompt_template": [
|
|
{
|
|
"role": "system",
|
|
"content": "You are a helpful assistant specialized in {domain}."
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Help me with: {task}"
|
|
}
|
|
],
|
|
"prompt_template_model": "gpt-4",
|
|
"prompt_template_optional_params": {
|
|
"temperature": 0.7,
|
|
"max_tokens": 500
|
|
}
|
|
}
|
|
```
|
|
|
|
### Convenience Endpoints (Not in LiteLLM Spec)
|
|
|
|
#### `GET /health`
|
|
|
|
Health check endpoint.
|
|
|
|
#### `GET /prompts`
|
|
|
|
List all available prompts.
|
|
|
|
#### `GET /prompts/{prompt_id}/variables`
|
|
|
|
Get all variables used in a prompt template.
|
|
|
|
#### `POST /prompts`
|
|
|
|
Create a new prompt (in-memory only, for testing).
|
|
|
|
## Example: Full Integration Test
|
|
|
|
### 1. Start the Mock Server
|
|
|
|
```bash
|
|
python mock_prompt_management_server.py
|
|
```
|
|
|
|
### 2. Test with Python
|
|
|
|
```python
|
|
from litellm import completion
|
|
|
|
# The completion will:
|
|
# 1. Fetch the prompt from your API
|
|
# 2. Replace {domain} with "machine learning"
|
|
# 3. Replace {task} with "building a recommendation system"
|
|
# 4. Merge with your messages
|
|
# 5. Use the model and params from the prompt
|
|
|
|
response = completion(
|
|
model="gpt-4",
|
|
prompt_id="hello-world-prompt",
|
|
prompt_variables={
|
|
"domain": "machine learning",
|
|
"task": "building a recommendation system"
|
|
},
|
|
messages=[
|
|
{"role": "user", "content": "I have user behavior data from the past year."}
|
|
],
|
|
# Configure the generic prompt manager
|
|
generic_prompt_config={
|
|
"api_base": "http://localhost:8080",
|
|
"api_key": "test-token-12345",
|
|
}
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
```
|
|
|
|
## Customization
|
|
|
|
### Adding New Prompts
|
|
|
|
Edit the `PROMPTS_DB` dictionary in `mock_prompt_management_server.py`:
|
|
|
|
```python
|
|
PROMPTS_DB = {
|
|
"my-custom-prompt": {
|
|
"prompt_id": "my-custom-prompt",
|
|
"prompt_template": [
|
|
{
|
|
"role": "system",
|
|
"content": "You are a {role}."
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "{user_input}"
|
|
}
|
|
],
|
|
"prompt_template_model": "gpt-4",
|
|
"prompt_template_optional_params": {
|
|
"temperature": 0.8,
|
|
"max_tokens": 1000
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Using a Database
|
|
|
|
Replace the `PROMPTS_DB` dictionary with database queries:
|
|
|
|
```python
|
|
@app.get("/beta/litellm_prompt_management")
|
|
async def get_prompt(prompt_id: str):
|
|
# Fetch from database
|
|
prompt = await db.prompts.find_one({"prompt_id": prompt_id})
|
|
|
|
if not prompt:
|
|
raise HTTPException(status_code=404, detail="Prompt not found")
|
|
|
|
return PromptResponse(**prompt)
|
|
```
|
|
|
|
### Adding Access Control
|
|
|
|
Use the custom query parameters for access control:
|
|
|
|
```python
|
|
@app.get("/beta/litellm_prompt_management")
|
|
async def get_prompt(
|
|
prompt_id: str,
|
|
project_name: Optional[str] = None,
|
|
user_id: Optional[str] = None,
|
|
authorization: Optional[str] = Header(None)
|
|
):
|
|
token = verify_api_key(authorization)
|
|
|
|
# Check if user has access to this project
|
|
if not has_project_access(token, project_name):
|
|
raise HTTPException(status_code=403, detail="Access denied")
|
|
|
|
# Fetch and return prompt
|
|
...
|
|
```
|
|
|
|
## Production Considerations
|
|
|
|
Before deploying to production:
|
|
|
|
1. **Use a real database** instead of in-memory storage
|
|
2. **Implement proper authentication** with JWT tokens or API keys
|
|
3. **Add rate limiting** to prevent abuse
|
|
4. **Use HTTPS** for encrypted communication
|
|
5. **Add logging and monitoring** for observability
|
|
6. **Implement caching** for frequently accessed prompts
|
|
7. **Add versioning** for prompt management
|
|
8. **Implement access control** based on teams/users
|
|
9. **Add input validation** for all parameters
|
|
10. **Use environment variables** for configuration
|
|
|
|
## Related Documentation
|
|
|
|
- [Generic Prompt Management API Documentation](https://docs.litellm.ai/docs/adding_provider/generic_prompt_management_api)
|
|
- [LiteLLM Prompt Management](https://docs.litellm.ai/docs/proxy/prompt_management)
|
|
- [Generic Guardrail API](https://docs.litellm.ai/docs/adding_provider/generic_guardrail_api)
|
|
|
|
## Questions?
|
|
|
|
This is a reference implementation for the LiteLLM Generic Prompt Management API. For questions or issues, please open an issue on the [LiteLLM GitHub repository](https://github.com/BerriAI/litellm).
|
|
|