diff --git a/api.md b/api.md
index c17edbb239..cf6ae87931 100644
--- a/api.md
+++ b/api.md
@@ -643,6 +643,56 @@ Methods:
- client.beta.responses.input_tokens.count(\*\*params) -> InputTokenCountResponse
+## ChatKit
+
+Types:
+
+```python
+from openai.types.beta import ChatKitWorkflow
+```
+
+### Sessions
+
+Methods:
+
+- client.beta.chatkit.sessions.create(\*\*params) -> ChatSession
+- client.beta.chatkit.sessions.cancel(session_id) -> ChatSession
+
+### Threads
+
+Types:
+
+```python
+from openai.types.beta.chatkit import (
+ ChatSession,
+ ChatSessionAutomaticThreadTitling,
+ ChatSessionChatKitConfiguration,
+ ChatSessionChatKitConfigurationParam,
+ ChatSessionExpiresAfterParam,
+ ChatSessionFileUpload,
+ ChatSessionHistory,
+ ChatSessionRateLimits,
+ ChatSessionRateLimitsParam,
+ ChatSessionStatus,
+ ChatSessionWorkflowParam,
+ ChatKitAttachment,
+ ChatKitResponseOutputText,
+ ChatKitThread,
+ ChatKitThreadAssistantMessageItem,
+ ChatKitThreadItemList,
+ ChatKitThreadUserMessageItem,
+ ChatKitWidgetItem,
+ ThreadDeleteResponse,
+)
+```
+
+Methods:
+
+- client.beta.chatkit.threads.retrieve(thread_id) -> ChatKitThread
+- client.beta.chatkit.threads.list(\*\*params) -> SyncConversationCursorPage[ChatKitThread]
+- client.beta.chatkit.threads.delete(thread_id) -> ThreadDeleteResponse
+- client.beta.chatkit.threads.list_items(thread_id, \*\*params) -> SyncConversationCursorPage[Data]
+
## Realtime
Types:
diff --git a/tests/api_resources/fine_tuning/jobs/test_checkpoints.py b/tests/api_resources/fine_tuning/jobs/test_checkpoints.py
index 64bfa9e731..da86179898 100644
--- a/tests/api_resources/fine_tuning/jobs/test_checkpoints.py
+++ b/tests/api_resources/fine_tuning/jobs/test_checkpoints.py
@@ -21,15 +21,15 @@ class TestCheckpoints:
@parametrize
def test_method_list(self, client: OpenAI) -> None:
checkpoint = client.fine_tuning.jobs.checkpoints.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
@parametrize
def test_method_list_with_all_params(self, client: OpenAI) -> None:
checkpoint = client.fine_tuning.jobs.checkpoints.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
- after="string",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="after",
limit=0,
)
assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
@@ -37,7 +37,7 @@ def test_method_list_with_all_params(self, client: OpenAI) -> None:
@parametrize
def test_raw_response_list(self, client: OpenAI) -> None:
response = client.fine_tuning.jobs.checkpoints.with_raw_response.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert response.is_closed is True
@@ -48,7 +48,7 @@ def test_raw_response_list(self, client: OpenAI) -> None:
@parametrize
def test_streaming_response_list(self, client: OpenAI) -> None:
with client.fine_tuning.jobs.checkpoints.with_streaming_response.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -62,7 +62,7 @@ def test_streaming_response_list(self, client: OpenAI) -> None:
def test_path_params_list(self, client: OpenAI) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
client.fine_tuning.jobs.checkpoints.with_raw_response.list(
- "",
+ fine_tuning_job_id="",
)
@@ -74,15 +74,15 @@ class TestAsyncCheckpoints:
@parametrize
async def test_method_list(self, async_client: AsyncOpenAI) -> None:
checkpoint = await async_client.fine_tuning.jobs.checkpoints.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
@parametrize
async def test_method_list_with_all_params(self, async_client: AsyncOpenAI) -> None:
checkpoint = await async_client.fine_tuning.jobs.checkpoints.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
- after="string",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="after",
limit=0,
)
assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
@@ -90,7 +90,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncOpenAI) -> N
@parametrize
async def test_raw_response_list(self, async_client: AsyncOpenAI) -> None:
response = await async_client.fine_tuning.jobs.checkpoints.with_raw_response.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert response.is_closed is True
@@ -101,7 +101,7 @@ async def test_raw_response_list(self, async_client: AsyncOpenAI) -> None:
@parametrize
async def test_streaming_response_list(self, async_client: AsyncOpenAI) -> None:
async with async_client.fine_tuning.jobs.checkpoints.with_streaming_response.list(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -115,5 +115,5 @@ async def test_streaming_response_list(self, async_client: AsyncOpenAI) -> None:
async def test_path_params_list(self, async_client: AsyncOpenAI) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
await async_client.fine_tuning.jobs.checkpoints.with_raw_response.list(
- "",
+ fine_tuning_job_id="",
)
diff --git a/tests/api_resources/fine_tuning/test_jobs.py b/tests/api_resources/fine_tuning/test_jobs.py
index 2168e3dc94..f95845f2a7 100644
--- a/tests/api_resources/fine_tuning/test_jobs.py
+++ b/tests/api_resources/fine_tuning/test_jobs.py
@@ -165,7 +165,7 @@ def test_method_list(self, client: OpenAI) -> None:
@parametrize
def test_method_list_with_all_params(self, client: OpenAI) -> None:
job = client.fine_tuning.jobs.list(
- after="string",
+ after="after",
limit=0,
metadata={"foo": "string"},
)
@@ -232,15 +232,15 @@ def test_path_params_cancel(self, client: OpenAI) -> None:
@parametrize
def test_method_list_events(self, client: OpenAI) -> None:
job = client.fine_tuning.jobs.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
@parametrize
def test_method_list_events_with_all_params(self, client: OpenAI) -> None:
job = client.fine_tuning.jobs.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
- after="string",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="after",
limit=0,
)
assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
@@ -248,7 +248,7 @@ def test_method_list_events_with_all_params(self, client: OpenAI) -> None:
@parametrize
def test_raw_response_list_events(self, client: OpenAI) -> None:
response = client.fine_tuning.jobs.with_raw_response.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert response.is_closed is True
@@ -259,7 +259,7 @@ def test_raw_response_list_events(self, client: OpenAI) -> None:
@parametrize
def test_streaming_response_list_events(self, client: OpenAI) -> None:
with client.fine_tuning.jobs.with_streaming_response.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -273,7 +273,7 @@ def test_streaming_response_list_events(self, client: OpenAI) -> None:
def test_path_params_list_events(self, client: OpenAI) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
client.fine_tuning.jobs.with_raw_response.list_events(
- "",
+ fine_tuning_job_id="",
)
@parametrize
@@ -502,7 +502,7 @@ async def test_method_list(self, async_client: AsyncOpenAI) -> None:
@parametrize
async def test_method_list_with_all_params(self, async_client: AsyncOpenAI) -> None:
job = await async_client.fine_tuning.jobs.list(
- after="string",
+ after="after",
limit=0,
metadata={"foo": "string"},
)
@@ -569,15 +569,15 @@ async def test_path_params_cancel(self, async_client: AsyncOpenAI) -> None:
@parametrize
async def test_method_list_events(self, async_client: AsyncOpenAI) -> None:
job = await async_client.fine_tuning.jobs.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
@parametrize
async def test_method_list_events_with_all_params(self, async_client: AsyncOpenAI) -> None:
job = await async_client.fine_tuning.jobs.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
- after="string",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="after",
limit=0,
)
assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
@@ -585,7 +585,7 @@ async def test_method_list_events_with_all_params(self, async_client: AsyncOpenA
@parametrize
async def test_raw_response_list_events(self, async_client: AsyncOpenAI) -> None:
response = await async_client.fine_tuning.jobs.with_raw_response.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
assert response.is_closed is True
@@ -596,7 +596,7 @@ async def test_raw_response_list_events(self, async_client: AsyncOpenAI) -> None
@parametrize
async def test_streaming_response_list_events(self, async_client: AsyncOpenAI) -> None:
async with async_client.fine_tuning.jobs.with_streaming_response.list_events(
- "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ fine_tuning_job_id="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -610,7 +610,7 @@ async def test_streaming_response_list_events(self, async_client: AsyncOpenAI) -
async def test_path_params_list_events(self, async_client: AsyncOpenAI) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
await async_client.fine_tuning.jobs.with_raw_response.list_events(
- "",
+ fine_tuning_job_id="",
)
@parametrize
diff --git a/tests/api_resources/vector_stores/test_file_batches.py b/tests/api_resources/vector_stores/test_file_batches.py
index 08def373f3..c0e9bcf57b 100644
--- a/tests/api_resources/vector_stores/test_file_batches.py
+++ b/tests/api_resources/vector_stores/test_file_batches.py
@@ -9,7 +9,6 @@
from openai import OpenAI, AsyncOpenAI
from tests.utils import assert_matches_type
-from openai._utils import assert_signatures_in_sync
from openai.pagination import SyncCursorPage, AsyncCursorPage
from openai.types.vector_stores import (
VectorStoreFile,
@@ -451,14 +450,3 @@ async def test_path_params_list_files(self, async_client: AsyncOpenAI) -> None:
batch_id="",
vector_store_id="vector_store_id",
)
-
-
-@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-def test_create_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
- checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
-
- # ensure helpers do not drift from generated spec
- assert_signatures_in_sync(
- checking_client.vector_stores.file_batches.create,
- checking_client.vector_stores.file_batches.create_and_poll,
- )
diff --git a/tests/api_resources/vector_stores/test_files.py b/tests/api_resources/vector_stores/test_files.py
index 94522ec5af..f6ea323bb1 100644
--- a/tests/api_resources/vector_stores/test_files.py
+++ b/tests/api_resources/vector_stores/test_files.py
@@ -9,7 +9,6 @@
from openai import OpenAI, AsyncOpenAI
from tests.utils import assert_matches_type
-from openai._utils import assert_signatures_in_sync
from openai.pagination import SyncPage, AsyncPage, SyncCursorPage, AsyncCursorPage
from openai.types.vector_stores import (
VectorStoreFile,
@@ -626,24 +625,3 @@ async def test_path_params_content(self, async_client: AsyncOpenAI) -> None:
file_id="",
vector_store_id="vs_abc123",
)
-
-
-@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-def test_create_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
- checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
-
- assert_signatures_in_sync(
- checking_client.vector_stores.files.create,
- checking_client.vector_stores.files.create_and_poll,
- )
-
-
-@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-def test_upload_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
- checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
-
- assert_signatures_in_sync(
- checking_client.vector_stores.files.create,
- checking_client.vector_stores.files.upload_and_poll,
- exclude_params={"file_id", "extra_headers", "extra_query", "extra_body", "timeout"},
- )
diff --git a/tests/lib/test_fine_tuning_positional_arguments.py b/tests/lib/test_fine_tuning_positional_arguments.py
new file mode 100644
index 0000000000..510ea2b674
--- /dev/null
+++ b/tests/lib/test_fine_tuning_positional_arguments.py
@@ -0,0 +1,219 @@
+from __future__ import annotations
+
+from typing import Any, cast
+
+import pytest
+
+from openai import OpenAI, AsyncOpenAI
+from tests.utils import assert_matches_type
+from openai.pagination import SyncCursorPage, AsyncCursorPage
+from openai.types.fine_tuning import FineTuningJobEvent
+from openai.types.fine_tuning.jobs import FineTuningJobCheckpoint
+
+
+class TestCheckpoints:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @parametrize
+ def test_method_list(self, client: OpenAI) -> None:
+ checkpoint = client.fine_tuning.jobs.checkpoints.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+ assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ def test_method_list_with_all_params(self, client: OpenAI) -> None:
+ checkpoint = client.fine_tuning.jobs.checkpoints.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="string",
+ limit=0,
+ )
+ assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ def test_raw_response_list(self, client: OpenAI) -> None:
+ response = client.fine_tuning.jobs.checkpoints.with_raw_response.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ checkpoint = response.parse()
+ assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ def test_streaming_response_list(self, client: OpenAI) -> None:
+ with client.fine_tuning.jobs.checkpoints.with_streaming_response.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ checkpoint = response.parse()
+ assert_matches_type(SyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ def test_path_params_list(self, client: OpenAI) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
+ client.fine_tuning.jobs.checkpoints.with_raw_response.list(
+ "",
+ )
+
+
+class TestAsyncCheckpoints:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @parametrize
+ async def test_method_list(self, async_client: AsyncOpenAI) -> None:
+ checkpoint = await async_client.fine_tuning.jobs.checkpoints.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+ assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ async def test_method_list_with_all_params(self, async_client: AsyncOpenAI) -> None:
+ checkpoint = await async_client.fine_tuning.jobs.checkpoints.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="string",
+ limit=0,
+ )
+ assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ async def test_raw_response_list(self, async_client: AsyncOpenAI) -> None:
+ response = await async_client.fine_tuning.jobs.checkpoints.with_raw_response.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ checkpoint = response.parse()
+ assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ @parametrize
+ async def test_streaming_response_list(self, async_client: AsyncOpenAI) -> None:
+ async with async_client.fine_tuning.jobs.checkpoints.with_streaming_response.list(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ checkpoint = await response.parse()
+ assert_matches_type(AsyncCursorPage[FineTuningJobCheckpoint], checkpoint, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ async def test_path_params_list(self, async_client: AsyncOpenAI) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
+ await async_client.fine_tuning.jobs.checkpoints.with_raw_response.list(
+ "",
+ )
+
+
+class TestJobs:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @parametrize
+ def test_method_list_events(self, client: OpenAI) -> None:
+ job = client.fine_tuning.jobs.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+ assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ def test_method_list_events_with_all_params(self, client: OpenAI) -> None:
+ job = client.fine_tuning.jobs.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="string",
+ limit=0,
+ )
+ assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ def test_raw_response_list_events(self, client: OpenAI) -> None:
+ response = client.fine_tuning.jobs.with_raw_response.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ job = response.parse()
+ assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ def test_streaming_response_list_events(self, client: OpenAI) -> None:
+ with client.fine_tuning.jobs.with_streaming_response.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ job = response.parse()
+ assert_matches_type(SyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ def test_path_params_list_events(self, client: OpenAI) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
+ client.fine_tuning.jobs.with_raw_response.list_events(
+ "",
+ )
+
+
+class TestAsyncJobs:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @parametrize
+ async def test_method_list_events(self, async_client: AsyncOpenAI) -> None:
+ job = await async_client.fine_tuning.jobs.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+ assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ async def test_method_list_events_with_all_params(self, async_client: AsyncOpenAI) -> None:
+ job = await async_client.fine_tuning.jobs.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ after="string",
+ limit=0,
+ )
+ assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ async def test_raw_response_list_events(self, async_client: AsyncOpenAI) -> None:
+ response = await async_client.fine_tuning.jobs.with_raw_response.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ job = response.parse()
+ assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ @parametrize
+ async def test_streaming_response_list_events(self, async_client: AsyncOpenAI) -> None:
+ async with async_client.fine_tuning.jobs.with_streaming_response.list_events(
+ "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ job = await response.parse()
+ assert_matches_type(AsyncCursorPage[FineTuningJobEvent], job, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ async def test_path_params_list_events(self, async_client: AsyncOpenAI) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `fine_tuning_job_id` but received ''"):
+ await async_client.fine_tuning.jobs.with_raw_response.list_events(
+ "",
+ )
diff --git a/tests/lib/test_vector_store_file_batches.py b/tests/lib/test_vector_store_file_batches.py
new file mode 100644
index 0000000000..5165e077d2
--- /dev/null
+++ b/tests/lib/test_vector_store_file_batches.py
@@ -0,0 +1,17 @@
+from __future__ import annotations
+
+import pytest
+
+from openai import OpenAI, AsyncOpenAI
+from openai._utils import assert_signatures_in_sync
+
+
+@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
+def test_create_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
+ checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
+
+ # ensure helpers do not drift from generated spec
+ assert_signatures_in_sync(
+ checking_client.vector_stores.file_batches.create,
+ checking_client.vector_stores.file_batches.create_and_poll,
+ )
diff --git a/tests/lib/test_vector_store_files.py b/tests/lib/test_vector_store_files.py
new file mode 100644
index 0000000000..9c4d87973e
--- /dev/null
+++ b/tests/lib/test_vector_store_files.py
@@ -0,0 +1,27 @@
+from __future__ import annotations
+
+import pytest
+
+from openai import OpenAI, AsyncOpenAI
+from openai._utils import assert_signatures_in_sync
+
+
+@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
+def test_create_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
+ checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
+
+ assert_signatures_in_sync(
+ checking_client.vector_stores.files.create,
+ checking_client.vector_stores.files.create_and_poll,
+ )
+
+
+@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
+def test_upload_and_poll_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
+ checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
+
+ assert_signatures_in_sync(
+ checking_client.vector_stores.files.create,
+ checking_client.vector_stores.files.upload_and_poll,
+ exclude_params={"file_id", "extra_headers", "extra_query", "extra_body", "timeout"},
+ )