Create OpenAI-compatible function schemas from python functions
Project description
Py2OpenAI
OpenAI Function Schema Generator
Convert Python functions to OpenAI-compatible function schemas automatically.
Installation
pip install openai-function-schema # not yet published
Basic Usage
from openai_function_schema import create_schema
from typing import Literal
def get_weather(
location: str,
unit: Literal["C", "F"] = "C",
detailed: bool = False,
) -> dict[str, str | float]:
"""Get the weather for a location.
Args:
location: City or address to get weather for
unit: Temperature unit (Celsius or Fahrenheit)
detailed: Include extended forecast
"""
return {"temp": 22.5, "conditions": "sunny"}
# Create schema
schema = create_schema(get_weather)
# Use with OpenAI
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "What's the weather in London?"}],
functions=[schema.model_dump_openai()],
function_call="auto"
)
Supported Types
Basic Types
def func(
text: str, # -> "type": "string"
number: int, # -> "type": "integer"
amount: float, # -> "type": "number"
enabled: bool, # -> "type": "boolean"
anything: Any, # -> "type": "string"
) -> None: ...
Container Types
def func(
items: list[str], # -> "type": "array", "items": {"type": "string"}
numbers: set[int], # -> same as list
mapping: dict[str, Any], # -> "type": "object", "additionalProperties": true
nested: list[dict[str, int]], # -> nested array/object types
sequence: Sequence[str], # -> "type": "array"
collection: Collection[int], # -> "type": "array"
) -> None: ...
Enums and Literals
class Color(Enum):
RED = "red"
BLUE = "blue"
def func(
color: Color, # -> "type": "string", "enum": ["red", "blue"]
mode: Literal["fast", "slow"], # -> "type": "string", "enum": ["fast", "slow"]
) -> None: ...
Optional and Union Types
def func(
opt1: str | None, # -> "type": "string"
opt2: int | None, # -> "type": "integer"
union: str | int, # -> "type": "string" (first type)
) -> None: ...
Custom Types
@dataclass
class User:
name: str
age: int
def func(
user: User, # -> "type": "object"
data: JsonDict, # -> "type": "object"
) -> None: ...
Type Aliases
JsonValue = dict[str, Any] | list[Any] | str | int | float | bool | None
JsonDict = dict[str, JsonValue]
def func(
data: JsonDict, # -> "type": "object"
values: list[JsonValue], # -> "type": "array"
) -> None: ...
Recursive Types
def func(
tree: dict[str, "dict[str, Any] | str"], # -> "type": "object"
nested: dict[str, list["dict[str, Any]"]], # -> "type": "object"
) -> None: ...
Generated Schema Example
{
"name": "get_weather",
"description": "Get the weather for a location.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City or address to get weather for"
},
"unit": {
"type": "string",
"enum": ["C", "F"],
"description": "Temperature unit (Celsius or Fahrenheit)",
"default": "C"
},
"detailed": {
"type": "boolean",
"description": "Include extended forecast",
"default": false
}
},
"required": ["location"]
}
}
Schema Generators
Module Schemas
You can generate schemas for all public functions in a module using create_schemas_from_module
:
from py2openai import create_schemas_from_module
import math
# Generate schemas for all public functions
schemas = create_schemas_from_module(math)
# Generate schemas for specific functions only
schemas = create_schemas_from_module(math, include_functions=['sin', 'cos'])
# Import module by string name
schemas = create_schemas_from_module('math')
Class Schemas
Generate schemas for all public methods in a class using create_schemas_from_class
:
from py2openai import create_schemas_from_class
class Calculator:
def add(self, x: int, y: int) -> int:
"""Add two numbers.
Args:
x: First number
y: Second number
Returns:
Sum of x and y
"""
return x + y
@classmethod
def multiply(cls, x: int, y: int) -> int:
"""Multiply two numbers.
Args:
x: First number
y: Second number
Returns:
Product of x and y
"""
return x * y
@staticmethod
def divide(x: float, y: float) -> float:
"""Divide two numbers.
Args:
x: Numerator
y: Denominator
Returns:
Result of x divided by y
"""
return x / y
# Generate schemas for all public methods
schemas = create_schemas_from_class(Calculator)
# Access individual method schemas
add_schema = schemas['Calculator.add']
multiply_schema = schemas['Calculator.multiply']
divide_schema = schemas['Calculator.divide']
The schema generators support:
- Regular instance methods
- Class methods
- Static methods
- Async methods
- Property methods
- All supported type annotations
- Method docstrings for descriptions
- Default values
- Return type hints
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
py2openai-0.9.1.tar.gz
(20.8 kB
view details)
Built Distribution
py2openai-0.9.1-py3-none-any.whl
(11.8 kB
view details)
File details
Details for the file py2openai-0.9.1.tar.gz
.
File metadata
- Download URL: py2openai-0.9.1.tar.gz
- Upload date:
- Size: 20.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d3b6d6534e58bb4a7c7025164ce0bbed353f13f2d195a0f3cc38e5a40c40e978 |
|
MD5 | 84a51ae137aeca76229de958bebfee94 |
|
BLAKE2b-256 | b5dddd8f64690a1a472c68a883316d0f23e20a40beae9fa142fd610119725e8d |
File details
Details for the file py2openai-0.9.1-py3-none-any.whl
.
File metadata
- Download URL: py2openai-0.9.1-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8c743aa3740ece9764bca3365b7ef3d47f3a93d5dca9f2f18ef99f5180c8700f |
|
MD5 | dbedbf59898d75fbe828252ffbceadee |
|
BLAKE2b-256 | d6fd8c7a50829160a5a93e3d9e92eacfd56daf8b0b812c126a01a4f3740e0284 |