OpenBB-finance/OpenBB · error · OpenBBError

, ".join(messages)

Error message

, ".join(messages)

What it means

OpenBBError raised after all per-expiration websocket tasks complete when at least one task deposited an error message into the shared `messages` set and NO results were collected. The message text is the joined set of per-expiration error strings produced inside call_api (e.g. websocket timeouts waiting for subscribed instruments to deliver data).

Source

Thrown at openbb_platform/providers/deribit/openbb_deribit/models/options_chains.py:234

                        **stats,
                        **greeks,
                    }
                    result["dte"] = (
                        result["expiration"] - to_datetime("today").date()
                    ).days
                    results.append(result)

                    if len(received_symbols) == len(symbols):
                        await websocket.close()
                        break

        tasks = [
            asyncio.create_task(call_api(expiration)) for expiration in symbols_dict
        ]
        await asyncio.gather(*tasks, return_exceptions=True)

        if messages and not results:
            raise OpenBBError(", ".join(messages))

        if results and messages:
            for message in messages:
                warn(message)

        if not results and not messages:
            raise EmptyDataError("All requests returned empty with no error messages.")

        return results

    @staticmethod
    def transform_data(
        query: DeribitOptionsChainsQueryParams,
        data: list[dict],
        **kwargs: Any,
    ) -> DeribitOptionsChainsData:
        """Transform the data."""
        # pylint: disable=import-outside-toplevel

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Retry — quote delivery is time-based and often succeeds on a second attempt.
  2. Retry once more; if the joined messages mention specific expirations, narrow the request to those and retry individually.
  3. Prefer liquid underlyings/expirations (BTC/ETH near-dated) when testing, since every contract in an expiry must tick before the deadline.
  4. If persistent, capture the websocket traffic to see whether Deribit is sending quotes at all for those instruments.
Defensive patterns

Strategy: retry

Try / catch

from openbb_core.provider.utils.errors import OpenBBError
attempts = 0
while True:
    try:
        chains = obb.derivatives.options.chains(symbol=sym, provider="deribit")
        break
    except OpenBBError as e:
        attempts += 1
        if attempts >= 3:
            raise
        time.sleep(attempts * 2)  # websocket deadlines: transient under load

Prevention

When it happens

Trigger: Every expiration's websocket subscription failed to receive quotes for all its contracts within the internal deadline (illiquid strikes never tick, or Deribit delayed sends), so results stays empty while messages accumulates errors. Also fires when symbols_dict maps expirations to empty/invalid contract lists.

Common situations: Fetching chains for illiquid underlyings (XRP, BNB, PAXG far-dated expirations) where many strikes have no live quotes, slow networks that miss the per-expiration deadline, or Deribit under load.

Related errors


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/b2b6187f8772234e. Report an issue: GitHub.