diff --git a/examples/demo.py b/examples/demo.py index 37830e3e97..ac1710f3e0 100755 --- a/examples/demo.py +++ b/examples/demo.py @@ -36,3 +36,18 @@ print(chunk.choices[0].delta.content, end="") print() + +# Response headers: +print("----- custom response headers test -----") +response = client.chat.completions.with_raw_response.create( + model="gpt-4", + messages=[ + { + "role": "user", + "content": "Say this is a test", + } + ], +) +completion = response.parse() +print(response.request_id) +print(completion.choices[0].message.content) diff --git a/helpers.md b/helpers.md index cf738f3f16..3508b59a33 100644 --- a/helpers.md +++ b/helpers.md @@ -33,11 +33,13 @@ class EventHandler(AssistantEventHandler): def on_text_delta(self, delta: TextDelta, snapshot: Text): print(delta.value, end="", flush=True) + @override def on_tool_call_created(self, tool_call: ToolCall): print(f"\nassistant > {tool_call.type}\n", flush=True) + @override def on_tool_call_delta(self, delta: ToolCallDelta, snapshot: ToolCall): - if delta.type == 'code_interpreter': + if delta.type == "code_interpreter" and delta.code_interpreter: if delta.code_interpreter.input: print(delta.code_interpreter.input, end="", flush=True) if delta.code_interpreter.outputs: @@ -69,7 +71,7 @@ with client.beta.threads.runs.stream( ) as stream: for event in stream: # Print the text from text delta events - if event.type == "thread.message.delta" and event.data.delta.content: + if event.event == "thread.message.delta" and event.data.delta.content: print(event.data.delta.content[0].text) ``` diff --git a/src/openai/_legacy_response.py b/src/openai/_legacy_response.py index 4585cd7423..1de906b167 100644 --- a/src/openai/_legacy_response.py +++ b/src/openai/_legacy_response.py @@ -71,6 +71,10 @@ def __init__( self._options = options self.http_response = raw + @property + def request_id(self) -> str | None: + return self.http_response.headers.get("x-request-id") # type: ignore[no-any-return] + @overload def parse(self, *, to: type[_T]) -> _T: ... diff --git a/src/openai/_response.py b/src/openai/_response.py index 47f484ef7a..4ba2ae681c 100644 --- a/src/openai/_response.py +++ b/src/openai/_response.py @@ -258,6 +258,10 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: class APIResponse(BaseAPIResponse[R]): + @property + def request_id(self) -> str | None: + return self.http_response.headers.get("x-request-id") # type: ignore[no-any-return] + @overload def parse(self, *, to: type[_T]) -> _T: ... @@ -362,6 +366,10 @@ def iter_lines(self) -> Iterator[str]: class AsyncAPIResponse(BaseAPIResponse[R]): + @property + def request_id(self) -> str | None: + return self.http_response.headers.get("x-request-id") # type: ignore[no-any-return] + @overload async def parse(self, *, to: type[_T]) -> _T: ... diff --git a/src/openai/types/beta/thread_create_and_run_params.py b/src/openai/types/beta/thread_create_and_run_params.py index 0c102db705..036d8a78da 100644 --- a/src/openai/types/beta/thread_create_and_run_params.py +++ b/src/openai/types/beta/thread_create_and_run_params.py @@ -171,11 +171,11 @@ class ThreadCreateAndRunParamsBase(TypedDict, total=False): class ThreadMessageAttachment(TypedDict, total=False): - add_to: List[Literal["file_search", "code_interpreter"]] - file_id: str """The ID of the file to attach to the message.""" + tools: List[Literal["file_search", "code_interpreter"]] + class ThreadMessage(TypedDict, total=False): content: Required[str] diff --git a/src/openai/types/beta/thread_create_params.py b/src/openai/types/beta/thread_create_params.py index 84a98a74d7..ac85e3c9e1 100644 --- a/src/openai/types/beta/thread_create_params.py +++ b/src/openai/types/beta/thread_create_params.py @@ -41,11 +41,11 @@ class ThreadCreateParams(TypedDict, total=False): class MessageAttachment(TypedDict, total=False): - add_to: List[Literal["file_search", "code_interpreter"]] - file_id: str """The ID of the file to attach to the message.""" + tools: List[Literal["file_search", "code_interpreter"]] + class Message(TypedDict, total=False): content: Required[str] diff --git a/src/openai/types/beta/threads/message.py b/src/openai/types/beta/threads/message.py index 42f0162734..ffc64545db 100644 --- a/src/openai/types/beta/threads/message.py +++ b/src/openai/types/beta/threads/message.py @@ -10,11 +10,11 @@ class Attachment(BaseModel): - add_to: Optional[List[Literal["file_search", "code_interpreter"]]] = None - file_id: Optional[str] = None """The ID of the file to attach to the message.""" + tools: Optional[List[Literal["file_search", "code_interpreter"]]] = None + class IncompleteDetails(BaseModel): reason: Literal["content_filter", "max_tokens", "run_cancelled", "run_expired", "run_failed"] diff --git a/src/openai/types/beta/threads/message_create_params.py b/src/openai/types/beta/threads/message_create_params.py index 1ef1d9ae10..4d47de84f1 100644 --- a/src/openai/types/beta/threads/message_create_params.py +++ b/src/openai/types/beta/threads/message_create_params.py @@ -34,7 +34,7 @@ class MessageCreateParams(TypedDict, total=False): class Attachment(TypedDict, total=False): - add_to: List[Literal["file_search", "code_interpreter"]] - file_id: str """The ID of the file to attach to the message.""" + + tools: List[Literal["file_search", "code_interpreter"]] diff --git a/src/openai/types/beta/threads/run_create_params.py b/src/openai/types/beta/threads/run_create_params.py index c1bb8ba62a..0d62b7949f 100644 --- a/src/openai/types/beta/threads/run_create_params.py +++ b/src/openai/types/beta/threads/run_create_params.py @@ -160,11 +160,11 @@ class RunCreateParamsBase(TypedDict, total=False): class AdditionalMessageAttachment(TypedDict, total=False): - add_to: List[Literal["file_search", "code_interpreter"]] - file_id: str """The ID of the file to attach to the message.""" + tools: List[Literal["file_search", "code_interpreter"]] + class AdditionalMessage(TypedDict, total=False): content: Required[str] diff --git a/tests/api_resources/beta/test_threads.py b/tests/api_resources/beta/test_threads.py index 980fd9a75e..9b3de393f0 100644 --- a/tests/api_resources/beta/test_threads.py +++ b/tests/api_resources/beta/test_threads.py @@ -36,15 +36,15 @@ def test_method_create_with_all_params(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -55,15 +55,15 @@ def test_method_create_with_all_params(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -74,15 +74,15 @@ def test_method_create_with_all_params(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -277,15 +277,15 @@ def test_method_create_and_run_with_all_params_overload_1(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -296,15 +296,15 @@ def test_method_create_and_run_with_all_params_overload_1(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -315,15 +315,15 @@ def test_method_create_and_run_with_all_params_overload_1(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -409,15 +409,15 @@ def test_method_create_and_run_with_all_params_overload_2(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -428,15 +428,15 @@ def test_method_create_and_run_with_all_params_overload_2(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -447,15 +447,15 @@ def test_method_create_and_run_with_all_params_overload_2(self, client: OpenAI) "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -533,15 +533,15 @@ async def test_method_create_with_all_params(self, async_client: AsyncOpenAI) -> "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -552,15 +552,15 @@ async def test_method_create_with_all_params(self, async_client: AsyncOpenAI) -> "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -571,15 +571,15 @@ async def test_method_create_with_all_params(self, async_client: AsyncOpenAI) -> "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -774,15 +774,15 @@ async def test_method_create_and_run_with_all_params_overload_1(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -793,15 +793,15 @@ async def test_method_create_and_run_with_all_params_overload_1(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -812,15 +812,15 @@ async def test_method_create_and_run_with_all_params_overload_1(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -906,15 +906,15 @@ async def test_method_create_and_run_with_all_params_overload_2(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -925,15 +925,15 @@ async def test_method_create_and_run_with_all_params_overload_2(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -944,15 +944,15 @@ async def test_method_create_and_run_with_all_params_overload_2(self, async_clie "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, diff --git a/tests/api_resources/beta/threads/test_messages.py b/tests/api_resources/beta/threads/test_messages.py index 5ea5ac3bd5..c6492464da 100644 --- a/tests/api_resources/beta/threads/test_messages.py +++ b/tests/api_resources/beta/threads/test_messages.py @@ -36,15 +36,15 @@ def test_method_create_with_all_params(self, client: OpenAI) -> None: attachments=[ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], metadata={}, @@ -265,15 +265,15 @@ async def test_method_create_with_all_params(self, async_client: AsyncOpenAI) -> attachments=[ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], metadata={}, diff --git a/tests/api_resources/beta/threads/test_runs.py b/tests/api_resources/beta/threads/test_runs.py index 3d8a6ce058..43065133d6 100644 --- a/tests/api_resources/beta/threads/test_runs.py +++ b/tests/api_resources/beta/threads/test_runs.py @@ -43,15 +43,15 @@ def test_method_create_with_all_params_overload_1(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -62,15 +62,15 @@ def test_method_create_with_all_params_overload_1(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -81,15 +81,15 @@ def test_method_create_with_all_params_overload_1(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -170,15 +170,15 @@ def test_method_create_with_all_params_overload_2(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -189,15 +189,15 @@ def test_method_create_with_all_params_overload_2(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -208,15 +208,15 @@ def test_method_create_with_all_params_overload_2(self, client: OpenAI) -> None: "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -635,15 +635,15 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -654,15 +654,15 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -673,15 +673,15 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -762,15 +762,15 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -781,15 +781,15 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {}, @@ -800,15 +800,15 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "attachments": [ { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, { "file_id": "string", - "add_to": ["file_search", "code_interpreter"], + "tools": ["file_search", "code_interpreter"], }, ], "metadata": {},