Billionmail/BillionMail · error
knowledge base file does not exist: %s
Error message
knowledge base file does not exist: %s
What it means
ReadKnowledgeBase builds the path PRODUCT_CONFIG_PATH/<Domain>/knowledge/<Kid>.json and checks existence with public.FileExists before reading. If the file is absent it returns 'knowledge base file does not exist: %s' including the full path. Called by GetKnowledgeBaseList and ModifyKnowledgeBaseFile, this aborts those flows for unknown/missing knowledge entries.
Source
Thrown at core/internal/service/askai/project.go:292
if urlsCount > 3 {
return fmt.Errorf("Add up to 3 URLs")
}
config.Urls = urls
}
err = SaveProjectConfig(Domain, config)
if err != nil {
return fmt.Errorf("error saving project configuration: %v", err)
}
return nil
}
// ReadKnowledgeBase reads a specific knowledge base from a JSON file based on the provided domain and knowledge ID.
// It returns a KnowledgeInfo struct or an error if the file does not exist or cannot be
func ReadKnowledgeBase(Domain string, Kid string) (KnowledgeInfo, error) {
filename := fmt.Sprintf(PRODUCT_CONFIG_PATH+"/%s/knowledge/%s.json", Domain, Kid)
if !public.FileExists(filename) {
return KnowledgeInfo{}, fmt.Errorf("knowledge base file does not exist: %s", filename)
}
data, err := os.ReadFile(filename)
if err != nil {
return KnowledgeInfo{}, fmt.Errorf("error reading knowledge base file: %v", err)
}
var knowledge KnowledgeInfo
err = json.Unmarshal(data, &knowledge)
if err != nil {
return KnowledgeInfo{}, fmt.Errorf("error unmarshalling knowledge base: %v", err)
}
return knowledge, nil
}
// SaveKnowledgeBase saves the provided KnowledgeInfo to a JSON file based on the domain and knowledge ID.
// It creates the directory if it does not exist and writes the knowledge information to a JSON file
func SaveKnowledgeBase(Domain string, knowledge KnowledgeInfo) error {
knowledgePath := fmt.Sprintf("%s/%s/knowledge", PRODUCT_CONFIG_PATH, Domain)View on GitHub (pinned to fc36c76c05)
Solutions
- Confirm the exact file PRODUCT_CONFIG_PATH/<domain>/knowledge/<kid>.json exists on disk
- Log/verify the Kid and Domain values reaching ReadKnowledgeBase (no empties or swaps)
- Check the filesystem case sensitivity matches the ID casing
- List the knowledge directory to see which IDs actually exist
- Call os.IsNotExist-style handling in callers to treat this as a 404 rather than a server error
Example fix
// before
kb, err := askai.ReadKnowledgeBase(domain, kid)
// after
files, _ := os.ReadDir(fmt.Sprintf(PRODUCT_CONFIG_PATH+"/%s/knowledge", domain))
for _, f := range files {
if f.Name() == kid+".json" {
kb, err = askai.ReadKnowledgeBase(domain, kid)
break
}
} Defensive patterns
Strategy: type-guard
Validate before calling
kbPath := fmt.Sprintf(PRODUCT_CONFIG_PATH+"/%s/knowledge/%s.json", domain, kid)
if !public.FileExists(kbPath) {
return ErrKnowledgeNotFound
} Type guard
func knowledgeExists(domain, kid string) bool {
if domain == "" || kid == "" { return false }
return public.FileExists(fmt.Sprintf(PRODUCT_CONFIG_PATH+"/%s/knowledge/%s.json", domain, kid))
} Try / catch
kb, err := askai.ReadKnowledgeBase(domain, kid)
if err != nil && strings.Contains(err.Error(), "does not exist") {
return respondNotFound(domain, kid)
} else if err != nil {
return err
} Prevention
- Validate kid and domain are non-empty before path construction
- List existing knowledge IDs from the directory instead of guessing IDs
- Clean up stale frontend references after deletions
- Respect filesystem case sensitivity when storing IDs
- Treat this error as 404, not 500, in API handlers
When it happens
Trigger: ReadKnowledgeBase(Domain, Kid) where the JSON file for Kid does not exist in the domain's knowledge directory: unknown ID, deleted file, wrong domain, or ID containing path-breaking characters.
Common situations: Stale frontend referencing a deleted knowledge base; Kid/domain swapped or truncated (empty Kid produces a directory-like path); case-sensitive filesystem mismatch; domain directory renamed.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- error getting knowledge base list: %v
- error reading knowledge base file: %v
- error reading project configuration: %v
- error saving project configuration: %v
- error unmarshalling knowledge base: %v
AI-assisted analysis of Billionmail/BillionMail@fc36c76c05 (2026-09-05).
Data as JSON: /api/errors/7eae93c0df3d41d1.
Report an issue: GitHub.