Skip to main content

Automatically creating functions that LLMs can use.

Project description

chat2func

CI License PyPI

chat2func automatically generates JSON schemas from Python, allowing ChatGPT to talk to your code.

Installation

pip install chat2func

# Or install with developer dependencies
pip install chat2func[develop]

Quick Start

Annotate your function with @json_schema

from chat2func import json_schema

@json_schema
def my_function(x: float, y: float) -> bool:
    """This is a sample function.

    Args:
        x: The first float.
        y: Another float.
    """
    return x > y

After this, my_function will have an additional .json attribute containing its JSON schema.

print(my_function.json)

{'description': 'This is a sample function.',
 'name': 'my_function',
 'parameters': {'properties': {'x': {'description': 'The first float.', 'type': 'number'},
                               'y': {'description': 'Another float.', 'type': 'number'}},
                'required': ['x', 'y'],
                'type': 'object'}}

JSON Schema

You can generate a JSON schema from any type of callable: classes, functions, or dataclasses.

Using Custom Classes

json_schema works with classes or dataclasses too. Set descriptions=False to not generate object descriptions from docstrings.

@json_schema(descriptions=False)
@dataclass
class Data:
    a: int = 0

print(Data.json)
{'name': 'Data',
 'parameters': {'type': 'object', 'properties': {'a': {'type': 'integer'}}}}

Creating a ChatGPT Plugin

You can easily create and demo a ChatGPT plugin using the included Flask server. First, define the functions you want ChatGPT to be able to use, expose them with the server and connect to them from ChatGPT.

from chat2func.server import FunctionServer

def addition(x: float, y: float) -> float:
    "Add two floats."
    return x + y

server = FunctionServer({"addition": addition})
server.run() # Visit http://localhost:3333/ to see the available functions.

Deploy a Plugin

The PluginServer is a simple Flask app, so you can deploy easily using any method that works for Flask. The server provides an additional export function that generates the necessary files to deploy a plugin using firebase.

# ...
server.export("./my-plugin")

After export, double check that all necessary code and imports are inside main.py. Also add a logo to /public.

cd my-plugin
python3.11 -m venv functions/venv && source functions/venv/bin/activate
pip install -r functions/requirements.txt
firebase emulators:start # test the function locally
firebase deploy # deploy to firebase

Don't forget to update the urls in ai-plugin.json once you've deployed.

Calling Functions with JSON Arguments

function_call provides additional functionality for calling functions with JSON arguments. It automatically converts JSON arguments to Python objects and returns the result as JSON. It validates the JSON, raising FunctionCallError if something is unexpected.

import json
from chat2func import function_call, collect_functions

def plusplus(x: float, y: float) -> float:
    "Add two floats."
    return x + y

# Specify the available functions.
# You can also use `collect_functions` to collect all functions within a scope.
functions = {"plusplus": plusplus}

# Arguments are passed as a JSON string.
arguments = json.dumps({"x": 1.0, "y": 2.0})
result = function_call("plusplus", arguments, functions)
print(result) # 3.0

# We can optionally validate the function arguments too. Defaults to on.
arguments = json.dumps({"x": "a", "y": 2.0})
result = function_call("plusplus", arguments, functions)
# FunctionCallError: Function call failed. 1 validation error for plusplus

Using OpenAI's Function Calling API

experimental

We can use the function calling API directly too. Here we demonstrate using ChatGPT to generate structured data (in the form of dataclasses) from unstructured knowledge about the book Dune.

from chat2func import function_call
from chat2func.api import FunctionCallingAPI, Role

@json_schema
@dataclass
class Character:
    name: str
    age: Optional[int] = None
    house: Optional[str] = None

# Setup our function calling API
api = FunctionCallingAPI({"Character": Character})
api.chat.add_message(Role.USER.value, "List the heads of houses in the Dune series. Give best estimates of age's where appropriate.")

# Generate 5 different Characters (remember the samples are stochastic!)
for _ in range(5):
    # Force the API to call a function
    message = api.reply(force_function="Character")
    api.chat.messages.append(message)

    # Call the function (and validate the inputs!)
    fn_name = message.function_call["name"]
    args = message.function_call["arguments"]
    result = function_call(fn_name, args, functions, return_json=False)

    # Add the result to the chat
    api.chat.add_message(Role.FUNCTION.value, str(result), name="character")
    print(result)

# Character(name='Duke Leto Atreides', age=50, house='Atreides')
# Character(name='Baron Vladimir Harkonnen', age=80, house='Harkonnen')
# Character(name='Emperor Shaddam Corrino IV', age=70, house='Corrino')
# Character(name='Lady Jessica', age=36, house='Atreides')
# Character(name='Paul Atreides', age=15, house='Atreides')

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

chat2func-0.1.3.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

chat2func-0.1.3-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file chat2func-0.1.3.tar.gz.

File metadata

  • Download URL: chat2func-0.1.3.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for chat2func-0.1.3.tar.gz
Algorithm Hash digest
SHA256 8e1284aebd71b96a029abada02375d07e81213f8edd5a957e37fb063d0220654
MD5 39b1fbecfc72bcfef4b6f199d926b6a4
BLAKE2b-256 743033e4c6abf0ab9e2602546e3c331173c1210905f6c4d7ab8b565cb279896e

See more details on using hashes here.

File details

Details for the file chat2func-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: chat2func-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 16.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for chat2func-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 fb940ef09bcb00246b26e23f374775070c079374df6304f6feef05c598ba843c
MD5 1122955ee5b3348ff669bb607a1e3190
BLAKE2b-256 ce29d951d46c4616431f44f1aaf36f94cf28ed46cfec8b5fee1d390b4637d58f

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