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 minimum_duration_seconds: u64,
1996 pub failure_threshold: f64,
1997 pub dataset_entries: u32,
1998 pub streaming: bool,
1999 pub ignore_eos: bool,
2000 pub use_server_token_count: bool,
2001 pub gpu_telemetry: bool,
2002 pub server_metric_slice_seconds: u64,
2003 pub required_artifacts: Vec<String>,
2004 pub unavailable_dimensions: Vec<String>,
2005 pub inferencex_repository: String,
2006 pub inferencex_revision: String,
2007 pub inferencex_reference: String,
2008 pub aiperf_revision: String,
2009 pub aiperf_version: String,
2010}
2011
2012#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2014#[serde(deny_unknown_fields)]
2015pub struct BenchCaseInput {
2016 pub load_shape: BenchLoadInput,
2017 pub request_count: u32,
2018 #[serde(default)]
2019 pub warmup_request_count: u32,
2020 #[serde(default)]
2021 pub duration_seconds: Option<u64>,
2022 #[serde(default)]
2023 pub session_count: Option<u32>,
2024 #[serde(default)]
2025 pub warmup_session_count: Option<u32>,
2026}
2027
2028#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2030#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
2031pub enum BenchLoadInput {
2032 ConcurrencyLimited { concurrency: u32 },
2034 RequestRateLimited {
2036 request_rate: f64,
2037 burstiness: Option<f64>,
2038 },
2039 UnboundedRequestRate,
2041}
2042
2043#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2045#[serde(deny_unknown_fields)]
2046pub struct BenchRequestSloInput {
2047 #[serde(default)]
2048 pub request_latency_ms: Option<f64>,
2049 #[serde(default)]
2050 pub ttft_ms: Option<f64>,
2051 #[serde(default)]
2052 pub tpot_ms: Option<f64>,
2053 pub minimum_good_request_ratio: f64,
2054}
2055
2056#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2058#[serde(deny_unknown_fields)]
2059pub struct BenchPopulationInput {
2060 pub path: PathBuf,
2061 pub evidence_path: PathBuf,
2062 pub sha256: String,
2063 pub entries: u32,
2064 pub tpot_applicable: bool,
2065 #[serde(default)]
2066 pub session_templates: Vec<BenchSessionTemplateInput>,
2067}
2068
2069#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2072#[serde(deny_unknown_fields)]
2073pub struct BenchSessionTemplateInput {
2074 pub template_identity: String,
2075 pub turn_count: u32,
2076}
2077
2078#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2081#[serde(deny_unknown_fields)]
2082pub struct BenchPopulationPreparationRequest {
2083 pub protocol_version: ProtocolVersion,
2084 pub model: MeasurementModelInput,
2085 pub tokenizer_backend: String,
2086 pub transformers_version: String,
2087 #[serde(default)]
2088 pub request_source: Option<BenchRequestSourceInput>,
2089 #[serde(default)]
2090 pub session_source: Option<BenchSessionSourceInput>,
2091 pub prompt: BenchPromptInput,
2092 pub cache_start: BenchCacheStartInput,
2093 #[serde(default)]
2094 pub source_path: Option<PathBuf>,
2095 pub required_entries: u32,
2096 pub seed: u64,
2097 #[serde(default)]
2098 pub request_body: BTreeMap<String, SettingValue>,
2099 pub artifact_dir: PathBuf,
2100}
2101
2102#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2105#[serde(deny_unknown_fields)]
2106pub struct BenchTokenCountSummary {
2107 pub minimum: u32,
2108 pub maximum: u32,
2109 pub mean: f64,
2110}
2111
2112#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2115#[serde(rename_all = "snake_case")]
2116pub enum BenchPromptTemplateSource {
2117 RequestBody,
2118 PromptTable,
2119 TokenizerDefault,
2120}
2121
2122#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2124#[serde(deny_unknown_fields)]
2125pub struct BenchPromptTemplateProjection {
2126 pub source: BenchPromptTemplateSource,
2127 pub content: String,
2128 pub sha256: String,
2129}
2130
2131#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2133#[serde(deny_unknown_fields)]
2134pub struct BenchPromptTokenTargetingSummary {
2135 pub selected_prompt_tokens: BenchTokenCountSummary,
2136 pub pre_template_content_tokens: BenchTokenCountSummary,
2137 #[serde(default)]
2138 pub projection_template: Option<BenchPromptTemplateProjection>,
2139 pub exact_entries: u32,
2140 pub fallback_entries: u32,
2141 #[serde(default)]
2142 pub fallback_reasons: BTreeMap<String, u32>,
2143}
2144
2145#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2147#[serde(deny_unknown_fields)]
2148pub struct BenchPrefixGeometrySummary {
2149 pub shared_prefix_tokens: BenchTokenCountSummary,
2150 pub unique_suffix_tokens: BenchTokenCountSummary,
2151 pub maximum_shared_prefix_tokens: u32,
2152 pub canonical_prefix_sha256: String,
2153 pub full_prompt_entries: u32,
2154}
2155
2156#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2158#[serde(deny_unknown_fields)]
2159pub struct BenchPrefixConditioningInput {
2160 pub path: PathBuf,
2161 pub sha256: String,
2162 pub prompt_tokens: u32,
2163}
2164
2165#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2168#[serde(deny_unknown_fields)]
2169pub struct BenchSharedSystemContentSummary {
2170 pub system_content_tokens: BenchTokenCountSummary,
2171 pub user_content_tokens: BenchTokenCountSummary,
2172 pub canonical_system_content_sha256: String,
2173}
2174
2175#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2177#[serde(deny_unknown_fields)]
2178pub struct BenchPopulationPreparationResult {
2179 pub schema_version: u32,
2180 pub status: ClientStatus,
2181 pub materialization_identity: String,
2182 pub requested_entries: u32,
2183 pub candidate_entries: u64,
2184 pub admitted_entries: u64,
2185 pub ineligible_entries: u64,
2186 #[serde(default)]
2187 pub ineligible_reasons: BTreeMap<String, u64>,
2188 pub population: Option<BenchPopulationInput>,
2189 pub input_tokens: Option<BenchTokenCountSummary>,
2190 pub output_tokens: Option<BenchTokenCountSummary>,
2191 #[serde(default)]
2192 pub prompt_token_targeting: Option<BenchPromptTokenTargetingSummary>,
2193 #[serde(default)]
2194 pub prefix_geometry: Option<BenchPrefixGeometrySummary>,
2195 #[serde(default)]
2196 pub prefix_conditioning: Option<BenchPrefixConditioningInput>,
2197 #[serde(default)]
2198 pub shared_system_content: Option<BenchSharedSystemContentSummary>,
2199 pub evidence_path: Option<PathBuf>,
2200 pub error: Option<String>,
2201}
2202
2203#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2205#[serde(deny_unknown_fields)]
2206pub struct BenchClientResult {
2207 pub schema_version: u32,
2210 pub status: ClientStatus,
2211 pub completed_requests: u64,
2212 pub failed_requests: u64,
2213 pub normalization_schema: String,
2214 pub metrics: BTreeMap<String, f64>,
2215 #[serde(default)]
2216 pub request_slo: Option<BenchRequestSloResult>,
2217 #[serde(default)]
2218 pub session_evidence: Option<BenchSessionResultEvidence>,
2219 #[serde(default)]
2220 pub agentic_evidence: Option<Box<BenchAgenticResultEvidence>>,
2221 #[serde(default)]
2222 pub prompt_token_reconciliation: Vec<BenchPromptTokenReconciliation>,
2223 #[serde(default)]
2224 pub prompt_cache_observations: Vec<BenchPromptCacheObservation>,
2225 pub native_command: Vec<String>,
2226 pub native_exit_code: Option<i32>,
2227 #[serde(default)]
2228 pub report_invocations: Vec<BenchNativeInvocation>,
2229 pub raw_artifacts: Vec<RawArtifact>,
2230 pub error: Option<String>,
2231}
2232
2233#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2235#[serde(deny_unknown_fields)]
2236pub struct BenchPromptCacheObservation {
2237 pub request_id: u64,
2238 pub prompt_tokens: u64,
2239 pub cache_read_tokens: u64,
2240 pub uncached_prompt_tokens: u64,
2241 pub cache_read_ratio: f64,
2242}
2243
2244#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2245#[serde(deny_unknown_fields)]
2246pub struct BenchAgenticSourceVerification {
2247 pub repository: String,
2248 pub expected_revision: String,
2249 #[serde(default)]
2250 pub observed_revision: Option<String>,
2251 pub filename: String,
2252 pub expected_sha256: String,
2253 #[serde(default)]
2254 pub observed_sha256: Option<String>,
2255 #[serde(default)]
2256 pub cache_path: Option<PathBuf>,
2257 #[serde(default)]
2258 pub cache_state_before: Option<BenchDatasetCacheState>,
2259 #[serde(default)]
2260 pub acquisition_outcome: Option<BenchAgenticAcquisitionOutcome>,
2261}
2262
2263#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2264#[serde(rename_all = "snake_case")]
2265pub enum BenchAgenticAcquisitionOutcome {
2266 Reused,
2267 Downloaded,
2268}
2269
2270#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2271#[serde(deny_unknown_fields)]
2272pub struct BenchAgenticBranchStats {
2273 pub children_spawned: u64,
2274 pub children_completed: u64,
2275 pub children_errored: u64,
2276 pub children_truncated: u64,
2277 pub children_delayed: u64,
2278 pub parents_suspended: u64,
2279 pub parents_resumed: u64,
2280 pub parents_failed_due_to_child_error: u64,
2281 pub joins_suppressed: u64,
2282}
2283
2284#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2285#[serde(deny_unknown_fields)]
2286pub struct BenchAgenticResultEvidence {
2287 pub source: BenchAgenticSourceVerification,
2288 #[serde(default)]
2289 pub run: Option<Box<BenchAgenticRunEvidence>>,
2290}
2291
2292#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2293#[serde(deny_unknown_fields)]
2294pub struct BenchAgenticRunEvidence {
2295 pub native_run_id: String,
2296 pub scenario: String,
2297 pub submission_valid: bool,
2298 #[serde(default)]
2299 pub submission_invalid_reasons: Vec<String>,
2300 pub warmup_records: u64,
2301 pub warmup_error_records: u64,
2302 pub warmup_succeeded: bool,
2306 pub profiling_records: u64,
2307 pub distinct_runtime_conversations: u64,
2308 pub distinct_transport_requests: u64,
2309 pub context_overflow_count: u64,
2310 pub ordinary_failure_count: u64,
2311 pub branch_stats: BenchAgenticBranchStats,
2312 pub aggregate_artifact: PathBuf,
2313 #[serde(default)]
2316 pub raw_records_artifact: Option<PathBuf>,
2317 #[serde(default)]
2318 pub unavailable_dimensions: Vec<String>,
2319 #[serde(default)]
2322 pub warmup_source_coordinate_records: Option<u64>,
2323 #[serde(default)]
2326 pub source_coordinate_records: Option<u64>,
2327 #[serde(default)]
2330 pub distinct_source_traces: Option<u64>,
2331 #[serde(default)]
2334 pub cache_bust_records: Option<u64>,
2335}
2336
2337#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2339#[serde(deny_unknown_fields)]
2340pub struct BenchPromptTokenReconciliation {
2341 pub population_index: u32,
2342 pub native_session_num: u64,
2343 pub planned_prompt_tokens: u32,
2344 #[serde(default)]
2345 pub observed_prompt_tokens: Option<u32>,
2346 pub reconciled: bool,
2347}
2348
2349#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2351#[serde(deny_unknown_fields)]
2352pub struct BenchSessionPhaseSummary {
2353 pub planned_sessions: u32,
2354 pub started_sessions: u32,
2355 pub succeeded_sessions: u32,
2356 pub failed_sessions: u32,
2357 pub planned_requests: u32,
2358 pub attempted_requests: u32,
2359 pub completed_requests: u32,
2360 pub failed_requests: u32,
2361 pub reconciled: bool,
2362}
2363
2364#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2366#[serde(deny_unknown_fields)]
2367pub struct BenchRuntimeSessionResult {
2368 pub phase: String,
2369 pub runtime_session_id: String,
2370 pub template_identity: String,
2371 pub planned_turns: u32,
2372 pub attempted_turns: u32,
2373 pub status: ClientStatus,
2374 #[serde(default)]
2375 pub failure_classification: Option<String>,
2376 #[serde(default)]
2377 pub diagnostic: Option<String>,
2378 #[serde(default)]
2379 pub failing_turn: Option<u32>,
2380 pub suppressed_later_turns: u32,
2381}
2382
2383#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2385#[serde(deny_unknown_fields)]
2386pub struct BenchSessionTurnResult {
2387 pub phase: String,
2388 pub runtime_session_id: String,
2389 pub turn_index: u32,
2390 #[serde(default)]
2393 pub pre_template_content_tokens: Option<u32>,
2394 #[serde(default)]
2395 pub observed_prompt_tokens: Option<u32>,
2396 pub native_session_num: u64,
2397 #[serde(default)]
2398 pub preceding_native_session_num: Option<u64>,
2399 #[serde(default)]
2400 pub preceding_terminal_response_receipt_ns: Option<u64>,
2401 #[serde(default)]
2402 pub effective_inter_turn_delay_seconds: Option<f64>,
2403 pub request_start_ns: u64,
2404 #[serde(default)]
2405 pub inter_turn_delay_reconciled: Option<bool>,
2406 #[serde(default)]
2407 pub post_failure_continuation: bool,
2408 pub native_artifact_name: String,
2409}
2410
2411#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2413#[serde(deny_unknown_fields)]
2414pub struct BenchSessionResultEvidence {
2415 pub warmup: BenchSessionPhaseSummary,
2416 pub profiling: BenchSessionPhaseSummary,
2417 pub sessions: Vec<BenchRuntimeSessionResult>,
2418 pub turns: Vec<BenchSessionTurnResult>,
2419 pub population_slice_reconciled: bool,
2420 pub sessions_reconciled: bool,
2421 pub turn_order_reconciled: bool,
2422 pub inter_turn_delays_reconciled: bool,
2423 #[serde(default)]
2426 pub native_requests_reconciled: Option<bool>,
2427 pub counts_reconciled: bool,
2428 #[serde(default)]
2431 pub unavailable_dimensions: Vec<String>,
2432}
2433
2434#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2436#[serde(deny_unknown_fields)]
2437pub struct BenchNativeInvocation {
2438 pub purpose: String,
2439 pub command: Vec<String>,
2440 pub exit_code: Option<i32>,
2441 pub interrupted: bool,
2442 pub timed_out: bool,
2443}
2444
2445#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2447#[serde(deny_unknown_fields)]
2448pub struct BenchRequestSloResult {
2449 pub good_requests: u64,
2450 pub good_request_ratio: f64,
2451 pub goodput: f64,
2452 pub profiling_duration_seconds: f64,
2453 pub profiling_duration_source: String,
2454 pub request_count_reconciled: bool,
2455 #[serde(default)]
2456 pub native_aggregate_good_request_count: Option<u64>,
2457 #[serde(default)]
2458 pub native_aggregate_good_request_count_consistent: Option<bool>,
2459}
2460
2461#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2465#[serde(deny_unknown_fields)]
2466pub struct AdapterProtocol {
2467 pub request: AdapterRequest,
2468 pub response: AdapterResponse,
2469}
2470
2471#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2475#[serde(deny_unknown_fields)]
2476pub struct MeasurementProtocol {
2477 #[serde(default, skip_serializing_if = "Option::is_none")]
2478 pub eval_client_request: Option<EvalClientRequest>,
2479 #[serde(default, skip_serializing_if = "Option::is_none")]
2480 pub eval_client_result: Option<EvalClientResult>,
2481 #[serde(default, skip_serializing_if = "Option::is_none")]
2482 pub bench_client_request: Option<BenchClientRequest>,
2483 #[serde(default, skip_serializing_if = "Option::is_none")]
2484 pub bench_client_result: Option<BenchClientResult>,
2485 #[serde(default, skip_serializing_if = "Option::is_none")]
2486 pub bench_population_preparation_request: Option<BenchPopulationPreparationRequest>,
2487 #[serde(default, skip_serializing_if = "Option::is_none")]
2488 pub bench_population_preparation_result: Option<BenchPopulationPreparationResult>,
2489 #[serde(default, skip_serializing_if = "Option::is_none")]
2490 pub data_asset_preparation_request: Option<MeasurementDataAssetPreparationRequest>,
2491 #[serde(default, skip_serializing_if = "Option::is_none")]
2492 pub data_asset_preparation_result: Option<MeasurementDataAssetPreparationResult>,
2493}