openai/openai-python

Public

mirrored from https://github.com/openai/openai-pythonAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.107.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

tests/lib/chat/test_completions.py

995lines · modeblame

bf1ca86cRobert Craigie1 years ago1from __future__ import annotations
2
ad5ac9fcRobert Craigie1 years ago3from enum import Enum
266edebaRobert Craigie11 months ago4from typing import List, Optional
bf1ca86cRobert Craigie1 years ago5from typing_extensions import Literal, TypeVar
6
7import pytest
8from respx import MockRouter
ad5ac9fcRobert Craigie1 years ago9from pydantic import Field, BaseModel
bf1ca86cRobert Craigie1 years ago10from inline_snapshot import snapshot
11
12import openai
13from openai import OpenAI, AsyncOpenAI
14from openai._utils import assert_signatures_in_sync
2cf4ed50stainless-app[bot]10 months ago15from openai._compat import PYDANTIC_V1
bf1ca86cRobert Craigie1 years ago16
266edebaRobert Craigie11 months ago17from ..utils import print_obj
bf1ca86cRobert Craigie1 years ago18from ...conftest import base_url
266edebaRobert Craigie11 months ago19from ..snapshots import make_snapshot_request, make_async_snapshot_request
bf1ca86cRobert Craigie1 years ago20from ..schema_types.query import Query
21
22_T = TypeVar("_T")
23
24# all the snapshots in this file are auto-generated from the live API
25#
26# you can update them with
27#
753d472eRobert Craigie11 months ago28# `OPENAI_LIVE=1 pytest --inline-snapshot=fix -p no:xdist -o addopts=""`
bf1ca86cRobert Craigie1 years ago29
30
31@pytest.mark.respx(base_url=base_url)
32def test_parse_nothing(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
266edebaRobert Craigie11 months ago33completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago34lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago35model="gpt-4o-2024-08-06",
36messages=[
37{
38"role": "user",
39"content": "What's the weather like in SF?",
40},
41],
42),
43content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago44'{"id": "chatcmpl-ABfvaueLEMLNYbT8YzpJxsmiQ6HSY", "object": "chat.completion", "created": 1727346142, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "I\'m unable to provide real-time weather updates. To get the current weather in San Francisco, I recommend checking a reliable weather website or app like the Weather Channel or a local news station.", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 14, "completion_tokens": 37, "total_tokens": 51, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_b40fb1c6fb"}'
bf1ca86cRobert Craigie1 years ago45),
a4cd0b50Robert Craigie11 months ago46path="/chat/completions",
bf1ca86cRobert Craigie1 years ago47mock_client=client,
48respx_mock=respx_mock,
49)
50
51assert print_obj(completion, monkeypatch) == snapshot(
52"""\
53ParsedChatCompletion[NoneType](
54choices=[
55ParsedChoice[NoneType](
56finish_reason='stop',
57index=0,
58logprobs=None,
59message=ParsedChatCompletionMessage[NoneType](
2954945eRobert Craigie1 years ago60annotations=None,
550b855fstainless-app[bot]1 years ago61audio=None,
9feadd82Robert Craigie1 years ago62content="I'm unable to provide real-time weather updates. To get the current weather in San Francisco, I
63recommend checking a reliable weather website or app like the Weather Channel or a local news station.",
bf1ca86cRobert Craigie1 years ago64function_call=None,
65parsed=None,
66refusal=None,
67role='assistant',
b45168e2Robert Craigie1 years ago68tool_calls=None
bf1ca86cRobert Craigie1 years ago69)
70)
71],
9feadd82Robert Craigie1 years ago72created=1727346142,
73id='chatcmpl-ABfvaueLEMLNYbT8YzpJxsmiQ6HSY',
bf1ca86cRobert Craigie1 years ago74model='gpt-4o-2024-08-06',
75object='chat.completion',
76service_tier=None,
9feadd82Robert Craigie1 years ago77system_fingerprint='fp_b40fb1c6fb',
78usage=CompletionUsage(
79completion_tokens=37,
4ae58a7bRobert Craigie1 years ago80completion_tokens_details=CompletionTokensDetails(
81accepted_prediction_tokens=None,
82audio_tokens=None,
83reasoning_tokens=0,
84rejected_prediction_tokens=None
85),
9feadd82Robert Craigie1 years ago86prompt_tokens=14,
7c8c1115Robert Craigie1 years ago87prompt_tokens_details=None,
9feadd82Robert Craigie1 years ago88total_tokens=51
89)
bf1ca86cRobert Craigie1 years ago90)
91"""
92)
93
94
95@pytest.mark.respx(base_url=base_url)
96def test_parse_pydantic_model(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
97class Location(BaseModel):
98city: str
99temperature: float
100units: Literal["c", "f"]
101
266edebaRobert Craigie11 months ago102completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago103lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago104model="gpt-4o-2024-08-06",
105messages=[
106{
107"role": "user",
108"content": "What's the weather like in SF?",
109},
110],
111response_format=Location,
112),
113content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago114'{"id": "chatcmpl-ABfvbtVnTu5DeC4EFnRYj8mtfOM99", "object": "chat.completion", "created": 1727346143, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":65,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 79, "completion_tokens": 14, "total_tokens": 93, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
bf1ca86cRobert Craigie1 years ago115),
a4cd0b50Robert Craigie11 months ago116path="/chat/completions",
bf1ca86cRobert Craigie1 years ago117mock_client=client,
118respx_mock=respx_mock,
119)
120
121assert print_obj(completion, monkeypatch) == snapshot(
122"""\
123ParsedChatCompletion[Location](
124choices=[
125ParsedChoice[Location](
126finish_reason='stop',
127index=0,
128logprobs=None,
129message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago130annotations=None,
550b855fstainless-app[bot]1 years ago131audio=None,
9feadd82Robert Craigie1 years ago132content='{"city":"San Francisco","temperature":65,"units":"f"}',
bf1ca86cRobert Craigie1 years ago133function_call=None,
9feadd82Robert Craigie1 years ago134parsed=Location(city='San Francisco', temperature=65.0, units='f'),
bf1ca86cRobert Craigie1 years ago135refusal=None,
136role='assistant',
b45168e2Robert Craigie1 years ago137tool_calls=None
bf1ca86cRobert Craigie1 years ago138)
139)
140],
9feadd82Robert Craigie1 years ago141created=1727346143,
142id='chatcmpl-ABfvbtVnTu5DeC4EFnRYj8mtfOM99',
bf1ca86cRobert Craigie1 years ago143model='gpt-4o-2024-08-06',
144object='chat.completion',
145service_tier=None,
9feadd82Robert Craigie1 years ago146system_fingerprint='fp_5050236cbd',
147usage=CompletionUsage(
148completion_tokens=14,
4ae58a7bRobert Craigie1 years ago149completion_tokens_details=CompletionTokensDetails(
150accepted_prediction_tokens=None,
151audio_tokens=None,
152reasoning_tokens=0,
153rejected_prediction_tokens=None
154),
9feadd82Robert Craigie1 years ago155prompt_tokens=79,
7c8c1115Robert Craigie1 years ago156prompt_tokens_details=None,
9feadd82Robert Craigie1 years ago157total_tokens=93
158)
bf1ca86cRobert Craigie1 years ago159)
160"""
161)
162
163
54156ad1Robert Craigie1 years ago164@pytest.mark.respx(base_url=base_url)
165def test_parse_pydantic_model_optional_default(
166client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch
167) -> None:
168class Location(BaseModel):
169city: str
170temperature: float
171units: Optional[Literal["c", "f"]] = None
172
266edebaRobert Craigie11 months ago173completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago174lambda c: c.chat.completions.parse(
54156ad1Robert Craigie1 years ago175model="gpt-4o-2024-08-06",
176messages=[
177{
178"role": "user",
179"content": "What's the weather like in SF?",
180},
181],
182response_format=Location,
183),
184content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago185'{"id": "chatcmpl-ABfvcC8grKYsRkSoMp9CCAhbXAd0b", "object": "chat.completion", "created": 1727346144, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":65,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 88, "completion_tokens": 14, "total_tokens": 102, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_b40fb1c6fb"}'
54156ad1Robert Craigie1 years ago186),
a4cd0b50Robert Craigie11 months ago187path="/chat/completions",
54156ad1Robert Craigie1 years ago188mock_client=client,
189respx_mock=respx_mock,
190)
191
192assert print_obj(completion, monkeypatch) == snapshot(
193"""\
194ParsedChatCompletion[Location](
195choices=[
196ParsedChoice[Location](
197finish_reason='stop',
198index=0,
199logprobs=None,
200message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago201annotations=None,
550b855fstainless-app[bot]1 years ago202audio=None,
9feadd82Robert Craigie1 years ago203content='{"city":"San Francisco","temperature":65,"units":"f"}',
54156ad1Robert Craigie1 years ago204function_call=None,
9feadd82Robert Craigie1 years ago205parsed=Location(city='San Francisco', temperature=65.0, units='f'),
54156ad1Robert Craigie1 years ago206refusal=None,
207role='assistant',
b45168e2Robert Craigie1 years ago208tool_calls=None
54156ad1Robert Craigie1 years ago209)
210)
211],
9feadd82Robert Craigie1 years ago212created=1727346144,
213id='chatcmpl-ABfvcC8grKYsRkSoMp9CCAhbXAd0b',
54156ad1Robert Craigie1 years ago214model='gpt-4o-2024-08-06',
215object='chat.completion',
216service_tier=None,
9feadd82Robert Craigie1 years ago217system_fingerprint='fp_b40fb1c6fb',
218usage=CompletionUsage(
219completion_tokens=14,
4ae58a7bRobert Craigie1 years ago220completion_tokens_details=CompletionTokensDetails(
221accepted_prediction_tokens=None,
222audio_tokens=None,
223reasoning_tokens=0,
224rejected_prediction_tokens=None
225),
9feadd82Robert Craigie1 years ago226prompt_tokens=88,
7c8c1115Robert Craigie1 years ago227prompt_tokens_details=None,
9feadd82Robert Craigie1 years ago228total_tokens=102
229)
54156ad1Robert Craigie1 years ago230)
231"""
232)
233
234
ad5ac9fcRobert Craigie1 years ago235@pytest.mark.respx(base_url=base_url)
236def test_parse_pydantic_model_enum(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
237class Color(Enum):
238"""The detected color"""
239
240RED = "red"
241BLUE = "blue"
242GREEN = "green"
243
244class ColorDetection(BaseModel):
245color: Color
246hex_color_code: str = Field(description="The hex color code of the detected color")
247
2cf4ed50stainless-app[bot]10 months ago248if PYDANTIC_V1:
f1e1060eRobert Craigie1 years ago249ColorDetection.update_forward_refs(**locals()) # type: ignore
250
266edebaRobert Craigie11 months ago251completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago252lambda c: c.chat.completions.parse(
ad5ac9fcRobert Craigie1 years ago253model="gpt-4o-2024-08-06",
254messages=[
255{"role": "user", "content": "What color is a Coke can?"},
256],
257response_format=ColorDetection,
258),
259content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago260'{"id": "chatcmpl-ABfvjIatz0zrZu50gRbMtlp0asZpz", "object": "chat.completion", "created": 1727346151, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"color\\":\\"red\\",\\"hex_color_code\\":\\"#FF0000\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 109, "completion_tokens": 14, "total_tokens": 123, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
ad5ac9fcRobert Craigie1 years ago261),
a4cd0b50Robert Craigie11 months ago262path="/chat/completions",
ad5ac9fcRobert Craigie1 years ago263mock_client=client,
264respx_mock=respx_mock,
265)
266
267assert print_obj(completion.choices[0], monkeypatch) == snapshot(
268"""\
269ParsedChoice[ColorDetection](
270finish_reason='stop',
271index=0,
272logprobs=None,
273message=ParsedChatCompletionMessage[ColorDetection](
2954945eRobert Craigie1 years ago274annotations=None,
550b855fstainless-app[bot]1 years ago275audio=None,
ad5ac9fcRobert Craigie1 years ago276content='{"color":"red","hex_color_code":"#FF0000"}',
277function_call=None,
278parsed=ColorDetection(color=<Color.RED: 'red'>, hex_color_code='#FF0000'),
279refusal=None,
280role='assistant',
b45168e2Robert Craigie1 years ago281tool_calls=None
ad5ac9fcRobert Craigie1 years ago282)
283)
284"""
285)
286
287
bf1ca86cRobert Craigie1 years ago288@pytest.mark.respx(base_url=base_url)
289def test_parse_pydantic_model_multiple_choices(
290client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch
291) -> None:
292class Location(BaseModel):
293city: str
294temperature: float
295units: Literal["c", "f"]
296
266edebaRobert Craigie11 months ago297completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago298lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago299model="gpt-4o-2024-08-06",
300messages=[
301{
302"role": "user",
303"content": "What's the weather like in SF?",
304},
305],
306n=3,
307response_format=Location,
308),
309content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago310'{"id": "chatcmpl-ABfvp8qzboW92q8ONDF4DPHlI7ckC", "object": "chat.completion", "created": 1727346157, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":64,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}, {"index": 1, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":65,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}, {"index": 2, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":63.0,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 79, "completion_tokens": 44, "total_tokens": 123, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_b40fb1c6fb"}'
bf1ca86cRobert Craigie1 years ago311),
a4cd0b50Robert Craigie11 months ago312path="/chat/completions",
bf1ca86cRobert Craigie1 years ago313mock_client=client,
314respx_mock=respx_mock,
315)
316
317assert print_obj(completion.choices, monkeypatch) == snapshot(
318"""\
319[
320ParsedChoice[Location](
321finish_reason='stop',
322index=0,
323logprobs=None,
324message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago325annotations=None,
550b855fstainless-app[bot]1 years ago326audio=None,
9feadd82Robert Craigie1 years ago327content='{"city":"San Francisco","temperature":64,"units":"f"}',
bf1ca86cRobert Craigie1 years ago328function_call=None,
9feadd82Robert Craigie1 years ago329parsed=Location(city='San Francisco', temperature=64.0, units='f'),
bf1ca86cRobert Craigie1 years ago330refusal=None,
331role='assistant',
b45168e2Robert Craigie1 years ago332tool_calls=None
bf1ca86cRobert Craigie1 years ago333)
334),
335ParsedChoice[Location](
336finish_reason='stop',
337index=1,
338logprobs=None,
339message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago340annotations=None,
550b855fstainless-app[bot]1 years ago341audio=None,
9feadd82Robert Craigie1 years ago342content='{"city":"San Francisco","temperature":65,"units":"f"}',
bf1ca86cRobert Craigie1 years ago343function_call=None,
9feadd82Robert Craigie1 years ago344parsed=Location(city='San Francisco', temperature=65.0, units='f'),
bf1ca86cRobert Craigie1 years ago345refusal=None,
346role='assistant',
b45168e2Robert Craigie1 years ago347tool_calls=None
bf1ca86cRobert Craigie1 years ago348)
349),
350ParsedChoice[Location](
351finish_reason='stop',
352index=2,
353logprobs=None,
354message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago355annotations=None,
550b855fstainless-app[bot]1 years ago356audio=None,
9feadd82Robert Craigie1 years ago357content='{"city":"San Francisco","temperature":63.0,"units":"f"}',
bf1ca86cRobert Craigie1 years ago358function_call=None,
09eba209Robert Craigie1 years ago359parsed=Location(city='San Francisco', temperature=63.0, units='f'),
bf1ca86cRobert Craigie1 years ago360refusal=None,
361role='assistant',
b45168e2Robert Craigie1 years ago362tool_calls=None
bf1ca86cRobert Craigie1 years ago363)
364)
365]
366"""
367)
368
369
ecd6e922Robert Craigie1 years ago370@pytest.mark.respx(base_url=base_url)
2cf4ed50stainless-app[bot]10 months ago371@pytest.mark.skipif(PYDANTIC_V1, reason="dataclasses only supported in v2")
ecd6e922Robert Craigie1 years ago372def test_parse_pydantic_dataclass(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
373from pydantic.dataclasses import dataclass
374
375@dataclass
376class CalendarEvent:
377name: str
378date: str
379participants: List[str]
380
266edebaRobert Craigie11 months ago381completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago382lambda c: c.chat.completions.parse(
ecd6e922Robert Craigie1 years ago383model="gpt-4o-2024-08-06",
384messages=[
385{"role": "system", "content": "Extract the event information."},
386{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
387],
388response_format=CalendarEvent,
389),
390content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago391'{"id": "chatcmpl-ABfvqhz4uUUWsw8Ohw2Mp9B4sKKV8", "object": "chat.completion", "created": 1727346158, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"name\\":\\"Science Fair\\",\\"date\\":\\"Friday\\",\\"participants\\":[\\"Alice\\",\\"Bob\\"]}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 92, "completion_tokens": 17, "total_tokens": 109, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_7568d46099"}'
ecd6e922Robert Craigie1 years ago392),
a4cd0b50Robert Craigie11 months ago393path="/chat/completions",
ecd6e922Robert Craigie1 years ago394mock_client=client,
395respx_mock=respx_mock,
396)
397
398assert print_obj(completion, monkeypatch) == snapshot(
399"""\
400ParsedChatCompletion[CalendarEvent](
401choices=[
402ParsedChoice[CalendarEvent](
403finish_reason='stop',
404index=0,
405logprobs=None,
406message=ParsedChatCompletionMessage[CalendarEvent](
2954945eRobert Craigie1 years ago407annotations=None,
550b855fstainless-app[bot]1 years ago408audio=None,
ecd6e922Robert Craigie1 years ago409content='{"name":"Science Fair","date":"Friday","participants":["Alice","Bob"]}',
410function_call=None,
411parsed=CalendarEvent(name='Science Fair', date='Friday', participants=['Alice', 'Bob']),
412refusal=None,
413role='assistant',
b45168e2Robert Craigie1 years ago414tool_calls=None
ecd6e922Robert Craigie1 years ago415)
416)
417],
9feadd82Robert Craigie1 years ago418created=1727346158,
419id='chatcmpl-ABfvqhz4uUUWsw8Ohw2Mp9B4sKKV8',
ecd6e922Robert Craigie1 years ago420model='gpt-4o-2024-08-06',
421object='chat.completion',
422service_tier=None,
9feadd82Robert Craigie1 years ago423system_fingerprint='fp_7568d46099',
424usage=CompletionUsage(
425completion_tokens=17,
4ae58a7bRobert Craigie1 years ago426completion_tokens_details=CompletionTokensDetails(
427accepted_prediction_tokens=None,
428audio_tokens=None,
429reasoning_tokens=0,
430rejected_prediction_tokens=None
431),
9feadd82Robert Craigie1 years ago432prompt_tokens=92,
7c8c1115Robert Craigie1 years ago433prompt_tokens_details=None,
9feadd82Robert Craigie1 years ago434total_tokens=109
435)
ecd6e922Robert Craigie1 years ago436)
437"""
438)
439
440
bf1ca86cRobert Craigie1 years ago441@pytest.mark.respx(base_url=base_url)
442def test_pydantic_tool_model_all_types(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
266edebaRobert Craigie11 months ago443completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago444lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago445model="gpt-4o-2024-08-06",
446messages=[
447{
448"role": "user",
449"content": "look up all my orders in may of last year that were fulfilled but not delivered on time",
450},
451],
452tools=[openai.pydantic_function_tool(Query)],
453response_format=Query,
454),
455content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago456'{"id": "chatcmpl-ABfvtNiaTNUF6OymZUnEFc9lPq9p1", "object": "chat.completion", "created": 1727346161, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": null, "tool_calls": [{"id": "call_NKpApJybW1MzOjZO2FzwYw0d", "type": "function", "function": {"name": "Query", "arguments": "{\\"name\\":\\"May 2022 Fulfilled Orders Not Delivered on Time\\",\\"table_name\\":\\"orders\\",\\"columns\\":[\\"id\\",\\"status\\",\\"expected_delivery_date\\",\\"delivered_at\\",\\"shipped_at\\",\\"ordered_at\\",\\"canceled_at\\"],\\"conditions\\":[{\\"column\\":\\"ordered_at\\",\\"operator\\":\\">=\\",\\"value\\":\\"2022-05-01\\"},{\\"column\\":\\"ordered_at\\",\\"operator\\":\\"<=\\",\\"value\\":\\"2022-05-31\\"},{\\"column\\":\\"status\\",\\"operator\\":\\"=\\",\\"value\\":\\"fulfilled\\"},{\\"column\\":\\"delivered_at\\",\\"operator\\":\\">\\",\\"value\\":{\\"column_name\\":\\"expected_delivery_date\\"}}],\\"order_by\\":\\"asc\\"}"}}], "refusal": null}, "logprobs": null, "finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 512, "completion_tokens": 132, "total_tokens": 644, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_7568d46099"}'
bf1ca86cRobert Craigie1 years ago457),
a4cd0b50Robert Craigie11 months ago458path="/chat/completions",
bf1ca86cRobert Craigie1 years ago459mock_client=client,
460respx_mock=respx_mock,
461)
462
463assert print_obj(completion.choices[0], monkeypatch) == snapshot(
464"""\
465ParsedChoice[Query](
466finish_reason='tool_calls',
467index=0,
468logprobs=None,
469message=ParsedChatCompletionMessage[Query](
2954945eRobert Craigie1 years ago470annotations=None,
550b855fstainless-app[bot]1 years ago471audio=None,
bf1ca86cRobert Craigie1 years ago472content=None,
473function_call=None,
474parsed=None,
475refusal=None,
476role='assistant',
477tool_calls=[
478ParsedFunctionToolCall(
479function=ParsedFunction(
9feadd82Robert Craigie1 years ago480arguments='{"name":"May 2022 Fulfilled Orders Not Delivered on
481Time","table_name":"orders","columns":["id","status","expected_delivery_date","delivered_at","shipped_at","ordered_at","
482canceled_at"],"conditions":[{"column":"ordered_at","operator":">=","value":"2022-05-01"},{"column":"ordered_at","operato
483r":"<=","value":"2022-05-31"},{"column":"status","operator":"=","value":"fulfilled"},{"column":"delivered_at","operator"
484:">","value":{"column_name":"expected_delivery_date"}}],"order_by":"asc"}',
bf1ca86cRobert Craigie1 years ago485name='Query',
486parsed_arguments=Query(
487columns=[
488<Column.id: 'id'>,
489<Column.status: 'status'>,
490<Column.expected_delivery_date: 'expected_delivery_date'>,
09eba209Robert Craigie1 years ago491<Column.delivered_at: 'delivered_at'>,
492<Column.shipped_at: 'shipped_at'>,
9feadd82Robert Craigie1 years ago493<Column.ordered_at: 'ordered_at'>,
494<Column.canceled_at: 'canceled_at'>
bf1ca86cRobert Craigie1 years ago495],
496conditions=[
09eba209Robert Craigie1 years ago497Condition(column='ordered_at', operator=<Operator.ge: '>='>, value='2022-05-01'),
498Condition(column='ordered_at', operator=<Operator.le: '<='>, value='2022-05-31'),
bf1ca86cRobert Craigie1 years ago499Condition(column='status', operator=<Operator.eq: '='>, value='fulfilled'),
500Condition(
501column='delivered_at',
502operator=<Operator.gt: '>'>,
503value=DynamicValue(column_name='expected_delivery_date')
504)
505],
9feadd82Robert Craigie1 years ago506name='May 2022 Fulfilled Orders Not Delivered on Time',
bf1ca86cRobert Craigie1 years ago507order_by=<OrderBy.asc: 'asc'>,
508table_name=<Table.orders: 'orders'>
509)
510),
9feadd82Robert Craigie1 years ago511id='call_NKpApJybW1MzOjZO2FzwYw0d',
bf1ca86cRobert Craigie1 years ago512type='function'
513)
514]
515)
516)
517"""
518)
519
520
521@pytest.mark.respx(base_url=base_url)
522def test_parse_max_tokens_reached(client: OpenAI, respx_mock: MockRouter) -> None:
523class Location(BaseModel):
524city: str
525temperature: float
526units: Literal["c", "f"]
527
528with pytest.raises(openai.LengthFinishReasonError):
266edebaRobert Craigie11 months ago529make_snapshot_request(
18e0b36astainless-app[bot]1 years ago530lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago531model="gpt-4o-2024-08-06",
532messages=[
533{
534"role": "user",
535"content": "What's the weather like in SF?",
536},
537],
538max_tokens=1,
539response_format=Location,
540),
541content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago542'{"id": "chatcmpl-ABfvvX7eB1KsfeZj8VcF3z7G7SbaA", "object": "chat.completion", "created": 1727346163, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"", "refusal": null}, "logprobs": null, "finish_reason": "length"}], "usage": {"prompt_tokens": 79, "completion_tokens": 1, "total_tokens": 80, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_7568d46099"}'
bf1ca86cRobert Craigie1 years ago543),
a94bd5b2stainless-app[bot]11 months ago544path="/chat/completions",
bf1ca86cRobert Craigie1 years ago545mock_client=client,
546respx_mock=respx_mock,
547)
548
549
550@pytest.mark.respx(base_url=base_url)
551def test_parse_pydantic_model_refusal(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
552class Location(BaseModel):
553city: str
554temperature: float
555units: Literal["c", "f"]
556
266edebaRobert Craigie11 months ago557completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago558lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago559model="gpt-4o-2024-08-06",
560messages=[
561{
562"role": "user",
563"content": "How do I make anthrax?",
564},
565],
566response_format=Location,
567),
568content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago569'{"id": "chatcmpl-ABfvwoKVWPQj2UPlAcAKM7s40GsRx", "object": "chat.completion", "created": 1727346164, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": null, "refusal": "I\'m very sorry, but I can\'t assist with that."}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 79, "completion_tokens": 12, "total_tokens": 91, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
bf1ca86cRobert Craigie1 years ago570),
a4cd0b50Robert Craigie11 months ago571path="/chat/completions",
bf1ca86cRobert Craigie1 years ago572mock_client=client,
573respx_mock=respx_mock,
574)
575
576assert print_obj(completion.choices, monkeypatch) == snapshot(
577"""\
578[
579ParsedChoice[Location](
580finish_reason='stop',
581index=0,
582logprobs=None,
583message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago584annotations=None,
550b855fstainless-app[bot]1 years ago585audio=None,
bf1ca86cRobert Craigie1 years ago586content=None,
587function_call=None,
588parsed=None,
9feadd82Robert Craigie1 years ago589refusal="I'm very sorry, but I can't assist with that.",
bf1ca86cRobert Craigie1 years ago590role='assistant',
b45168e2Robert Craigie1 years ago591tool_calls=None
bf1ca86cRobert Craigie1 years ago592)
593)
594]
595"""
596)
597
598
599@pytest.mark.respx(base_url=base_url)
600def test_parse_pydantic_tool(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
601class GetWeatherArgs(BaseModel):
602city: str
603country: str
604units: Literal["c", "f"] = "c"
605
266edebaRobert Craigie11 months ago606completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago607lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago608model="gpt-4o-2024-08-06",
609messages=[
610{
611"role": "user",
612"content": "What's the weather like in Edinburgh?",
613},
614],
615tools=[
616openai.pydantic_function_tool(GetWeatherArgs),
617],
618),
619content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago620'{"id": "chatcmpl-ABfvx6Z4dchiW2nya1N8KMsHFrQRE", "object": "chat.completion", "created": 1727346165, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": null, "tool_calls": [{"id": "call_Y6qJ7ofLgOrBnMD5WbVAeiRV", "type": "function", "function": {"name": "GetWeatherArgs", "arguments": "{\\"city\\":\\"Edinburgh\\",\\"country\\":\\"UK\\",\\"units\\":\\"c\\"}"}}], "refusal": null}, "logprobs": null, "finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 76, "completion_tokens": 24, "total_tokens": 100, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_e45dabd248"}'
bf1ca86cRobert Craigie1 years ago621),
a4cd0b50Robert Craigie11 months ago622path="/chat/completions",
bf1ca86cRobert Craigie1 years ago623mock_client=client,
624respx_mock=respx_mock,
625)
626
627assert print_obj(completion.choices, monkeypatch) == snapshot(
628"""\
629[
630ParsedChoice[NoneType](
631finish_reason='tool_calls',
632index=0,
633logprobs=None,
634message=ParsedChatCompletionMessage[NoneType](
2954945eRobert Craigie1 years ago635annotations=None,
550b855fstainless-app[bot]1 years ago636audio=None,
bf1ca86cRobert Craigie1 years ago637content=None,
638function_call=None,
639parsed=None,
640refusal=None,
641role='assistant',
642tool_calls=[
643ParsedFunctionToolCall(
644function=ParsedFunction(
9feadd82Robert Craigie1 years ago645arguments='{"city":"Edinburgh","country":"UK","units":"c"}',
bf1ca86cRobert Craigie1 years ago646name='GetWeatherArgs',
9feadd82Robert Craigie1 years ago647parsed_arguments=GetWeatherArgs(city='Edinburgh', country='UK', units='c')
bf1ca86cRobert Craigie1 years ago648),
9feadd82Robert Craigie1 years ago649id='call_Y6qJ7ofLgOrBnMD5WbVAeiRV',
bf1ca86cRobert Craigie1 years ago650type='function'
651)
652]
653)
654)
655]
656"""
657)
658
659
660@pytest.mark.respx(base_url=base_url)
661def test_parse_multiple_pydantic_tools(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
662class GetWeatherArgs(BaseModel):
663"""Get the temperature for the given country/city combo"""
664
665city: str
666country: str
667units: Literal["c", "f"] = "c"
668
669class GetStockPrice(BaseModel):
670ticker: str
671exchange: str
672
266edebaRobert Craigie11 months ago673completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago674lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago675model="gpt-4o-2024-08-06",
676messages=[
677{
678"role": "user",
679"content": "What's the weather like in Edinburgh?",
680},
681{
682"role": "user",
683"content": "What's the price of AAPL?",
684},
685],
686tools=[
687openai.pydantic_function_tool(GetWeatherArgs),
688openai.pydantic_function_tool(
689GetStockPrice, name="get_stock_price", description="Fetch the latest price for a given ticker"
690),
691],
692),
693content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago694'{"id": "chatcmpl-ABfvyvfNWKcl7Ohqos4UFrmMs1v4C", "object": "chat.completion", "created": 1727346166, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": null, "tool_calls": [{"id": "call_fdNz3vOBKYgOIpMdWotB9MjY", "type": "function", "function": {"name": "GetWeatherArgs", "arguments": "{\\"city\\": \\"Edinburgh\\", \\"country\\": \\"GB\\", \\"units\\": \\"c\\"}"}}, {"id": "call_h1DWI1POMJLb0KwIyQHWXD4p", "type": "function", "function": {"name": "get_stock_price", "arguments": "{\\"ticker\\": \\"AAPL\\", \\"exchange\\": \\"NASDAQ\\"}"}}], "refusal": null}, "logprobs": null, "finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 149, "completion_tokens": 60, "total_tokens": 209, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_b40fb1c6fb"}'
bf1ca86cRobert Craigie1 years ago695),
a4cd0b50Robert Craigie11 months ago696path="/chat/completions",
bf1ca86cRobert Craigie1 years ago697mock_client=client,
698respx_mock=respx_mock,
699)
700
701assert print_obj(completion.choices, monkeypatch) == snapshot(
702"""\
703[
704ParsedChoice[NoneType](
705finish_reason='tool_calls',
706index=0,
707logprobs=None,
708message=ParsedChatCompletionMessage[NoneType](
2954945eRobert Craigie1 years ago709annotations=None,
550b855fstainless-app[bot]1 years ago710audio=None,
bf1ca86cRobert Craigie1 years ago711content=None,
712function_call=None,
713parsed=None,
714refusal=None,
715role='assistant',
716tool_calls=[
717ParsedFunctionToolCall(
718function=ParsedFunction(
9feadd82Robert Craigie1 years ago719arguments='{"city": "Edinburgh", "country": "GB", "units": "c"}',
bf1ca86cRobert Craigie1 years ago720name='GetWeatherArgs',
9feadd82Robert Craigie1 years ago721parsed_arguments=GetWeatherArgs(city='Edinburgh', country='GB', units='c')
bf1ca86cRobert Craigie1 years ago722),
9feadd82Robert Craigie1 years ago723id='call_fdNz3vOBKYgOIpMdWotB9MjY',
bf1ca86cRobert Craigie1 years ago724type='function'
725),
726ParsedFunctionToolCall(
727function=ParsedFunction(
728arguments='{"ticker": "AAPL", "exchange": "NASDAQ"}',
729name='get_stock_price',
730parsed_arguments=GetStockPrice(exchange='NASDAQ', ticker='AAPL')
731),
9feadd82Robert Craigie1 years ago732id='call_h1DWI1POMJLb0KwIyQHWXD4p',
bf1ca86cRobert Craigie1 years ago733type='function'
734)
735]
736)
737)
738]
739"""
740)
741
742
743@pytest.mark.respx(base_url=base_url)
744def test_parse_strict_tools(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
266edebaRobert Craigie11 months ago745completion = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago746lambda c: c.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago747model="gpt-4o-2024-08-06",
748messages=[
749{
750"role": "user",
751"content": "What's the weather like in SF?",
752},
753],
754tools=[
755{
756"type": "function",
757"function": {
758"name": "get_weather",
759"parameters": {
760"type": "object",
761"properties": {
762"city": {"type": "string"},
763"state": {"type": "string"},
764},
765"required": [
766"city",
767"state",
768],
769"additionalProperties": False,
770},
771"strict": True,
772},
773}
774],
775),
776content_snapshot=snapshot(
9feadd82Robert Craigie1 years ago777'{"id": "chatcmpl-ABfvzdvCI6RaIkiEFNjqGXCSYnlzf", "object": "chat.completion", "created": 1727346167, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": null, "tool_calls": [{"id": "call_CUdUoJpsWWVdxXntucvnol1M", "type": "function", "function": {"name": "get_weather", "arguments": "{\\"city\\":\\"San Francisco\\",\\"state\\":\\"CA\\"}"}}], "refusal": null}, "logprobs": null, "finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 48, "completion_tokens": 19, "total_tokens": 67, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
bf1ca86cRobert Craigie1 years ago778),
a4cd0b50Robert Craigie11 months ago779path="/chat/completions",
bf1ca86cRobert Craigie1 years ago780mock_client=client,
781respx_mock=respx_mock,
782)
783
784assert print_obj(completion.choices, monkeypatch) == snapshot(
785"""\
786[
787ParsedChoice[NoneType](
788finish_reason='tool_calls',
789index=0,
790logprobs=None,
791message=ParsedChatCompletionMessage[NoneType](
2954945eRobert Craigie1 years ago792annotations=None,
550b855fstainless-app[bot]1 years ago793audio=None,
bf1ca86cRobert Craigie1 years ago794content=None,
795function_call=None,
796parsed=None,
797refusal=None,
798role='assistant',
799tool_calls=[
800ParsedFunctionToolCall(
801function=ParsedFunction(
802arguments='{"city":"San Francisco","state":"CA"}',
803name='get_weather',
804parsed_arguments={'city': 'San Francisco', 'state': 'CA'}
805),
9feadd82Robert Craigie1 years ago806id='call_CUdUoJpsWWVdxXntucvnol1M',
bf1ca86cRobert Craigie1 years ago807type='function'
808)
809]
810)
811)
812]
813"""
814)
815
816
817def test_parse_non_strict_tools(client: OpenAI) -> None:
818with pytest.raises(
819ValueError, match="`get_weather` is not strict. Only `strict` function tools can be auto-parsed"
820):
18e0b36astainless-app[bot]1 years ago821client.chat.completions.parse(
bf1ca86cRobert Craigie1 years ago822model="gpt-4o-2024-08-06",
823messages=[],
824tools=[
825{
826"type": "function",
827"function": {
828"name": "get_weather",
829"parameters": {},
830},
831}
832],
833)
834
835
152a8bdaRobert Craigie1 years ago836@pytest.mark.respx(base_url=base_url)
837def test_parse_pydantic_raw_response(client: OpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch) -> None:
838class Location(BaseModel):
839city: str
840temperature: float
841units: Literal["c", "f"]
842
266edebaRobert Craigie11 months ago843response = make_snapshot_request(
18e0b36astainless-app[bot]1 years ago844lambda c: c.chat.completions.with_raw_response.parse(
152a8bdaRobert Craigie1 years ago845model="gpt-4o-2024-08-06",
846messages=[
847{
848"role": "user",
849"content": "What's the weather like in SF?",
850},
851],
852response_format=Location,
853),
854content_snapshot=snapshot(
855'{"id": "chatcmpl-ABrDYCa8W1w66eUxKDO8TQF1m6trT", "object": "chat.completion", "created": 1727389540, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":58,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 79, "completion_tokens": 14, "total_tokens": 93, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
856),
a4cd0b50Robert Craigie11 months ago857path="/chat/completions",
152a8bdaRobert Craigie1 years ago858mock_client=client,
859respx_mock=respx_mock,
860)
18e0b36astainless-app[bot]1 years ago861assert response.http_request.headers.get("x-stainless-helper-method") == "chat.completions.parse"
152a8bdaRobert Craigie1 years ago862
863completion = response.parse()
864message = completion.choices[0].message
865assert message.parsed is not None
866assert isinstance(message.parsed.city, str)
867assert print_obj(completion, monkeypatch) == snapshot(
868"""\
869ParsedChatCompletion[Location](
870choices=[
871ParsedChoice[Location](
872finish_reason='stop',
873index=0,
874logprobs=None,
875message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago876annotations=None,
550b855fstainless-app[bot]1 years ago877audio=None,
152a8bdaRobert Craigie1 years ago878content='{"city":"San Francisco","temperature":58,"units":"f"}',
879function_call=None,
880parsed=Location(city='San Francisco', temperature=58.0, units='f'),
881refusal=None,
882role='assistant',
b45168e2Robert Craigie1 years ago883tool_calls=None
152a8bdaRobert Craigie1 years ago884)
885)
886],
887created=1727389540,
888id='chatcmpl-ABrDYCa8W1w66eUxKDO8TQF1m6trT',
889model='gpt-4o-2024-08-06',
890object='chat.completion',
891service_tier=None,
892system_fingerprint='fp_5050236cbd',
893usage=CompletionUsage(
894completion_tokens=14,
4ae58a7bRobert Craigie1 years ago895completion_tokens_details=CompletionTokensDetails(
896accepted_prediction_tokens=None,
897audio_tokens=None,
898reasoning_tokens=0,
899rejected_prediction_tokens=None
900),
152a8bdaRobert Craigie1 years ago901prompt_tokens=79,
7c8c1115Robert Craigie1 years ago902prompt_tokens_details=None,
152a8bdaRobert Craigie1 years ago903total_tokens=93
904)
905)
906"""
907)
908
909
910@pytest.mark.respx(base_url=base_url)
911@pytest.mark.asyncio
912async def test_async_parse_pydantic_raw_response(
913async_client: AsyncOpenAI, respx_mock: MockRouter, monkeypatch: pytest.MonkeyPatch
914) -> None:
915class Location(BaseModel):
916city: str
917temperature: float
918units: Literal["c", "f"]
919
266edebaRobert Craigie11 months ago920response = await make_async_snapshot_request(
18e0b36astainless-app[bot]1 years ago921lambda c: c.chat.completions.with_raw_response.parse(
152a8bdaRobert Craigie1 years ago922model="gpt-4o-2024-08-06",
923messages=[
924{
925"role": "user",
926"content": "What's the weather like in SF?",
927},
928],
929response_format=Location,
930),
931content_snapshot=snapshot(
932'{"id": "chatcmpl-ABrDQWOiw0PK5JOsxl1D9ooeQgznq", "object": "chat.completion", "created": 1727389532, "model": "gpt-4o-2024-08-06", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\\"city\\":\\"San Francisco\\",\\"temperature\\":65,\\"units\\":\\"f\\"}", "refusal": null}, "logprobs": null, "finish_reason": "stop"}], "usage": {"prompt_tokens": 79, "completion_tokens": 14, "total_tokens": 93, "completion_tokens_details": {"reasoning_tokens": 0}}, "system_fingerprint": "fp_5050236cbd"}'
933),
a4cd0b50Robert Craigie11 months ago934path="/chat/completions",
152a8bdaRobert Craigie1 years ago935mock_client=async_client,
936respx_mock=respx_mock,
937)
18e0b36astainless-app[bot]1 years ago938assert response.http_request.headers.get("x-stainless-helper-method") == "chat.completions.parse"
152a8bdaRobert Craigie1 years ago939
940completion = response.parse()
941message = completion.choices[0].message
942assert message.parsed is not None
943assert isinstance(message.parsed.city, str)
944assert print_obj(completion, monkeypatch) == snapshot(
945"""\
946ParsedChatCompletion[Location](
947choices=[
948ParsedChoice[Location](
949finish_reason='stop',
950index=0,
951logprobs=None,
952message=ParsedChatCompletionMessage[Location](
2954945eRobert Craigie1 years ago953annotations=None,
550b855fstainless-app[bot]1 years ago954audio=None,
152a8bdaRobert Craigie1 years ago955content='{"city":"San Francisco","temperature":65,"units":"f"}',
956function_call=None,
957parsed=Location(city='San Francisco', temperature=65.0, units='f'),
958refusal=None,
959role='assistant',
b45168e2Robert Craigie1 years ago960tool_calls=None
152a8bdaRobert Craigie1 years ago961)
962)
963],
964created=1727389532,
965id='chatcmpl-ABrDQWOiw0PK5JOsxl1D9ooeQgznq',
966model='gpt-4o-2024-08-06',
967object='chat.completion',
968service_tier=None,
969system_fingerprint='fp_5050236cbd',
970usage=CompletionUsage(
971completion_tokens=14,
4ae58a7bRobert Craigie1 years ago972completion_tokens_details=CompletionTokensDetails(
973accepted_prediction_tokens=None,
974audio_tokens=None,
975reasoning_tokens=0,
976rejected_prediction_tokens=None
977),
152a8bdaRobert Craigie1 years ago978prompt_tokens=79,
7c8c1115Robert Craigie1 years ago979prompt_tokens_details=None,
152a8bdaRobert Craigie1 years ago980total_tokens=93
981)
982)
983"""
984)
985
986
bf1ca86cRobert Craigie1 years ago987@pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
988def test_parse_method_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None:
989checking_client: OpenAI | AsyncOpenAI = client if sync else async_client
990
991assert_signatures_in_sync(
992checking_client.chat.completions.create,
18e0b36astainless-app[bot]1 years ago993checking_client.chat.completions.parse,
bf1ca86cRobert Craigie1 years ago994exclude_params={"response_format", "stream"},
995)