| title | Configure Plane AI |
|---|---|
| description | Configure Plane AI on your self-hosted Plane deployment. Set up LLM providers, embedding models, and semantic search for Plane's AI features. |
| keywords | plane ai, Plane ai, self-hosted ai, llm configuration, embedding models, semantic search, openai, anthropic, cohere |
Plane AI brings AI-powered features to your workspace, including natural language chat, duplicate detection, and semantic search across work items, pages, and projects. This guide walks you through configuring Plane AI on your self-hosted instance.
For an overview of what Plane AI can do, see the Plane AI.
You'll need:
- A separate database for Plane AI. Plane AI requires its own database instance.
- An OpenSearch instance running version 2.19 or later (self-hosted or AWS OpenSearch) configured for advanced search.
- At least one LLM provider API key or a custom OpenAI-compatible endpoint.
- At least one embedding model configured in OpenSearch.
Supported models:
- GPT-5
- GPT-4.1
- GPT-5.2
Supported models:
- Claude Sonnet 4.0
- Claude Sonnet 4.5
- Claude Sonnet 4.6
You can provide API keys for both OpenAI and Anthropic, making all models available to users. If you provide only one key, users will only have access to that provider's models.
Plane AI works with any model exposed through an OpenAI-compatible API, including models served by Ollama, Groq, Cerebras, and similar runtimes. You can configure one custom model alongside your public provider keys.
:::warning For reliable performance across all Plane AI features, use a custom model with at least 100 billion parameters. Larger models produce better results. :::
Embedding models power semantic search. Plane AI supports:
| Provider | Supported models |
|---|---|
| Cohere | cohere/embed-v4.0 |
| OpenAI | openai/text-embedding-ada-002, openai/text-embedding-3-small |
| AWS Bedrock (Titan) | bedrock/amazon.titan-embed-text-v1 |
:::info Separate database required Plane AI must use its own database — do not share the main Plane application database. A dedicated database keeps AI data (e.g. chat history) isolated and avoids schema conflicts. Set PLANE_PI_DATABASE_URL (or the equivalent for your deployment). See the environment variables reference. :::
:::tip For other deployment methods such as Coolify, Portainer, Docker Swarm, and Podman Quadlets, use the same environment variables defined for Docker Compose Setup. :::
:::tabs key:deployment-method
== Docker Compose {#docker-compose}
Open the /opt/plane/plane.env file in your preferred editor and set the replica count for Plane AI services to 1:
PI_API_REPLICAS=1
PI_BEAT_REPLICAS=1
PI_WORKER_REPLICAS=1
PI_MIGRATOR_REPLICAS=1== Kubernetes {#kubernetes}
Open your values.yaml file and enable the Plane AI service by setting services.pi.enabled to true:
services:
pi:
enabled: trueThis activates the Plane AI API, worker, beat-worker, and migrator workloads. Replica counts and resource limits for each workload can be configured through the Plane AI values block in your values.yaml.
:::
Configure at least one LLM provider. Add the relevant variables to /opt/plane/plane.env.
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxCLAUDE_API_KEY=xxxxxxxxxxxxxxxxUse this for self-hosted models or third-party OpenAI-compatible endpoints.
CUSTOM_LLM_ENABLED=true
CUSTOM_LLM_MODEL_KEY=your-model-key
CUSTOM_LLM_BASE_URL=http://your-endpoint/v1
CUSTOM_LLM_API_KEY=your-api-key
CUSTOM_LLM_NAME=Your Model Name
CUSTOM_LLM_DESCRIPTION="Optional description"
CUSTOM_LLM_MAX_TOKENS=128000:::info The custom endpoint must expose an OpenAI-compatible API matching OpenAI's request and response format. :::
GROQ_API_KEY=your-groq-api-keyThis enables voice input in Plane AI. It's not required for LLM or semantic search features.
Plane AI uses OpenSearch for semantic indexing and retrieval. If you haven't set up OpenSearch yet, complete the OpenSearch for advanced search guide first, then return here.
OPENSEARCH_URL=https://your-opensearch-instance:9200/
OPENSEARCH_USERNAME=admin
OPENSEARCH_PASSWORD=your-secure-password
OPENSEARCH_INDEX_PREFIX=planeConfigure exactly one embedding model using one of these options.
If you've already deployed an embedding model in OpenSearch, provide its model ID. This works with both self-hosted and AWS OpenSearch.
EMBEDDING_MODEL_ID=your-model-idFor AWS OpenSearch, you must deploy the embedding model manually before setting this variable. See Deploy an embedding model on AWS OpenSearch.
For self-hosted OpenSearch, Plane can automatically create and deploy the embedding model. Provide the model name and the corresponding provider credentials.
Cohere:
EMBEDDING_MODEL=cohere/embed-v4.0
COHERE_API_KEY=your-cohere-api-keyOpenAI:
EMBEDDING_MODEL=openai/text-embedding-3-small
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxAWS Bedrock (Titan):
EMBEDDING_MODEL=bedrock/amazon.titan-embed-text-v1
BR_AWS_ACCESS_KEY_ID=your-access-key
BR_AWS_SECRET_ACCESS_KEY=your-secret-key
BR_AWS_REGION=your-region:::warning Required IAM permission for Bedrock Titan
The IAM user for BR_AWS_ACCESS_KEY_ID and BR_AWS_SECRET_ACCESS_KEY needs bedrock:InvokeModel permission on the Titan foundation model. Without it, embedding requests fail with a 403 error.
Attach this policy to the IAM user:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:<your-region>::foundation-model/amazon.titan-embed-text-v1"
}
]
}Replace <your-region> with your BR_AWS_REGION value.
:::
:::info
Automatic embedding model deployment only works with self-hosted OpenSearch. For AWS OpenSearch, deploy the model manually and use EMBEDDING_MODEL_ID.
:::
After updating the environment file, restart Plane.
Docker:
prime-cli restartOr if you're managing containers directly:
docker compose down
docker compose up -dKubernetes:
helm upgrade --install plane-app plane/plane-enterprise \
--namespace plane \
-f values.yaml \
--waitGenerate embeddings for your existing content by running this command in the API container.
Docker:
docker exec -it plane-api-1 sh
python manage.py manage_search_index --background --vectorize document index --forceKubernetes:
API_POD=$(kubectl get pods -n plane --no-headers | grep api | head -1 | awk '{print $1}')
kubectl exec -n plane $API_POD -- python manage.py manage_search_index --background --vectorize document index --forceThe --background flag processes vectorization through Celery workers. This is recommended for instances with large amounts of existing content.
Once configured:
- Plane AI is available across your workspace.
- New content (work items, pages, comments) is automatically vectorized in the background.
- Semantic search stays synchronized without manual intervention.
See the environment variables reference for a complete list of AI-related configuration options.