feat(config): wire MinerU and material RAG settings

Add MINERU_* / MATERIAL_* to config loader, .env.example, and
compose env passthrough. Secrets stay in local .env only.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-21 08:29:10 +00:00
co-authored by Cursor
parent 79c4c7c496
commit 983b785cd6
5 changed files with 97 additions and 0 deletions
+9
View File
@@ -63,6 +63,15 @@ RERANKER_ENDPOINT_URL=https://www.dmxapi.cn/v1/rerank
RERANKER_MODEL=bge-reranker-v2-m3-free
RERANKER_API_KEY=
# --- 9b. MinerU 文档解析(上传 PDF/Office 异步解析;未配置 KEY 时降级本地提取)---
MINERU_ENDPOINT_URL=https://mineru.net
MINERU_API_KEY=
MINERU_MODEL_VERSION=vlm
MINERU_LANGUAGE=ch
MINERU_TIMEOUT=90s
MATERIAL_FULLTEXT_MAX_BYTES=61440
MATERIAL_RAG_TOP_K=8
# --- 10. 专属业务/上下文库(Go 宿主:CONTEXT_DB_*;compose 同时认 SYSTEM_DB_* 别名)---
CONTEXT_DB_HOST=127.0.0.1
CONTEXT_DB_PORT=5433
+7
View File
@@ -99,6 +99,13 @@ services:
RERANKER_ENDPOINT_URL: ${RERANKER_ENDPOINT_URL:-}
RERANKER_MODEL: ${RERANKER_MODEL:-bge-reranker-v2-m3-free}
RERANKER_API_KEY: ${RERANKER_API_KEY:-}
MINERU_ENDPOINT_URL: ${MINERU_ENDPOINT_URL:-https://mineru.net}
MINERU_API_KEY: ${MINERU_API_KEY:-}
MINERU_MODEL_VERSION: ${MINERU_MODEL_VERSION:-vlm}
MINERU_LANGUAGE: ${MINERU_LANGUAGE:-ch}
MINERU_TIMEOUT: ${MINERU_TIMEOUT:-90s}
MATERIAL_FULLTEXT_MAX_BYTES: ${MATERIAL_FULLTEXT_MAX_BYTES:-61440}
MATERIAL_RAG_TOP_K: ${MATERIAL_RAG_TOP_K:-8}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin-secret-password-123}
AUTH_REGISTRATION_ENABLED: ${AUTH_REGISTRATION_ENABLED:-true}
+7
View File
@@ -104,6 +104,13 @@ services:
RERANKER_ENDPOINT_URL: ${RERANKER_ENDPOINT_URL:-}
RERANKER_MODEL: ${RERANKER_MODEL:-bge-reranker-v2-m3-free}
RERANKER_API_KEY: ${RERANKER_API_KEY:-}
MINERU_ENDPOINT_URL: ${MINERU_ENDPOINT_URL:-https://mineru.net}
MINERU_API_KEY: ${MINERU_API_KEY:-}
MINERU_MODEL_VERSION: ${MINERU_MODEL_VERSION:-vlm}
MINERU_LANGUAGE: ${MINERU_LANGUAGE:-ch}
MINERU_TIMEOUT: ${MINERU_TIMEOUT:-90s}
MATERIAL_FULLTEXT_MAX_BYTES: ${MATERIAL_FULLTEXT_MAX_BYTES:-61440}
MATERIAL_RAG_TOP_K: ${MATERIAL_RAG_TOP_K:-8}
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-}
ALLOW_IN_MEMORY: "false"
CACHE_ENABLED: ${CACHE_ENABLED:-true}
+7
View File
@@ -97,6 +97,13 @@ services:
RERANKER_ENDPOINT_URL: ${RERANKER_ENDPOINT_URL:-}
RERANKER_MODEL: ${RERANKER_MODEL:-bge-reranker-v2-m3-free}
RERANKER_API_KEY: ${RERANKER_API_KEY:-}
MINERU_ENDPOINT_URL: ${MINERU_ENDPOINT_URL:-https://mineru.net}
MINERU_API_KEY: ${MINERU_API_KEY:-}
MINERU_MODEL_VERSION: ${MINERU_MODEL_VERSION:-vlm}
MINERU_LANGUAGE: ${MINERU_LANGUAGE:-ch}
MINERU_TIMEOUT: ${MINERU_TIMEOUT:-90s}
MATERIAL_FULLTEXT_MAX_BYTES: ${MATERIAL_FULLTEXT_MAX_BYTES:-61440}
MATERIAL_RAG_TOP_K: ${MATERIAL_RAG_TOP_K:-8}
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?required}
AUTH_REGISTRATION_ENABLED: ${AUTH_REGISTRATION_ENABLED:-true}
+67
View File
@@ -52,6 +52,17 @@ type Config struct {
RerankerModel string `json:"reranker_model"`
RerankerAPIKey string `json:"reranker_api_key"`
// MinerU 文档解析(精准 API);未配置 API Key 时整条链路降级为本地提取
MineruEndpointURL string `json:"mineru_endpoint_url"`
MineruAPIKey string `json:"mineru_api_key"`
MineruModelVersion string `json:"mineru_model_version"`
MineruLanguage string `json:"mineru_language"`
MineruTimeout time.Duration `json:"mineru_timeout"`
// 材料注入策略:小文档全文,大文档 RAG
MaterialFulltextMaxBytes int `json:"material_fulltext_max_bytes"`
MaterialRAGTopK int `json:"material_rag_top_k"`
// 系统管理员与准入认证配置
AdminUsername string `json:"admin_username"`
AdminPassword string `json:"admin_password"`
@@ -112,6 +123,15 @@ func Load(path string) (*Config, error) {
RerankerModel: "bge-reranker-v2-m3-free",
RerankerAPIKey: "",
MineruEndpointURL: "https://mineru.net",
MineruAPIKey: "",
MineruModelVersion: "vlm",
MineruLanguage: "ch",
MineruTimeout: 90 * time.Second,
MaterialFulltextMaxBytes: 60 * 1024,
MaterialRAGTopK: 8,
AdminUsername: "admin",
AdminPassword: "admin-secret-password-123",
AuthRegistrationEnabled: true,
@@ -235,6 +255,33 @@ func Load(path string) (*Config, error) {
if v := os.Getenv("RERANKER_MODEL"); v != "" {
cfg.RerankerModel = v
}
if v := os.Getenv("MINERU_ENDPOINT_URL"); v != "" {
cfg.MineruEndpointURL = v
}
if v := os.Getenv("MINERU_API_KEY"); v != "" {
cfg.MineruAPIKey = v
}
if v := os.Getenv("MINERU_MODEL_VERSION"); v != "" {
cfg.MineruModelVersion = v
}
if v := os.Getenv("MINERU_LANGUAGE"); v != "" {
cfg.MineruLanguage = v
}
if v := os.Getenv("MINERU_TIMEOUT"); v != "" {
if d, err := time.ParseDuration(v); err == nil {
cfg.MineruTimeout = d
}
}
if v := os.Getenv("MATERIAL_FULLTEXT_MAX_BYTES"); v != "" {
if n, err := strconv.Atoi(v); err == nil && n > 0 {
cfg.MaterialFulltextMaxBytes = n
}
}
if v := os.Getenv("MATERIAL_RAG_TOP_K"); v != "" {
if n, err := strconv.Atoi(v); err == nil && n > 0 {
cfg.MaterialRAGTopK = n
}
}
if v := os.Getenv("ADMIN_USERNAME"); v != "" {
cfg.AdminUsername = v
}
@@ -403,6 +450,26 @@ func applyEnvFile(cfg *Config, path string) error {
cfg.RerankerModel = val
case "RERANKER_API_KEY":
cfg.RerankerAPIKey = val
case "MINERU_ENDPOINT_URL":
cfg.MineruEndpointURL = val
case "MINERU_API_KEY":
cfg.MineruAPIKey = val
case "MINERU_MODEL_VERSION":
cfg.MineruModelVersion = val
case "MINERU_LANGUAGE":
cfg.MineruLanguage = val
case "MINERU_TIMEOUT":
if d, err := time.ParseDuration(val); err == nil {
cfg.MineruTimeout = d
}
case "MATERIAL_FULLTEXT_MAX_BYTES":
if n, err := strconv.Atoi(val); err == nil && n > 0 {
cfg.MaterialFulltextMaxBytes = n
}
case "MATERIAL_RAG_TOP_K":
if n, err := strconv.Atoi(val); err == nil && n > 0 {
cfg.MaterialRAGTopK = n
}
case "ADMIN_USERNAME":
cfg.AdminUsername = val
case "ADMIN_PASSWORD":