use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use crate::error::OpenAIError;
use crate::types::chat::{ChatCompletionTool, ImageDetail, InputAudio, ResponseFormat};
use crate::types::graders::{
GraderLabelModel, GraderPython, GraderScoreModel, GraderStringCheck, GraderTextSimilarity,
};
use crate::types::responses::{ResponseTextParam, Tool};
use crate::types::Metadata;
pub use crate::types::responses::{EasyInputMessage, InputTextContent, ReasoningEffort};
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct Eval {
pub object: String,
pub id: String,
pub name: String,
pub data_source_config: EvalDataSourceConfig,
pub testing_criteria: Vec<EvalTestingCriterion>,
pub created_at: u64,
pub metadata: Metadata,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalDataSourceConfig {
Custom(EvalCustomDataSourceConfig),
Logs(EvalLogsDataSourceConfig),
#[serde(rename = "stored_completions")]
StoredCompletions(EvalStoredCompletionsDataSourceConfig),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalCustomDataSourceConfig {
#[serde(rename = "type")]
pub r#type: String,
pub schema: serde_json::Value,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalLogsDataSourceConfig {
#[serde(rename = "type")]
pub r#type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
pub schema: serde_json::Value,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalStoredCompletionsDataSourceConfig {
#[serde(rename = "type")]
pub r#type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
pub schema: serde_json::Value,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalTestingCriterion {
LabelModel(EvalGraderLabelModel),
StringCheck(EvalGraderStringCheck),
TextSimilarity(EvalGraderTextSimilarity),
Python(EvalGraderPython),
ScoreModel(EvalGraderScoreModel),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(transparent)]
pub struct EvalGraderLabelModel(pub GraderLabelModel);
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(transparent)]
pub struct EvalGraderStringCheck(pub GraderStringCheck);
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalGraderTextSimilarity {
#[serde(flatten)]
pub grader: GraderTextSimilarity,
pub pass_threshold: f64,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TextSimilarityMetric {
Cosine,
FuzzyMatch,
Bleu,
Gleu,
Meteor,
Rouge1,
Rouge2,
Rouge3,
Rouge4,
Rouge5,
RougeL,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalGraderPython {
#[serde(flatten)]
pub grader: GraderPython,
pub pass_threshold: Option<f64>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct SamplingParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalGraderScoreModel {
#[serde(flatten)]
pub grader: GraderScoreModel,
pub pass_threshold: Option<f64>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalItem {
pub role: EvalItemRole,
pub content: EvalItemContent,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum EvalItemRole {
User,
Assistant,
System,
Developer,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalItemContentOutputText {
pub text: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalItemInputImage {
pub image_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub detail: Option<ImageDetail>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum EvalItemContent {
Array(Vec<EvalItemContentItem>),
Single(EvalItemContentItem),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalItemContentItem {
InputText(InputTextContent),
OutputText(EvalItemContentOutputText),
InputImage(EvalItemInputImage),
InputAudio(InputAudio),
#[serde(untagged)]
Text(String),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalList {
pub object: String,
pub data: Vec<Eval>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Serialize, Clone, Builder, PartialEq, Default)]
#[builder(name = "CreateEvalRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateEvalRequest {
pub name: Option<String>,
pub data_source_config: CreateEvalDataSourceConfig,
pub testing_criteria: Vec<CreateEvalTestingCriterion>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CreateEvalDataSourceConfig {
Custom(CreateEvalCustomDataSourceConfig),
Logs(CreateEvalLogsDataSourceConfig),
}
impl Default for CreateEvalDataSourceConfig {
fn default() -> Self {
Self::Custom(CreateEvalCustomDataSourceConfig::default())
}
}
#[derive(Debug, Serialize, Clone, PartialEq, Builder, Default)]
#[builder(name = "CreateEvalCustomDataSourceConfigArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateEvalCustomDataSourceConfig {
pub item_schema: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_sample_schema: Option<bool>,
}
#[derive(Debug, Serialize, Clone, PartialEq, Builder, Default)]
#[builder(name = "CreateEvalLogsDataSourceConfigArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateEvalLogsDataSourceConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CreateEvalTestingCriterion {
LabelModel(CreateEvalLabelModelGrader),
StringCheck(EvalGraderStringCheck),
TextSimilarity(EvalGraderTextSimilarity),
Python(EvalGraderPython),
ScoreModel(EvalGraderScoreModel),
}
#[derive(Debug, Serialize, Clone, PartialEq, Builder, Default)]
#[builder(name = "CreateEvalLabelModelGraderArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateEvalLabelModelGrader {
pub name: String,
pub model: String,
pub input: Vec<CreateEvalItem>,
pub labels: Vec<String>,
pub passing_labels: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct SimpleInputMessage {
pub role: String,
pub content: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CreateEvalItem {
Message(EvalItem),
#[serde(untagged)]
Simple(SimpleInputMessage),
}
#[derive(Debug, Serialize, Clone, Builder, PartialEq, Default)]
#[builder(name = "UpdateEvalRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct UpdateEvalRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct DeleteEvalResponse {
pub object: String,
pub deleted: bool,
pub eval_id: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRun {
pub object: String,
pub id: String,
pub eval_id: String,
pub status: EvalRunStatus,
pub model: String,
pub name: String,
pub created_at: u64,
pub report_url: String,
pub result_counts: EvalRunResultCounts,
pub per_model_usage: Option<Vec<EvalRunModelUsage>>,
pub per_testing_criteria_results: Option<Vec<EvalRunTestingCriteriaResult>>,
pub data_source: EvalRunDataSource,
pub metadata: Metadata,
pub error: Option<EvalApiError>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum EvalRunStatus {
Queued,
InProgress,
Completed,
Failed,
Canceled,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunResultCounts {
pub total: u32,
pub errored: u32,
pub failed: u32,
pub passed: u32,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunModelUsage {
pub model_name: String,
pub invocation_count: u32,
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
pub cached_tokens: u32,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunTestingCriteriaResult {
pub testing_criteria: String,
pub passed: u32,
pub failed: u32,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalRunDataSource {
Jsonl(CreateEvalJsonlRunDataSource),
Completions(CreateEvalCompletionsRunDataSource),
Responses(CreateEvalResponsesRunDataSource),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct CreateEvalJsonlRunDataSource {
pub source: EvalJsonlSource,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalJsonlSource {
FileContent(EvalJsonlFileContentSource),
FileId(EvalJsonlFileIdSource),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalJsonlFileContentSource {
pub content: Vec<EvalJsonlContentItem>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalJsonlFileIdSource {
pub id: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalJsonlContentItem {
pub item: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct CreateEvalCompletionsRunDataSource {
pub input_messages: EvalInputMessages,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling_params: Option<EvalSamplingParams>,
pub model: String,
pub source: EvalCompletionsSource,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct TemplateInputMessages {
pub template: Vec<CreateEvalItem>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct ItemReference {
pub item_reference: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalInputMessages {
Template(TemplateInputMessages),
ItemReference(ItemReference),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)]
pub struct EvalSamplingParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ChatCompletionTool>>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)]
pub struct EvalResponsesSamplingParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<ResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextParam>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalCompletionsSource {
FileContent(EvalJsonlFileContentSource),
FileId(EvalJsonlFileIdSource),
StoredCompletions(EvalStoredCompletionsSource),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalStoredCompletionsSource {
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_after: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_before: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct CreateEvalResponsesRunDataSource {
#[serde(skip_serializing_if = "Option::is_none")]
pub input_messages: Option<EvalInputMessages>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling_params: Option<EvalResponsesSamplingParams>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
pub source: EvalResponsesRunSource,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum EvalResponsesRunSource {
FileContent(EvalJsonlFileContentSource),
FileId(EvalJsonlFileIdSource),
Responses(EvalResponsesSource),
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalResponsesSource {
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions_search: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_after: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_before: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
#[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 users: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<String>>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunList {
pub object: String,
pub data: Vec<EvalRun>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Serialize, Clone, Builder, PartialEq, Default)]
#[builder(name = "CreateEvalRunRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateEvalRunRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub data_source: CreateEvalRunDataSource,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CreateEvalRunDataSource {
Jsonl(CreateEvalJsonlRunDataSource),
Completions(CreateEvalCompletionsRunDataSource),
Responses(CreateEvalResponsesRunDataSource),
}
impl Default for CreateEvalRunDataSource {
fn default() -> Self {
todo!()
}
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct DeleteEvalRunResponse {
pub object: String,
pub deleted: bool,
pub run_id: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunOutputItem {
pub object: String,
pub id: String,
pub run_id: String,
pub eval_id: String,
pub created_at: u64,
pub status: String,
pub datasource_item_id: u64,
pub datasource_item: serde_json::Value,
pub results: Vec<EvalRunOutputItemResult>,
pub sample: EvalRunOutputItemSample,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunOutputItemResult {
pub name: String,
pub score: f64,
pub passed: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct SimpleOutputMessage {
pub role: String,
pub content: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunOutputItemSample {
pub input: Vec<SimpleInputMessage>,
pub output: Vec<SimpleOutputMessage>,
pub finish_reason: String,
pub model: String,
pub usage: EvalRunOutputItemUsage,
pub error: Option<EvalApiError>,
pub temperature: f64,
pub max_completion_tokens: i32,
pub top_p: f64,
pub seed: i32,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunOutputItemUsage {
pub total_tokens: i32,
pub completion_tokens: i32,
pub prompt_tokens: i32,
pub cached_tokens: i32,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalRunOutputItemList {
pub object: String,
pub data: Vec<EvalRunOutputItem>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct EvalApiError {
pub code: String,
pub message: String,
}