objectiveai_sdk/vector/completions/response/unary/
vector_completion.rs1use crate::{agent, vector::completions::response};
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
12#[schemars(rename = "vector.completions.response.unary.VectorCompletion")]
13pub struct VectorCompletion {
14 pub id: String,
16 pub completions: Vec<super::AgentCompletion>,
18 pub votes: Vec<response::Vote>,
20 #[serde(deserialize_with = "crate::serde_util::vec_decimal")]
22 #[schemars(with = "Vec<f64>")]
23 pub scores: Vec<rust_decimal::Decimal>,
24 #[serde(deserialize_with = "crate::serde_util::vec_decimal")]
28 #[schemars(with = "Vec<f64>")]
29 pub weights: Vec<rust_decimal::Decimal>,
30 pub created: u64,
32 pub swarm: String,
34 pub object: super::Object,
36 pub usage: agent::completions::response::Usage,
38}
39
40impl VectorCompletion {
41 pub fn normalize_for_tests(&mut self) {
43 self.id = String::new();
44 self.created = 0;
45 for completion in &mut self.completions {
46 completion.inner.normalize_for_tests();
47 }
48 self.votes.sort_by_key(|v| v.flat_swarm_index);
49
50 self.completions
52 .sort_by_cached_key(|c| serde_json::to_string(&c.inner).unwrap());
53
54 let mut i = 0;
56 for completion in &mut self.completions {
57 completion.index = i;
58 i += 1;
59 }
60 }
61
62 pub fn default_from_request_responses_len(
64 request_responses_len: usize,
65 ) -> Self {
66 let weights = vec![rust_decimal::Decimal::ZERO; request_responses_len];
67 let scores =
68 vec![
69 rust_decimal::Decimal::ONE
70 / rust_decimal::Decimal::from(request_responses_len);
71 request_responses_len
72 ];
73 Self {
74 id: String::new(),
75 completions: Vec::new(),
76 votes: Vec::new(),
77 scores,
78 weights,
79 created: 0,
80 swarm: String::new(),
81 object: super::Object::default(),
82 usage: agent::completions::response::Usage::default(),
83 }
84 }
85}
86
87impl From<response::streaming::VectorCompletionChunk> for VectorCompletion {
88 fn from(
89 response::streaming::VectorCompletionChunk {
90 id,
91 completions,
92 votes,
93 scores,
94 weights,
95 created,
96 swarm,
97 object,
98 usage,
99 }: response::streaming::VectorCompletionChunk,
100 ) -> Self {
101 Self {
102 id,
103 completions: completions
104 .into_iter()
105 .map(super::AgentCompletion::from)
106 .collect(),
107 votes,
108 scores,
109 weights,
110 created,
111 swarm,
112 object: object.into(),
113 usage: usage.unwrap_or_default(),
114 }
115 }
116}