tools.rs 2.79 KB
Newer Older
1
2
3
4
5
6
7
// SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

pub use super::response::*;

// Import json_parser from postprocessor module
pub use super::json_parser::*;
8
pub use super::parsers::{ToolCallConfig, detect_and_parse_tool_call};
9
10
11
12
13
14

/// Try parsing a string as a structured tool call, for aggregation usage.
///
/// If successful, returns a `ChatCompletionMessageToolCall`.
pub fn try_tool_call_parse_aggregate(
    message: &str,
15
    parser_str: Option<&str>,
16
17
18
19
) -> anyhow::Result<(
    Vec<dynamo_async_openai::types::ChatCompletionMessageToolCall>,
    Option<String>,
)> {
20
21
22
23
24
    if parser_str.is_none() {
        tracing::info!("No tool parser provided. Trying parsing with default parser.");
    } else {
        tracing::info!("Using tool parser: {:?}", parser_str);
    }
25
    let (parsed, content) = detect_and_parse_tool_call(message, parser_str)?;
26
    if parsed.is_empty() {
27
        return Ok((vec![], content));
28
    }
29
30
31
32
33
34
35
36
37
38
39
    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,
                    },
40
                },
41
42
43
44
            )
            .collect(),
        content,
    ))
45
46
47
48
49
50
51
}

/// Try parsing a string as a structured tool call, for streaming (delta) usage.
///
/// If successful, returns a `ChatCompletionMessageToolCallChunk`.
pub fn try_tool_call_parse_stream(
    message: &str,
52
    parser_str: Option<&str>,
53
54
55
56
57
) -> anyhow::Result<(
    Vec<dynamo_async_openai::types::ChatCompletionMessageToolCallChunk>,
    Option<String>,
)> {
    let (parsed, content) = detect_and_parse_tool_call(message, parser_str)?;
58
    if parsed.is_empty() {
59
        return Ok((vec![], content));
60
    }
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    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),
                    }),
                    // Add other fields as needed if required by the struct definition
                },
            )
            .collect(),
        content,
    ))
80
}