Skip to main content

systemprompt_api/services/gateway/
parse.rs

1use 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}