Tencent/WeKnora · error

parse document: %w

Error message

parse document: %w

What it means

Wraps a failure from docparser.NewReader while constructing a document reader for the given parser engine and extension. Reader construction fails when the engine/format combination is unknown or unsupported (e.g. engine name typo, no reader registered for the extension).

Source

Thrown at internal/application/service/temporary_document.go:403

	parserEngine := strings.TrimSpace(options.ParserEngine)
	if parserEngine == "auto" {
		parserEngine = ""
	}
	request := &types.ReadRequest{
		FileContent: data, FileName: document.FileName, FileType: strings.TrimPrefix(ext, "."),
		ParserEngine: parserEngine,
	}
	if tenant, ok := ctx.Value(types.TenantInfoContextKey).(*types.Tenant); ok && tenant != nil && tenant.ParserEngineConfig != nil {
		request.ParserEngineOverrides = tenant.ParserEngineConfig.ToOverridesMap()
	}
	deps := docparser.ReaderDeps{Overrides: request.ParserEngineOverrides, Remote: s.documentReader}
	if s.tenantService != nil {
		deps.WeKnoraCloudCredentials = s.tenantService.GetWeKnoraCloudCredentials
	}
	reader, err := docparser.NewReader(ctx, parserEngine, strings.TrimPrefix(ext, "."), false, deps)
	if err != nil {
		return "", nil, nil, fmt.Errorf("parse document: %w", err)
	}
	result, err := reader.Read(ctx, request)
	if err != nil {
		return "", nil, nil, fmt.Errorf("parse document: %w", err)
	}
	// Capture raw page-image bytes before ResolveAndStore stores/rewrites them,
	// so the VLM OCR fallback for scanned documents has bytes to work with.
	maxOCRPages := temporaryDocumentImageOCRMaxPages()
	if options.OCRMaxPages > 0 {
		maxOCRPages = options.OCRMaxPages
	}
	pageImages := collectImageBytes(result.ImageRefs, maxOCRPages)
	images := make([]types.TemporaryDocumentImage, 0)
	if s.imageResolver != nil {
		updated, stored, resolveErr := s.imageResolver.ResolveAndStore(
			ctx, result, temporarySaveFileService{s.fileService}, document.TenantID,
		)
		if resolveErr != nil {

View on GitHub (pinned to 988cbb0330)

Solutions

  1. Use a supported ParserEngine value or "auto" to let the system pick
  2. Check that the file extension is a supported document format
  3. Verify ParserEngineOverrides entries reference valid engines
  4. Inspect the wrapped error for which engine/format combination failed

Example fix

// before
types.ParseOptions{ParserEngine: "ocr-xml"} // unsupported
// after
types.ParseOptions{ParserEngine: "auto"}
Defensive patterns

Strategy: validation

Validate before calling

if !docparser.IsSupportedExtension(ext) || !isKnownEngine(opts.ParserEngine) {
    return errors.New("unsupported document format or parser engine")
}

Try / catch

if err != nil {
    if strings.HasPrefix(err.Error(), "parse document:") {
        // inspect wrapped cause: unsupported engine/format
    }
}

Prevention

When it happens

Trigger: parse → Process on a non-audio document where parserEngine (after trim/auto resolution) plus the trimmed extension yields no registered docparser reader — NewReader returns an error.

Common situations: Caller passes an unsupported ParserEngine value (misspelling or engine not compiled in); file extension with no parser available (e.g. unusual binary format); ParserEngineOverrides map references a nonexistent engine.

Related errors


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/408608510174829a. Report an issue: GitHub.