Skip to content
TestLookupTestLookup
Search Ctrl K

Search TestLookup

Enter a term to search the local static index.

    Configuration reference

    This page lists every TestLookup setting, with its type and its default value in the code of this version. Your Compose file, Helm values, Kustomize overlay, .env file, secret store or saved project settings can change these defaults.

    The table below is built automatically from TestLookup’s settings code. For each setting it gives the name, the type, any other name TestLookup accepts, the default and the allowed range. It shows what TestLookup does when nothing else sets a value, so your installation may use different values.

    The backend, the background workers (Celery) and the scheduler (Celery beat) all read the same settings. TestLookup looks for each value in this order:

    1. An environment variable passed to the process.
    2. A .env file in the working folder.
    3. The default in the code.

    Names are case sensitive, and an empty value counts as not set. TestLookup ignores a name it does not know and shows no error, so check the spelling: a misspelled variable simply has no effect.

    For these groups of settings, a value saved in the TestLookup screens wins over the environment variable, whether it turns a feature on or off:

    • AI provider, model and analysis settings (/settings/ai).
    • Integration settings (/settings/integrations).
    • Email (SMTP) settings.
    • Storage addresses (/settings/storage).

    Offline mode (AI_OFFLINE_MODE) is the exception. The AI settings page can make it stricter, but never looser. The table has no descriptions. The hand-written configuration guide on GitHub explains what each setting does and when to change it.

    The defaults in this table come from the code. Nothing here is read from a .env file, a cluster secret or a running server. The configuration guide on GitHub explains what each setting does, and the deployment guide lists what production needs.

    SettingTypeDefault in code and allowed values
    APP_NAMEstr'TestLookup'
    APP_ENVLiteral['development', 'staging', 'production']'development'
    APP_SECRET_KEYstr'change-me-in-production'
    APP_SECRET_KEY_PREVIOUSOptional[str]None
    APP_DEBUGboolFalse
    APP_VERSIONstr'0.0.1'
    BUILD_REVISIONstr''
    BUILD_DATEstr''
    CORS_ORIGINS_RAW (also read as CORS_ORIGINS)str'http://localhost:3000,http://localhost:5173'
    PUBLIC_BASE_URLstr''
    POSTGRES_HOSTstr'localhost'
    POSTGRES_PORTint5433
    POSTGRES_DBstr'testlookup'
    POSTGRES_USERstr'testlookup_user'
    POSTGRES_PASSWORDstr''
    DATABASE_URLstr''
    MONGO_HOSTstr'localhost'
    MONGO_PORTint27017
    MONGO_DBstr'testlookup_logs'
    MONGO_URIstr'mongodb://localhost:27017'
    STORAGE_BACKENDLiteral['minio', 's3', 'local']'minio'
    LOCAL_STORAGE_PATHstr'/tmp/testlookup_data'
    MINIO_ENDPOINTstr'localhost:9000'
    MINIO_ACCESS_KEYstr'testlookup_minio'
    MINIO_SECRET_KEYstr''
    MINIO_BUCKET_NAMEstr'test-telemetry'
    MINIO_USE_SSLboolFalse
    RETENTION_EXPORT_MAX_BYTESint536870912 (512 MiB); minimum 1048576
    RETENTION_EXPORT_COLLECT_TTL_HOURSint72; from 1 to 720
    REDIS_PASSWORDstr''
    REDIS_URLstr'redis://localhost:6379/0'
    CELERY_BROKER_URLstr'redis://localhost:6379/0'
    CELERY_RESULT_BACKENDstr'redis://localhost:6379/1'
    REPORT_EXPORT_SYNC_MAX_TESTSint200000; minimum 0
    CELERY_WORKER_CONCURRENCYint4
    PG_POOL_SIZEOptional[int]None; minimum 1
    PG_MAX_OVERFLOWOptional[int]None; minimum 0
    PG_POOL_RECYCLEint1800; minimum 1
    PG_POOL_TIMEOUTint30; minimum 1
    PG_PROCESS_ROLELiteral['api', 'worker', 'operation']'operation'
    PG_PROCESSES_PER_PODint1; minimum 1
    PG_FLEET_MAX_CONNECTIONSint400; minimum 1
    PG_FLEET_OPERATIONAL_RESERVEint50; minimum 1
    PG_FLEET_SUPERUSER_RESERVED_CONNECTIONSint3; minimum 0
    PG_FLEET_RESERVED_CONNECTIONSint0; minimum 0
    PG_FLEET_MIGRATION_CONNECTIONSint1; minimum 1
    PG_FLEET_REQUIRED_CONNECTIONSint273; minimum 1
    MONGO_MAX_POOL_SIZEint50
    MONGO_MIN_POOL_SIZEint5
    MONGO_SOCKET_TIMEOUT_MSint30000
    MONGO_MAX_IDLE_TIME_MSint60000
    S3_MAX_POOL_CONNECTIONSint50
    INGESTION_S3_CONCURRENCYint10
    LLM_MAX_CONCURRENT_ANALYSESint3
    AGENT_INVOKE_SYNC_CONCURRENCYint4
    AGENT_INVOKE_SYNC_WAIT_SECONDSint25
    AGENT_INVOKE_STREAM_TICKET_SECONDSint60
    WS_MAX_CONNECTIONS_PER_PROJECTint500
    WS_MAX_TOTAL_CONNECTIONSint5000
    WS_BROADCAST_TIMEOUTfloat5.0
    INGEST_RATE_LIMIT_PER_MINUTEint200
    INGEST_EVENT_RATE_LIMIT_PER_MINUTEint20000
    MAX_ARCHIVE_UNCOMPRESSED_BYTESint209715200 (200 MiB)
    MAX_ARCHIVE_ENTRIESint5000
    MAX_ARCHIVE_ENTRY_BYTESint52428800 (50 MiB)
    MAX_ARCHIVE_RATIOint100
    FORM_URLENCODED_MAX_BYTESint65536 (64 KiB)
    FORM_URLENCODED_ACS_MAX_BYTESint2097152 (2 MiB)
    INGEST_MAX_RESULTS_PER_UPLOADint50000
    INGEST_REDIS_MEMORY_THRESHOLD_PCTfloat75.0
    INGEST_REDIS_MEMORY_ABSOLUTE_BYTESint0
    LIVE_BUFFER_MAX_EVENTS_PER_RUNint50000
    PERSIST_LIVE_BULK_INSERT_CHUNKint1000
    LIVE_INGEST_SHARD_COUNTint8
    LIVE_SESSION_DRAIN_ENABLEDboolTrue
    LIVE_SESSION_DRAIN_BATCH_SIZEint5000
    AI_PIPELINE_DEADLINE_SECONDSint1500
    AGENT_PIPELINE_ALERT_GRACE_SECONDSint300
    HIGH_VOLUME_AUTO_DETECT_ENABLEDboolTrue
    HIGH_VOLUME_TESTS_PER_MINUTEint1000
    HIGH_VOLUME_CONSECUTIVE_MINUTESint3
    HIGH_VOLUME_SAMPLE_EVERY_Nint2
    INGESTION_DLQ_ENABLEDboolTrue
    CANONICAL_DELETION_WINDOW_RUNSint5
    LLM_PROVIDERLiteral['ollama', 'lmstudio', 'localai', 'vllm', 'openai', 'gemini', 'anthropic', 'openrouter']'ollama'
    LLM_MODELstr'qwen2.5:7b-instruct'
    LLM_TEMPERATUREfloat0.1
    LLM_MAX_TOKENSint4096
    OLLAMA_BASE_URLstr'http://localhost:11434'
    OLLAMA_NUM_CTXint8192
    LMSTUDIO_BASE_URLstr'http://localhost:1234/v1'
    LOCALAI_BASE_URLstr'http://localhost:8080/v1'
    VLLM_BASE_URLstr'http://localhost:8000/v1'
    OPENAI_API_KEYOptional[str]None
    GOOGLE_API_KEYOptional[str]None
    ANTHROPIC_API_KEYOptional[str]None
    OPENROUTER_API_KEYOptional[str]None
    OPENROUTER_BASE_URLstr'https://openrouter.ai/api/v1'
    OPENROUTER_SITE_URLstr'https://github.com/test-intelligence/testlookup'
    OPENROUTER_APP_NAMEstr'TestLookup'
    LLM_PRICE_OVERRIDESOptional[str]None
    EMBEDDING_PROVIDERstr'ollama'
    EMBEDDING_MODELstr'nomic-embed-text:v1.5'
    CHROMA_HOSTstr'localhost'
    CHROMA_PORTint8001
    CHROMA_COLLECTIONstr'testlookup_embeddings'
    CHROMA_ONNX_MODEL_DIRstr''
    AI_OFFLINE_MODEboolTrue
    REVIEW_GATE_ENFORCEDboolFalse
    AI_LLM_PROVIDER_ALLOWLISTstr''
    AI_LLM_ALLOWED_BASE_URLSstr''
    OFFLINE_NOTIFICATION_ALLOWED_HOSTSstr''
    OFFLINE_EMAIL_ALLOWED_RECIPIENT_DOMAINSstr''
    WEBHOOK_PRIVATE_ALLOWED_HOSTSstr''
    OUTBOUND_WEBHOOK_PRIVATE_ALLOWED_HOSTSstr''
    AGENT_MEMORY_RETENTION_DAYSint365
    AI_CONFIDENCE_THRESHOLDint80
    AIQ_GAP_REFINEMENT_ENABLEDboolFalse
    AIQ_CONTRACT_VALIDATION_ENABLEDboolFalse
    AIQ_CHANGE_OWNERSHIP_ENABLEDboolFalse
    AIQ_ASYNC_DECISION_REPORT_SUPERSESSION_ENABLEDboolFalse
    AI_REPORT_EVAL_ALLOW_CALLER_CORPUSboolFalse
    AI_MAX_RETRIESint3
    AI_TIMEOUT_SECONDSint300
    CHAT_FIRST_TOKEN_TIMEOUT_SECONDSint45
    CHAT_TURN_TIMEOUT_SECONDSint120
    CHAT_MAX_TOOL_ROUNDSint4
    CHAT_HISTORY_MESSAGESint12
    CHAT_LLM_MODELstr''
    AGENT_PIPELINE_MAX_ATTEMPTSint5
    AGENT_MAX_ATTEMPTS_CEILINGint10
    AGENT_MAX_TIMEOUT_CEILINGint600
    AGENT_RETRY_BASE_SECONDSint30
    AGENT_RETRY_CAP_SECONDSint600
    LLM_CLUSTER_MAX_CONCURRENTint4
    LLM_CLUSTER_SLOT_LEASE_SECONDSint60
    AI_ANALYSIS_CACHE_TTLint3600
    SEMANTIC_SIMILARITY_THRESHOLDfloat0.85
    PROMPT_OVERHEAD_TOKENSint1500
    SEMANTIC_CACHE_MAX_DOCUMENTSint10000
    JIRA_ENABLEDboolFalse
    JIRA_DOMAINOptional[str]None
    JIRA_EMAILOptional[str]None
    JIRA_API_TOKENOptional[str]None
    JIRA_DEFAULT_PROJECT_KEYstr'QA'
    JIRA_WEBHOOK_SECRETOptional[str]None
    CONFLUENCE_ENABLEDboolFalse
    CONFLUENCE_DOMAINOptional[str]None
    CONFLUENCE_EMAILOptional[str]None
    CONFLUENCE_API_TOKENOptional[str]None
    SPLUNK_ENABLEDboolFalse
    SPLUNK_BASE_URLOptional[str]None
    SPLUNK_API_TOKENOptional[str]None
    SPLUNK_INDEXstr'main'
    OCP_ENABLEDboolFalse
    OCP_API_URLOptional[str]None
    OCP_SA_TOKENOptional[str]None
    OCP_DEFAULT_NAMESPACEstr'qa-testing'
    SLACK_ENABLEDboolFalse
    SLACK_BOT_TOKENOptional[str]None
    SLACK_WEBHOOK_URLOptional[str]None
    SLACK_DEFAULT_CHANNELstr'#qa-alerts'
    TEAMS_ENABLEDboolFalse
    TEAMS_WEBHOOK_URLOptional[str]None
    SMTP_ENABLEDboolFalse
    SMTP_HOSTstr'localhost'
    SMTP_PORTint587
    SMTP_USEROptional[str]None
    SMTP_PASSWORDOptional[str]None
    SMTP_FROMstr'noreply@testlookup.io'
    SMTP_TLSboolTrue
    SEARCH_INDEX_BATCH_SIZEint200
    SEARCH_INDEX_INCREMENTAL_LIMITint5000
    SEARCH_QUERY_TIMEOUT_MSint5000
    SEARCH_MAX_RESULTSint200
    DEV_AUTO_LOGIN_ENABLEDboolTrue
    JWT_SECRET_KEYstr'change-me-jwt-secret'
    JWT_ALGORITHMstr'HS256'
    JWT_ACCESS_TOKEN_EXPIRE_MINUTESint720
    JWT_REFRESH_TOKEN_EXPIRE_DAYSint7
    AUTH_REVOCATION_FAIL_OPENboolFalse
    REGISTRATION_ENABLEDboolFalse
    MFA_ISSUER_NAMEstr'TestLookup'
    MFA_CHALLENGE_TTL_SECONDSint300
    MFA_RECOVERY_CODE_COUNTint10
    MFA_BREAKGLASS_ENABLEDboolFalse
    SSO_ENABLEDboolFalse
    SCIM_ENABLEDboolFalse
    SAML_SP_ENTITY_IDstr'https://testlookup.io/saml/metadata'
    SAML_BASE_URLstr'http://localhost:8000'
    SSO_ADMIN_FALLBACK_ENABLEDboolTrue
    SSO_ALLOW_PRIVATE_IDP_ENDPOINTSboolFalse
    SAML_ALLOW_IDP_INITIATEDboolFalse
    SAML_CLOCK_SKEW_SECONDSint60
    SSO_MAX_PROVISIONED_ROLEstr'ADMIN'
    SECRET_PROVIDER_VAULT_ADDRstr''
    SECRET_PROVIDER_VAULT_AUTHstr'token'
    SECRET_PROVIDER_VAULT_TOKENstr''
    SECRET_PROVIDER_VAULT_ROLE_IDstr''
    SECRET_PROVIDER_VAULT_SECRET_IDstr''
    SECRET_PROVIDER_VAULT_K8S_ROLEstr''
    SECRET_PROVIDER_VAULT_MOUNTstr'secret'
    SECRET_PROVIDER_VAULT_NAMESPACEstr''
    SECRET_PROVIDER_VAULT_CACHE_SECONDSint60
    FINETUNE_ENABLEDboolFalse
    FINETUNE_CLASSIFIER_MIN_EXAMPLESint500
    FINETUNE_REASONING_MIN_EXAMPLESint2000
    FINETUNE_EMBED_MIN_PAIRSint1000
    FINETUNE_INCREMENTAL_TRIGGERint200
    FINETUNE_EVAL_HOLDOUTfloat0.1
    FINETUNE_MIN_ACCURACY_GAINfloat0.02
    FINETUNE_EXPORT_BUCKETstr'training-data'
    FINETUNE_OPENAI_SUFFIXstr'testlookup'
    CLASSIFIER_CONFIDENCE_THRESHOLDint85
    CLASSIFIER_MODELOptional[str]None
    DEEP_INVESTIGATION_ENABLEDboolTrue
    RELEASE_PASS_RATE_THRESHOLDfloat90.0
    KNOWLEDGE_RAG_ENABLEDboolFalse
    KNOWLEDGE_SYNC_TIMEOUT_SECONDSint60
    KNOWLEDGE_MAX_SOURCES_PER_PROJECTint100
    KNOWLEDGE_DOCS_BUCKETstr'knowledge-docs'
    KNOWLEDGE_STALE_THRESHOLD_JIRA_HOURSint24
    KNOWLEDGE_STALE_THRESHOLD_URL_HOURSint168
    KNOWLEDGE_CHUNK_TARGET_TOKENSint400
    KNOWLEDGE_CHUNK_MAX_TOKENSint800
    KNOWLEDGE_CHUNK_OVERLAP_TOKENSint50
    KNOWLEDGE_RESYNC_BATCH_CAPint50
    KNOWLEDGE_SYNC_STUCK_MINUTESint45
    ANALYSIS_MODEstr'auto'
    ML_MODEL_DIRstr'models'
    ML_MODEL_SYNC_ENABLEDboolTrue
    ML_MODEL_STORE_PREFIXstr'ml-models/'
    ML_MIN_TRAINING_SAMPLESint200
    ML_RETRAIN_ENABLEDboolTrue
    ML_ACCURACY_THRESHOLDfloat0.8
    ML_PSEUDO_LABEL_CAPfloat0.3
    ML_PSEUDO_LABEL_WEIGHTfloat0.3
    ML_HUMAN_LABEL_FLOORint50
    ANOMALY_REGRESSION_THRESHOLDfloat10.0
    ANOMALY_MIN_HISTORY_RUNSint3
    ANOMALY_FLAKY_WINDOW_RUNSint10
    ANOMALY_FLAKY_LOOKBACK_DAYSint30
    ANOMALY_PERF_HISTORY_DAYSint30
    ANOMALY_MIN_PERF_SAMPLESint5
    ANOMALY_PERF_SPIKE_MULTIPLIERfloat2.0
    ANOMALY_PERF_MIN_ABSOLUTE_DELTA_MSint1000
    ANOMALY_SUMMARY_MAX_ITEMSint8
    RISK_WEIGHT_USER_IMPACTfloat0.25
    RISK_WEIGHT_ENV_SENSITIVITYfloat0.1
    RISK_WEIGHT_REPRODUCIBILITYfloat0.15
    RISK_WEIGHT_REGRESSION_LIKELYfloat0.2
    RISK_WEIGHT_HIST_RECURRENCEfloat0.1
    RISK_WEIGHT_BLAST_RADIUSfloat0.15
    RISK_WEIGHT_DIAGNOSIS_CONFfloat0.05
    PROMETHEUS_URLOptional[str]None
    SLOW_QUERY_MSint500
    GITHUB_TOKENOptional[str]None
    GITHUB_REPOOptional[str]None
    COMMIT_RANGE_FILE_FETCH_LIMITint25
    HTTP_VERIFY_TLSboolTrue
    HTTP_CA_BUNDLEOptional[str]None
    WEBHOOK_SECRETstr'change-me-webhook-secret'
    TRUSTED_PROXY_IPSstr''
    LIVE_EVENTS_REQUIRE_PROJECT_KEYboolTrue
    OTEL_ENABLEDboolTrue
    OTEL_SERVICE_NAMEstr'testlookup'
    OTEL_EXPORTER_OTLP_ENDPOINTOptional[str]None
    METRICS_ENABLEDboolTrue
    LOG_LEVELstr'INFO'
    LOG_FORMATLiteral['json', 'text']'json'

    Before you run TestLookup in production, replace every development placeholder with a real secret. This covers the application key, the key that signs sign-in tokens (JWT), the webhook secret, the database and file-storage passwords, and the keys for integrations and AI providers.

    Back up APP_SECRET_KEY with your recovery records. Without it, TestLookup can no longer read the passwords and keys it stored in encrypted form. A secret setting can also hold a reference such as vault:<path>#<key> instead of the secret itself. This works once SECRET_PROVIDER_VAULT_ADDR (empty by default) gives the address of a Vault or OpenBao server.

    When APP_ENV is production or staging, the API refuses to start if any of these is true:

    • JWT_SECRET_KEY, APP_SECRET_KEY or WEBHOOK_SECRET is empty or still a placeholder.
    • The password inside MONGO_URI is a placeholder.
    • DEV_AUTO_LOGIN_ENABLED is true.

    With APP_ENV=production, the API also refuses to start when PostgreSQL’s max_connections is below PG_FLEET_MAX_CONNECTIONS (400 by default).

    In these cases the API logs a warning but still starts:

    • CORS_ORIGINS contains a wildcard entry.
    • SAML_BASE_URL points at localhost while single sign-on is on.
    • Jira is turned on but has no webhook secret.

    In the code, APP_ENV defaults to development and DEV_AUTO_LOGIN_ENABLED defaults to true. The production image, the Compose files, the Kubernetes base, and the homelab and openshift-artifactory overlays already set production values. If you write an environment file or a ConfigMap by hand, set APP_ENV=production and DEV_AUTO_LOGIN_ENABLED=false yourself.

    APP_SECRET_KEY does three jobs:

    • It encrypts stored secrets: integration tokens, the SMTP password, AI provider keys and webhook signing secrets.
    • It encrypts each user’s two-step sign-in (MFA) secret.
    • It signs saved copies of decision evidence and signed records (attestations).

    If you simply replace the key, TestLookup can no longer read those values, and MFA sign-in fails with HTTP 503. To change the key safely:

    1. Move the old value to APP_SECRET_KEY_PREVIOUS.
    2. Put the new value in APP_SECRET_KEY. TestLookup decrypts with the current key first and then with the previous one, and it encrypts new writes with the current key.
    3. Remove the previous key once every value has been encrypted again on its next write.

    Several things decide whether a feature works: feature flags, project rules, the user’s role, what a key is allowed to reach, whether an AI provider is available, and workflow settings.

    By default:

    • Offline mode is on (AI_OFFLINE_MODE is true).
    • The review gate (REVIEW_GATE_ENFORCED) is off.
    • Single sign-on (SSO), automatic user setup from your company directory (SCIM) and self-registration (REGISTRATION_ENABLED) are off.

    Each of these is a separate setting that you can change. SAML 2.0, OpenID Connect (OIDC) and SCIM are built in, but they need setting up. Before you turn on SSO or SCIM, check two settings:

    • SSO_MAX_PROVISIONED_ROLE (default ADMIN) is the highest role that an identity-provider group mapping or SCIM can give a user.
    • SSO_ADMIN_FALLBACK_ENABLED (default true) lets administrators still sign in with a password while SSO is required.

    The github_checks and gitlab flags start off. outbound_webhooks starts on for a new installation, and an upgraded installation keeps its stored value. Integration values saved in the screens override their environment variables. All three, like filing Jira issues, do nothing while offline mode is on, because TestLookup checks offline mode before any flag or saved integration value. Offline mode overrides every other setting.

    The default LLM_MODEL is qwen2.5:7b-instruct. HTTP_CA_BUNDLE (not set by default) gives TestLookup’s outgoing connections a PEM certificate bundle for your company’s own certificate authority.

    The AIQ_* variables in the table do not turn deep investigation steps on or off by themselves. When the database update (migration) that creates a matching flag runs, it uses the variable’s value as the flag’s starting value. After that, TestLookup reads the variable only while the flag has no row in the database. From then on, the flag on the Feature flags page decides. The AI configuration guide lists each step’s default.

    Feature flags are stored in the database. Administrators manage them on Settings › System › Feature flags (/settings/feature-flags). Each flag has a main on/off switch, a rollout percentage, and optional lists of projects and roles. TestLookup keeps flag values for about 30 seconds before it reads them again. Several flags have one default on a new installation and keep their stored value on an upgraded one.

    A few environment variables work like flags, but you must restart TestLookup to change them:

    • AI_OFFLINE_MODE and REVIEW_GATE_ENFORCED.
    • The main integration switches: JIRA_ENABLED, SLACK_ENABLED, TEAMS_ENABLED, SMTP_ENABLED, SPLUNK_ENABLED and OCP_ENABLED. Most of these also have a setting in the screens.
    • SSO_ENABLED and SCIM_ENABLED.
    • LIVE_EVENTS_REQUIRE_PROJECT_KEY.

    The feature-flag reference on GitHub lists every flag’s default, what it covers and what it controls.

    The values on this page come from the current development version of TestLookup. When you upgrade, compare this page with the configuration reference for the new version. That way you notice new, renamed or changed settings before you deploy.

    This page shows the defaults in the code and nothing else. It does not read a .env file, a cluster secret or a running server, so no real tokens, passwords, keys, private addresses or local settings appear here.

    Next, set these values for the way you install TestLookup. The deployment guide lists the secrets each install mode needs, and day-two operations explains how to check them on a running installation.