main
1from enum import Enum
2from typing import List, Union
3
4import rich
5from pydantic import BaseModel
6
7import openai
8from openai import OpenAI
9
10
11class Table(str, Enum):
12 orders = "orders"
13 customers = "customers"
14 products = "products"
15
16
17class Column(str, Enum):
18 id = "id"
19 status = "status"
20 expected_delivery_date = "expected_delivery_date"
21 delivered_at = "delivered_at"
22 shipped_at = "shipped_at"
23 ordered_at = "ordered_at"
24 canceled_at = "canceled_at"
25
26
27class Operator(str, Enum):
28 eq = "="
29 gt = ">"
30 lt = "<"
31 le = "<="
32 ge = ">="
33 ne = "!="
34
35
36class OrderBy(str, Enum):
37 asc = "asc"
38 desc = "desc"
39
40
41class DynamicValue(BaseModel):
42 column_name: str
43
44
45class Condition(BaseModel):
46 column: str
47 operator: Operator
48 value: Union[str, int, DynamicValue]
49
50
51class Query(BaseModel):
52 table_name: Table
53 columns: List[Column]
54 conditions: List[Condition]
55 order_by: OrderBy
56
57
58client = OpenAI()
59
60response = client.responses.parse(
61 model="gpt-4o-2024-08-06",
62 input="look up all my orders in november of last year that were fulfilled but not delivered on time",
63 tools=[
64 openai.pydantic_function_tool(Query),
65 ],
66)
67
68rich.print(response)
69
70function_call = response.output[0]
71assert function_call.type == "function_call"
72assert isinstance(function_call.parsed_arguments, Query)
73print("table name:", function_call.parsed_arguments.table_name)