Skip to content

feat(api): make function call output call IDs optional - #939

Merged
apcha-oai merged 1 commit into
mainfrom
castiron/promotions/pr-51
Aug 27, 2026
Merged

feat(api): make function call output call IDs optional#939
apcha-oai merged 1 commit into
mainfrom
castiron/promotions/pr-51

Conversation

@apcha-oai

Copy link
Copy Markdown
Contributor

Summary

Align function call output types with the API schema: call_id is optional in stable and beta input and response types, and input types also accept null.

Castiron-Internal-PR: openai/openai-java-internal#51
Castiron-Source-SHA: 04866d3e83bf2ba2292c21ea60c9eabc957df1e2
Castiron-Public-Base-SHA: 35324bf
@apcha-oai
apcha-oai marked this pull request as ready for review August 26, 2026 23:13
@apcha-oai
apcha-oai requested a review from a team as a code owner August 26, 2026 23:13
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 26, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-08-26T23:15:24.380817Z 3d35cf9 Draft marked ready
🔒 Security Review Completed 2026-08-26T23:16:00.374674Z 3d35cf9 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@openai-sdks

openai-sdks Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

OkTest Summary

237/237 SDK tests passed in 16.233s for Java SDK PR #939.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 813ms
tests/chat-completions-create.test.ts ✅ Passed 462ms
tests/chat-completions-stream.test.ts ✅ Passed 333ms
tests/files-content-binary.test.ts ✅ Passed 255ms
tests/files-create-multipart.test.ts ✅ Passed 361ms
tests/files-list-pagination.test.ts ✅ Passed 345ms
tests/initialize-config.test.ts ✅ Passed 165ms
tests/instance-isolation.test.ts ✅ Passed 232ms
tests/models-list.test.ts ✅ Passed 306ms
tests/responses-background-lifecycle.test.ts ✅ Passed 294ms
tests/responses-body-method-errors.test.ts ✅ Passed 566ms
tests/responses-cancel-timeout.test.ts ✅ Passed 235ms
tests/responses-cancel.test.ts ✅ Passed 323ms
tests/responses-compact-retries.test.ts ✅ Passed 467ms
tests/responses-compact.test.ts ✅ Passed 317ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 327ms
tests/responses-create-advanced.test.ts ✅ Passed 1.297s
tests/responses-create-disconnect.test.ts ✅ Passed 1.109s
tests/responses-create-errors.test.ts ✅ Passed 271ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 309ms
tests/responses-create-retries.test.ts ✅ Passed 253ms
tests/responses-create-stream-failures.test.ts ✅ Passed 196ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 232ms
tests/responses-create-stream-wire.test.ts ✅ Passed 6.137s
tests/responses-create-stream.test.ts ✅ Passed 111ms
tests/responses-create-terminal-states.test.ts ✅ Passed 405ms
tests/responses-create-timeout.test.ts ✅ Passed 227ms
tests/responses-create.test.ts ✅ Passed 614ms
tests/responses-delete.test.ts ✅ Passed 297ms
tests/responses-input-items-errors.test.ts ✅ Passed 277ms
tests/responses-input-items-list.test.ts ✅ Passed 287ms
tests/responses-input-items-options.test.ts ✅ Passed 184ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 271ms
tests/responses-input-tokens-count.test.ts ✅ Passed 494ms
tests/responses-malformed-inputs.test.ts ✅ Passed 5.095s
tests/responses-not-found-errors.test.ts ✅ Passed 439ms
tests/responses-parse.test.ts ✅ Passed 546ms
tests/responses-retrieve-retries.test.ts ✅ Passed 302ms
tests/responses-retrieve.test.ts ✅ Passed 254ms
tests/responses-stored-method-errors.test.ts ✅ Passed 1.046s
tests/retry-behavior.test.ts ✅ Passed 3.501s
tests/sdk-error-shape.test.ts ✅ Passed 477ms

View OkTest run #33022474963

SDK merge (0d9eede0280a) · head (3d35cf9c912b) · base (35324bf54adf) · OkTest (2b1bdfd25e98)

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

53 mixed files remain; 0 existing customizations changed; 1 generated baselines changed.

Compared 35324bf54adf3d35cf9c912b. Generated baselines verified.

