|
|
3 ヶ月 前 | |
|---|---|---|
| .roo | 3 ヶ月 前 | |
| cmake | 3 ヶ月 前 | |
| include | 3 ヶ月 前 | |
| src | 3 ヶ月 前 | |
| webui | 3 ヶ月 前 | |
| .clang-format | 3 ヶ月 前 | |
| .clang-tidy | 3 ヶ月 前 | |
| .gitignore | 3 ヶ月 前 | |
| .roomodes | 3 ヶ月 前 | |
| CMakeLists.txt | 3 ヶ月 前 | |
| MODEL_DETECTION_TEST_RESULTS.md | 3 ヶ月 前 | |
| README.md | 3 ヶ月 前 | |
| install.sh | 3 ヶ月 前 | |
| simple_model_test.cpp | 3 ヶ月 前 | |
| stable-diffusion-rest.service.template | 3 ヶ月 前 | |
| test_model_detection.cpp | 3 ヶ月 前 | |
| test_model_detection.sh | 3 ヶ月 前 | |
| uninstall.sh | 3 ヶ月 前 |
A C++ based REST API wrapper for the stable-diffusion.cpp library, providing HTTP endpoints for image generation with Stable Diffusion models.
The stable-diffusion.cpp-rest project aims to create a high-performance REST API server that wraps the functionality of the stable-diffusion.cpp library. This enables developers to integrate Stable Diffusion image generation capabilities into their applications through standard HTTP requests, rather than directly using the C++ library.
A modern, responsive web interface is included and automatically built with the server!
Features:
Quick Start:
# Build (automatically builds web UI)
mkdir build && cd build
cmake ..
cmake --build .
# Run server with web UI
./src/stable-diffusion-rest-server --models-dir /path/to/models --checkpoints checkpoints --ui-dir ../webui
# Access web UI
open http://localhost:8080/ui/
See WEBUI.md for detailed documentation.
The project is designed with a modular architecture consisting of three main components:
Provides type-based model organization
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ HTTP Server │───▶│ Generation Queue│───▶│ Model Manager │
│ │ │ │ │ │
│ - Request Parse │ │ - Job Queue │ │ - Model Loading │
│ - Response │ │ - Sequential │ │ - Type Detection│
│ Formatting │ │ Processing │ │ - Memory Mgmt │
└─────────────────┘ └─────────────────┘ └─────────────────┘
stable-diffusion.cpp-rest/
├── CMakeLists.txt # Main CMake configuration
├── README.md # This file
├── src/ # Source code directory
│ ├── main.cpp # Application entry point
│ ├── http/ # HTTP server implementation
│ │ ├── server.h/.cpp # HTTP server class
│ │ ├── handlers.h/.cpp # Request handlers
│ │ └── responses.h/.cpp # Response formatting
│ ├── generation/ # Generation queue implementation
│ │ ├── queue.h/.cpp # Job queue management
│ │ ├── worker.h/.cpp # Generation worker thread
│ │ └── job.h/.cpp # Job definition and status
│ ├── models/ # Model manager implementation
│ │ ├── manager.h/.cpp # Model manager class
│ │ ├── loader.h/.cpp # Model loading logic
│ │ └── types.h/.cpp # Model type definitions
│ └── utils/ # Utility functions
│ ├── config.h/.cpp # Configuration management
│ └── logger.h/.cpp # Logging utilities
├── include/ # Public header files
├── external/ # External dependencies (managed by CMake)
├── models/ # Default model storage directory
│ ├── lora/ # LoRA models
│ ├── checkpoints/ # Checkpoint models
│ ├── vae/ # VAE models
│ ├── presets/ # Preset files
│ ├── prompts/ # Prompt templates
│ ├── neg_prompts/ # Negative prompt templates
│ ├── taesd/ # TAESD models
│ ├── esrgan/ # ESRGAN models
│ ├── controlnet/ # ControlNet models
│ ├── upscaler/ # Upscaler models
│ └── embeddings/ # Textual embeddings
├── tests/ # Unit and integration tests
├── examples/ # Usage examples
└── docs/ # Additional documentation
The stable-diffusion.cpp-rest server includes intelligent model detection that automatically identifies the model architecture and selects the appropriate loading method. This ensures compatibility with both traditional Stable Diffusion models and modern architectures.
These models are loaded using the traditional ctxParams.model_path parameter.
These models are loaded using the modern ctxParams.diffusion_model_path parameter.
ctxParams.model_pathctxParams.diffusion_model_pathThe project supports various model types, each with specific file extensions:
| Model Type | Enum Value | Description | Supported Extensions |
|---|---|---|---|
| LORA | 1 | Low-Rank Adaptation models | .safetensors, .pt, .ckpt |
| CHECKPOINT | 2 | Main model checkpoints | .safetensors, .pt, .ckpt |
| VAE | 4 | Variational Autoencoder models | .safetensors, .pt, .ckpt |
| PRESETS | 8 | Generation preset files | .json, .yaml, .yml |
| PROMPTS | 16 | Prompt template files | .txt, .json |
| NEG_PROMPTS | 32 | Negative prompt templates | .txt, .json |
| TAESD | 64 | Tiny AutoEncoder for SD | .safetensors, .pt, .ckpt |
| ESRGAN | 128 | Super-resolution models | .pth, .pt |
| CONTROLNET | 256 | ControlNet models | .safetensors, .pt, .ckpt |
| UPSCALER | 512 | Image upscaler models | .pth, .pt |
| EMBEDDING | 1024 | Textual embeddings | .safetensors, .pt, .ckpt |
enum ModelType {
LORA = 1,
CHECKPOINT = 2,
VAE = 4,
PRESETS = 8,
PROMPTS = 16,
NEG_PROMPTS = 32,
TAESD = 64,
ESRGAN = 128,
CONTROLNET = 256,
UPSCALER = 512,
EMBEDDING = 1024
};
POST /api/v1/generate/text2img - Generate image from text promptPOST /api/v1/generate/img2img - Transform image with text promptPOST /api/v1/generate/inpainting - Inpaint image with maskGET /api/v1/generate/{job_id} - Get generation status and resultDELETE /api/v1/generate/{job_id} - Cancel a generation jobGET /api/v1/models - List available modelsGET /api/v1/models/{type} - List models of specific typePOST /api/v1/models/load - Load a modelPOST /api/v1/models/unload - Unload a modelGET /api/v1/models/{model_id} - Get model informationGET /api/v1/status - Get server status and statisticsGET /api/v1/system - Get system information (GPU, memory, etc.)POST /api/v1/generate
{
"prompt": "a beautiful landscape",
"negative_prompt": "blurry, low quality",
"model": "sd-v1-5",
"width": 512,
"height": 512,
"steps": 20,
"cfg_scale": 7.5,
"seed": -1,
"batch_size": 1
}
{
"job_id": "uuid-string",
"status": "completed",
"images": [
{
"data": "base64-encoded-image-data",
"seed": 12345,
"parameters": {
"prompt": "a beautiful landscape",
"negative_prompt": "blurry, low quality",
"model": "sd-v1-5",
"width": 512,
"height": 512,
"steps": 20,
"cfg_scale": 7.5,
"seed": 12345,
"batch_size": 1
}
}
],
"generation_time": 3.2
}
The server supports multiple authentication methods to secure API access:
No Authentication (Default)
JWT Token Authentication
API Key Authentication
PAM Authentication
Authentication can be configured via command-line arguments or configuration files:
# Enable PAM authentication
./stable-diffusion-rest-server --auth pam --models-dir /path/to/models --checkpoints checkpoints
# Enable JWT authentication
./stable-diffusion-rest-server --auth jwt --models-dir /path/to/models --checkpoints checkpoints
# Enable API key authentication
./stable-diffusion-rest-server --auth api-key --models-dir /path/to/models --checkpoints checkpoints
# Enable Unix authentication
./stable-diffusion-rest-server --auth unix --models-dir /path/to/models --checkpoints checkpoints
# No authentication (default)
./stable-diffusion-rest-server --auth none --models-dir /path/to/models --checkpoints checkpoints
none - No authentication required (default)jwt - JWT token authenticationapi-key - API key authenticationunix - Unix system authenticationpam - PAM authenticationoptional - Authentication optional (guest access allowed)The following options are deprecated and will be removed in a future version:
--enable-unix-auth - Use --auth unix instead--enable-pam-auth - Use --auth pam insteadPOST /api/v1/auth/login - Authenticate with username/password (PAM/JWT)POST /api/v1/auth/refresh - Refresh JWT tokenGET /api/v1/auth/profile - Get current user profilePOST /api/v1/auth/logout - Logout/invalidate tokenFor detailed authentication setup instructions, see PAM_AUTHENTICATION.md.
Clone the repository:
git clone https://github.com/your-username/stable-diffusion.cpp-rest.git
cd stable-diffusion.cpp-rest
Create a build directory:
mkdir build
cd build
Configure with CMake:
cmake ..
Build the project:
cmake --build . --parallel
(Optional) Install the binary:
cmake --install .
The project uses CMake's external project feature to automatically download and build the stable-diffusion.cpp library:
include(ExternalProject)
ExternalProject_Add(
stable-diffusion.cpp
GIT_REPOSITORY https://github.com/leejet/stable-diffusion.cpp.git
GIT_TAG master-334-d05e46c
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.cpp-src"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.cpp-build"
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.cpp-install
INSTALL_COMMAND ""
)
PAM authentication support is enabled by default when PAM libraries are available. You can control this with CMake options:
# Build with PAM support (default when available)
cmake -DENABLE_PAM_AUTH=ON ..
# Build without PAM support
cmake -DENABLE_PAM_AUTH=OFF ..
# Check if PAM support will be built
cmake -LA | grep ENABLE_PAM_AUTH
Note: PAM authentication requires the PAM development libraries:
# Ubuntu/Debian
sudo apt-get install libpam0g-dev
# CentOS/RHEL/Fedora
sudo yum install pam-devel
# Basic usage
./stable-diffusion.cpp-rest
# With custom configuration
./stable-diffusion.cpp-rest --config config.json
# With custom model directory
./stable-diffusion.cpp-rest --model-dir /path/to/models
import requests
import base64
import json
# Generate an image
response = requests.post('http://localhost:8080/api/v1/generate', json={
'prompt': 'a beautiful landscape',
'width': 512,
'height': 512,
'steps': 20
})
result = response.json()
if result['status'] == 'completed':
# Decode and save the first image
image_data = base64.b64decode(result['images'][0]['data'])
with open('generated_image.png', 'wb') as f:
f.write(image_data)
async function generateImage() {
const response = await fetch('http://localhost:8080/api/v1/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
prompt: 'a beautiful landscape',
width: 512,
height: 512,
steps: 20
})
});
const result = await response.json();
if (result.status === 'completed') {
// Create an image element with the generated image
const img = document.createElement('img');
img.src = `data:image/png;base64,${result.images[0].data}`;
document.body.appendChild(img);
}
}
# Generate an image
curl -X POST http://localhost:8080/api/v1/generate \
-H "Content-Type: application/json" \
-d '{
"prompt": "a beautiful landscape",
"width": 512,
"height": 512,
"steps": 20
}'
# Check job status
curl http://localhost:8080/api/v1/generate/{job_id}
# List available models
curl http://localhost:8080/api/v1/models
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
This project is licensed under the MIT License - see the LICENSE file for details.