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
- Confirm response_id comes from the create call's returned object
- Validate non-empty before polling/retrieving
- 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
- Use os.environ[...] for required poll IDs
- Keep resource IDs in typed dataclasses to avoid mix-ups
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
- Expected a non-empty value for `response_id` but received {r
- Expected a non-empty value for `project_id` but received {pr
- Expected a non-empty value for `project_id` but received {pr
- Expected a non-empty value for `project_id` but received {pr
- Expected a non-empty value for `group_id` but received {grou
AI-assisted analysis of openai/openai-python@9917c6e28e (2026-08-28).
Data as JSON: /api/errors/b69f3c2b481c0b9b.
Report an issue: GitHub.