openai/openai-python · error · RuntimeError

No next page expected; please check `.has_next_page()` befor

Error message

No next page expected; please check `.has_next_page()` before calling `.get_next_page()`.

What it means

The OpenAI Python SDK raises this ValueError when client.vector_stores.file_batches.list_files() (sync) is called with a falsy vector_store_id. It is a pre-request guard ensuring the /vector_stores/{vector_store_id}/file_batches/{batch_id}/files path receives a valid non-empty store identifier.

Source

Thrown at src/openai/_base_client.py:291

    # by pydantic.
    def __iter__(self) -> Iterator[_T]:  # type: ignore
        for page in self.iter_pages():
            for item in page._get_page_items():
                yield item

    def iter_pages(self: SyncPageT) -> Iterator[SyncPageT]:
        page = self
        while True:
            yield page
            if page.has_next_page():
                page = page.get_next_page()
            else:
                return

    def get_next_page(self: SyncPageT) -> SyncPageT:
        info = self.next_page_info()
        if not info:
            raise RuntimeError(
                "No next page expected; please check `.has_next_page()` before calling `.get_next_page()`."
            )

        options = self._info_to_options(info)
        return self._client._request_api_list(self._model, page=self.__class__, options=options)


class AsyncPaginator(Generic[_T, AsyncPageT]):
    def __init__(
        self,
        client: AsyncAPIClient,
        options: FinalRequestOptions,
        page_cls: Type[AsyncPageT],
        model: Type[_T],
    ) -> None:
        self._model = model
        self._client = client
        self._options = options

View on GitHub (pinned to 9917c6e28e)

Solutions

  1. Populate vector_store_id with the actual 'vs_...' identifier (from client.vector_stores.create().id or a retrieved store).
  2. Validate the source of the ID (env var, config, DB row) and fail early if it is empty.
  3. Guard loops: skip or log entries with missing store IDs before calling list_files.

Example fix

# before
files = client.vector_stores.file_batches.list_files(vector_store_id=store, batch_id=bid)  # store == ''

# after
if not store:
    raise ValueError(f"missing vector_store_id for batch {bid}")
files = client.vector_stores.file_batches.list_files(vector_store_id=store, batch_id=bid)
Defensive patterns

Strategy: validation

Validate before calling

assert vector_store_id and vector_store_id.startswith("vs_"), f"bad vector_store_id: {vector_store_id!r}"
files = client.vector_stores.file_batches.list_files(vector_store_id=vector_store_id, batch_id=batch_id)

Type guard

def is_valid_vector_store_id(v: object) -> bool:
    return isinstance(v, str) and v.startswith("vs_") and len(v) > 3

Prevention

When it happens

Trigger: Calling list_files(vector_store_id='', batch_id='vsfb_...') or with vector_store_id=None on the synchronous resource, typically because the store ID variable was never populated.

Common situations: IDs sourced from environment variables or databases that are empty, iterating over a list of stores where one entry is blank, or copy-pasting example code without replacing placeholder IDs.

Related errors


AI-assisted analysis of openai/openai-python@9917c6e28e (2026-08-28). Data as JSON: /api/errors/ba29fa5fd58db655. Report an issue: GitHub.