File Result Current custom patch
openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseInputItem.kt Generated baseline changed +9 / −0
52 existing customizations unchanged
  • openai-java-core/src/main/kotlin/com/openai/models/audio/AudioResponseFormat.kt
  • openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionCreateParams.kt
  • openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionMessageFunctionToolCall.kt
  • openai-java-core/src/main/kotlin/com/openai/models/chat/completions/ChatCompletionToolMessageParam.kt
  • openai-java-core/src/main/kotlin/com/openai/models/embeddings/Embedding.kt
  • openai-java-core/src/main/kotlin/com/openai/models/embeddings/EmbeddingCreateParams.kt
  • openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseCreateParams.kt
  • openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionToolCall.kt
  • openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseFunctionWebSearch.kt
  • openai-java-core/src/main/kotlin/com/openai/models/responses/ResponseTextConfig.kt
  • openai-java-core/src/main/kotlin/com/openai/models/videos/Video.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsync.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/BetaServiceAsyncImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsync.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/ResponseServiceAsyncImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsync.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/WebhookServiceAsyncImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsync.kt
  • openai-java-core/src/main/kotlin/com/openai/services/async/finetuning/checkpoints/PermissionServiceAsyncImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaService.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/BetaServiceImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseService.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/ResponseServiceImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookService.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/WebhookServiceImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/audio/TranscriptionServiceImpl.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/chat/ChatCompletionService.kt
  • openai-java-core/src/main/kotlin/com/openai/services/blocking/finetuning/checkpoints/PermissionServiceImpl.kt
  • openai-java-core/src/test/kotlin/com/openai/models/beta/responses/BetaResponsesServerEventTest.kt
  • openai-java-core/src/test/kotlin/com/openai/models/responses/ResponsesServerEventTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/CompletionServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/ImageServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/ResponseServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/WebhookServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/audio/TranscriptionServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/beta/ResponseServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/beta/ThreadServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/beta/threads/RunServiceAsyncTest.kt
  • openai-java-core/src/test/kotlin/com/openai/services/async/chat/ChatCompletionServiceAsyncTest.kt

12 more in the full report.

A changed generated baseline means this report cannot reliably identify which handwritten lines changed.

Inspect the custom-code diff

Download the exact patch produced by this run (requires repository access):

gh run download 33022674428 --repo openai/openai-java \
  --name castiron-custom-code-33022674428-1 --dir /tmp/castiron-custom-code-33022674428-1
git apply --stat /tmp/castiron-custom-code-33022674428-1/custom-code.patch
cat /tmp/castiron-custom-code-33022674428-1/custom-code.patch

Or reproduce it from an SDK checkout containing the vendored reporter:

git fetch --no-tags origin 35324bf54adf68ea1853f7684bdbdf29c9fd329c 3d35cf9c912bc330713cbb7a2f4dc9c7fc47b712
python3 scripts/castiron/custom_code_report.py report \
  --base 35324bf54adf68ea1853f7684bdbdf29c9fd329c \
  --head 3d35cf9c912bc330713cbb7a2f4dc9c7fc47b712 --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-3d35cf9c912b
cat /tmp/castiron-custom-code-3d35cf9c912b/custom-code.patch

This is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR.

Full report and patch

@jbeckwith-oai jbeckwith-oai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The new generated optional call ID changes an existing public Java/Kotlin accessor return type, breaking both source compatibility and already-compiled JVM clients. Preserve the existing getter ABI with an additive optional accessor/migration strategy, or explicitly coordinate a breaking major release.

* @throws OpenAIInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
*/
fun callId(): Optional<String> = callId.getOptional("call_id")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[P1] Preserve the existing public callId() JVM signature

Changing callId(): String to callId(): Optional<String> breaks every existing Java caller such as String id = item.callId(). More importantly, already-compiled consumers invoke the old JVM descriptor callId()Ljava/lang/String;, which no longer exists after this change, causing NoSuchMethodError at runtime. The beta and input variants have the same regression. Optional wire data does not justify silently breaking the published accessor ABI in a normal coordinated SDK update; preserve the existing method and expose omission through an additive accessor/migration strategy, or explicitly coordinate a breaking major release.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

expected unfortunately; merging to unblock

@apcha-oai
apcha-oai merged commit 36e6e4c into main Aug 27, 2026
15 checks passed
@openai-sdks openai-sdks Bot mentioned this pull request Aug 27, 2026
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.

2 participants