use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct StakpakProviderConfig {
pub api_key: String,
pub base_url: String,
pub user_agent: Option<String>,
}
impl StakpakProviderConfig {
pub fn new(api_key: impl Into<String>) -> Self {
Self {
api_key: api_key.into(),
base_url: "https://apiv2.stakpak.dev".to_string(),
user_agent: None,
}
}
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = base_url.into();
self
}
pub fn with_user_agent(mut self, user_agent: impl Into<String>) -> Self {
self.user_agent = Some(user_agent.into());
self
}
}
impl Default for StakpakProviderConfig {
fn default() -> Self {
Self {
api_key: std::env::var("STAKPAK_API_KEY").unwrap_or_else(|_| String::new()),
base_url: "https://apiv2.stakpak.dev".to_string(),
user_agent: None,
}
}
}
#[derive(Debug, Deserialize)]
pub struct StakpakResponse {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<StakpakChoice>,
pub usage: StakpakUsage,
}
#[derive(Debug, Deserialize)]
pub struct StakpakChoice {
pub message: StakpakMessage,
pub finish_reason: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct StakpakMessage {
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<StakpakToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct StakpakToolCall {
pub id: String,
#[serde(rename = "type")]
pub type_: String,
pub function: StakpakFunctionCall,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct StakpakFunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct StakpakUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_tokens_details: Option<StakpakPromptTokensDetails>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct StakpakPromptTokensDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_write_input_tokens: Option<u32>,
}