How to Use the OpenAI-Compatible API Provided by LlamaFactory
LlamaFactory provides a FastAPI-based HTTP server that exposes OpenAI-compatible endpoints, allowing you to use standard OpenAI SDKs and tools with any supported model by simply changing the base URL.
The OpenAI-compatible API in LlamaFactory enables seamless integration of fine-tuned or base models into existing applications built for OpenAI's platform. Built on FastAPI, the service implements the same REST contract as the official OpenAI API, including support for chat completions, streaming responses, and model listing.
Architecture Overview
The API implementation consists of four core components that work together to translate OpenAI-style requests into LlamaFactory's internal inference pipeline:
| Component | Role | Source File |
|---|---|---|
| FastAPI Application | Creates the web server, configures CORS, implements API-key authentication, and registers routes. | src/llamafactory/api/app.py |
| Protocol Definitions | Pydantic models that mirror OpenAI's JSON schemas for requests and responses (e.g., ChatCompletionRequest, ChatCompletionResponse). |
src/llamafactory/api/protocol.py |
| Chat Endpoint Logic | Core implementation handling request validation, multimodal input processing, tool-call extraction, and streaming logic. | src/llamafactory/api/chat.py |
| Server Entry Point | CLI launcher that constructs the ChatModel, builds the FastAPI app, and starts uvicorn. |
src/api.py |
Request Processing Flow
When a client sends a request to the OpenAI-compatible API, the following sequence occurs:
- The HTTP request arrives at the FastAPI server (e.g.,
POST /v1/chat/completions) defined insrc/llamafactory/api/app.py. - The route handler validates the optional bearer token against the
API_KEYenvironment variable. - The request payload is forwarded to
_process_requestinsrc/llamafactory/api/chat.py, which converts the OpenAI-style messages into LlamaFactory's internal format. - The converted request is passed to a
ChatModelinstance viachat_model.achat(for standard responses) orchat_model.astream_chat(for streaming). - Results are wrapped into OpenAI-compatible response models (
ChatCompletionResponseorChatCompletionStreamResponse) and returned to the client.
Configuration Environment Variables
The API server behavior is controlled through environment variables read at startup:
| Variable | Description | Default |
|---|---|---|
API_HOST |
Host IP address the server binds to | 0.0.0.0 |
API_PORT |
TCP port for incoming connections | 8000 |
API_KEY |
Optional bearer token required for authentication | none |
API_MODEL_NAME |
Model identifier returned by /v1/models |
gpt-3.5-turbo |
FASTAPI_ROOT_PATH |
URL prefix for all routes (useful behind reverse proxies) | empty |
Starting the API Server
To launch the OpenAI-compatible API, install the optional dependencies and start the server using the provided entry point:
# Install FastAPI and server dependencies
pip install "llamafactory[api]"
# Configure the environment
export API_HOST=0.0.0.0
export API_PORT=8000
export API_KEY=your-secret-key
export API_MODEL_NAME=llama2-7b-chat
# Launch the server
python -m src.api
Upon startup, the server logs the OpenAPI documentation URL:
Visit http://localhost:8000/docs for API document.
API Endpoints and Usage
The server exposes three primary endpoints that mirror OpenAI's API specification.
List Available Models
Retrieve the model metadata configured via API_MODEL_NAME:
curl -H "Authorization: Bearer your-secret-key" \
http://localhost:8000/v1/models
Chat Completions (Non-Streaming)
Send a standard chat completion request:
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{
"model": "llama2-7b-chat",
"messages": [{"role": "user", "content": "Explain quantum computing in simple terms."}]
}'
Streaming Chat Completions
Enable streaming by setting stream: true. The response uses Server-Sent Events (SSE):
curl -N -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{
"model": "llama2-7b-chat",
"messages": [{"role": "user", "content": "Tell me a joke."}],
"stream": true
}'
Each line contains a JSON chunk conforming to the ChatCompletionStreamResponse schema defined in src/llamafactory/api/protocol.py.
Score Evaluation
Evaluate text sequences using the score endpoint:
curl -X POST http://localhost:8000/v1/score/evaluation \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{
"model": "llama2-7b-chat",
"messages": ["The quick brown fox jumps over the lazy dog."],
"max_length": 10
}'
Using the Official OpenAI Python Client
Because LlamaFactory implements the OpenAI API contract, you can use the official openai Python library by simply redirecting the base URL:
import os
import openai
# Configure the client to point to LlamaFactory
os.environ["OPENAI_API_BASE"] = "http://localhost:8000/v1"
os.environ["OPENAI_API_KEY"] = "your-secret-key"
client = openai.OpenAI(
base_url=os.getenv("OPENAI_API_BASE"),
api_key=os.getenv("OPENAI_API_KEY")
)
# Standard chat completion call
response = client.chat.completions.create(
model="llama2-7b-chat",
messages=[{"role": "user", "content": "Write a haiku about machine learning."}]
)
print(response.choices[0].message.content)
This approach requires zero code changes to existing applications using the OpenAI SDK—only the environment variables need updating.
Key Source Files
The OpenAI-compatible API implementation spans these critical files in the LlamaFactory repository:
| File | Purpose | Location |
|---|---|---|
src/api.py |
Entry point that constructs the ChatModel, initializes the FastAPI application, and launches uvicorn. |
src/api.py |
src/llamafactory/api/app.py |
Defines create_app(), configures CORS middleware, implements API-key validation, and registers the /v1/* routes. |
src/llamafactory/api/app.py |
src/llamafactory/api/protocol.py |
Contains Pydantic models (ChatCompletionRequest, ChatCompletionResponse, ModelList, etc.) that ensure strict OpenAI API compatibility. |
src/llamafactory/api/protocol.py |
src/llamafactory/api/chat.py |
Implements _process_request() and the streaming/non-streaming handlers that bridge OpenAI-style payloads to LlamaFactory's internal ChatModel interface. |
src/llamafactory/api/chat.py |
Summary
- LlamaFactory provides an OpenAI-compatible API built on FastAPI that exposes standard endpoints including
/v1/chat/completions,/v1/models, and/v1/score/evaluation. - The implementation relies on four core files:
src/api.py(entry point),src/llamafactory/api/app.py(FastAPI setup),src/llamafactory/api/protocol.py(Pydantic schemas), andsrc/llamafactory/api/chat.py(request processing). - Configuration is handled via environment variables (
API_HOST,API_PORT,API_KEY,API_MODEL_NAME) read at startup inapp.pyandapi.py. - You can interact with the server using standard
curlcommands, HTTP clients, or the official OpenAI Python SDK by simply changing thebase_urlto point to your local LlamaFactory instance.
Frequently Asked Questions
What endpoints does the LlamaFactory OpenAI-compatible API support?
The API supports three primary endpoints: GET /v1/models for listing available models, POST /v1/chat/completions for chat-based inference with optional streaming, and POST /v1/score/evaluation for scoring text sequences. These routes are registered in src/llamafactory/api/app.py and processed by the handlers in src/llamafactory/api/chat.py.
How do I enable authentication for the API server?
Set the API_KEY environment variable before starting the server. When defined, the create_app function in src/llamafactory/api/app.py enforces bearer token validation on all incoming requests. Clients must then include the header Authorization: Bearer your-secret-key in every request, as demonstrated in the curl examples.
Can I use the official OpenAI Python library with LlamaFactory?
Yes. Because LlamaFactory implements the same request/response schemas defined in src/llamafactory/api/protocol.py, you can use the official openai Python package by simply configuring the base_url to point to your LlamaFactory server (e.g., http://localhost:8000/v1) and providing the matching API_KEY. No other code changes are required.
How does streaming work in the chat completions endpoint?
When the request payload includes "stream": true, the handler in src/llamafactory/api/chat.py invokes chat_model.astream_chat and returns a Server-Sent Events (SSE) stream. Each event contains a JSON chunk conforming to the ChatCompletionStreamResponse schema from src/llamafactory/api/protocol.py, allowing clients to consume tokens incrementally exactly as they would with the official OpenAI API.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →