Skip to content

Commit 4dcfdab

Browse files
authored
Merge branch 'main' into chore/client-comment-fix
2 parents e5ef3d3 + f588695 commit 4dcfdab

File tree

151 files changed

+5910
-604
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

151 files changed

+5910
-604
lines changed

.github/workflows/ci.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,30 @@ jobs:
3030
- name: Run lints
3131
run: ./scripts/lint
3232

33+
upload:
34+
if: github.repository == 'stainless-sdks/openai-python'
35+
timeout-minutes: 10
36+
name: upload
37+
permissions:
38+
contents: read
39+
id-token: write
40+
runs-on: depot-ubuntu-24.04
41+
steps:
42+
- uses: actions/checkout@v4
43+
44+
- name: Get GitHub OIDC Token
45+
id: github-oidc
46+
uses: actions/github-script@v6
47+
with:
48+
script: core.setOutput('github_token', await core.getIDToken());
49+
50+
- name: Upload tarball
51+
env:
52+
URL: https://pkg.stainless.com/s
53+
AUTH: ${{ steps.github-oidc.outputs.github_token }}
54+
SHA: ${{ github.sha }}
55+
run: ./scripts/utils/upload-artifact.sh
56+
3357
test:
3458
timeout-minutes: 10
3559
name: test

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "1.78.1"
2+
".": "1.82.0"
33
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 101
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-794a6ed3c3d3d77887564755168056af8a426b17cf1ec721e3a300503dc22a41.yml
3-
openapi_spec_hash: 25a81c220713cd5b0bafc221d1dfa79a
4-
config_hash: 0b768ed1b56c6d82816f0fa40dc4aaf5
1+
configured_endpoints: 111
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-fc64d7c2c8f51f750813375356c3f3fdfc7fc1b1b34f19c20a5410279d445d37.yml
3+
openapi_spec_hash: 618285fc70199ee32b9ebe4bf72f7e4c
4+
config_hash: c497f6b750cc89c0bf2eefc0bc839c70

CHANGELOG.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,67 @@
11
# Changelog
22

3+
## 1.82.0 (2025-05-22)
4+
5+
Full Changelog: [v1.81.0...v1.82.0](https://github.com/openai/openai-python/compare/v1.81.0...v1.82.0)
6+
7+
### Features
8+
9+
* **api:** new streaming helpers for background responses ([2a65d4d](https://github.com/openai/openai-python/commit/2a65d4de0aaba7801edd0df10f225530fd4969bd))
10+
11+
12+
### Bug Fixes
13+
14+
* **azure:** mark images/edits as a deployment endpoint [#2371](https://github.com/openai/openai-python/issues/2371) ([5d1d5b4](https://github.com/openai/openai-python/commit/5d1d5b4b6072afe9fd7909b1a36014c8c11c1ad6))
15+
16+
17+
### Documentation
18+
19+
* **readme:** another async example fix ([9ec8289](https://github.com/openai/openai-python/commit/9ec8289041f395805c67efd97847480f84eb9dac))
20+
* **readme:** fix async example ([37d0b25](https://github.com/openai/openai-python/commit/37d0b25b6e82cd381e5d1aa6e28f1a1311d02353))
21+
22+
## 1.81.0 (2025-05-21)
23+
24+
Full Changelog: [v1.80.0...v1.81.0](https://github.com/openai/openai-python/compare/v1.80.0...v1.81.0)
25+
26+
### Features
27+
28+
* **api:** add container endpoint ([054a210](https://github.com/openai/openai-python/commit/054a210289d7e0db22d2d2a61bbe4d4d9cc0cb47))
29+
30+
## 1.80.0 (2025-05-21)
31+
32+
Full Changelog: [v1.79.0...v1.80.0](https://github.com/openai/openai-python/compare/v1.79.0...v1.80.0)
33+
34+
### Features
35+
36+
* **api:** new API tools ([d36ae52](https://github.com/openai/openai-python/commit/d36ae528d55fe87067c4b8c6b2c947cbad5e5002))
37+
38+
39+
### Chores
40+
41+
* **docs:** grammar improvements ([e746145](https://github.com/openai/openai-python/commit/e746145a12b5335d8841aff95c91bbbde8bae8e3))
42+
43+
## 1.79.0 (2025-05-16)
44+
45+
Full Changelog: [v1.78.1...v1.79.0](https://github.com/openai/openai-python/compare/v1.78.1...v1.79.0)
46+
47+
### Features
48+
49+
* **api:** further updates for evals API ([32c99a6](https://github.com/openai/openai-python/commit/32c99a6f5885d4bf3511a7f06b70000edd274301))
50+
* **api:** manual updates ([25245e5](https://github.com/openai/openai-python/commit/25245e5e3d0713abfb65b760aee1f12bc61deb41))
51+
* **api:** responses x eval api ([fd586cb](https://github.com/openai/openai-python/commit/fd586cbdf889c9a5c6b9be177ff02fbfffa3eba5))
52+
* **api:** Updating Assistants and Evals API schemas ([98ba7d3](https://github.com/openai/openai-python/commit/98ba7d355551213a13803f68d5642eecbb4ffd39))
53+
54+
55+
### Bug Fixes
56+
57+
* fix create audio transcription endpoint ([e9a89ab](https://github.com/openai/openai-python/commit/e9a89ab7b6387610e433550207a23973b7edda3a))
58+
59+
60+
### Chores
61+
62+
* **ci:** fix installation instructions ([f26c5fc](https://github.com/openai/openai-python/commit/f26c5fc85d98d700b68cb55c8be5d15983a9aeaf))
63+
* **ci:** upload sdks to package manager ([861f105](https://github.com/openai/openai-python/commit/861f1055768168ab04987a42efcd32a07bc93542))
64+
365
## 1.78.1 (2025-05-12)
466

567
Full Changelog: [v1.78.0...v1.78.1](https://github.com/openai/openai-python/compare/v1.78.0...v1.78.1)

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,13 @@ client = AsyncOpenAI()
174174

175175

176176
async def main():
177-
stream = client.responses.create(
177+
stream = await client.responses.create(
178178
model="gpt-4o",
179179
input="Write a one-sentence bedtime story about a unicorn.",
180180
stream=True,
181181
)
182182

183-
for event in stream:
183+
async for event in stream:
184184
print(event)
185185

186186

SECURITY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ before making any information public.
1616
## Reporting Non-SDK Related Security Issues
1717

1818
If you encounter security issues that are not directly related to SDKs but pertain to the services
19-
or products provided by OpenAI please follow the respective company's security reporting guidelines.
19+
or products provided by OpenAI, please follow the respective company's security reporting guidelines.
2020

2121
### OpenAI Terms and Policies
2222

2323
Our Security Policy can be found at [Security Policy URL](https://openai.com/policies/coordinated-vulnerability-disclosure-policy).
2424

25-
Please contact [email protected] for any questions or concerns regarding security of our services.
25+
Please contact [email protected] for any questions or concerns regarding the security of our services.
2626

2727
---
2828

api.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,10 @@ from openai.types.responses import (
717717
ResponseFunctionToolCallItem,
718718
ResponseFunctionToolCallOutputItem,
719719
ResponseFunctionWebSearch,
720+
ResponseImageGenCallCompletedEvent,
721+
ResponseImageGenCallGeneratingEvent,
722+
ResponseImageGenCallInProgressEvent,
723+
ResponseImageGenCallPartialImageEvent,
720724
ResponseInProgressEvent,
721725
ResponseIncludable,
722726
ResponseIncompleteEvent,
@@ -730,14 +734,28 @@ from openai.types.responses import (
730734
ResponseInputMessageItem,
731735
ResponseInputText,
732736
ResponseItem,
737+
ResponseMcpCallArgumentsDeltaEvent,
738+
ResponseMcpCallArgumentsDoneEvent,
739+
ResponseMcpCallCompletedEvent,
740+
ResponseMcpCallFailedEvent,
741+
ResponseMcpCallInProgressEvent,
742+
ResponseMcpListToolsCompletedEvent,
743+
ResponseMcpListToolsFailedEvent,
744+
ResponseMcpListToolsInProgressEvent,
733745
ResponseOutputAudio,
734746
ResponseOutputItem,
735747
ResponseOutputItemAddedEvent,
736748
ResponseOutputItemDoneEvent,
737749
ResponseOutputMessage,
738750
ResponseOutputRefusal,
739751
ResponseOutputText,
752+
ResponseOutputTextAnnotationAddedEvent,
753+
ResponseQueuedEvent,
754+
ResponseReasoningDeltaEvent,
755+
ResponseReasoningDoneEvent,
740756
ResponseReasoningItem,
757+
ResponseReasoningSummaryDeltaEvent,
758+
ResponseReasoningSummaryDoneEvent,
741759
ResponseReasoningSummaryPartAddedEvent,
742760
ResponseReasoningSummaryPartDoneEvent,
743761
ResponseReasoningSummaryTextDeltaEvent,
@@ -746,7 +764,6 @@ from openai.types.responses import (
746764
ResponseRefusalDoneEvent,
747765
ResponseStatus,
748766
ResponseStreamEvent,
749-
ResponseTextAnnotationDeltaEvent,
750767
ResponseTextConfig,
751768
ResponseTextDeltaEvent,
752769
ResponseTextDoneEvent,
@@ -767,6 +784,7 @@ Methods:
767784
- <code title="post /responses">client.responses.<a href="./src/openai/resources/responses/responses.py">create</a>(\*\*<a href="src/openai/types/responses/response_create_params.py">params</a>) -> <a href="./src/openai/types/responses/response.py">Response</a></code>
768785
- <code title="get /responses/{response_id}">client.responses.<a href="./src/openai/resources/responses/responses.py">retrieve</a>(response_id, \*\*<a href="src/openai/types/responses/response_retrieve_params.py">params</a>) -> <a href="./src/openai/types/responses/response.py">Response</a></code>
769786
- <code title="delete /responses/{response_id}">client.responses.<a href="./src/openai/resources/responses/responses.py">delete</a>(response_id) -> None</code>
787+
- <code title="post /responses/{response_id}/cancel">client.responses.<a href="./src/openai/resources/responses/responses.py">cancel</a>(response_id) -> None</code>
770788

771789
## InputItems
772790

@@ -841,3 +859,39 @@ Methods:
841859

842860
- <code title="get /evals/{eval_id}/runs/{run_id}/output_items/{output_item_id}">client.evals.runs.output_items.<a href="./src/openai/resources/evals/runs/output_items.py">retrieve</a>(output_item_id, \*, eval_id, run_id) -> <a href="./src/openai/types/evals/runs/output_item_retrieve_response.py">OutputItemRetrieveResponse</a></code>
843861
- <code title="get /evals/{eval_id}/runs/{run_id}/output_items">client.evals.runs.output_items.<a href="./src/openai/resources/evals/runs/output_items.py">list</a>(run_id, \*, eval_id, \*\*<a href="src/openai/types/evals/runs/output_item_list_params.py">params</a>) -> <a href="./src/openai/types/evals/runs/output_item_list_response.py">SyncCursorPage[OutputItemListResponse]</a></code>
862+
863+
# Containers
864+
865+
Types:
866+
867+
```python
868+
from openai.types import ContainerCreateResponse, ContainerRetrieveResponse, ContainerListResponse
869+
```
870+
871+
Methods:
872+
873+
- <code title="post /containers">client.containers.<a href="./src/openai/resources/containers/containers.py">create</a>(\*\*<a href="src/openai/types/container_create_params.py">params</a>) -> <a href="./src/openai/types/container_create_response.py">ContainerCreateResponse</a></code>
874+
- <code title="get /containers/{container_id}">client.containers.<a href="./src/openai/resources/containers/containers.py">retrieve</a>(container_id) -> <a href="./src/openai/types/container_retrieve_response.py">ContainerRetrieveResponse</a></code>
875+
- <code title="get /containers">client.containers.<a href="./src/openai/resources/containers/containers.py">list</a>(\*\*<a href="src/openai/types/container_list_params.py">params</a>) -> <a href="./src/openai/types/container_list_response.py">SyncCursorPage[ContainerListResponse]</a></code>
876+
- <code title="delete /containers/{container_id}">client.containers.<a href="./src/openai/resources/containers/containers.py">delete</a>(container_id) -> None</code>
877+
878+
## Files
879+
880+
Types:
881+
882+
```python
883+
from openai.types.containers import FileCreateResponse, FileRetrieveResponse, FileListResponse
884+
```
885+
886+
Methods:
887+
888+
- <code title="post /containers/{container_id}/files">client.containers.files.<a href="./src/openai/resources/containers/files/files.py">create</a>(container_id, \*\*<a href="src/openai/types/containers/file_create_params.py">params</a>) -> <a href="./src/openai/types/containers/file_create_response.py">FileCreateResponse</a></code>
889+
- <code title="get /containers/{container_id}/files/{file_id}">client.containers.files.<a href="./src/openai/resources/containers/files/files.py">retrieve</a>(file_id, \*, container_id) -> <a href="./src/openai/types/containers/file_retrieve_response.py">FileRetrieveResponse</a></code>
890+
- <code title="get /containers/{container_id}/files">client.containers.files.<a href="./src/openai/resources/containers/files/files.py">list</a>(container_id, \*\*<a href="src/openai/types/containers/file_list_params.py">params</a>) -> <a href="./src/openai/types/containers/file_list_response.py">SyncCursorPage[FileListResponse]</a></code>
891+
- <code title="delete /containers/{container_id}/files/{file_id}">client.containers.files.<a href="./src/openai/resources/containers/files/files.py">delete</a>(file_id, \*, container_id) -> None</code>
892+
893+
### Content
894+
895+
Methods:
896+
897+
- <code title="get /containers/{container_id}/files/{file_id}/content">client.containers.files.content.<a href="./src/openai/resources/containers/files/content.py">retrieve</a>(file_id, \*, container_id) -> None</code>

examples/responses/background.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import List
2+
3+
import rich
4+
from pydantic import BaseModel
5+
6+
from openai import OpenAI
7+
8+
9+
class Step(BaseModel):
10+
explanation: str
11+
output: str
12+
13+
14+
class MathResponse(BaseModel):
15+
steps: List[Step]
16+
final_answer: str
17+
18+
19+
client = OpenAI()
20+
id = None
21+
22+
with client.responses.create(
23+
input="solve 8x + 31 = 2",
24+
model="gpt-4o-2024-08-06",
25+
background=True,
26+
stream=True,
27+
) as stream:
28+
for event in stream:
29+
if event.type == "response.created":
30+
id = event.response.id
31+
if "output_text" in event.type:
32+
rich.print(event)
33+
if event.sequence_number == 10:
34+
break
35+
36+
print("Interrupted. Continuing...")
37+
38+
assert id is not None
39+
with client.responses.retrieve(
40+
response_id=id,
41+
stream=True,
42+
starting_after=10,
43+
) as stream:
44+
for event in stream:
45+
if "output_text" in event.type:
46+
rich.print(event)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import asyncio
2+
from typing import List
3+
4+
import rich
5+
from pydantic import BaseModel
6+
7+
from openai._client import AsyncOpenAI
8+
9+
10+
class Step(BaseModel):
11+
explanation: str
12+
output: str
13+
14+
15+
class MathResponse(BaseModel):
16+
steps: List[Step]
17+
final_answer: str
18+
19+
20+
async def main() -> None:
21+
client = AsyncOpenAI()
22+
id = None
23+
24+
async with await client.responses.create(
25+
input="solve 8x + 31 = 2",
26+
model="gpt-4o-2024-08-06",
27+
background=True,
28+
stream=True,
29+
) as stream:
30+
async for event in stream:
31+
if event.type == "response.created":
32+
id = event.response.id
33+
if "output_text" in event.type:
34+
rich.print(event)
35+
if event.sequence_number == 10:
36+
break
37+
38+
print("Interrupted. Continuing...")
39+
40+
assert id is not None
41+
async with await client.responses.retrieve(
42+
response_id=id,
43+
stream=True,
44+
starting_after=10,
45+
) as stream:
46+
async for event in stream:
47+
if "output_text" in event.type:
48+
rich.print(event)
49+
50+
51+
if __name__ == "__main__":
52+
asyncio.run(main())
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env -S rye run python
2+
from typing import List
3+
4+
import rich
5+
from pydantic import BaseModel
6+
7+
from openai import OpenAI
8+
9+
10+
class Step(BaseModel):
11+
explanation: str
12+
output: str
13+
14+
15+
class MathResponse(BaseModel):
16+
steps: List[Step]
17+
final_answer: str
18+
19+
20+
client = OpenAI()
21+
id = None
22+
with client.responses.stream(
23+
input="solve 8x + 31 = 2",
24+
model="gpt-4o-2024-08-06",
25+
text_format=MathResponse,
26+
background=True,
27+
) as stream:
28+
for event in stream:
29+
if event.type == "response.created":
30+
id = event.response.id
31+
if "output_text" in event.type:
32+
rich.print(event)
33+
if event.sequence_number == 10:
34+
break
35+
36+
print("Interrupted. Continuing...")
37+
38+
assert id is not None
39+
with client.responses.stream(
40+
response_id=id,
41+
starting_after=10,
42+
text_format=MathResponse,
43+
) as stream:
44+
for event in stream:
45+
if "output_text" in event.type:
46+
rich.print(event)
47+
48+
rich.print(stream.get_final_response())

0 commit comments

Comments
 (0)