systemprompt_api/services/gateway/
parse.rs1use super::captures::{CapturedToolUse, CapturedUsage};
2use super::protocol::canonical::CanonicalContent;
3use super::protocol::canonical_response::CanonicalResponse;
4
5pub fn extract_from_canonical(
6 response: &CanonicalResponse,
7) -> (CapturedUsage, Vec<CapturedToolUse>) {
8 let usage = CapturedUsage {
9 input_tokens: response.usage.input_tokens,
10 output_tokens: response.usage.output_tokens,
11 };
12 let mut tool_calls = Vec::new();
13 for part in &response.content {
14 if let CanonicalContent::ToolUse { id, name, input } = part {
15 tool_calls.push(CapturedToolUse {
16 ai_tool_call_id: id.clone(),
17 tool_name: name.clone(),
18 tool_input: serde_json::to_string(input).unwrap_or_default(),
19 });
20 }
21 }
22 (usage, tool_calls)
23}
24
25pub fn extract_assistant_text(response: &CanonicalResponse) -> Option<String> {
26 let mut out = String::new();
27 for part in &response.content {
28 if let CanonicalContent::Text(t) = part {
29 if !out.is_empty() {
30 out.push('\n');
31 }
32 out.push_str(t);
33 }
34 }
35 if out.is_empty() { None } else { Some(out) }
36}