You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
enhancement(connectors): add built-in HTTP retry with exponential backoff to AbstractConnector #8144
AbstractConnector has no retry mechanism in its base class. Each connector that makes HTTP requests (web crawler, Notion, audio, etc.) must implement its own retry logic or silently drop data on transient failures (429, 502, 503, 504). This leads to:
Inconsistent retry behavior across connectors
Silent data loss when a source returns a rate-limit or transient error
Connector authors having to reinvent backoff logic every time
Proposed Solution
Add fetch_with_retry() to AbstractConnector in knowledge/connectors/base.py:
Subclasses override should_retry(exc) -> bool and backoff_time(attempt) -> float to customize. The default implementation handles network errors and standard HTTP transient status codes.
Also add two hook methods so individual connectors can opt out or customize:
Activity
feat(connectors): HTTP retry, typed auth, mid-sync checkpoint (#8144, #…
github-actions commentedon May 22, 2026
PR #8277 (merged to
Dev_new_gui) references this issue with a close keyword.If this issue is fully resolved, close it manually. If work remains, no action is needed.
mrveiss commentedon May 22, 2026
Implemented and merged via PR #8277 into
Dev_new_gui. Closing.mrveiss commentedon May 22, 2026
✅ Closed — implementation merged to Dev_new_gui
Commit: be3c276 feat(connectors): HTTP retry, typed auth, mid-sync checkpoint (#8144, #8145, #8146)
Acceptance Criteria Met:
AbstractConnector.fetch_with_retry()added — exponential backoff, configurablemax_attempts/backoff_base/retryable_statusshould_retry()andbackoff_time()are overridable hooks on the base classRetryableErrorexception class defined for connectors to signal transient failuresWebCrawlerConnectormigrated:test_connection(),fetch_content(),_fetch_page_with_html()all usefetch_with_retryconnector_resilience_test.pycovers success-first-try, success-after-retry, exhausted-retries, non-retryable-propagatesDiscovery follow-up (filed, not blocking closure):