Skip to content

Guide de configuration ​

La configuration de WeKnora repose sur quatre couches, par priorité croissante :

CoucheEmplacementRôle
Fichier principalconfig/config.yamlValeurs par défaut structurées, distribuées avec l’image
Modèles / préréglagesconfig/prompt_templates/*.yaml, builtin_agents.yaml, agent_type_presets.yaml, builtin_models.yaml, models.jsonPrompts, agents intégrés, modèles intégrés, catalogue des fournisseurs
Variables d’environnement.env / environment du conteneurSurcharges au déploiement ; redémarrage requis après modification
Paramètres système à l’exécutionTable system_settings en base, interface « Paramètres → Système »Paramètres modifiables en ligne, prioritaires sur les variables d’environnement ; effet immédiat pour la plupart

Le mode d’inscription, les politiques d’espaces et quotas, la liste blanche SSRF, la concurrence des tâches et les plafonds de concurrence des modèles sont configurables à l’exécution. Après modification dans la console, la valeur en base prime sur la variable d’environnement ; seule la réinitialisation d’un paramètre (DELETE /api/v1/system/admin/settings/:key) rétablit la variable d’environnement ou la valeur par défaut intégrée. Si une variable d’environnement ne semble pas appliquée, vérifiez d’abord qu’aucune configuration à l’exécution n’existe pour cette clé. Liste complète dans Administration plateforme et administrateur système.

La structure principale est définie dans internal/config/config.go. Signification, valeurs par défaut et conditions d’application de chaque option ci-dessous.

Mécanisme de chargement ​

Flux de LoadConfig() dans internal/config/config.go :

  1. viper recherche config.yaml dans l’ordre : répertoire courant → ./config → $HOME/.appname → /etc/appname/ ;
  2. Expansion des variables d’environnement : remplacement par regex dans le fichier ; ${ENV_VAR} est remplacé par la valeur homonyme ; si la variable est absente, le littéral ${ENV_VAR} est conservé (pour exposer les erreurs de config) ;
  3. viper active AutomaticEnv() avec le séparateur de clé . mappé en _ (ex. server.port peut être surchargé par SERVER_PORT) ;
  4. chargement des modèles de prompts depuis config/prompt_templates/*.yaml, puis remplissage des champs xxx_prompt_id dans la config conversation (backfillConversationDefaults) ;
  5. chargement de builtin_agents.yaml (agents intégrés) et agent_type_presets.yaml (préréglages de type Agent), résolution des références system_prompt_id ;
  6. application des surcharges par variables d’environnement (groupes OIDC, Agent, KnowledgeBase, Auth/Tenant, Audit) puis ValidateConfig.

config/config.yaml section par section ​

server (ServerConfig) ​

NomTypeDéfautDescription
server.portint8080Port d’écoute HTTP, plage validée 1–65535
server.hoststring"0.0.0.0"Adresse d’écoute
server.log_pathstringvideChemin du fichier de logs (aussi LOG_PATH)
server.shutdown_timeoutduration30sBudget total d’arrêt gracieux ; vidage des connexions et nettoyage partagent ce délai, 5s réservés au nettoyage par défaut

conversation (ConversationConfig) — pipeline Q&R avec recherche ​

NomTypeDéfaut (config.yaml)Description
max_roundsint5Nombre de tours d’historique multi-tours conservés
keyword_thresholdfloat0.3Score minimum pour la recherche par mots-clés
embedding_top_kint30Nombre de résultats en recherche vectorielle (>=0)
vector_thresholdfloat0.2Seuil de similarité vectorielle (0–1)
rerank_top_kint30Nombre conservé après rerank
rerank_thresholdfloat0.3Score minimum rerank (-10–10)
fallback_strategystring"model"Si aucun rappel : model (modèle en secours) ou réponse fixe
fallback_responsestring"Sorry, I am unable to answer this question."Texte de secours fixe
enable_rewritebooltrueRésolution de coréférence / réécriture de requête multi-tours
enable_query_expansionbooltrueExpansion de requête
enable_rerankbooltrueActiver le rerank
fallback_prompt_idstring"default_fallback_prompt"ID du modèle de prompt de secours (prompt_templates/fallback.yaml, mode:"model")
rewrite_prompt_idstring"default_rewrite"ID du modèle de réécriture (content côté système + user côté utilisateur)
generate_summary_prompt_idstring"default_summary"ID du modèle de profil document (résumé court + gist/thème/type/questions typiques, sortie JSON)
generate_kb_description_prompt_idstring"default_kb_description"ID pour la description de base de connaissances (agrégat de profils, pas le corps du document)
generate_session_title_prompt_idstring"default_session_title"ID pour le titre de session
extract_entities_prompt_id / extract_relationships_prompt_idstring"default_extract_entities" / "default_extract_relationships"ID d’extraction graphe (graph_extraction.yaml)
generate_questions_prompt_idstring"default_generate_questions"ID pour questions pré-générées

conversation.summary (SummaryConfig, paramètres de génération de réponse) :

NomTypeDéfautDescription
max_input_charsint8192Caractères max envoyés au LLM. Le profil document n’a besoin que du début pour le thème ; 8k suffit ; 16384/24576 multiplient le coût de résumé par document
temperaturefloat0.3Température de génération
repeat_penaltyfloat1.0Pénalité de répétition
max_completion_tokensint1024Tokens max générés (champs JSON du profil courts)
no_match_prefixstring<think>\n</think>\nNO_MATCHPréfixe de sortie modèle déclenchant le fallback « non trouvé »
prompt_idstring"default_kb"ID du prompt système (system_prompt.yaml)
context_template_idstring"default_context"ID d’assemblage du contexte (context_template.yaml)
max_tokens / top_k / top_p / frequency_penalty / presence_penalty / seed / thinkingdiversnon définisParamètres d’échantillonnage optionnels passés au modèle ; thinking est *bool pour le mode réflexion

knowledge_base (KnowledgeBaseConfig) — découpage global par défaut ​

NomTypeDéfautDescription
chunk_sizeint512Taille de chunk par défaut (>0 et > overlap)
chunk_overlapint50Chevauchement
split_markers[]string["\n\n", "\n", "。"]Marqueurs de découpage
keep_separatorboolfalseConserver le séparateur
document_process_timeoutduration2hTimeout total par tâche de traitement document (env WEKNORA_DOCUMENT_PROCESS_TIMEOUT)
docreader_call_timeoutduration30mTimeout par appel RPC DocReader (env WEKNORA_DOCREADER_CALL_TIMEOUT), doit être inférieur au précédent
image_processing.enable_multimodalbooltrueTraitement multimodal des images à l’upload (OCR/Caption)

Chaque base de connaissances peut surcharger ces défauts via ChunkingConfig.

extract (ExtractManagerConfig) — modèles d’extraction graphe ​

extract.extract_graph / extract.extract_entity / extract.fabri_text définissent les textes d’instruction (description), les étiquettes de relation autorisées (tags, défaut Author, Alias) et les exemples few-shot (examples : text + node + relation). L’assistant d’initialisation « essai d’extraction / génération de texte exemple » utilise ces réglages (%s dans fabri_text.with_tag / with_no_tag remplacé par la liste de tags).

tenant (TenantConfig) ​

NomTypeDéfautDescription
enable_cross_tenant_accessboolfalseAccès inter-espaces pour utilisateurs avec CanAccessAllTenants (réseau interne)
enable_rbac*booltrueRBAC strict par espace ; false explicite = mode gris : contrôles de rôle logués sans blocage dans l’espace, accès inter-espaces toujours bloqué (env WEKNORA_TENANT_ENABLE_RBAC)
max_owned_per_userint0 (défaut handler)Nombre max d’espaces créés par un non super-admin ; <0 désactive la limite (env WEKNORA_TENANT_MAX_OWNED_PER_USER)
self_service_creation_enabled*booltrueLes utilisateurs peuvent-ils créer un espace (env WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLED)
default_session_name / default_session_title / default_session_descriptionstringvideTextes par défaut des nouvelles sessions

Sections supportées par le struct mais absentes du fichier par défaut ​

Segments présents dans Config, ajoutables à config.yaml (souvent aussi via variables d’environnement) :

SegmentStructChamps clés et défauts
authAuthConfigregistration_mode : self_serve (défaut, inscription ouverte) / invite_register (sur invitation) / invite_only (inscription interdite, avec DISABLE_REGISTRATION=true) ; default_tenant_mode : create_personal (défaut) / tenantless
auditAuditConfigretention_days : rétention des logs d’audit, 90 si omis ; 0 désactive le nettoyage ; <0 erreur de validation (env WEKNORA_AUDIT_RETENTION_DAYS)
oidc_authOIDCAuthConfigenable, issuer_url, jwks_uri, discovery_url (sinon dérivé de issuer + /.well-known/openid-configuration), client_id, client_secret, endpoints, scopes (défaut openid profile email), user_info_mapping.username (défaut name) / email (défaut email) ; tout surchargeable via OIDC_AUTH_*
agentAgentConfigllm_call_timeout : timeout appel LLM en secondes (défaut 120, env WEKNORA_AGENT_LLM_TIMEOUT) ; tool_approval_timeout_seconds : attente approbation outil MCP (défaut 600, env WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT)
imIMConfigConcurrence Q&R canaux IM : workers (5), global_max_workers (0=illimité, Redis requis), max_queue_size (50), max_per_user (3), rate_limit_window (60s), rate_limit_max (10)
docreaderDocReaderConfigaddr (gRPC ex. docreader:50051 ou URL HTTP), transport : grpc (défaut) / http ; souvent DOCREADER_ADDR / DOCREADER_TRANSPORT
vector_databaseVectorDatabaseConfigdriver (souvent env RETRIEVE_DRIVER)
stream_managerStreamManagerConfigtype : memory / redis ; redis.address/username/password/db/prefix/ttl ; cleanup_timeout (env STREAM_MANAGER_TYPE, REDIS_*)
web_searchWebSearchConfigtimeout : timeout recherche web en secondes
models[]ModelConfigListe statique legacy (type/source/model_name/parameters) ; préférer builtin_models.yaml ou l’interface
frontend_base_urlstringvide

Variables d’environnement importantes ​

Variables issues de la section environment app/docreader dans docker-compose.yml, .env.example et os.Getenv dans le code. En production, modifier au minimum : DB_USER/DB_PASSWORD/DB_NAME, REDIS_PASSWORD, JWT_SECRET, SYSTEM_AES_KEY.

Base d’exécution ​

NomDéfautDescription
GIN_MODEreleasedebug (Swagger) / release production
LOG_LEVEL / LOG_PATH / WEKNORA_LOG_FORMATdebug / vide / videNiveau, fichier (vide = stdout seulement), format personnalisé (doit contenir %msg si défini ; compatibilité LOG_FORMAT si non défini ; pas le mot-clé json)
LLM_DEBUG_LOGfalsetrue écrit llm_debug.log à côté de LOG_PATH
TZAsia/ShanghaiFuseau horaire
DEFAULT_LOCALEvideLangue par défaut de l’interface (conteneur frontend) : zh-CN / en-US / ru-RU / ko-KR / ja-JP, valeurs invalides ignorées. Utilisateurs n’ayant pas changé la langue : langue choisie > cette variable > zh-CN ; redémarrer le conteneur frontend, pas de rebuild
WEKNORA_LANGUAGEvideLangue de traitement documentaire (questions/résumés). Priorité : cette variable > Accept-Language > zh-CN intégré. Indépendant de la langue UI (ex. UI anglais, documents coréens). Canaux IM sans langue de réponse utilisent aussi cette variable (sinon zh-CN)
AUTO_MIGRATEtrueMigrations DB au démarrage
AUTO_RECOVER_DIRTYtrueRépare l’état dirty de golang-migrate. Pour diagnostic manuel, mettre temporairement false, sinon le démarrage réécrit la version — voir Base de données et migrations
WEKNORA_TRUSTED_PROXIESvideCIDR de proxies de confiance gin (séparés par virgules)
MAX_SKILL_BUNDLE_SIZE_MB256 MiB (min MAX_FILE_SIZE_MB, max 512 MiB)Limite upload/téléchargement ZIP de skills ; le proxy doit accepter la même taille de corps
MAX_FILE_SIZE_MB50Taille max upload (app/frontend/docreader) ; Helm : global.maxFileSizeMB
CONCURRENCY_POOL_SIZE5Pool de concurrence générique
APP_EXTERNAL_URL / FRONTEND_BASE_URLvideURL externe pour images/fichiers IM / origin frontend
RESOURCE_URL_MODEhandleForme des références fichiers dans les réponses API : handle = resource:// interne, public = lien signé temporaire. Surcharge par requête ?resource_urls=, voir Vue d’ensemble API

APP_EXTERNAL_URL affecte le rendu d’images de base de connaissances dans les canaux IM. La plateforme IM a besoin d’URL http(s) publiques, deux options :

  1. Backend de stockage public (endpoint objet public, ou MINIO_ENDPOINT public) : resource:// retombe sur URL présignée, pas besoin de cette variable ;
  2. Définir APP_EXTERNAL_URL : images resource:// réécrites en <APP_EXTERNAL_URL>/r/<token> via WeKnora (nginx doit proxy /r/, image frontend officielle inclut cette location).

MinIO interne et backend local nécessitent l’option 2. Canaux IM actifs sans variable : WARN au démarrage ; si la réécriture n’est pas http(s), référence conservée avec alerte actionnable.

Les quatre formes d’URL et la prise en charge par canal : Accès public aux images et fichiers.

Base de données et files ​

NomDéfautDescription
DB_DRIVERpostgrespostgres / sqlite (Lite)
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAMEpostgres / 5432 / vide / vide / videConnexion PostgreSQL (obligatoire)
DB_PATH—Chemin fichier si DB_DRIVER=sqlite
STREAM_MANAGER_TYPEvide (compose utilise redis)redis / memory
REDIS_ADDR / REDIS_USERNAME / REDIS_PASSWORD / REDIS_DB / REDIS_PREFIXredis:6379 / …Connexion Redis
REDIS_USE_TLSfalseActive TLS pour Redis managé ; REDIS_TLS_SERVER_NAME pour SNI/validation ; REDIS_TLS_INSECURE_SKIP_VERIFY pour certificats auto-signés (dev uniquement)
WEKNORA_REDIS_NAMESPACEvideSuffixe d’espace de noms si Redis partagé
WEKNORA_SANDBOX_USER_ALLOCATIONvideenabled : sessions d’un même utilisateur partagent un sandbox (Redis requis, mettre à jour toutes les instances avant activation)
WEKNORA_ASYNQ_CORE_CONCURRENCY etc.8 / 2 / 12 / 4 / 6Concurrence Asynq par file (core/postprocess/enrichment/maintenance/shared), aussi WEKNORA_WIKI_ASYNQ_CONCURRENCY=8, WEKNORA_MODEL_MAX_CONCURRENCY=32

Moteur de recherche et base vectorielle ​

NomDéfautDescription
RETRIEVE_DRIVERpostgrespostgres / elasticsearch_v7 / elasticsearch_v8 / qdrant / milvus / weaviate / opensearch / doris / tencent_vectordb / sqlite (Lite) ; plusieurs drivers séparés par virgule
ELASTICSEARCH_ADDR/USERNAME/PASSWORD/INDEXvideElasticsearch
QDRANT_HOST/PORT/COLLECTION/API_KEY/USE_TLSqdrant / 6334 / weknora_embeddings / vide / falseQdrant
MILVUS_ADDRESS/COLLECTION/METRIC_TYPE/...milvus:19530 / weknora_embeddings / IPMilvus
OPENSEARCH_ADDR/USERNAME/PASSWORD/INDEX/INSECURE_SKIP_VERIFYvideOpenSearch
WEAVIATE_HOST/GRPC_ADDRESS/SCHEME/AUTH_ENABLED/API_KEYvideWeaviate
DORIS_ADDR/HTTP_PORT/DATABASE/USERNAME/PASSWORD/TABLE_PREFIX/COMPAT_MODEvideApache Doris 4.1+
TENCENT_VECTORDB_ADDR/USERNAME/API_KEY/DATABASE/COLLECTION/REPLICA_NUMBERvideTencent VectorDB
MULTI_STORE_RETRIEVE_TIMEOUT_SECvideTimeout recherche parallèle multi-moteurs
NEO4J_ENABLE / NEO4J_URI / NEO4J_USERNAME / NEO4J_PASSWORDvide / bolt://neo4j:7687 / neo4j / passwordSeul interrupteur graphe de connaissances (ENABLE_GRAPH_RAG obsolète depuis v0.1.6)

Stockage de fichiers ​

NomDéfautDescription
STORAGE_TYPElocallocal / minio / cos / tos / s3 / obs / oss
STORAGE_ALLOW_LISTvideListe blanche des types choisissables : local, minio, cos, tos, s3, oss, ks3, obs
LOCAL_STORAGE_BASE_DIR/data/filesRacine stockage local
MINIO_ENDPOINT/ACCESS_KEY_ID/SECRET_ACCESS_KEY/BUCKET_NAME/USE_SSLminio:9000 / minioadmin / minioadmin / vide / falseMinIO
COS_SECRET_ID/SECRET_KEY/REGION/BUCKET_NAME/APP_ID/PATH_PREFIXvideTencent COS (TEMP_BUCKET/TEMP_REGION)
S3_* / OBS_* / OSS_* / TOS_*voir .env.example section B4AWS S3 / Huawei OBS / Alibaba OSS / Volcano TOS

Pour AWS S3, S3_ACCESS_KEY / S3_SECRET_KEY peuvent être tous deux vides : chaîne de credentials SDK (IAM Role EC2/ECS/EKS, IRSA, env, profil). Les deux doivent être renseignés ou vides ensemble. S3_ENDPOINT vide = endpoint standard de la région.

Modèles et inférence ​

NomDéfautDescription
OLLAMA_BASE_URLhttp://host.docker.internal:11434URL Ollama locale unique ; modèles vectoriels et chat source=local ; sinon http://localhost:11434
OLLAMA_OPTIONALtrueOllama indisponible : alerte sans bloquer le démarrage
BATCH_EMBED_SIZEvideTaille des batchs d’embedding
VLM_HTTP_TIMEOUT_SECONDS180Timeout requête VLM
GENERATE_QUESTIONS_MAX_TOKENS2048Budget complétion pour questions document ; modèles de raisonnement incluent tokens de réflexion
VLM_MAX_TOKENS5000Budget tokens complétion VLM distant (inclut réflexion ; finish_reason=length sur scan → augmenter)
BUILTIN_MODELS_CONFIGconfig/builtin_models.yamlChemin des modèles intégrés (ci-dessous)
MODELS_CONFIGconfig/models.jsonFichier de surcharge catalogue fournisseurs, voir Gestion des modèles
WEKNORA_LLM_STREAM_RAW_DUMP / _DIRvideDump brut du flux LLM (dépannage)

Le nom du modèle vectoriel ne vient pas d’une variable d’environnement seule : enregistrement type=Embedding, source=local, name = modèle Ollama (ex. CLI nomic-embed-text dim 768 ; démarrage rapide bge-m3 dim 1024). Nom vide → nomic-embed-text. EMBEDDING_MODEL_NAME seulement si référencé dans builtin_models.yaml (section « config/builtin_models.yaml.example » et config/builtin_models.yaml.example). Guide 8 Go sans poids Ollama ; Neo4j off par défaut (profile neo4j).

Authentification, locataires et sécurité ​

NomDéfautDescription
JWT_SECRETvideClé JWT (obligatoire, openssl rand -hex 32). Vide ou exemple → aléatoire à chaque démarrage, reconnexion requise ; réplicas identiques
SYSTEM_AES_KEYvideClé AES-256 pour champs sensibles en base, 32 octets (openssl rand -hex 16) ; perte = données chiffrées irrécupérables ; v0.4.0+ remplace TENANT_AES_KEY/CRYPTO_*
SYSTEM_SIGNING_KEYvide (fallback SYSTEM_AES_KEY)Signature liens de session et fichiers présignés (openssl rand -hex 32). Non défini → SYSTEM_AES_KEY ; manquant/court/exemple → pas de liens signés. Rotation invalide les liens existants ; même valeur sur tous les réplicas
DISABLE_REGISTRATIONfalsetrue → invite_only au démarrage ; paramètres runtime DB prioritaires
WEKNORA_AUTH_DEFAULT_TENANT_MODEcreate_personalPolitique après inscription (create_personal / tenantless)
WEKNORA_TENANT_ENABLE_RBAC(true par défaut)RBAC par espace
WEKNORA_TENANT_ENABLE_CROSS_TENANT_ACCESSfalseAccès inter-espaces
WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLEDtrueCréation d’espace par utilisateurs
WEKNORA_TENANT_MAX_OWNED_PER_USERvidePlafond d’espaces possédés
WEKNORA_TENANT_AUTO_CREATE_API_KEYfalseClé API full_access à la création d’espace (legacy)
WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_GB10Quota stockage nouvel espace (Go)
WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_MB0Si >0, prime sur Go
WEKNORA_AUTH_COMPLEX_PASSWORD_ENABLEDfalsePolitique mot de passe complexe ; paramètre système auth.complex_password_enabled prioritaire
WEKNORA_TENANT_AUTO_ACCEPT_INVITATIONfalseInvitation e-mail rejoint directement si compte existe ; tenant.auto_accept_invitation prioritaire
OIDC_AUTH_JWKS_URIvideJWKS pour id_token ; discovery possible
WEKNORA_INVITATION_TTL168hValidité lien d’invitation
WEKNORA_AUDIT_RETENTION_DAYS90Rétention logs d’audit
WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAILvidePremier admin système : ne crée pas l’utilisateur ; l’e-mail doit déjà être inscrit, promotion au prochain démarrage si aucun admin ; ignoré si admin existe — voir Locataires, utilisateurs et auth
OIDC_AUTH_ENABLE et OIDC_AUTH_* / OIDC_USER_INFO_MAPPING_*false / videOIDC complet
SSRF_WHITELIST / SSRF_WHITELIST_EXTRAvide / searxng,qdrant,milvus,weaviate,doris-fe,doris-be,minio (app seulement)Liste blanche SSRF sortante. SSRF_WHITELIST partagé app/docreader ; compose ne met SSRF_WHITELIST_EXTRA que sur app
SSRF_DNS_WHITELIST_ONLYfalseSorties uniquement liste blanche (app et docreader). Hosts hors liste refusés avant DNS ; IP directe hors liste refusée à la validation URL ; CIDR n’appliquent pas aux noms de domaine. Booléen (1/t/true on) ; valeur non vide non parsable = activé. Préparation ci-dessous
IMAGE_HOST_KEEP_URLvideDomaines conservant l’URL originale des images

Avant d’activer SSRF_DNS_WHITELIST_ONLY ​

La liste blanche devient la politique sortante complète : inclure tous les hôtes dans SSRF_WHITELIST ou SSRF_WHITELIST_EXTRA. Pour docreader et services compose, utiliser SSRF_WHITELIST partagé (SSRF_WHITELIST_EXTRA vide par défaut sur docreader). Ajouter typiquement :

  • Adresses modèles (chat / embedding / rerank / VLM / ASR, Ollama local localhost)
  • OIDC (dex ou IdP), MCP, docreader
  • Object storage externe, bases vectorielles, Langfuse
  • Plan de contrôle sandbox : « endpoints privés autorisés » ne contourne plus la liste

Chemins sortants non couverts, par impact :

  1. Résolution runtime gRPC vectoriel : clients qdrant/milvus résolvent la cible côté gRPC ; contrôle par nom avant création client (env au démarrage, config console via validation URL).
  2. Export OTLP Langfuse : client HTTP propre, hors mécanisme. LANGFUSE_HOST SaaS par défaut ; déploiement offline → désactiver traçage ou URL interne.
  3. HTTP(S)_PROXY : proxy autorisé si host du dial == host de l’URL proxy ; sinon refusé. Offline → unset proxy ou ajouter l’hôte proxy à la liste blanche.

Paramètres de build d’image (build depuis les sources) ​

Uniquement pour docker compose build / make docker-build-frontend. Autres paramètres (proxy Go, miroirs apt) : .env.example A1.

NomDéfautDescription
VITE_FRONTEND_COMMITunknownCommit court frontend page « Infos système » ; rempli par make docker-build-frontend / start_all.sh --no-pull
VERSION_ARGvide (fallback VERSION)Version app page « Infos système »
COMMIT_ID_ARG / BUILD_TIME_ARG / GO_VERSION_ARGvide (unknown)Commit / heure build / version Go
NPM_REGISTRYvideRegistry npm en build, ex. https://registry.npmmirror.com
NODE_MAX_OLD_SPACE_SIZE4096Heap Node pour build Vite (MB), 2048 si Docker Desktop limité

Parsing Docreader (conteneur docreader) ​

NomDéfautDescription
DOCREADER_ADDR / DOCREADER_TRANSPORTdocreader:50051 / grpcAdresse et transport app (grpc/http)
DOCREADER_GRPC_MAX_WORKERS / DOCREADER_GRPC_PORT / DOCREADER_GRPC_MAX_FILE_SIZE_MB4 / 50051 / suit MAX_FILE_SIZE_MBParamètres serveur gRPC
GRPC_TLS_ENABLED/CERT/KEY/CA/SERVER_NAME, GRPC_MTLS_REQUIRE_CLIENT_CERT, GRPC_AUTH_TOKENfalse / videTLS/mTLS et token app↔docreader
DOCREADER_PDF_RENDER_DPI / DOCREADER_PDF_JPEG_QUALITY / DOCREADER_PDF_RENDER_MAX_EDGE200 / 85 / 2000Rendu PDF
DOCREADER_PDF_FORCE_SCANNED / DOCREADER_PDF_SCAN_IMAGE_RATIO / DOCREADER_PDF_SCAN_MIN_CHARSfalse / défaut codeDétection scan
DOCREADER_ODL_HYBRID / DOCREADER_ODL_HYBRID_URL / DOCREADER_ODL_HYBRID_MODE / DOCREADER_ODL_HYBRID_FALLBACKoff / http://odl-hybrid:5002 / auto / falseParsing hybride OpenDataLoader
DOCREADER_XLSX_PERCENT_AS_TEXT / DOCREADER_XLSX_PCT_ROW_HINT_MINfalse / 0Affichage pourcentage et inférence ligne ; voir Parsing
DOCREADER_HTML_MAIN_CONTENTfalseHTML upload : indexer le corps principal (même stratégie qu’import URL)
Autres DOCREADER_PDF_* (20+ options)voir commentaires compose docreaderMise en page et extraction PDF
DOCREADER_EXTERNAL_HTTP_PROXY / _HTTPS_PROXYvideProxy sortant docreader

Prétraitement OCR des images ​

Limites ressources du prétraitement Docreader ; n’active pas automatiquement les options de base de connaissances.

NomDéfautDescription
DOCREADER_PREPROCESS_MAX_WORKERS1Concurrence max prétraitement
DOCREADER_PREPROCESS_TIMEOUT_SECONDS30Délai par tâche
DOCREADER_PREPROCESS_THREADS2Threads par tâche
DOCREADER_PREPROCESS_MEMORY_MB2048Limite mémoire processus (MiB)
DOCREADER_PREPROCESS_MAX_PIXELS16000000Plafond pixels entrée
DOCREADER_PREPROCESS_MAX_EDGE / DOCREADER_PREPROCESS_PROBE_EDGE2000 / 2000Bord max sortie et sonde

Base de connaissances : prétraitement off / auto / always. Retour image originale si charge ou échec — voir Parsing documentaire.

Génération de descriptions et connexions sortantes ​

VariableDéfautEffet
KNOWLEDGE_BASE_PROFILE_MAX_TOKENS2048Budget tokens description de base ; invalide → défaut ; no gist sur modèle de raisonnement → augmenter
WEKNORA_OUTBOUND_DIAL_TIMEOUT5sTimeout dial connexions sortantes SSRF (duration Go ex. 10s) ; pas le timeout total requête/modèle

Agent, Skills et pièces jointes ​

NomDéfautDescription
Config sandboxPage paramètres par espaceBackend, identifiants, modèles, timeouts, accès réseau privé
WEKNORA_SANDBOX_USER_ALLOCATIONnon activéenabled pour réutilisation sandbox par utilisateur, Redis requis — voir Allocation
WEKNORA_SANDBOX_DOCKER_ENABLEDfalseFallback backend Docker sandbox ; admin peut activer en UI (DB prioritaire). Désactivé par défaut (docker.sock ≈ root hôte)
WEKNORA_AGENT_LLM_TIMEOUT120sTimeout appel LLM Agent
WEKNORA_WEB_FETCH_TIMEOUT3mBudget web_fetch par page (HTTP et chromedp partagent ce budget). Vide/invalide → défaut ; couche outil +5s. Pipeline quick-answer reste 15s
WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT / _FAIL_OPEN600s / fail-closeApprobation outil MCP
WEKNORA_CHAT_ATTACHMENT_TTL_HOURS / _WAIT_TIMEOUT_SEC / _OCR_CONCURRENCY / _OCR_MAX_PAGES24 / 60 / 8 / 8TTL pièces non référencées, attente lecture/OCR ; pièces en session/fork non purgées par TTL
WEKNORA_HOUSEKEEPING_ENABLEDactivéNettoie données bloquées en processing
WEKNORA_DOCUMENT_PROCESS_TIMEOUT / WEKNORA_DOCREADER_CALL_TIMEOUT2h / 30mTâche document et RPC
WEKNORA_PADDLEOCR_VL_TIMEOUT1000sTimeout HTTP PaddleOCR-VL self-hosted (duration positive) ; marge sur timeouts externes
WEKNORA_MINERU_TIMEOUT1000sTimeout MinerU self-hosted (V1 tâche entière, legacy /file_parse)
WEKNORA_MINERU_CLOUD_TIMEOUT30mPolling MinerU cloud (mineru.net)
WEKNORA_PADDLEOCR_VL_CLOUD_TIMEOUT600sPolling PaddleOCR-VL cloud (AI Studio)
WEKNORA_WEKNORACLOUD_TIMEOUT20mPolling docreader managé WeKnoraCloud ; < WEKNORA_DOCREADER_CALL_TIMEOUT

Sandbox : config par espace/API — Skills et sandbox. Mémoire long terme et auto-tags désactivés par défaut (memory_config, auto_tag_config), pas de variables globales à la place.

Extension Chrome connecte le navigateur local à WeKnora. Image Docker app inclut bsk et l’extension ; URL dérivée de la page courante en général.

NomDéfautDescription
BROWSERSKILL_BINARY/opt/weknora/browserskill/bsk dans l’imageChemin bsk ; déploiement natif : build + config ; vide désactive
BROWSERSKILL_EXTENSION_PATHpreset image DockerZIP extension « installation manuelle » dans Boîte à outils → Connexion navigateur
BROWSERSKILL_PUBLIC_URLvide (dérivé page)Override si gateway domaine/chemin dédié ; distant : wss://
BROWSERSKILL_MAX_CONNECTIONS32Appareils navigateur simultanés par instance
BROWSERSKILL_INTERNAL_URL / BROWSERSKILL_CLUSTER_SECRETvideMulti-réplicas : URL directe entre nœuds (pas LB), secret identique ≥32 caractères

Voir Navigateur local.

Observabilité (Langfuse) ​

LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY activent automatiquement ; LANGFUSE_HOST (défaut SaaS, self-host http://langfuse-web:3000), tuning LANGFUSE_* ; profile langfuse : LANGFUSE_SALT, clés, LANGFUSE_INIT_*, voir .env.example I1/I2.

Services optionnels : SearXNG et MCP Server ​

Variables nécessaires seulement avec le profile compose correspondant.

SearXNG (--profile searxng / full) :

NomDéfautDescription
SEARXNG_PORT8888Port hôte ; ne pas confondre avec APP_PORT (8080) — collision → login reçoit HTML 404 SearXNG
SEARXNG_BIND127.0.0.1Localhost seulement ; rate limit SearXNG désactivé dans le pack WeKnora — ne pas exposer LAN sans durcissement ; 0.0.0.0 explicite si besoin
SEARXNG_SECRETvideRemplace secret_key dans settings.yml si exposé

Ajouter 127.0.0.1 à SSRF_WHITELIST pour SearXNG local. Voir Recherche web.

MCP Server (WeKnora pour clients MCP, --profile full) :

NomDéfautDescription
WEKNORA_API_KEYvideClé REST pour mcp-server, générée dans Paramètres → API Keys
MCP_SERVER_AUTH_TOKENvideObligatoire HTTP/SSE, sinon refus au démarrage ; Authorization: Bearer
WEKNORA_CHAT_TIMEOUT300Timeout lecture REST (secondes)
WEKNORA_VERIFY_SSLtrueVérification certificat backend
MCP_ALLOWED_UPLOAD_DIRSvideRépertoires upload autorisés ; vide = outil upload désactivé

Voir Intégration MCP.

config/prompt_templates/ : modèles de prompts ​

Un fichier YAML par type ; structure templates: ; champs PromptTemplate (internal/config/config.go) :

ChampDescription
idID unique, référencé par *_prompt_id, agents intégrés, préréglages
name / descriptionLibellés
contentCorps prompt système (obligatoire)
userPrompt utilisateur (paires system+user, ex. rewrite)
defaultModèle par défaut du type
modeSous-type (ex. fallback model)
has_knowledge_base / has_web_searchScénarios applicables
i18nname/description multilingues (clés locale ex. zh-CN)

Fichiers et IDs :

FichierUsageIDs de modèles
system_prompt.yamlPrompt système Q&R (quick-answer / RAG)default_kb, expert_assistant, customer_service, technical_support, pure_chat, web_search_assistant
context_template.yamlAssemblage contexte de recherchedefault_context, detailed_context, simple_context, qa_context
rewrite.yamlRéécriture multi-tours (content+user)default_rewrite, standard_rewrite, strict_rewrite
fallback.yamlSecours non trouvédefault_fallback, polite_fallback, brief_fallback, model_fallback, default_fallback_prompt
generate_session_title.yamlTitre de sessiondefault_session_title
generate_summary.yamlRésumé documentdefault_summary
generate_questions.yamlQuestions pré-généréesdefault_generate_questions
keywords_extraction.yamlExtraction mots-clésdefault_keywords_extraction
graph_extraction.yamlEntités/relations graphedefault_extract_entities, default_extract_relationships
agent_system_prompt.yamlAgent smart-reasoningpure_agent, progressive_rag_agent, data_analyst, wiki_researcher, wiki_fixer, hybrid_rag_wiki_agent
intent_prompts.yamlPrompts par intention (ID = intention)greeting, chitchat, follow_up, image_only, summarize, web_search, doc_only

Personnalisation : éditer content ou ajouter une entrée et changer *_prompt_id dans config.yaml ; redémarrage (compose monte ./config/config.yaml). ID introuvable → log Warning: xxx_prompt_id not found.

config/agent_type_presets.yaml : préréglages de type Agent ​

Préremplissage pour agents smart-reasoning personnalisés : AgentTypePresetEntry avec id, i18n, config (zéro ignoré), kb_filter optionnel (any_of / all_of / none_of, capacités vector, keyword, wiki, graph, faq). API GET /agents/type-presets.

Cinq préréglages intégrés :

idPrompt systèmeOutils autorisésNotes
rag-qaprogressive_rag_agentsearch_knowledge, read_document, list_documentstemperature 0.7, max_iterations 30, FAQ prioritaire
wiki-qawiki_researcherwiki_search, wiki_read_page, read_document, wiki_flag_issueBase Wiki activée requise
hybrid-rag-wikihybrid_rag_wiki_agentoutils Wiki + RAGmax_iterations 40
data-analysisdata_analystdata_schema, data_analysistemperature 0.3 ; kb_filter: none_of: [faq] ; csv/xlsx
customaucunaucunConfiguration manuelle

Anciens noms d’outils mappés automatiquement à l’exécution (knowledge_search, grep_chunks → search_knowledge ; etc.).

config/builtin_agents.yaml : agents intégrés ​

Agents distribués visibles par tous les locataires (BuiltinAgentEntry). Champs id, avatar, is_builtin: true, i18n, config complet. Cinq agents :

  • builtin-quick-answer : agent_mode: quick-answer, system_prompt_id: default_kb, context_template_id: default_context, paramètres de recherche (embedding_top_k: 10, seuils FAQ 0.9, etc.) ;
  • builtin-smart-reasoning : smart-reasoning, agent_type: rag-qa, max_iterations: 50 ;
  • builtin-data-analyst, builtin-wiki-researcher, builtin-wiki-fixer : analyse tabulaire et Wiki.

system_prompt_id résolu au démarrage via resolveBuiltinAgentPromptIDs. Modifier le fichier + redémarrage.

config/builtin_models.yaml.example : modèles intégrés déclaratifs ​

Copier en config/builtin_models.yaml (ou BUILTIN_MODELS_CONFIG) : entrées écrites à chaque démarrage dans models avec is_builtin=true (décommenter le volume compose). Format :

yaml
builtin_models:
  - id: builtin-llm-default        # ID stable, mises a jour idempotentes par ID a chaque demarrage
    type: KnowledgeQA              # KnowledgeQA | Embedding | Rerank | VLLM | ASR
    source: remote                 # remote (defaut) | local
    is_default: true               # modele par defaut pour ce type
    name: ${LLM_MODEL_NAME}        # champs string : references ${ENV} (.env via env_file)
    parameters:
      base_url: ${LLM_BASE_URL}
      api_key: ${LLM_API_KEY}
      provider: ${LLM_PROVIDER}    # openai | generic | aliyun | moonshot | ...
      embedding_parameters:        # type Embedding uniquement
        dimension: 1536
        truncate_prompt_tokens: 0

Note : ${ENV} non défini reste littéral ; champs non string en littéraux ; supprimer une entrée du fichier ne supprime pas la ligne en base.

Ollama local : source: local, name = modèle Ollama, ${EMBEDDING_MODEL_NAME} pour embedding ; dimension littéral (ex. nomic-embed-text → 768). Voir section « one local Ollama » dans l’exemple.

Priorité de configuration (mémo) ​

Pour une même sémantique : DB system_settings (clés enregistrées) > variables d’environnement > config.yaml > défauts code ; config locataire/base (RetrievalConfig, ChunkingConfig, etc. en DB) surcharge les défauts globaux à l’exécution. Après .env, redémarrer (docker compose up -d app) ; air en dev ne relit pas .env.

Documentation issue de WeKnora v0.9.0 · MIT License