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

  1. Confirm the exact file PRODUCT_CONFIG_PATH/<domain>/knowledge/<kid>.json exists on disk
  2. Log/verify the Kid and Domain values reaching ReadKnowledgeBase (no empties or swaps)
  3. Check the filesystem case sensitivity matches the ID casing
  4. List the knowledge directory to see which IDs actually exist
  5. 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

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


AI-assisted analysis of Billionmail/BillionMail@fc36c76c05 (2026-09-05). Data as JSON: /api/errors/7eae93c0df3d41d1. Report an issue: GitHub.