use modkit_macros::domain_model;
use uuid::Uuid;
use crate::config::EstimationBudgets;
use crate::infra::db::entity::quota_usage::PeriodType;
use mini_chat_sdk::{ModelApiParams, ModelToolSupport, models::WebSearchContextSize};
#[domain_model]
#[derive(Debug, Clone)]
pub enum PreflightDecision {
Allow {
effective_model: String,
effective_provider_model_id: String,
reserve_tokens: i64,
max_output_tokens_applied: i32,
reserved_credits_micro: i64,
policy_version_applied: i64,
minimal_generation_floor_applied: i32,
system_prompt: String,
context_window: u32,
max_input_tokens: u32,
estimation_budgets: EstimationBudgets,
file_search_max_num_results: u32,
max_tool_calls: u32,
tool_support: ModelToolSupport,
api_params: ModelApiParams,
web_search_context_size: WebSearchContextSize,
},
Downgrade {
effective_model: String,
effective_provider_model_id: String,
reserve_tokens: i64,
max_output_tokens_applied: i32,
reserved_credits_micro: i64,
policy_version_applied: i64,
minimal_generation_floor_applied: i32,
downgrade_from: String,
downgrade_reason: DowngradeReason,
system_prompt: String,
context_window: u32,
max_input_tokens: u32,
estimation_budgets: EstimationBudgets,
file_search_max_num_results: u32,
max_tool_calls: u32,
tool_support: ModelToolSupport,
api_params: ModelApiParams,
web_search_context_size: WebSearchContextSize,
},
Reject {
error_code: String,
http_status: u16,
quota_scope: String,
},
}
#[domain_model]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DowngradeReason {
PremiumQuotaExhausted,
ForceStandardTier,
DisablePremiumTier,
ModelDisabled,
}
impl DowngradeReason {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::PremiumQuotaExhausted => "premium_quota_exhausted",
Self::ForceStandardTier => "force_standard_tier",
Self::DisablePremiumTier => "disable_premium_tier",
Self::ModelDisabled => "model_disabled",
}
}
}
#[domain_model]
#[derive(Debug, Clone)]
pub struct SettlementOutcome {
pub settlement_method: SettlementMethod,
pub actual_credits_micro: i64,
pub charged_tokens: u64,
pub overshoot_capped: bool,
}
#[domain_model]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SettlementMethod {
Actual,
Estimated,
Released,
}
#[domain_model]
#[allow(clippy::struct_excessive_bools)]
pub struct PreflightInput {
pub tenant_id: Uuid,
pub user_id: Uuid,
pub selected_model: String,
pub utf8_bytes: u64,
pub num_images: u32,
pub tools_enabled: bool,
pub web_search_enabled: bool,
pub code_interpreter_enabled: bool,
pub max_output_tokens_cap: u32,
pub prior_context_tokens: u64,
}
#[domain_model]
pub struct SettlementInput {
pub tenant_id: Uuid,
pub user_id: Uuid,
pub effective_model: String,
pub policy_version_applied: i64,
pub reserve_tokens: i64,
pub max_output_tokens_applied: i32,
pub reserved_credits_micro: i64,
pub minimal_generation_floor_applied: i32,
pub settlement_path: SettlementPath,
pub period_starts: Vec<(PeriodType, time::Date)>,
pub web_search_calls: u32,
pub code_interpreter_calls: u32,
}
#[domain_model]
pub enum SettlementPath {
Actual {
input_tokens: i64,
output_tokens: i64,
},
Estimated,
Released,
}
#[domain_model]
#[derive(Debug, Clone)]
pub struct QuotaStatusResult {
pub tiers: Vec<TierResult>,
pub warning_threshold_pct: u8,
}
#[domain_model]
#[derive(Debug, Clone)]
pub struct TierResult {
pub tier: crate::domain::stream_events::QuotaTier,
pub periods: Vec<PeriodResult>,
}
#[domain_model]
#[derive(Debug, Clone)]
pub struct PeriodResult {
pub period: crate::domain::stream_events::QuotaPeriod,
pub limit_credits_micro: i64,
pub used_credits_micro: i64,
pub remaining_credits_micro: i64,
pub remaining_percentage: u8,
pub next_reset: time::OffsetDateTime,
pub warning: bool,
pub exhausted: bool,
}