mod bare;
mod fenced_json;
mod native_json;
mod streaming;
mod syntax;
mod tagged;
#[cfg(test)]
pub(crate) use bare::parse_bare_calls_in_body;
pub(crate) use fenced_json::parse_fenced_json_tool_calls;
#[cfg(test)]
pub(crate) use native_json::parse_native_json_tool_calls;
pub(crate) use streaming::StreamingToolCallDetector;
pub(crate) use syntax::ident_length;
pub(crate) use syntax::unescape_heredoc_body;
pub(crate) use syntax::{scan_heredoc, HeredocError};
pub(crate) use tagged::parse_text_tool_calls_with_tools;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum TextToolFormat {
Tagged,
FencedJson,
}
impl TextToolFormat {
pub(crate) fn from_option(tool_format: &str) -> Self {
match tool_format {
"json" => TextToolFormat::FencedJson,
_ => TextToolFormat::Tagged,
}
}
}
pub(crate) fn parse_text_tool_calls_in_format(
text: &str,
tools_val: Option<&crate::value::VmValue>,
format: TextToolFormat,
) -> TextToolParseResult {
match format {
TextToolFormat::Tagged => parse_text_tool_calls_with_tools(text, tools_val),
TextToolFormat::FencedJson => parse_fenced_json_tool_calls(text),
}
}
pub(crate) struct TextToolParseResult {
pub calls: Vec<serde_json::Value>,
pub errors: Vec<String>,
pub prose: String,
pub user_response: Option<String>,
pub violations: Vec<String>,
pub done_marker: Option<String>,
pub canonical: String,
}