openai/openai-python · error · ValueError

Expected a non-empty value for `version` but received {versi

Error message

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

What it means

The version counterpart of the same guard: sync skill-version content retrieval checks version after skill_id, raising ValueError when version is empty/None for GET /skills/{skill_id}/versions/{version}/content. It prevents requesting the unversioned content path by accident.

Source

Thrown at src/openai/resources/skills/versions/content.py:72

    ) -> _legacy_response.HttpxBinaryResponseContent:
        """
        Download a skill version zip bundle.

        Args:
          version: The skill version number.

          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        """
        if not skill_id:
            raise ValueError(f"Expected a non-empty value for `skill_id` but received {skill_id!r}")
        if not version:
            raise ValueError(f"Expected a non-empty value for `version` but received {version!r}")
        extra_headers = {"Accept": "application/binary", **(extra_headers or {})}
        return self._get(
            path_template("/skills/{skill_id}/versions/{version}/content", skill_id=skill_id, version=version),
            options=make_request_options(
                extra_headers=extra_headers,
                extra_query=extra_query,
                extra_body=extra_body,
                timeout=timeout,
                security={"bearer_auth": True},
            ),
            cast_to=_legacy_response.HttpxBinaryResponseContent,
        )


class AsyncContent(AsyncAPIResource):
    @cached_property
    def with_raw_response(self) -> AsyncContentWithRawResponse:
        """

View on GitHub (pinned to 9917c6e28e)

Solutions

  1. Pass an explicit version returned from client.skills.versions.create/list
  2. If you want the latest content, use the non-versioned client.skills.content.retrieve instead
  3. Default version from a prior list() call rather than an empty string

Example fix

# before
client.skills.versions.content.retrieve("skill-abc", "")

# after
client.skills.versions.content.retrieve("skill-abc", "v3")
# or latest content:
client.skills.content.retrieve("skill-abc")
Defensive patterns

Strategy: validation

Validate before calling

if not (isinstance(version, str) and version.strip()):
    raise ValueError(f"version required, got {version!r}")
data = client.skills.versions.content.retrieve(skill_id, version)

Type guard

def is_valid_version(value: object) -> bool:
    return isinstance(value, str) and bool(value.strip())

Prevention

When it happens

Trigger: Calling retrieve(skill_id=<valid>, version="") or version=None — e.g. wanting 'latest' but passing an empty string instead of an explicit version identifier.

Common situations: Code written for the unversioned content endpoint copy-pasted to the versioned one; dicts defaulting version to ""; template strings that render empty for version.

Related errors


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