Skip to main content

A small utility to generate JSON schemas for python functions.

Project description

Function schema

CI Release PyPI version

This is a small utility to generate JSON schemas for python functions. With power of type annotations, it is possible to generate a schema for a function without describing it twice.

At this moment, extracting schema from a function is useful for OpenAI Assistant Toll Calling, OpenAI API function-call, and Anthropic Claude Toll calling feature. And it can be used for other purposes for example to generate documentation in the future.

Installation

pip install function-schema

Usage

from typing import Annotated, Optional
import enum

def get_weather(
    city: Annotated[str, "The city to get the weather for"],
    unit: Annotated[
        Optional[str],
        "The unit to return the temperature in",
        enum.Enum("Unit", "celcius fahrenheit")
    ] = "celcius",
) -> str:
    """Returns the weather for the given city."""
    return f"Weather for {city} is 20°C"

Function description is taken from the docstring. Type hinting with typing.Annotated for annotate additional information about the parameters and return type.

  • type can be typing.Union, typing.Optional. (T | None for python 3.10+)
  • string value of Annotated is used as a description
  • enum value of Annotated is used as an enum schema
import json
from function_schema import get_function_schema

schema = get_function_schema(get_weather)
print(json.dumps(schema, indent=2))

Will output:

{
  "name": "get_weather",
  "description": "Returns the weather for the given city.",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "The city to get the weather for"
      },
      "unit": {
        "type": "string",
        "description": "The unit to return the temperature in",
        "enum": [
          "celcius",
          "fahrenheit"
        ],
        "default": "celcius"
      }
    },
  }
  "required": [
    "city"
  ]
}

for claude, you should pass 2nd argument as SchemaFormat.claude or claude:

from function_schema import get_function_schema

schema = get_function_schema(get_weather, "claude")

Please refer to the Claude tool use documentation for more information.

Literal types can be used as Enum

def get_weather(
    city: Annotated[str, "The city to get the weather for"],
    unit: Annotated[
        Optional[Literal["celcius", "fahrenheit"]], # <- Literal type represents Enum
        "The unit to return the temperature in",
    ] = "celcius",
) -> str:
    """Returns the weather for the given city."""
    return f"Weather for {city} is 20°C"

The schema will be generated as the same as the previous example.

Usage with OpenAI API

You can use this schema to make a function call in OpenAI API:

import openai
openai.api_key = "sk-..."

# Create an assistant with the function
assistant = client.beta.assistants.create(
    instructions="You are a weather bot. Use the provided functions to answer questions.",
    model="gpt-4-turbo-preview",
    tools=[{
        "type": "function",
        "function": get_function_schema(get_weather),
    }]
)

run = client.beta.messages.create(
    assistant_id=assistant.id,
    messages=[
        {"role": "user", "content": "What's the weather like in Seoul?"}
    ]
)

# or with chat completion

result = openai.chat.completion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "What's the weather like in Seoul?"}
    ],
    tools=[{
      "type": "function",
      "function": get_function_schema(get_weather)
    }],
    tool_call="auto",
)

Usage with Anthropic Claude

import anthropic

client = anthropic.Client()

response = client.beta.tools.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=4096,
    tools=[get_function_schema(get_weather, "claude")],
    messages=[
        {"role": "user", "content": "What's the weather like in Seoul?"}
    ]
)

CLI usage

function_schema mymodule.py my_function

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

function_schema-0.3.6.tar.gz (4.7 kB view details)

Uploaded Source

Built Distribution

function_schema-0.3.6-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file function_schema-0.3.6.tar.gz.

File metadata

  • Download URL: function_schema-0.3.6.tar.gz
  • Upload date:
  • Size: 4.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for function_schema-0.3.6.tar.gz
Algorithm Hash digest
SHA256 0cdd65b417b96674cb0fa2ee5a0b071dcd966d12db26bbaca23bb5d990d79bdd
MD5 d86ff1e4c1fad22e3a5a27d3beea5f55
BLAKE2b-256 c28bb7d3e65e8b8891e4580c7f38a4bbb64c292f0894ebebfeb1f1991701aefe

See more details on using hashes here.

File details

Details for the file function_schema-0.3.6-py3-none-any.whl.

File metadata

File hashes

Hashes for function_schema-0.3.6-py3-none-any.whl
Algorithm Hash digest
SHA256 79dfd20b41b18d0eb7ff86d793e3f824e238561df7af4d3bd3645a7cee844387
MD5 7452ad1d71422cf6a69d417826e4caef
BLAKE2b-256 321417b09e1f131442bcc602e5f0097749039b1e4e1f889f36369047c06a571b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page