using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi;
///
/// 对话补全请求参数对象
///
public class ThorChatCompletionsRequest
{
[JsonPropertyName("store")] public bool? Store { get; set; }
///
/// 表示对话中支持的模态类型数组。可以为 null。
///
[JsonPropertyName("modalities")]
public string[]? Modalities { get; set; }
///
/// 表示对话中的音频请求参数。可以为 null。
///
[JsonPropertyName("audio")]
public ThorChatAudioRequest? Audio { get; set; }
///
/// 包含迄今为止对话的消息列表
///
[JsonPropertyName("messages")]
public List? Messages { get; set; }
///
/// 模型唯一编码值,如 gpt-4,gpt-3.5-turbo,moonshot-v1-8k,看底层具体平台定义
///
[JsonPropertyName("model")]
public string Model { get; set; }
///
/// 温度采样的替代方法称为核采样,介于 0 和 1 之间,其中模型考虑具有 top_p 概率质量的标记的结果。
/// 因此 0.1 意味着仅考虑包含前 10% 概率质量的标记。
/// 我们通常建议更改此项或 temperature ,但不要同时更改两者。
/// 默认 1
///
[JsonPropertyName("top_p")]
public float? TopP { get; set; }
///
/// 使用什么采样温度,介于 0 和 2 之间。
/// 较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定性。
/// 我们通常建议更改此项或 top_p ,但不要同时更改两者。
/// 默认 1
///
[JsonPropertyName("temperature")]
public float? Temperature { get; set; }
///
/// 为每条输入消息生成多少个结果
///
/// 默认为 1,不得大于 5。特别的,当 temperature 非常小靠近 0 的时候,
/// 我们只能返回 1 个结果,如果这个时候 n 已经设置并且 > 1,
/// 我们的服务会返回不合法的输入参数(invalid_request_error)
///
///
[JsonPropertyName("n")]
public int? N { get; set; }
///
/// 如果设置,将发送部分消息增量,就像在 ChatGPT 中一样。
/// 令牌可用时将作为仅数据服务器发送事件发送,流由 data: [DONE] 消息终止。
///
[JsonPropertyName("stream")]
public bool? Stream { get; set; }
///
/// 流响应选项。仅当您设置 stream: true 时才设置此项。
///
[JsonPropertyName("stream_options")]
public ThorStreamOptions? StreamOptions { get; set; }
///
/// 停止词,当全匹配这个(组)词后会停止输出,这个(组)词本身不会输出。
/// 最多不能超过 5 个字符串,每个字符串不得超过 32 字节,
/// 默认 null
///
[JsonIgnore]
public string? Stop { get; set; }
///
/// 停止词,当全匹配这个(组)词后会停止输出,这个(组)词本身不会输出。
/// 最多不能超过 5 个字符串,每个字符串不得超过 32 字节,
/// 默认 null
///
[JsonIgnore]
public IList? StopAsList { get; set; }
///
/// 停止词,当全匹配这个(组)词后会停止输出,这个(组)词本身不会输出。
/// 最多不能超过 5 个字符串,每个字符串不得超过 32 字节,
/// 默认 null
///
[JsonPropertyName("stop")]
public IList? StopCalculated
{
get
{
if (Stop is not null && StopAsList is not null)
{
throw new ValidationException(
"Stop 和 StopAsList 不能同时有值,其中一个应该为 null");
}
if (Stop is not null)
{
return new List { Stop };
}
return StopAsList;
}
}
///
/// 生成的答案允许的最大令牌数。默认情况下,模型可以返回的令牌数量为(4096个提示令牌)。
///
///
[JsonPropertyName("max_tokens")]
public int? MaxTokens { get; set; }
///
/// 可为补全生成的令牌数量的上限,包括可见输出令牌和推理令牌。
///
[JsonPropertyName("max_completion_tokens")]
public int? MaxCompletionTokens { get; set; }
///
/// 存在惩罚,介于 -2.0 到 2.0 之间的数字。
/// 正值会根据新生成的词汇是否出现在文本中来进行惩罚,增加模型讨论新话题的可能性,
/// 默认为 0
///
///
[JsonPropertyName("presence_penalty")]
public float? PresencePenalty { get; set; }
///
/// 频率惩罚,介于-2.0到2.0之间的数字。
/// 正值会根据新生成的词汇在文本中现有的频率来进行惩罚,减少模型一字不差重复同样话语的可能性.
/// 默认为 0
///
///
[JsonPropertyName("frequency_penalty")]
public float? FrequencyPenalty { get; set; }
///
/// 接受一个 JSON 对象,该对象将标记(由标记生成器中的标记 ID 指定)映射到从 -100 到 100 的关联偏差值。
/// 从数学上讲,偏差会在采样之前添加到模型生成的 logits 中。
/// 每个模型的确切效果会有所不同,但 -1 和 1 之间的值应该会降低或增加选择的可能性;
/// 像 -100 或 100 这样的值应该会导致相关令牌的禁止或独占选择。
///
///
[JsonPropertyName("logit_bias")]
public object? LogitBias { get; set; }
///
/// 是否返回输出标记的对数概率。如果为 true,则返回 message 的 content 中返回的每个输出标记的对数概率。
///
[JsonPropertyName("logprobs")]
public bool? Logprobs { get; set; }
///
/// 0 到 20 之间的整数,指定每个标记位置最有可能返回的标记数量,每个标记都有关联的对数概率。
/// 如果使用此参数, logprobs 必须设置为 true 。
///
[JsonPropertyName("top_logprobs")]
public int? TopLogprobs { get; set; }
///
/// 指定用于处理请求的延迟层。此参数与订阅规模层服务的客户相关:
/// 如果设置为“auto”,系统将使用规模等级积分,直至用完。
/// 如果设置为“default”,则将使用具有较低正常运行时间 SLA 且无延迟保证的默认服务层来处理请求。
/// 默认null
///
[JsonPropertyName("service_tier")]
public string? ServiceTier { get; set; }
///
/// 模型可能调用的工具列表。目前,仅支持函数作为工具。使用它来提供模型可以为其生成 JSON 输入的函数列表。最多支持 128 个功能。
///
[JsonPropertyName("tools")]
public List? Tools { get; set; }
///
/// 控制模型调用哪个(如果有)工具。
/// none 表示模型不会调用任何工具,而是生成一条消息。
/// auto 表示模型可以在生成消息或调用一个或多个工具之间进行选择。
/// required 表示模型必须调用一个或多个工具。
/// 通过 {"type": "function", "function": {"name": "my_function"}} 指定特定工具会强制模型调用该工具。
/// 当不存在任何工具时, none 是默认值。如果存在工具,则 auto 是默认值。
///
[JsonIgnore]
public ThorToolChoice? ToolChoice { get; set; }
[JsonPropertyName("tool_choice")]
public object? ToolChoiceCalculated
{
get
{
if (ToolChoice != null &&
ToolChoice.Type != ThorToolChoiceTypeConst.Function &&
ToolChoice.Function != null)
{
throw new ValidationException(
"当 type 为 \"function\" 时,属性 Function 不可为null。");
}
if (ToolChoice?.Type == ThorToolChoiceTypeConst.Function)
{
return ToolChoice;
}
return ToolChoice?.Type;
}
set
{
if (value is JsonElement jsonElement)
{
// if (jsonElement.ValueKind == JsonValueKind.String)
// {
// ToolChoice = new ThorToolChoice
// {
// Type = jsonElement.GetString()
// };
// }
if (jsonElement.ValueKind == JsonValueKind.Object)
{
ToolChoice = jsonElement.Deserialize();
}
}
else if (value is string text)
{
ToolChoice = new ThorToolChoice
{
Type = text
};
}
else
{
ToolChoice = (ThorToolChoice)value;
}
}
}
///
/// 设置为 {"type": "json_object"} 可启用 JSON 模式,从而保证模型生成的信息是有效的 JSON。
/// 当你将 response_format 设置为 {"type": "json_object"} 时,
/// 你需要在 prompt 中明确地引导模型输出 JSON 格式的内容,
/// 并告知模型该 JSON 的具体格式,否则将可能导致不符合预期的结果。
/// 默认为 {"type": "text"}
///
[JsonPropertyName("response_format")]
public ThorResponseFormat? ResponseFormat { get; set; }
[JsonPropertyName("metadata")] public Dictionary? Metadata { get; set; }
///
/// 此功能处于测试阶段。
/// 如果指定,我们的系统将尽最大努力进行确定性采样,
/// 以便具有相同 seed 和参数的重复请求应返回相同的结果。
/// 不保证确定性,您应该参考 system_fingerprint 响应参数来监控后端的变化。
///
[JsonPropertyName("seed")]
public int? Seed { get; set; }
///
/// 代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。
///
[JsonPropertyName("user")]
public string? User { get; set; }
[JsonPropertyName("thinking")] public ThorChatClaudeThinking? Thinking { get; set; }
[JsonPropertyName("enable_thinking")] public bool? EnableThinking { get; set; }
[JsonPropertyName("web_search_options")]
public ThorChatWebSearchOptions? WebSearchOptions { get; set; } = null;
[JsonPropertyName("reasoning_effort")] public string? ReasoningEffort { get; set; }
}