Skip to main content

objectiveai_sdk/agent/completions/request/
provider.rs

1//! Provider preferences for agent completion requests.
2
3use serde::{Deserialize, Serialize};
4use schemars::JsonSchema;
5
6/// Provider routing and selection preferences.
7#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
8#[schemars(rename = "agent.completions.request.Provider")]
9pub struct Provider {
10    /// Whether to allow providers to collect data.
11    #[serde(skip_serializing_if = "Option::is_none")]
12    #[schemars(extend("omitempty" = true))]
13    pub data_collection: Option<ProviderDataCollection>,
14    /// Whether to use zero data retention providers only.
15    #[serde(skip_serializing_if = "Option::is_none")]
16    #[schemars(extend("omitempty" = true))]
17    pub zdr: Option<bool>,
18    /// How to sort/prioritize providers.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    #[schemars(extend("omitempty" = true))]
21    pub sort: Option<ProviderSort>,
22    /// Maximum price constraints.
23    #[serde(skip_serializing_if = "Option::is_none")]
24    #[schemars(extend("omitempty" = true))]
25    pub max_price: Option<ProviderMaxPrice>,
26    /// Preferred minimum throughput (tokens/second).
27    #[serde(skip_serializing_if = "Option::is_none")]
28    #[schemars(extend("omitempty" = true))]
29    pub preferred_min_throughput: Option<f64>,
30    /// Preferred maximum latency (seconds).
31    #[serde(skip_serializing_if = "Option::is_none")]
32    #[schemars(extend("omitempty" = true))]
33    pub preferred_max_latency: Option<f64>,
34    /// Hard minimum throughput requirement (tokens/second).
35    #[serde(skip_serializing_if = "Option::is_none")]
36    #[schemars(extend("omitempty" = true))]
37    pub min_throughput: Option<f64>,
38    /// Hard maximum latency requirement (seconds).
39    #[serde(skip_serializing_if = "Option::is_none")]
40    #[schemars(extend("omitempty" = true))]
41    pub max_latency: Option<f64>,
42}
43
44/// Data collection policy for providers.
45#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
46#[serde(rename_all = "snake_case")]
47#[schemars(rename = "agent.completions.request.ProviderDataCollection")]
48pub enum ProviderDataCollection {
49    /// Do not allow data collection.
50    #[schemars(title = "Deny")]
51    Deny,
52    /// Allow data collection.
53    #[schemars(title = "Allow")]
54    Allow,
55}
56
57/// How to sort/prioritize providers.
58#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
59#[serde(rename_all = "snake_case")]
60#[schemars(rename = "agent.completions.request.ProviderSort")]
61pub enum ProviderSort {
62    /// Prioritize by price (cheapest first).
63    #[schemars(title = "Price")]
64    Price,
65    /// Prioritize by throughput (fastest first).
66    #[schemars(title = "Throughput")]
67    Throughput,
68    /// Prioritize by latency (lowest first).
69    #[schemars(title = "Latency")]
70    Latency,
71}
72
73/// Maximum price constraints per token type.
74#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
75#[schemars(rename = "agent.completions.request.ProviderMaxPrice")]
76pub struct ProviderMaxPrice {
77    /// Maximum price per prompt token.
78    #[serde(skip_serializing_if = "Option::is_none", deserialize_with = "crate::serde_util::option_decimal")]
79    #[schemars(extend("omitempty" = true))]
80    #[schemars(with = "Option<f64>")]
81    pub prompt: Option<rust_decimal::Decimal>,
82    /// Maximum price per completion token.
83    #[serde(skip_serializing_if = "Option::is_none", deserialize_with = "crate::serde_util::option_decimal")]
84    #[schemars(extend("omitempty" = true))]
85    #[schemars(with = "Option<f64>")]
86    pub completion: Option<rust_decimal::Decimal>,
87    /// Maximum price per image.
88    #[serde(skip_serializing_if = "Option::is_none", deserialize_with = "crate::serde_util::option_decimal")]
89    #[schemars(extend("omitempty" = true))]
90    #[schemars(with = "Option<f64>")]
91    pub image: Option<rust_decimal::Decimal>,
92    /// Maximum price per audio second.
93    #[serde(skip_serializing_if = "Option::is_none", deserialize_with = "crate::serde_util::option_decimal")]
94    #[schemars(extend("omitempty" = true))]
95    #[schemars(with = "Option<f64>")]
96    pub audio: Option<rust_decimal::Decimal>,
97    /// Maximum price per request.
98    #[serde(skip_serializing_if = "Option::is_none", deserialize_with = "crate::serde_util::option_decimal")]
99    #[schemars(extend("omitempty" = true))]
100    #[schemars(with = "Option<f64>")]
101    pub request: Option<rust_decimal::Decimal>,
102}