"benchmarks/vscode:/vscode.git/clone" did not exist on "b19de4ed77c11a550e037582b92f91ca19eebde1"
tools.rs 2.79 KB
Newer Older
1
// SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
3
// SPDX-License-Identifier: Apache-2.0

4
5
pub use super::config::ToolCallConfig;
pub use super::parsers::detect_and_parse_tool_call;
6
7
8
9

/// Try parsing a string as a structured tool call, for aggregation usage.
///
/// If successful, returns a `ChatCompletionMessageToolCall`.
10
pub async fn try_tool_call_parse_aggregate(
11
    message: &str,
12
    parser_str: Option<&str>,
13
    tools: Option<&[super::ToolDefinition]>,
14
) -> anyhow::Result<(
15
    Vec<dynamo_protocols::types::ChatCompletionMessageToolCall>,
16
17
    Option<String>,
)> {
18
    if parser_str.is_none() {
19
        tracing::debug!("No tool parser provided. Trying parsing with default parser.");
20
    } else {
21
        tracing::debug!("Using tool parser: {:?}", parser_str);
22
    }
23
    let (parsed, content) = detect_and_parse_tool_call(message, parser_str, tools).await?;
24
    if parsed.is_empty() {
25
        return Ok((vec![], content));
26
    }
27
28
29
30
    Ok((
        parsed
            .into_iter()
            .map(
31
                |parsed| dynamo_protocols::types::ChatCompletionMessageToolCall {
32
                    id: parsed.id,
33
                    r#type: dynamo_protocols::types::FunctionType::Function,
34
                    function: dynamo_protocols::types::FunctionCall {
35
36
37
                        name: parsed.function.name,
                        arguments: parsed.function.arguments,
                    },
38
                },
39
40
41
42
            )
            .collect(),
        content,
    ))
43
44
45
46
47
}

/// Try parsing a string as a structured tool call, for streaming (delta) usage.
///
/// If successful, returns a `ChatCompletionMessageToolCallChunk`.
48
pub async fn try_tool_call_parse_stream(
49
    message: &str,
50
    parser_str: Option<&str>,
51
    tools: Option<&[super::ToolDefinition]>,
52
) -> anyhow::Result<(
53
    Vec<dynamo_protocols::types::ChatCompletionMessageToolCallChunk>,
54
55
    Option<String>,
)> {
56
    let (parsed, content) = detect_and_parse_tool_call(message, parser_str, tools).await?;
57
    if parsed.is_empty() {
58
        return Ok((vec![], content));
59
    }
60
61
62
63
64
    Ok((
        parsed
            .into_iter()
            .enumerate()
            .map(
65
                |(idx, parsed)| dynamo_protocols::types::ChatCompletionMessageToolCallChunk {
66
67
                    index: idx as u32,
                    id: Some(parsed.id),
68
                    r#type: Some(dynamo_protocols::types::FunctionType::Function),
69
                    function: Some(dynamo_protocols::types::FunctionCallStream {
70
71
72
73
74
75
76
77
78
                        name: Some(parsed.function.name),
                        arguments: Some(parsed.function.arguments),
                    }),
                    // Add other fields as needed if required by the struct definition
                },
            )
            .collect(),
        content,
    ))
79
}