This commit is contained in:
+29
-23
@@ -39,7 +39,11 @@ func main() {
|
||||
log.Fatalf("initialize store: %v", err)
|
||||
}
|
||||
|
||||
aiService, aiTimeout, err := aiServiceFromEnv(cfg.Mode, s.DataDir())
|
||||
stagingStore, err := stagingStoreFromEnv(s.DataDir())
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
aiService, aiTimeout, err := aiServiceFromEnv(cfg.Mode, stagingStore)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -62,7 +66,7 @@ func main() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
app := newApp(s, sub, cfg).withAI(aiService)
|
||||
app := newApp(s, sub, cfg).withStaging(stagingStore).withAI(aiService)
|
||||
handler := requestLogger(optionalBasicAuth(app.routes()))
|
||||
|
||||
writeTimeout := 60 * time.Second
|
||||
@@ -81,6 +85,7 @@ func main() {
|
||||
log.Printf("KB service listening on %s", listen)
|
||||
log.Printf("Mode: %s (writable=%t)", cfg.Mode, cfg.Writable)
|
||||
log.Printf("Data directory: %s (%d JSON files indexed)", s.DataDir(), s.Count())
|
||||
log.Printf("Staging directory: %s (%d JSON files)", stagingStore.Dir(), stagingStore.Count())
|
||||
if reloadInterval > 0 {
|
||||
log.Printf("Automatic index reload: %s", reloadInterval)
|
||||
}
|
||||
@@ -148,7 +153,26 @@ func startAutoReload(s *store.Store, interval time.Duration) {
|
||||
}
|
||||
}
|
||||
|
||||
func aiServiceFromEnv(mode, dataDir string) (*aifallback.Service, time.Duration, error) {
|
||||
func stagingStoreFromEnv(dataDir string) (*staging.Store, error) {
|
||||
stagingDir := strings.TrimSpace(os.Getenv("STAGING_DIR"))
|
||||
if stagingDir == "" {
|
||||
stagingDir = filepath.Join(filepath.Dir(dataDir), "staging")
|
||||
}
|
||||
stagingAbs, err := filepath.Abs(stagingDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dataAbs, err := filepath.Abs(dataDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if pathContains(dataAbs, stagingAbs) || pathContains(stagingAbs, dataAbs) {
|
||||
return nil, fmt.Errorf("STAGING_DIR (%s) must be separate from DATA_DIR (%s)", stagingAbs, dataAbs)
|
||||
}
|
||||
return staging.New(stagingAbs)
|
||||
}
|
||||
|
||||
func aiServiceFromEnv(mode string, st *staging.Store) (*aifallback.Service, time.Duration, error) {
|
||||
enabled, err := envBool("AI_FALLBACK_ENABLED", false)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
@@ -176,26 +200,8 @@ func aiServiceFromEnv(mode, dataDir string) (*aifallback.Service, time.Duration,
|
||||
if err != nil || minScore < 0 || minScore > 1 {
|
||||
return nil, 0, fmt.Errorf("OLLAMA_STAGING_MIN_SCORE must be between 0 and 1")
|
||||
}
|
||||
|
||||
stagingDir := strings.TrimSpace(os.Getenv("STAGING_DIR"))
|
||||
if stagingDir == "" {
|
||||
stagingDir = filepath.Join(filepath.Dir(dataDir), "staging")
|
||||
}
|
||||
stagingAbs, err := filepath.Abs(stagingDir)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
dataAbs, err := filepath.Abs(dataDir)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
if pathContains(dataAbs, stagingAbs) || pathContains(stagingAbs, dataAbs) {
|
||||
return nil, 0, fmt.Errorf("STAGING_DIR (%s) must be separate from DATA_DIR (%s)", stagingAbs, dataAbs)
|
||||
}
|
||||
|
||||
st, err := staging.New(stagingAbs)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
if st == nil {
|
||||
return nil, 0, fmt.Errorf("staging store is required for AI fallback")
|
||||
}
|
||||
svc, err := aifallback.New(aifallback.Config{
|
||||
BaseURL: envOr("OLLAMA_BASE_URL", "http://ollama:11434"),
|
||||
|
||||
Reference in New Issue
Block a user