from enum import Enum from typing import List, Union import rich from pydantic import BaseModel import openai from openai import OpenAI class Table(str, Enum): orders = "orders" customers = "customers" products = "products" class Column(str, Enum): id = "id" status = "status" expected_delivery_date = "expected_delivery_date" delivered_at = "delivered_at" shipped_at = "shipped_at" ordered_at = "ordered_at" canceled_at = "canceled_at" class Operator(str, Enum): eq = "=" gt = ">" lt = "<" le = "<=" ge = ">=" ne = "!=" class OrderBy(str, Enum): asc = "asc" desc = "desc" class DynamicValue(BaseModel): column_name: str class Condition(BaseModel): column: str operator: Operator value: Union[str, int, DynamicValue] class Query(BaseModel): table_name: Table columns: List[Column] conditions: List[Condition] order_by: OrderBy client = OpenAI() completion = client.beta.chat.completions.parse( model="gpt-4o-2024-08-06", messages=[ { "role": "system", "content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function.", }, { "role": "user", "content": "look up all my orders in november of last year that were fulfilled but not delivered on time", }, ], tools=[ openai.pydantic_function_tool(Query), ], ) tool_call = (completion.choices[0].message.tool_calls or [])[0] rich.print(tool_call.function) assert isinstance(tool_call.function.parsed_arguments, Query) print(tool_call.function.parsed_arguments.table_name)