mirror of
https://github.com/kennethreitz/instructor.git
synced 2026-06-05 22:50:18 +00:00
202f9cb227
Co-authored-by: Jason Liu <jason@jxnl.co> Co-authored-by: Jason Liu <jxnl@users.noreply.github.com>
51 lines
1.1 KiB
Python
51 lines
1.1 KiB
Python
from typing import Iterable
|
|
from openai import OpenAI
|
|
from pydantic import BaseModel, Field
|
|
from typing import List
|
|
|
|
import pytest
|
|
|
|
import instructor
|
|
from instructor.function_calls import Mode
|
|
|
|
|
|
class Item(BaseModel):
|
|
name: str
|
|
price: float
|
|
|
|
|
|
class Order(BaseModel):
|
|
items: List[Item] = Field(..., default_factory=list)
|
|
customer: str
|
|
|
|
|
|
@pytest.mark.parametrize("mode", [Mode.FUNCTIONS, Mode.JSON, Mode.TOOLS, Mode.MD_JSON])
|
|
def test_nested(mode):
|
|
client = instructor.patch(OpenAI(), mode=mode)
|
|
|
|
content = """
|
|
Order Details:
|
|
Customer: Jason
|
|
Items:
|
|
|
|
Name: Apple, Price: 0.50
|
|
Name: Bread, Price: 2.00
|
|
Name: Milk, Price: 1.50
|
|
"""
|
|
|
|
resp = client.chat.completions.create(
|
|
model="gpt-3.5-turbo-1106",
|
|
response_model=Order,
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": content,
|
|
},
|
|
],
|
|
)
|
|
|
|
assert len(resp.items) == 3
|
|
assert {x.name.lower() for x in resp.items} == {"apple", "bread", "milk"}
|
|
assert {x.price for x in resp.items} == {0.5, 2.0, 1.5}
|
|
assert resp.customer.lower() == "jason"
|