1use crate::measurement_data_asset::{
8 EvalPreparedSourceBinding, MeasurementDataAssetPreparationRequest,
9 MeasurementDataAssetPreparationResult,
10};
11use schemars::JsonSchema;
12use serde::{Deserialize, Serialize};
13use std::collections::BTreeMap;
14use std::path::PathBuf;
15
16#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
22pub enum ProtocolVersion {
23 #[serde(rename = "13")]
25 V13,
26}
27
28impl ProtocolVersion {
29 pub const CURRENT: Self = Self::V13;
31
32 #[must_use]
36 pub const fn as_str(self) -> &'static str {
37 match self {
38 Self::V13 => "13",
39 }
40 }
41}
42
43#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
46#[serde(untagged)]
47pub enum SettingValue {
48 Bool(bool),
50 Integer(i64),
52 Float(f64),
54 String(String),
56 Array(Vec<SettingValue>),
58 Object(BTreeMap<String, SettingValue>),
60}
61
62#[derive(
65 Clone, Copy, Debug, Default, Deserialize, Eq, JsonSchema, Ord, PartialEq, PartialOrd, Serialize,
66)]
67#[serde(rename_all = "snake_case")]
68pub enum CaptureMechanism {
69 #[default]
72 ManagedCollection,
73 EngineTrace,
76}
77
78#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
84#[serde(rename_all = "snake_case", deny_unknown_fields)]
85pub enum SyntheticAcceptanceInput {
86 Explicit {
88 acceptance_length: f64,
90 },
91 Curve(SyntheticAcceptanceCurveInput),
95}
96
97#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
99#[serde(deny_unknown_fields)]
100pub struct SyntheticAcceptanceCurveInput {
101 pub model_key: String,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub thinking_mode: Option<String>,
107 pub text: String,
109 pub sha256: String,
112}
113
114#[derive(Clone, Copy, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
118#[serde(deny_unknown_fields)]
119pub struct SyntheticAcceptanceOutcome {
120 pub acceptance_length: f64,
122 #[serde(default, skip_serializing_if = "Option::is_none")]
126 pub draft_count: Option<u32>,
127}
128
129#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
131#[serde(deny_unknown_fields)]
132pub struct EndpointAssignment {
133 pub host: String,
134 pub port: u16,
135}
136
137#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
139#[serde(rename_all = "snake_case")]
140pub enum EndpointProtocol {
141 Http,
143}
144
145#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
147#[serde(rename_all = "snake_case")]
148pub enum HttpMethod {
149 Post,
151}
152
153#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
158#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
159pub enum AdapterRequest {
160 PlanServe {
163 protocol_version: ProtocolVersion,
164 input: PlanServeInput,
165 },
166 RenderServe {
169 protocol_version: ProtocolVersion,
170 input: RenderServeInput,
171 },
172}
173
174impl AdapterRequest {
175 #[must_use]
177 pub const fn protocol_version(&self) -> ProtocolVersion {
178 match self {
179 Self::PlanServe {
180 protocol_version, ..
181 }
182 | Self::RenderServe {
183 protocol_version, ..
184 } => *protocol_version,
185 }
186 }
187}
188
189#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
191#[serde(deny_unknown_fields)]
192pub struct PlanServeInput {
193 pub model: ServeModelInput,
194 pub topology: ServeTopology,
195 pub state_dir: String,
201 #[serde(default, skip_serializing_if = "Option::is_none")]
202 pub gateway_backend: Option<String>,
203 #[serde(default, skip_serializing_if = "Option::is_none")]
204 pub pd_router_backend: Option<String>,
205 #[serde(default, skip_serializing_if = "Option::is_none")]
206 pub kv_transfer: Option<KvTransferMechanism>,
207 pub roles: Vec<ServeRoleInput>,
208 #[serde(default, skip_serializing_if = "Option::is_none")]
211 pub profiling: Option<CaptureMechanism>,
212 #[serde(default, skip_serializing_if = "Option::is_none")]
215 pub synthetic_acceptance: Option<SyntheticAcceptanceInput>,
216 #[serde(default, skip_serializing_if = "Vec::is_empty")]
219 pub auxiliary_models: Vec<AuxiliaryModelInput>,
220}
221
222#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
225#[serde(deny_unknown_fields)]
226pub struct RenderServeInput {
227 pub model: ServeModelInput,
228 pub topology: ServeTopology,
229 pub state_dir: String,
234 #[serde(default, skip_serializing_if = "Option::is_none")]
235 pub gateway_backend: Option<String>,
236 #[serde(default, skip_serializing_if = "Option::is_none")]
237 pub pd_router_backend: Option<String>,
238 #[serde(default, skip_serializing_if = "Option::is_none")]
239 pub kv_transfer: Option<KvTransferMechanism>,
240 pub allocations: Vec<ServeProcessAllocation>,
241 #[serde(default, skip_serializing_if = "Option::is_none")]
244 pub profiling: Option<CaptureMechanism>,
245 #[serde(default, skip_serializing_if = "Option::is_none")]
248 pub synthetic_acceptance: Option<SyntheticAcceptanceInput>,
249 #[serde(default, skip_serializing_if = "Vec::is_empty")]
252 pub auxiliary_models: Vec<AuxiliaryModelInput>,
253}
254
255#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
257#[serde(tag = "status", rename_all = "snake_case", deny_unknown_fields)]
258pub enum AdapterResponse {
259 Ok {
261 protocol_version: ProtocolVersion,
262 result: Box<AdapterResult>,
263 },
264 Error {
266 protocol_version: ProtocolVersion,
267 error: AdapterError,
268 },
269}
270
271impl AdapterResponse {
272 #[must_use]
274 pub const fn protocol_version(&self) -> ProtocolVersion {
275 match self {
276 Self::Ok {
277 protocol_version, ..
278 }
279 | Self::Error {
280 protocol_version, ..
281 } => *protocol_version,
282 }
283 }
284}
285
286#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
289#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
290pub enum AdapterResult {
291 PlanServe { output: Box<PlanServeResult> },
293 RenderServe { output: Box<RenderServeResult> },
295}
296
297#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
299#[serde(deny_unknown_fields)]
300pub struct AdapterError {
301 pub code: AdapterErrorCode,
302 pub message: String,
303}
304
305#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
307#[serde(rename_all = "snake_case")]
308pub enum AdapterErrorCode {
309 InvalidRequest,
311 UnsupportedProtocolVersion,
313 InvalidSettings,
315 Internal,
317 UnsupportedOperation,
319}
320
321#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
324#[serde(deny_unknown_fields)]
325pub struct IntegrationIdentity {
326 pub adapter_id: String,
327 pub adapter_version: String,
328 pub framework: String,
329 pub framework_version: String,
330}
331
332#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
336#[serde(rename_all = "snake_case")]
337pub enum ServeTopology {
338 Single,
340 PrefillDecode,
342}
343
344#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
346#[serde(rename_all = "snake_case")]
347pub enum ServeRoleKind {
348 Serve,
350 Prefill,
352 Decode,
354}
355
356impl ServeRoleKind {
357 #[must_use]
361 pub const fn as_str(self) -> &'static str {
362 match self {
363 Self::Serve => "serve",
364 Self::Prefill => "prefill",
365 Self::Decode => "decode",
366 }
367 }
368}
369
370#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
372#[serde(rename_all = "snake_case")]
373pub enum KvTransferMechanism {
374 Mooncake,
376 Nixl,
378}
379
380#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
385#[serde(default, deny_unknown_fields)]
386pub struct Parallelism {
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub outer: Option<ParallelismOuter>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub attention: Option<ParallelismAttention>,
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub experts: Option<ParallelismExperts>,
396}
397
398impl Parallelism {
399 pub fn field_values(&self) -> [(&'static str, Option<u32>); 9] {
404 [
405 (
406 "outer.tensor_parallel_size",
407 self.outer
408 .as_ref()
409 .and_then(|value| value.tensor_parallel_size),
410 ),
411 (
412 "outer.pipeline_parallel_size",
413 self.outer
414 .as_ref()
415 .and_then(|value| value.pipeline_parallel_size),
416 ),
417 (
418 "attention.tensor_parallel_size",
419 self.attention
420 .as_ref()
421 .and_then(|value| value.tensor_parallel_size),
422 ),
423 (
424 "attention.data_parallel_size",
425 self.attention
426 .as_ref()
427 .and_then(|value| value.data_parallel_size),
428 ),
429 (
430 "attention.context_parallel_size",
431 self.attention
432 .as_ref()
433 .and_then(|value| value.context_parallel_size),
434 ),
435 (
436 "experts.tensor_parallel_size",
437 self.experts
438 .as_ref()
439 .and_then(|value| value.tensor_parallel_size),
440 ),
441 (
442 "experts.data_parallel_size",
443 self.experts
444 .as_ref()
445 .and_then(|value| value.data_parallel_size),
446 ),
447 (
448 "experts.expert_parallel_size",
449 self.experts
450 .as_ref()
451 .and_then(|value| value.expert_parallel_size),
452 ),
453 (
454 "experts.dense_tensor_parallel_size",
455 self.experts
456 .as_ref()
457 .and_then(|value| value.dense_tensor_parallel_size),
458 ),
459 ]
460 }
461
462 pub fn merge_from(&mut self, other: &Self) {
465 if let Some(other) = &other.outer {
466 self.outer.get_or_insert_default().merge_from(other);
467 }
468 if let Some(other) = &other.attention {
469 self.attention.get_or_insert_default().merge_from(other);
470 }
471 if let Some(other) = &other.experts {
472 self.experts.get_or_insert_default().merge_from(other);
473 }
474 }
475}
476
477#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
479#[serde(default, deny_unknown_fields)]
480pub struct ParallelismOuter {
481 #[schemars(range(min = 1))]
482 #[serde(skip_serializing_if = "Option::is_none")]
483 pub tensor_parallel_size: Option<u32>,
484 #[schemars(range(min = 1))]
485 #[serde(skip_serializing_if = "Option::is_none")]
486 pub pipeline_parallel_size: Option<u32>,
487}
488
489impl ParallelismOuter {
490 fn merge_from(&mut self, other: &Self) {
491 if other.tensor_parallel_size.is_some() {
492 self.tensor_parallel_size = other.tensor_parallel_size;
493 }
494 if other.pipeline_parallel_size.is_some() {
495 self.pipeline_parallel_size = other.pipeline_parallel_size;
496 }
497 }
498}
499
500#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
502#[serde(default, deny_unknown_fields)]
503pub struct ParallelismAttention {
504 #[schemars(range(min = 1))]
505 #[serde(skip_serializing_if = "Option::is_none")]
506 pub tensor_parallel_size: Option<u32>,
507 #[schemars(range(min = 1))]
508 #[serde(skip_serializing_if = "Option::is_none")]
509 pub data_parallel_size: Option<u32>,
510 #[schemars(range(min = 1))]
511 #[serde(skip_serializing_if = "Option::is_none")]
512 pub context_parallel_size: Option<u32>,
513}
514
515impl ParallelismAttention {
516 fn merge_from(&mut self, other: &Self) {
517 if other.tensor_parallel_size.is_some() {
518 self.tensor_parallel_size = other.tensor_parallel_size;
519 }
520 if other.data_parallel_size.is_some() {
521 self.data_parallel_size = other.data_parallel_size;
522 }
523 if other.context_parallel_size.is_some() {
524 self.context_parallel_size = other.context_parallel_size;
525 }
526 }
527}
528
529#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
531#[serde(default, deny_unknown_fields)]
532pub struct ParallelismExperts {
533 #[schemars(range(min = 1))]
534 #[serde(skip_serializing_if = "Option::is_none")]
535 pub tensor_parallel_size: Option<u32>,
536 #[schemars(range(min = 1))]
537 #[serde(skip_serializing_if = "Option::is_none")]
538 pub data_parallel_size: Option<u32>,
539 #[schemars(range(min = 1))]
540 #[serde(skip_serializing_if = "Option::is_none")]
541 pub expert_parallel_size: Option<u32>,
542 #[schemars(range(min = 1))]
543 #[serde(skip_serializing_if = "Option::is_none")]
544 pub dense_tensor_parallel_size: Option<u32>,
545}
546
547impl ParallelismExperts {
548 fn merge_from(&mut self, other: &Self) {
549 if other.tensor_parallel_size.is_some() {
550 self.tensor_parallel_size = other.tensor_parallel_size;
551 }
552 if other.data_parallel_size.is_some() {
553 self.data_parallel_size = other.data_parallel_size;
554 }
555 if other.expert_parallel_size.is_some() {
556 self.expert_parallel_size = other.expert_parallel_size;
557 }
558 if other.dense_tensor_parallel_size.is_some() {
559 self.dense_tensor_parallel_size = other.dense_tensor_parallel_size;
560 }
561 }
562}
563
564#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
566#[serde(deny_unknown_fields)]
567pub struct ServeModelInput {
568 pub id: String,
569 pub served_name: String,
570}
571
572#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
575#[serde(rename_all = "kebab-case")]
576pub enum AuxiliaryModelKind {
577 DraftModel,
580}
581
582#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
586#[serde(deny_unknown_fields)]
587pub struct AuxiliaryModelInput {
588 pub kind: AuxiliaryModelKind,
589 pub model: ServeModelInput,
590}
591
592#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
595#[serde(deny_unknown_fields)]
596pub struct AuxiliaryModelLocator {
597 pub kind: AuxiliaryModelKind,
598 pub locator: String,
599}
600
601#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
604#[serde(deny_unknown_fields)]
605pub struct ServeRoleInput {
606 pub id: String,
607 pub kind: ServeRoleKind,
608 pub replica_count: u32,
609 pub parallelism: Parallelism,
610 pub settings: BTreeMap<String, SettingValue>,
611}
612
613#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
616#[serde(deny_unknown_fields)]
617pub struct ServeRoleResult {
618 pub id: String,
619 pub kind: ServeRoleKind,
620 pub declared_replica_count: u32,
621 pub effective_replica_count: u32,
622 pub effective_settings: BTreeMap<String, SettingValue>,
623 pub effective_parallelism: Parallelism,
624 #[serde(default, skip_serializing_if = "Option::is_none")]
628 pub public_endpoint: Option<EndpointDeclaration>,
629 #[serde(default, skip_serializing_if = "Option::is_none")]
634 pub replica_prefix_cache_reset: Option<HttpActionSpec>,
635 #[serde(default)]
636 pub render_inputs: Vec<RenderInputDeclaration>,
637}
638
639#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
643#[serde(deny_unknown_fields)]
644pub struct PlanServeResult {
645 pub integration: IntegrationIdentity,
646 #[serde(default, skip_serializing_if = "Option::is_none")]
650 pub synthetic_acceptance: Option<SyntheticAcceptanceOutcome>,
651 pub roles: Vec<ServeRoleResult>,
652 pub replicas: Vec<ServeReplicaRequirement>,
653 pub links: Vec<ServeRoleLink>,
654 #[serde(default, skip_serializing_if = "Option::is_none")]
655 pub gateway: Option<GatewayPlan>,
656 #[serde(default, skip_serializing_if = "Option::is_none")]
657 pub pd_router: Option<PdRouterPlan>,
658}
659
660#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
663#[serde(deny_unknown_fields)]
664pub struct ServeReplicaRequirement {
665 pub id: String,
666 pub role_id: String,
667 pub replica_index: u32,
668 pub device_count: u32,
669 pub ports: Vec<String>,
670 pub primary_ports: Vec<String>,
671 pub primary_readiness: ReadinessProbe,
672 pub worker_readiness: ReadinessProbe,
673 #[serde(default, skip_serializing_if = "Option::is_none")]
674 pub capture_target: Option<CaptureTargetRequirement>,
675}
676
677#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
680#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
681pub enum ServeRoleLink {
682 RequestRouting {
684 source: String,
685 targets: Vec<String>,
686 },
687 KvTransfer {
689 source: String,
690 target: String,
691 mechanism: KvTransferMechanism,
692 },
693 Bootstrap {
695 source: String,
696 target: String,
697 port: String,
698 },
699 SideChannel {
701 source: String,
702 target: String,
703 port: String,
704 },
705}
706
707#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
710#[serde(deny_unknown_fields)]
711pub struct RenderInputDeclaration {
712 pub source_path: String,
713}
714
715#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
718#[serde(deny_unknown_fields)]
719pub struct SuppliedRenderInput {
720 pub source_path: String,
721 pub text: String,
722 pub sha256: String,
723}
724
725#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
732#[serde(deny_unknown_fields)]
733pub struct EndpointDeclaration {
734 pub protocol: EndpointProtocol,
735 #[serde(default, skip_serializing_if = "Option::is_none")]
736 pub server_metrics: Option<ServerMetricsEndpointRequirement>,
737 #[serde(default, skip_serializing_if = "Option::is_none")]
738 pub prefix_cache_reset: Option<HttpActionSpec>,
739 #[serde(default, skip_serializing_if = "Option::is_none")]
743 pub prefix_cache_conditioning: Option<HttpActionSpec>,
744 #[serde(default, skip_serializing_if = "Option::is_none")]
745 pub prompt_cache_read_zero_representation: Option<PromptCacheReadZeroRepresentation>,
746}
747
748#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
754#[serde(deny_unknown_fields)]
755pub struct EndpointRequirement {
756 pub protocol: EndpointProtocol,
757 pub completions_path: String,
758 pub chat_completions_path: String,
759 #[serde(default, skip_serializing_if = "Option::is_none")]
760 pub server_metrics: Option<ServerMetricsEndpointRequirement>,
761 #[serde(default, skip_serializing_if = "Option::is_none")]
762 pub prefix_cache_reset: Option<HttpActionSpec>,
763 #[serde(default, skip_serializing_if = "Option::is_none")]
767 pub prefix_cache_conditioning: Option<HttpActionSpec>,
768 #[serde(default, skip_serializing_if = "Option::is_none")]
769 pub prompt_cache_read_zero_representation: Option<PromptCacheReadZeroRepresentation>,
770}
771
772#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
774#[serde(deny_unknown_fields)]
775pub struct ServerMetricsEndpointRequirement {
776 pub path: String,
777 #[serde(default, skip_serializing_if = "Option::is_none")]
778 pub port: Option<String>,
779}
780
781#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
783#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
784pub enum ReadinessProbe {
785 Http { path: String },
787 HttpTargetRegistry(Box<HttpTargetRegistryReadiness>),
790 RegistryMembership(Box<RegistryMembershipReadiness>),
794 ProcessAlive,
796}
797
798#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
802#[serde(deny_unknown_fields)]
803pub struct RegistryMembershipReadiness {
804 pub registry_path: String,
806 pub target_port: String,
809 pub entries_pointer: String,
811 #[serde(default, skip_serializing_if = "Option::is_none")]
814 pub entry_filter: Option<JsonValueMatch>,
815 pub role_pointer: String,
816 pub role_values: RegistryRoleValues,
817 pub address_pointer: String,
818 #[serde(default, skip_serializing_if = "Option::is_none")]
819 pub model_list: Option<ModelListRequirement>,
820}
821
822#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
825#[serde(deny_unknown_fields)]
826pub struct RegistryRoleValues {
827 #[serde(default, skip_serializing_if = "Option::is_none")]
828 pub serve: Option<String>,
829 #[serde(default, skip_serializing_if = "Option::is_none")]
830 pub prefill: Option<String>,
831 #[serde(default, skip_serializing_if = "Option::is_none")]
832 pub decode: Option<String>,
833}
834
835#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
837#[serde(deny_unknown_fields)]
838pub struct ModelListRequirement {
839 pub path: String,
841 pub models_pointer: String,
843 pub name_pointer: String,
845}
846
847#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
849#[serde(deny_unknown_fields)]
850pub struct JsonValueMatch {
851 pub pointer: String,
852 pub value: String,
853}
854
855#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
858#[serde(untagged)]
859pub enum JsonScalar {
860 Boolean(bool),
861 String(String),
862}
863
864impl JsonScalar {
865 #[must_use]
868 pub fn matches(&self, observed: &serde_json::Value) -> bool {
869 match (self, observed) {
870 (Self::Boolean(expected), serde_json::Value::Bool(value)) => expected == value,
871 (Self::String(expected), serde_json::Value::String(value)) => expected == value,
872 _ => false,
873 }
874 }
875}
876
877impl std::fmt::Display for JsonScalar {
878 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
880 match self {
881 Self::Boolean(value) => write!(formatter, "{value}"),
882 Self::String(value) => write!(formatter, "{}", serde_json::Value::from(value.as_str())),
883 }
884 }
885}
886
887#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
890#[serde(deny_unknown_fields)]
891pub struct SuccessMatch {
892 pub pointer: String,
893 pub value: JsonScalar,
894}
895
896#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
898#[serde(deny_unknown_fields)]
899pub struct HttpTargetRegistryReadiness {
900 pub target_scheme: TargetEndpointScheme,
901 pub readiness_path: String,
902 pub registry_path: String,
903 pub targets_field: String,
904 pub target_url_field: String,
905 pub target_role_field: String,
906 pub target_healthy_field: String,
907 pub target_bootstrap_port_field: String,
908 pub prefill_role_value: String,
909 pub decode_role_value: String,
910 pub prefill_bootstrap_port: String,
911}
912
913#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
915#[serde(deny_unknown_fields)]
916pub struct HttpActionSpec {
917 pub method: HttpMethod,
918 pub path: String,
919 #[serde(default, skip_serializing_if = "Option::is_none")]
922 pub success: Option<SuccessMatch>,
923}
924
925#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
930#[serde(deny_unknown_fields)]
931pub struct CaptureTargetRequirement {
932 pub mechanism: CaptureMechanism,
935 pub window_control: CaptureWindowControlRequirement,
936}
937
938#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
941#[serde(deny_unknown_fields)]
942pub struct CaptureWindowControlRequirement {
943 pub endpoint: CaptureWindowControlEndpoint,
944 pub start: CaptureWindowHttpActionSpec,
945 pub stop: CaptureWindowHttpActionSpec,
946}
947
948#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
951#[serde(rename_all = "snake_case")]
952pub enum CaptureWindowControlEndpoint {
953 ReplicaEntry,
955 Gateway,
957}
958
959#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
963#[serde(deny_unknown_fields)]
964pub struct CaptureWindowHttpActionSpec {
965 pub method: HttpMethod,
966 pub path: String,
967 #[serde(default, skip_serializing_if = "Option::is_none")]
968 pub body: Option<BTreeMap<String, SettingValue>>,
969 #[serde(default, skip_serializing_if = "Option::is_none")]
972 pub success: Option<SuccessMatch>,
973}
974
975#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
979#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
980pub enum ServeProcessAllocation {
981 ModelRank {
982 process: String,
983 role: String,
984 role_kind: ServeRoleKind,
985 replica: u32,
986 rank: u32,
987 rank_count: u32,
988 machine: String,
989 devices: Vec<u32>,
990 model_locator: String,
991 #[serde(default, skip_serializing_if = "Vec::is_empty")]
994 auxiliary_model_locators: Vec<AuxiliaryModelLocator>,
995 #[serde(default, skip_serializing_if = "Option::is_none")]
996 endpoint: Option<EndpointAssignment>,
997 ports: BTreeMap<String, EndpointAssignment>,
998 cache: String,
999 #[serde(default, skip_serializing_if = "Option::is_none")]
1003 capture_storage: Option<String>,
1004 launch: AllocationLaunch,
1005 effective_settings: BTreeMap<String, SettingValue>,
1006 effective_parallelism: Parallelism,
1007 #[serde(default)]
1008 links: Vec<ServeRoleLink>,
1009 #[serde(default)]
1010 dependencies: Vec<String>,
1011 #[serde(default, skip_serializing_if = "Option::is_none")]
1014 discovery: Option<String>,
1015 #[serde(default)]
1016 render_inputs: Vec<SuppliedRenderInput>,
1017 },
1018 Frontend {
1019 process: String,
1020 process_role: FrontendProcessRole,
1021 components: FrontendComponents,
1022 machine: String,
1023 devices: Vec<u32>,
1024 endpoint: EndpointAssignment,
1025 ports: BTreeMap<String, EndpointAssignment>,
1026 cache: String,
1027 launch: AllocationLaunch,
1028 gateway: Box<GatewayPlan>,
1029 #[serde(default, skip_serializing_if = "Option::is_none")]
1030 pd_router: Option<Box<PdRouterPlan>>,
1031 #[serde(default)]
1032 links: Vec<ServeRoleLink>,
1033 #[serde(default)]
1034 dependencies: Vec<String>,
1035 #[serde(default, skip_serializing_if = "Option::is_none")]
1038 discovery: Option<String>,
1039 #[serde(default)]
1040 render_inputs: Vec<SuppliedRenderInput>,
1041 },
1042 Discovery {
1046 process: String,
1047 process_role: DiscoveryProcessRole,
1048 components: DiscoveryBinding,
1049 machine: String,
1050 devices: Vec<u32>,
1051 endpoint: EndpointAssignment,
1052 ports: BTreeMap<String, EndpointAssignment>,
1053 cache: String,
1054 data_directory: String,
1057 launch: AllocationLaunch,
1058 discovery: Box<DiscoveryRequirement>,
1059 #[serde(default)]
1060 render_inputs: Vec<SuppliedRenderInput>,
1061 },
1062}
1063
1064#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1066#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1067pub enum AllocationLaunch {
1068 Local,
1069 Ssh { target: String },
1070}
1071
1072#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1075#[serde(deny_unknown_fields)]
1076pub struct RenderServeResult {
1077 pub integration: IntegrationIdentity,
1078 pub processes: Vec<RenderedServeProcess>,
1079}
1080
1081#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1084#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1085pub enum RenderedServeProcess {
1086 ModelRank {
1087 process: String,
1088 role: String,
1089 replica: u32,
1090 rank: u32,
1091 rank_count: u32,
1092 launch_files: Vec<LaunchFileDeclaration>,
1093 command: ProcessSpec,
1094 },
1095 Frontend {
1096 process: String,
1097 process_role: FrontendProcessRole,
1098 components: FrontendComponents,
1099 launch_files: Vec<LaunchFileDeclaration>,
1100 command: ProcessSpec,
1101 },
1102 Discovery {
1103 process: String,
1104 process_role: DiscoveryProcessRole,
1105 components: DiscoveryBinding,
1106 launch_files: Vec<LaunchFileDeclaration>,
1107 command: ProcessSpec,
1108 },
1109}
1110
1111#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1113#[serde(deny_unknown_fields)]
1114pub struct LaunchFileDeclaration {
1115 pub relative_path: String,
1116 pub text: String,
1117 pub sha256: String,
1118}
1119
1120#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1122#[serde(deny_unknown_fields)]
1123pub struct ProcessSpec {
1124 pub argv: Vec<String>,
1125 pub env: BTreeMap<String, String>,
1126}
1127
1128#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1134#[serde(rename_all = "snake_case")]
1135pub enum RenderSource {
1136 ControlPlane,
1137 Integration,
1138}
1139
1140#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1142#[serde(rename_all = "snake_case")]
1143pub enum FrontendProcessRole {
1144 Gateway,
1145}
1146
1147#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1149#[serde(rename_all = "snake_case")]
1150pub enum DiscoveryProcessRole {
1151 Discovery,
1152}
1153
1154#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1156#[serde(rename_all = "snake_case")]
1157pub enum DiscoveryComponent {
1158 Discovery,
1159}
1160
1161#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1163#[serde(transparent)]
1164pub struct DiscoveryBinding(pub [DiscoveryComponent; 1]);
1165
1166impl DiscoveryBinding {
1167 #[must_use]
1168 pub const fn discovery() -> Self {
1169 Self([DiscoveryComponent::Discovery])
1170 }
1171}
1172
1173#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1176#[serde(deny_unknown_fields)]
1177pub struct DiscoveryRequirement {
1178 #[serde(default)]
1179 pub ports: Vec<String>,
1180 pub readiness: ReadinessProbe,
1181 #[serde(default)]
1182 pub render_inputs: Vec<RenderInputDeclaration>,
1183}
1184
1185#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1187#[serde(deny_unknown_fields)]
1188pub struct FrontendCoRendering {
1189 pub process_role: FrontendProcessRole,
1190}
1191
1192#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1194#[serde(rename_all = "snake_case")]
1195pub enum FrontendGatewayComponent {
1196 Gateway,
1197}
1198
1199#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1201#[serde(rename_all = "snake_case")]
1202pub enum FrontendPdRouterComponent {
1203 PdRouter,
1204}
1205
1206#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1208#[serde(transparent)]
1209pub struct GatewayFrontendBinding(pub [FrontendGatewayComponent; 1]);
1210
1211#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1213#[serde(transparent)]
1214pub struct GatewayPdRouterFrontendBinding(
1215 pub (FrontendGatewayComponent, FrontendPdRouterComponent),
1216);
1217
1218#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1222#[serde(untagged)]
1223pub enum FrontendComponents {
1224 Gateway(GatewayFrontendBinding),
1225 GatewayPdRouter(GatewayPdRouterFrontendBinding),
1226}
1227
1228impl FrontendComponents {
1229 #[must_use]
1230 pub const fn gateway() -> Self {
1231 Self::Gateway(GatewayFrontendBinding([FrontendGatewayComponent::Gateway]))
1232 }
1233
1234 #[must_use]
1235 pub const fn gateway_pd_router() -> Self {
1236 Self::GatewayPdRouter(GatewayPdRouterFrontendBinding((
1237 FrontendGatewayComponent::Gateway,
1238 FrontendPdRouterComponent::PdRouter,
1239 )))
1240 }
1241
1242 #[must_use]
1243 pub const fn includes_pd_router(&self) -> bool {
1244 matches!(self, Self::GatewayPdRouter(_))
1245 }
1246}
1247
1248#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1250#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1251pub enum GatewayTarget {
1252 Engine { role: String },
1254 PdRouter,
1256}
1257
1258#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1261#[serde(deny_unknown_fields)]
1262pub struct GatewayPlan {
1263 pub backend: String,
1264 pub implementation: String,
1265 pub implementation_version: String,
1266 pub effective_settings: BTreeMap<String, SettingValue>,
1267 pub endpoint: EndpointDeclaration,
1268 pub readiness: ReadinessProbe,
1269 #[serde(default)]
1270 pub ports: Vec<String>,
1271 pub targets: Vec<GatewayTarget>,
1272 #[serde(default)]
1273 pub render_inputs: Vec<RenderInputDeclaration>,
1274 pub render_source: RenderSource,
1275 pub co_rendering: FrontendCoRendering,
1276 #[serde(default, skip_serializing_if = "Option::is_none")]
1279 pub discovery: Option<DiscoveryRequirement>,
1280}
1281
1282#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1284#[serde(deny_unknown_fields)]
1285pub struct PdRoutingPolicies {
1286 pub prefill: String,
1287 pub decode: String,
1288}
1289
1290#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1293#[serde(rename_all = "snake_case")]
1294pub enum FrontendHandoff {
1295 InProcess,
1296}
1297
1298#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1301#[serde(deny_unknown_fields)]
1302pub struct PdRouterPlan {
1303 pub backend: String,
1304 pub implementation: String,
1305 pub implementation_version: String,
1306 pub effective_settings: BTreeMap<String, SettingValue>,
1307 pub policies: PdRoutingPolicies,
1308 pub prefill_role: String,
1309 pub decode_role: String,
1310 pub target_scheme: TargetEndpointScheme,
1311 #[serde(default)]
1312 pub ports: Vec<String>,
1313 pub readiness: ReadinessProbe,
1314 pub handoff: FrontendHandoff,
1315 #[serde(default)]
1316 pub render_inputs: Vec<RenderInputDeclaration>,
1317 pub render_source: RenderSource,
1318 pub co_rendering: FrontendCoRendering,
1319}
1320
1321#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1323#[serde(rename_all = "snake_case")]
1324pub enum TargetEndpointScheme {
1325 Http,
1327 Grpc,
1329 Tcp,
1331}
1332
1333#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1339#[serde(deny_unknown_fields)]
1340pub struct MeasurementModelInput {
1341 pub locator: String,
1342 pub served_name: String,
1343}
1344
1345#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1347#[serde(deny_unknown_fields)]
1348pub struct ClientEndpointInput {
1349 pub protocol: EndpointProtocol,
1350 pub host: String,
1351 pub port: u16,
1352 pub completions_path: String,
1353 pub chat_completions_path: String,
1354 #[serde(default)]
1355 pub server_metrics: Option<ServerMetricsEndpointInput>,
1356 #[serde(default)]
1357 pub prompt_cache_read_zero_representation: Option<PromptCacheReadZeroRepresentation>,
1358}
1359
1360#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1362#[serde(deny_unknown_fields)]
1363pub struct ServerMetricsEndpointInput {
1364 pub path: String,
1365 #[serde(default)]
1366 pub port_name: Option<String>,
1367 pub url: String,
1368}
1369
1370#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1372#[serde(rename_all = "snake_case")]
1373pub enum PromptCacheReadZeroRepresentation {
1374 Explicit,
1375 Omitted,
1376}
1377
1378#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1380#[serde(rename_all = "snake_case")]
1381pub enum ClientStatus {
1382 Succeeded,
1384 Failed,
1386}
1387
1388#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1390#[serde(deny_unknown_fields)]
1391pub struct RawArtifact {
1392 pub name: String,
1393 pub kind: String,
1394 pub path: PathBuf,
1395}
1396
1397#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1402#[serde(deny_unknown_fields)]
1403pub struct EvalClientRequest {
1404 pub protocol_version: ProtocolVersion,
1405 pub workspace_root: PathBuf,
1406 pub workspace_source_exclusions: Vec<PathBuf>,
1407 pub endpoint: ClientEndpointInput,
1408 pub model: MeasurementModelInput,
1409 pub definition: EvalDefinitionInput,
1410 #[serde(default)]
1411 pub prepared_source: Option<EvalPreparedSourceBinding>,
1412 pub case_budget_seconds: f64,
1414 pub artifact_dir: PathBuf,
1415}
1416
1417#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1419#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1420pub enum EvalDefinitionInput {
1421 #[serde(rename = "openai_smoke")]
1423 OpenAiSmoke {
1424 prompt: String,
1425 max_tokens: u32,
1426 timeout_seconds: u64,
1427 #[serde(default)]
1431 vision: bool,
1432 },
1433 LmEval {
1435 task: Box<EvalTaskSourceInput>,
1436 prompt: EvalPromptInput,
1438 #[serde(default)]
1440 declared_prompt: Option<EvalPromptInput>,
1441 #[serde(default)]
1442 request_body: BTreeMap<String, SettingValue>,
1443 limit: Option<u32>,
1444 few_shot: Option<u32>,
1445 seed: Option<u64>,
1448 base_seed: u64,
1452 trials: u32,
1453 max_tokens: Option<u32>,
1454 concurrency: Option<u32>,
1455 metric: String,
1456 #[serde(default)]
1457 metric_filter: Option<String>,
1458 threshold: f64,
1459 timeout_seconds: u64,
1460 },
1461}
1462
1463#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1469#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1470pub enum EvalPromptInput {
1471 Flat,
1473 ServerChat,
1475}
1476
1477#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1479#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1480pub enum EvalTaskSourceInput {
1481 BuiltIn { name: String },
1483 Bundled {
1485 name: String,
1486 task_identity: String,
1487 path: PathBuf,
1488 task_closure_sha256: String,
1489 task_definition_sha256: String,
1490 prompt_asset_sha256: String,
1491 dataset_asset_sha256: String,
1492 scorer_sha256: String,
1493 },
1494 WorkspaceYaml { path: PathBuf },
1496}
1497
1498#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1500#[serde(deny_unknown_fields)]
1501pub struct EvalClientResult {
1502 pub schema_version: u32,
1505 pub status: ClientStatus,
1506 pub metrics: BTreeMap<String, f64>,
1507 #[serde(default)]
1508 pub normalized_metrics: BTreeMap<String, EvalNormalizedMetric>,
1509 #[serde(default)]
1510 pub gate: Option<EvalMetricGate>,
1511 #[serde(default)]
1512 pub trial_summary: Option<EvalTrialSummary>,
1513 pub native_command: Vec<String>,
1514 #[serde(default)]
1515 pub native_exit_code: Option<i32>,
1516 #[serde(default)]
1517 pub native_timed_out: bool,
1518 pub raw_artifacts: Vec<RawArtifact>,
1519 pub failure_kind: Option<EvalFailureKind>,
1520 pub error: Option<String>,
1521}
1522
1523#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1525#[serde(rename_all = "snake_case")]
1526pub enum EvalFailureKind {
1527 TaskResolution,
1528 ProbeTokenizer,
1529 ProbeTransport,
1530 ProbeHttp,
1531 ProbeMalformedResponse,
1532 ProbeGeneratedOnlyLogprobs,
1533 ProbeTokenizerAlignment,
1534 MetricNormalization,
1535}
1536
1537#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1539#[serde(rename_all = "snake_case")]
1540pub enum EvalMetricComparison {
1541 AtLeast,
1542 AtMost,
1543}
1544
1545#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1547#[serde(rename_all = "snake_case")]
1548pub enum EvalMetricGateConclusion {
1549 Passed,
1550 Failed,
1551}
1552
1553#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1555#[serde(deny_unknown_fields)]
1556pub struct EvalNormalizedMetric {
1557 pub source_identity: String,
1558 pub metric: String,
1559 pub filter: Option<String>,
1560 pub native_metric_key: String,
1561 pub value: f64,
1562 pub higher_is_better: bool,
1563 pub prompt_authority: EvalPromptInput,
1567}
1568
1569#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1571#[serde(deny_unknown_fields)]
1572pub struct EvalMetricGate {
1573 pub metric: EvalNormalizedMetric,
1574 pub threshold: f64,
1575 pub comparison: EvalMetricComparison,
1576 pub conclusion: EvalMetricGateConclusion,
1577}
1578
1579#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1581#[serde(deny_unknown_fields)]
1582pub struct EvalTrialSummary {
1583 pub requested_trials: u32,
1584 pub issued_trials: u32,
1585 pub unissued_trials: u32,
1586 pub completed_trials: u32,
1587 pub request_failure_trials: u32,
1588 pub passed_trials: u32,
1589 pub pass_rate: Option<f64>,
1590 pub per_trial_metric: String,
1591 pub per_trial_filter: Option<String>,
1592 pub higher_is_better: bool,
1593}
1594
1595#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1601#[serde(deny_unknown_fields)]
1602pub struct BenchClientRequest {
1603 pub protocol_version: ProtocolVersion,
1604 pub endpoint: ClientEndpointInput,
1605 pub model: MeasurementModelInput,
1606 pub definition: BenchDefinitionInput,
1607 #[serde(default)]
1608 pub population: Option<BenchPopulationInput>,
1609 pub case: BenchCaseInput,
1610 pub case_budget_seconds: f64,
1612 pub artifact_dir: PathBuf,
1613}
1614
1615#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1617#[serde(deny_unknown_fields)]
1618pub struct BenchDefinitionInput {
1619 #[serde(default)]
1620 pub request_source: Option<BenchRequestSourceInput>,
1621 #[serde(default)]
1622 pub session_source: Option<BenchSessionSourceInput>,
1623 #[serde(default)]
1624 pub agentic_source: Option<BenchAgenticSourceInput>,
1625 pub prompt: BenchPromptInput,
1626 #[serde(default)]
1627 pub server_metrics: bool,
1628 #[serde(default)]
1629 pub artifact_level: BenchArtifactLevelInput,
1630 pub seed: u64,
1631 #[serde(default)]
1632 pub request_body: BTreeMap<String, SettingValue>,
1633 #[serde(default)]
1634 pub request_slo: Option<BenchRequestSloInput>,
1635 pub timeout_seconds: u64,
1636 pub cache_start: BenchCacheStartInput,
1637}
1638
1639#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1644#[serde(rename_all = "snake_case")]
1645pub enum BenchArtifactLevelInput {
1646 Performance,
1647 #[default]
1648 Diagnostic,
1649}
1650
1651#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1652#[serde(rename_all = "snake_case")]
1653pub enum BenchCacheStartInput {
1654 Uncontrolled,
1655 Cold,
1656 Primed,
1657}
1658
1659#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1662#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1663pub enum BenchPromptInput {
1664 Flat {
1665 request_representation: BenchRequestRepresentationInput,
1666 route: BenchPromptRouteInput,
1667 rendering_authority: BenchRenderingAuthorityInput,
1668 },
1669 RenderedChat {
1670 #[serde(default)]
1671 chat_template: Option<String>,
1672 #[serde(default)]
1673 chat_template_kwargs: BTreeMap<String, SettingValue>,
1674 request_representation: BenchRequestRepresentationInput,
1675 route: BenchPromptRouteInput,
1676 rendering_authority: BenchRenderingAuthorityInput,
1677 },
1678 ServerChat {
1679 request_representation: BenchRequestRepresentationInput,
1680 route: BenchPromptRouteInput,
1681 rendering_authority: BenchRenderingAuthorityInput,
1682 },
1683}
1684
1685#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1687#[serde(rename_all = "snake_case")]
1688pub enum BenchRequestRepresentationInput {
1689 FlatPrompt,
1690 StructuredMessages,
1691}
1692
1693#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1695#[serde(rename_all = "snake_case")]
1696pub enum BenchPromptRouteInput {
1697 Completions,
1698 ChatCompletions,
1699}
1700
1701#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1703#[serde(rename_all = "snake_case")]
1704pub enum BenchRenderingAuthorityInput {
1705 LocalFlat,
1706 LocalTemplate,
1707 Server,
1708}
1709
1710#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1712#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1713pub enum BenchRequestSourceInput {
1714 Random {
1717 input_tokens: BenchTokenSelectorInput,
1718 output_tokens: BenchTokenSelectorInput,
1719 #[serde(default)]
1720 prefix_sharing: Option<BenchPrefixSharingInput>,
1721 #[serde(default)]
1722 shared_system_content: Option<BenchSharedSystemContentInput>,
1723 #[serde(default)]
1724 corpus: Option<BenchCorpusInput>,
1725 #[serde(default)]
1729 images: Option<BenchImagesInput>,
1730 },
1731 RandomMixture {
1734 shapes: Vec<BenchRandomShapeInput>,
1735 total_weight: u64,
1736 #[serde(default)]
1737 prefix_sharing: Option<BenchPrefixSharingInput>,
1738 },
1739 Dataset {
1742 dataset: String,
1743 #[serde(default)]
1744 profile: Option<String>,
1745 max_input_tokens: u32,
1746 output_tokens: Option<u32>,
1747 catalog: Box<BenchDatasetCatalogInput>,
1748 },
1749 Replay {
1753 path: String,
1756 #[serde(default)]
1757 expected_sha256: Option<String>,
1758 #[serde(default)]
1759 prefix_sharing: Option<BenchPrefixSharingInput>,
1760 },
1761}
1762
1763#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1765#[serde(untagged)]
1766pub enum BenchTokenSelectorInput {
1767 Fixed(u32),
1768 InclusiveUniform(BenchInclusiveUniformInput),
1769}
1770
1771#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1773#[serde(deny_unknown_fields)]
1774pub struct BenchInclusiveUniformInput {
1775 pub kind: BenchTokenDistributionKindInput,
1776 pub min: u32,
1777 pub max: u32,
1778}
1779
1780#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1781#[serde(rename_all = "snake_case")]
1782pub enum BenchTokenDistributionKindInput {
1783 InclusiveUniform,
1784}
1785
1786#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1788#[serde(untagged)]
1789pub enum BenchPrefixSharingInput {
1790 Tokens { shared_prefix_tokens: u32 },
1791 Ratio { shared_prefix_ratio: f64 },
1792}
1793
1794#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1797#[serde(untagged)]
1798pub enum BenchSharedSystemContentInput {
1799 Tokens { tokens: u32 },
1800 Ratio { ratio: f64 },
1801}
1802
1803#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1807#[serde(deny_unknown_fields)]
1808pub struct BenchCorpusInput {
1809 pub path: String,
1812 #[serde(default)]
1813 pub expected_sha256: Option<String>,
1814}
1815
1816#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1821#[serde(deny_unknown_fields)]
1822pub struct BenchImagesInput {
1823 pub width: u32,
1825 pub height: u32,
1827 pub count: u32,
1829 #[serde(default)]
1832 pub source: Option<BenchImageSourceInput>,
1833}
1834
1835#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1838#[serde(deny_unknown_fields)]
1839pub struct BenchImageSourceInput {
1840 pub path: String,
1842 pub resolved_path: PathBuf,
1844 #[serde(default)]
1847 pub expected_sha256: Option<String>,
1848 pub sampling: BenchImageSamplingInput,
1850}
1851
1852#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1855#[serde(rename_all = "kebab-case")]
1856pub enum BenchImageSamplingInput {
1857 RandomWithReplacement,
1859 ShuffleCycle,
1862 SequentialCycle,
1864}
1865
1866#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1868#[serde(deny_unknown_fields)]
1869pub struct BenchRandomShapeInput {
1870 pub input_tokens: u32,
1871 pub output_tokens: u32,
1872 pub weight: u32,
1873}
1874
1875#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1877#[serde(deny_unknown_fields)]
1878pub struct BenchDatasetCatalogInput {
1879 pub dataset: String,
1880 #[serde(default)]
1881 pub profile: Option<String>,
1882 pub source: String,
1883 pub upstream_identity: String,
1884 pub url: String,
1885 pub sha256: String,
1886 pub source_format: String,
1887 pub aiperf_format: String,
1888 #[serde(default)]
1889 pub configuration: Option<String>,
1890 #[serde(default)]
1891 pub split: Option<String>,
1892 #[serde(default)]
1893 pub filter: Option<BenchDatasetFilterInput>,
1894 pub license: String,
1895 pub cache_path: PathBuf,
1896 pub cache_state: BenchDatasetCacheState,
1897 pub materialization_identity: String,
1898 pub provides_output_targets: bool,
1899}
1900
1901#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1902#[serde(deny_unknown_fields)]
1903pub struct BenchDatasetFilterInput {
1904 pub field: String,
1905 pub value: String,
1906}
1907
1908#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1910#[serde(rename_all = "snake_case")]
1911pub enum BenchDatasetCacheState {
1912 Missing,
1913 Present,
1914}
1915
1916#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1918#[serde(deny_unknown_fields)]
1919pub struct BenchSessionSourceInput {
1920 pub dataset: String,
1921 #[serde(default)]
1922 pub profile: Option<String>,
1923 pub max_input_tokens: u32,
1924 pub output_tokens: Option<u32>,
1925 pub inter_turn_delay_scale: f64,
1926 pub max_inter_turn_delay_seconds: Option<f64>,
1927 pub catalog: Box<BenchSessionDatasetCatalogInput>,
1928}
1929
1930#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1933#[serde(deny_unknown_fields)]
1934pub struct BenchSessionDatasetCatalogInput {
1935 pub dataset: String,
1936 #[serde(default)]
1937 pub profile: Option<String>,
1938 pub source: String,
1939 pub upstream_identity: String,
1940 pub url: String,
1941 pub sha256: String,
1942 pub source_format: String,
1943 #[serde(default)]
1944 pub configuration: Option<String>,
1945 #[serde(default)]
1946 pub split: Option<String>,
1947 #[serde(default)]
1948 pub filter: Option<BenchDatasetFilterInput>,
1949 pub license: String,
1950 pub cache_path: PathBuf,
1951 pub cache_state: BenchDatasetCacheState,
1952 pub materialization_identity: String,
1953 pub provides_output_targets: bool,
1954}
1955
1956#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1958#[serde(deny_unknown_fields)]
1959pub struct BenchAgenticSourceInput {
1960 pub dataset: String,
1961 pub profile: String,
1962 pub catalog: Box<BenchAgenticCatalogInput>,
1963}
1964
1965#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1966#[serde(deny_unknown_fields)]
1967pub struct BenchAgenticCatalogInput {
1968 pub repository: String,
1969 pub revision: String,
1970 pub filename: String,
1971 pub sha256: String,
1972 #[serde(default)]
1973 pub cache_path: Option<PathBuf>,
1974 #[serde(default)]
1975 pub cache_state: Option<BenchDatasetCacheState>,
1976 pub trace_count: u32,
1977 pub approximate_bytes: u64,
1978 pub license: String,
1979 pub source_format: String,
1980 pub aiperf_loader: String,
1981 pub materialization_identity: String,
1982 pub scenario: String,
1983 pub concurrency_semantics: String,
1984 pub replay_semantics: String,
1985 pub cache_bust: String,
1986 pub trajectory_start_min: f64,
1987 pub trajectory_start_max: f64,
1988 pub global_idle_gap_cap_seconds: f64,
1989 pub trace_idle_gap_cap_seconds: f64,
1990 pub cache_warmup_requests_per_lane: u64,
1991 pub warmup_grace_seconds: u64,
1992 pub dataset_configuration_timeout_seconds: u64,
1993 pub service_profile_configuration_timeout_seconds: u64,
1994 pub default_duration_seconds: u64,
1995 pub default_seed: u64,
1996 pub minimum_duration_seconds: u64,
1997 pub failure_threshold: f64,
1998 pub dataset_entries: u32,
1999 pub streaming: bool,
2000 pub ignore_eos: bool,
2001 pub use_server_token_count: bool,
2002 pub gpu_telemetry: bool,
2003 pub metric_slice_seconds: u64,
2004 pub stats_interval_seconds: u64,
2005 pub http_tcp_user_timeout_ms: u64,
2006 pub realtime_metrics: bool,
2007 pub required_artifacts: Vec<String>,
2008 pub unavailable_dimensions: Vec<String>,
2009 pub inferencex_repository: String,
2010 pub inferencex_revision: String,
2011 pub inferencex_reference: String,
2012 pub aiperf_revision: String,
2013 pub aiperf_version: String,
2014}
2015
2016#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2018#[serde(deny_unknown_fields)]
2019pub struct BenchCaseInput {
2020 pub load_shape: BenchLoadInput,
2021 pub request_count: u32,
2022 #[serde(default)]
2023 pub warmup_request_count: u32,
2024 #[serde(default)]
2025 pub duration_seconds: Option<u64>,
2026 #[serde(default)]
2027 pub session_count: Option<u32>,
2028 #[serde(default)]
2029 pub warmup_session_count: Option<u32>,
2030}
2031
2032#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2034#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
2035pub enum BenchLoadInput {
2036 ConcurrencyLimited { concurrency: u32 },
2038 RequestRateLimited {
2040 request_rate: f64,
2041 burstiness: Option<f64>,
2042 },
2043 UnboundedRequestRate,
2045}
2046
2047#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2049#[serde(deny_unknown_fields)]
2050pub struct BenchRequestSloInput {
2051 #[serde(default)]
2052 pub request_latency_ms: Option<f64>,
2053 #[serde(default)]
2054 pub ttft_ms: Option<f64>,
2055 #[serde(default)]
2056 pub tpot_ms: Option<f64>,
2057 pub minimum_good_request_ratio: f64,
2058}
2059
2060#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2062#[serde(deny_unknown_fields)]
2063pub struct BenchPopulationInput {
2064 pub path: PathBuf,
2065 pub evidence_path: PathBuf,
2066 pub sha256: String,
2067 pub entries: u32,
2068 pub tpot_applicable: bool,
2069 #[serde(default)]
2070 pub session_templates: Vec<BenchSessionTemplateInput>,
2071}
2072
2073#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2076#[serde(deny_unknown_fields)]
2077pub struct BenchSessionTemplateInput {
2078 pub template_identity: String,
2079 pub turn_count: u32,
2080}
2081
2082#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2085#[serde(deny_unknown_fields)]
2086pub struct BenchPopulationPreparationRequest {
2087 pub protocol_version: ProtocolVersion,
2088 pub model: MeasurementModelInput,
2089 pub tokenizer_backend: String,
2090 pub transformers_version: String,
2091 #[serde(default)]
2092 pub request_source: Option<BenchRequestSourceInput>,
2093 #[serde(default)]
2094 pub session_source: Option<BenchSessionSourceInput>,
2095 pub prompt: BenchPromptInput,
2096 pub cache_start: BenchCacheStartInput,
2097 #[serde(default)]
2098 pub source_path: Option<PathBuf>,
2099 pub required_entries: u32,
2100 pub seed: u64,
2101 #[serde(default)]
2102 pub request_body: BTreeMap<String, SettingValue>,
2103 pub artifact_dir: PathBuf,
2104}
2105
2106#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2109#[serde(deny_unknown_fields)]
2110pub struct BenchTokenCountSummary {
2111 pub minimum: u32,
2112 pub maximum: u32,
2113 pub mean: f64,
2114}
2115
2116#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2119#[serde(rename_all = "snake_case")]
2120pub enum BenchPromptTemplateSource {
2121 RequestBody,
2122 PromptTable,
2123 TokenizerDefault,
2124}
2125
2126#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2128#[serde(deny_unknown_fields)]
2129pub struct BenchPromptTemplateProjection {
2130 pub source: BenchPromptTemplateSource,
2131 pub content: String,
2132 pub sha256: String,
2133}
2134
2135#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2137#[serde(deny_unknown_fields)]
2138pub struct BenchPromptTokenTargetingSummary {
2139 pub selected_prompt_tokens: BenchTokenCountSummary,
2140 pub pre_template_content_tokens: BenchTokenCountSummary,
2141 #[serde(default)]
2142 pub projection_template: Option<BenchPromptTemplateProjection>,
2143 pub exact_entries: u32,
2144 pub fallback_entries: u32,
2145 #[serde(default)]
2146 pub fallback_reasons: BTreeMap<String, u32>,
2147}
2148
2149#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2151#[serde(deny_unknown_fields)]
2152pub struct BenchPrefixGeometrySummary {
2153 pub shared_prefix_tokens: BenchTokenCountSummary,
2154 pub unique_suffix_tokens: BenchTokenCountSummary,
2155 pub maximum_shared_prefix_tokens: u32,
2156 pub canonical_prefix_sha256: String,
2157 pub full_prompt_entries: u32,
2158}
2159
2160#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2162#[serde(deny_unknown_fields)]
2163pub struct BenchPrefixConditioningInput {
2164 pub path: PathBuf,
2165 pub sha256: String,
2166 pub prompt_tokens: u32,
2167}
2168
2169#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2172#[serde(deny_unknown_fields)]
2173pub struct BenchSharedSystemContentSummary {
2174 pub system_content_tokens: BenchTokenCountSummary,
2175 pub user_content_tokens: BenchTokenCountSummary,
2176 pub canonical_system_content_sha256: String,
2177}
2178
2179#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2181#[serde(deny_unknown_fields)]
2182pub struct BenchPopulationPreparationResult {
2183 pub schema_version: u32,
2184 pub status: ClientStatus,
2185 pub materialization_identity: String,
2186 pub requested_entries: u32,
2187 pub candidate_entries: u64,
2188 pub admitted_entries: u64,
2189 pub ineligible_entries: u64,
2190 #[serde(default)]
2191 pub ineligible_reasons: BTreeMap<String, u64>,
2192 pub population: Option<BenchPopulationInput>,
2193 pub input_tokens: Option<BenchTokenCountSummary>,
2194 pub output_tokens: Option<BenchTokenCountSummary>,
2195 #[serde(default)]
2196 pub prompt_token_targeting: Option<BenchPromptTokenTargetingSummary>,
2197 #[serde(default)]
2198 pub prefix_geometry: Option<BenchPrefixGeometrySummary>,
2199 #[serde(default)]
2200 pub prefix_conditioning: Option<BenchPrefixConditioningInput>,
2201 #[serde(default)]
2202 pub shared_system_content: Option<BenchSharedSystemContentSummary>,
2203 pub evidence_path: Option<PathBuf>,
2204 pub error: Option<String>,
2205}
2206
2207#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2209#[serde(deny_unknown_fields)]
2210pub struct BenchClientResult {
2211 pub schema_version: u32,
2214 pub status: ClientStatus,
2215 pub completed_requests: u64,
2216 pub failed_requests: u64,
2217 pub normalization_schema: String,
2218 pub metrics: BTreeMap<String, f64>,
2219 #[serde(default)]
2220 pub request_slo: Option<BenchRequestSloResult>,
2221 #[serde(default)]
2222 pub session_evidence: Option<BenchSessionResultEvidence>,
2223 #[serde(default)]
2224 pub agentic_evidence: Option<Box<BenchAgenticResultEvidence>>,
2225 #[serde(default)]
2226 pub prompt_token_reconciliation: Vec<BenchPromptTokenReconciliation>,
2227 #[serde(default)]
2228 pub prompt_cache_observations: Vec<BenchPromptCacheObservation>,
2229 pub native_command: Vec<String>,
2230 pub native_exit_code: Option<i32>,
2231 #[serde(default)]
2232 pub report_invocations: Vec<BenchNativeInvocation>,
2233 pub raw_artifacts: Vec<RawArtifact>,
2234 pub error: Option<String>,
2235}
2236
2237#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2239#[serde(deny_unknown_fields)]
2240pub struct BenchPromptCacheObservation {
2241 pub request_id: u64,
2242 pub prompt_tokens: u64,
2243 pub cache_read_tokens: u64,
2244 pub uncached_prompt_tokens: u64,
2245 pub cache_read_ratio: f64,
2246}
2247
2248#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2249#[serde(deny_unknown_fields)]
2250pub struct BenchAgenticSourceVerification {
2251 pub repository: String,
2252 pub expected_revision: String,
2253 #[serde(default)]
2254 pub observed_revision: Option<String>,
2255 pub filename: String,
2256 pub expected_sha256: String,
2257 #[serde(default)]
2258 pub observed_sha256: Option<String>,
2259 #[serde(default)]
2260 pub cache_path: Option<PathBuf>,
2261 #[serde(default)]
2262 pub cache_state_before: Option<BenchDatasetCacheState>,
2263 #[serde(default)]
2264 pub acquisition_outcome: Option<BenchAgenticAcquisitionOutcome>,
2265}
2266
2267#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2268#[serde(rename_all = "snake_case")]
2269pub enum BenchAgenticAcquisitionOutcome {
2270 Reused,
2271 Downloaded,
2272}
2273
2274#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2275#[serde(deny_unknown_fields)]
2276pub struct BenchAgenticBranchStats {
2277 pub children_spawned: u64,
2278 pub children_completed: u64,
2279 pub children_errored: u64,
2280 pub children_truncated: u64,
2281 pub children_delayed: u64,
2282 pub parents_suspended: u64,
2283 pub parents_resumed: u64,
2284 pub parents_failed_due_to_child_error: u64,
2285 pub joins_suppressed: u64,
2286}
2287
2288#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2289#[serde(deny_unknown_fields)]
2290pub struct BenchAgenticResultEvidence {
2291 pub source: BenchAgenticSourceVerification,
2292 #[serde(default)]
2293 pub run: Option<Box<BenchAgenticRunEvidence>>,
2294}
2295
2296#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2297#[serde(deny_unknown_fields)]
2298pub struct BenchAgenticRunEvidence {
2299 pub native_run_id: String,
2300 pub scenario: String,
2301 pub submission_valid: bool,
2302 #[serde(default)]
2303 pub submission_invalid_reasons: Vec<String>,
2304 pub warmup_records: u64,
2305 pub warmup_error_records: u64,
2306 pub warmup_succeeded: bool,
2310 pub profiling_records: u64,
2311 pub distinct_runtime_conversations: u64,
2312 pub distinct_transport_requests: u64,
2313 pub context_overflow_count: u64,
2314 pub ordinary_failure_count: u64,
2315 pub branch_stats: BenchAgenticBranchStats,
2316 pub aggregate_artifact: PathBuf,
2317 #[serde(default)]
2320 pub raw_records_artifact: Option<PathBuf>,
2321 #[serde(default)]
2322 pub unavailable_dimensions: Vec<String>,
2323 #[serde(default)]
2326 pub warmup_source_coordinate_records: Option<u64>,
2327 #[serde(default)]
2330 pub source_coordinate_records: Option<u64>,
2331 #[serde(default)]
2334 pub distinct_source_traces: Option<u64>,
2335 #[serde(default)]
2338 pub cache_bust_records: Option<u64>,
2339}
2340
2341#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2343#[serde(deny_unknown_fields)]
2344pub struct BenchPromptTokenReconciliation {
2345 pub population_index: u32,
2346 pub native_session_num: u64,
2347 pub planned_prompt_tokens: u32,
2348 #[serde(default)]
2349 pub observed_prompt_tokens: Option<u32>,
2350 pub reconciled: bool,
2351}
2352
2353#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2355#[serde(deny_unknown_fields)]
2356pub struct BenchSessionPhaseSummary {
2357 pub planned_sessions: u32,
2358 pub started_sessions: u32,
2359 pub succeeded_sessions: u32,
2360 pub failed_sessions: u32,
2361 pub planned_requests: u32,
2362 pub attempted_requests: u32,
2363 pub completed_requests: u32,
2364 pub failed_requests: u32,
2365 pub reconciled: bool,
2366}
2367
2368#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2370#[serde(deny_unknown_fields)]
2371pub struct BenchRuntimeSessionResult {
2372 pub phase: String,
2373 pub runtime_session_id: String,
2374 pub template_identity: String,
2375 pub planned_turns: u32,
2376 pub attempted_turns: u32,
2377 pub status: ClientStatus,
2378 #[serde(default)]
2379 pub failure_classification: Option<String>,
2380 #[serde(default)]
2381 pub diagnostic: Option<String>,
2382 #[serde(default)]
2383 pub failing_turn: Option<u32>,
2384 pub suppressed_later_turns: u32,
2385}
2386
2387#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2389#[serde(deny_unknown_fields)]
2390pub struct BenchSessionTurnResult {
2391 pub phase: String,
2392 pub runtime_session_id: String,
2393 pub turn_index: u32,
2394 #[serde(default)]
2397 pub pre_template_content_tokens: Option<u32>,
2398 #[serde(default)]
2399 pub observed_prompt_tokens: Option<u32>,
2400 pub native_session_num: u64,
2401 #[serde(default)]
2402 pub preceding_native_session_num: Option<u64>,
2403 #[serde(default)]
2404 pub preceding_terminal_response_receipt_ns: Option<u64>,
2405 #[serde(default)]
2406 pub effective_inter_turn_delay_seconds: Option<f64>,
2407 pub request_start_ns: u64,
2408 #[serde(default)]
2409 pub inter_turn_delay_reconciled: Option<bool>,
2410 #[serde(default)]
2411 pub post_failure_continuation: bool,
2412 pub native_artifact_name: String,
2413}
2414
2415#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2417#[serde(deny_unknown_fields)]
2418pub struct BenchSessionResultEvidence {
2419 pub warmup: BenchSessionPhaseSummary,
2420 pub profiling: BenchSessionPhaseSummary,
2421 pub sessions: Vec<BenchRuntimeSessionResult>,
2422 pub turns: Vec<BenchSessionTurnResult>,
2423 pub population_slice_reconciled: bool,
2424 pub sessions_reconciled: bool,
2425 pub turn_order_reconciled: bool,
2426 pub inter_turn_delays_reconciled: bool,
2427 #[serde(default)]
2430 pub native_requests_reconciled: Option<bool>,
2431 pub counts_reconciled: bool,
2432 #[serde(default)]
2435 pub unavailable_dimensions: Vec<String>,
2436}
2437
2438#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2440#[serde(deny_unknown_fields)]
2441pub struct BenchNativeInvocation {
2442 pub purpose: String,
2443 pub command: Vec<String>,
2444 pub exit_code: Option<i32>,
2445 pub interrupted: bool,
2446 pub timed_out: bool,
2447}
2448
2449#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2451#[serde(deny_unknown_fields)]
2452pub struct BenchRequestSloResult {
2453 pub good_requests: u64,
2454 pub good_request_ratio: f64,
2455 pub goodput: f64,
2456 pub profiling_duration_seconds: f64,
2457 pub profiling_duration_source: String,
2458 pub request_count_reconciled: bool,
2459 #[serde(default)]
2460 pub native_aggregate_good_request_count: Option<u64>,
2461 #[serde(default)]
2462 pub native_aggregate_good_request_count_consistent: Option<bool>,
2463}
2464
2465#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2469#[serde(deny_unknown_fields)]
2470pub struct AdapterProtocol {
2471 pub request: AdapterRequest,
2472 pub response: AdapterResponse,
2473}
2474
2475#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2479#[serde(deny_unknown_fields)]
2480pub struct MeasurementProtocol {
2481 #[serde(default, skip_serializing_if = "Option::is_none")]
2482 pub eval_client_request: Option<EvalClientRequest>,
2483 #[serde(default, skip_serializing_if = "Option::is_none")]
2484 pub eval_client_result: Option<EvalClientResult>,
2485 #[serde(default, skip_serializing_if = "Option::is_none")]
2486 pub bench_client_request: Option<BenchClientRequest>,
2487 #[serde(default, skip_serializing_if = "Option::is_none")]
2488 pub bench_client_result: Option<BenchClientResult>,
2489 #[serde(default, skip_serializing_if = "Option::is_none")]
2490 pub bench_population_preparation_request: Option<BenchPopulationPreparationRequest>,
2491 #[serde(default, skip_serializing_if = "Option::is_none")]
2492 pub bench_population_preparation_result: Option<BenchPopulationPreparationResult>,
2493 #[serde(default, skip_serializing_if = "Option::is_none")]
2494 pub data_asset_preparation_request: Option<MeasurementDataAssetPreparationRequest>,
2495 #[serde(default, skip_serializing_if = "Option::is_none")]
2496 pub data_asset_preparation_result: Option<MeasurementDataAssetPreparationResult>,
2497}