openai/openai-python · error · ValueError

Expected a non-empty value for `response_id` but received {r

Error message

Expected a non-empty value for `response_id` but received {response_id!r}

What it means

The sync beta Responses retrieve method requires a non-empty `response_id` for the GET URL `/responses/{response_id}?beta=true`. The generated guard raises ValueError before any request when the value is falsy.

Source

Thrown at src/openai/resources/beta/responses/responses.py:1668

    def retrieve(
        self,
        response_id: str,
        *,
        include: List[BetaResponseIncludable] | Omit = omit,
        include_obfuscation: bool | Omit = omit,
        starting_after: int | Omit = omit,
        stream: Literal[False] | Literal[True] | Omit = omit,
        betas: List[Literal["responses_multi_agent=v1"]] | Omit = omit,
        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
        # The extra values given here take precedence over values defined on the client or passed to this method.
        extra_headers: Headers | None = None,
        extra_query: Query | None = None,
        extra_body: Body | None = None,
        timeout: float | httpx2.Timeout | None | NotGiven = not_given,
    ) -> BetaResponse | Stream[BetaResponseStreamEvent]:
        if not response_id:
            raise ValueError(f"Expected a non-empty value for `response_id` but received {response_id!r}")
        extra_headers = {
            **strip_not_given({"openai-beta": ",".join(str(e) for e in betas) if is_given(betas) else not_given}),
            **(extra_headers or {}),
        }
        return self._get(
            path_template("/responses/{response_id}?beta=true", response_id=response_id),
            options=make_request_options(
                extra_headers=extra_headers,
                extra_query=extra_query,
                extra_body=extra_body,
                timeout=timeout,
                query=maybe_transform(
                    {
                        "include": include,
                        "include_obfuscation": include_obfuscation,
                        "starting_after": starting_after,
                        "stream": stream,
                    },

View on GitHub (pinned to 9917c6e28e)

Solutions

  1. Confirm response_id comes from the create call's returned object
  2. Validate non-empty before polling/retrieving
  3. Check variable naming to avoid passing the wrong resource ID

Example fix

// before
r = client.beta.responses.retrieve(response_id=os.getenv("RESPONSE_ID"))
// after
r = client.beta.responses.retrieve(response_id=os.environ["RESPONSE_ID"])
Defensive patterns

Strategy: validation

Validate before calling

if not response_id:
    raise ValueError("response_id required for retrieve")

Type guard

def is_valid_response_id(v: object) -> bool:
    return isinstance(v, str) and bool(v.strip())

Try / catch

try:
    r = client.beta.responses.retrieve(response_id=rid)
except ValueError:
    raise

Prevention

When it happens

Trigger: Calling `client.beta.responses.retrieve(response_id="")` or None on the sync client (responses.py:1668).

Common situations: Polling a background response with an unset ID; passing thread_id or model instead of response_id.

Related errors


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