Tencent/WeKnora · error
PaddleOCR-VL Cloud poll: %w
Error message
PaddleOCR-VL Cloud poll: %w
What it means
After a successful submit, Read polls the PaddleOCR-VL Cloud job until the result JSONL URL is available. If pollJob fails — HTTP errors while checking status, job failure reported by the API, or the polling deadline/context expiring — the error is wrapped as 'PaddleOCR-VL Cloud poll'. The document was accepted but the asynchronous job did not produce a usable result URL in time.
Source
Thrown at internal/infrastructure/docparser/paddleocr_vl_cloud_converter.go:73
return &types.ReadResult{Error: fmt.Sprintf("PaddleOCR-VL Cloud base URL blocked by SSRF policy: %v", err)}, nil
}
content := req.FileContent
if len(content) == 0 {
return &types.ReadResult{Error: "no file content provided"}, nil
}
logger.Infof(context.Background(), "[PaddleOCR-VL Cloud] Parsing file=%s size=%d model=%s",
req.FileName, len(content), c.model)
jobID, err := c.submitJob(ctx, req, content)
if err != nil {
return nil, fmt.Errorf("PaddleOCR-VL Cloud submit: %w", err)
}
jsonlURL, err := c.pollJob(ctx, jobID)
if err != nil {
return nil, fmt.Errorf("PaddleOCR-VL Cloud poll: %w", err)
}
mdContent, imagesURL, err := c.fetchResults(jsonlURL)
if err != nil {
return nil, fmt.Errorf("PaddleOCR-VL Cloud fetch results: %w", err)
}
mdContent = normalizeHTMLTables(mdContent)
imageRefs := c.downloadImages(mdContent, imagesURL)
mdContent, imageRefs = ensureOriginalImageRef(req, mdContent, imageRefs)
logger.Infof(context.Background(), "[PaddleOCR-VL Cloud] Parsed successfully, markdown=%d chars, images=%d",
len(mdContent), len(imageRefs))
return &types.ReadResult{
MarkdownContent: mdContent,
ImageRefs: imageRefs,View on GitHub (pinned to 988cbb0330)
Solutions
- Check the wrapped cause for whether the job explicitly failed vs. timed out
- If timeout, increase poll interval/deadline or process smaller documents
- Log the job ID and check its status directly against the PaddleOCR-VL cloud console/API
- Retry the whole Read on transient cloud errors
- Verify service status/quota of your PaddleOCR-VL cloud account
Defensive patterns
Strategy: retry
Validate before calling
ctx, cancel := context.WithTimeout(ctx, 10*time.Minute) // allow long jobs defer cancel()
Type guard
func isPollFailure(err error) bool {
return err != nil && strings.Contains(err.Error(), "PaddleOCR-VL Cloud poll")
} Try / catch
out, err := reader.Read(ctx, req)
if isPollFailure(err) && errors.Is(err, context.DeadlineExceeded) {
return fmt.Errorf("job %s still running; resume or re-poll later", jobID)
} Prevention
- Size the poll window to document complexity (large docs need minutes)
- Log the job ID so failed polls can be checked manually
- Use exponential backoff on status checks to avoid rate limits
- Distinguish hard job failures (do not retry) from timeouts (retry/resume)
When it happens
Trigger: Read -> pollJob returns error: job status endpoint returns non-200, job transitions to a failed state, all poll attempts time out before completion, or ctx is cancelled.
Common situations: Very large/multi-page documents exceeding the poll window; PaddleOCR cloud outage or degraded service; invalid job ID handling after submit returned an unexpected shape; rate limiting on status checks.
Related errors
- MinerU Cloud poll: %w
- PaddleOCR-VL Cloud submit: %w
- PaddleOCR-VL Cloud fetch results: %w
- task timed out after %d polls
- E2B timeout must be at least one second
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/4d2f73f34604415c.
Report an issue: GitHub.