【python openai function2json小工具】
两种方法 一种openai-swarm中提供的、一种langchain实现的
一、openai工具函数调用
import inspect
def merge_chunk(final_response: dict, delta: dict) -> None:
delta.pop("role", None)
merge_fields(final_response, delta)
tool_calls = delta.get("tool_calls")
if tool_calls and len(tool_calls) > 0:
index = tool_calls[0].pop("index")
merge_fields(final_response["tool_calls"][index], tool_calls[0])
def function_to_json(func) -> dict:
"""
Converts a Python function into a JSON-serializable dictionary
that describes the function's signature, including its name,
description, and parameters.
Args:
func: The function to be converted.
Returns:
A dictionary representing the function's signature in JSON format.
"""
type_map = {
str: "string",
int: "integer",
float: "number",
bool: "boolean",
list: "array",
dict: "object",
type(None): "null",
}
try:
signature = inspect.signature(func)
except ValueError as e:
raise ValueError(
f"Failed to get signature for function {func.__name__}: {str(e)}"
)
parameters = {}
for param in signature.parameters.values():
try:
param_type = type_map.get(param.annotation, "string")
except KeyError as e:
raise KeyError(
f"Unknown type annotation {param.annotation} for parameter {param.name}: {str(e)}"
)
parameters[param.name] = {"type": param_type}
required = [
param.name
for param in signature.parameters.values()
if param.default == inspect._empty
]
return {
"type": "function",
"function": {
"name": func.__name__,
"description": func.__doc__ or "",
"parameters": {
"type": "object",
"properties": parameters,
"required": required,
},
},
}
if __name__=='__main__':
print(function_to_json(merge_chunk))
二、使用langchain
from langchain_core.utils.function_calling import (
convert_to_openai_function,
convert_to_openai_tool,
)
from langchain_core.tools.convert import tool
from typing import Annotated
@tool
def slide_ops(
idx: Annotated[int, "元素index"],
left: Annotated[int, "元素的左上横坐标"] = None,
top: Annotated[int, "元素的左上纵坐标"] = None,
width: Annotated[int, "元素的宽度"] = None,
height: Annotated[int, "元素的高度"] = None,
fontcolor: Annotated[str, "元素的前景颜色"] = None,
backcolor: Annotated[int, "元素的背景颜色"] = None,
delete: Annotated[bool, "删除此元素"] = None,
):
"""修改幻灯片中元素的信息"""
...
convert_to_openai_function(slide_ops)
convert_to_openai_tool(slide_ops)