Files
happy-llm/docs/chapter7/Agent/src/utils.py
2025-04-26 20:35:30 +08:00

61 lines
2.3 KiB
Python

import inspect
from datetime import datetime
import pprint
def function_to_json(func) -> dict:
# 定义 Python 类型到 JSON 数据类型的映射
type_map = {
str: "string", # 字符串类型映射为 JSON 的 "string"
int: "integer", # 整型类型映射为 JSON 的 "integer"
float: "number", # 浮点型映射为 JSON 的 "number"
bool: "boolean", # 布尔型映射为 JSON 的 "boolean"
list: "array", # 列表类型映射为 JSON 的 "array"
dict: "object", # 字典类型映射为 JSON 的 "object"
type(None): "null", # None 类型映射为 JSON 的 "null"
}
# 获取函数的签名信息
try:
signature = inspect.signature(func)
except ValueError as e:
# 如果获取签名失败,则抛出异常并显示具体的错误信息
raise ValueError(
f"无法获取函数 {func.__name__} 的签名: {str(e)}"
)
# 用于存储参数信息的字典
parameters = {}
for param in signature.parameters.values():
# 尝试获取参数的类型,如果无法找到对应的类型则默认设置为 "string"
try:
param_type = type_map.get(param.annotation, "string")
except KeyError as e:
# 如果参数类型不在 type_map 中,抛出异常并显示具体错误信息
raise KeyError(
f"未知的类型注解 {param.annotation},参数名为 {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, # 必须参数的列表
},
},
}