using System.Text.Json;
using System.Text.Json.Serialization;
namespace Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi;
///
/// 函数参数是JSON格式对象
/// https://json-schema.org/understanding-json-schema/reference/object.html
///
///
/// 定义属性示例:
/// [JsonPropertyName("location")]
/// public ThorToolFunctionPropertyDefinition Location = ThorToolFunctionPropertyDefinition.DefineString("The city and state, e.g. San Francisco, CA");
///
/// [JsonPropertyName("unit")]
/// public ThorToolFunctionPropertyDefinition Unit = ThorToolFunctionPropertyDefinition.DefineEnum(["celsius", "fahrenheit"]);
///
public class ThorToolFunctionPropertyDefinition
{
///
/// 定义了函数对象的类型枚举
///
public enum FunctionObjectTypes
{
///
/// 表示字符串类型的函数对象
///
String,
///
/// 表示整数类型的函数对象
///
Integer,
///
/// 表示数字(包括浮点数等)类型的函数对象
///
Number,
///
/// 表示对象类型的函数对象
///
Object,
///
/// 表示数组类型的函数对象
///
Array,
///
/// 表示布尔类型的函数对象
///
Boolean,
///
/// 表示空值类型的函数对象
///
Null
}
public string typeStr = "object";
public string[] Types;
///
/// 必填的。函数参数对象类型。默认值为“object”。
///
[JsonPropertyName("type")]
public object Type
{
get
{
if (Types is { Length: > 0 })
{
return Types;
}
return typeStr;
}
set
{
if (value is JsonElement str)
{
switch (str.ValueKind)
{
case JsonValueKind.String:
typeStr = value?.ToString();
break;
case JsonValueKind.Array:
Types = JsonSerializer.Deserialize(value?.ToString());
break;
}
}
else
{
typeStr = value?.ToString();
}
}
}
///
/// 可选。“函数参数”列表,作为从参数名称映射的字典
/// 对于描述类型的对象,可能还有可能的枚举值等等。
///
[JsonPropertyName("properties")]
public IDictionary? Properties { get; set; }
///
/// 可选。列出必需的“function arguments”列表。
///
[JsonPropertyName("required")]
public string[]? Required { get; set; }
///
/// 可选。是否允许附加属性。默认值为true。
///
[JsonPropertyName("additionalProperties")]
public object? AdditionalProperties { get; set; }
///
/// 可选。参数描述。
///
[JsonPropertyName("description")]
public string? Description { get; set; }
///
/// 可选。此参数的允许值列表。
///
[JsonPropertyName("enum")]
public List? Enum { get; set; }
///
/// 可以使用minProperties和maxProperties关键字限制对象上的属性数量。每一个
/// 这些必须是非负整数。
///
[JsonPropertyName("minProperties")]
public int? MinProperties { get; set; }
///
/// 可以使用minProperties和maxProperties关键字限制对象上的属性数量。每一个
/// 这些必须是非负整数。
///
[JsonPropertyName("maxProperties")]
public int? MaxProperties { get; set; }
///
/// 如果type为“array”,则指定数组中所有项目的元素类型。
/// 如果类型不是“array”,则应为null。
/// 有关更多详细信息,请参阅 https://json-schema.org/understanding-json-schema/reference/array.html
///
[JsonPropertyName("items")]
public ThorToolFunctionPropertyDefinition? Items { get; set; }
///
/// 定义数组
///
///
///
public static ThorToolFunctionPropertyDefinition DefineArray(ThorToolFunctionPropertyDefinition? arrayItems = null)
{
return new ThorToolFunctionPropertyDefinition
{
Items = arrayItems,
Type = ConvertTypeToString(FunctionObjectTypes.Array)
};
}
///
/// 定义枚举
///
///
///
///
public static ThorToolFunctionPropertyDefinition DefineEnum(List enumList, string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Enum = enumList,
Type = ConvertTypeToString(FunctionObjectTypes.String)
};
}
///
/// 定义整型
///
///
///
public static ThorToolFunctionPropertyDefinition DefineInteger(string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Type = ConvertTypeToString(FunctionObjectTypes.Integer)
};
}
///
/// 定义数字
///
///
///
public static ThorToolFunctionPropertyDefinition DefineNumber(string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Type = ConvertTypeToString(FunctionObjectTypes.Number)
};
}
///
/// 定义字符串
///
///
///
public static ThorToolFunctionPropertyDefinition DefineString(string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Type = ConvertTypeToString(FunctionObjectTypes.String)
};
}
///
/// 定义布尔值
///
///
///
public static ThorToolFunctionPropertyDefinition DefineBoolean(string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Type = ConvertTypeToString(FunctionObjectTypes.Boolean)
};
}
///
/// 定义null
///
///
///
public static ThorToolFunctionPropertyDefinition DefineNull(string? description = null)
{
return new ThorToolFunctionPropertyDefinition
{
Description = description,
Type = ConvertTypeToString(FunctionObjectTypes.Null)
};
}
///
/// 定义对象
///
///
///
///
///
///
///
public static ThorToolFunctionPropertyDefinition DefineObject(
IDictionary? properties,
string[]? required,
object? additionalProperties,
string? description,
List? @enum)
{
return new ThorToolFunctionPropertyDefinition
{
Properties = properties,
Required = required,
AdditionalProperties = additionalProperties,
Description = description,
Enum = @enum,
Type = ConvertTypeToString(FunctionObjectTypes.Object)
};
}
///
/// 将 `FunctionObjectTypes` 枚举值转换为其对应的字符串表示形式。
///
/// 要转换的类型
/// 给定类型的字符串表示形式
public static string ConvertTypeToString(FunctionObjectTypes type)
{
return type switch
{
FunctionObjectTypes.String => "string",
FunctionObjectTypes.Integer => "integer",
FunctionObjectTypes.Number => "number",
FunctionObjectTypes.Object => "object",
FunctionObjectTypes.Array => "array",
FunctionObjectTypes.Boolean => "boolean",
FunctionObjectTypes.Null => "null",
_ => throw new ArgumentOutOfRangeException(nameof(type), $"Unknown type: {type}")
};
}
}