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, Copy, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1714#[serde(rename_all = "snake_case")]
1715pub enum BenchOutputStopInput {
1716 #[default]
1717 Length,
1718 Eos,
1719}
1720
1721#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1723#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
1724pub enum BenchRequestSourceInput {
1725 Random {
1728 input_tokens: BenchTokenSelectorInput,
1729 output_tokens: BenchTokenSelectorInput,
1730 #[serde(default)]
1731 output_stop: BenchOutputStopInput,
1732 #[serde(default)]
1733 prefix_sharing: Option<BenchPrefixSharingInput>,
1734 #[serde(default)]
1735 shared_system_content: Option<BenchSharedSystemContentInput>,
1736 #[serde(default)]
1737 corpus: Option<BenchCorpusInput>,
1738 #[serde(default)]
1742 images: Option<BenchImagesInput>,
1743 },
1744 RandomMixture {
1747 shapes: Vec<BenchRandomShapeInput>,
1748 total_weight: u64,
1749 #[serde(default)]
1750 output_stop: BenchOutputStopInput,
1751 #[serde(default)]
1752 prefix_sharing: Option<BenchPrefixSharingInput>,
1753 },
1754 Dataset {
1757 dataset: String,
1758 #[serde(default)]
1759 profile: Option<String>,
1760 max_input_tokens: u32,
1761 output_tokens: Option<u32>,
1762 #[serde(default)]
1763 output_stop: BenchOutputStopInput,
1764 catalog: Box<BenchDatasetCatalogInput>,
1765 },
1766 Replay {
1770 path: String,
1773 #[serde(default)]
1774 expected_sha256: Option<String>,
1775 #[serde(default)]
1776 prefix_sharing: Option<BenchPrefixSharingInput>,
1777 },
1778}
1779
1780#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1782#[serde(untagged)]
1783pub enum BenchTokenSelectorInput {
1784 Fixed(u32),
1785 InclusiveUniform(BenchInclusiveUniformInput),
1786}
1787
1788#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1790#[serde(deny_unknown_fields)]
1791pub struct BenchInclusiveUniformInput {
1792 pub kind: BenchTokenDistributionKindInput,
1793 pub min: u32,
1794 pub max: u32,
1795}
1796
1797#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1798#[serde(rename_all = "snake_case")]
1799pub enum BenchTokenDistributionKindInput {
1800 InclusiveUniform,
1801}
1802
1803#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1805#[serde(untagged)]
1806pub enum BenchPrefixSharingInput {
1807 Tokens { shared_prefix_tokens: u32 },
1808 Ratio { shared_prefix_ratio: f64 },
1809}
1810
1811#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1814#[serde(untagged)]
1815pub enum BenchSharedSystemContentInput {
1816 Tokens { tokens: u32 },
1817 Ratio { ratio: f64 },
1818}
1819
1820#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1824#[serde(deny_unknown_fields)]
1825pub struct BenchCorpusInput {
1826 pub path: String,
1829 #[serde(default)]
1830 pub expected_sha256: Option<String>,
1831}
1832
1833#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1838#[serde(deny_unknown_fields)]
1839pub struct BenchImagesInput {
1840 pub width: u32,
1842 pub height: u32,
1844 pub count: u32,
1846 #[serde(default)]
1849 pub source: Option<BenchImageSourceInput>,
1850}
1851
1852#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1855#[serde(deny_unknown_fields)]
1856pub struct BenchImageSourceInput {
1857 pub path: String,
1859 pub resolved_path: PathBuf,
1861 #[serde(default)]
1864 pub expected_sha256: Option<String>,
1865 pub sampling: BenchImageSamplingInput,
1867}
1868
1869#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1872#[serde(rename_all = "kebab-case")]
1873pub enum BenchImageSamplingInput {
1874 RandomWithReplacement,
1876 ShuffleCycle,
1879 SequentialCycle,
1881}
1882
1883#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1885#[serde(deny_unknown_fields)]
1886pub struct BenchRandomShapeInput {
1887 pub input_tokens: u32,
1888 pub output_tokens: u32,
1889 pub weight: u32,
1890}
1891
1892#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1894#[serde(deny_unknown_fields)]
1895pub struct BenchDatasetCatalogInput {
1896 pub dataset: String,
1897 #[serde(default)]
1898 pub profile: Option<String>,
1899 pub source: String,
1900 pub upstream_identity: String,
1901 #[serde(default)]
1903 pub url: Option<String>,
1904 #[serde(default)]
1907 pub aiperf_dataset: Option<String>,
1908 pub sha256: String,
1909 pub source_format: String,
1910 pub aiperf_format: String,
1911 #[serde(default)]
1912 pub configuration: Option<String>,
1913 #[serde(default)]
1914 pub split: Option<String>,
1915 #[serde(default)]
1916 pub filter: Option<BenchDatasetFilterInput>,
1917 pub license: String,
1918 pub cache_path: PathBuf,
1919 pub cache_state: BenchDatasetCacheState,
1920 pub materialization_identity: String,
1921 pub provides_output_targets: bool,
1922}
1923
1924#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1925#[serde(deny_unknown_fields)]
1926pub struct BenchDatasetFilterInput {
1927 pub field: String,
1928 pub value: String,
1929}
1930
1931#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1933#[serde(rename_all = "snake_case")]
1934pub enum BenchDatasetCacheState {
1935 Missing,
1936 Present,
1937}
1938
1939#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1941#[serde(deny_unknown_fields)]
1942pub struct BenchSessionSourceInput {
1943 pub dataset: String,
1944 #[serde(default)]
1945 pub profile: Option<String>,
1946 pub max_input_tokens: u32,
1947 pub output_tokens: Option<u32>,
1948 #[serde(default)]
1949 pub output_stop: BenchOutputStopInput,
1950 pub inter_turn_delay_scale: f64,
1951 pub max_inter_turn_delay_seconds: Option<f64>,
1952 pub catalog: Box<BenchSessionDatasetCatalogInput>,
1953}
1954
1955#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
1958#[serde(deny_unknown_fields)]
1959pub struct BenchSessionDatasetCatalogInput {
1960 pub dataset: String,
1961 #[serde(default)]
1962 pub profile: Option<String>,
1963 pub source: String,
1964 pub upstream_identity: String,
1965 pub url: String,
1966 pub sha256: String,
1967 pub source_format: String,
1968 #[serde(default)]
1969 pub configuration: Option<String>,
1970 #[serde(default)]
1971 pub split: Option<String>,
1972 #[serde(default)]
1973 pub filter: Option<BenchDatasetFilterInput>,
1974 pub license: String,
1975 pub cache_path: PathBuf,
1976 pub cache_state: BenchDatasetCacheState,
1977 pub materialization_identity: String,
1978 pub provides_output_targets: bool,
1979}
1980
1981#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1983#[serde(deny_unknown_fields)]
1984pub struct BenchAgenticSourceInput {
1985 pub dataset: String,
1986 pub profile: String,
1987 pub catalog: Box<BenchAgenticCatalogInput>,
1988}
1989
1990#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
1991#[serde(deny_unknown_fields)]
1992pub struct BenchAgenticCatalogInput {
1993 pub repository: String,
1994 pub revision: String,
1995 pub filename: String,
1996 pub sha256: String,
1997 #[serde(default)]
1998 pub cache_path: Option<PathBuf>,
1999 #[serde(default)]
2000 pub cache_state: Option<BenchDatasetCacheState>,
2001 pub trace_count: u32,
2002 pub approximate_bytes: u64,
2003 pub license: String,
2004 pub source_format: String,
2005 pub aiperf_loader: String,
2006 pub materialization_identity: String,
2007 pub scenario: String,
2008 pub concurrency_semantics: String,
2009 pub replay_semantics: String,
2010 pub cache_bust: String,
2011 pub trajectory_start_min: f64,
2012 pub trajectory_start_max: f64,
2013 pub global_idle_gap_cap_seconds: f64,
2014 pub trace_idle_gap_cap_seconds: f64,
2015 pub cache_warmup_requests_per_lane: u64,
2016 pub warmup_grace_seconds: u64,
2017 pub dataset_configuration_timeout_seconds: u64,
2018 pub service_profile_configuration_timeout_seconds: u64,
2019 pub default_duration_seconds: u64,
2020 pub default_seed: u64,
2021 pub minimum_duration_seconds: u64,
2022 pub failure_threshold: f64,
2023 pub dataset_entries: u32,
2024 pub streaming: bool,
2025 pub ignore_eos: bool,
2026 pub use_server_token_count: bool,
2027 pub gpu_telemetry: bool,
2028 pub metric_slice_seconds: u64,
2029 pub stats_interval_seconds: u64,
2030 pub http_tcp_user_timeout_ms: u64,
2031 pub realtime_metrics: bool,
2032 pub required_artifacts: Vec<String>,
2033 pub unavailable_dimensions: Vec<String>,
2034 pub inferencex_repository: String,
2035 pub inferencex_revision: String,
2036 pub inferencex_reference: String,
2037 pub aiperf_revision: String,
2038 pub aiperf_version: String,
2039}
2040
2041#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2043#[serde(deny_unknown_fields)]
2044pub struct BenchCaseInput {
2045 pub load_shape: BenchLoadInput,
2046 pub request_count: u32,
2047 #[serde(default)]
2048 pub warmup_request_count: u32,
2049 #[serde(default)]
2050 pub duration_seconds: Option<u64>,
2051 #[serde(default)]
2052 pub session_count: Option<u32>,
2053 #[serde(default)]
2054 pub warmup_session_count: Option<u32>,
2055}
2056
2057#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2059#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
2060pub enum BenchLoadInput {
2061 ConcurrencyLimited { concurrency: u32 },
2063 RequestRateLimited {
2065 request_rate: f64,
2066 burstiness: Option<f64>,
2067 },
2068 UnboundedRequestRate,
2070}
2071
2072#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2074#[serde(deny_unknown_fields)]
2075pub struct BenchRequestSloInput {
2076 #[serde(default)]
2077 pub request_latency_ms: Option<f64>,
2078 #[serde(default)]
2079 pub ttft_ms: Option<f64>,
2080 #[serde(default)]
2081 pub tpot_ms: Option<f64>,
2082 pub minimum_good_request_ratio: f64,
2083}
2084
2085#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2087#[serde(deny_unknown_fields)]
2088pub struct BenchPopulationInput {
2089 pub path: PathBuf,
2090 pub evidence_path: PathBuf,
2091 pub sha256: String,
2092 pub entries: u32,
2093 pub tpot_applicable: bool,
2094 #[serde(default)]
2095 pub session_templates: Vec<BenchSessionTemplateInput>,
2096}
2097
2098#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2101#[serde(deny_unknown_fields)]
2102pub struct BenchSessionTemplateInput {
2103 pub template_identity: String,
2104 pub turn_count: u32,
2105}
2106
2107#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2110#[serde(deny_unknown_fields)]
2111pub struct BenchPopulationPreparationRequest {
2112 pub protocol_version: ProtocolVersion,
2113 pub model: MeasurementModelInput,
2114 pub tokenizer_backend: String,
2115 pub transformers_version: String,
2116 #[serde(default)]
2117 pub request_source: Option<BenchRequestSourceInput>,
2118 #[serde(default)]
2119 pub session_source: Option<BenchSessionSourceInput>,
2120 pub prompt: BenchPromptInput,
2121 pub cache_start: BenchCacheStartInput,
2122 #[serde(default)]
2123 pub source_path: Option<PathBuf>,
2124 pub required_entries: u32,
2125 pub seed: u64,
2126 #[serde(default)]
2127 pub request_body: BTreeMap<String, SettingValue>,
2128 pub artifact_dir: PathBuf,
2129}
2130
2131#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2134#[serde(deny_unknown_fields)]
2135pub struct BenchTokenCountSummary {
2136 pub minimum: u32,
2137 pub maximum: u32,
2138 pub mean: f64,
2139}
2140
2141#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2144#[serde(rename_all = "snake_case")]
2145pub enum BenchPromptTemplateSource {
2146 RequestBody,
2147 PromptTable,
2148 TokenizerDefault,
2149}
2150
2151#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2153#[serde(deny_unknown_fields)]
2154pub struct BenchPromptTemplateProjection {
2155 pub source: BenchPromptTemplateSource,
2156 pub content: String,
2157 pub sha256: String,
2158}
2159
2160#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2162#[serde(deny_unknown_fields)]
2163pub struct BenchPromptTokenTargetingSummary {
2164 pub selected_prompt_tokens: BenchTokenCountSummary,
2165 pub pre_template_content_tokens: BenchTokenCountSummary,
2166 #[serde(default)]
2167 pub projection_template: Option<BenchPromptTemplateProjection>,
2168 pub exact_entries: u32,
2169 pub fallback_entries: u32,
2170 #[serde(default)]
2171 pub fallback_reasons: BTreeMap<String, u32>,
2172}
2173
2174#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2176#[serde(deny_unknown_fields)]
2177pub struct BenchPrefixGeometrySummary {
2178 pub shared_prefix_tokens: BenchTokenCountSummary,
2179 pub unique_suffix_tokens: BenchTokenCountSummary,
2180 pub maximum_shared_prefix_tokens: u32,
2181 pub canonical_prefix_sha256: String,
2182 pub full_prompt_entries: u32,
2183}
2184
2185#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2187#[serde(deny_unknown_fields)]
2188pub struct BenchPrefixConditioningInput {
2189 pub path: PathBuf,
2190 pub sha256: String,
2191 pub prompt_tokens: u32,
2192}
2193
2194#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2197#[serde(deny_unknown_fields)]
2198pub struct BenchSharedSystemContentSummary {
2199 pub system_content_tokens: BenchTokenCountSummary,
2200 pub user_content_tokens: BenchTokenCountSummary,
2201 pub canonical_system_content_sha256: String,
2202}
2203
2204#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2206#[serde(deny_unknown_fields)]
2207pub struct BenchPopulationPreparationResult {
2208 pub schema_version: u32,
2209 pub status: ClientStatus,
2210 pub materialization_identity: String,
2211 pub requested_entries: u32,
2212 pub candidate_entries: u64,
2213 pub admitted_entries: u64,
2214 pub ineligible_entries: u64,
2215 #[serde(default)]
2216 pub ineligible_reasons: BTreeMap<String, u64>,
2217 pub population: Option<BenchPopulationInput>,
2218 pub input_tokens: Option<BenchTokenCountSummary>,
2219 pub output_tokens: Option<BenchTokenCountSummary>,
2220 #[serde(default)]
2221 pub prompt_token_targeting: Option<BenchPromptTokenTargetingSummary>,
2222 #[serde(default)]
2223 pub prefix_geometry: Option<BenchPrefixGeometrySummary>,
2224 #[serde(default)]
2225 pub prefix_conditioning: Option<BenchPrefixConditioningInput>,
2226 #[serde(default)]
2227 pub shared_system_content: Option<BenchSharedSystemContentSummary>,
2228 pub evidence_path: Option<PathBuf>,
2229 pub error: Option<String>,
2230}
2231
2232#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2234#[serde(deny_unknown_fields)]
2235pub struct BenchClientResult {
2236 pub schema_version: u32,
2239 pub status: ClientStatus,
2240 pub completed_requests: u64,
2241 pub failed_requests: u64,
2242 pub normalization_schema: String,
2243 pub metrics: BTreeMap<String, f64>,
2244 #[serde(default)]
2245 pub request_slo: Option<BenchRequestSloResult>,
2246 #[serde(default)]
2247 pub session_evidence: Option<BenchSessionResultEvidence>,
2248 #[serde(default)]
2249 pub agentic_evidence: Option<Box<BenchAgenticResultEvidence>>,
2250 #[serde(default)]
2251 pub prompt_token_reconciliation: Vec<BenchPromptTokenReconciliation>,
2252 #[serde(default)]
2253 pub prompt_cache_observations: Vec<BenchPromptCacheObservation>,
2254 pub native_command: Vec<String>,
2255 pub native_exit_code: Option<i32>,
2256 #[serde(default)]
2257 pub report_invocations: Vec<BenchNativeInvocation>,
2258 #[serde(default)]
2261 pub acceptance_sources: BTreeMap<String, BenchAcceptanceSource>,
2262 pub raw_artifacts: Vec<RawArtifact>,
2263 pub error: Option<String>,
2264}
2265
2266#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2270#[serde(rename_all = "snake_case")]
2271pub enum BenchAcceptanceSource {
2272 Records,
2273 Summary,
2274 ServerMetrics,
2275}
2276
2277#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2279#[serde(deny_unknown_fields)]
2280pub struct BenchPromptCacheObservation {
2281 pub request_id: u64,
2282 pub prompt_tokens: u64,
2283 pub cache_read_tokens: u64,
2284 pub uncached_prompt_tokens: u64,
2285 pub cache_read_ratio: f64,
2286}
2287
2288#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2289#[serde(deny_unknown_fields)]
2290pub struct BenchAgenticSourceVerification {
2291 pub repository: String,
2292 pub expected_revision: String,
2293 #[serde(default)]
2294 pub observed_revision: Option<String>,
2295 pub filename: String,
2296 pub expected_sha256: String,
2297 #[serde(default)]
2298 pub observed_sha256: Option<String>,
2299 #[serde(default)]
2300 pub cache_path: Option<PathBuf>,
2301 #[serde(default)]
2302 pub cache_state_before: Option<BenchDatasetCacheState>,
2303 #[serde(default)]
2304 pub acquisition_outcome: Option<BenchAgenticAcquisitionOutcome>,
2305}
2306
2307#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2308#[serde(rename_all = "snake_case")]
2309pub enum BenchAgenticAcquisitionOutcome {
2310 Reused,
2311 Downloaded,
2312}
2313
2314#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2315#[serde(deny_unknown_fields)]
2316pub struct BenchAgenticBranchStats {
2317 pub children_spawned: u64,
2318 pub children_completed: u64,
2319 pub children_errored: u64,
2320 pub children_truncated: u64,
2321 pub children_delayed: u64,
2322 pub parents_suspended: u64,
2323 pub parents_resumed: u64,
2324 pub parents_failed_due_to_child_error: u64,
2325 pub joins_suppressed: u64,
2326}
2327
2328#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2329#[serde(deny_unknown_fields)]
2330pub struct BenchAgenticResultEvidence {
2331 pub source: BenchAgenticSourceVerification,
2332 #[serde(default)]
2333 pub run: Option<Box<BenchAgenticRunEvidence>>,
2334}
2335
2336#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
2337#[serde(deny_unknown_fields)]
2338pub struct BenchAgenticRunEvidence {
2339 pub native_run_id: String,
2340 pub scenario: String,
2341 pub submission_valid: bool,
2342 #[serde(default)]
2343 pub submission_invalid_reasons: Vec<String>,
2344 pub warmup_records: u64,
2345 pub warmup_error_records: u64,
2346 pub warmup_succeeded: bool,
2350 pub profiling_records: u64,
2351 pub distinct_runtime_conversations: u64,
2352 pub distinct_transport_requests: u64,
2353 pub context_overflow_count: u64,
2354 pub ordinary_failure_count: u64,
2355 pub branch_stats: BenchAgenticBranchStats,
2356 pub aggregate_artifact: PathBuf,
2357 #[serde(default)]
2360 pub raw_records_artifact: Option<PathBuf>,
2361 #[serde(default)]
2362 pub unavailable_dimensions: Vec<String>,
2363 #[serde(default)]
2366 pub warmup_source_coordinate_records: Option<u64>,
2367 #[serde(default)]
2370 pub source_coordinate_records: Option<u64>,
2371 #[serde(default)]
2374 pub distinct_source_traces: Option<u64>,
2375 #[serde(default)]
2378 pub cache_bust_records: Option<u64>,
2379}
2380
2381#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2383#[serde(deny_unknown_fields)]
2384pub struct BenchPromptTokenReconciliation {
2385 pub population_index: u32,
2386 pub native_session_num: u64,
2387 pub planned_prompt_tokens: u32,
2388 #[serde(default)]
2389 pub observed_prompt_tokens: Option<u32>,
2390 pub reconciled: bool,
2391}
2392
2393#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2395#[serde(deny_unknown_fields)]
2396pub struct BenchSessionPhaseSummary {
2397 pub planned_sessions: u32,
2398 pub started_sessions: u32,
2399 pub succeeded_sessions: u32,
2400 pub failed_sessions: u32,
2401 pub planned_requests: u32,
2402 pub attempted_requests: u32,
2403 pub completed_requests: u32,
2404 pub failed_requests: u32,
2405 pub reconciled: bool,
2406}
2407
2408#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2410#[serde(deny_unknown_fields)]
2411pub struct BenchRuntimeSessionResult {
2412 pub phase: String,
2413 pub runtime_session_id: String,
2414 pub template_identity: String,
2415 pub planned_turns: u32,
2416 pub attempted_turns: u32,
2417 pub status: ClientStatus,
2418 #[serde(default)]
2419 pub failure_classification: Option<String>,
2420 #[serde(default)]
2421 pub diagnostic: Option<String>,
2422 #[serde(default)]
2423 pub failing_turn: Option<u32>,
2424 pub suppressed_later_turns: u32,
2425}
2426
2427#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2429#[serde(deny_unknown_fields)]
2430pub struct BenchSessionTurnResult {
2431 pub phase: String,
2432 pub runtime_session_id: String,
2433 pub turn_index: u32,
2434 #[serde(default)]
2437 pub pre_template_content_tokens: Option<u32>,
2438 #[serde(default)]
2439 pub observed_prompt_tokens: Option<u32>,
2440 pub native_session_num: u64,
2441 #[serde(default)]
2442 pub preceding_native_session_num: Option<u64>,
2443 #[serde(default)]
2444 pub preceding_terminal_response_receipt_ns: Option<u64>,
2445 #[serde(default)]
2446 pub effective_inter_turn_delay_seconds: Option<f64>,
2447 pub request_start_ns: u64,
2448 #[serde(default)]
2449 pub inter_turn_delay_reconciled: Option<bool>,
2450 #[serde(default)]
2451 pub post_failure_continuation: bool,
2452 pub native_artifact_name: String,
2453}
2454
2455#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2457#[serde(deny_unknown_fields)]
2458pub struct BenchSessionResultEvidence {
2459 pub warmup: BenchSessionPhaseSummary,
2460 pub profiling: BenchSessionPhaseSummary,
2461 pub sessions: Vec<BenchRuntimeSessionResult>,
2462 pub turns: Vec<BenchSessionTurnResult>,
2463 pub population_slice_reconciled: bool,
2464 pub sessions_reconciled: bool,
2465 pub turn_order_reconciled: bool,
2466 pub inter_turn_delays_reconciled: bool,
2467 #[serde(default)]
2470 pub native_requests_reconciled: Option<bool>,
2471 pub counts_reconciled: bool,
2472 #[serde(default)]
2475 pub unavailable_dimensions: Vec<String>,
2476}
2477
2478#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2480#[serde(deny_unknown_fields)]
2481pub struct BenchNativeInvocation {
2482 pub purpose: String,
2483 pub command: Vec<String>,
2484 pub exit_code: Option<i32>,
2485 pub interrupted: bool,
2486 pub timed_out: bool,
2487}
2488
2489#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2491#[serde(deny_unknown_fields)]
2492pub struct BenchRequestSloResult {
2493 pub good_requests: u64,
2494 pub good_request_ratio: f64,
2495 pub goodput: f64,
2496 pub profiling_duration_seconds: f64,
2497 pub profiling_duration_source: String,
2498 pub request_count_reconciled: bool,
2499 #[serde(default)]
2500 pub native_aggregate_good_request_count: Option<u64>,
2501 #[serde(default)]
2502 pub native_aggregate_good_request_count_consistent: Option<bool>,
2503}
2504
2505#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2509#[serde(deny_unknown_fields)]
2510pub struct AdapterProtocol {
2511 pub request: AdapterRequest,
2512 pub response: AdapterResponse,
2513}
2514
2515#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
2519#[serde(deny_unknown_fields)]
2520pub struct MeasurementProtocol {
2521 #[serde(default, skip_serializing_if = "Option::is_none")]
2522 pub eval_client_request: Option<EvalClientRequest>,
2523 #[serde(default, skip_serializing_if = "Option::is_none")]
2524 pub eval_client_result: Option<EvalClientResult>,
2525 #[serde(default, skip_serializing_if = "Option::is_none")]
2526 pub bench_client_request: Option<BenchClientRequest>,
2527 #[serde(default, skip_serializing_if = "Option::is_none")]
2528 pub bench_client_result: Option<BenchClientResult>,
2529 #[serde(default, skip_serializing_if = "Option::is_none")]
2530 pub bench_population_preparation_request: Option<BenchPopulationPreparationRequest>,
2531 #[serde(default, skip_serializing_if = "Option::is_none")]
2532 pub bench_population_preparation_result: Option<BenchPopulationPreparationResult>,
2533 #[serde(default, skip_serializing_if = "Option::is_none")]
2534 pub data_asset_preparation_request: Option<MeasurementDataAssetPreparationRequest>,
2535 #[serde(default, skip_serializing_if = "Option::is_none")]
2536 pub data_asset_preparation_result: Option<MeasurementDataAssetPreparationResult>,
2537}