use crate::agent::completions::response;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
PartialEq,
Serialize,
Deserialize,
Default,
JsonSchema,
arbitrary::Arbitrary,
)]
#[schemars(
rename = "agent.completions.response.streaming.AgentCompletionChunk"
)]
pub struct AgentCompletionChunk {
pub id: String,
pub agent_instance_hierarchy: String,
pub agent_id: String,
pub agent_full_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub agent_remote: Option<crate::RemotePath>,
#[arbitrary(with = crate::arbitrary_util::arbitrary_u64)]
pub created: u64,
pub messages: Vec<super::MessageChunk>,
pub object: super::Object,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub usage: Option<response::Usage>,
pub upstream: crate::agent::Upstream,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub error: Option<crate::error::ResponseError>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub continuation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub messages_queued: Option<bool>,
}
impl AgentCompletionChunk {
pub fn push(
&mut self,
AgentCompletionChunk {
messages,
usage,
error,
continuation,
messages_queued,
..
}: &AgentCompletionChunk,
) {
self.push_messages(messages);
match (&mut self.usage, usage) {
(Some(self_usage), Some(other_usage)) => {
self_usage.push(other_usage);
}
(None, Some(other_usage)) => {
self.usage = Some(other_usage.clone());
}
_ => {}
}
if let Some(error) = error {
self.error = Some(error.clone());
}
if let Some(continuation) = continuation {
self.continuation = Some(continuation.clone());
}
if let Some(mq) = messages_queued {
self.messages_queued = Some(*mq);
}
}
fn push_messages(&mut self, other_choices: &[super::MessageChunk]) {
fn push_message(
messages: &mut Vec<super::MessageChunk>,
other: &super::MessageChunk,
) {
fn find_message(
messages: &mut Vec<super::MessageChunk>,
index: u64,
) -> Option<&mut super::MessageChunk> {
for message in messages {
if message.index() == index {
return Some(message);
}
}
None
}
if let Some(message) = find_message(messages, other.index()) {
message.push(other);
} else {
messages.push(other.clone());
}
}
for other_message in other_choices {
push_message(&mut self.messages, other_message);
}
}
}