use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
pub enum ProtocolVersion {
#[serde(rename = "7")]
V7,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
pub enum AdapterRequest {
PlanServe {
protocol_version: ProtocolVersion,
input: PlanServeInput,
},
RenderServe {
protocol_version: ProtocolVersion,
input: RenderServeInput,
},
}
impl AdapterRequest {
#[must_use]
pub const fn protocol_version(&self) -> ProtocolVersion {
match self {
Self::PlanServe {
protocol_version, ..
}
| Self::RenderServe {
protocol_version, ..
} => *protocol_version,
}
}
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct PlanServeInput {
pub model: ServeModelInput,
pub topology: ServeTopology,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gateway_backend: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pd_router_backend: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kv_transfer: Option<KvTransferMechanism>,
pub roles: Vec<ServeRoleInput>,
#[serde(default)]
pub profiling: bool,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RenderServeInput {
pub model: ServeModelInput,
pub topology: ServeTopology,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gateway_backend: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pd_router_backend: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kv_transfer: Option<KvTransferMechanism>,
pub allocations: Vec<ServeProcessAllocation>,
#[serde(default)]
pub profiling: bool,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ServeTopology {
Single,
PrefillDecode,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ServeRoleKind {
Serve,
Prefill,
Decode,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum KvTransferMechanism {
Mooncake,
Nixl,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ServeRoleInput {
pub id: String,
pub kind: ServeRoleKind,
pub replica_count: u32,
pub parallelism: Parallelism,
pub settings: BTreeMap<String, SettingValue>,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ServeRoleResult {
pub id: String,
pub kind: ServeRoleKind,
pub declared_replica_count: u32,
pub effective_replica_count: u32,
pub effective_settings: BTreeMap<String, SettingValue>,
pub effective_parallelism: Parallelism,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub public_endpoint: Option<EndpointRequirement>,
#[serde(default)]
pub render_inputs: Vec<RenderInputDeclaration>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct Parallelism {
#[serde(skip_serializing_if = "Option::is_none")]
pub outer: Option<ParallelismOuter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attention: Option<ParallelismAttention>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experts: Option<ParallelismExperts>,
}
impl Parallelism {
pub fn merge_from(&mut self, other: &Self) {
if let Some(other) = &other.outer {
self.outer.get_or_insert_default().merge_from(other);
}
if let Some(other) = &other.attention {
self.attention.get_or_insert_default().merge_from(other);
}
if let Some(other) = &other.experts {
self.experts.get_or_insert_default().merge_from(other);
}
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct ParallelismOuter {
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub tensor_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub pipeline_parallel_size: Option<u32>,
}
impl ParallelismOuter {
fn merge_from(&mut self, other: &Self) {
if other.tensor_parallel_size.is_some() {
self.tensor_parallel_size = other.tensor_parallel_size;
}
if other.pipeline_parallel_size.is_some() {
self.pipeline_parallel_size = other.pipeline_parallel_size;
}
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct ParallelismAttention {
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub tensor_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub data_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub context_parallel_size: Option<u32>,
}
impl ParallelismAttention {
fn merge_from(&mut self, other: &Self) {
if other.tensor_parallel_size.is_some() {
self.tensor_parallel_size = other.tensor_parallel_size;
}
if other.data_parallel_size.is_some() {
self.data_parallel_size = other.data_parallel_size;
}
if other.context_parallel_size.is_some() {
self.context_parallel_size = other.context_parallel_size;
}
}
}
#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct ParallelismExperts {
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub tensor_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub data_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub expert_parallel_size: Option<u32>,
#[schemars(range(min = 1))]
#[serde(skip_serializing_if = "Option::is_none")]
pub dense_tensor_parallel_size: Option<u32>,
}
impl ParallelismExperts {
fn merge_from(&mut self, other: &Self) {
if other.tensor_parallel_size.is_some() {
self.tensor_parallel_size = other.tensor_parallel_size;
}
if other.data_parallel_size.is_some() {
self.data_parallel_size = other.data_parallel_size;
}
if other.expert_parallel_size.is_some() {
self.expert_parallel_size = other.expert_parallel_size;
}
if other.dense_tensor_parallel_size.is_some() {
self.dense_tensor_parallel_size = other.dense_tensor_parallel_size;
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ServeModelInput {
pub id: String,
pub served_name: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementModelInput {
pub locator: String,
pub served_name: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EndpointAssignment {
pub host: String,
pub port: u16,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ClientEndpointInput {
pub protocol: EndpointProtocol,
pub host: String,
pub port: u16,
pub completions_path: String,
pub chat_completions_path: String,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum EvalDefinitionInput {
#[serde(rename = "openai_smoke")]
OpenAiSmoke {
prompt: String,
max_tokens: u32,
timeout_seconds: u64,
},
LmEval {
task: Box<EvalTaskSourceInput>,
#[serde(default)]
request_body: BTreeMap<String, SettingValue>,
limit: Option<u32>,
few_shot: Option<u32>,
seed: Option<u64>,
trials: u32,
max_tokens: Option<u32>,
concurrency: Option<u32>,
metric: String,
#[serde(default)]
metric_filter: Option<String>,
threshold: f64,
timeout_seconds: u64,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum EvalTaskSourceInput {
BuiltIn { name: String },
Bundled {
name: String,
task_identity: String,
path: PathBuf,
task_closure_sha256: String,
task_definition_sha256: String,
prompt_asset_sha256: String,
dataset_asset_sha256: String,
scorer_sha256: String,
},
WorkspaceYaml { path: PathBuf },
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchDefinitionInput {
pub request_source: BenchRequestSourceInput,
pub seed: u64,
#[serde(default)]
pub request_body: BTreeMap<String, SettingValue>,
#[serde(default)]
pub request_slo: Option<BenchRequestSloInput>,
pub timeout_seconds: u64,
#[serde(default)]
pub reset_prefix_cache: bool,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum BenchRequestSourceInput {
Random {
input_tokens: u32,
output_tokens: u32,
#[serde(default)]
prefix_sharing: Option<BenchPrefixSharingInput>,
},
RandomMixture {
shapes: Vec<BenchRandomShapeInput>,
total_weight: u64,
},
Dataset {
dataset: BenchDatasetInput,
max_input_tokens: u32,
output_tokens: Option<u32>,
catalog: BenchDatasetCatalogInput,
},
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchPrefixSharingInput {
pub shared_prefix_ratio: f64,
pub shared_prefix_tokens: u32,
pub unique_suffix_tokens: u32,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchRandomShapeInput {
pub input_tokens: u32,
pub output_tokens: u32,
pub weight: u32,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum BenchDatasetInput {
Sharegpt,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchDatasetCatalogInput {
pub upstream_identity: String,
pub url: String,
pub sha256: String,
pub source_format: String,
pub license: String,
pub cache_path: PathBuf,
pub cache_state: BenchDatasetCacheState,
pub materialization_identity: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum BenchDatasetCacheState {
Missing,
Present,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchPopulationInput {
pub path: PathBuf,
pub sha256: String,
pub entries: u32,
pub tpot_applicable: bool,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchDatasetPreparationRequest {
pub protocol_version: ProtocolVersion,
pub model: MeasurementModelInput,
pub request_source: BenchRequestSourceInput,
pub source_path: PathBuf,
pub required_entries: u32,
pub seed: u64,
#[serde(default)]
pub request_body: BTreeMap<String, SettingValue>,
pub artifact_dir: PathBuf,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchTokenCountSummary {
pub minimum: u32,
pub maximum: u32,
pub mean: f64,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchDatasetPreparationResult {
pub schema_version: u32,
pub status: ClientStatus,
pub materialization_identity: String,
pub requested_entries: u32,
pub candidate_entries: u64,
pub admitted_entries: u64,
pub ineligible_entries: u64,
#[serde(default)]
pub ineligible_reasons: BTreeMap<String, u64>,
pub population: Option<BenchPopulationInput>,
pub input_tokens: Option<BenchTokenCountSummary>,
pub output_tokens: Option<BenchTokenCountSummary>,
pub evidence_path: Option<PathBuf>,
pub error: Option<String>,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchRequestSloInput {
#[serde(default)]
pub request_latency_ms: Option<f64>,
#[serde(default)]
pub ttft_ms: Option<f64>,
#[serde(default)]
pub tpot_ms: Option<f64>,
pub minimum_good_request_ratio: f64,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(untagged)]
pub enum SettingValue {
Bool(bool),
Integer(i64),
Float(f64),
String(String),
Array(Vec<SettingValue>),
Object(BTreeMap<String, SettingValue>),
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case", deny_unknown_fields)]
pub enum AdapterResponse {
Ok {
protocol_version: ProtocolVersion,
result: Box<AdapterResult>,
},
Error {
protocol_version: ProtocolVersion,
error: AdapterError,
},
}
impl AdapterResponse {
#[must_use]
pub const fn protocol_version(&self) -> ProtocolVersion {
match self {
Self::Ok {
protocol_version, ..
}
| Self::Error {
protocol_version, ..
} => *protocol_version,
}
}
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
pub enum AdapterResult {
PlanServe { output: Box<PlanServeResult> },
RenderServe { output: Box<RenderServeResult> },
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct PlanServeResult {
pub integration: IntegrationIdentity,
pub roles: Vec<ServeRoleResult>,
pub replicas: Vec<ServeReplicaRequirement>,
pub links: Vec<ServeRoleLink>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gateway: Option<GatewayPlan>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pd_router: Option<PdRouterPlan>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RenderSource {
ControlPlane,
Integration,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FrontendProcessRole {
Gateway,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct FrontendCoRendering {
pub process_role: FrontendProcessRole,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FrontendGatewayComponent {
Gateway,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FrontendPdRouterComponent {
PdRouter,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(transparent)]
pub struct GatewayFrontendBinding(pub [FrontendGatewayComponent; 1]);
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(transparent)]
pub struct GatewayPdRouterFrontendBinding(
pub (FrontendGatewayComponent, FrontendPdRouterComponent),
);
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(untagged)]
pub enum FrontendComponents {
Gateway(GatewayFrontendBinding),
GatewayPdRouter(GatewayPdRouterFrontendBinding),
}
impl FrontendComponents {
#[must_use]
pub const fn gateway() -> Self {
Self::Gateway(GatewayFrontendBinding([FrontendGatewayComponent::Gateway]))
}
#[must_use]
pub const fn gateway_pd_router() -> Self {
Self::GatewayPdRouter(GatewayPdRouterFrontendBinding((
FrontendGatewayComponent::Gateway,
FrontendPdRouterComponent::PdRouter,
)))
}
#[must_use]
pub const fn includes_pd_router(&self) -> bool {
matches!(self, Self::GatewayPdRouter(_))
}
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum GatewayTarget {
Engine { role: String },
PdRouter,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct GatewayPlan {
pub backend: String,
pub implementation: String,
pub implementation_version: String,
pub effective_settings: BTreeMap<String, SettingValue>,
pub endpoint: EndpointRequirement,
pub readiness: ReadinessProbe,
#[serde(default)]
pub ports: Vec<String>,
pub targets: Vec<GatewayTarget>,
#[serde(default)]
pub render_inputs: Vec<RenderInputDeclaration>,
pub render_source: RenderSource,
pub co_rendering: FrontendCoRendering,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct PdRoutingPolicies {
pub prefill: String,
pub decode: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FrontendHandoff {
InProcess,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct PdRouterPlan {
pub backend: String,
pub implementation: String,
pub implementation_version: String,
pub effective_settings: BTreeMap<String, SettingValue>,
pub policies: PdRoutingPolicies,
pub prefill_role: String,
pub decode_role: String,
pub target_scheme: TargetEndpointScheme,
#[serde(default)]
pub ports: Vec<String>,
pub readiness: ReadinessProbe,
pub handoff: FrontendHandoff,
#[serde(default)]
pub render_inputs: Vec<RenderInputDeclaration>,
pub render_source: RenderSource,
pub co_rendering: FrontendCoRendering,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RenderInputDeclaration {
pub source_path: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct SuppliedRenderInput {
pub source_path: String,
pub text: String,
pub sha256: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ServeReplicaRequirement {
pub id: String,
pub role_id: String,
pub replica_index: u32,
pub device_count: u32,
pub ports: Vec<String>,
pub primary_ports: Vec<String>,
pub primary_readiness: ReadinessProbe,
pub worker_readiness: ReadinessProbe,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capture_target: Option<CaptureTargetRequirement>,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum ServeProcessAllocation {
ModelRank {
process: String,
role: String,
role_kind: ServeRoleKind,
replica: u32,
rank: u32,
rank_count: u32,
machine: String,
devices: Vec<u32>,
model_locator: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
endpoint: Option<EndpointAssignment>,
ports: BTreeMap<String, EndpointAssignment>,
cache: String,
launch: AllocationLaunch,
effective_settings: BTreeMap<String, SettingValue>,
effective_parallelism: Parallelism,
#[serde(default)]
links: Vec<ServeRoleLink>,
#[serde(default)]
dependencies: Vec<String>,
#[serde(default)]
render_inputs: Vec<SuppliedRenderInput>,
},
Frontend {
process: String,
process_role: FrontendProcessRole,
components: FrontendComponents,
machine: String,
devices: Vec<u32>,
endpoint: EndpointAssignment,
ports: BTreeMap<String, EndpointAssignment>,
cache: String,
launch: AllocationLaunch,
gateway: Box<GatewayPlan>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pd_router: Option<Box<PdRouterPlan>>,
#[serde(default)]
links: Vec<ServeRoleLink>,
#[serde(default)]
dependencies: Vec<String>,
#[serde(default)]
render_inputs: Vec<SuppliedRenderInput>,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum AllocationLaunch {
Local,
Ssh { target: String },
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum ServeRoleLink {
RequestRouting {
source: String,
targets: Vec<String>,
},
KvTransfer {
source: String,
target: String,
mechanism: KvTransferMechanism,
},
Bootstrap {
source: String,
target: String,
port: String,
},
SideChannel {
source: String,
target: String,
port: String,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CaptureTargetRequirement {
pub window_control: CaptureWindowControlRequirement,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CaptureWindowControlRequirement {
pub endpoint: CaptureWindowControlEndpoint,
pub start: HttpActionSpec,
pub stop: HttpActionSpec,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CaptureWindowControlEndpoint {
ReplicaEntry,
Gateway,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RenderServeResult {
pub integration: IntegrationIdentity,
pub processes: Vec<RenderedServeProcess>,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum RenderedServeProcess {
ModelRank {
process: String,
role: String,
replica: u32,
rank: u32,
rank_count: u32,
launch_files: Vec<LaunchFileDeclaration>,
command: ProcessSpec,
},
Frontend {
process: String,
process_role: FrontendProcessRole,
components: FrontendComponents,
launch_files: Vec<LaunchFileDeclaration>,
command: ProcessSpec,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct LaunchFileDeclaration {
pub relative_path: String,
pub text: String,
pub sha256: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct HttpActionSpec {
pub method: HttpMethod,
pub path: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum HttpMethod {
Post,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct IntegrationIdentity {
pub adapter_id: String,
pub adapter_version: String,
pub framework: String,
pub framework_version: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ProcessSpec {
pub argv: Vec<String>,
pub env: BTreeMap<String, String>,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum ReadinessProbe {
Http { path: String },
HttpTargetRegistry(Box<HttpTargetRegistryReadiness>),
ProcessAlive,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct HttpTargetRegistryReadiness {
pub target_scheme: TargetEndpointScheme,
pub readiness_path: String,
pub registry_path: String,
pub targets_field: String,
pub target_url_field: String,
pub target_role_field: String,
pub target_healthy_field: String,
pub target_bootstrap_port_field: String,
pub prefill_role_value: String,
pub decode_role_value: String,
pub prefill_bootstrap_port: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TargetEndpointScheme {
Http,
Grpc,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EndpointRequirement {
pub protocol: EndpointProtocol,
pub completions_path: String,
pub chat_completions_path: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefix_cache_reset: Option<HttpActionSpec>,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EndpointProtocol {
Http,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct AdapterError {
pub code: AdapterErrorCode,
pub message: String,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AdapterErrorCode {
InvalidRequest,
UnsupportedProtocolVersion,
InvalidSettings,
Internal,
UnsupportedOperation,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalClientRequest {
pub protocol_version: ProtocolVersion,
pub workspace_root: PathBuf,
pub workspace_source_exclusions: Vec<PathBuf>,
pub endpoint: ClientEndpointInput,
pub model: MeasurementModelInput,
pub definition: EvalDefinitionInput,
pub case_budget_seconds: f64,
pub artifact_dir: PathBuf,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchClientRequest {
pub protocol_version: ProtocolVersion,
pub endpoint: ClientEndpointInput,
pub model: MeasurementModelInput,
pub definition: BenchDefinitionInput,
#[serde(default)]
pub population: Option<BenchPopulationInput>,
pub case: BenchCaseInput,
pub case_budget_seconds: f64,
pub artifact_dir: PathBuf,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchCaseInput {
pub load_shape: BenchLoadInput,
pub request_count: u32,
#[serde(default)]
pub warmup_request_count: u32,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum BenchLoadInput {
ConcurrencyLimited { concurrency: u32 },
RequestRateLimited {
request_rate: f64,
burstiness: Option<f64>,
},
UnboundedRequestRate,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ClientStatus {
Succeeded,
Failed,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EvalFailureKind {
TaskResolution,
ProbeTokenizer,
ProbeTransport,
ProbeHttp,
ProbeMalformedResponse,
ProbeGeneratedOnlyLogprobs,
ProbeTokenizerAlignment,
MetricNormalization,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EvalMetricComparison {
AtLeast,
AtMost,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EvalMetricGateConclusion {
Passed,
Failed,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalNormalizedMetric {
pub source_identity: String,
pub metric: String,
pub filter: Option<String>,
pub native_metric_key: String,
pub value: f64,
pub higher_is_better: bool,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalMetricGate {
pub metric: EvalNormalizedMetric,
pub threshold: f64,
pub comparison: EvalMetricComparison,
pub conclusion: EvalMetricGateConclusion,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalTrialSummary {
pub requested_trials: u32,
pub issued_trials: u32,
pub unissued_trials: u32,
pub completed_trials: u32,
pub request_failure_trials: u32,
pub passed_trials: u32,
pub pass_rate: Option<f64>,
pub per_trial_metric: String,
pub per_trial_filter: Option<String>,
pub higher_is_better: bool,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalClientResult {
pub schema_version: u32,
pub status: ClientStatus,
pub metrics: BTreeMap<String, f64>,
#[serde(default)]
pub normalized_metrics: BTreeMap<String, EvalNormalizedMetric>,
#[serde(default)]
pub gate: Option<EvalMetricGate>,
#[serde(default)]
pub trial_summary: Option<EvalTrialSummary>,
pub native_command: Vec<String>,
#[serde(default)]
pub native_exit_code: Option<i32>,
#[serde(default)]
pub native_timed_out: bool,
pub raw_artifacts: Vec<RawArtifact>,
pub failure_kind: Option<EvalFailureKind>,
pub error: Option<String>,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchClientResult {
pub schema_version: u32,
pub status: ClientStatus,
pub completed_requests: u64,
pub failed_requests: u64,
pub normalization_schema: String,
pub metrics: BTreeMap<String, f64>,
#[serde(default)]
pub request_slo: Option<BenchRequestSloResult>,
pub native_command: Vec<String>,
pub native_exit_code: Option<i32>,
pub raw_artifacts: Vec<RawArtifact>,
pub error: Option<String>,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct BenchRequestSloResult {
pub good_requests: u64,
pub good_request_ratio: f64,
pub goodput: f64,
pub profiling_duration_seconds: f64,
pub profiling_duration_source: String,
pub request_count_reconciled: bool,
#[serde(default)]
pub native_aggregate_good_request_count: Option<u64>,
#[serde(default)]
pub native_aggregate_good_request_count_consistent: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RawArtifact {
pub name: String,
pub kind: String,
pub path: PathBuf,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct AdapterProtocol {
pub request: AdapterRequest,
pub response: AdapterResponse,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementProtocol {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_client_request: Option<EvalClientRequest>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_client_result: Option<EvalClientResult>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bench_client_request: Option<BenchClientRequest>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bench_client_result: Option<BenchClientResult>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bench_dataset_preparation_request: Option<BenchDatasetPreparationRequest>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bench_dataset_preparation_result: Option<BenchDatasetPreparationResult>,
}