use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "role", rename_all = "lowercase")]
pub enum ChatMessage {
#[serde(rename = "user")]
User { content: String },
#[serde(rename = "assistant")]
Assistant {
content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
tool_calls: Option<Vec<ToolCall>>,
},
#[serde(rename = "system")]
System { content: String },
#[serde(rename = "tool")]
Tool {
content: String,
tool_call_id: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCall {
pub id: String,
#[serde(rename = "type")]
pub call_type: ToolCallType,
pub function: FunctionCall,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ToolCallType {
#[serde(rename = "function")]
Function,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionDefinition {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionTool {
#[serde(rename = "type")]
pub tool_type: String,
pub function: FunctionDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolChoice {
None,
Auto,
Required,
#[serde(untagged)]
Named(ChatCompletionNamedToolChoice),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionNamedToolChoice {
#[serde(rename = "type")]
pub choice_type: String,
pub function: ChatCompletionNamedToolChoiceFunction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionNamedToolChoiceFunction {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChatModel {
#[serde(rename = "sarvam-105b")]
Sarvam105b,
#[serde(rename = "sarvam-30b")]
Sarvam30b,
#[serde(rename = "sarvam-m")]
SarvamM,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReasoningEffort {
Low,
Medium,
High,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum StopConfiguration {
String(String),
Array(Vec<String>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionRequest {
pub messages: Vec<ChatMessage>,
pub model: ChatModel,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<StopConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency_penalty: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presence_penalty: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wiki_grounding: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ChatCompletionTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
}
impl Default for ChatCompletionRequest {
fn default() -> Self {
Self {
messages: Vec::new(),
model: ChatModel::Sarvam30b,
temperature: None,
top_p: None,
reasoning_effort: None,
max_tokens: None,
stream: None,
stop: None,
n: None,
seed: None,
frequency_penalty: None,
presence_penalty: None,
wiki_grounding: None,
tools: None,
tool_choice: None,
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChatCompletionResponse {
pub id: String,
pub choices: Vec<Choice>,
pub created: i64,
pub model: String,
pub object: String,
#[serde(default)]
pub usage: Option<CompletionUsage>,
#[serde(default)]
pub system_fingerprint: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Choice {
pub finish_reason: FinishReason,
pub index: u32,
pub message: ChatCompletionResponseMessage,
#[serde(default)]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FinishReason {
Stop,
Length,
ToolCalls,
ContentFilter,
FunctionCall,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChatCompletionResponseMessage {
pub content: Option<String>,
pub role: Role,
#[serde(default)]
pub reasoning_content: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<ToolCall>>,
#[serde(default)]
pub refusal: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub enum Role {
#[serde(rename = "assistant")]
Assistant,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CompletionUsage {
pub completion_tokens: u32,
pub prompt_tokens: u32,
pub total_tokens: u32,
#[serde(default)]
pub completion_tokens_details: Option<serde_json::Value>,
#[serde(default)]
pub prompt_tokens_details: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChatCompletionChunk {
pub id: String,
pub choices: Vec<ChunkChoice>,
pub created: i64,
pub model: String,
pub object: String,
#[serde(default)]
pub system_fingerprint: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChunkChoice {
pub index: u32,
pub delta: ChunkDelta,
#[serde(default)]
pub finish_reason: Option<FinishReason>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChunkDelta {
#[serde(default)]
pub content: Option<String>,
#[serde(default)]
pub role: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<ChunkToolCall>>,
#[serde(default)]
pub reasoning_content: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChunkToolCall {
pub index: u32,
#[serde(default)]
pub id: Option<String>,
#[serde(rename = "type", default)]
pub call_type: Option<String>,
#[serde(default)]
pub function: Option<ChunkFunctionCall>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ChunkFunctionCall {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub arguments: Option<String>,
}