diff --git a/librechat/.env b/librechat/.env new file mode 100644 index 00000000..365a05c7 --- /dev/null +++ b/librechat/.env @@ -0,0 +1,661 @@ +#=====================================================================# +# LibreChat Configuration # +#=====================================================================# +# Please refer to the reference documentation for assistance # +# with configuring your LibreChat environment. # +# # +# https://www.librechat.ai/docs/configuration/dotenv # +#=====================================================================# + +#==================================================# +# Server Configuration # +#==================================================# + +HOST=0.0.0.0 +PORT=3080 + +MONGO_URI=mongodb://librechat_mongodb_1:27017/LibreChat + +DOMAIN_CLIENT=http://localhost:3080 +DOMAIN_SERVER=http://localhost:3080 + +NO_INDEX=true +# Use the address that is at most n number of hops away from the Express application. +# req.socket.remoteAddress is the first hop, and the rest are looked for in the X-Forwarded-For header from right to left. +# A value of 0 means that the first untrusted address would be req.socket.remoteAddress, i.e. there is no reverse proxy. +# Defaulted to 1. +TRUST_PROXY=1 + +#===============# +# JSON Logging # +#===============# + +# Use when process console logs in cloud deployment like GCP/AWS +CONSOLE_JSON=false + +#===============# +# Debug Logging # +#===============# + +DEBUG_LOGGING=true +DEBUG_CONSOLE=false + +#=============# +# Permissions # +#=============# + +# UID=1000 +# GID=1000 + +#===============# +# Configuration # +#===============# +# Use an absolute path, a relative path, or a URL + +# CONFIG_PATH="/alternative/path/to/librechat.yaml" + +#===================================================# +# Endpoints # +#===================================================# + +# ENDPOINTS=openAI,assistants,azureOpenAI,google,gptPlugins,anthropic + +PROXY= + +#===================================# +# Known Endpoints - librechat.yaml # +#===================================# +# https://www.librechat.ai/docs/configuration/librechat_yaml/ai_endpoints + +# ANYSCALE_API_KEY= +# APIPIE_API_KEY= +# COHERE_API_KEY= +# DEEPSEEK_API_KEY= +# DATABRICKS_API_KEY= +# FIREWORKS_API_KEY= +# GROQ_API_KEY= +# HUGGINGFACE_TOKEN= +# MISTRAL_API_KEY= +# OPENROUTER_KEY= +# PERPLEXITY_API_KEY= +# SHUTTLEAI_API_KEY= +# TOGETHERAI_API_KEY= +# UNIFY_API_KEY= +# XAI_API_KEY= + +#============# +# Anthropic # +#============# + +ANTHROPIC_API_KEY=user_provided +# ANTHROPIC_MODELS=claude-opus-4-20250514,claude-sonnet-4-20250514,claude-3-7-sonnet-20250219,claude-3-5-sonnet-20241022,claude-3-5-haiku-20241022,claude-3-opus-20240229,claude-3-sonnet-20240229,claude-3-haiku-20240307 +# ANTHROPIC_REVERSE_PROXY= + +#============# +# Azure # +#============# + +# Note: these variables are DEPRECATED +# Use the `librechat.yaml` configuration for `azureOpenAI` instead +# You may also continue to use them if you opt out of using the `librechat.yaml` configuration + +# AZURE_OPENAI_DEFAULT_MODEL=gpt-3.5-turbo # Deprecated +# AZURE_OPENAI_MODELS=gpt-3.5-turbo,gpt-4 # Deprecated +# AZURE_USE_MODEL_AS_DEPLOYMENT_NAME=TRUE # Deprecated +# AZURE_API_KEY= # Deprecated +# AZURE_OPENAI_API_INSTANCE_NAME= # Deprecated +# AZURE_OPENAI_API_DEPLOYMENT_NAME= # Deprecated +# AZURE_OPENAI_API_VERSION= # Deprecated +# AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME= # Deprecated +# AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME= # Deprecated +# PLUGINS_USE_AZURE="true" # Deprecated + +#=================# +# AWS Bedrock # +#=================# + +# BEDROCK_AWS_DEFAULT_REGION=us-east-1 # A default region must be provided +# BEDROCK_AWS_ACCESS_KEY_ID=someAccessKey +# BEDROCK_AWS_SECRET_ACCESS_KEY=someSecretAccessKey +# BEDROCK_AWS_SESSION_TOKEN=someSessionToken + +# Note: This example list is not meant to be exhaustive. If omitted, all known, supported model IDs will be included for you. +# BEDROCK_AWS_MODELS=anthropic.claude-3-5-sonnet-20240620-v1:0,meta.llama3-1-8b-instruct-v1:0 + +# See all Bedrock model IDs here: https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns + +# Notes on specific models: +# The following models are not support due to not supporting streaming: +# ai21.j2-mid-v1 + +# The following models are not support due to not supporting conversation history: +# ai21.j2-ultra-v1, cohere.command-text-v14, cohere.command-light-text-v14 + +#============# +# Google # +#============# + +GOOGLE_KEY=user_provided + +# GOOGLE_REVERSE_PROXY= +# Some reverse proxies do not support the X-goog-api-key header, uncomment to pass the API key in Authorization header instead. +# GOOGLE_AUTH_HEADER=true + +# Gemini API (AI Studio) +# GOOGLE_MODELS=gemini-2.5-pro-preview-05-06,gemini-2.5-flash-preview-04-17,gemini-2.0-flash-001,gemini-2.0-flash-exp,gemini-2.0-flash-lite-001,gemini-1.5-pro-002,gemini-1.5-flash-002 + +# Vertex AI +# GOOGLE_MODELS=gemini-2.5-pro-preview-05-06,gemini-2.5-flash-preview-04-17,gemini-2.0-flash-001,gemini-2.0-flash-exp,gemini-2.0-flash-lite-001,gemini-1.5-pro-002,gemini-1.5-flash-002 + +# GOOGLE_TITLE_MODEL=gemini-2.0-flash-lite-001 + +# GOOGLE_LOC=us-central1 + +# Google Safety Settings +# NOTE: These settings apply to both Vertex AI and Gemini API (AI Studio) +# +# For Vertex AI: +# To use the BLOCK_NONE setting, you need either: +# (a) Access through an allowlist via your Google account team, or +# (b) Switch to monthly invoiced billing: https://cloud.google.com/billing/docs/how-to/invoiced-billing +# +# For Gemini API (AI Studio): +# BLOCK_NONE is available by default, no special account requirements. +# +# Available options: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE +# +# GOOGLE_SAFETY_SEXUALLY_EXPLICIT=BLOCK_ONLY_HIGH +# GOOGLE_SAFETY_HATE_SPEECH=BLOCK_ONLY_HIGH +# GOOGLE_SAFETY_HARASSMENT=BLOCK_ONLY_HIGH +# GOOGLE_SAFETY_DANGEROUS_CONTENT=BLOCK_ONLY_HIGH +# GOOGLE_SAFETY_CIVIC_INTEGRITY=BLOCK_ONLY_HIGH + +#============# +# OpenAI # +#============# + +OPENAI_API_KEY=user_provided +# OPENAI_MODELS=o1,o1-mini,o1-preview,gpt-4o,gpt-4.5-preview,chatgpt-4o-latest,gpt-4o-mini,gpt-3.5-turbo-0125,gpt-3.5-turbo-0301,gpt-3.5-turbo,gpt-4,gpt-4-0613,gpt-4-vision-preview,gpt-3.5-turbo-0613,gpt-3.5-turbo-16k-0613,gpt-4-0125-preview,gpt-4-turbo-preview,gpt-4-1106-preview,gpt-3.5-turbo-1106,gpt-3.5-turbo-instruct,gpt-3.5-turbo-instruct-0914,gpt-3.5-turbo-16k + +DEBUG_OPENAI=false + +# TITLE_CONVO=false +# OPENAI_TITLE_MODEL=gpt-4o-mini + +# OPENAI_SUMMARIZE=true +# OPENAI_SUMMARY_MODEL=gpt-4o-mini + +# OPENAI_FORCE_PROMPT=true + +# OPENAI_REVERSE_PROXY= + +# OPENAI_ORGANIZATION= + +#====================# +# Assistants API # +#====================# + +ASSISTANTS_API_KEY=user_provided +# ASSISTANTS_BASE_URL= +# ASSISTANTS_MODELS=gpt-4o,gpt-4o-mini,gpt-3.5-turbo-0125,gpt-3.5-turbo-16k-0613,gpt-3.5-turbo-16k,gpt-3.5-turbo,gpt-4,gpt-4-0314,gpt-4-32k-0314,gpt-4-0613,gpt-3.5-turbo-0613,gpt-3.5-turbo-1106,gpt-4-0125-preview,gpt-4-turbo-preview,gpt-4-1106-preview + +#==========================# +# Azure Assistants API # +#==========================# + +# Note: You should map your credentials with custom variables according to your Azure OpenAI Configuration +# The models for Azure Assistants are also determined by your Azure OpenAI configuration. + +# More info, including how to enable use of Assistants with Azure here: +# https://www.librechat.ai/docs/configuration/librechat_yaml/ai_endpoints/azure#using-assistants-with-azure + +#============# +# Plugins # +#============# + +# PLUGIN_MODELS=gpt-4o,gpt-4o-mini,gpt-4,gpt-4-turbo-preview,gpt-4-0125-preview,gpt-4-1106-preview,gpt-4-0613,gpt-3.5-turbo,gpt-3.5-turbo-0125,gpt-3.5-turbo-1106,gpt-3.5-turbo-0613 + +DEBUG_PLUGINS=true + +CREDS_KEY=f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0 +CREDS_IV=e2341419ec3dd3d19b13a1a87fafcbfb + +# Azure AI Search +#----------------- +AZURE_AI_SEARCH_SERVICE_ENDPOINT= +AZURE_AI_SEARCH_INDEX_NAME= +AZURE_AI_SEARCH_API_KEY= + +AZURE_AI_SEARCH_API_VERSION= +AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE= +AZURE_AI_SEARCH_SEARCH_OPTION_TOP= +AZURE_AI_SEARCH_SEARCH_OPTION_SELECT= + +# OpenAI Image Tools Customization +#---------------- +# IMAGE_GEN_OAI_DESCRIPTION_WITH_FILES=Custom description for image generation tool when files are present +# IMAGE_GEN_OAI_DESCRIPTION_NO_FILES=Custom description for image generation tool when no files are present +# IMAGE_EDIT_OAI_DESCRIPTION=Custom description for image editing tool +# IMAGE_GEN_OAI_PROMPT_DESCRIPTION=Custom prompt description for image generation tool +# IMAGE_EDIT_OAI_PROMPT_DESCRIPTION=Custom prompt description for image editing tool + +# DALL·E +#---------------- +# DALLE_API_KEY= +# DALLE3_API_KEY= +# DALLE2_API_KEY= +# DALLE3_SYSTEM_PROMPT= +# DALLE2_SYSTEM_PROMPT= +# DALLE_REVERSE_PROXY= +# DALLE3_BASEURL= +# DALLE2_BASEURL= + +# DALL·E (via Azure OpenAI) +# Note: requires some of the variables above to be set +#---------------- +# DALLE3_AZURE_API_VERSION= +# DALLE2_AZURE_API_VERSION= + +# Flux +#----------------- +FLUX_API_BASE_URL=https://api.us1.bfl.ai +# FLUX_API_BASE_URL = 'https://api.bfl.ml'; + +# Get your API key at https://api.us1.bfl.ai/auth/profile +# FLUX_API_KEY= + +# Google +#----------------- +GOOGLE_SEARCH_API_KEY= +GOOGLE_CSE_ID= + +# YOUTUBE +#----------------- +YOUTUBE_API_KEY= + +# SerpAPI +#----------------- +SERPAPI_API_KEY= + +# Stable Diffusion +#----------------- +SD_WEBUI_URL= + +# Tavily +#----------------- +TAVILY_API_KEY= + +# Traversaal +#----------------- +TRAVERSAAL_API_KEY= + +# WolframAlpha +#----------------- +WOLFRAM_APP_ID= + +# Zapier +#----------------- +ZAPIER_NLA_API_KEY= + +#==================================================# +# Search # +#==================================================# + +SEARCH=true +MEILI_NO_ANALYTICS=true +MEILI_HOST=http://librechat_meilisearch_1:7700 +MEILI_MASTER_KEY=DrhYf7zENyR6AlUCKmnz0eYASOQdl6zxH7s7MKFSfFCt + +# Optional: Disable indexing, useful in a multi-node setup +# where only one instance should perform an index sync. +# MEILI_NO_SYNC=true + +#==================================================# +# Speech to Text & Text to Speech # +#==================================================# + +STT_API_KEY= +TTS_API_KEY= + +#==================================================# +# RAG # +#==================================================# +# More info: https://www.librechat.ai/docs/configuration/rag_api + +RAG_API_URL=http://librechat_rag_api_1:8000 +# RAG_OPENAI_BASEURL= +RAG_OPENAI_API_KEY=user_provided +# RAG_USE_FULL_CONTEXT= +# EMBEDDINGS_PROVIDER=openai +# EMBEDDINGS_MODEL=text-embedding-3-small + +#===================================================# +# User System # +#===================================================# + +#========================# +# Moderation # +#========================# + +OPENAI_MODERATION=false +OPENAI_MODERATION_API_KEY= +# OPENAI_MODERATION_REVERSE_PROXY= + +BAN_VIOLATIONS=true +BAN_DURATION=1000 * 60 * 60 * 2 +BAN_INTERVAL=20 + +LOGIN_VIOLATION_SCORE=1 +REGISTRATION_VIOLATION_SCORE=1 +CONCURRENT_VIOLATION_SCORE=1 +MESSAGE_VIOLATION_SCORE=1 +NON_BROWSER_VIOLATION_SCORE=20 + +LOGIN_MAX=7 +LOGIN_WINDOW=5 +REGISTER_MAX=5 +REGISTER_WINDOW=60 + +LIMIT_CONCURRENT_MESSAGES=true +CONCURRENT_MESSAGE_MAX=2 + +LIMIT_MESSAGE_IP=true +MESSAGE_IP_MAX=40 +MESSAGE_IP_WINDOW=1 + +LIMIT_MESSAGE_USER=false +MESSAGE_USER_MAX=40 +MESSAGE_USER_WINDOW=1 + +ILLEGAL_MODEL_REQ_SCORE=5 + +#========================# +# Balance # +#========================# + +# CHECK_BALANCE=false +# START_BALANCE=20000 # note: the number of tokens that will be credited after registration. + +#========================# +# Registration and Login # +#========================# + +ALLOW_EMAIL_LOGIN=true +ALLOW_REGISTRATION=false +ALLOW_SOCIAL_LOGIN=false +ALLOW_SOCIAL_REGISTRATION=false +ALLOW_PASSWORD_RESET=false +# ALLOW_ACCOUNT_DELETION=true # note: enabled by default if omitted/commented out +ALLOW_UNVERIFIED_EMAIL_LOGIN=true + +SESSION_EXPIRY=1000 * 60 * 15 +REFRESH_TOKEN_EXPIRY=(1000 * 60 * 60 * 24) * 7 + +JWT_SECRET=16f8c0ef4a5d391b26034086c628469d3f9f497f08163ab9b40137092f2909ef +JWT_REFRESH_SECRET=eaa5191f2914e30b9387fd84e254e4ba6fc51b4654968a9b0803b456a54b8418 + +# Discord +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= +DISCORD_CALLBACK_URL=/oauth/discord/callback + +# Facebook +FACEBOOK_CLIENT_ID= +FACEBOOK_CLIENT_SECRET= +FACEBOOK_CALLBACK_URL=/oauth/facebook/callback + +# GitHub +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +GITHUB_CALLBACK_URL=/oauth/github/callback +# GitHub Enterprise +# GITHUB_ENTERPRISE_BASE_URL= +# GITHUB_ENTERPRISE_USER_AGENT= + +# Google +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +GOOGLE_CALLBACK_URL=/oauth/google/callback + +# Apple +APPLE_CLIENT_ID= +APPLE_TEAM_ID= +APPLE_KEY_ID= +APPLE_PRIVATE_KEY_PATH= +APPLE_CALLBACK_URL=/oauth/apple/callback + +# OpenID +OPENID_CLIENT_ID= +OPENID_CLIENT_SECRET= +OPENID_ISSUER= +OPENID_SESSION_SECRET= +OPENID_SCOPE="openid profile email" +OPENID_CALLBACK_URL=/oauth/openid/callback +OPENID_REQUIRED_ROLE= +OPENID_REQUIRED_ROLE_TOKEN_KIND= +OPENID_REQUIRED_ROLE_PARAMETER_PATH= +# Set to determine which user info property returned from OpenID Provider to store as the User's username +OPENID_USERNAME_CLAIM= +# Set to determine which user info property returned from OpenID Provider to store as the User's name +OPENID_NAME_CLAIM= + +OPENID_BUTTON_LABEL= +OPENID_IMAGE_URL= +# Set to true to automatically redirect to the OpenID provider when a user visits the login page +# This will bypass the login form completely for users, only use this if OpenID is your only authentication method +OPENID_AUTO_REDIRECT=false +# Set to true to use PKCE (Proof Key for Code Exchange) for OpenID authentication +OPENID_USE_PKCE=false +#Set to true to reuse openid tokens for authentication management instead of using the mongodb session and the custom refresh token. +OPENID_REUSE_TOKENS= +#By default, signing key verification results are cached in order to prevent excessive HTTP requests to the JWKS endpoint. +#If a signing key matching the kid is found, this will be cached and the next time this kid is requested the signing key will be served from the cache. +#Default is true. +OPENID_JWKS_URL_CACHE_ENABLED= +OPENID_JWKS_URL_CACHE_TIME= # 600000 ms eq to 10 minutes leave empty to disable caching +#Set to true to trigger token exchange flow to acquire access token for the userinfo endpoint. +OPENID_ON_BEHALF_FLOW_FOR_USERINFRO_REQUIRED= +OPENID_ON_BEHALF_FLOW_USERINFRO_SCOPE = "user.read" # example for Scope Needed for Microsoft Graph API +# Set to true to use the OpenID Connect end session endpoint for logout +OPENID_USE_END_SESSION_ENDPOINT= + + +# SAML +# Note: If OpenID is enabled, SAML authentication will be automatically disabled. +SAML_ENTRY_POINT= +SAML_ISSUER= +SAML_CERT= +SAML_CALLBACK_URL=/oauth/saml/callback +SAML_SESSION_SECRET= + +# Attribute mappings (optional) +SAML_EMAIL_CLAIM= +SAML_USERNAME_CLAIM= +SAML_GIVEN_NAME_CLAIM= +SAML_FAMILY_NAME_CLAIM= +SAML_PICTURE_CLAIM= +SAML_NAME_CLAIM= + +# Logint buttion settings (optional) +SAML_BUTTON_LABEL= +SAML_IMAGE_URL= + +# Whether the SAML Response should be signed. +# - If "true", the entire `SAML Response` will be signed. +# - If "false" or unset, only the `SAML Assertion` will be signed (default behavior). +# SAML_USE_AUTHN_RESPONSE_SIGNED= + + +# LDAP +LDAP_URL= +LDAP_BIND_DN= +LDAP_BIND_CREDENTIALS= +LDAP_USER_SEARCH_BASE= +#LDAP_SEARCH_FILTER="mail=" +LDAP_CA_CERT_PATH= +# LDAP_TLS_REJECT_UNAUTHORIZED= +# LDAP_STARTTLS= +# LDAP_LOGIN_USES_USERNAME=true +# LDAP_ID= +# LDAP_USERNAME= +# LDAP_EMAIL= +# LDAP_FULL_NAME= + +#========================# +# Email Password Reset # +#========================# + +EMAIL_SERVICE= +EMAIL_HOST= +EMAIL_PORT=25 +EMAIL_ENCRYPTION= +EMAIL_ENCRYPTION_HOSTNAME= +EMAIL_ALLOW_SELFSIGNED= +EMAIL_USERNAME= +EMAIL_PASSWORD= +EMAIL_FROM_NAME= +EMAIL_FROM=noreply@librechat.ai + +#========================# +# Mailgun API # +#========================# + +# MAILGUN_API_KEY=your-mailgun-api-key +# MAILGUN_DOMAIN=mg.yourdomain.com +# EMAIL_FROM=noreply@yourdomain.com +# EMAIL_FROM_NAME="LibreChat" + +# # Optional: For EU region +# MAILGUN_HOST=https://api.eu.mailgun.net + +#========================# +# Firebase CDN # +#========================# + +FIREBASE_API_KEY= +FIREBASE_AUTH_DOMAIN= +FIREBASE_PROJECT_ID= +FIREBASE_STORAGE_BUCKET= +FIREBASE_MESSAGING_SENDER_ID= +FIREBASE_APP_ID= + +#========================# +# S3 AWS Bucket # +#========================# + +AWS_ENDPOINT_URL= +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_REGION= +AWS_BUCKET_NAME= + +#========================# +# Azure Blob Storage # +#========================# + +AZURE_STORAGE_CONNECTION_STRING= +AZURE_STORAGE_PUBLIC_ACCESS=false +AZURE_CONTAINER_NAME=files + +#========================# +# Shared Links # +#========================# + +ALLOW_SHARED_LINKS=true +ALLOW_SHARED_LINKS_PUBLIC=true + +#==============================# +# Static File Cache Control # +#==============================# + +# Leave commented out to use defaults: 1 day (86400 seconds) for s-maxage and 2 days (172800 seconds) for max-age +# NODE_ENV must be set to production for these to take effect +# STATIC_CACHE_MAX_AGE=172800 +# STATIC_CACHE_S_MAX_AGE=86400 + +# If you have another service in front of your LibreChat doing compression, disable express based compression here +# DISABLE_COMPRESSION=true + +#===================================================# +# UI # +#===================================================# + +APP_TITLE=LibreChat +# CUSTOM_FOOTER="My custom footer" +HELP_AND_FAQ_URL=https://librechat.ai + +# SHOW_BIRTHDAY_ICON=true + +# Google tag manager id +#ANALYTICS_GTM_ID=user provided google tag manager id + +#===============# +# REDIS Options # +#===============# + +# REDIS_URI=10.10.10.10:6379 +# USE_REDIS=true + +# USE_REDIS_CLUSTER=true +# REDIS_CA=/path/to/ca.crt + +#==================================================# +# Others # +#==================================================# +# You should leave the following commented out # + +# NODE_ENV= + +# E2E_USER_EMAIL= +# E2E_USER_PASSWORD= + +#=====================================================# +# Cache Headers # +#=====================================================# +# Headers that control caching of the index.html # +# Default configuration prevents caching to ensure # +# users always get the latest version. Customize # +# only if you understand caching implications. # + +# INDEX_CACHE_CONTROL=no-cache, no-store, must-revalidate +# INDEX_PRAGMA=no-cache +# INDEX_EXPIRES=0 + +# no-cache: Forces validation with server before using cached version +# no-store: Prevents storing the response entirely +# must-revalidate: Prevents using stale content when offline + +#=====================================================# +# OpenWeather # +#=====================================================# +OPENWEATHER_API_KEY= + +#====================================# +# LibreChat Code Interpreter API # +#====================================# + +# https://code.librechat.ai +# LIBRECHAT_CODE_API_KEY=your-key + +#======================# +# Web Search # +#======================# + +# Note: All of the following variable names can be customized. +# Omit values to allow user to provide them. + +# For more information on configuration values, see: +# https://librechat.ai/docs/features/web_search + +# Search Provider (Required) +# SERPER_API_KEY=your_serper_api_key + +# Scraper (Required) +# FIRECRAWL_API_KEY=your_firecrawl_api_key +# Optional: Custom Firecrawl API URL +# FIRECRAWL_API_URL=your_firecrawl_api_url + +# Reranker (Required) +# JINA_API_KEY=your_jina_api_key +# or +# COHERE_API_KEY=your_cohere_api_key diff --git a/librechat/data/api/images/.gitkeep b/librechat/data/api/images/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/data/api/librechat.yaml b/librechat/data/api/librechat.yaml new file mode 100644 index 00000000..ecad103a --- /dev/null +++ b/librechat/data/api/librechat.yaml @@ -0,0 +1,277 @@ +# For more information, see the Configuration Guide: +# https://www.librechat.ai/docs/configuration/librechat_yaml + +# Configuration version (required) +version: 1.2.1 + +# Cache settings: Set to true to enable caching +cache: true + +# File strategy s3/firebase +# fileStrategy: "s3" + +# Custom interface configuration +interface: + customWelcome: "Welcome to LibreChat! Enjoy your experience." + # Privacy policy settings + privacyPolicy: + externalUrl: 'https://librechat.ai/privacy-policy' + openNewTab: true + + endpointsMenu: true + modelSelect: true + parameters: true + sidePanel: true + presets: true + prompts: true + bookmarks: true + multiConvo: true + agents: true + +# Example Cloudflare turnstile (optional) +#turnstile: +# siteKey: "your-site-key-here" +# options: +# language: "auto" # "auto" or an ISO 639-1 language code (e.g. en) +# size: "normal" # Options: "normal", "compact", "flexible", or "invisible" + +# Example Registration Object Structure (optional) +registration: + socialLogins: ['github', 'google', 'discord', 'openid', 'facebook', 'apple', 'saml'] + # allowedDomains: + # - "gmail.com" + + +# Example Balance settings +# balance: +# enabled: false +# startBalance: 20000 +# autoRefillEnabled: false +# refillIntervalValue: 30 +# refillIntervalUnit: 'days' +# refillAmount: 10000 + +# speech: +# tts: +# openai: +# url: '' +# apiKey: '${TTS_API_KEY}' +# model: '' +# voices: [''] + +# +# stt: +# openai: +# url: '' +# apiKey: '${STT_API_KEY}' +# model: '' + +# rateLimits: +# fileUploads: +# ipMax: 100 +# ipWindowInMinutes: 60 # Rate limit window for file uploads per IP +# userMax: 50 +# userWindowInMinutes: 60 # Rate limit window for file uploads per user +# conversationsImport: +# ipMax: 100 +# ipWindowInMinutes: 60 # Rate limit window for conversation imports per IP +# userMax: 50 +# userWindowInMinutes: 60 # Rate limit window for conversation imports per user + +# Example Actions Object Structure +actions: + allowedDomains: + - "swapi.dev" + - "librechat.ai" + - "google.com" + +# Example MCP Servers Object Structure +# mcpServers: +# everything: +# # type: sse # type can optionally be omitted +# url: http://localhost:3001/sse +# timeout: 60000 # 1 minute timeout for this server, this is the default timeout for MCP servers. +# puppeteer: +# type: stdio +# command: npx +# args: +# - -y +# - "@modelcontextprotocol/server-puppeteer" +# timeout: 300000 # 5 minutes timeout for this server +# filesystem: +# # type: stdio +# command: npx +# args: +# - -y +# - "@modelcontextprotocol/server-filesystem" +# - /home/user/LibreChat/ +# iconPath: /home/user/LibreChat/client/public/assets/logo.svg +# mcp-obsidian: +# command: npx +# args: +# - -y +# - "mcp-obsidian" +# - /path/to/obsidian/vault + +# Definition of custom endpoints +endpoints: + # assistants: + # disableBuilder: false # Disable Assistants Builder Interface by setting to `true` + # pollIntervalMs: 3000 # Polling interval for checking assistant updates + # timeoutMs: 180000 # Timeout for assistant operations + # # Should only be one or the other, either `supportedIds` or `excludedIds` + # supportedIds: ["asst_supportedAssistantId1", "asst_supportedAssistantId2"] + # # excludedIds: ["asst_excludedAssistantId"] + # # Only show assistants that the user created or that were created externally (e.g. in Assistants playground). + # # privateAssistants: false # Does not work with `supportedIds` or `excludedIds` + # # (optional) Models that support retrieval, will default to latest known OpenAI models that support the feature + # retrievalModels: ["gpt-4-turbo-preview"] + # # (optional) Assistant Capabilities available to all users. Omit the ones you wish to exclude. Defaults to list below. + # capabilities: ["code_interpreter", "retrieval", "actions", "tools", "image_vision"] + # agents: + # # (optional) Default recursion depth for agents, defaults to 25 + # recursionLimit: 50 + # # (optional) Max recursion depth for agents, defaults to 25 + # maxRecursionLimit: 100 + # # (optional) Disable the builder interface for agents + # disableBuilder: false + # # (optional) Agent Capabilities available to all users. Omit the ones you wish to exclude. Defaults to list below. + # capabilities: ["execute_code", "file_search", "actions", "tools"] + custom: + # Ollama example + - name: "Ollama" + apiKey: "ollama" + # use 'host.docker.internal' instead of localhost if running LibreChat in a docker container + baseURL: "http://ollama_ollama_1:11434/v1/" + models: + default: + [ + 'llama3.2' + ] + # fetching list of models is supported but the `name` field must start + # with `ollama` (case-insensitive), as it does in this example. + fetch: false + titleConvo: true + titleModel: "current_model" + summarize: false + summaryModel: "current_model" + forcePrompt: false + modelDisplayLabel: "Ollama" + # Groq Example + # - name: 'groq' + # apiKey: '${GROQ_API_KEY}' + # baseURL: 'https://api.groq.com/openai/v1/' + # models: + # default: + # [ + # 'llama3-70b-8192', + # 'llama3-8b-8192', + # 'llama2-70b-4096', + # 'mixtral-8x7b-32768', + # 'gemma-7b-it', + # ] + # fetch: false + # titleConvo: true + # titleModel: 'mixtral-8x7b-32768' + # modelDisplayLabel: 'groq' + + # # Mistral AI Example + # - name: 'Mistral' # Unique name for the endpoint + # # For `apiKey` and `baseURL`, you can use environment variables that you define. + # # recommended environment variables: + # apiKey: '${MISTRAL_API_KEY}' + # baseURL: 'https://api.mistral.ai/v1' + + # # Models configuration + # models: + # # List of default models to use. At least one value is required. + # default: ['mistral-tiny', 'mistral-small', 'mistral-medium'] + # # Fetch option: Set to true to fetch models from API. + # fetch: true # Defaults to false. + + # # Optional configurations + + # # Title Conversation setting + # titleConvo: true # Set to true to enable title conversation + + # # Title Method: Choose between "completion" or "functions". + # # titleMethod: "completion" # Defaults to "completion" if omitted. + + # # Title Model: Specify the model to use for titles. + # titleModel: 'mistral-tiny' # Defaults to "gpt-3.5-turbo" if omitted. + + # # Summarize setting: Set to true to enable summarization. + # # summarize: false + + # # Summary Model: Specify the model to use if summarization is enabled. + # # summaryModel: "mistral-tiny" # Defaults to "gpt-3.5-turbo" if omitted. + + # # Force Prompt setting: If true, sends a `prompt` parameter instead of `messages`. + # # forcePrompt: false + + # # The label displayed for the AI model in messages. + # modelDisplayLabel: 'Mistral' # Default is "AI" when not set. + + # # Add additional parameters to the request. Default params will be overwritten. + # # addParams: + # # safe_prompt: true # This field is specific to Mistral AI: https://docs.mistral.ai/api/ + + # # Drop Default params parameters from the request. See default params in guide linked below. + # # NOTE: For Mistral, it is necessary to drop the following parameters or you will encounter a 422 Error: + # dropParams: ['stop', 'user', 'frequency_penalty', 'presence_penalty'] + + # # OpenRouter Example + # - name: 'OpenRouter' + # # For `apiKey` and `baseURL`, you can use environment variables that you define. + # # recommended environment variables: + # apiKey: '${OPENROUTER_KEY}' + # baseURL: 'https://openrouter.ai/api/v1' + # models: + # default: ['meta-llama/llama-3-70b-instruct'] + # fetch: true + # titleConvo: true + # titleModel: 'meta-llama/llama-3-70b-instruct' + # # Recommended: Drop the stop parameter from the request as Openrouter models use a variety of stop tokens. + # dropParams: ['stop'] + # modelDisplayLabel: 'OpenRouter' + + # # Portkey AI Example + # - name: "Portkey" + # apiKey: "dummy" + # baseURL: 'https://api.portkey.ai/v1' + # headers: + # x-portkey-api-key: '${PORTKEY_API_KEY}' + # x-portkey-virtual-key: '${PORTKEY_OPENAI_VIRTUAL_KEY}' + # models: + # default: ['gpt-4o-mini', 'gpt-4o', 'chatgpt-4o-latest'] + # fetch: true + # titleConvo: true + # titleModel: 'current_model' + # summarize: false + # summaryModel: 'current_model' + # forcePrompt: false + # modelDisplayLabel: 'Portkey' + # iconURL: https://images.crunchbase.com/image/upload/c_pad,f_auto,q_auto:eco,dpr_1/rjqy7ghvjoiu4cd1xjbf +# fileConfig: +# endpoints: +# assistants: +# fileLimit: 5 +# fileSizeLimit: 10 # Maximum size for an individual file in MB +# totalSizeLimit: 50 # Maximum total size for all files in a single request in MB +# supportedMimeTypes: +# - "image/.*" +# - "application/pdf" +# openAI: +# disabled: true # Disables file uploading to the OpenAI endpoint +# default: +# totalSizeLimit: 20 +# YourCustomEndpointName: +# fileLimit: 2 +# fileSizeLimit: 5 +# serverFileSizeLimit: 100 # Global server file size limit in MB +# avatarSizeLimit: 2 # Limit for user avatar image size in MB +# imageGeneration: # Image Gen settings, either percentage or px +# percentage: 100 +# px: 1024 +# # See the Custom Configuration Guide for more information on Assistants Config: +# # https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/assistants_endpoint diff --git a/librechat/data/api/logs/.gitkeep b/librechat/data/api/logs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/data/api/uploads/.gitkeep b/librechat/data/api/uploads/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/data/db/.gitkeep b/librechat/data/db/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/data/meilisearch/.gitkeep b/librechat/data/meilisearch/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/data/vectordb/.gitkeep b/librechat/data/vectordb/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/librechat/docker-compose.yml b/librechat/docker-compose.yml new file mode 100644 index 00000000..b2b39fc0 --- /dev/null +++ b/librechat/docker-compose.yml @@ -0,0 +1,81 @@ +version: "3.7" + +services: + app_proxy: + environment: + APP_HOST: librechat_api_1 + APP_PORT: 3080 + + api: + image: ghcr.io/danny-avila/librechat:0.7.8@sha256:7fe76551a78eaa93f12f52a8e80d2c977fad08ca34ed2d0a821aaea7f24f3e62 + restart: on-failure + user: "1000:1000" + command: npm run backend:dev + env_file: + - path: ${APP_DATA_DIR}/.env + environment: + - HOST=0.0.0.0 + - MONGO_URI=mongodb://librechat_mongodb_1:27017/LibreChat + - MEILI_HOST=http://librechat_meilisearch_1:7700 + - RAG_PORT=8000 + - RAG_API_URL=http://librechat_rag_api_1:8000 + - OPENAI_API_KEY=user_provided + - GOOGLE_KEY=user_provided + - ANTHROPIC_API_KEY=user_provided + - ASSISTANTS_API_KEY=user_provided + - CREDS_KEY=f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0 + - CREDS_IV=e2341419ec3dd3d19b13a1a87fafcbfb + - JWT_SECRET=16f8c0ef4a5d391b26034086c628469d3f9f497f08163ab9b40137092f2909ef + - JWT_REFRESH_SECRET=eaa5191f2914e30b9387fd84e254e4ba6fc51b4654968a9b0803b456a54b8418 + volumes: + - ${APP_DATA_DIR}/data/api/librechat.yaml:/app/librechat.yaml + - ${APP_DATA_DIR}/data/api/images:/app/client/public/images + - ${APP_DATA_DIR}/data/api/uploads:/app/uploads + - ${APP_DATA_DIR}/data/api/logs:/app/api/logs + depends_on: + - mongodb + - rag_api + + mongodb: + image: mongo:8.0.10@sha256:15fb53a5160ebabff5ecade8f8b5d48721b68ea190957a7f35b5b38e8340e62b + restart: on-failure + user: "1000:1000" + volumes: + - ${APP_DATA_DIR}/data/db:/data/db + command: mongod --noauth + + meilisearch: + image: getmeili/meilisearch:v1.12.3@sha256:4acfcbbb9e089aa1aac838cfda3fba7f07aaaef044c23da8acbe0ab741400dac + restart: on-failure + user: "1000:1000" + environment: + - MEILI_HOST=http://librechat_meilisearch_1:7700 + - MEILI_NO_ANALYTICS=true + - MEILI_MASTER_KEY=DrhYf7zENyR6AlUCKmnz0eYASOQdl6zxH7s7MKFSfFCt + volumes: + - ${APP_DATA_DIR}/data/meilisearch:/meili_data + + vectordb: + image: ankane/pgvector:v0.5.1@sha256:d3a9d8ac27bb7e05e333ef25b634d2625adaa85336ab729954b9e94859bf6fa7 + environment: + POSTGRES_DB: mydatabase + POSTGRES_USER: myuser + POSTGRES_PASSWORD: mypassword + restart: on-failure + volumes: + - ${APP_DATA_DIR}/data/vectordb:/var/lib/postgresql/data + + rag_api: + image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:v0.5.0@sha256:c734c37ec42426d862a986f8dc6e253bcd848f901d27be62d9dc63dd16847016 + env_file: + - path: ${APP_DATA_DIR}/.env + environment: + - DB_HOST=librechat_vectordb_1 + - RAG_PORT=8000 + - OPENAI_API_KEY=user_provided + - GOOGLE_KEY=user_provided + - ANTHROPIC_API_KEY=user_provided + - ASSISTANTS_API_KEY=user_provided + restart: on-failure + depends_on: + - vectordb diff --git a/librechat/hooks/pre-start b/librechat/hooks/pre-start new file mode 100755 index 00000000..49bfca94 --- /dev/null +++ b/librechat/hooks/pre-start @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -euo pipefail + +# sentinel file to check if user was already initialised +USER_SENTINEL="${APP_DATA_DIR}/.user_created" + +# default user name and email +USER_NAME="Umbrel" +USER_EMAIL="umbrel@umbrel.local" + +# max number of tries and sleep time between them (60 seconds) +MAX_TRIES=12 +SLEEP_SECS=5 + +# ────────────────────────────────────────────────────────────── +# Skip bootstrap entirely if user already initialised +# ────────────────────────────────────────────────────────────── +if [[ -f "$USER_SENTINEL" ]]; then + echo "Librechat: user already initialised - skipping bootstrap." + exit 0 +fi + +# ────────────────────────────────────────────────────────────── +# Bring the full stack up so that migrations run automatically +# We can probably only bring up necessary services here, but doing this for simplicity +# --wait is ignored on old Compose versions (umbrelOS < 1.0) +# ────────────────────────────────────────────────────────────── +echo "Librechat: starting full stack to run migrations…" +"${UMBREL_ROOT}/scripts/app" compose "${APP_ID}" \ + up -d --wait --wait-timeout 90 + +# ────────────────────────────────────────────────────────────── +# Retry until the user is created (max 60 s) +# All containers are running, so this should succeed first try +# But including a retry loop for robustness +# ────────────────────────────────────────────────────────────── +echo "Librechat: ensuring user exists…" +for ((try=1; try<=MAX_TRIES; try++)); do + # - The helper exits 0 on success, letting the enclosing loop know we’re done. + if "${UMBREL_ROOT}/scripts/app" compose "${APP_ID}" exec -T api node config/create-user.js "${USER_EMAIL}" "${USER_NAME}" "${USER_NAME}" "${APP_PASSWORD}" --email-verified=true ; then + touch "$USER_SENTINEL" + echo "Librechat: user ready." + break + fi + echo " Attempt $try/$MAX_TRIES failed - retrying in ${SLEEP_SECS}s…" + sleep "$SLEEP_SECS" +done + +if [[ ! -f "$USER_SENTINEL" ]]; then + echo "Librechat ERROR: could not create user after $MAX_TRIES attempts." + exit 1 +fi + +echo "Librechat: bootstrap finished - stopping stack for clean start…" +"${UMBREL_ROOT}/scripts/app" compose "${APP_ID}" stop diff --git a/librechat/umbrel-app.yml b/librechat/umbrel-app.yml new file mode 100644 index 00000000..6415653e --- /dev/null +++ b/librechat/umbrel-app.yml @@ -0,0 +1,88 @@ +manifestVersion: 1.1 +id: librechat +name: LibreChat +tagline: Enhanced ChatGPT Clone +category: ai +version: "v0.7.8" +port: 7050 +description: >- + Enhanced ChatGPT Clone: Features Agents, DeepSeek, Anthropic, AWS, OpenAI, Assistants API, Azure, Groq, o1, GPT-4o, Mistral, OpenRouter, Vertex AI, Gemini, Artifacts, AI model switching, message search, Code Interpreter, langchain, DALL-E-3, OpenAPI Actions, Functions, Secure Multi-User Auth, Presets, open-source for self-hosting. + + + ✨ Features + - 🖥️ UI & Experience inspired by ChatGPT with enhanced design and features + - 🤖 AI Model Selection: + - Anthropic (Claude), AWS Bedrock, OpenAI, Azure OpenAI, Google, Vertex AI, OpenAI Assistants API (incl. Azure) + - Custom Endpoints: Use any OpenAI-compatible API with LibreChat, no proxy required + - Compatible with Local & Remote AI Providers: + - Ollama, groq, Cohere, Mistral AI, Apple MLX, koboldcpp, together.ai, + - OpenRouter, Perplexity, ShuttleAI, Deepseek, Qwen, and more + - 🔧 Code Interpreter API: + - Secure, Sandboxed Execution in Python, Node.js (JS/TS), Go, C/C++, Java, PHP, Rust, and Fortran + - Seamless File Handling: Upload, process, and download files directly + - No Privacy Concerns: Fully isolated and secure execution + - 🔦 Agents & Tools Integration: + - LibreChat Agents: + - No-Code Custom Assistants: Build specialized, AI-driven helpers without coding + - Flexible & Extensible: Attach tools like DALL-E-3, file search, code execution, and more + - Compatible with Custom Endpoints, OpenAI, Azure, Anthropic, AWS Bedrock, and more + - Model Context Protocol (MCP) Support for Tools + - Use LibreChat Agents and OpenAI Assistants with Files, Code Interpreter, Tools, and API Actions + - 🔍 Web Search: + - Search the internet and retrieve relevant information to enhance your AI context + - Combines search providers, content scrapers, and result rerankers for optimal results + - 🪄 Generative UI with Code Artifacts: + - Code Artifacts allow creation of React, HTML, and Mermaid diagrams directly in chat + - 🎨 Image Generation & Editing + - Text-to-image and image-to-image with GPT-Image-1 + - Text-to-image with DALL-E (3/2), Stable Diffusion, Flux, or any MCP server + - Produce stunning visuals from prompts or refine existing images with a single instruction + - 💾 Presets & Context Management: + - Create, Save, & Share Custom Presets + - Switch between AI Endpoints and Presets mid-chat + - Edit, Resubmit, and Continue Messages with Conversation branching + - Fork Messages & Conversations for Advanced Context control + - 💬 Multimodal & File Interactions: + - Upload and analyze images with Claude 3, GPT-4.5, GPT-4o, o1, Llama-Vision, and Gemini 📸 + - Chat with Files using Custom Endpoints, OpenAI, Azure, Anthropic, AWS Bedrock, & Google 🗃️ + - 🌎 Multilingual UI: + - English, 中文, Deutsch, Español, Français, Italiano, Polski, Português Brasileiro + - Русский, 日本語, Svenska, 한국어, Tiếng Việt, 繁體中文, العربية, Türkçe, Nederlands, עברית + - 🧠 Reasoning UI: + - Dynamic Reasoning UI for Chain-of-Thought/Reasoning AI models like DeepSeek-R1 + - 🎨 Customizable Interface: + - Customizable Dropdown & Interface that adapts to both power users and newcomers + - 🗣️ Speech & Audio: + - Chat hands-free with Speech-to-Text and Text-to-Speech + - Automatically send and play Audio + - Supports OpenAI, Azure OpenAI, and Elevenlabs + - 📥 Import & Export Conversations: + - Import Conversations from LibreChat, ChatGPT, Chatbot UI + - Export conversations as screenshots, markdown, text, json + - 🔍 Search & Discovery: + - Search all messages/conversations + - 👥 Multi-User & Secure Access: + - Multi-User, Secure Authentication with OAuth2, LDAP, & Email Login Support + - Built-in Moderation, and Token spend tools + - ⚙️ Configuration & Deployment: + - Configure Proxy, Reverse Proxy, Docker, & many Deployment options + - Use completely local or deploy on the cloud + - 📖 Open-Source & Community: + - Completely Open-Source & Built in Public + - Community-driven development, support, and feedback +developer: Danny Avila +website: https://librechat.ai/ +submitter: al-lac +submission: https://github.com/getumbrel/umbrel-apps/pull/2947 +repo: https://github.com/danny-avila/LibreChat +support: https://github.com/danny-avila/LibreChat/issues +gallery: + - 1.jpg + - 2.jpg + - 3.jpg +defaultUsername: "umbrel@umbrel.local" +defaultPassword: "" +deterministicPassword: true +dependencies: [] +releaseNotes: "" +path: ""