Skip to main content

switchyard_translation/
policy.rs

1// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Policy knobs that control translation strictness and target capabilities.
5
6use serde::{Deserialize, Serialize};
7
8use crate::format::FormatId;
9
10/// Controls how unknown provider fields are handled.
11#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
12pub enum UnknownFieldPolicy {
13    Preserve,
14    DropWithWarning,
15    Reject,
16}
17
18/// Controls whether known lossy conversions are allowed.
19#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
20pub enum LossyConversionPolicy {
21    AllowWithDiagnostics,
22    Reject,
23}
24
25/// Controls how missing provider IDs are generated.
26#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
27pub enum DeterministicIdPolicy {
28    Preserve,
29    GenerateStable { prefix: String },
30}
31
32/// Controls whether exact source payloads are preserved for round trips.
33#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
34pub enum PreservationPolicy {
35    /// Keep exact source bodies in the in-memory IR only.
36    InMemory,
37    /// Also embed a Switchyard metadata envelope in translated wire bodies.
38    ///
39    /// This enables multi-hop round trips through wire formats, but should be
40    /// used deliberately because provider APIs may reject or limit metadata.
41    Embed,
42    /// Do not store preservation metadata.
43    Disabled,
44}
45
46/// Capability constraints for the target model or provider profile.
47#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
48pub struct TargetCapabilities {
49    pub supports_tools: Option<bool>,
50    pub supports_images: Option<bool>,
51    pub supports_audio: Option<bool>,
52    pub supports_video: Option<bool>,
53    pub supports_files: Option<bool>,
54    pub supports_reasoning_effort: Option<bool>,
55    pub supports_json_schema_response_format: Option<bool>,
56    pub supports_parallel_tool_calls: Option<bool>,
57    pub supports_code_execution: Option<bool>,
58    pub supports_safety_settings: Option<bool>,
59    pub openai_compatible: Option<bool>,
60}
61
62/// Provider-level profile that can be used to configure target capabilities.
63#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
64pub struct ProviderProfile {
65    pub format: Option<FormatId>,
66    pub provider: Option<String>,
67    pub capabilities: TargetCapabilities,
68}
69
70/// End-to-end policy applied by request, response, and stream translation.
71#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
72pub struct TranslationPolicy {
73    pub unknown_field_policy: UnknownFieldPolicy,
74    pub lossy_conversion_policy: LossyConversionPolicy,
75    pub deterministic_ids: DeterministicIdPolicy,
76    pub preservation: PreservationPolicy,
77    pub target_capabilities: TargetCapabilities,
78}
79
80impl Default for TranslationPolicy {
81    fn default() -> Self {
82        Self {
83            unknown_field_policy: UnknownFieldPolicy::Preserve,
84            lossy_conversion_policy: LossyConversionPolicy::AllowWithDiagnostics,
85            deterministic_ids: DeterministicIdPolicy::GenerateStable {
86                prefix: "sw".to_string(),
87            },
88            preservation: PreservationPolicy::InMemory,
89            target_capabilities: TargetCapabilities::default(),
90        }
91    }
92}