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}") }; } }