mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-14 23:21:35 +00:00
Render a general_settings.coordination_redis block into the litellm-helm proxy config when the bundled Redis is enabled, gated on a new redis.coordination.enabled value and skipped when the user already supplies their own block. Sentinel deployments render sentinel_nodes and service_name rather than a host/port pair. Also fixes litellm.redis.serviceName, which gated its sentinel branch on standalone architecture. The bundled Redis subchart only serves sentinel in replication mode, and renders no master Service there, so REDIS_HOST pointed at a Service that never existed for every sentinel user. Documents the coordination redis in the componentized chart and in the terraform modules, whose existing REDIS_* exports now feed it directly. Adds helm-unittest coverage for both charts' redis wiring, which had none
442 lines
14 KiB
YAML
442 lines
14 KiB
YAML
# Default values for litellm.
|
|
# This is a YAML-formatted file.
|
|
# Declare variables to be passed into your templates.
|
|
|
|
replicaCount: 1
|
|
# numWorkers: 2
|
|
|
|
image:
|
|
# Use "ghcr.io/berriai/litellm-database" for optimized image with database
|
|
repository: ghcr.io/berriai/litellm-database
|
|
pullPolicy: Always
|
|
# Overrides the image tag whose default is the chart appVersion.
|
|
# tag: "latest"
|
|
tag: ""
|
|
|
|
imagePullSecrets: []
|
|
nameOverride: "litellm"
|
|
fullnameOverride: ""
|
|
|
|
serviceAccount:
|
|
# Specifies whether a service account should be created
|
|
create: false
|
|
# Automatically mount a ServiceAccount's API credentials?
|
|
automount: true
|
|
# Annotations to add to the service account
|
|
annotations: {}
|
|
# The name of the service account to use.
|
|
# If not set and create is true, a name is generated using the fullname template
|
|
name: ""
|
|
|
|
# annotations for litellm deployment
|
|
deploymentAnnotations: {}
|
|
deploymentLabels: {}
|
|
deploymentMinReadySeconds: 0
|
|
|
|
# annotations for litellm pods
|
|
podAnnotations: {}
|
|
podLabels: {}
|
|
|
|
# -- Deployment strategy configuration
|
|
# Example:
|
|
# type: RollingUpdate
|
|
# rollingUpdate:
|
|
# maxUnavailable: 0
|
|
# maxSurge: 1
|
|
strategy: {}
|
|
|
|
terminationGracePeriodSeconds: 90
|
|
topologySpreadConstraints:
|
|
[]
|
|
# - maxSkew: 1
|
|
# topologyKey: kubernetes.io/hostname
|
|
# whenUnsatisfiable: DoNotSchedule
|
|
# labelSelector:
|
|
# matchLabels:
|
|
# app: litellm
|
|
|
|
# At the time of writing, the litellm docker image requires write access to the
|
|
# filesystem on startup so that prisma can install some dependencies.
|
|
podSecurityContext: {}
|
|
securityContext:
|
|
{}
|
|
# capabilities:
|
|
# drop:
|
|
# - ALL
|
|
# readOnlyRootFilesystem: false
|
|
# runAsNonRoot: true
|
|
# runAsUser: 1000
|
|
|
|
# A list of Kubernetes Secret objects that will be exported to the LiteLLM proxy
|
|
# pod as environment variables. These secrets can then be referenced in the
|
|
# configuration file (or "litellm" ConfigMap) with `os.environ/<Env Var Name>`
|
|
environmentSecrets:
|
|
[]
|
|
# - litellm-env-secret
|
|
|
|
# A list of Kubernetes ConfigMap objects that will be exported to the LiteLLM proxy
|
|
# pod as environment variables. The ConfigMap kv-pairs can then be referenced in the
|
|
# configuration file (or "litellm" ConfigMap) with `os.environ/<Env Var Name>`
|
|
environmentConfigMaps:
|
|
[]
|
|
# - litellm-env-configmap
|
|
|
|
service:
|
|
type: ClusterIP
|
|
port: 4000
|
|
# If service type is `LoadBalancer` you can
|
|
# optionally specify loadBalancerClass
|
|
# loadBalancerClass: tailscale
|
|
|
|
# Probes for LiteLLM gateway container
|
|
livenessProbe:
|
|
path: /health/liveliness
|
|
initialDelaySeconds: 0
|
|
periodSeconds: 15
|
|
timeoutSeconds: 5
|
|
successThreshold: 1
|
|
failureThreshold: 5
|
|
|
|
readinessProbe:
|
|
path: /health/readiness
|
|
initialDelaySeconds: 0
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
successThreshold: 1
|
|
failureThreshold: 3
|
|
|
|
startupProbe:
|
|
path: /health/readiness
|
|
initialDelaySeconds: 0
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
successThreshold: 1
|
|
failureThreshold: 30
|
|
|
|
ingress:
|
|
enabled: false
|
|
className: "nginx"
|
|
labels: {}
|
|
annotations:
|
|
{}
|
|
# kubernetes.io/ingress.class: nginx
|
|
# kubernetes.io/tls-acme: "true"
|
|
hosts:
|
|
- host: api.example.local
|
|
paths:
|
|
- path: /
|
|
pathType: ImplementationSpecific
|
|
tls: []
|
|
# - secretName: chart-example-tls
|
|
# hosts:
|
|
# - chart-example.local
|
|
|
|
# masterkey: changeit
|
|
|
|
# if set, use this secret for the master key; otherwise, autogenerate a new one
|
|
masterkeySecretName: ""
|
|
|
|
# if set, use this secret key for the master key; otherwise, use the default key
|
|
masterkeySecretKey: ""
|
|
|
|
proxyConfigMap:
|
|
# when true, creates a new configmap
|
|
create: true
|
|
# if create is false and name is set, use existing ConfigMap
|
|
# create: false
|
|
# name: ""
|
|
# key: "config.yaml"
|
|
|
|
# The elements within proxy_config are rendered as config.yaml for the proxy
|
|
# Examples: https://github.com/BerriAI/litellm/tree/main/litellm/proxy/example_config_yaml
|
|
# Reference: https://docs.litellm.ai/docs/proxy/configs
|
|
proxy_config:
|
|
model_list:
|
|
# At least one model must exist for the proxy to start.
|
|
- model_name: gpt-3.5-turbo
|
|
litellm_params:
|
|
model: gpt-3.5-turbo
|
|
api_key: eXaMpLeOnLy
|
|
- model_name: fake-openai-endpoint
|
|
litellm_params:
|
|
model: openai/fake
|
|
api_key: fake-key
|
|
api_base: https://exampleopenaiendpoint-production.up.railway.app/
|
|
general_settings:
|
|
master_key: os.environ/PROXY_MASTER_KEY
|
|
|
|
resources:
|
|
{}
|
|
# We usually recommend not to specify default resources and to leave this as a conscious
|
|
# choice for the user. This also increases chances charts run on environments with little
|
|
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
|
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
|
# limits:
|
|
# cpu: 100m
|
|
# memory: 128Mi
|
|
# requests:
|
|
# cpu: 100m
|
|
# memory: 128Mi
|
|
|
|
autoscaling:
|
|
enabled: false
|
|
minReplicas: 1
|
|
maxReplicas: 100
|
|
targetCPUUtilizationPercentage: 80
|
|
# targetMemoryUtilizationPercentage: 80
|
|
# behavior: {}
|
|
|
|
# Autoscaling with keda is mutually exclusive with hpa
|
|
keda:
|
|
enabled: false
|
|
minReplicas: 1
|
|
maxReplicas: 100
|
|
pollingInterval: 30
|
|
cooldownPeriod: 300
|
|
# fallback:
|
|
# failureThreshold: 3
|
|
# replicas: 11
|
|
restoreToOriginalReplicaCount: false
|
|
scaledObject:
|
|
annotations: {}
|
|
triggers: []
|
|
# - type: prometheus
|
|
# metadata:
|
|
# serverAddress: http://<prometheus-host>:9090
|
|
# metricName: http_requests_total
|
|
# threshold: '100'
|
|
# query: sum(rate(http_requests_total{deployment="my-deployment"}[2m]))
|
|
behavior: {}
|
|
# scaleDown:
|
|
# stabilizationWindowSeconds: 300
|
|
# policies:
|
|
# - type: Pods
|
|
# value: 1
|
|
# periodSeconds: 180
|
|
# scaleUp:
|
|
# stabilizationWindowSeconds: 300
|
|
# policies:
|
|
# - type: Pods
|
|
# value: 2
|
|
# periodSeconds: 60
|
|
|
|
# Additional volumes on the output Deployment definition.
|
|
volumes: []
|
|
# - name: foo
|
|
# secret:
|
|
# secretName: mysecret
|
|
# optional: false
|
|
|
|
# Additional volumeMounts on the output Deployment definition.
|
|
volumeMounts: []
|
|
# - name: foo
|
|
# mountPath: "/etc/foo"
|
|
# readOnly: true
|
|
|
|
nodeSelector: {}
|
|
|
|
tolerations: []
|
|
|
|
affinity: {}
|
|
|
|
db:
|
|
# Use an existing postgres server/cluster
|
|
useExisting: false
|
|
|
|
# How to connect to the existing postgres server/cluster
|
|
endpoint: localhost
|
|
database: litellm
|
|
url: postgresql://$(DATABASE_USERNAME):$(DATABASE_PASSWORD)@$(DATABASE_HOST)/$(DATABASE_NAME)
|
|
secret:
|
|
name: postgres
|
|
usernameKey: username
|
|
passwordKey: password
|
|
# Optional: when set, DATABASE_HOST will be sourced from this secret key instead of db.endpoint
|
|
endpointKey: ""
|
|
# Optional: when set, DATABASE_URL_READ_REPLICA will be sourced from this
|
|
# secret key instead of db.readReplicaUrl. Prefer this over the plain
|
|
# value: read-replica URLs typically embed credentials, and a value
|
|
# written to db.readReplicaUrl ends up visible in the rendered pod spec
|
|
# and the Helm release secret.
|
|
readReplicaUrlKey: ""
|
|
|
|
# Optional read-replica routing. When set, the proxy sends read-only
|
|
# queries (find_*, count, group_by, query_raw/_first) to this URL while
|
|
# writes continue to go to db.url. Useful for Aurora-style clusters with
|
|
# separate reader/writer endpoints. Leave empty to keep single-DB behavior.
|
|
# When IAM_TOKEN_DB_AUTH is enabled, the reader URL is auto-refreshed
|
|
# alongside the writer (host/port/user/db are parsed from this URL once
|
|
# at startup; only the IAM token rotates).
|
|
#
|
|
# If the URL embeds credentials, prefer db.secret.readReplicaUrlKey over
|
|
# this field — the plain value is rendered into the pod spec and the
|
|
# Helm release secret. This field is intended for credential-less URLs
|
|
# only (e.g. when IAM_TOKEN_DB_AUTH supplies the token at runtime).
|
|
readReplicaUrl: ""
|
|
|
|
# Use the Stackgres Helm chart to deploy an instance of a Stackgres cluster.
|
|
# The Stackgres Operator must already be installed within the target
|
|
# Kubernetes cluster.
|
|
# TODO: Stackgres deployment currently unsupported
|
|
useStackgresOperator: false
|
|
|
|
# Use the Postgres Helm chart to create a single node, stand alone postgres
|
|
# instance. See the "postgresql" top level key for additional configuration.
|
|
deployStandalone: true
|
|
|
|
# Lifecycle hooks for the LiteLLM container
|
|
#
|
|
# Prefer the native /health/drain preStop hook over a fixed `sleep`: it marks
|
|
# the pod NotReady and blocks only until in-flight requests actually finish
|
|
# (bounded by GRACEFUL_SHUTDOWN_TIMEOUT, default 30s), instead of always
|
|
# waiting the worst-case duration. The drain runs once (the preStop hook and
|
|
# the SIGTERM handler share it), so set terminationGracePeriodSeconds a few
|
|
# seconds above GRACEFUL_SHUTDOWN_TIMEOUT to leave room for teardown before
|
|
# SIGKILL.
|
|
#
|
|
# /health/drain is off by default; enable it with
|
|
# general_settings.enable_drain_endpoint: true. The kubelet calls preStop
|
|
# hooks without proxy credentials, so when the health port is reachable from
|
|
# other pods (the common case) also set
|
|
# general_settings.drain_endpoint_token (or the DRAIN_ENDPOINT_TOKEN env
|
|
# var) and send the same value on the X-Drain-Token header from the hook.
|
|
# Calls missing/wrong the token get a 401 and have no side effect.
|
|
# Example:
|
|
# lifecycle:
|
|
# preStop:
|
|
# httpGet:
|
|
# path: /health/drain
|
|
# port: 4000
|
|
# httpHeaders:
|
|
# - name: X-Drain-Token
|
|
# value: <same value as drain_endpoint_token>
|
|
lifecycle: {}
|
|
|
|
# Settings for Bitnami postgresql chart (if db.deployStandalone is true, ignored
|
|
# otherwise)
|
|
postgresql:
|
|
architecture: standalone
|
|
auth:
|
|
username: litellm
|
|
database: litellm
|
|
|
|
# You should override these on the helm command line with
|
|
# `--set postgresql.auth.postgres-password=<some good password>,postgresql.auth.password=<some good password>`
|
|
password: NoTaGrEaTpAsSwOrD
|
|
postgres-password: NoTaGrEaTpAsSwOrD
|
|
|
|
# A secret is created by this chart (litellm-helm) with the credentials that
|
|
# the new Postgres instance should use.
|
|
# existingSecret: ""
|
|
# secretKeys:
|
|
# userPasswordKey: password
|
|
|
|
# Redis is the proxy's coordination store: cross-pod tpm/rpm rate limits, spend
|
|
# tracking, and the pod lock manager. Enabling this deploys the bundled Redis
|
|
# subchart, wires REDIS_HOST / REDIS_PORT / REDIS_PASSWORD into the proxy, and
|
|
# renders a `general_settings.coordination_redis` block into the proxy config.
|
|
#
|
|
# To point at an existing Redis instead, leave `enabled: false` and pass a
|
|
# secret for REDIS_HOST, REDIS_PORT, REDIS_PASSWORD or REDIS_URL; the proxy
|
|
# falls back to those env vars for coordination. Set `cache: true` in the proxy
|
|
# config only if you also want LLM response caching, which is independent of
|
|
# coordination
|
|
#
|
|
# When `redis.sentinel.enabled` is set, the coordination block is rendered with
|
|
# `sentinel_nodes` and `service_name` (from `redis.sentinel.masterSet`) instead
|
|
# of host/port, because a plain Redis client cannot talk to the sentinel port
|
|
redis:
|
|
enabled: false
|
|
architecture: standalone
|
|
coordination:
|
|
# Set to false to keep the bundled Redis for response caching only and leave
|
|
# `general_settings.coordination_redis` out of the rendered config. A
|
|
# `coordination_redis` block you define yourself in `proxy_config` always wins
|
|
enabled: true
|
|
|
|
# Prisma migration job settings
|
|
migrationJob:
|
|
enabled: true # Enable or disable the schema migration Job
|
|
retries: 3 # Number of retries for the Job in case of failure
|
|
backoffLimit: 4 # Backoff limit for Job restarts
|
|
disableSchemaUpdate: false # Skip schema migrations for specific environments. When True, the job will exit with code 0.
|
|
# Optional service account for the migration job.
|
|
# Only used when migrationJob.hooks.helm.enabled=true and serviceAccount.create=true.
|
|
# In that case, pre-install/pre-upgrade hooks run before normal resources, so this defaults to "default".
|
|
serviceAccountName: ""
|
|
annotations: {}
|
|
ttlSecondsAfterFinished: 120
|
|
resources: {}
|
|
# requests:
|
|
# cpu: 100m
|
|
# memory: 100Mi
|
|
extraContainers: []
|
|
extraInitContainers: []
|
|
|
|
# Hook configuration
|
|
hooks:
|
|
argocd:
|
|
enabled: true
|
|
helm:
|
|
enabled: false
|
|
|
|
# Log level for the litellm proxy (sets LITELLM_LOG in the deployment env).
|
|
# Rendered as a direct `env:` entry, which in Kubernetes takes precedence over
|
|
# any `envFrom:` source. If you currently source LITELLM_LOG from an
|
|
# environmentSecret or environmentConfigMap, set `logLevel: ""` here to
|
|
# disable injection — otherwise this value silently overrides your secret /
|
|
# configmap entry.
|
|
#
|
|
# Setting LITELLM_LOG inside `envVars:` below also wins: the template skips
|
|
# this injection entirely when envVars already defines LITELLM_LOG.
|
|
logLevel: INFO
|
|
|
|
# Additional environment variables to be added to the deployment as a map of key-value pairs
|
|
envVars: {}
|
|
|
|
# USE_DDTRACE: "true"
|
|
# Additional environment variables to be added to the deployment as a list of k8s env vars
|
|
extraEnvVars: {}
|
|
|
|
# if you want to override the container command, you can do so here
|
|
command: {}
|
|
# if you want to override the container args, you can do so here
|
|
args: {}
|
|
|
|
# - name: EXTRA_ENV_VAR
|
|
# value: EXTRA_ENV_VAR_VALUE
|
|
# Additional Kubernetes resources to deploy with litellm
|
|
extraResources: []
|
|
|
|
# - apiVersion: v1
|
|
# kind: ConfigMap
|
|
# metadata:
|
|
# name: my-extra-config
|
|
# data:
|
|
# foo: bar
|
|
# Pod Disruption Budget
|
|
pdb:
|
|
enabled: false
|
|
# Set exactly one of the following. If both are set, minAvailable takes precedence.
|
|
minAvailable: null # e.g. "50%" or 1
|
|
maxUnavailable: null # e.g. 1 or "20%"
|
|
annotations: {}
|
|
labels: {}
|
|
|
|
serviceMonitor:
|
|
enabled: false
|
|
labels:
|
|
{}
|
|
# test: test
|
|
annotations:
|
|
{}
|
|
# kubernetes.io/test: test
|
|
interval: 15s
|
|
scrapeTimeout: 10s
|
|
relabelings: []
|
|
# - targetLabel: __meta_kubernetes_pod_node_name
|
|
# replacement: $1
|
|
# action: replace
|
|
namespaceSelector:
|
|
matchNames: []
|
|
# - test-namespace
|