1use schemars::JsonSchema;
9use serde::{Deserialize, Serialize};
10use std::collections::BTreeMap;
11use std::path::PathBuf;
12
13#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
17pub enum ProtocolVersion {
18 #[serde(rename = "5")]
20 V5,
21}
22
23#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
26#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
27pub enum AdapterRequest {
28 PlanServe {
31 protocol_version: ProtocolVersion,
32 input: PlanServeInput,
33 },
34 RenderServe {
37 protocol_version: ProtocolVersion,
38 input: RenderServeInput,
39 },
40}
41
42impl AdapterRequest {
43 #[must_use]
45 pub const fn protocol_version(&self) -> ProtocolVersion {
46 match self {
47 Self::PlanServe {
48 protocol_version, ..
49 }
50 | Self::RenderServe {
51 protocol_version, ..
52 } => *protocol_version,
53 }
54 }
55}
56
57#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
59#[serde(deny_unknown_fields)]
60pub struct PlanServeInput {
61 pub model: ServeModelInput,
62 pub topology: ServeTopology,
63 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub routing_backend: Option<String>,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub kv_transfer: Option<KvTransferMechanism>,
67 pub roles: Vec<ServeRoleInput>,
68 #[serde(default)]
69 pub profiling: bool,
70}
71
72#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
75#[serde(deny_unknown_fields)]
76pub struct RenderServeInput {
77 pub model: ServeModelInput,
78 pub topology: ServeTopology,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub routing_backend: Option<String>,
81 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub kv_transfer: Option<KvTransferMechanism>,
83 pub roles: Vec<ServeRoleResult>,
84 pub routing: RoutingResult,
85 pub links: Vec<ServeRoleLink>,
86 pub allocations: Vec<ServeProcessAllocation>,
87 #[serde(default)]
88 pub render_inputs: Vec<SuppliedRenderInput>,
89 #[serde(default)]
90 pub profiling: bool,
91}
92
93#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
95#[serde(rename_all = "snake_case")]
96pub enum ServeTopology {
97 Single,
99 PrefillDecode,
101}
102
103#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
105#[serde(rename_all = "snake_case")]
106pub enum ServeRoleKind {
107 Serve,
109 Prefill,
111 Decode,
113 Router,
115}
116
117#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
119#[serde(rename_all = "snake_case")]
120pub enum KvTransferMechanism {
121 Mooncake,
123 Nixl,
125}
126
127#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
130#[serde(deny_unknown_fields)]
131pub struct ServeRoleInput {
132 pub id: String,
133 pub kind: ServeRoleKind,
134 pub replica_count: u32,
135 pub parallelism: Parallelism,
136 pub settings: BTreeMap<String, SettingValue>,
137}
138
139#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
142#[serde(deny_unknown_fields)]
143pub struct ServeRoleResult {
144 pub id: String,
145 pub kind: ServeRoleKind,
146 pub declared_replica_count: u32,
147 pub effective_replica_count: u32,
148 pub effective_settings: BTreeMap<String, SettingValue>,
149 pub effective_parallelism: Parallelism,
150}
151
152#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
157#[serde(default, deny_unknown_fields)]
158pub struct Parallelism {
159 #[serde(skip_serializing_if = "Option::is_none")]
161 pub outer: Option<ParallelismOuter>,
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub attention: Option<ParallelismAttention>,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub experts: Option<ParallelismExperts>,
168}
169
170impl Parallelism {
171 pub fn merge_from(&mut self, other: &Self) {
174 if let Some(other) = &other.outer {
175 self.outer.get_or_insert_default().merge_from(other);
176 }
177 if let Some(other) = &other.attention {
178 self.attention.get_or_insert_default().merge_from(other);
179 }
180 if let Some(other) = &other.experts {
181 self.experts.get_or_insert_default().merge_from(other);
182 }
183 }
184}
185
186#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
188#[serde(default, deny_unknown_fields)]
189pub struct ParallelismOuter {
190 #[schemars(range(min = 1))]
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub tensor_parallel_size: Option<u32>,
193 #[schemars(range(min = 1))]
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub pipeline_parallel_size: Option<u32>,
196}
197
198impl ParallelismOuter {
199 fn merge_from(&mut self, other: &Self) {
200 if other.tensor_parallel_size.is_some() {
201 self.tensor_parallel_size = other.tensor_parallel_size;
202 }
203 if other.pipeline_parallel_size.is_some() {
204 self.pipeline_parallel_size = other.pipeline_parallel_size;
205 }
206 }
207}
208
209#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
211#[serde(default, deny_unknown_fields)]
212pub struct ParallelismAttention {
213 #[schemars(range(min = 1))]
214 #[serde(skip_serializing_if = "Option::is_none")]
215 pub tensor_parallel_size: Option<u32>,
216 #[schemars(range(min = 1))]
217 #[serde(skip_serializing_if = "Option::is_none")]
218 pub data_parallel_size: Option<u32>,
219 #[schemars(range(min = 1))]
220 #[serde(skip_serializing_if = "Option::is_none")]
221 pub context_parallel_size: Option<u32>,
222}
223
224impl ParallelismAttention {
225 fn merge_from(&mut self, other: &Self) {
226 if other.tensor_parallel_size.is_some() {
227 self.tensor_parallel_size = other.tensor_parallel_size;
228 }
229 if other.data_parallel_size.is_some() {
230 self.data_parallel_size = other.data_parallel_size;
231 }
232 if other.context_parallel_size.is_some() {
233 self.context_parallel_size = other.context_parallel_size;
234 }
235 }
236}
237
238#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
240#[serde(default, deny_unknown_fields)]
241pub struct ParallelismExperts {
242 #[schemars(range(min = 1))]
243 #[serde(skip_serializing_if = "Option::is_none")]
244 pub tensor_parallel_size: Option<u32>,
245 #[schemars(range(min = 1))]
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub data_parallel_size: Option<u32>,
248 #[schemars(range(min = 1))]
249 #[serde(skip_serializing_if = "Option::is_none")]
250 pub expert_parallel_size: Option<u32>,
251 #[schemars(range(min = 1))]
252 #[serde(skip_serializing_if = "Option::is_none")]
253 pub dense_tensor_parallel_size: Option<u32>,
254}
255
256impl ParallelismExperts {
257 fn merge_from(&mut self, other: &Self) {
258 if other.tensor_parallel_size.is_some() {
259 self.tensor_parallel_size = other.tensor_parallel_size;
260 }
261 if other.data_parallel_size.is_some() {
262 self.data_parallel_size = other.data_parallel_size;
263 }
264 if other.expert_parallel_size.is_some() {
265 self.expert_parallel_size = other.expert_parallel_size;
266 }
267 if other.dense_tensor_parallel_size.is_some() {
268 self.dense_tensor_parallel_size = other.dense_tensor_parallel_size;
269 }
270 }
271}
272
273#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
275#[serde(deny_unknown_fields)]
276pub struct ServeModelInput {
277 pub id: String,
278 pub served_name: String,
279}
280
281#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
285#[serde(deny_unknown_fields)]
286pub struct MeasurementModelInput {
287 pub locator: String,
288 pub served_name: String,
289}
290
291#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
293#[serde(deny_unknown_fields)]
294pub struct EndpointAssignment {
295 pub host: String,
296 pub port: u16,
297}
298
299#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
301#[serde(deny_unknown_fields)]
302pub struct ClientEndpointInput {
303 pub protocol: EndpointProtocol,
304 pub host: String,
305 pub port: u16,
306 pub api_path: String,
307}
308
309#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
311#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
312pub enum EvalDefinitionInput {
313 #[serde(rename = "openai_smoke")]
315 OpenAiSmoke {
316 prompt: String,
317 max_tokens: u32,
318 timeout_seconds: u64,
319 },
320 LmEval {
322 task: String,
323 dataset: Option<String>,
324 split: Option<String>,
325 limit: Option<u32>,
326 few_shot: Option<u32>,
327 seed: Option<u64>,
328 max_tokens: Option<u32>,
329 concurrency: Option<u32>,
330 metric: String,
331 threshold: f64,
332 timeout_seconds: u64,
333 },
334}
335
336#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
338#[serde(deny_unknown_fields)]
339pub struct BenchDefinitionInput {
340 pub input_tokens: u32,
341 pub output_tokens: u32,
342 pub seed: u64,
343 pub temperature: f64,
344 pub timeout_seconds: u64,
345 #[serde(default)]
346 pub reset_prefix_cache: bool,
347}
348
349#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
352#[serde(untagged)]
353pub enum SettingValue {
354 Bool(bool),
356 Integer(i64),
358 Float(f64),
360 String(String),
362 Array(Vec<SettingValue>),
364 Object(BTreeMap<String, SettingValue>),
366}
367
368#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
370#[serde(tag = "status", rename_all = "snake_case", deny_unknown_fields)]
371pub enum AdapterResponse {
372 Ok {
374 protocol_version: ProtocolVersion,
375 result: Box<AdapterResult>,
376 },
377 Error {
379 protocol_version: ProtocolVersion,
380 error: AdapterError,
381 },
382}
383
384impl AdapterResponse {
385 #[must_use]
387 pub const fn protocol_version(&self) -> ProtocolVersion {
388 match self {
389 Self::Ok {
390 protocol_version, ..
391 }
392 | Self::Error {
393 protocol_version, ..
394 } => *protocol_version,
395 }
396 }
397}
398
399#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
402#[serde(tag = "operation", rename_all = "snake_case", deny_unknown_fields)]
403pub enum AdapterResult {
404 PlanServe { output: Box<PlanServeResult> },
406 RenderServe { output: Box<RenderServeResult> },
408}
409
410#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
414#[serde(deny_unknown_fields)]
415pub struct PlanServeResult {
416 pub integration: IntegrationIdentity,
417 pub roles: Vec<ServeRoleResult>,
418 pub replicas: Vec<ServeReplicaRequirement>,
419 pub links: Vec<ServeRoleLink>,
420 pub routing: RoutingResult,
421 pub endpoint: EndpointRequirement,
422 #[serde(default)]
423 pub render_inputs: Vec<RenderInputDeclaration>,
424}
425
426#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
429#[serde(deny_unknown_fields)]
430pub struct RenderInputDeclaration {
431 pub source_path: String,
432}
433
434#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
437#[serde(deny_unknown_fields)]
438pub struct SuppliedRenderInput {
439 pub source_path: String,
440 pub text: String,
441 pub sha256: String,
442}
443
444#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
447#[serde(deny_unknown_fields)]
448pub struct ServeReplicaRequirement {
449 pub id: String,
450 pub role_id: String,
451 pub replica_index: u32,
452 pub device_count: u32,
453 pub ports: Vec<String>,
454 pub primary_ports: Vec<String>,
455 pub primary_readiness: ReadinessProbe,
456 pub worker_readiness: ReadinessProbe,
457 #[serde(default, skip_serializing_if = "Option::is_none")]
458 pub capture_target: Option<CaptureTargetRequirement>,
459}
460
461#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
465#[serde(deny_unknown_fields)]
466pub struct ServeProcessAllocation {
467 pub process: String,
468 pub role: String,
469 pub replica: u32,
470 pub rank: u32,
471 pub rank_count: u32,
472 pub machine: String,
473 pub devices: Vec<u32>,
474 #[serde(default, skip_serializing_if = "Option::is_none")]
475 pub model_locator: Option<String>,
476 #[serde(default, skip_serializing_if = "Option::is_none")]
477 pub endpoint: Option<EndpointAssignment>,
478 pub ports: BTreeMap<String, EndpointAssignment>,
479 pub cache: String,
480 pub launch: AllocationLaunch,
481 #[serde(default)]
482 pub dependencies: Vec<String>,
483}
484
485#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
487#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
488pub enum AllocationLaunch {
489 Local,
490 Ssh { target: String },
491}
492
493#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
496#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
497pub enum ServeRoleLink {
498 RequestRouting {
500 source: String,
501 targets: Vec<String>,
502 },
503 KvTransfer {
505 source: String,
506 target: String,
507 mechanism: KvTransferMechanism,
508 },
509 Bootstrap {
511 source: String,
512 target: String,
513 port: String,
514 },
515 SideChannel {
517 source: String,
518 target: String,
519 port: String,
520 },
521}
522
523#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
525#[serde(tag = "owner", rename_all = "snake_case", deny_unknown_fields)]
526pub enum RoutingResult {
527 Direct {
528 role: String,
529 replica: u32,
530 },
531 InferlabBuiltin {
532 implementation: BuiltinRouterKind,
533 policy: String,
534 prefill_role: String,
535 decode_role: String,
536 #[serde(default)]
537 ports: Vec<String>,
538 readiness: ReadinessProbe,
539 },
540 IntegrationNative {
541 role: String,
542 replica: u32,
543 policy: String,
544 },
545}
546
547#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
549#[serde(rename_all = "snake_case")]
550pub enum BuiltinRouterKind {
551 VllmMooncake,
552 VllmNixl,
553 Sglang,
554 Trtllm,
555}
556
557#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
560#[serde(deny_unknown_fields)]
561pub struct CaptureTargetRequirement {
562 pub control: CaptureControlRequirement,
563}
564
565#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
567#[serde(deny_unknown_fields)]
568pub struct CaptureControlRequirement {
569 pub start_path: String,
570 pub stop_path: String,
571}
572
573#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
576#[serde(deny_unknown_fields)]
577pub struct RenderServeResult {
578 pub integration: IntegrationIdentity,
579 pub processes: Vec<RenderedServeProcess>,
580}
581
582#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
584#[serde(deny_unknown_fields)]
585pub struct RenderedServeProcess {
586 pub process: String,
587 pub role: String,
588 pub replica: u32,
589 pub rank: u32,
590 pub rank_count: u32,
591 pub launch_files: Vec<LaunchFileDeclaration>,
592 pub command: ProcessSpec,
593}
594
595#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
597#[serde(deny_unknown_fields)]
598pub struct LaunchFileDeclaration {
599 pub relative_path: String,
600 pub text: String,
601 pub sha256: String,
602}
603
604#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
606#[serde(deny_unknown_fields)]
607pub struct HttpActionSpec {
608 pub method: HttpMethod,
609 pub path: String,
610}
611
612#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
614#[serde(rename_all = "snake_case")]
615pub enum HttpMethod {
616 Post,
618}
619
620#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
623#[serde(deny_unknown_fields)]
624pub struct IntegrationIdentity {
625 pub adapter_id: String,
626 pub adapter_version: String,
627 pub framework: String,
628 pub framework_version: String,
629}
630
631#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
633#[serde(deny_unknown_fields)]
634pub struct ProcessSpec {
635 pub argv: Vec<String>,
636 pub env: BTreeMap<String, String>,
637}
638
639#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
641#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
642pub enum ReadinessProbe {
643 Http { path: String },
645 HttpTargetRegistry(Box<HttpTargetRegistryReadiness>),
648 ProcessAlive,
650}
651
652#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
654#[serde(deny_unknown_fields)]
655pub struct HttpTargetRegistryReadiness {
656 pub target_scheme: TargetEndpointScheme,
657 pub readiness_path: String,
658 pub registry_path: String,
659 pub targets_field: String,
660 pub target_url_field: String,
661 pub target_role_field: String,
662 pub target_healthy_field: String,
663 pub target_bootstrap_port_field: String,
664 pub prefill_role_value: String,
665 pub decode_role_value: String,
666 pub prefill_bootstrap_port: String,
667}
668
669#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
671#[serde(rename_all = "snake_case")]
672pub enum TargetEndpointScheme {
673 Http,
675 Grpc,
677}
678
679#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
682#[serde(deny_unknown_fields)]
683pub struct EndpointRequirement {
684 pub protocol: EndpointProtocol,
685 pub api_path: String,
686 #[serde(default, skip_serializing_if = "Option::is_none")]
687 pub prefix_cache_reset: Option<HttpActionSpec>,
688}
689
690#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
692#[serde(rename_all = "snake_case")]
693pub enum EndpointProtocol {
694 Http,
696}
697
698#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
700#[serde(deny_unknown_fields)]
701pub struct AdapterError {
702 pub code: AdapterErrorCode,
703 pub message: String,
704}
705
706#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
708#[serde(rename_all = "snake_case")]
709pub enum AdapterErrorCode {
710 InvalidRequest,
712 UnsupportedProtocolVersion,
714 InvalidSettings,
716 Internal,
718 UnsupportedOperation,
720}
721
722#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
725#[serde(deny_unknown_fields)]
726pub struct EvalClientRequest {
727 pub protocol_version: ProtocolVersion,
728 pub endpoint: ClientEndpointInput,
729 pub model: MeasurementModelInput,
730 pub definition: EvalDefinitionInput,
731 pub artifact_dir: PathBuf,
732}
733
734#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
738#[serde(deny_unknown_fields)]
739pub struct BenchClientRequest {
740 pub protocol_version: ProtocolVersion,
741 pub endpoint: ClientEndpointInput,
742 pub model: MeasurementModelInput,
743 pub definition: BenchDefinitionInput,
744 pub case: BenchCaseInput,
745 pub artifact_dir: PathBuf,
746}
747
748#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
750#[serde(deny_unknown_fields)]
751pub struct BenchCaseInput {
752 pub load_shape: BenchLoadInput,
753 pub request_count: u32,
754}
755
756#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
758#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
759pub enum BenchLoadInput {
760 ConcurrencyLimited { concurrency: u32 },
762 RequestRateLimited {
764 request_rate: f64,
765 burstiness: Option<f64>,
766 },
767 UnboundedRequestRate,
769}
770
771#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
773#[serde(rename_all = "snake_case")]
774pub enum ClientStatus {
775 Succeeded,
777 Failed,
779}
780
781#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
783#[serde(deny_unknown_fields)]
784pub struct EvalClientResult {
785 pub schema_version: u32,
788 pub status: ClientStatus,
789 pub metrics: BTreeMap<String, f64>,
790 pub native_command: Vec<String>,
791 pub raw_artifacts: Vec<RawArtifact>,
792 pub error: Option<String>,
793}
794
795#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
797#[serde(deny_unknown_fields)]
798pub struct BenchClientResult {
799 pub schema_version: u32,
802 pub status: ClientStatus,
803 pub completed_requests: u64,
804 pub failed_requests: u64,
805 pub normalization_schema: String,
806 pub metrics: BTreeMap<String, f64>,
807 pub native_command: Vec<String>,
808 pub native_exit_code: Option<i32>,
809 pub raw_artifacts: Vec<RawArtifact>,
810 pub error: Option<String>,
811}
812
813#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
815#[serde(deny_unknown_fields)]
816pub struct RawArtifact {
817 pub name: String,
818 pub kind: String,
819 pub path: PathBuf,
820}
821
822#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
826#[serde(deny_unknown_fields)]
827pub struct AdapterProtocol {
828 pub request: AdapterRequest,
829 pub response: AdapterResponse,
830 #[serde(default, skip_serializing_if = "Option::is_none")]
831 pub eval_client_request: Option<EvalClientRequest>,
832 #[serde(default, skip_serializing_if = "Option::is_none")]
833 pub eval_client_result: Option<EvalClientResult>,
834 #[serde(default, skip_serializing_if = "Option::is_none")]
835 pub bench_client_request: Option<BenchClientRequest>,
836 #[serde(default, skip_serializing_if = "Option::is_none")]
837 pub bench_client_result: Option<BenchClientResult>,
838}