use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum JobType {
PromptLearning,
Sft,
Rl,
Gspo,
Eval,
ResearchAgent,
Inference,
}
impl Default for JobType {
fn default() -> Self {
Self::PromptLearning
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum JobStatus {
Pending,
Queued,
Running,
Paused,
Succeeded,
Failed,
Cancelled,
}
impl JobStatus {
pub fn is_terminal(&self) -> bool {
matches!(self, Self::Succeeded | Self::Failed | Self::Cancelled)
}
pub fn is_success(&self) -> bool {
matches!(self, Self::Succeeded)
}
}
impl Default for JobStatus {
fn default() -> Self {
Self::Pending
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProviderName {
Openai,
Groq,
Google,
Anthropic,
Together,
Fireworks,
Bedrock,
Azure,
}
impl Default for ProviderName {
fn default() -> Self {
Self::Openai
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum InferenceMode {
Standard,
Batched,
Streaming,
SynthHosted,
}
impl Default for InferenceMode {
fn default() -> Self {
Self::Standard
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RewardSource {
#[serde(alias = "task_app")]
Container,
Verifier,
Fused,
Environment,
Runner,
Evaluator,
Human,
}
impl Default for RewardSource {
fn default() -> Self {
Self::Container
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RewardType {
Shaped,
Sparse,
Penalty,
Evaluator,
Human,
Achievement,
AchievementDelta,
UniqueAchievementDelta,
}
impl Default for RewardType {
fn default() -> Self {
Self::Sparse
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RewardScope {
Event,
Outcome,
}
impl Default for RewardScope {
fn default() -> Self {
Self::Outcome
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ObjectiveKey {
Reward,
LatencyMs,
CostUsd,
TokensTotal,
TurnsCount,
}
impl Default for ObjectiveKey {
fn default() -> Self {
Self::Reward
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ObjectiveDirection {
Maximize,
Minimize,
}
impl Default for ObjectiveDirection {
fn default() -> Self {
Self::Maximize
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OutputMode {
ToolCalls,
Text,
Structured,
}
impl Default for OutputMode {
fn default() -> Self {
Self::Text
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SuccessStatus {
Success,
Timeout,
NetworkError,
ApplyFailed,
RuntimeError,
Failure,
}
impl SuccessStatus {
pub fn is_success(&self) -> bool {
matches!(self, Self::Success)
}
}
impl Default for SuccessStatus {
fn default() -> Self {
Self::Success
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GraphType {
Sequential,
Parallel,
Conditional,
Loop,
Policy,
Verifier,
Rlm,
}
impl Default for GraphType {
fn default() -> Self {
Self::Sequential
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OptimizationMode {
Online,
Offline,
Hybrid,
Auto,
GraphOnly,
PromptOnly,
}
impl Default for OptimizationMode {
fn default() -> Self {
Self::Online
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VerifierMode {
Binary,
Rubric,
Criteria,
Custom,
Contrastive,
GoldExamples,
}
impl Default for VerifierMode {
fn default() -> Self {
Self::Binary
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TrainingType {
Sft,
Rl,
Dpo,
Ppo,
Grpo,
Gepa,
GraphEvolve,
Graphgen,
Gspo,
}
impl Default for TrainingType {
fn default() -> Self {
Self::Sft
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AdaptiveCurriculumLevel {
Easy,
Medium,
Hard,
Expert,
#[serde(alias = "NONE")]
None,
#[serde(alias = "LOW")]
Low,
#[serde(alias = "MODERATE")]
Moderate,
#[serde(alias = "HIGH")]
High,
}
impl Default for AdaptiveCurriculumLevel {
fn default() -> Self {
Self::Medium
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AdaptiveBatchLevel {
Small,
Medium,
Large,
Auto,
#[serde(alias = "NONE")]
None,
#[serde(alias = "LOW")]
Low,
#[serde(alias = "MODERATE")]
Moderate,
#[serde(alias = "HIGH")]
High,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SynthModelName {
SynthSmall,
SynthMedium,
}
impl Default for AdaptiveBatchLevel {
fn default() -> Self {
Self::Auto
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_job_status_terminal() {
assert!(!JobStatus::Pending.is_terminal());
assert!(!JobStatus::Running.is_terminal());
assert!(!JobStatus::Paused.is_terminal());
assert!(JobStatus::Succeeded.is_terminal());
assert!(JobStatus::Failed.is_terminal());
assert!(JobStatus::Cancelled.is_terminal());
}
#[test]
fn test_serde_roundtrip() {
let status = JobStatus::Running;
let json = serde_json::to_string(&status).unwrap();
assert_eq!(json, "\"running\"");
let parsed: JobStatus = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, status);
}
#[test]
fn test_success_status() {
assert!(SuccessStatus::Success.is_success());
assert!(!SuccessStatus::Failure.is_success());
assert!(!SuccessStatus::Timeout.is_success());
}
}