use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RabThinkingFormat {
#[default]
#[serde(rename = "openai")]
OpenAi,
#[serde(rename = "openrouter")]
OpenRouter,
#[serde(rename = "deepseek")]
DeepSeek,
#[serde(rename = "together")]
Together,
#[serde(rename = "zai")]
Zai,
#[serde(rename = "qwen")]
Qwen,
#[serde(rename = "chat-template")]
ChatTemplate,
#[serde(rename = "qwen-chat-template")]
QwenChatTemplate,
#[serde(rename = "string-thinking")]
StringThinking,
#[serde(rename = "ant-ling")]
AntLing,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RabMaxTokensField {
#[serde(rename = "max_tokens")]
MaxTokens,
#[default]
#[serde(rename = "max_completion_tokens")]
MaxCompletionTokens,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct RabOpenAiCompat {
pub supports_store: bool,
pub supports_developer_role: bool,
pub supports_reasoning_effort: bool,
pub supports_thinking_control: bool,
pub supports_usage_in_streaming: bool,
pub max_tokens_field: RabMaxTokensField,
pub requires_tool_result_name: bool,
pub requires_assistant_after_tool_result: bool,
pub requires_thinking_as_text: bool,
pub requires_reasoning_content_on_assistant_messages: bool,
pub thinking_format: RabThinkingFormat,
pub supports_strict_mode: bool,
pub supports_long_cache_retention: bool,
}
impl Default for RabOpenAiCompat {
fn default() -> Self {
Self {
supports_store: true,
supports_developer_role: true,
supports_reasoning_effort: true,
supports_thinking_control: false,
supports_usage_in_streaming: true,
max_tokens_field: RabMaxTokensField::MaxCompletionTokens,
requires_tool_result_name: false,
requires_assistant_after_tool_result: false,
requires_thinking_as_text: false,
requires_reasoning_content_on_assistant_messages: false,
thinking_format: RabThinkingFormat::OpenAi,
supports_strict_mode: true,
supports_long_cache_retention: true,
}
}
}