pub use super::config::ToolCallConfig;
pub use super::parsers::detect_and_parse_tool_call;
pub async fn try_tool_call_parse_aggregate(
message: &str,
parser_str: Option<&str>,
tools: Option<&[super::ToolDefinition]>,
) -> anyhow::Result<(
Vec<dynamo_async_openai::types::ChatCompletionMessageToolCall>,
Option<String>,
)> {
if parser_str.is_none() {
tracing::info!("No tool parser provided. Trying parsing with default parser.");
} else {
tracing::info!("Using tool parser: {:?}", parser_str);
}
let (parsed, content) = detect_and_parse_tool_call(message, parser_str, tools).await?;
if parsed.is_empty() {
return Ok((vec![], content));
}
Ok((
parsed
.into_iter()
.map(
|parsed| dynamo_async_openai::types::ChatCompletionMessageToolCall {
id: parsed.id,
r#type: dynamo_async_openai::types::ChatCompletionToolType::Function,
function: dynamo_async_openai::types::FunctionCall {
name: parsed.function.name,
arguments: parsed.function.arguments,
},
},
)
.collect(),
content,
))
}
pub async fn try_tool_call_parse_stream(
message: &str,
parser_str: Option<&str>,
tools: Option<&[super::ToolDefinition]>,
) -> anyhow::Result<(
Vec<dynamo_async_openai::types::ChatCompletionMessageToolCallChunk>,
Option<String>,
)> {
let (parsed, content) = detect_and_parse_tool_call(message, parser_str, tools).await?;
if parsed.is_empty() {
return Ok((vec![], content));
}
Ok((
parsed
.into_iter()
.enumerate()
.map(
|(idx, parsed)| dynamo_async_openai::types::ChatCompletionMessageToolCallChunk {
index: idx as u32,
id: Some(parsed.id),
r#type: Some(dynamo_async_openai::types::ChatCompletionToolType::Function),
function: Some(dynamo_async_openai::types::FunctionCallStream {
name: Some(parsed.function.name),
arguments: Some(parsed.function.arguments),
}),
},
)
.collect(),
content,
))
}