using System.ComponentModel;
public interface IFunctionCall
public partial class UserFunctionCall : IFunctionCall
public string Name { get; set; }
public UserFunctionCall(string name)
public readonly partial struct PresetFunctionCall : IFunctionCall, IEquatable<PresetFunctionCall>
private readonly string _value;
public PresetFunctionCall(string value)
_value = value ?? throw new ArgumentNullException(nameof(value));
private const string NoneValue = "none";
private const string AutoValue = "auto";
public static PresetFunctionCall None { get; } = new PresetFunctionCall(NoneValue);
public static PresetFunctionCall Auto { get; } = new PresetFunctionCall(AutoValue);
public static bool operator ==(PresetFunctionCall left, PresetFunctionCall right) => left.Equals(right);
public static bool operator !=(PresetFunctionCall left, PresetFunctionCall right) => !left.Equals(right);
public static implicit operator PresetFunctionCall(string value) => new PresetFunctionCall(value);
[EditorBrowsable(EditorBrowsableState.Never)]
public override bool Equals(object obj) => obj is PresetFunctionCall other && Equals(other);
public bool Equals(PresetFunctionCall other) =>
string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase);
[EditorBrowsable(EditorBrowsableState.Never)]
public override int GetHashCode() => _value?.GetHashCode() ?? 0;
public override string ToString() => _value;
public partial class ChatCompletions
public IFunctionCall FunctionCall { get; set; }
public ChatCompletions(IFunctionCall functionCall)
FunctionCall = functionCall;
public static void Main()
ChatCompletions c1 = new ChatCompletions(PresetFunctionCall.Auto);
ChatCompletions c2 = new ChatCompletions(PresetFunctionCall.None);
ChatCompletions c3 = new ChatCompletions(new UserFunctionCall("my_function"));
ChatCompletions c4 = new ChatCompletions(new UserFunctionCall("auto"));
ChatCompletions c5 = new ChatCompletions(new UserFunctionCall("none"));
Console.WriteLine(c1.FunctionCall);
Console.WriteLine(c2.FunctionCall);
Console.WriteLine(@$"{{ ""name"": ""{((UserFunctionCall)c3.FunctionCall).Name}"" }}");
Console.WriteLine(@$"{{ ""name"": ""{((UserFunctionCall)c4.FunctionCall).Name}"" }}");
Console.WriteLine(@$"{{ ""name"": ""{((UserFunctionCall)c5.FunctionCall).Name}"" }}");