use serde::{Deserialize, Serialize};
use crate::value_objects::{FinishReason, Meta, ToolCall, Usage};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Step {
pub text: Option<String>,
#[serde(default)]
pub tool_calls: Vec<ToolCall>,
pub finish_reason: FinishReason,
pub usage: Usage,
pub meta: Meta,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextResponse {
pub text: Option<String>,
pub finish_reason: FinishReason,
pub usage: Usage,
pub steps: Vec<Step>,
}
impl TextResponse {
pub fn from_steps(steps: Vec<Step>) -> Self {
let last = steps
.last()
.expect("tool loop always produces at least one step");
let text = last.text.clone();
let finish_reason = last.finish_reason;
let usage = steps.iter().fold(Usage::default(), |mut acc, step| {
acc.prompt_tokens += step.usage.prompt_tokens;
acc.completion_tokens += step.usage.completion_tokens;
acc
});
Self {
text,
finish_reason,
usage,
steps,
}
}
}