Skip to content

fix(client): treat empty OPENAI_BASE_URL env var as unset - #3559

Open
okxint wants to merge 3 commits into
openai:mainfrom
okxint:fix/empty-base-url-env
Open

fix(client): treat empty OPENAI_BASE_URL env var as unset#3559
okxint wants to merge 3 commits into
openai:mainfrom
okxint:fix/empty-base-url-env

Conversation

@okxint

@okxint okxint commented Jul 31, 2026

Copy link
Copy Markdown

os.environ.get("OPENAI_BASE_URL") returns "" when the variable is defined but empty — common in Docker/.env setups. The empty string passes the if base_url is None guard, so the default https://api.openai.com/v1 fallback is never applied and the client raises an APIConnectionError trying to connect to an empty URL.

Using or None normalises "" to None. Fix applied to both OpenAI (sync) and AsyncOpenAI clients.

Fixes #2927

okxint added 3 commits July 5, 2026 10:23
Filters out content items where `text` is None before joining, preventing
a TypeError crash when the API returns null for a text block (issue openai#3063).
result (base64 image string) and status are output-only fields populated
by the API response. Marking them Required on an input TypedDict forces
callers to provide values they don't have and wouldn't supply when
referencing an existing image generation call by id and type.

Fixes openai#2648
os.environ.get("OPENAI_BASE_URL") returns "" when the variable is
defined but empty (common in Docker/.env setups). The empty string
passes the subsequent `if base_url is None` check, so the default
https://api.openai.com/v1 fallback is never applied and the client
tries to connect to an empty URL, raising an APIConnectionError.

Using `or None` normalises "" to None, allowing the default to apply.
Fix applied to both the sync OpenAI and async AsyncOpenAI clients.

Fixes openai#2927
@okxint
okxint requested a review from a team as a code owner July 31, 2026 06:44

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d2140bedea

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +196 to +199
result: Optional[str]
"""The generated image encoded in base64."""

status: Required[Literal["in_progress", "completed", "generating", "failed"]]
status: Literal["in_progress", "completed", "generating", "failed"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Propagate optional image fields to ResponseInputParam

When callers use the normal client.responses.create(input=[...]) path, the overloads still refer to ResponseInputParam from response_input_param.py, which contains its own duplicate ImageGenerationCall where result and status remain Required. This change fixes only the standalone ResponseInputItemParam, so the documented image-id input still produces type errors for the primary Responses create API; update the duplicate definition or make ResponseInputParam reuse this item type.

Useful? React with 👍 / 👎.

if output.type == "message":
for content in output.content:
if content.type == "output_text":
if content.type == "output_text" and content.text is not None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Make the null guard type-checkable

In the repository's strict Pyright configuration, ResponseOutputText.text is still annotated as str, so this new content.text is not None check is reported as an always-true comparison and causes scripts/run-pyright to fail. For the null-text scenario this fix is targeting, the model field also needs to be made nullable (or the guard needs a type-safe workaround) so the change can pass CI while representing the API payload accurately.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Empty OPENAI_BASE_URL prevents fallback to default API endpoint

1 participant